Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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.
- Host: GitHub
- URL: https://github.com/makaroni4/sandi_meter
- Owner: makaroni4
- License: mit
- Created: 2013-09-15T00:00:41.000Z (about 11 years ago)
- Default Branch: main
- Last Pushed: 2024-01-06T11:47:20.000Z (10 months ago)
- Last Synced: 2024-07-27T18:52:14.022Z (4 months ago)
- Language: Ruby
- Homepage: https://rubygems.org/gems/sandi_meter
- Size: 646 KB
- Stars: 762
- Watchers: 25
- Forks: 41
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
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_metersandi_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 Helpcd ~/your/ruby/or/rails/project
sandi_meter -d1. 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:1Misindented classes
Class name | Path
MyApp::TestClass | ./spec/test_classes/1.rb:2
OneLinerClass | ./spec/test_classes/5.rb:1Methods 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:22Misindented methods
Class name | Method name | Path
MyApp::TestClass | blah | ./spec/test_classes/1.rb:3Method calls with 4+ arguments
# of arguments | Path
5 | ./lib/sandi_meter/html_generator.rb:55
5 | ./lib/sandi_meter/html_generator.rb:71Controllers 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}}
~~~