| name | ruby-flog-flay-setup |
| description | Install standardized flog/flay Rake tasks and a pre-commit hook that runs bundle exec rake for Ruby projects. Use when adding or normalizing code complexity and duplication checks. |
Ruby Flog Flay Setup
Overview
Install flog/flay Rake tasks with env-configurable thresholds and a pre-commit hook that runs bundle exec rake.
Workflow
1) Inspect existing setup
- Check
Gemfileforflogandflayentries. - Search for existing
:flogor:flayrake tasks inRakefileandrakelib/to avoid duplicates. - Check
git config core.hooksPathto determine the hooks directory (default is.git/hookswhen unset).
2) Ensure dependencies
- Add
gem "flay"andgem "flog"toGemfileif missing (no version pinning). - Run
bundle installif needed.
3) Define tasks in Rakefile
- Define
:flogand:flaytasks directly inRakefile. - Use env-configurable thresholds with defaults.
- Use
bundle execfor both tools. - Log only on failure using
putsand exit non-zero; stay silent on success. - Do not filter out any files or paths.
- Allow flay duplication when
Total score <= FLAY_THRESHOLD.
Example task definitions:
desc "Run flog"
task :flog do
output = `bundle exec flog -a lib`
threshold = (ENV["FLOG_THRESHOLD"] || 25).to_i
method_scores = []
output.each_line do |line|
if line =~ /^\s*(\d+\.\d+):\s+(.+#.+)\s+(.+\.rb)/
score = $1.to_f
method_name = $2.strip
file_path = $3.strip
method_scores << [score, "#{method_name} #{file_path}"]
end
end
failing_methods = method_scores.select { |score, _| score > threshold }
if failing_methods.any?
puts "\nFlog failed: Methods with complexity score > #{threshold}:"
failing_methods.each { |score, method_name| puts " #{score}: #{method_name}" }
exit 1
end
end
desc "Run flay"
task :flay do
output = `bundle exec flay lib`
threshold = (ENV["FLAY_THRESHOLD"] || 0).to_i
if (match = output.match(/Total score \(lower is better\) = (\d+)/))
score = match[1].to_i
if score > threshold
puts "\nFlay failed: Total duplication score is #{score}, must be <= #{threshold}"
puts output
exit 1
end
end
end
- Remove or update any conflicting
:flog/:flaytasks inrakelib/to avoid duplicate definitions. - Ensure the default task includes
flogandflayif the project expects them to run in CI.
4) Install pre-commit hook
- Create or update
pre-commitin the hooks directory fromcore.hooksPath(or.git/hooks). - Use bash and run
bundle exec rakeunconditionally. - Exit non-zero if rake fails.
Example hook:
#!/usr/bin/env bash
bundle exec rake
result=$?
if [ $result -ne 0 ]; then
echo "bundle exec rake failed. Commit aborted."
exit $result
fi
- Ensure the hook is executable.
5) Verify
- Run
bundle exec rakeand confirm it succeeds. - Make a test commit if needed to confirm the hook blocks failing builds.