-
-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Metrics/LineLength のより良いデフォルト値を模索したい #32
Comments
rubocop/rubocop#4588
みたいなコードがあります。 |
↑のコメントで言及したコードです。 クローラー環境に依存するかも知れないです。回数は適当に調整してください。 require 'pathname'
STATS_URL = 'https://rubygems.org/stats?page=%{page}'
def sh!(cmd)
puts "$ #{cmd}"
system(cmd)
end
GEM_HOME = Pathname(Dir.pwd).join('gem_home')
GEM_HOME.mkdir unless GEM_HOME.exist?
1.upto(50) do |i|
puts "page: #{i}"
gems = `curl '#{STATS_URL % {page: i}}'`
.each_line
.grep(/class="stats__graph__gem__name"/)
.map {|line| line[%r!([^>]+)\</a\>\</h3\>$!, 1]}
.map(&:chomp)
sh! "GEMSRC_SKIP=true GEM_HOME=#{GEM_HOME} gem install #{gems.join(' ')} --no-user-install"
sleep 1
end RuboCop の実行の仕方なお、この手法にはdisable commentを無視できないというバグがあります。(disable commentで無効化されているコードを計測できない) 1. rm .rubocop.yml各ライブラリの設定を無視するため
2. put .rubocop.yml計測したいCopのMaxを0にする MethodLength:
Max: 0
AbcSize:
Max: 0
AllCops:
TargetRubyVersion: 2.4 なお、実はこの辺の変更によって、masterとv0.51.0では違う結果が出る気がします。 3. 実行only に対象のCopを指定、formatはJSONで。parallelはあると便利
4. データの整形
< out.json| ruby -rjson -e 'puts JSON[ARGF.read]["files"].flat_map{|file|file["offenses"].map{|offense| offense["cop_name"] == "Metrics/MethodLength" ? offense["message"][/([\d.]+)\/0\]$/, 1].to_i : nil}.compact}' > output 5. 集計
sort -n < output | uniq -c | ruby -e 'N=17; a=STDIN.read.each_line.map(&:split).map{|x|x.map{|y|y.to_i}}; sum = a.map{|x|x[0]}.sum; sum2 = a.select{|_, n| n<=N}.map{|x|x[0]}.sum; p(sum2 / sum.to_f)' |
ちなみに、 |
LineLength もパーセンタイルで許容するのが有効なのかな……? 余談: |
各プロジェクトの rubocop 設定値の確認方法1. GitHub から
|
refs #1541 (comment) ### 概要 Searchable#target_column_of_keyword で動的に定義される _grouping_condition を privateメソッド化 するために define_singleton_method からメソッドチェーンで privateメソッド化 していた しかし、レビューで「横に長くて読みにくい&tapがごちゃごちゃしてわかりづらい」という意見をいただいたため、 tap で privateメソッド化 していた箇所を削除した レビューではブロックが curly brace での one-line から do end での multi-line も提案されていたが、以下の理由からそのまま curry brace での記述にしている - curly brace での記述の場合、line length は 111文字 - Style/LineLength を設定している場合、 120文字 に設定しているプロジェクトが結構多いように感じる - c.f. rubocop/rubocop-jp#32 (comment) - RubyMine の Code Style でのデフォルト設定が 120文字
RuboCop 1.0 でデフォルト 120 になります。 デフォルト 80 からのアップデートということでイシューの役割を果たしたと思うためクローズします。 |
I believe this is more easy to see. ref. rubocop/rubocop-jp#32 --- Original commit (web-client): 8beeccea338013285e963f041fb53b41563b385c
統計で殴るのが変更を訴える理由として一番有効そうかなと思っているんですが、
第一報としてこんな感じです。
雑に star 数 1500 以上で
.rubocop.yml
を持っているプロダクトを見て回ったところ、以下のような感じになりました。
(いっぱい取りこぼしがあるので雰囲気として掴んでください)
(追試可能なようにコード化していきます……)
The text was updated successfully, but these errors were encountered: