# Dangermattic
`Dangermattic` builds on [Danger on Ruby](https://danger.systems/ruby/) and is essentially a collection of Danger plugins. Its goal is to provide customisable checks and common utilities to help perform checks on Pull Requests, from simple routine validations to more sophisticated ones.

## Installation

Add to your project's `Gemfile`
```
gem 'danger-dangermattic', git: 'https://github.com/Automattic/dangermattic'
```

## Example of available plugins and their usage

Once the main Gem is installed, all Dangermattic plugins are available in your `Dangerfile` under their corresponding namespace. A few examples:

- `manifest_pr_checker` - Plugin to check if changes on a manifest file (i.e. `Gemfile`, `Podfile`) has a corresponding change in a lock file (i.e. `Gemfile.lock`, `Podfile.lock`)
    ```ruby
    # Reports a warning if the Gemfile was changed but the Gemfile.lock wasn't
    manifest_pr_checker.check_gemfile_lock_updated
    ```
- `milestone_checker` - Plugin for performing checks on a milestone associated with a pull request
    ```ruby
    # Checks if the pull request's milestone is due in 3 days or less, reporting a warning if that's the case
    milestone_checker.check_milestone_due_date(days_before_due: 3)
    ```
- `pr_size_checker` - Plugin to check the size of a Pull Request content and text body
    ```ruby
    # Reports a warning if a pull request diff size is greater than 300
    pr_size_checker.check_diff_size(max_size: 300)
    ```
- `view_changes_checker` - Detects view changes in a PR and reports a warning if there are no attached screenshots
    ```ruby
    # Reports a warning if a pull request changing views doesn't have a screenshot
    view_changes_checker.check
    ```

All available plugins are defined here: https://github.com/Automattic/dangermattic/tree/trunk/lib/dangermattic/plugins

## Development

- Clone the repo and run `bundle install` to setup dependencies
- Run `bundle exec rake` to run the all the tests, RuboCop and Danger Lint
- Run `bundle exec rake specs` / `bundle exec rspec` to run only the unit tests
- Run `bundle exec rake lint` to run only the linting tasks: RuboCop and Danger Lint
- Use `bundle exec guard` to automatically have tests run as you make changes.
- You can generate the documentation using `bundle exec yard doc`. The documentation is generated locally in the `yard-doc/` folder.

### Adding a new plugin

Adding a new plugin to Dangermattic is very simple: just create a new subclass of `Danger::Plugin` inside `./lib/dangermattic/plugins/`, similarly to the other classes you'll find there:

```ruby
module Danger
  class MyNewPluginChecker < Plugin
    def check_method(param:)
      # ...
    end
  end
end
```

It will be [automatically imported](https://github.com/Automattic/dangermattic/blob/trunk/lib/danger_plugin.rb), exposed by Dangermattic's Gem and visible in your `Dangerfile` once you add it as a dependency:

```ruby
# In a Dangerfile
my_new_plugin_checker.check_method(param: my_param_value)
```

Please follow the existing naming convention for validation and check plugins: classes end with a `*Checker` suffix and the main validation methods are named with a `check_*` prefix.