metricfu / metric_fu

A fist full of code metrics
http://metricfu.github.com/metric_fu
MIT License
624 stars 96 forks source link

Cannot run metric_fu because gem dependency regex fails #298

Closed phylor closed 7 years ago

phylor commented 7 years ago

I get an error if I try to run metric_fu on my rails project:

$ bundle exec metric_fu
******* STARTING METRIC cane
bundler: failed to load command: metric_fu (/Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bin/metric_fu)
NoMethodError: undefined method `[]' for nil:NilClass
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_version.rb:35:in `block in gem_runtime_dependencies'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_version.rb:32:in `map'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_version.rb:32:in `gem_runtime_dependencies'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_version.rb:44:in `for'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_version.rb:57:in `for'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_run.rb:13:in `block in initialize'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_run.rb:13:in `fetch'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/gem_run.rb:13:in `initialize'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/metric.rb:51:in `new'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/metric.rb:51:in `run_external'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/generator.rb:90:in `run!'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/metrics/cane/generator.rb:17:in `emit'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/generator.rb:104:in `generate_result'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/reporting/result.rb:48:in `add'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/run.rb:21:in `block in measure'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/run.rb:19:in `each'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/run.rb:19:in `measure'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/run.rb:9:in `run'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/cli/helper.rb:19:in `run'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/lib/metric_fu/cli/client.rb:19:in `run'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bundler/gems/metric_fu-e26307966ac7/bin/metric_fu:9:in `<top (required)>'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bin/metric_fu:22:in `load'
  /Users/phylor/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/bin/metric_fu:22:in `<top (required)>'

The problem is that the ADD_DEPENDENCY_CALL regex fails. If I debug, the failing line is the following:

s.add_runtime_dependency(%q<flay>.freeze, [">= 2.0.1", "~> 2.1"])

It seems that there is a .freeze included which is not supported in the regex.

bf4 commented 7 years ago

Where is that %q<flay>.freeze coming from?

phylor commented 7 years ago

@bf4 Good point. I created a new rails project and that problem didn't occur. I'll check when that happens.

phylor commented 7 years ago

@bf4 This seems to be an issue with Ruby 2.2 (.freeze is present). It works with 2.3 (.freeze not present). So I guess the question is if you want to support Ruby 2.2? As far as I understand, metric_fu is only doing static analysis, so you could run it with a different Ruby version than the project under test, right?

Some more information to reproduce the issue: I created a new rails project using rails new metric-fu-test and added the master branch to the Gemfile.

See the output below (I'm using rbenv to switch Ruby versions).

Output for Ruby version 2.2:

metric-fu-test $ echo '2.2' > .ruby-version
metric-fu-test $ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin16]
metric-fu-test $ bundle
...
metric-fu-test $ cat $(bundle show metric_fu)/metric_fu.gemspec
# -*- encoding: utf-8 -*-
# stub: metric_fu 4.12.0 ruby lib

Gem::Specification.new do |s|
  s.name = "metric_fu".freeze
  s.version = "4.12.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Jake Scruggs".freeze, "Sean Soper".freeze, "Andre Arko".freeze, "Petrik de Heus".freeze, "Grant McInnes".freeze, "Nick Quaranto".freeze, "\u{c9}douard Bri\u{e8}re".freeze, "Carl Youngblood".freeze, "Richard Huang".freeze, "Dan Mayer".freeze, "Benjamin Fleischer".freeze, "Robin Curry".freeze]
  s.cert_chain = ["certs/bf4.pem".freeze]
  s.date = "2017-02-01"
  s.description = "Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)".freeze
  s.email = "github@benjaminfleischer.com".freeze
  s.executables = ["metric_fu".freeze, "mf-cane".freeze, "mf-churn".freeze, "mf-flay".freeze, "mf-reek".freeze, "mf-roodi".freeze, "mf-saikuro".freeze]
  s.extra_rdoc_files = ["HISTORY.md".freeze, "CONTRIBUTING.md".freeze, "TODO.md".freeze, "MIT-LICENSE".freeze]
  s.files = [".gitignore".freeze, ".metrics".freeze, ".rspec".freeze, ".rubocop.yml".freeze, ".rubocop_todo.yml".freeze, ".simplecov".freeze, ".travis.yml".freeze, ".yardopts".freeze, "AUTHORS".freeze, "CONTRIBUTING.md".freeze, "CONTRIBUTORS".freeze, "DEV.md".freeze, "Gemfile".freeze, "Guardfile".freeze, "HISTORY.md".freeze, "MIT-LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "TODO.md".freeze, "appveyor.yml".freeze, "bin/metric_fu".freeze, "bin/mf-cane".freeze, "bin/mf-churn".freeze, "bin/mf-flay".freeze, "bin/mf-reek".freeze, "bin/mf-roodi".freeze, "bin/mf-saikuro".freeze, "certs/bf4.pem".freeze, "checksum/.gitkeep".freeze, "checksum/metric_fu-4.10.0.gem.sha512".freeze, "checksum/metric_fu-4.11.0.gem.sha512".freeze, "checksum/metric_fu-4.11.1.gem.sha512".freeze, "checksum/metric_fu-4.11.2.gem.sha512".freeze, "checksum/metric_fu-4.11.3.gem.sha512".freeze, "checksum/metric_fu-4.11.4.gem.sha512".freeze, "checksum/metric_fu-4.12.0.gem.sha512".freeze, "checksum/metric_fu-4.2.0.gem.sha512".freeze, "checksum/metric_fu-4.2.1.gem.sha512".freeze, "checksum/metric_fu-4.3.0.gem.sha512".freeze, "checksum/metric_fu-4.3.1.gem.sha512".freeze, "checksum/metric_fu-4.4.0.gem.sha512".freeze, "checksum/metric_fu-4.4.1.gem.sha512".freeze, "checksum/metric_fu-4.4.2.gem.sha512".freeze, "checksum/metric_fu-4.4.3.gem.sha512".freeze, "checksum/metric_fu-4.4.4.gem.sha512".freeze, "checksum/metric_fu-4.5.0.gem.sha512".freeze, "checksum/metric_fu-4.5.1.gem.sha512".freeze, "checksum/metric_fu-4.5.2.gem.sha512".freeze, "checksum/metric_fu-4.6.0.gem.sha512".freeze, "checksum/metric_fu-4.7.0.gem.sha512".freeze, "checksum/metric_fu-4.7.1.gem.sha512".freeze, "checksum/metric_fu-4.7.2.gem.sha512".freeze, "checksum/metric_fu-4.7.3.gem.sha512".freeze, "checksum/metric_fu-4.7.4.gem.sha512".freeze, "checksum/metric_fu-4.8.0.gem.sha512".freeze, "checksum/metric_fu-4.9.0.gem.sha512".freeze, "config/roodi_config.yml".freeze, "config/rubocop.yml".freeze, "gem_tasks/build.rake".freeze, "gem_tasks/rubocop.rake".freeze, "gem_tasks/usage_test.rake".freeze, "gem_tasks/yard.rake".freeze, "lib/metric_fu.rb".freeze, "lib/metric_fu/calculate.rb".freeze, "lib/metric_fu/cli/client.rb".freeze, "lib/metric_fu/cli/helper.rb".freeze, "lib/metric_fu/cli/parser.rb".freeze, "lib/metric_fu/configuration.rb".freeze, "lib/metric_fu/constantize.rb".freeze, "lib/metric_fu/data_structures/line_numbers.rb".freeze, "lib/metric_fu/data_structures/location.rb".freeze, "lib/metric_fu/data_structures/sexp_node.rb".freeze, "lib/metric_fu/environment.rb".freeze, "lib/metric_fu/errors/analysis_error.rb".freeze, "lib/metric_fu/formatter.rb".freeze, "lib/metric_fu/formatter/html.rb".freeze, "lib/metric_fu/formatter/syntax.rb".freeze, "lib/metric_fu/formatter/yaml.rb".freeze, "lib/metric_fu/gem_run.rb".freeze, "lib/metric_fu/gem_version.rb".freeze, "lib/metric_fu/generator.rb".freeze, "lib/metric_fu/io.rb".freeze, "lib/metric_fu/loader.rb".freeze, "lib/metric_fu/logger.rb".freeze, "lib/metric_fu/logging/mf_debugger.rb".freeze, "lib/metric_fu/metric.rb".freeze, "lib/metric_fu/metrics/cane/generator.rb".freeze, "lib/metric_fu/metrics/cane/grapher.rb".freeze, "lib/metric_fu/metrics/cane/metric.rb".freeze, "lib/metric_fu/metrics/cane/report.html.erb".freeze, "lib/metric_fu/metrics/cane/violations.rb".freeze, "lib/metric_fu/metrics/churn/generator.rb".freeze, "lib/metric_fu/metrics/churn/hotspot.rb".freeze, "lib/metric_fu/metrics/churn/metric.rb".freeze, "lib/metric_fu/metrics/churn/report.html.erb".freeze, "lib/metric_fu/metrics/flay/generator.rb".freeze, "lib/metric_fu/metrics/flay/grapher.rb".freeze, "lib/metric_fu/metrics/flay/hotspot.rb".freeze, "lib/metric_fu/metrics/flay/metric.rb".freeze, "lib/metric_fu/metrics/flay/report.html.erb".freeze, "lib/metric_fu/metrics/flog/generator.rb".freeze, "lib/metric_fu/metrics/flog/grapher.rb".freeze, "lib/metric_fu/metrics/flog/hotspot.rb".freeze, "lib/metric_fu/metrics/flog/metric.rb".freeze, "lib/metric_fu/metrics/flog/report.html.erb".freeze, "lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/grouping.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/groupings.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/problems.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/ranking.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/rankings.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/record.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb".freeze, "lib/metric_fu/metrics/hotspots/analysis/table.rb".freeze, "lib/metric_fu/metrics/hotspots/generator.rb".freeze, "lib/metric_fu/metrics/hotspots/hotspot.rb".freeze, "lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb".freeze, "lib/metric_fu/metrics/hotspots/metric.rb".freeze, "lib/metric_fu/metrics/hotspots/report.html.erb".freeze, "lib/metric_fu/metrics/rails_best_practices/generator.rb".freeze, "lib/metric_fu/metrics/rails_best_practices/grapher.rb".freeze, "lib/metric_fu/metrics/rails_best_practices/metric.rb".freeze, "lib/metric_fu/metrics/rails_best_practices/report.html.erb".freeze, "lib/metric_fu/metrics/rcov/external_client.rb".freeze, "lib/metric_fu/metrics/rcov/generator.rb".freeze, "lib/metric_fu/metrics/rcov/grapher.rb".freeze, "lib/metric_fu/metrics/rcov/hotspot.rb".freeze, "lib/metric_fu/metrics/rcov/metric.rb".freeze, "lib/metric_fu/metrics/rcov/rcov_format_coverage.rb".freeze, "lib/metric_fu/metrics/rcov/rcov_line.rb".freeze, "lib/metric_fu/metrics/rcov/report.html.erb".freeze, "lib/metric_fu/metrics/rcov/simplecov_formatter.rb".freeze, "lib/metric_fu/metrics/reek/generator.rb".freeze, "lib/metric_fu/metrics/reek/grapher.rb".freeze, "lib/metric_fu/metrics/reek/hotspot.rb".freeze, "lib/metric_fu/metrics/reek/metric.rb".freeze, "lib/metric_fu/metrics/reek/report.html.erb".freeze, "lib/metric_fu/metrics/roodi/generator.rb".freeze, "lib/metric_fu/metrics/roodi/grapher.rb".freeze, "lib/metric_fu/metrics/roodi/hotspot.rb".freeze, "lib/metric_fu/metrics/roodi/metric.rb".freeze, "lib/metric_fu/metrics/roodi/report.html.erb".freeze, "lib/metric_fu/metrics/saikuro/generator.rb".freeze, "lib/metric_fu/metrics/saikuro/hotspot.rb".freeze, "lib/metric_fu/metrics/saikuro/metric.rb".freeze, "lib/metric_fu/metrics/saikuro/parsing_element.rb".freeze, "lib/metric_fu/metrics/saikuro/report.html.erb".freeze, "lib/metric_fu/metrics/saikuro/scratch_file.rb".freeze, "lib/metric_fu/metrics/stats/generator.rb".freeze, "lib/metric_fu/metrics/stats/grapher.rb".freeze, "lib/metric_fu/metrics/stats/hotspot.rb".freeze, "lib/metric_fu/metrics/stats/metric.rb".freeze, "lib/metric_fu/metrics/stats/report.html.erb".freeze, "lib/metric_fu/reporter.rb".freeze, "lib/metric_fu/reporting/graphs/graph.rb".freeze, "lib/metric_fu/reporting/graphs/grapher.rb".freeze, "lib/metric_fu/reporting/result.rb".freeze, "lib/metric_fu/run.rb".freeze, "lib/metric_fu/tasks/metric_fu.rake".freeze, "lib/metric_fu/templates/_graph.html.erb".freeze, "lib/metric_fu/templates/_report_footer.html.erb".freeze, "lib/metric_fu/templates/configuration.rb".freeze, "lib/metric_fu/templates/css/bluff.css".freeze, "lib/metric_fu/templates/css/buttons.css".freeze, "lib/metric_fu/templates/css/default.css".freeze, "lib/metric_fu/templates/css/integrity.css".freeze, "lib/metric_fu/templates/css/rcov.css".freeze, "lib/metric_fu/templates/css/reset.css".freeze, "lib/metric_fu/templates/css/syntax.css".freeze, "lib/metric_fu/templates/index.html.erb".freeze, "lib/metric_fu/templates/javascripts/bluff-min.js".freeze, "lib/metric_fu/templates/javascripts/bluff_graph.js".freeze, "lib/metric_fu/templates/javascripts/excanvas.js".freeze, "lib/metric_fu/templates/javascripts/highcharts.js".freeze, "lib/metric_fu/templates/javascripts/highcharts_graph.js".freeze, "lib/metric_fu/templates/javascripts/js-class.js".freeze, "lib/metric_fu/templates/javascripts/standalone-framework.js".freeze, "lib/metric_fu/templates/javascripts/utils.js".freeze, "lib/metric_fu/templates/layout.html.erb".freeze, "lib/metric_fu/templates/metrics_template.rb".freeze, "lib/metric_fu/templates/report.html.erb".freeze, "lib/metric_fu/templates/report.rb".freeze, "lib/metric_fu/templates/template.rb".freeze, "lib/metric_fu/utility.rb".freeze, "lib/metric_fu/version.rb".freeze, "metric_fu.gemspec".freeze, "spec/capture_warnings.rb".freeze, "spec/cli/helper_spec.rb".freeze, "spec/dummy/.gitignore".freeze, "spec/dummy/.gitkeep".freeze, "spec/dummy/.metrics".freeze, "spec/dummy/lib/.gitkeep".freeze, "spec/dummy/lib/bad_encoding.rb".freeze, "spec/dummy/spec/.gitkeep".freeze, "spec/fixtures/20090630.yml".freeze, "spec/fixtures/coverage-153.rb".freeze, "spec/fixtures/coverage.rb".freeze, "spec/fixtures/exit0.sh".freeze, "spec/fixtures/exit1.sh".freeze, "spec/fixtures/hotspots/flog.yml".freeze, "spec/fixtures/hotspots/generator.yml".freeze, "spec/fixtures/hotspots/generator_analysis.yml".freeze, "spec/fixtures/hotspots/reek.yml".freeze, "spec/fixtures/hotspots/roodi.yml".freeze, "spec/fixtures/hotspots/saikuro.yml".freeze, "spec/fixtures/hotspots/several_metrics.yml".freeze, "spec/fixtures/hotspots/stats.yml".freeze, "spec/fixtures/hotspots/three_metrics_on_same_file.yml".freeze, "spec/fixtures/line_numbers/foo.rb".freeze, "spec/fixtures/line_numbers/module.rb".freeze, "spec/fixtures/line_numbers/module_surrounds_class.rb".freeze, "spec/fixtures/line_numbers/two_classes.rb".freeze, "spec/fixtures/metric_missing.yml".freeze, "spec/fixtures/rcov_output.txt".freeze, "spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html".freeze, "spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html".freeze, "spec/fixtures/saikuro/index_cyclo.html".freeze, "spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html".freeze, "spec/metric_fu/calculate_spec.rb".freeze, "spec/metric_fu/configuration_spec.rb".freeze, "spec/metric_fu/data_structures/line_numbers_spec.rb".freeze, "spec/metric_fu/data_structures/location_spec.rb".freeze, "spec/metric_fu/formatter/configuration_spec.rb".freeze, "spec/metric_fu/formatter/html_spec.rb".freeze, "spec/metric_fu/formatter/yaml_spec.rb".freeze, "spec/metric_fu/formatter_spec.rb".freeze, "spec/metric_fu/gem_version_spec.rb".freeze, "spec/metric_fu/generator_spec.rb".freeze, "spec/metric_fu/loader_spec.rb".freeze, "spec/metric_fu/metric_spec.rb".freeze, "spec/metric_fu/metrics/cane/configuration_spec.rb".freeze, "spec/metric_fu/metrics/cane/generator_spec.rb".freeze, "spec/metric_fu/metrics/churn/configuration_spec.rb".freeze, "spec/metric_fu/metrics/churn/generator_spec.rb".freeze, "spec/metric_fu/metrics/flay/configuration_spec.rb".freeze, "spec/metric_fu/metrics/flay/generator_spec.rb".freeze, "spec/metric_fu/metrics/flay/grapher_spec.rb".freeze, "spec/metric_fu/metrics/flog/configuration_spec.rb".freeze, "spec/metric_fu/metrics/flog/generator_spec.rb".freeze, "spec/metric_fu/metrics/flog/grapher_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/table_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/generator_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/hotspot_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/generator_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb".freeze, "spec/metric_fu/metrics/rcov/configuration_spec.rb".freeze, "spec/metric_fu/metrics/rcov/generator_spec.rb".freeze, "spec/metric_fu/metrics/rcov/grapher_spec.rb".freeze, "spec/metric_fu/metrics/rcov/hotspot_spec.rb".freeze, "spec/metric_fu/metrics/rcov/rcov_line_spec.rb".freeze, "spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb".freeze, "spec/metric_fu/metrics/reek/configuration_spec.rb".freeze, "spec/metric_fu/metrics/reek/generator_spec.rb".freeze, "spec/metric_fu/metrics/reek/grapher_spec.rb".freeze, "spec/metric_fu/metrics/roodi/configuration_spec.rb".freeze, "spec/metric_fu/metrics/roodi/generator_spec.rb".freeze, "spec/metric_fu/metrics/roodi/grapher_spec.rb".freeze, "spec/metric_fu/metrics/saikuro/configuration_spec.rb".freeze, "spec/metric_fu/metrics/saikuro/generator_spec.rb".freeze, "spec/metric_fu/metrics/stats/generator_spec.rb".freeze, "spec/metric_fu/metrics/stats/grapher_spec.rb".freeze, "spec/metric_fu/reporter_spec.rb".freeze, "spec/metric_fu/reporting/graphs/graph_spec.rb".freeze, "spec/metric_fu/reporting/graphs/grapher_spec.rb".freeze, "spec/metric_fu/reporting/result_spec.rb".freeze, "spec/metric_fu/run_spec.rb".freeze, "spec/metric_fu/templates/configuration_spec.rb".freeze, "spec/metric_fu/templates/metrics_template_spec.rb".freeze, "spec/metric_fu/templates/report_spec.rb".freeze, "spec/metric_fu/templates/template_spec.rb".freeze, "spec/metric_fu/utility_spec.rb".freeze, "spec/metric_fu_spec.rb".freeze, "spec/quality_spec.rb".freeze, "spec/shared/configured.rb".freeze, "spec/shared/test_coverage.rb".freeze, "spec/spec_helper.rb".freeze, "spec/support/deferred_garbaged_collection.rb".freeze, "spec/support/helper_methods.rb".freeze, "spec/support/matcher_create_file.rb".freeze, "spec/support/matcher_create_files.rb".freeze, "spec/support/suite.rb".freeze, "spec/support/test_fixtures.rb".freeze, "spec/support/timeout.rb".freeze, "spec/support/usage_test.rb".freeze, "spec/usage_test_spec.rb".freeze]
  s.homepage = "https://github.com/metricfu/metric_fu".freeze
  s.licenses = ["MIT".freeze]
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 1.9.0".freeze)
  s.rubyforge_project = "metric_fu".freeze
  s.rubygems_version = "2.6.10".freeze
  s.summary = "A fistful of code metrics, with awesome templates and graphs".freeze
  s.test_files = ["spec/capture_warnings.rb".freeze, "spec/cli/helper_spec.rb".freeze, "spec/dummy/.gitignore".freeze, "spec/dummy/.gitkeep".freeze, "spec/dummy/.metrics".freeze, "spec/dummy/lib/.gitkeep".freeze, "spec/dummy/lib/bad_encoding.rb".freeze, "spec/dummy/spec/.gitkeep".freeze, "spec/fixtures/20090630.yml".freeze, "spec/fixtures/coverage-153.rb".freeze, "spec/fixtures/coverage.rb".freeze, "spec/fixtures/exit0.sh".freeze, "spec/fixtures/exit1.sh".freeze, "spec/fixtures/hotspots/flog.yml".freeze, "spec/fixtures/hotspots/generator.yml".freeze, "spec/fixtures/hotspots/generator_analysis.yml".freeze, "spec/fixtures/hotspots/reek.yml".freeze, "spec/fixtures/hotspots/roodi.yml".freeze, "spec/fixtures/hotspots/saikuro.yml".freeze, "spec/fixtures/hotspots/several_metrics.yml".freeze, "spec/fixtures/hotspots/stats.yml".freeze, "spec/fixtures/hotspots/three_metrics_on_same_file.yml".freeze, "spec/fixtures/line_numbers/foo.rb".freeze, "spec/fixtures/line_numbers/module.rb".freeze, "spec/fixtures/line_numbers/module_surrounds_class.rb".freeze, "spec/fixtures/line_numbers/two_classes.rb".freeze, "spec/fixtures/metric_missing.yml".freeze, "spec/fixtures/rcov_output.txt".freeze, "spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html".freeze, "spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html".freeze, "spec/fixtures/saikuro/index_cyclo.html".freeze, "spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html".freeze, "spec/metric_fu/calculate_spec.rb".freeze, "spec/metric_fu/configuration_spec.rb".freeze, "spec/metric_fu/data_structures/line_numbers_spec.rb".freeze, "spec/metric_fu/data_structures/location_spec.rb".freeze, "spec/metric_fu/formatter/configuration_spec.rb".freeze, "spec/metric_fu/formatter/html_spec.rb".freeze, "spec/metric_fu/formatter/yaml_spec.rb".freeze, "spec/metric_fu/formatter_spec.rb".freeze, "spec/metric_fu/gem_version_spec.rb".freeze, "spec/metric_fu/generator_spec.rb".freeze, "spec/metric_fu/loader_spec.rb".freeze, "spec/metric_fu/metric_spec.rb".freeze, "spec/metric_fu/metrics/cane/configuration_spec.rb".freeze, "spec/metric_fu/metrics/cane/generator_spec.rb".freeze, "spec/metric_fu/metrics/churn/configuration_spec.rb".freeze, "spec/metric_fu/metrics/churn/generator_spec.rb".freeze, "spec/metric_fu/metrics/flay/configuration_spec.rb".freeze, "spec/metric_fu/metrics/flay/generator_spec.rb".freeze, "spec/metric_fu/metrics/flay/grapher_spec.rb".freeze, "spec/metric_fu/metrics/flog/configuration_spec.rb".freeze, "spec/metric_fu/metrics/flog/generator_spec.rb".freeze, "spec/metric_fu/metrics/flog/grapher_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/analysis/table_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/generator_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb".freeze, "spec/metric_fu/metrics/hotspots/hotspot_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/generator_spec.rb".freeze, "spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb".freeze, "spec/metric_fu/metrics/rcov/configuration_spec.rb".freeze, "spec/metric_fu/metrics/rcov/generator_spec.rb".freeze, "spec/metric_fu/metrics/rcov/grapher_spec.rb".freeze, "spec/metric_fu/metrics/rcov/hotspot_spec.rb".freeze, "spec/metric_fu/metrics/rcov/rcov_line_spec.rb".freeze, "spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb".freeze, "spec/metric_fu/metrics/reek/configuration_spec.rb".freeze, "spec/metric_fu/metrics/reek/generator_spec.rb".freeze, "spec/metric_fu/metrics/reek/grapher_spec.rb".freeze, "spec/metric_fu/metrics/roodi/configuration_spec.rb".freeze, "spec/metric_fu/metrics/roodi/generator_spec.rb".freeze, "spec/metric_fu/metrics/roodi/grapher_spec.rb".freeze, "spec/metric_fu/metrics/saikuro/configuration_spec.rb".freeze, "spec/metric_fu/metrics/saikuro/generator_spec.rb".freeze, "spec/metric_fu/metrics/stats/generator_spec.rb".freeze, "spec/metric_fu/metrics/stats/grapher_spec.rb".freeze, "spec/metric_fu/reporter_spec.rb".freeze, "spec/metric_fu/reporting/graphs/graph_spec.rb".freeze, "spec/metric_fu/reporting/graphs/grapher_spec.rb".freeze, "spec/metric_fu/reporting/result_spec.rb".freeze, "spec/metric_fu/run_spec.rb".freeze, "spec/metric_fu/templates/configuration_spec.rb".freeze, "spec/metric_fu/templates/metrics_template_spec.rb".freeze, "spec/metric_fu/templates/report_spec.rb".freeze, "spec/metric_fu/templates/template_spec.rb".freeze, "spec/metric_fu/utility_spec.rb".freeze, "spec/metric_fu_spec.rb".freeze, "spec/quality_spec.rb".freeze, "spec/shared/configured.rb".freeze, "spec/shared/test_coverage.rb".freeze, "spec/spec_helper.rb".freeze, "spec/support/deferred_garbaged_collection.rb".freeze, "spec/support/helper_methods.rb".freeze, "spec/support/matcher_create_file.rb".freeze, "spec/support/matcher_create_files.rb".freeze, "spec/support/suite.rb".freeze, "spec/support/test_fixtures.rb".freeze, "spec/support/timeout.rb".freeze, "spec/support/usage_test.rb".freeze, "spec/usage_test_spec.rb".freeze]

  if s.respond_to? :specification_version then
    s.specification_version = 4

    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
      s.add_runtime_dependency(%q<flay>.freeze, [">= 2.0.1", "~> 2.1"])
      s.add_runtime_dependency(%q<churn>.freeze, ["~> 0.0.35"])
      s.add_runtime_dependency(%q<flog>.freeze, [">= 4.1.1", "~> 4.1"])
      s.add_runtime_dependency(%q<reek>.freeze, ["< 3.0", ">= 1.3.4"])
      s.add_runtime_dependency(%q<cane>.freeze, [">= 2.5.2", "~> 2.5"])
      s.add_runtime_dependency(%q<rails_best_practices>.freeze, [">= 1.14.3", "~> 1.14"])
      s.add_runtime_dependency(%q<metric_fu-Saikuro>.freeze, [">= 1.1.3", "~> 1.1"])
      s.add_runtime_dependency(%q<roodi>.freeze, ["~> 5.0.0"])
      s.add_runtime_dependency(%q<code_metrics>.freeze, ["~> 0.1"])
      s.add_runtime_dependency(%q<redcard>.freeze, [">= 0"])
      s.add_runtime_dependency(%q<coderay>.freeze, [">= 0"])
      s.add_runtime_dependency(%q<multi_json>.freeze, [">= 0"])
      s.add_runtime_dependency(%q<launchy>.freeze, ["~> 2.0"])
      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.1"])
      s.add_development_dependency(%q<test_construct>.freeze, [">= 0"])
      s.add_development_dependency(%q<json>.freeze, [">= 0"])
      s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.9"])
    else
      s.add_dependency(%q<flay>.freeze, [">= 2.0.1", "~> 2.1"])
      s.add_dependency(%q<churn>.freeze, ["~> 0.0.35"])
      s.add_dependency(%q<flog>.freeze, [">= 4.1.1", "~> 4.1"])
      s.add_dependency(%q<reek>.freeze, ["< 3.0", ">= 1.3.4"])
      s.add_dependency(%q<cane>.freeze, [">= 2.5.2", "~> 2.5"])
      s.add_dependency(%q<rails_best_practices>.freeze, [">= 1.14.3", "~> 1.14"])
      s.add_dependency(%q<metric_fu-Saikuro>.freeze, [">= 1.1.3", "~> 1.1"])
      s.add_dependency(%q<roodi>.freeze, ["~> 5.0.0"])
      s.add_dependency(%q<code_metrics>.freeze, ["~> 0.1"])
      s.add_dependency(%q<redcard>.freeze, [">= 0"])
      s.add_dependency(%q<coderay>.freeze, [">= 0"])
      s.add_dependency(%q<multi_json>.freeze, [">= 0"])
      s.add_dependency(%q<launchy>.freeze, ["~> 2.0"])
      s.add_dependency(%q<rspec>.freeze, ["~> 3.1"])
      s.add_dependency(%q<test_construct>.freeze, [">= 0"])
      s.add_dependency(%q<json>.freeze, [">= 0"])
      s.add_dependency(%q<simplecov>.freeze, ["~> 0.9"])
    end
  else
    s.add_dependency(%q<flay>.freeze, [">= 2.0.1", "~> 2.1"])
    s.add_dependency(%q<churn>.freeze, ["~> 0.0.35"])
    s.add_dependency(%q<flog>.freeze, [">= 4.1.1", "~> 4.1"])
    s.add_dependency(%q<reek>.freeze, ["< 3.0", ">= 1.3.4"])
    s.add_dependency(%q<cane>.freeze, [">= 2.5.2", "~> 2.5"])
    s.add_dependency(%q<rails_best_practices>.freeze, [">= 1.14.3", "~> 1.14"])
    s.add_dependency(%q<metric_fu-Saikuro>.freeze, [">= 1.1.3", "~> 1.1"])
    s.add_dependency(%q<roodi>.freeze, ["~> 5.0.0"])
    s.add_dependency(%q<code_metrics>.freeze, ["~> 0.1"])
    s.add_dependency(%q<redcard>.freeze, [">= 0"])
    s.add_dependency(%q<coderay>.freeze, [">= 0"])
    s.add_dependency(%q<multi_json>.freeze, [">= 0"])
    s.add_dependency(%q<launchy>.freeze, ["~> 2.0"])
    s.add_dependency(%q<rspec>.freeze, ["~> 3.1"])
    s.add_dependency(%q<test_construct>.freeze, [">= 0"])
    s.add_dependency(%q<json>.freeze, [">= 0"])
    s.add_dependency(%q<simplecov>.freeze, ["~> 0.9"])
  end
end

Output for Ruby version 2.3:

metric-fu-test $ echo '2.3' > .ruby-version
metric-fu-test $ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
metric-fu-test $ bundle
...
metric-fu-test $ cat $(bundle show metric_fu)/metric_fu.gemspec
# -*- encoding: utf-8 -*-
# stub: metric_fu 4.12.0 ruby lib

Gem::Specification.new do |s|
  s.name = "metric_fu"
  s.version = "4.12.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib"]
  s.authors = ["Jake Scruggs", "Sean Soper", "Andre Arko", "Petrik de Heus", "Grant McInnes", "Nick Quaranto", "\u{c9}douard Bri\u{e8}re", "Carl Youngblood", "Richard Huang", "Dan Mayer", "Benjamin Fleischer", "Robin Curry"]
  s.cert_chain = ["certs/bf4.pem"]
  s.date = "2017-02-02"
  s.description = "Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)"
  s.email = "github@benjaminfleischer.com"
  s.executables = ["metric_fu", "mf-cane", "mf-churn", "mf-flay", "mf-reek", "mf-roodi", "mf-saikuro"]
  s.extra_rdoc_files = ["HISTORY.md", "CONTRIBUTING.md", "TODO.md", "MIT-LICENSE"]
  s.files = [".gitignore", ".metrics", ".rspec", ".rubocop.yml", ".rubocop_todo.yml", ".simplecov", ".travis.yml", ".yardopts", "AUTHORS", "CONTRIBUTING.md", "CONTRIBUTORS", "DEV.md", "Gemfile", "Guardfile", "HISTORY.md", "MIT-LICENSE", "README.md", "Rakefile", "TODO.md", "appveyor.yml", "bin/metric_fu", "bin/mf-cane", "bin/mf-churn", "bin/mf-flay", "bin/mf-reek", "bin/mf-roodi", "bin/mf-saikuro", "certs/bf4.pem", "checksum/.gitkeep", "checksum/metric_fu-4.10.0.gem.sha512", "checksum/metric_fu-4.11.0.gem.sha512", "checksum/metric_fu-4.11.1.gem.sha512", "checksum/metric_fu-4.11.2.gem.sha512", "checksum/metric_fu-4.11.3.gem.sha512", "checksum/metric_fu-4.11.4.gem.sha512", "checksum/metric_fu-4.12.0.gem.sha512", "checksum/metric_fu-4.2.0.gem.sha512", "checksum/metric_fu-4.2.1.gem.sha512", "checksum/metric_fu-4.3.0.gem.sha512", "checksum/metric_fu-4.3.1.gem.sha512", "checksum/metric_fu-4.4.0.gem.sha512", "checksum/metric_fu-4.4.1.gem.sha512", "checksum/metric_fu-4.4.2.gem.sha512", "checksum/metric_fu-4.4.3.gem.sha512", "checksum/metric_fu-4.4.4.gem.sha512", "checksum/metric_fu-4.5.0.gem.sha512", "checksum/metric_fu-4.5.1.gem.sha512", "checksum/metric_fu-4.5.2.gem.sha512", "checksum/metric_fu-4.6.0.gem.sha512", "checksum/metric_fu-4.7.0.gem.sha512", "checksum/metric_fu-4.7.1.gem.sha512", "checksum/metric_fu-4.7.2.gem.sha512", "checksum/metric_fu-4.7.3.gem.sha512", "checksum/metric_fu-4.7.4.gem.sha512", "checksum/metric_fu-4.8.0.gem.sha512", "checksum/metric_fu-4.9.0.gem.sha512", "config/roodi_config.yml", "config/rubocop.yml", "gem_tasks/build.rake", "gem_tasks/rubocop.rake", "gem_tasks/usage_test.rake", "gem_tasks/yard.rake", "lib/metric_fu.rb", "lib/metric_fu/calculate.rb", "lib/metric_fu/cli/client.rb", "lib/metric_fu/cli/helper.rb", "lib/metric_fu/cli/parser.rb", "lib/metric_fu/configuration.rb", "lib/metric_fu/constantize.rb", "lib/metric_fu/data_structures/line_numbers.rb", "lib/metric_fu/data_structures/location.rb", "lib/metric_fu/data_structures/sexp_node.rb", "lib/metric_fu/environment.rb", "lib/metric_fu/errors/analysis_error.rb", "lib/metric_fu/formatter.rb", "lib/metric_fu/formatter/html.rb", "lib/metric_fu/formatter/syntax.rb", "lib/metric_fu/formatter/yaml.rb", "lib/metric_fu/gem_run.rb", "lib/metric_fu/gem_version.rb", "lib/metric_fu/generator.rb", "lib/metric_fu/io.rb", "lib/metric_fu/loader.rb", "lib/metric_fu/logger.rb", "lib/metric_fu/logging/mf_debugger.rb", "lib/metric_fu/metric.rb", "lib/metric_fu/metrics/cane/generator.rb", "lib/metric_fu/metrics/cane/grapher.rb", "lib/metric_fu/metrics/cane/metric.rb", "lib/metric_fu/metrics/cane/report.html.erb", "lib/metric_fu/metrics/cane/violations.rb", "lib/metric_fu/metrics/churn/generator.rb", "lib/metric_fu/metrics/churn/hotspot.rb", "lib/metric_fu/metrics/churn/metric.rb", "lib/metric_fu/metrics/churn/report.html.erb", "lib/metric_fu/metrics/flay/generator.rb", "lib/metric_fu/metrics/flay/grapher.rb", "lib/metric_fu/metrics/flay/hotspot.rb", "lib/metric_fu/metrics/flay/metric.rb", "lib/metric_fu/metrics/flay/report.html.erb", "lib/metric_fu/metrics/flog/generator.rb", "lib/metric_fu/metrics/flog/grapher.rb", "lib/metric_fu/metrics/flog/hotspot.rb", "lib/metric_fu/metrics/flog/metric.rb", "lib/metric_fu/metrics/flog/report.html.erb", "lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb", "lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb", "lib/metric_fu/metrics/hotspots/analysis/grouping.rb", "lib/metric_fu/metrics/hotspots/analysis/groupings.rb", "lib/metric_fu/metrics/hotspots/analysis/problems.rb", "lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb", "lib/metric_fu/metrics/hotspots/analysis/ranking.rb", "lib/metric_fu/metrics/hotspots/analysis/rankings.rb", "lib/metric_fu/metrics/hotspots/analysis/record.rb", "lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb", "lib/metric_fu/metrics/hotspots/analysis/table.rb", "lib/metric_fu/metrics/hotspots/generator.rb", "lib/metric_fu/metrics/hotspots/hotspot.rb", "lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb", "lib/metric_fu/metrics/hotspots/metric.rb", "lib/metric_fu/metrics/hotspots/report.html.erb", "lib/metric_fu/metrics/rails_best_practices/generator.rb", "lib/metric_fu/metrics/rails_best_practices/grapher.rb", "lib/metric_fu/metrics/rails_best_practices/metric.rb", "lib/metric_fu/metrics/rails_best_practices/report.html.erb", "lib/metric_fu/metrics/rcov/external_client.rb", "lib/metric_fu/metrics/rcov/generator.rb", "lib/metric_fu/metrics/rcov/grapher.rb", "lib/metric_fu/metrics/rcov/hotspot.rb", "lib/metric_fu/metrics/rcov/metric.rb", "lib/metric_fu/metrics/rcov/rcov_format_coverage.rb", "lib/metric_fu/metrics/rcov/rcov_line.rb", "lib/metric_fu/metrics/rcov/report.html.erb", "lib/metric_fu/metrics/rcov/simplecov_formatter.rb", "lib/metric_fu/metrics/reek/generator.rb", "lib/metric_fu/metrics/reek/grapher.rb", "lib/metric_fu/metrics/reek/hotspot.rb", "lib/metric_fu/metrics/reek/metric.rb", "lib/metric_fu/metrics/reek/report.html.erb", "lib/metric_fu/metrics/roodi/generator.rb", "lib/metric_fu/metrics/roodi/grapher.rb", "lib/metric_fu/metrics/roodi/hotspot.rb", "lib/metric_fu/metrics/roodi/metric.rb", "lib/metric_fu/metrics/roodi/report.html.erb", "lib/metric_fu/metrics/saikuro/generator.rb", "lib/metric_fu/metrics/saikuro/hotspot.rb", "lib/metric_fu/metrics/saikuro/metric.rb", "lib/metric_fu/metrics/saikuro/parsing_element.rb", "lib/metric_fu/metrics/saikuro/report.html.erb", "lib/metric_fu/metrics/saikuro/scratch_file.rb", "lib/metric_fu/metrics/stats/generator.rb", "lib/metric_fu/metrics/stats/grapher.rb", "lib/metric_fu/metrics/stats/hotspot.rb", "lib/metric_fu/metrics/stats/metric.rb", "lib/metric_fu/metrics/stats/report.html.erb", "lib/metric_fu/reporter.rb", "lib/metric_fu/reporting/graphs/graph.rb", "lib/metric_fu/reporting/graphs/grapher.rb", "lib/metric_fu/reporting/result.rb", "lib/metric_fu/run.rb", "lib/metric_fu/tasks/metric_fu.rake", "lib/metric_fu/templates/_graph.html.erb", "lib/metric_fu/templates/_report_footer.html.erb", "lib/metric_fu/templates/configuration.rb", "lib/metric_fu/templates/css/bluff.css", "lib/metric_fu/templates/css/buttons.css", "lib/metric_fu/templates/css/default.css", "lib/metric_fu/templates/css/integrity.css", "lib/metric_fu/templates/css/rcov.css", "lib/metric_fu/templates/css/reset.css", "lib/metric_fu/templates/css/syntax.css", "lib/metric_fu/templates/index.html.erb", "lib/metric_fu/templates/javascripts/bluff-min.js", "lib/metric_fu/templates/javascripts/bluff_graph.js", "lib/metric_fu/templates/javascripts/excanvas.js", "lib/metric_fu/templates/javascripts/highcharts.js", "lib/metric_fu/templates/javascripts/highcharts_graph.js", "lib/metric_fu/templates/javascripts/js-class.js", "lib/metric_fu/templates/javascripts/standalone-framework.js", "lib/metric_fu/templates/javascripts/utils.js", "lib/metric_fu/templates/layout.html.erb", "lib/metric_fu/templates/metrics_template.rb", "lib/metric_fu/templates/report.html.erb", "lib/metric_fu/templates/report.rb", "lib/metric_fu/templates/template.rb", "lib/metric_fu/utility.rb", "lib/metric_fu/version.rb", "metric_fu.gemspec", "spec/capture_warnings.rb", "spec/cli/helper_spec.rb", "spec/dummy/.gitignore", "spec/dummy/.gitkeep", "spec/dummy/.metrics", "spec/dummy/lib/.gitkeep", "spec/dummy/lib/bad_encoding.rb", "spec/dummy/spec/.gitkeep", "spec/fixtures/20090630.yml", "spec/fixtures/coverage-153.rb", "spec/fixtures/coverage.rb", "spec/fixtures/exit0.sh", "spec/fixtures/exit1.sh", "spec/fixtures/hotspots/flog.yml", "spec/fixtures/hotspots/generator.yml", "spec/fixtures/hotspots/generator_analysis.yml", "spec/fixtures/hotspots/reek.yml", "spec/fixtures/hotspots/roodi.yml", "spec/fixtures/hotspots/saikuro.yml", "spec/fixtures/hotspots/several_metrics.yml", "spec/fixtures/hotspots/stats.yml", "spec/fixtures/hotspots/three_metrics_on_same_file.yml", "spec/fixtures/line_numbers/foo.rb", "spec/fixtures/line_numbers/module.rb", "spec/fixtures/line_numbers/module_surrounds_class.rb", "spec/fixtures/line_numbers/two_classes.rb", "spec/fixtures/metric_missing.yml", "spec/fixtures/rcov_output.txt", "spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html", "spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html", "spec/fixtures/saikuro/index_cyclo.html", "spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html", "spec/metric_fu/calculate_spec.rb", "spec/metric_fu/configuration_spec.rb", "spec/metric_fu/data_structures/line_numbers_spec.rb", "spec/metric_fu/data_structures/location_spec.rb", "spec/metric_fu/formatter/configuration_spec.rb", "spec/metric_fu/formatter/html_spec.rb", "spec/metric_fu/formatter/yaml_spec.rb", "spec/metric_fu/formatter_spec.rb", "spec/metric_fu/gem_version_spec.rb", "spec/metric_fu/generator_spec.rb", "spec/metric_fu/loader_spec.rb", "spec/metric_fu/metric_spec.rb", "spec/metric_fu/metrics/cane/configuration_spec.rb", "spec/metric_fu/metrics/cane/generator_spec.rb", "spec/metric_fu/metrics/churn/configuration_spec.rb", "spec/metric_fu/metrics/churn/generator_spec.rb", "spec/metric_fu/metrics/flay/configuration_spec.rb", "spec/metric_fu/metrics/flay/generator_spec.rb", "spec/metric_fu/metrics/flay/grapher_spec.rb", "spec/metric_fu/metrics/flog/configuration_spec.rb", "spec/metric_fu/metrics/flog/generator_spec.rb", "spec/metric_fu/metrics/flog/grapher_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/table_spec.rb", "spec/metric_fu/metrics/hotspots/generator_spec.rb", "spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb", "spec/metric_fu/metrics/hotspots/hotspot_spec.rb", "spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb", "spec/metric_fu/metrics/rails_best_practices/generator_spec.rb", "spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb", "spec/metric_fu/metrics/rcov/configuration_spec.rb", "spec/metric_fu/metrics/rcov/generator_spec.rb", "spec/metric_fu/metrics/rcov/grapher_spec.rb", "spec/metric_fu/metrics/rcov/hotspot_spec.rb", "spec/metric_fu/metrics/rcov/rcov_line_spec.rb", "spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb", "spec/metric_fu/metrics/reek/configuration_spec.rb", "spec/metric_fu/metrics/reek/generator_spec.rb", "spec/metric_fu/metrics/reek/grapher_spec.rb", "spec/metric_fu/metrics/roodi/configuration_spec.rb", "spec/metric_fu/metrics/roodi/generator_spec.rb", "spec/metric_fu/metrics/roodi/grapher_spec.rb", "spec/metric_fu/metrics/saikuro/configuration_spec.rb", "spec/metric_fu/metrics/saikuro/generator_spec.rb", "spec/metric_fu/metrics/stats/generator_spec.rb", "spec/metric_fu/metrics/stats/grapher_spec.rb", "spec/metric_fu/reporter_spec.rb", "spec/metric_fu/reporting/graphs/graph_spec.rb", "spec/metric_fu/reporting/graphs/grapher_spec.rb", "spec/metric_fu/reporting/result_spec.rb", "spec/metric_fu/run_spec.rb", "spec/metric_fu/templates/configuration_spec.rb", "spec/metric_fu/templates/metrics_template_spec.rb", "spec/metric_fu/templates/report_spec.rb", "spec/metric_fu/templates/template_spec.rb", "spec/metric_fu/utility_spec.rb", "spec/metric_fu_spec.rb", "spec/quality_spec.rb", "spec/shared/configured.rb", "spec/shared/test_coverage.rb", "spec/spec_helper.rb", "spec/support/deferred_garbaged_collection.rb", "spec/support/helper_methods.rb", "spec/support/matcher_create_file.rb", "spec/support/matcher_create_files.rb", "spec/support/suite.rb", "spec/support/test_fixtures.rb", "spec/support/timeout.rb", "spec/support/usage_test.rb", "spec/usage_test_spec.rb"]
  s.homepage = "https://github.com/metricfu/metric_fu"
  s.licenses = ["MIT"]
  s.rdoc_options = ["--main", "README.md"]
  s.required_ruby_version = Gem::Requirement.new(">= 1.9.0")
  s.rubyforge_project = "metric_fu"
  s.rubygems_version = "2.5.1"
  s.summary = "A fistful of code metrics, with awesome templates and graphs"
  s.test_files = ["spec/capture_warnings.rb", "spec/cli/helper_spec.rb", "spec/dummy/.gitignore", "spec/dummy/.gitkeep", "spec/dummy/.metrics", "spec/dummy/lib/.gitkeep", "spec/dummy/lib/bad_encoding.rb", "spec/dummy/spec/.gitkeep", "spec/fixtures/20090630.yml", "spec/fixtures/coverage-153.rb", "spec/fixtures/coverage.rb", "spec/fixtures/exit0.sh", "spec/fixtures/exit1.sh", "spec/fixtures/hotspots/flog.yml", "spec/fixtures/hotspots/generator.yml", "spec/fixtures/hotspots/generator_analysis.yml", "spec/fixtures/hotspots/reek.yml", "spec/fixtures/hotspots/roodi.yml", "spec/fixtures/hotspots/saikuro.yml", "spec/fixtures/hotspots/several_metrics.yml", "spec/fixtures/hotspots/stats.yml", "spec/fixtures/hotspots/three_metrics_on_same_file.yml", "spec/fixtures/line_numbers/foo.rb", "spec/fixtures/line_numbers/module.rb", "spec/fixtures/line_numbers/module_surrounds_class.rb", "spec/fixtures/line_numbers/two_classes.rb", "spec/fixtures/metric_missing.yml", "spec/fixtures/rcov_output.txt", "spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html", "spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html", "spec/fixtures/saikuro/index_cyclo.html", "spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html", "spec/metric_fu/calculate_spec.rb", "spec/metric_fu/configuration_spec.rb", "spec/metric_fu/data_structures/line_numbers_spec.rb", "spec/metric_fu/data_structures/location_spec.rb", "spec/metric_fu/formatter/configuration_spec.rb", "spec/metric_fu/formatter/html_spec.rb", "spec/metric_fu/formatter/yaml_spec.rb", "spec/metric_fu/formatter_spec.rb", "spec/metric_fu/gem_version_spec.rb", "spec/metric_fu/generator_spec.rb", "spec/metric_fu/loader_spec.rb", "spec/metric_fu/metric_spec.rb", "spec/metric_fu/metrics/cane/configuration_spec.rb", "spec/metric_fu/metrics/cane/generator_spec.rb", "spec/metric_fu/metrics/churn/configuration_spec.rb", "spec/metric_fu/metrics/churn/generator_spec.rb", "spec/metric_fu/metrics/flay/configuration_spec.rb", "spec/metric_fu/metrics/flay/generator_spec.rb", "spec/metric_fu/metrics/flay/grapher_spec.rb", "spec/metric_fu/metrics/flog/configuration_spec.rb", "spec/metric_fu/metrics/flog/generator_spec.rb", "spec/metric_fu/metrics/flog/grapher_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb", "spec/metric_fu/metrics/hotspots/analysis/table_spec.rb", "spec/metric_fu/metrics/hotspots/generator_spec.rb", "spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb", "spec/metric_fu/metrics/hotspots/hotspot_spec.rb", "spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb", "spec/metric_fu/metrics/rails_best_practices/generator_spec.rb", "spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb", "spec/metric_fu/metrics/rcov/configuration_spec.rb", "spec/metric_fu/metrics/rcov/generator_spec.rb", "spec/metric_fu/metrics/rcov/grapher_spec.rb", "spec/metric_fu/metrics/rcov/hotspot_spec.rb", "spec/metric_fu/metrics/rcov/rcov_line_spec.rb", "spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb", "spec/metric_fu/metrics/reek/configuration_spec.rb", "spec/metric_fu/metrics/reek/generator_spec.rb", "spec/metric_fu/metrics/reek/grapher_spec.rb", "spec/metric_fu/metrics/roodi/configuration_spec.rb", "spec/metric_fu/metrics/roodi/generator_spec.rb", "spec/metric_fu/metrics/roodi/grapher_spec.rb", "spec/metric_fu/metrics/saikuro/configuration_spec.rb", "spec/metric_fu/metrics/saikuro/generator_spec.rb", "spec/metric_fu/metrics/stats/generator_spec.rb", "spec/metric_fu/metrics/stats/grapher_spec.rb", "spec/metric_fu/reporter_spec.rb", "spec/metric_fu/reporting/graphs/graph_spec.rb", "spec/metric_fu/reporting/graphs/grapher_spec.rb", "spec/metric_fu/reporting/result_spec.rb", "spec/metric_fu/run_spec.rb", "spec/metric_fu/templates/configuration_spec.rb", "spec/metric_fu/templates/metrics_template_spec.rb", "spec/metric_fu/templates/report_spec.rb", "spec/metric_fu/templates/template_spec.rb", "spec/metric_fu/utility_spec.rb", "spec/metric_fu_spec.rb", "spec/quality_spec.rb", "spec/shared/configured.rb", "spec/shared/test_coverage.rb", "spec/spec_helper.rb", "spec/support/deferred_garbaged_collection.rb", "spec/support/helper_methods.rb", "spec/support/matcher_create_file.rb", "spec/support/matcher_create_files.rb", "spec/support/suite.rb", "spec/support/test_fixtures.rb", "spec/support/timeout.rb", "spec/support/usage_test.rb", "spec/usage_test_spec.rb"]

  if s.respond_to? :specification_version then
    s.specification_version = 4

    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
      s.add_runtime_dependency(%q<flay>, [">= 2.0.1", "~> 2.1"])
      s.add_runtime_dependency(%q<churn>, ["~> 0.0.35"])
      s.add_runtime_dependency(%q<flog>, [">= 4.1.1", "~> 4.1"])
      s.add_runtime_dependency(%q<reek>, ["< 3.0", ">= 1.3.4"])
      s.add_runtime_dependency(%q<cane>, [">= 2.5.2", "~> 2.5"])
      s.add_runtime_dependency(%q<rails_best_practices>, [">= 1.14.3", "~> 1.14"])
      s.add_runtime_dependency(%q<metric_fu-Saikuro>, [">= 1.1.3", "~> 1.1"])
      s.add_runtime_dependency(%q<roodi>, ["~> 5.0.0"])
      s.add_runtime_dependency(%q<code_metrics>, ["~> 0.1"])
      s.add_runtime_dependency(%q<redcard>, [">= 0"])
      s.add_runtime_dependency(%q<coderay>, [">= 0"])
      s.add_runtime_dependency(%q<multi_json>, [">= 0"])
      s.add_runtime_dependency(%q<launchy>, ["~> 2.0"])
      s.add_development_dependency(%q<rspec>, ["~> 3.1"])
      s.add_development_dependency(%q<test_construct>, [">= 0"])
      s.add_development_dependency(%q<json>, [">= 0"])
      s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
    else
      s.add_dependency(%q<flay>, [">= 2.0.1", "~> 2.1"])
      s.add_dependency(%q<churn>, ["~> 0.0.35"])
      s.add_dependency(%q<flog>, [">= 4.1.1", "~> 4.1"])
      s.add_dependency(%q<reek>, ["< 3.0", ">= 1.3.4"])
      s.add_dependency(%q<cane>, [">= 2.5.2", "~> 2.5"])
      s.add_dependency(%q<rails_best_practices>, [">= 1.14.3", "~> 1.14"])
      s.add_dependency(%q<metric_fu-Saikuro>, [">= 1.1.3", "~> 1.1"])
      s.add_dependency(%q<roodi>, ["~> 5.0.0"])
      s.add_dependency(%q<code_metrics>, ["~> 0.1"])
      s.add_dependency(%q<redcard>, [">= 0"])
      s.add_dependency(%q<coderay>, [">= 0"])
      s.add_dependency(%q<multi_json>, [">= 0"])
      s.add_dependency(%q<launchy>, ["~> 2.0"])
      s.add_dependency(%q<rspec>, ["~> 3.1"])
      s.add_dependency(%q<test_construct>, [">= 0"])
      s.add_dependency(%q<json>, [">= 0"])
      s.add_dependency(%q<simplecov>, ["~> 0.9"])
    end
  else
    s.add_dependency(%q<flay>, [">= 2.0.1", "~> 2.1"])
    s.add_dependency(%q<churn>, ["~> 0.0.35"])
    s.add_dependency(%q<flog>, [">= 4.1.1", "~> 4.1"])
    s.add_dependency(%q<reek>, ["< 3.0", ">= 1.3.4"])
    s.add_dependency(%q<cane>, [">= 2.5.2", "~> 2.5"])
    s.add_dependency(%q<rails_best_practices>, [">= 1.14.3", "~> 1.14"])
    s.add_dependency(%q<metric_fu-Saikuro>, [">= 1.1.3", "~> 1.1"])
    s.add_dependency(%q<roodi>, ["~> 5.0.0"])
    s.add_dependency(%q<code_metrics>, ["~> 0.1"])
    s.add_dependency(%q<redcard>, [">= 0"])
    s.add_dependency(%q<coderay>, [">= 0"])
    s.add_dependency(%q<multi_json>, [">= 0"])
    s.add_dependency(%q<launchy>, ["~> 2.0"])
    s.add_dependency(%q<rspec>, ["~> 3.1"])
    s.add_dependency(%q<test_construct>, [">= 0"])
    s.add_dependency(%q<json>, [">= 0"])
    s.add_dependency(%q<simplecov>, ["~> 0.9"])
  end
end
phylor commented 7 years ago

@bf4 Any news? Do you want to support Ruby 2.2?

bergholdt commented 7 years ago

Hi @phylor

I tried reproduce the error using your guide above, but my Ruby 2.2 does not result in every string having .freeze present.

➜  metric-fu-test git:(ruby2.2) ✗ ruby -v                                              
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin16]
➜  metric-fu-test git:(ruby2.2) ✗ cat $(bundle show metric_fu)/metric_fu.gemspec       
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "metric_fu/version"

Gem::Specification.new do |s|
  s.name        = "metric_fu"
  s.homepage    = "https://github.com/metricfu/metric_fu"
  s.summary     = "A fistful of code metrics, with awesome templates and graphs"
  s.description = "Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)"
  s.email       = "github@benjaminfleischer.com"
  author_file   = File.expand_path("AUTHORS", File.dirname(__FILE__))
  s.authors     = File.readlines(author_file, encoding: Encoding::UTF_8).map(&:strip)

  # used with gem i metric_fu -P HighSecurity
  s.cert_chain  = ["certs/bf4.pem"]
  # Sign gem when evaluating spec with `gem` command
  #  unless ENV has set a SKIP_GEM_SIGNING
  if ($0 =~ /gem\z/) and not ENV.include?("SKIP_GEM_SIGNING")
    s.signing_key = File.join(Gem.user_home, ".ssh", "gem-private_key.pem")
  end

  s.rubyforge_project           = "metric_fu"
  s.license                     = "MIT"
...

Could you have some global settings on your Ruby 2.2 that force frozen_string_literal, not that I have been able to find an option like that.

What happen if you make a fresh install of ex 2.2.6 - does that also result in .freeze?

bergholdt commented 7 years ago

Hi @phylor

I have setup a travis build on an empty rails 5 app and this actually resulted in the same error you reported.

https://travis-ci.org/bergholdt/metric-fu-test/builds/207499291

"Funny" thing is that .frozen was present on 2.3.3 and not 2.2.6 ... Wish I could reproduce this locally though.

bergholdt commented 7 years ago

Hi again 😊

Notices that the gem --version was not identical on the two travis builds.

So made a new build using latest ruby gem (version 2.6.10) and this introduced .freeze

https://travis-ci.org/bergholdt/metric-fu-test/builds/207502824

bergholdt commented 7 years ago

@bf4 think we need @phylor regex fix to support rubygems >= 2.6

https://github.com/rubygems/rubygems/blob/73ffc455b80394a491a51d6157a36f839de3e228/History.txt#L186

Build using this PR https://travis-ci.org/bergholdt/metric-fu-test/builds/207510157 Successful 🥇

phylor commented 7 years ago

@bergholdt Sorry for the slow response, but thank you very much for the investigation and resolution!

jkeam commented 7 years ago

👍