Ruby

Ruby の coverage を使って一番長い条件式を調べる

ruby 2.5 では coverage の機能が増えて分岐カバレッジが取得出来るようになったので、試しに一番長い条件式を取得するコードを書いてみました。

チェック用のサンプルコード

sample.rb
n = 5

if n < 5
  'low'
else
  'high'
end

case n
when 0
  'a'
when 1
  'b'
when 2
  'c'
when 3
  'd'
end

一番長い条件式を取得するためのコード (RUBY_VERSION >= "2.5.0")

get_longest_branch_code.rb
require "coverage"

Coverage.start(branches: true)
require_relative "sample"
result = Coverage.result

max_branch_size = 0
location = ""
longest_branch_code = ""

result.each do |filepath, coverage_data|
  source_code = File.readlines(filepath)
  branches = coverage_data[:branches]

  branches.each do |branch, _clauses|
    _condition_type, _clause_id, from_row, _from_col, to_row, _to_col = *branch
    branch_size = to_row - from_row + 1

    if max_branch_size < branch_size
      max_branch_size = branch_size
      location = "#{filepath}:#{from_row}"
      longest_branch_code = source_code[(from_row-1)..(to_row-1)].join
    end
  end
end

puts location
puts "longest branch code: (size #{max_branch_size})"
puts "-" * 80
puts longest_branch_code
puts "-" * 80

実行結果

~/Programming/ruby/sandbox ruby get_longest_branch_code.rb
/Users/siman/Programming/ruby/sandbox/sample.rb:9
longest branch code: (size 10)
--------------------------------------------------------------------------------
case n
when 0
  'a'
when 1
  'b'
when 2
  'c'
when 3
  'd'
end
--------------------------------------------------------------------------------

こんな感じで一番長い条件式が取得出来ました。

他にも有名なライブラリで試してみました。

  • active_support (5.1.4)

https://github.com/rails/rails/blob/v5.1.4/activesupport/lib/active_support/inflector/methods.rb#L268

  • rubocop (0.52.0)

https://github.com/bbatsov/rubocop/blob/v0.52.0/lib/rubocop/cop/variable_force.rb#L113

参考サイト

https://bugs.ruby-lang.org/issues/13901