# Attractor 
[](#contributors-)

Many authors ([Michael Feathers](https://www.agileconnection.com/article/getting-empirical-about-refactoring), [Sandi Metz](https://www.sandimetz.com/blog/2017/9/13/breaking-up-the-behemoth)) have shown that an evaluation of churn vs complexity of files in software projects provide a valuable metric towards code quality. This is another take on the matter, for ruby code, using the `churn` and `flog` projects.
Here's an [article on medium](https://medium.com/better-programming/why-i-made-my-own-code-quality-tool-c44b40ceaafd) explaining the approach in greater detail.
## Table of Contents
* [Installation](#installation)
* [Usage](#usage)
+ [Live Reloading](#live-reloading)
* [CI Usage](#ci-usage)
+ [Github Action](#github-action)
+ [Gitlab Example](#gitlab-example)
* [CLI Commands and Options](#cli-commands-and-options)
* [Development](#development)
* [Contributing](#contributing)
* [Social](#social)
* [Logo Attribution](#logo-attribution)
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'attractor'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install attractor
## Usage
To create a HTML report in `attractor_output/index.html`, try
$ attractor report
If you'd like to specify a directory, use the file prefix option:
$ attractor report --file_prefix app/models
Or shorter:
$ attractor report -p app/models
Check javascript:
$ attractor report -p app/javascript -t js
Watch for file changes:
$ attractor report -p app/models --watch
Serve at http://localhost:7890:
$ attractor serve -p app/models
Enable rack-livereload:
$ attractor serve -p app/models --watch
### Live Reloading
If you have `guard-livereload` (or a similar service) running on your project, you can leverage the hot reloading functionality by specifying `--watch|-w`. Attractor will then live-reload the browser window when a file watched by `guard-livereload` changes.
## CI Usage
To use this CLI in a CI environment, use the `--ci` option, which will suppress automatic opening of a browser window.
### Github Action
There is a dedicated [Github Action](https://github.com/julianrubisch/attractor-action) that will compile Attractor's output. Here's the action on the [Marketplace](https://github.com/marketplace/actions/attractor-action).
### Gitlab Example
The simplest use case is to store the `attractor_output` directory as an artifact.
```yml
attractor:
stage: your-stage-label
image: ruby:latest
script:
- gem install attractor
- attractor report --ci
artifacts:
when: on_success
paths:
- attractor_output
```
Alternatively,
## CLI Commands and Options
Print a simple output to console:
$ attractor calc
$ --file_prefix|-p app/models
$ --type|-t rb|js
$ --watch|-w
$ --start_ago|-s (e.g. 5y, 3m, 7w)
$ --minimum_churn|-c (minimum times a file must have changed to be processed)
Generate a full report
$ attractor report
$ --file_prefix|-p app/models
$ --type|-t rb|js
$ --watch|-w
$ --no-open-browser|--ci
$ --start_ago|-s (e.g. 5y, 3m, 7w)
$ --minimum_churn|-c (minimum times a file must have changed to be processed)
Serve the output on http://localhost:7890
$ attractor serve
$ --file_prefix|-p app/models
$ --watch|-w
$ --no-open-browser|--ci
$ --start_ago|-s (e.g. 5y, 3m, 7w)
$ --minimum_churn|-c (minimum times a file must have changed to be processed)
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/julianrubisch/attractor.
## Social
[Twitter](https://twitter.com/AttractorGem)
[Patreon](https://www.patreon.com/user?u=24747270)
## Logo Attribution
[Black Hole by Eynav Raphael from the Noun Project](https://thenounproject.com/term/black-hole/1043893)
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Julian Rubisch 💻 📖 |
Olivier 🚧 |
Andrew Mason 💻 👀 |