SandiMeter
Static analysis tool for checking your Ruby code for Sandi Metz' four rules.
- 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
Details page example
Add ignore files and folders in sandi_meter/.sandi_meter
file.
Ruby script mode
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}}