8c1fa8dace
* This infrastructure, especially the rake tasks should be gemified at some point in the future. I copied exactly the same bytes many times in the last month.
47 lines
1.7 KiB
Ruby
47 lines
1.7 KiB
Ruby
begin
|
|
if RUBY_VERSION == '1.8.7' and !defined?(RUBY_ENGINE)
|
|
require 'flay'
|
|
require 'yaml'
|
|
|
|
config = YAML.load_file(File.expand_path('../../../config/flay.yml', __FILE__)).freeze
|
|
threshold = config.fetch('threshold').to_i
|
|
total_score = config.fetch('total_score').to_f
|
|
files = Flay.expand_dirs_to_files(config.fetch('path', 'lib'))
|
|
|
|
# original code by Marty Andrews:
|
|
# http://blog.martyandrews.net/2009/05/enforcing-ruby-code-quality.html
|
|
desc 'Analyze for code duplication'
|
|
task :flay do
|
|
# run flay once without a threshold to ensure the max mass matches the threshold
|
|
flay = Flay.new(:fuzzy => false, :verbose => false, :mass => 0)
|
|
flay.process(*files)
|
|
|
|
max = flay.masses.map { |hash, mass| mass.to_f / flay.hashes[hash].size }.max
|
|
unless max >= threshold
|
|
raise "Adjust flay threshold down to #{max}"
|
|
end
|
|
|
|
total = flay.masses.reduce(0.0) { |total, (hash, mass)| total + (mass.to_f / flay.hashes[hash].size) }
|
|
unless total == total_score
|
|
raise "Flay total is now #{total}, but expected #{total_score}"
|
|
end
|
|
|
|
# run flay a second time with the threshold set
|
|
flay = Flay.new(:fuzzy => false, :verbose => false, :mass => threshold.succ)
|
|
flay.process(*files)
|
|
|
|
if flay.masses.any?
|
|
flay.report
|
|
raise "#{flay.masses.size} chunks of code have a duplicate mass > #{threshold}"
|
|
end
|
|
end
|
|
else
|
|
task :flay do
|
|
$stderr.puts 'Flay has inconsistend results accros ruby implementations. It is only enabled on 1.8.7, fix and remove guard'
|
|
end
|
|
end
|
|
rescue LoadError
|
|
task :flay do
|
|
abort 'Flay is not available. In order to run flay, you must: gem install flay'
|
|
end
|
|
end
|