[forks-shield]: https://img.shields.io/github/forks/julianrubisch/attractor.svg?style=flat-square
[forks-url]: https://github.com/julianrubisch/attractor/network/members
[stars-shield]: https://img.shields.io/github/stars/julianrubisch/attractor.svg?style=flat-square
[stars-url]: https://github.com/julianrubisch/attractor/stargazers
[issues-shield]: https://img.shields.io/github/issues/julianrubisch/attractor.svg?style=flat-square
[issues-url]: https://github.com/julianrubisch/attractor/issues
[license-shield]: https://img.shields.io/github/license/julianrubisch/attractor.svg?style=flat-square
[license-url]: https://github.com/julianrubisch/attractor/blob/master/LICENSE
[build-status]: https://travis-ci.org/julianrubisch/attractor.svg?branch=master
[twitter-shield]: https://img.shields.io/twitter/follow/AttractorGem?style=social
[ruby-tests-action-shield]: https://github.com/julianrubisch/attractor/workflows/Ruby%20Tests/badge.svg
[demo-gif]: https://user-images.githubusercontent.com/4352208/67033292-b41e4280-f115-11e9-8c91-81b3bea4451c.gif
[logo-source]: https://thenounproject.com/term/black-hole/1043893
[medium-article]: https://medium.com/better-programming/why-i-made-my-own-code-quality-tool-c44b40ceaafd
[sandi-metz-article]: https://www.sandimetz.com/blog/2017/9/13/breaking-up-the-behemoth
[michael-feathers-article]: https://www.agileconnection.com/article/getting-empirical-about-refactoring
[bundler]: https://bundler.io
[rack-livereload]: https://github.com/johnbintz/rack-livereload
[guard-livereload]: https://github.com/guard/guard-livereload
[attractor-action]: https://github.com/julianrubisch/attractor-action
[attractor-action-marketplace]: https://github.com/marketplace/actions/attractor-action
[repo]: https://github.com/julianrubisch/attractor
Attractor
A code complexity metrics visualization and exploration tool for Ruby and JavaScript
---
![Build Status][build-status]
![Ruby Tests Action Status][ruby-tests-action-shield]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-)
![attractor_v0 6 1][demo-gif]
## Table of Contents
- [Table of Contents](#table-of-contents)
- [Introduction](#introduction)
- [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)
- [Logo Attribution](#logo-attribution)
- [Contributors ✨](#contributors-%e2%9c%a8)
## Introduction
Many authors ([Michael Feathers][michael-feathers-article], [Sandi Metz][sandi-metz-article] 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][medium-article] explaining the approach in greater detail.
## Installation
Attractor's installation is standard for a Ruby gem:
```sh
gem install attractor
```
You'll also want to install some plugins to go along with the main gem:
```sh
gem install attractor-ruby # https://github.com/julianrubisch/attractor-ruby
gem install attractor-javascript # https://github.com/julianrubisch/attractor-javascript
```
You will most likely want to install Attractor using [Bundler][bundler]:
```ruby
gem 'attractor'
gem 'attractor-ruby'
gem 'attractor-javascript'
```
And then execute:
```sh
bundle
```
## Usage
To create a HTML report in `attractor_output/index.html`:
```sh
attractor report
```
If you'd like to specify a directory, use the file prefix option:
```sh
attractor report --file_prefix app/models
```
Or shorter:
```sh
attractor report -p app/models
```
Check JavaScript:
```sh
attractor report -p app/javascript -t js
```
Watch for file changes:
```sh
attractor report -p app/models --watch
```
Serve at `http://localhost:7890`:
```sh
attractor serve -p app/models
```
Enable [rack-livereload][rack-livereload]:
```sh
attractor serve -p app/models --watch
```
_Make sure you prefix these commands with `bundle exec` if you are using Bundler._
### Live Reloading
If you have [guard-livereload][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][attractor-action] that will compile Attractor's output.
You can quickly integrate it into your action's workflow by grabbing it on the [Marketplace][attractor-action-marketplace].
### 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
```
## CLI Commands and Options
Print a simple output to console:
```sh
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
```sh
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`
```sh
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. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To run all tests, run `bin/test`. You can run the specs by themselves with `bundle exec rspec`, and the cucumber features with `bundle exec cucumber`.
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][repo].
## Logo Attribution
[Black Hole by Eynav Raphael from the Noun Project][logo-source]
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!