Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/makaroni4/sandi_meter

Static analysis tool for checking Ruby code for Sandi Metz' rules.
https://github.com/makaroni4/sandi_meter

Last synced: 3 months ago
JSON representation

Static analysis tool for checking Ruby code for Sandi Metz' rules.

Awesome Lists containing this project

README

        

# SandiMeter
[![Gem Version](https://badge.fury.io/rb/sandi_meter.png)](http://badge.fury.io/rb/sandi_meter)

Static analysis tool for checking your Ruby code for [Sandi Metz' four rules](http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers).

* 100 lines per class
* 5 lines per method
* 4 params per method call (and don't even try cheating with hash params)
* 1 instance variable per controller action

## CLI mode

~~~
gem install sandi_meter

sandi_meter --help
-d, --details CLI mode. Show details (path, line number)
-g, --graph HTML mode. Create folder, log data and output stats to HTML file.
--json Output as JSON
-l, --log Show syntax error and indentation log output
-o, --output-path PATH Path for storing generated output files (default: ./sandi_meter/)
-p, --path PATH Path to folder or file to analyze
-q, --quiet Do not open HTML report for graph option in browser.
-t, --thresholds THRESHOLD Thresholds for each rule (default: "90,90,90,90" or in config.yml)
-r, --rules Show rules
-v, --version Gem version
-h, --help Help

cd ~/your/ruby/or/rails/project
sandi_meter -d

1. 85% of classes are under 100 lines.
2. 45% of methods are under 5 lines.
3. 99% of method calls accepted are less than 4 parameters.
4. 66% of controllers have one instance variable per action.

Classes with 100+ lines
Class name | Size | Path
SandiMeter::Analyzer | 219 | ./lib/sandi_meter/analyzer.rb:7
SandiMeter::Calculator | 172 | ./lib/sandi_meter/calculator.rb:2
SandiMeter::HtmlGenerator | 135 | ./lib/sandi_meter/html_generator.rb:5
Valera | 109 | ./spec/test_classes/12.rb:1

Misindented classes
Class name | Path
MyApp::TestClass | ./spec/test_classes/1.rb:2
OneLinerClass | ./spec/test_classes/5.rb:1

Methods with 5+ lines
Class name | Method name | Size | Path
SandiMeter::Analyzer | initialize | 10 | ./lib/sandi_meter/analyzer.rb:10
SandiMeter::Analyzer | analyze | 13 | ./lib/sandi_meter/analyzer.rb:22

Misindented methods
Class name | Method name | Path
MyApp::TestClass | blah | ./spec/test_classes/1.rb:3

Method calls with 4+ arguments
# of arguments | Path
5 | ./lib/sandi_meter/html_generator.rb:55
5 | ./lib/sandi_meter/html_generator.rb:71

Controllers with 1+ instance variables
Controller name | Action name | Instance variables
AnotherUsersController | index | @users, @excess_variable
~~~

## HTML mode

Try using gem with `-g (--graph)` option, so it will create a folder with beautiful html output and log file with results of any scan.

### Charts page example

![SandiMeter HTML mode pie charts](https://github.com/makaroni4/sandi_meter/blob/main/.README/pie_charts.png?raw=true)

### Details page example

![SandiMeter HTML mode details](https://github.com/makaroni4/sandi_meter/blob/main/.README/details.png?raw=true)

Add ignore files and folders in `sandi_meter/.sandi_meter` file.

## Ruby script mode

~~~ruby
require 'sandi_meter/file_scanner'
require 'pp'

scanner = SandiMeter::FileScanner.new
data = scanner.scan(PATH_TO_PROJECT)
pp data
# {:first_rule=>
# {:small_classes_amount=>916,
# :total_classes_amount=>937,
# :misindented_classes_amount=>1},
# :second_rule=>
# {:small_methods_amount=>1144,
# :total_methods_amount=>1833,
# :misindented_methods_amount=>0},
# :third_rule=>{:proper_method_calls=>5857, :total_method_calls=>5894},
# :fourth_rule=>{:proper_controllers_amount=>17, :total_controllers_amount=>94}}
~~~