fastruby-metric_fu 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +28 -0
- data/.metrics +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +69 -0
- data/.simplecov +74 -0
- data/.travis.yml +18 -0
- data/.yardopts +4 -0
- data/AUTHORS +12 -0
- data/CONTRIBUTING.md +47 -0
- data/CONTRIBUTORS +76 -0
- data/DEV.md +76 -0
- data/Gemfile +58 -0
- data/Guardfile +30 -0
- data/HISTORY.md +705 -0
- data/MIT-LICENSE +22 -0
- data/README.md +299 -0
- data/Rakefile +27 -0
- data/TODO.md +118 -0
- data/appveyor.yml +29 -0
- data/bin/metric_fu +9 -0
- data/bin/mf-cane +10 -0
- data/bin/mf-churn +10 -0
- data/bin/mf-flay +10 -0
- data/bin/mf-reek +10 -0
- data/bin/mf-roodi +10 -0
- data/bin/mf-saikuro +10 -0
- data/certs/bf4.pem +22 -0
- data/checksum/.gitkeep +0 -0
- data/checksum/metric_fu-4.10.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.11.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.11.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.11.2.gem.sha512 +1 -0
- data/checksum/metric_fu-4.11.3.gem.sha512 +1 -0
- data/checksum/metric_fu-4.11.4.gem.sha512 +1 -0
- data/checksum/metric_fu-4.12.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.2.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.2.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.3.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.3.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.4.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.4.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.4.2.gem.sha512 +1 -0
- data/checksum/metric_fu-4.4.3.gem.sha512 +1 -0
- data/checksum/metric_fu-4.4.4.gem.sha512 +1 -0
- data/checksum/metric_fu-4.5.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.5.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.5.2.gem.sha512 +1 -0
- data/checksum/metric_fu-4.6.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.7.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.7.1.gem.sha512 +1 -0
- data/checksum/metric_fu-4.7.2.gem.sha512 +1 -0
- data/checksum/metric_fu-4.7.3.gem.sha512 +1 -0
- data/checksum/metric_fu-4.7.4.gem.sha512 +1 -0
- data/checksum/metric_fu-4.8.0.gem.sha512 +1 -0
- data/checksum/metric_fu-4.9.0.gem.sha512 +1 -0
- data/config/roodi_config.yml +22 -0
- data/config/rubocop.yml +269 -0
- data/gem_tasks/build.rake +197 -0
- data/gem_tasks/rubocop.rake +10 -0
- data/gem_tasks/usage_test.rake +19 -0
- data/gem_tasks/yard.rake +24 -0
- data/lib/metric_fu.rb +151 -0
- data/lib/metric_fu/calculate.rb +10 -0
- data/lib/metric_fu/cli/client.rb +26 -0
- data/lib/metric_fu/cli/helper.rb +80 -0
- data/lib/metric_fu/cli/parser.rb +138 -0
- data/lib/metric_fu/configuration.rb +150 -0
- data/lib/metric_fu/constantize.rb +57 -0
- data/lib/metric_fu/data_structures/line_numbers.rb +112 -0
- data/lib/metric_fu/data_structures/location.rb +110 -0
- data/lib/metric_fu/data_structures/sexp_node.rb +107 -0
- data/lib/metric_fu/environment.rb +129 -0
- data/lib/metric_fu/errors/analysis_error.rb +4 -0
- data/lib/metric_fu/formatter.rb +40 -0
- data/lib/metric_fu/formatter/html.rb +96 -0
- data/lib/metric_fu/formatter/syntax.rb +45 -0
- data/lib/metric_fu/formatter/yaml.rb +18 -0
- data/lib/metric_fu/gem_run.rb +70 -0
- data/lib/metric_fu/gem_version.rb +92 -0
- data/lib/metric_fu/generator.rb +135 -0
- data/lib/metric_fu/io.rb +132 -0
- data/lib/metric_fu/loader.rb +105 -0
- data/lib/metric_fu/logger.rb +62 -0
- data/lib/metric_fu/logging/mf_debugger.rb +23 -0
- data/lib/metric_fu/metric.rb +143 -0
- data/lib/metric_fu/metrics/cane/generator.rb +95 -0
- data/lib/metric_fu/metrics/cane/grapher.rb +37 -0
- data/lib/metric_fu/metrics/cane/metric.rb +34 -0
- data/lib/metric_fu/metrics/cane/report.html.erb +87 -0
- data/lib/metric_fu/metrics/cane/violations.rb +46 -0
- data/lib/metric_fu/metrics/churn/generator.rb +37 -0
- data/lib/metric_fu/metrics/churn/hotspot.rb +43 -0
- data/lib/metric_fu/metrics/churn/metric.rb +29 -0
- data/lib/metric_fu/metrics/churn/report.html.erb +58 -0
- data/lib/metric_fu/metrics/flay/generator.rb +51 -0
- data/lib/metric_fu/metrics/flay/grapher.rb +37 -0
- data/lib/metric_fu/metrics/flay/hotspot.rb +52 -0
- data/lib/metric_fu/metrics/flay/metric.rb +28 -0
- data/lib/metric_fu/metrics/flay/report.html.erb +29 -0
- data/lib/metric_fu/metrics/flog/generator.rb +113 -0
- data/lib/metric_fu/metrics/flog/grapher.rb +77 -0
- data/lib/metric_fu/metrics/flog/hotspot.rb +46 -0
- data/lib/metric_fu/metrics/flog/metric.rb +29 -0
- data/lib/metric_fu/metrics/flog/report.html.erb +50 -0
- data/lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb +34 -0
- data/lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb +114 -0
- data/lib/metric_fu/metrics/hotspots/analysis/grouping.rb +23 -0
- data/lib/metric_fu/metrics/hotspots/analysis/groupings.rb +12 -0
- data/lib/metric_fu/metrics/hotspots/analysis/problems.rb +20 -0
- data/lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb +70 -0
- data/lib/metric_fu/metrics/hotspots/analysis/ranking.rb +29 -0
- data/lib/metric_fu/metrics/hotspots/analysis/rankings.rb +91 -0
- data/lib/metric_fu/metrics/hotspots/analysis/record.rb +32 -0
- data/lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb +24 -0
- data/lib/metric_fu/metrics/hotspots/analysis/table.rb +67 -0
- data/lib/metric_fu/metrics/hotspots/generator.rb +40 -0
- data/lib/metric_fu/metrics/hotspots/hotspot.rb +87 -0
- data/lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb +61 -0
- data/lib/metric_fu/metrics/hotspots/metric.rb +20 -0
- data/lib/metric_fu/metrics/hotspots/report.html.erb +60 -0
- data/lib/metric_fu/metrics/rails_best_practices/generator.rb +47 -0
- data/lib/metric_fu/metrics/rails_best_practices/grapher.rb +38 -0
- data/lib/metric_fu/metrics/rails_best_practices/metric.rb +31 -0
- data/lib/metric_fu/metrics/rails_best_practices/report.html.erb +22 -0
- data/lib/metric_fu/metrics/rcov/external_client.rb +22 -0
- data/lib/metric_fu/metrics/rcov/generator.rb +75 -0
- data/lib/metric_fu/metrics/rcov/grapher.rb +37 -0
- data/lib/metric_fu/metrics/rcov/hotspot.rb +46 -0
- data/lib/metric_fu/metrics/rcov/metric.rb +61 -0
- data/lib/metric_fu/metrics/rcov/rcov_format_coverage.rb +149 -0
- data/lib/metric_fu/metrics/rcov/rcov_line.rb +48 -0
- data/lib/metric_fu/metrics/rcov/report.html.erb +40 -0
- data/lib/metric_fu/metrics/rcov/simplecov_formatter.rb +74 -0
- data/lib/metric_fu/metrics/reek/generator.rb +94 -0
- data/lib/metric_fu/metrics/reek/grapher.rb +55 -0
- data/lib/metric_fu/metrics/reek/hotspot.rb +95 -0
- data/lib/metric_fu/metrics/reek/metric.rb +26 -0
- data/lib/metric_fu/metrics/reek/report.html.erb +35 -0
- data/lib/metric_fu/metrics/roodi/generator.rb +40 -0
- data/lib/metric_fu/metrics/roodi/grapher.rb +37 -0
- data/lib/metric_fu/metrics/roodi/hotspot.rb +39 -0
- data/lib/metric_fu/metrics/roodi/metric.rb +24 -0
- data/lib/metric_fu/metrics/roodi/report.html.erb +22 -0
- data/lib/metric_fu/metrics/saikuro/generator.rb +145 -0
- data/lib/metric_fu/metrics/saikuro/hotspot.rb +51 -0
- data/lib/metric_fu/metrics/saikuro/metric.rb +31 -0
- data/lib/metric_fu/metrics/saikuro/parsing_element.rb +37 -0
- data/lib/metric_fu/metrics/saikuro/report.html.erb +71 -0
- data/lib/metric_fu/metrics/saikuro/scratch_file.rb +108 -0
- data/lib/metric_fu/metrics/stats/generator.rb +82 -0
- data/lib/metric_fu/metrics/stats/grapher.rb +40 -0
- data/lib/metric_fu/metrics/stats/hotspot.rb +35 -0
- data/lib/metric_fu/metrics/stats/metric.rb +28 -0
- data/lib/metric_fu/metrics/stats/report.html.erb +44 -0
- data/lib/metric_fu/reporter.rb +37 -0
- data/lib/metric_fu/reporting/graphs/graph.rb +69 -0
- data/lib/metric_fu/reporting/graphs/grapher.rb +66 -0
- data/lib/metric_fu/reporting/result.rb +59 -0
- data/lib/metric_fu/run.rb +82 -0
- data/lib/metric_fu/tasks/metric_fu.rake +54 -0
- data/lib/metric_fu/templates/_graph.html.erb +2 -0
- data/lib/metric_fu/templates/_report_footer.html.erb +1 -0
- data/lib/metric_fu/templates/configuration.rb +25 -0
- data/lib/metric_fu/templates/css/bluff.css +15 -0
- data/lib/metric_fu/templates/css/buttons.css +82 -0
- data/lib/metric_fu/templates/css/default.css +43 -0
- data/lib/metric_fu/templates/css/integrity.css +337 -0
- data/lib/metric_fu/templates/css/rcov.css +32 -0
- data/lib/metric_fu/templates/css/reset.css +7 -0
- data/lib/metric_fu/templates/css/syntax.css +19 -0
- data/lib/metric_fu/templates/index.html.erb +10 -0
- data/lib/metric_fu/templates/javascripts/bluff-min.js +1 -0
- data/lib/metric_fu/templates/javascripts/bluff_graph.js +15 -0
- data/lib/metric_fu/templates/javascripts/excanvas.js +35 -0
- data/lib/metric_fu/templates/javascripts/highcharts.js +294 -0
- data/lib/metric_fu/templates/javascripts/highcharts_graph.js +38 -0
- data/lib/metric_fu/templates/javascripts/js-class.js +1 -0
- data/lib/metric_fu/templates/javascripts/standalone-framework.js +17 -0
- data/lib/metric_fu/templates/javascripts/utils.js +9 -0
- data/lib/metric_fu/templates/layout.html.erb +37 -0
- data/lib/metric_fu/templates/metrics_template.rb +80 -0
- data/lib/metric_fu/templates/report.html.erb +31 -0
- data/lib/metric_fu/templates/report.rb +41 -0
- data/lib/metric_fu/templates/template.rb +244 -0
- data/lib/metric_fu/utility.rb +79 -0
- data/lib/metric_fu/version.rb +9 -0
- data/metric_fu.gemspec +71 -0
- data/spec/capture_warnings.rb +55 -0
- data/spec/cli/helper_spec.rb +165 -0
- data/spec/dummy/.gitignore +1 -0
- data/spec/dummy/.gitkeep +0 -0
- data/spec/dummy/lib/.gitkeep +0 -0
- data/spec/dummy/lib/bad_encoding.rb +6 -0
- data/spec/dummy/spec/.gitkeep +0 -0
- data/spec/fixtures/20090630.yml +7922 -0
- data/spec/fixtures/coverage-153.rb +11 -0
- data/spec/fixtures/coverage.rb +13 -0
- data/spec/fixtures/exit0.sh +3 -0
- data/spec/fixtures/exit1.sh +3 -0
- data/spec/fixtures/hotspots/flog.yml +86 -0
- data/spec/fixtures/hotspots/generator.yml +47 -0
- data/spec/fixtures/hotspots/generator_analysis.yml +53 -0
- data/spec/fixtures/hotspots/reek.yml +14 -0
- data/spec/fixtures/hotspots/roodi.yml +13 -0
- data/spec/fixtures/hotspots/saikuro.yml +27 -0
- data/spec/fixtures/hotspots/several_metrics.yml +47 -0
- data/spec/fixtures/hotspots/stats.yml +4 -0
- data/spec/fixtures/hotspots/three_metrics_on_same_file.yml +36 -0
- data/spec/fixtures/line_numbers/foo.rb +33 -0
- data/spec/fixtures/line_numbers/module.rb +11 -0
- data/spec/fixtures/line_numbers/module_surrounds_class.rb +15 -0
- data/spec/fixtures/line_numbers/two_classes.rb +11 -0
- data/spec/fixtures/metric_missing.yml +1 -0
- data/spec/fixtures/rcov_output.txt +135 -0
- data/spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
- data/spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
- data/spec/fixtures/saikuro/index_cyclo.html +155 -0
- data/spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html +11 -0
- data/spec/metric_fu/calculate_spec.rb +21 -0
- data/spec/metric_fu/configuration_spec.rb +90 -0
- data/spec/metric_fu/data_structures/line_numbers_spec.rb +63 -0
- data/spec/metric_fu/data_structures/location_spec.rb +110 -0
- data/spec/metric_fu/formatter/configuration_spec.rb +44 -0
- data/spec/metric_fu/formatter/html_spec.rb +138 -0
- data/spec/metric_fu/formatter/yaml_spec.rb +61 -0
- data/spec/metric_fu/formatter_spec.rb +49 -0
- data/spec/metric_fu/gem_version_spec.rb +12 -0
- data/spec/metric_fu/generator_spec.rb +130 -0
- data/spec/metric_fu/loader_spec.rb +13 -0
- data/spec/metric_fu/metric_spec.rb +46 -0
- data/spec/metric_fu/metrics/cane/configuration_spec.rb +22 -0
- data/spec/metric_fu/metrics/cane/generator_spec.rb +184 -0
- data/spec/metric_fu/metrics/churn/configuration_spec.rb +13 -0
- data/spec/metric_fu/metrics/churn/generator_spec.rb +64 -0
- data/spec/metric_fu/metrics/flay/configuration_spec.rb +13 -0
- data/spec/metric_fu/metrics/flay/generator_spec.rb +105 -0
- data/spec/metric_fu/metrics/flay/grapher_spec.rb +57 -0
- data/spec/metric_fu/metrics/flog/configuration_spec.rb +18 -0
- data/spec/metric_fu/metrics/flog/generator_spec.rb +77 -0
- data/spec/metric_fu/metrics/flog/grapher_spec.rb +107 -0
- data/spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb +104 -0
- data/spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb +71 -0
- data/spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb +30 -0
- data/spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb +97 -0
- data/spec/metric_fu/metrics/hotspots/analysis/table_spec.rb +6 -0
- data/spec/metric_fu/metrics/hotspots/generator_spec.rb +46 -0
- data/spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb +10 -0
- data/spec/metric_fu/metrics/hotspots/hotspot_spec.rb +16 -0
- data/spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb +55 -0
- data/spec/metric_fu/metrics/rails_best_practices/generator_spec.rb +33 -0
- data/spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb +62 -0
- data/spec/metric_fu/metrics/rcov/configuration_spec.rb +28 -0
- data/spec/metric_fu/metrics/rcov/generator_spec.rb +22 -0
- data/spec/metric_fu/metrics/rcov/grapher_spec.rb +57 -0
- data/spec/metric_fu/metrics/rcov/hotspot_spec.rb +20 -0
- data/spec/metric_fu/metrics/rcov/rcov_line_spec.rb +89 -0
- data/spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb +67 -0
- data/spec/metric_fu/metrics/reek/configuration_spec.rb +13 -0
- data/spec/metric_fu/metrics/reek/generator_spec.rb +203 -0
- data/spec/metric_fu/metrics/reek/grapher_spec.rb +66 -0
- data/spec/metric_fu/metrics/roodi/configuration_spec.rb +14 -0
- data/spec/metric_fu/metrics/roodi/generator_spec.rb +82 -0
- data/spec/metric_fu/metrics/roodi/grapher_spec.rb +57 -0
- data/spec/metric_fu/metrics/saikuro/configuration_spec.rb +25 -0
- data/spec/metric_fu/metrics/saikuro/generator_spec.rb +71 -0
- data/spec/metric_fu/metrics/stats/generator_spec.rb +96 -0
- data/spec/metric_fu/metrics/stats/grapher_spec.rb +69 -0
- data/spec/metric_fu/reporter_spec.rb +41 -0
- data/spec/metric_fu/reporting/graphs/graph_spec.rb +44 -0
- data/spec/metric_fu/reporting/graphs/grapher_spec.rb +24 -0
- data/spec/metric_fu/reporting/result_spec.rb +50 -0
- data/spec/metric_fu/run_spec.rb +197 -0
- data/spec/metric_fu/templates/configuration_spec.rb +51 -0
- data/spec/metric_fu/templates/metrics_template_spec.rb +11 -0
- data/spec/metric_fu/templates/report_spec.rb +15 -0
- data/spec/metric_fu/templates/template_spec.rb +233 -0
- data/spec/metric_fu/utility_spec.rb +12 -0
- data/spec/metric_fu_spec.rb +52 -0
- data/spec/quality_spec.rb +114 -0
- data/spec/shared/configured.rb +45 -0
- data/spec/shared/test_coverage.rb +95 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/.metrics +4 -0
- data/spec/support/deferred_garbaged_collection.rb +33 -0
- data/spec/support/helper_methods.rb +32 -0
- data/spec/support/matcher_create_file.rb +37 -0
- data/spec/support/matcher_create_files.rb +43 -0
- data/spec/support/samples/reek/alfa.rb +1 -0
- data/spec/support/suite.rb +26 -0
- data/spec/support/test_fixtures.rb +37 -0
- data/spec/support/timeout.rb +7 -0
- data/spec/support/usage_test.rb +150 -0
- data/spec/usage_test_spec.rb +93 -0
- metadata +735 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'digest/sha2'
|
|
4
|
+
require 'rake/tasklib'
|
|
5
|
+
# require 'bundler/gem_helper'
|
|
6
|
+
# Bundler::GemHelper.install_tasks
|
|
7
|
+
|
|
8
|
+
# Based on https://github.com/bundler/bundler/blob/ec0621d/lib/bundler/gem_helpers.rb
|
|
9
|
+
GEM_TASKS = Class.new(Rake::TaskLib) do
|
|
10
|
+
include Rake::DSL if defined? Rake::DSL
|
|
11
|
+
attr_reader :base
|
|
12
|
+
def initialize
|
|
13
|
+
@base = File.expand_path('../..', __FILE__)
|
|
14
|
+
@gemspec_path = File.join(base, 'metric_fu.gemspec')
|
|
15
|
+
@gemspec = Gem::Specification.load(@gemspec_path)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def install
|
|
19
|
+
built_gem_path = nil
|
|
20
|
+
|
|
21
|
+
desc "Build #{built_gem_name} into the pkg directory."
|
|
22
|
+
task 'build' do
|
|
23
|
+
built_gem_path = build_gem
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc "Build and install #{built_gem_name} into system gems."
|
|
27
|
+
task 'install' => 'build' do
|
|
28
|
+
install_gem(built_gem_path)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc 'Creates and commits a SHA512 checksum of the current version built gem'
|
|
32
|
+
task 'checksum' => 'build' do
|
|
33
|
+
add_checksum(built_gem_path)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "Create tag #{version_tag} and build and push #{built_gem_name} to Rubygems"
|
|
37
|
+
task 'release' => 'checksum' do
|
|
38
|
+
release_gem(built_gem_path)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def build_gem
|
|
44
|
+
file_name = nil
|
|
45
|
+
sh("gem build -V '#{@gemspec_path}'") { |out, code|
|
|
46
|
+
file_name = File.basename(built_gem_path)
|
|
47
|
+
FileUtils.mkdir_p(File.join(base, 'pkg'))
|
|
48
|
+
FileUtils.mv(built_gem_path, 'pkg')
|
|
49
|
+
STDOUT.puts "#{name} #{version} built to pkg/#{file_name}."
|
|
50
|
+
}
|
|
51
|
+
File.join(base, 'pkg', file_name)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def install_gem(built_gem_path=nil)
|
|
55
|
+
built_gem_path ||= build_gem
|
|
56
|
+
out, _ = sh_with_code("gem install '#{built_gem_path}' --local")
|
|
57
|
+
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/]
|
|
58
|
+
STDOUT.puts "#{name} (#{version}) installed."
|
|
59
|
+
end
|
|
60
|
+
# Based on https://github.com/YorickPeterse/ruby-lint/blob/3e946/task/checksum.rake
|
|
61
|
+
def add_checksum(built_gem_path=nil)
|
|
62
|
+
guard_clean
|
|
63
|
+
built_gem_path ||= build_gem
|
|
64
|
+
checksum_file = File.join(checksums, checksum_name)
|
|
65
|
+
File.open(checksum_file, 'w') do |handle|
|
|
66
|
+
handle.write(gem_checksum(built_gem_path))
|
|
67
|
+
end
|
|
68
|
+
sh_with_code("git add #{checksum_file} && git commit -m 'Add checksum for #{built_gem_name}'")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def checksums
|
|
72
|
+
File.expand_path('../../checksum', __FILE__)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def checksum_name
|
|
76
|
+
File.basename(built_gem_name) + '.sha512'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def gem_checksum(built_gem_path)
|
|
80
|
+
checksum(File.read(built_gem_path))
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def checksum(content)
|
|
84
|
+
Digest::SHA512.new.hexdigest(content)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def release_gem(built_gem_path=nil)
|
|
88
|
+
guard_clean
|
|
89
|
+
built_gem_path ||= build_gem
|
|
90
|
+
add_checksum(built_gem_path) #unless already hashed?
|
|
91
|
+
tag_version { git_push } unless already_tagged?
|
|
92
|
+
rubygem_push(built_gem_path) if gem_push?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
protected
|
|
96
|
+
|
|
97
|
+
def rubygem_push(path)
|
|
98
|
+
if Pathname.new("~/.gem/credentials").expand_path.exist?
|
|
99
|
+
sh("gem push '#{path}'")
|
|
100
|
+
STDOUT.puts "Pushed #{name} #{version} to rubygems.org."
|
|
101
|
+
else
|
|
102
|
+
raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def built_gem_path
|
|
107
|
+
Dir[File.join(base, "#{name}-*.gem")].sort_by{|f| File.mtime(f)}.last
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def git_push
|
|
111
|
+
perform_git_push
|
|
112
|
+
perform_git_push ' --tags'
|
|
113
|
+
STDOUT.puts "Pushed git commits and tags."
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def perform_git_push(options = '')
|
|
117
|
+
cmd = "git push #{options}"
|
|
118
|
+
out, code = sh_with_code(cmd)
|
|
119
|
+
raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def already_tagged?
|
|
123
|
+
if sh('git tag').split(/\n/).include?(version_tag)
|
|
124
|
+
STDOUT.puts "Tag #{version_tag} has already been created."
|
|
125
|
+
true
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def guard_clean
|
|
130
|
+
clean? && committed? or raise("There are files that need to be committed first.")
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def clean?
|
|
134
|
+
sh_with_code("git diff --exit-code")[1] == 0
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def committed?
|
|
138
|
+
sh_with_code("git diff-index --quiet --cached HEAD")[1] == 0
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def tag_version
|
|
142
|
+
sh "git tag -a -m \"Version #{version}\" #{version_tag}"
|
|
143
|
+
STDOUT.puts "Tagged #{version_tag}."
|
|
144
|
+
yield if block_given?
|
|
145
|
+
rescue
|
|
146
|
+
STDERR.puts "Untagging #{version_tag} due to error."
|
|
147
|
+
sh_with_code "git tag -d #{version_tag}"
|
|
148
|
+
raise
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def version
|
|
152
|
+
@gemspec.version
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def version_tag
|
|
156
|
+
"v#{version}"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def name
|
|
160
|
+
@gemspec.name
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def built_gem_name
|
|
164
|
+
"#{name}-#{version}.gem"
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def sh(cmd, &block)
|
|
168
|
+
out, code = sh_with_code(cmd, &block)
|
|
169
|
+
code == 0 ? out : raise(out.empty? ? "Running `#{cmd}' failed. Run this command directly for more detailed output." : out)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def sh_with_code(cmd, &block)
|
|
173
|
+
cmd << " 2>&1"
|
|
174
|
+
outbuf = ''
|
|
175
|
+
p cmd
|
|
176
|
+
Dir.chdir(base) {
|
|
177
|
+
outbuf = `#{cmd}`
|
|
178
|
+
if $? == 0
|
|
179
|
+
block.call(outbuf) if block
|
|
180
|
+
end
|
|
181
|
+
}
|
|
182
|
+
[outbuf, $?]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def gem_push?
|
|
186
|
+
! %w{n no nil false off 0}.include?(ENV['gem_push'].to_s.downcase)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end.new.install
|
|
190
|
+
|
|
191
|
+
# Based on https://github.com/YorickPeterse/ruby-lint/blob/3e946e6/task/todo.rake
|
|
192
|
+
desc 'Extracts TODO tags and the likes'
|
|
193
|
+
task :todo do
|
|
194
|
+
regex = %w{NOTE: FIXME: TODO: THINK: @todo}.join('|')
|
|
195
|
+
|
|
196
|
+
sh "ack '#{regex}' lib"
|
|
197
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
if ENV["FULL_BUILD"] != "true" # skip on Travis
|
|
2
|
+
require "rubocop/rake_task"
|
|
3
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
|
4
|
+
task.patterns = ["lib", "spec"]
|
|
5
|
+
task.formatters = ["progress"]
|
|
6
|
+
task.options = ["--display-cop-names"]
|
|
7
|
+
task.fail_on_error = false
|
|
8
|
+
task.verbose = false
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
ROOT_PATH = File.expand_path("..", File.dirname(__FILE__))
|
|
2
|
+
require File.join(ROOT_PATH, 'spec', 'support', 'usage_test')
|
|
3
|
+
LIB_PATH = File.join(ROOT_PATH, 'lib')
|
|
4
|
+
BIN_PATH = File.join(ROOT_PATH, 'bin')
|
|
5
|
+
EXAMPLE_FILES = [
|
|
6
|
+
File.join(ROOT_PATH, 'README.md'),
|
|
7
|
+
File.join(ROOT_PATH, 'DEV.md')
|
|
8
|
+
]
|
|
9
|
+
task "load_path" do
|
|
10
|
+
$LOAD_PATH.unshift(LIB_PATH)
|
|
11
|
+
$VERBOSE = nil
|
|
12
|
+
ENV['PATH'] = "#{BIN_PATH}:#{ENV['PATH']}"
|
|
13
|
+
ENV['CC_BUILD_ARTIFACTS'] = 'turn_off_browser_opening'
|
|
14
|
+
end
|
|
15
|
+
desc "Test that documentation usage works"
|
|
16
|
+
task "usage_test" => %w[load_path] do
|
|
17
|
+
usage_test = UsageTest.new
|
|
18
|
+
usage_test.test_files(EXAMPLE_FILES)
|
|
19
|
+
end
|
data/gem_tasks/yard.rake
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require "yard"
|
|
5
|
+
rescue LoadError
|
|
6
|
+
else
|
|
7
|
+
namespace :yard do
|
|
8
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
|
9
|
+
t.stats_options = ["--list-undoc"]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
desc "start a gem server"
|
|
13
|
+
task :server do
|
|
14
|
+
sh "bundle exec yard server --gems"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
desc "use Graphviz to generate dot graph"
|
|
18
|
+
task :graph do
|
|
19
|
+
output_file = "doc/erd.dot"
|
|
20
|
+
sh "bundle exec yard graph --protected --full --dependencies > #{output_file}"
|
|
21
|
+
puts "open doc/erd.dot if you have graphviz installed"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/metric_fu.rb
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
require "metric_fu/version"
|
|
3
|
+
require "forwardable"
|
|
4
|
+
require "pathname"
|
|
5
|
+
module MetricFu
|
|
6
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
|
7
|
+
LIB_ROOT = File.join(APP_ROOT, "lib/metric_fu")
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
def root
|
|
12
|
+
@app_root ||= Pathname(APP_ROOT)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def metric_url
|
|
16
|
+
"https://github.com/metricfu/metric_fu"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def metric_name
|
|
20
|
+
"MetricFu"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def with_run_dir(dir, &block)
|
|
24
|
+
old_dir = run_dir
|
|
25
|
+
self.run_dir = dir
|
|
26
|
+
|
|
27
|
+
block.call
|
|
28
|
+
|
|
29
|
+
self.run_dir = old_dir
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def run_dir
|
|
33
|
+
@run_dir ||= Dir.pwd
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def run_path
|
|
37
|
+
Pathname(run_dir)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def run_dir=(run_dir)
|
|
41
|
+
@run_dir = run_dir
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def report_name
|
|
45
|
+
@report_name || self.report_name = run_path.basename.to_s
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def report_name=(report_name)
|
|
49
|
+
@report_name = report_name
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# The time at analyzed code state
|
|
53
|
+
def report_time
|
|
54
|
+
Time.now
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def report_date_string
|
|
58
|
+
report_time.strftime("%Y%m%d")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [String]
|
|
62
|
+
# @example '20140323'
|
|
63
|
+
# Used to uniquely identify reports
|
|
64
|
+
# as a sortable reference to when the report
|
|
65
|
+
# was generated
|
|
66
|
+
def report_id
|
|
67
|
+
report_date_string
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Non-date-specific; Used to uniquely identify a report run
|
|
71
|
+
def report_fingerprint
|
|
72
|
+
report_time.to_i.to_s
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# The time the metrics are generated
|
|
76
|
+
def current_time
|
|
77
|
+
Time.now.localtime
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def root_dir
|
|
81
|
+
APP_ROOT
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def lib_dir
|
|
85
|
+
LIB_ROOT
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
require "metric_fu/loader"
|
|
89
|
+
LOADER = MetricFu::Loader.new(LIB_ROOT)
|
|
90
|
+
def loader
|
|
91
|
+
LOADER
|
|
92
|
+
end
|
|
93
|
+
extend SingleForwardable
|
|
94
|
+
|
|
95
|
+
def_delegators :loader, :lib_require, :load_tasks
|
|
96
|
+
|
|
97
|
+
def library_dirs
|
|
98
|
+
%w(metrics formatter reporting logging errors data_structures tasks)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
loader.create_dirs(self) do
|
|
102
|
+
library_dirs
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @note artifact_dir is relative to where the task is being run,
|
|
106
|
+
# not to the metric_fu library
|
|
107
|
+
require "metric_fu/io"
|
|
108
|
+
def artifact_dir
|
|
109
|
+
MetricFu::Io::FileSystem.artifact_dir
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def artifact_subdirs
|
|
113
|
+
%w(scratch output _data)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
loader.create_artifact_subdirs(self) do
|
|
117
|
+
artifact_subdirs
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
loader.setup
|
|
121
|
+
|
|
122
|
+
def reset
|
|
123
|
+
# TODO Don't like how this method needs to know
|
|
124
|
+
# all of these class variables that are defined
|
|
125
|
+
# in separate classes.
|
|
126
|
+
@configuration = nil
|
|
127
|
+
@graph = nil
|
|
128
|
+
@result = nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def run(options)
|
|
132
|
+
MetricFu::Run.new.run(options)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def run_only(metrics_to_run_names, options)
|
|
136
|
+
metrics_to_run_names = Array(metrics_to_run_names).map(&:to_s)
|
|
137
|
+
MetricFu::Configuration.run do |config|
|
|
138
|
+
config.configure_metrics.each do |metric|
|
|
139
|
+
metric_name = metric.name.to_s
|
|
140
|
+
if metrics_to_run_names.include?(metric_name)
|
|
141
|
+
p "Enabling #{metric_name}"
|
|
142
|
+
metric.enabled = true
|
|
143
|
+
else
|
|
144
|
+
p "Disabling #{metric_name}"
|
|
145
|
+
metric.enabled = false
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
run(options)
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require "metric_fu"
|
|
2
|
+
require "metric_fu/cli/helper"
|
|
3
|
+
require "metric_fu/cli/parser"
|
|
4
|
+
module MetricFu
|
|
5
|
+
module Cli
|
|
6
|
+
class Client
|
|
7
|
+
def initialize
|
|
8
|
+
@helper = MetricFu::Cli::Helper.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def shutdown
|
|
12
|
+
@helper.shutdown
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def run(argv = ARGV.dup)
|
|
16
|
+
options = @helper.process_options(argv)
|
|
17
|
+
mf_debug "Got options #{options.inspect}"
|
|
18
|
+
if options[:run]
|
|
19
|
+
@helper.run(options)
|
|
20
|
+
else
|
|
21
|
+
STDOUT.puts @helper.usage
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require "metric_fu"
|
|
2
|
+
require "metric_fu/cli/parser"
|
|
3
|
+
MetricFu.lib_require { "run" }
|
|
4
|
+
# see https://github.com/grosser/pru/blob/master/bin/pru
|
|
5
|
+
module MetricFu
|
|
6
|
+
module Cli
|
|
7
|
+
def self.immediate_shutdown!
|
|
8
|
+
exit(1)
|
|
9
|
+
end
|
|
10
|
+
def self.complete!
|
|
11
|
+
exit(0)
|
|
12
|
+
end
|
|
13
|
+
class Helper
|
|
14
|
+
def initialize
|
|
15
|
+
@metric_fu = MetricFu::Run.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def run(options = {})
|
|
19
|
+
@metric_fu.run(options)
|
|
20
|
+
complete
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def version
|
|
24
|
+
MetricFu::VERSION
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def shutdown
|
|
28
|
+
out "\nShutting down. Bye"
|
|
29
|
+
MetricFu::Cli.immediate_shutdown!
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def banner
|
|
33
|
+
"MetricFu: A Fistful of code metrics"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def usage
|
|
37
|
+
<<-EOS
|
|
38
|
+
#{banner}
|
|
39
|
+
Use --help for help
|
|
40
|
+
EOS
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def executable_name
|
|
44
|
+
"metric_fu"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def metrics
|
|
48
|
+
MetricFu::Metric.metrics.map(&:name).sort_by(&:to_s)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def process_options(argv = [])
|
|
52
|
+
options = MetricFu::Cli::MicroOptParse::Parser.new do |p|
|
|
53
|
+
p.banner = banner
|
|
54
|
+
p.version = version
|
|
55
|
+
p.option :run, "Run all metrics with defaults", default: true
|
|
56
|
+
metrics.each do |metric|
|
|
57
|
+
p.option metric.to_sym, "Enables or disables #{metric}", default: true # , :value_in_set => [true, false]
|
|
58
|
+
end
|
|
59
|
+
p.option :open, "Open report in browser (if supported by formatter)", default: true
|
|
60
|
+
end.process!(argv)
|
|
61
|
+
options
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def out(text)
|
|
67
|
+
STDOUT.puts text
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def error(text)
|
|
71
|
+
STDERR.puts text
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def complete
|
|
75
|
+
out "all done"
|
|
76
|
+
MetricFu::Cli.complete!
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|