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.
Files changed (296) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.metrics +3 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +15 -0
  6. data/.rubocop_todo.yml +69 -0
  7. data/.simplecov +74 -0
  8. data/.travis.yml +18 -0
  9. data/.yardopts +4 -0
  10. data/AUTHORS +12 -0
  11. data/CONTRIBUTING.md +47 -0
  12. data/CONTRIBUTORS +76 -0
  13. data/DEV.md +76 -0
  14. data/Gemfile +58 -0
  15. data/Guardfile +30 -0
  16. data/HISTORY.md +705 -0
  17. data/MIT-LICENSE +22 -0
  18. data/README.md +299 -0
  19. data/Rakefile +27 -0
  20. data/TODO.md +118 -0
  21. data/appveyor.yml +29 -0
  22. data/bin/metric_fu +9 -0
  23. data/bin/mf-cane +10 -0
  24. data/bin/mf-churn +10 -0
  25. data/bin/mf-flay +10 -0
  26. data/bin/mf-reek +10 -0
  27. data/bin/mf-roodi +10 -0
  28. data/bin/mf-saikuro +10 -0
  29. data/certs/bf4.pem +22 -0
  30. data/checksum/.gitkeep +0 -0
  31. data/checksum/metric_fu-4.10.0.gem.sha512 +1 -0
  32. data/checksum/metric_fu-4.11.0.gem.sha512 +1 -0
  33. data/checksum/metric_fu-4.11.1.gem.sha512 +1 -0
  34. data/checksum/metric_fu-4.11.2.gem.sha512 +1 -0
  35. data/checksum/metric_fu-4.11.3.gem.sha512 +1 -0
  36. data/checksum/metric_fu-4.11.4.gem.sha512 +1 -0
  37. data/checksum/metric_fu-4.12.0.gem.sha512 +1 -0
  38. data/checksum/metric_fu-4.2.0.gem.sha512 +1 -0
  39. data/checksum/metric_fu-4.2.1.gem.sha512 +1 -0
  40. data/checksum/metric_fu-4.3.0.gem.sha512 +1 -0
  41. data/checksum/metric_fu-4.3.1.gem.sha512 +1 -0
  42. data/checksum/metric_fu-4.4.0.gem.sha512 +1 -0
  43. data/checksum/metric_fu-4.4.1.gem.sha512 +1 -0
  44. data/checksum/metric_fu-4.4.2.gem.sha512 +1 -0
  45. data/checksum/metric_fu-4.4.3.gem.sha512 +1 -0
  46. data/checksum/metric_fu-4.4.4.gem.sha512 +1 -0
  47. data/checksum/metric_fu-4.5.0.gem.sha512 +1 -0
  48. data/checksum/metric_fu-4.5.1.gem.sha512 +1 -0
  49. data/checksum/metric_fu-4.5.2.gem.sha512 +1 -0
  50. data/checksum/metric_fu-4.6.0.gem.sha512 +1 -0
  51. data/checksum/metric_fu-4.7.0.gem.sha512 +1 -0
  52. data/checksum/metric_fu-4.7.1.gem.sha512 +1 -0
  53. data/checksum/metric_fu-4.7.2.gem.sha512 +1 -0
  54. data/checksum/metric_fu-4.7.3.gem.sha512 +1 -0
  55. data/checksum/metric_fu-4.7.4.gem.sha512 +1 -0
  56. data/checksum/metric_fu-4.8.0.gem.sha512 +1 -0
  57. data/checksum/metric_fu-4.9.0.gem.sha512 +1 -0
  58. data/config/roodi_config.yml +22 -0
  59. data/config/rubocop.yml +269 -0
  60. data/gem_tasks/build.rake +197 -0
  61. data/gem_tasks/rubocop.rake +10 -0
  62. data/gem_tasks/usage_test.rake +19 -0
  63. data/gem_tasks/yard.rake +24 -0
  64. data/lib/metric_fu.rb +151 -0
  65. data/lib/metric_fu/calculate.rb +10 -0
  66. data/lib/metric_fu/cli/client.rb +26 -0
  67. data/lib/metric_fu/cli/helper.rb +80 -0
  68. data/lib/metric_fu/cli/parser.rb +138 -0
  69. data/lib/metric_fu/configuration.rb +150 -0
  70. data/lib/metric_fu/constantize.rb +57 -0
  71. data/lib/metric_fu/data_structures/line_numbers.rb +112 -0
  72. data/lib/metric_fu/data_structures/location.rb +110 -0
  73. data/lib/metric_fu/data_structures/sexp_node.rb +107 -0
  74. data/lib/metric_fu/environment.rb +129 -0
  75. data/lib/metric_fu/errors/analysis_error.rb +4 -0
  76. data/lib/metric_fu/formatter.rb +40 -0
  77. data/lib/metric_fu/formatter/html.rb +96 -0
  78. data/lib/metric_fu/formatter/syntax.rb +45 -0
  79. data/lib/metric_fu/formatter/yaml.rb +18 -0
  80. data/lib/metric_fu/gem_run.rb +70 -0
  81. data/lib/metric_fu/gem_version.rb +92 -0
  82. data/lib/metric_fu/generator.rb +135 -0
  83. data/lib/metric_fu/io.rb +132 -0
  84. data/lib/metric_fu/loader.rb +105 -0
  85. data/lib/metric_fu/logger.rb +62 -0
  86. data/lib/metric_fu/logging/mf_debugger.rb +23 -0
  87. data/lib/metric_fu/metric.rb +143 -0
  88. data/lib/metric_fu/metrics/cane/generator.rb +95 -0
  89. data/lib/metric_fu/metrics/cane/grapher.rb +37 -0
  90. data/lib/metric_fu/metrics/cane/metric.rb +34 -0
  91. data/lib/metric_fu/metrics/cane/report.html.erb +87 -0
  92. data/lib/metric_fu/metrics/cane/violations.rb +46 -0
  93. data/lib/metric_fu/metrics/churn/generator.rb +37 -0
  94. data/lib/metric_fu/metrics/churn/hotspot.rb +43 -0
  95. data/lib/metric_fu/metrics/churn/metric.rb +29 -0
  96. data/lib/metric_fu/metrics/churn/report.html.erb +58 -0
  97. data/lib/metric_fu/metrics/flay/generator.rb +51 -0
  98. data/lib/metric_fu/metrics/flay/grapher.rb +37 -0
  99. data/lib/metric_fu/metrics/flay/hotspot.rb +52 -0
  100. data/lib/metric_fu/metrics/flay/metric.rb +28 -0
  101. data/lib/metric_fu/metrics/flay/report.html.erb +29 -0
  102. data/lib/metric_fu/metrics/flog/generator.rb +113 -0
  103. data/lib/metric_fu/metrics/flog/grapher.rb +77 -0
  104. data/lib/metric_fu/metrics/flog/hotspot.rb +46 -0
  105. data/lib/metric_fu/metrics/flog/metric.rb +29 -0
  106. data/lib/metric_fu/metrics/flog/report.html.erb +50 -0
  107. data/lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb +34 -0
  108. data/lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb +114 -0
  109. data/lib/metric_fu/metrics/hotspots/analysis/grouping.rb +23 -0
  110. data/lib/metric_fu/metrics/hotspots/analysis/groupings.rb +12 -0
  111. data/lib/metric_fu/metrics/hotspots/analysis/problems.rb +20 -0
  112. data/lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb +70 -0
  113. data/lib/metric_fu/metrics/hotspots/analysis/ranking.rb +29 -0
  114. data/lib/metric_fu/metrics/hotspots/analysis/rankings.rb +91 -0
  115. data/lib/metric_fu/metrics/hotspots/analysis/record.rb +32 -0
  116. data/lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb +24 -0
  117. data/lib/metric_fu/metrics/hotspots/analysis/table.rb +67 -0
  118. data/lib/metric_fu/metrics/hotspots/generator.rb +40 -0
  119. data/lib/metric_fu/metrics/hotspots/hotspot.rb +87 -0
  120. data/lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb +61 -0
  121. data/lib/metric_fu/metrics/hotspots/metric.rb +20 -0
  122. data/lib/metric_fu/metrics/hotspots/report.html.erb +60 -0
  123. data/lib/metric_fu/metrics/rails_best_practices/generator.rb +47 -0
  124. data/lib/metric_fu/metrics/rails_best_practices/grapher.rb +38 -0
  125. data/lib/metric_fu/metrics/rails_best_practices/metric.rb +31 -0
  126. data/lib/metric_fu/metrics/rails_best_practices/report.html.erb +22 -0
  127. data/lib/metric_fu/metrics/rcov/external_client.rb +22 -0
  128. data/lib/metric_fu/metrics/rcov/generator.rb +75 -0
  129. data/lib/metric_fu/metrics/rcov/grapher.rb +37 -0
  130. data/lib/metric_fu/metrics/rcov/hotspot.rb +46 -0
  131. data/lib/metric_fu/metrics/rcov/metric.rb +61 -0
  132. data/lib/metric_fu/metrics/rcov/rcov_format_coverage.rb +149 -0
  133. data/lib/metric_fu/metrics/rcov/rcov_line.rb +48 -0
  134. data/lib/metric_fu/metrics/rcov/report.html.erb +40 -0
  135. data/lib/metric_fu/metrics/rcov/simplecov_formatter.rb +74 -0
  136. data/lib/metric_fu/metrics/reek/generator.rb +94 -0
  137. data/lib/metric_fu/metrics/reek/grapher.rb +55 -0
  138. data/lib/metric_fu/metrics/reek/hotspot.rb +95 -0
  139. data/lib/metric_fu/metrics/reek/metric.rb +26 -0
  140. data/lib/metric_fu/metrics/reek/report.html.erb +35 -0
  141. data/lib/metric_fu/metrics/roodi/generator.rb +40 -0
  142. data/lib/metric_fu/metrics/roodi/grapher.rb +37 -0
  143. data/lib/metric_fu/metrics/roodi/hotspot.rb +39 -0
  144. data/lib/metric_fu/metrics/roodi/metric.rb +24 -0
  145. data/lib/metric_fu/metrics/roodi/report.html.erb +22 -0
  146. data/lib/metric_fu/metrics/saikuro/generator.rb +145 -0
  147. data/lib/metric_fu/metrics/saikuro/hotspot.rb +51 -0
  148. data/lib/metric_fu/metrics/saikuro/metric.rb +31 -0
  149. data/lib/metric_fu/metrics/saikuro/parsing_element.rb +37 -0
  150. data/lib/metric_fu/metrics/saikuro/report.html.erb +71 -0
  151. data/lib/metric_fu/metrics/saikuro/scratch_file.rb +108 -0
  152. data/lib/metric_fu/metrics/stats/generator.rb +82 -0
  153. data/lib/metric_fu/metrics/stats/grapher.rb +40 -0
  154. data/lib/metric_fu/metrics/stats/hotspot.rb +35 -0
  155. data/lib/metric_fu/metrics/stats/metric.rb +28 -0
  156. data/lib/metric_fu/metrics/stats/report.html.erb +44 -0
  157. data/lib/metric_fu/reporter.rb +37 -0
  158. data/lib/metric_fu/reporting/graphs/graph.rb +69 -0
  159. data/lib/metric_fu/reporting/graphs/grapher.rb +66 -0
  160. data/lib/metric_fu/reporting/result.rb +59 -0
  161. data/lib/metric_fu/run.rb +82 -0
  162. data/lib/metric_fu/tasks/metric_fu.rake +54 -0
  163. data/lib/metric_fu/templates/_graph.html.erb +2 -0
  164. data/lib/metric_fu/templates/_report_footer.html.erb +1 -0
  165. data/lib/metric_fu/templates/configuration.rb +25 -0
  166. data/lib/metric_fu/templates/css/bluff.css +15 -0
  167. data/lib/metric_fu/templates/css/buttons.css +82 -0
  168. data/lib/metric_fu/templates/css/default.css +43 -0
  169. data/lib/metric_fu/templates/css/integrity.css +337 -0
  170. data/lib/metric_fu/templates/css/rcov.css +32 -0
  171. data/lib/metric_fu/templates/css/reset.css +7 -0
  172. data/lib/metric_fu/templates/css/syntax.css +19 -0
  173. data/lib/metric_fu/templates/index.html.erb +10 -0
  174. data/lib/metric_fu/templates/javascripts/bluff-min.js +1 -0
  175. data/lib/metric_fu/templates/javascripts/bluff_graph.js +15 -0
  176. data/lib/metric_fu/templates/javascripts/excanvas.js +35 -0
  177. data/lib/metric_fu/templates/javascripts/highcharts.js +294 -0
  178. data/lib/metric_fu/templates/javascripts/highcharts_graph.js +38 -0
  179. data/lib/metric_fu/templates/javascripts/js-class.js +1 -0
  180. data/lib/metric_fu/templates/javascripts/standalone-framework.js +17 -0
  181. data/lib/metric_fu/templates/javascripts/utils.js +9 -0
  182. data/lib/metric_fu/templates/layout.html.erb +37 -0
  183. data/lib/metric_fu/templates/metrics_template.rb +80 -0
  184. data/lib/metric_fu/templates/report.html.erb +31 -0
  185. data/lib/metric_fu/templates/report.rb +41 -0
  186. data/lib/metric_fu/templates/template.rb +244 -0
  187. data/lib/metric_fu/utility.rb +79 -0
  188. data/lib/metric_fu/version.rb +9 -0
  189. data/metric_fu.gemspec +71 -0
  190. data/spec/capture_warnings.rb +55 -0
  191. data/spec/cli/helper_spec.rb +165 -0
  192. data/spec/dummy/.gitignore +1 -0
  193. data/spec/dummy/.gitkeep +0 -0
  194. data/spec/dummy/lib/.gitkeep +0 -0
  195. data/spec/dummy/lib/bad_encoding.rb +6 -0
  196. data/spec/dummy/spec/.gitkeep +0 -0
  197. data/spec/fixtures/20090630.yml +7922 -0
  198. data/spec/fixtures/coverage-153.rb +11 -0
  199. data/spec/fixtures/coverage.rb +13 -0
  200. data/spec/fixtures/exit0.sh +3 -0
  201. data/spec/fixtures/exit1.sh +3 -0
  202. data/spec/fixtures/hotspots/flog.yml +86 -0
  203. data/spec/fixtures/hotspots/generator.yml +47 -0
  204. data/spec/fixtures/hotspots/generator_analysis.yml +53 -0
  205. data/spec/fixtures/hotspots/reek.yml +14 -0
  206. data/spec/fixtures/hotspots/roodi.yml +13 -0
  207. data/spec/fixtures/hotspots/saikuro.yml +27 -0
  208. data/spec/fixtures/hotspots/several_metrics.yml +47 -0
  209. data/spec/fixtures/hotspots/stats.yml +4 -0
  210. data/spec/fixtures/hotspots/three_metrics_on_same_file.yml +36 -0
  211. data/spec/fixtures/line_numbers/foo.rb +33 -0
  212. data/spec/fixtures/line_numbers/module.rb +11 -0
  213. data/spec/fixtures/line_numbers/module_surrounds_class.rb +15 -0
  214. data/spec/fixtures/line_numbers/two_classes.rb +11 -0
  215. data/spec/fixtures/metric_missing.yml +1 -0
  216. data/spec/fixtures/rcov_output.txt +135 -0
  217. data/spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
  218. data/spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
  219. data/spec/fixtures/saikuro/index_cyclo.html +155 -0
  220. data/spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html +11 -0
  221. data/spec/metric_fu/calculate_spec.rb +21 -0
  222. data/spec/metric_fu/configuration_spec.rb +90 -0
  223. data/spec/metric_fu/data_structures/line_numbers_spec.rb +63 -0
  224. data/spec/metric_fu/data_structures/location_spec.rb +110 -0
  225. data/spec/metric_fu/formatter/configuration_spec.rb +44 -0
  226. data/spec/metric_fu/formatter/html_spec.rb +138 -0
  227. data/spec/metric_fu/formatter/yaml_spec.rb +61 -0
  228. data/spec/metric_fu/formatter_spec.rb +49 -0
  229. data/spec/metric_fu/gem_version_spec.rb +12 -0
  230. data/spec/metric_fu/generator_spec.rb +130 -0
  231. data/spec/metric_fu/loader_spec.rb +13 -0
  232. data/spec/metric_fu/metric_spec.rb +46 -0
  233. data/spec/metric_fu/metrics/cane/configuration_spec.rb +22 -0
  234. data/spec/metric_fu/metrics/cane/generator_spec.rb +184 -0
  235. data/spec/metric_fu/metrics/churn/configuration_spec.rb +13 -0
  236. data/spec/metric_fu/metrics/churn/generator_spec.rb +64 -0
  237. data/spec/metric_fu/metrics/flay/configuration_spec.rb +13 -0
  238. data/spec/metric_fu/metrics/flay/generator_spec.rb +105 -0
  239. data/spec/metric_fu/metrics/flay/grapher_spec.rb +57 -0
  240. data/spec/metric_fu/metrics/flog/configuration_spec.rb +18 -0
  241. data/spec/metric_fu/metrics/flog/generator_spec.rb +77 -0
  242. data/spec/metric_fu/metrics/flog/grapher_spec.rb +107 -0
  243. data/spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb +104 -0
  244. data/spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb +71 -0
  245. data/spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb +30 -0
  246. data/spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb +97 -0
  247. data/spec/metric_fu/metrics/hotspots/analysis/table_spec.rb +6 -0
  248. data/spec/metric_fu/metrics/hotspots/generator_spec.rb +46 -0
  249. data/spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb +10 -0
  250. data/spec/metric_fu/metrics/hotspots/hotspot_spec.rb +16 -0
  251. data/spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb +55 -0
  252. data/spec/metric_fu/metrics/rails_best_practices/generator_spec.rb +33 -0
  253. data/spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb +62 -0
  254. data/spec/metric_fu/metrics/rcov/configuration_spec.rb +28 -0
  255. data/spec/metric_fu/metrics/rcov/generator_spec.rb +22 -0
  256. data/spec/metric_fu/metrics/rcov/grapher_spec.rb +57 -0
  257. data/spec/metric_fu/metrics/rcov/hotspot_spec.rb +20 -0
  258. data/spec/metric_fu/metrics/rcov/rcov_line_spec.rb +89 -0
  259. data/spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb +67 -0
  260. data/spec/metric_fu/metrics/reek/configuration_spec.rb +13 -0
  261. data/spec/metric_fu/metrics/reek/generator_spec.rb +203 -0
  262. data/spec/metric_fu/metrics/reek/grapher_spec.rb +66 -0
  263. data/spec/metric_fu/metrics/roodi/configuration_spec.rb +14 -0
  264. data/spec/metric_fu/metrics/roodi/generator_spec.rb +82 -0
  265. data/spec/metric_fu/metrics/roodi/grapher_spec.rb +57 -0
  266. data/spec/metric_fu/metrics/saikuro/configuration_spec.rb +25 -0
  267. data/spec/metric_fu/metrics/saikuro/generator_spec.rb +71 -0
  268. data/spec/metric_fu/metrics/stats/generator_spec.rb +96 -0
  269. data/spec/metric_fu/metrics/stats/grapher_spec.rb +69 -0
  270. data/spec/metric_fu/reporter_spec.rb +41 -0
  271. data/spec/metric_fu/reporting/graphs/graph_spec.rb +44 -0
  272. data/spec/metric_fu/reporting/graphs/grapher_spec.rb +24 -0
  273. data/spec/metric_fu/reporting/result_spec.rb +50 -0
  274. data/spec/metric_fu/run_spec.rb +197 -0
  275. data/spec/metric_fu/templates/configuration_spec.rb +51 -0
  276. data/spec/metric_fu/templates/metrics_template_spec.rb +11 -0
  277. data/spec/metric_fu/templates/report_spec.rb +15 -0
  278. data/spec/metric_fu/templates/template_spec.rb +233 -0
  279. data/spec/metric_fu/utility_spec.rb +12 -0
  280. data/spec/metric_fu_spec.rb +52 -0
  281. data/spec/quality_spec.rb +114 -0
  282. data/spec/shared/configured.rb +45 -0
  283. data/spec/shared/test_coverage.rb +95 -0
  284. data/spec/spec_helper.rb +46 -0
  285. data/spec/support/.metrics +4 -0
  286. data/spec/support/deferred_garbaged_collection.rb +33 -0
  287. data/spec/support/helper_methods.rb +32 -0
  288. data/spec/support/matcher_create_file.rb +37 -0
  289. data/spec/support/matcher_create_files.rb +43 -0
  290. data/spec/support/samples/reek/alfa.rb +1 -0
  291. data/spec/support/suite.rb +26 -0
  292. data/spec/support/test_fixtures.rb +37 -0
  293. data/spec/support/timeout.rb +7 -0
  294. data/spec/support/usage_test.rb +150 -0
  295. data/spec/usage_test_spec.rb +93 -0
  296. metadata +735 -0
@@ -0,0 +1,43 @@
1
+ RSpec::Matchers.define :create_files do |expected|
2
+ match do |block|
3
+ @before = false
4
+ @after = true
5
+ expected.each do |file|
6
+ @before |= exists?(file)
7
+ end
8
+ block.call
9
+ expected.each do |file|
10
+ @after &= exists?(file)
11
+ end
12
+ !@before && @after
13
+ end
14
+
15
+ failure_message do |_block|
16
+ existed_before_message expected do
17
+ "One or more files in [#{expected.inspect}] was not created."
18
+ end
19
+ end
20
+
21
+ failure_message_when_negated do |_block|
22
+ existed_before_message expected do
23
+ "The files in [#{expected.inspect}] were created."
24
+ end
25
+ end
26
+
27
+ def supports_block_expectations?
28
+ true
29
+ end
30
+
31
+ def exists?(expected)
32
+ # Allows us to use wildcard checks for existence.
33
+ !Dir.glob(expected).empty?
34
+ end
35
+
36
+ def existed_before_message(expected)
37
+ if @before
38
+ "One or more files in [#{expected.inspect}] existed before, so this test doesn't work"
39
+ else
40
+ yield
41
+ end
42
+ end
43
+ end
@@ -0,0 +1 @@
1
+ def foo(echo); end
@@ -0,0 +1,26 @@
1
+ require "fileutils"
2
+ def directory(name)
3
+ MetricFu::Io::FileSystem.directory(name)
4
+ end
5
+
6
+ def scratch_directory(name)
7
+ File.join(MetricFu::Io::FileSystem.artifact_dir, "scratch", name)
8
+ end
9
+
10
+ def artifact_test_dir
11
+ File.join(MetricFu::APP_ROOT, "tmp", "metric_fu", "test")
12
+ end
13
+
14
+ # Let's shift the output directories so that we don't interfere with
15
+ # existing historical metric data.
16
+ MetricFu::Io::FileSystem.artifact_dir = artifact_test_dir
17
+ MetricFu::Io::FileSystem.set_directories
18
+
19
+ def setup_fs
20
+ cleanup_fs
21
+ MetricFu::Io::FileSystem.set_directories
22
+ end
23
+
24
+ def cleanup_fs
25
+ FileUtils.rm_rf(artifact_test_dir)
26
+ end
@@ -0,0 +1,37 @@
1
+ require "pathname"
2
+ class TestFixtures
3
+ attr_reader :fixtures_path
4
+
5
+ def initialize
6
+ @loaded_data = {}
7
+ @fixtures_path = Pathname(MetricFu.root_dir).join("spec", "fixtures")
8
+ end
9
+
10
+ def load_metric(path)
11
+ retrieve_data(path) do |path|
12
+ YAML.load_file(fixture_path(path))
13
+ end
14
+ end
15
+
16
+ def load_file(path)
17
+ retrieve_data(path) do |path|
18
+ File.read(fixture_path(path))
19
+ end
20
+ end
21
+
22
+ def fixture_path(path)
23
+ fixtures_path.join(*Array(path))
24
+ end
25
+
26
+ private
27
+
28
+ def retrieve_data(path)
29
+ @loaded_data.fetch(path) do
30
+ @loaded_data[path] = yield(path)
31
+ end
32
+ end
33
+ end
34
+ FIXTURE = TestFixtures.new
35
+ HOTSPOT_DATA = ->(paths) {
36
+ FIXTURE.load_metric(["hotspots"].concat(Array(paths)))
37
+ }
@@ -0,0 +1,7 @@
1
+ require "timeout"
2
+ # No spec should run longer than this
3
+ # (define here to support the closure)
4
+ p "setting timeout #{timeout = 15.0} seconds"
5
+ RSpec.configuration.around(:each) do |example|
6
+ Timeout.timeout(timeout, &example)
7
+ end
@@ -0,0 +1,150 @@
1
+ # usage_test = UsageTest.new
2
+ # usage_test.test_files(EXAMPLE_FILES)
3
+
4
+ # puts "SUCCESS!"
5
+ # Process.exit! 0
6
+ require "open3"
7
+
8
+ class UsageTest
9
+ CodeBlock = Struct.new(:matchdata) do
10
+ # From kramdown-1.2.0/lib/kramdown/parser/gfm.rb
11
+ FENCED_CODEBLOCK_MATCH = /^(([~`]){3,})\s*?(\w+)?\s*?\n(.*?)^\1\2*\s*?\n/m
12
+ def code
13
+ matchdata[3].strip
14
+ end
15
+
16
+ def language
17
+ matchdata[2].strip
18
+ end
19
+ def self.find_code_blocks(markdown)
20
+ markdown.scan(FENCED_CODEBLOCK_MATCH).map do |matchdata|
21
+ new(matchdata)
22
+ end
23
+ end
24
+ end
25
+
26
+ def test_files(paths)
27
+ in_test_directory do
28
+ Array(paths).each do |path|
29
+ puts "Testing #{path}"
30
+ CodeBlock.find_code_blocks(File.read(path)).each do |code_block|
31
+ test_code_block!(code_block)
32
+ end
33
+ puts
34
+ end
35
+ end
36
+ puts "SUCCESS!"
37
+ Process.exit! 0
38
+ end
39
+
40
+ def test_code_block!(code_block)
41
+ SnippetRunner.new(code_block.code, code_block.language).test!
42
+ end
43
+
44
+ private
45
+
46
+ def in_test_directory
47
+ Dir.mktmpdir do |dir|
48
+ Dir.chdir(dir) {
49
+ `git init; touch README; git add README; git commit -m 'first'`
50
+ yield
51
+ }
52
+ end
53
+ end
54
+ end
55
+ SnippetRunner = Struct.new(:code, :language) do
56
+ SystemCommandError = Class.new(StandardError)
57
+ TestResult = Struct.new(:success, :captured_output)
58
+
59
+ def test!
60
+ time = Time.now
61
+ test_result = run_code
62
+ mf_debug "#{Time.now - time} seconds"
63
+ if test_result.success
64
+ print "."
65
+ else
66
+ puts "x"
67
+ puts "Red :( language: #{language}, code #{code}, #{test_result.captured_output}"
68
+ Process.exit! 1
69
+ end
70
+ end
71
+
72
+ def run_code(test_result = TestResult.new(:no_result, ""))
73
+ test_result.captured_output = case language
74
+ when "ruby" then eval_ruby
75
+ when "sh" then run_system_command
76
+ else mf_debug "Cannot test language: #{language.inspect}"
77
+ end
78
+ test_result.success = true
79
+ test_result
80
+ rescue StandardError => run_error
81
+ test_result.captured_output = exception_message(run_error)
82
+ test_result.success = false
83
+ test_result
84
+ rescue SystemExit => system_exit
85
+ mf_debug "I am a system exit"
86
+ test_result.captured_output = exception_message(system_exit)
87
+ test_result.success = system_exit.success?
88
+ test_result
89
+ end
90
+
91
+ def eval_ruby(fail_on_empty = false)
92
+ capture_output(fail_on_empty) do
93
+ instance_eval(code)
94
+ end
95
+ end
96
+
97
+ def run_system_command(_fail_on_empty = true)
98
+ out = ""
99
+ err = ""
100
+ pid = :not_set
101
+ exit_status = :not_set
102
+ Open3.popen3(code) do |_stdin, stdout, stderr, wait_thr|
103
+ out << stdout.read.chomp
104
+ err << stderr.read.chomp
105
+ pid = wait_thr.pid
106
+ exit_status = wait_thr.value
107
+ end
108
+ exit_code = exit_status.exitstatus
109
+ case exit_code
110
+ when 0 then "Ran with exit status #{exit_code}"
111
+ when (1..Float::INFINITY) then fail SystemCommandError.new("Failed with exit status #{exit_code}. #{err}----#{out}")
112
+ else fail SystemCommandError.new("Execution failed with exit status #{exit_code}. #{err}----#{out}")
113
+ end
114
+ end
115
+
116
+ def exception_message(e)
117
+ "#{e.class}\t#{e.message}"
118
+ end
119
+
120
+ def capture_output(fail_on_empty)
121
+ exception = nil
122
+ stderr = :not_set
123
+ stdout = :not_set
124
+ MetricFu::Utility.capture_output(STDOUT) do
125
+ stdout =
126
+ MetricFu::Utility.capture_output(STDERR) do
127
+ begin
128
+ stderr = yield
129
+ rescue Exception => e
130
+ exception = e
131
+ end
132
+ end
133
+ end
134
+ if [nil, "", :not_set].none? { |c| c == stderr }
135
+ mf_debug "Captured STDERR"
136
+ stderr
137
+ elsif [nil, "", :not_set].none? { |c| c == stdout }
138
+ mf_debug "Captured STDOUT"
139
+ stdout
140
+ elsif exception
141
+ mf_debug "Captured Exception"
142
+ raise exception
143
+ else
144
+ mf_debug "Captured Nothing"
145
+ if fail_on_empty
146
+ fail SystemCommandError.new "No output generated or exception caught"
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,93 @@
1
+ describe "usage test" do
2
+ ROOT_PATH = File.expand_path("..", File.dirname(__FILE__))
3
+ require File.join(ROOT_PATH, "spec/support/usage_test")
4
+
5
+ it "extracts fenced code blocks, identifying the code and language" do
6
+ ruby_code = "puts 'This is ruby'"
7
+ shell_code = %(ruby -e "puts 'This is shell'")
8
+ ruby_block, shell_block = UsageTest::CodeBlock.find_code_blocks(<<-README
9
+ This is not code
10
+
11
+ ```ruby
12
+ #{ruby_code}
13
+ ```
14
+
15
+ Nope. Not code.
16
+
17
+ ```sh
18
+ #{shell_code}
19
+ ```
20
+
21
+ Not code, either.
22
+ README
23
+ )
24
+ expect(ruby_block.language).to eq("ruby")
25
+ expect(ruby_block.code).to eq(ruby_code)
26
+
27
+ expect(shell_block.language).to eq("sh")
28
+ expect(shell_block.code).to eq(shell_code)
29
+ end
30
+
31
+ context "evaluating ruby code" do
32
+ specify "succeeds when the code runs without errors" do
33
+ code = "1 + 1"
34
+ test_result = SnippetRunner.new(code, "ruby").run_code
35
+ expect(test_result.captured_output).to eq(2)
36
+ expect(test_result.success).to eq(true)
37
+ end
38
+ specify "fails when the code raises a standard error" do
39
+ code = "fail NameError.new('no name')"
40
+ test_result = SnippetRunner.new(code, "ruby").run_code
41
+ expect(test_result.captured_output).to match("NameError")
42
+ expect(test_result.captured_output).to match("no name")
43
+ expect(test_result.success).to eq(false)
44
+ end
45
+ specify "succeeds when the code exits with a zero exit status" do
46
+ code = "puts 1 + 1; exit 0"
47
+ test_result = SnippetRunner.new(code, "ruby").run_code
48
+ expect(test_result.captured_output).to match("SystemExit")
49
+ expect(test_result.success).to eq(true)
50
+ end
51
+ specify "fails when the code exits with a non-zero exit status" do
52
+ code = "puts 1 + 1; exit 1"
53
+ test_result = SnippetRunner.new(code, "ruby").run_code
54
+ expect(test_result.captured_output).to match("SystemExit")
55
+ expect(test_result.success).to eq(false)
56
+ end
57
+ end
58
+ context "evaluating shell commands" do
59
+ specify "succeeds when the command runs without errors" do
60
+ code = "which ruby"
61
+ test_result = SnippetRunner.new(code, "sh").run_code
62
+ expect(test_result.captured_output).to match("exit status 0")
63
+ expect(test_result.success).to eq(true)
64
+ end
65
+ specify "fails when the command runs with an error" do
66
+ code = "sandwhich_fu ruby"
67
+ test_result = SnippetRunner.new(code, "sh").run_code
68
+ expect(test_result.captured_output).to match(failed_command_error)
69
+ expect(test_result.success).to eq(false)
70
+ end
71
+ specify "succeeds when the code exits with a zero exit status" do
72
+ code = "sh '#{fixtures_path.join('exit0.sh').to_path}'"
73
+ test_result = SnippetRunner.new(code, "sh").run_code
74
+ expect(test_result.captured_output).to match("exit status 0")
75
+ expect(test_result.success).to eq(true)
76
+ end
77
+ specify "fails when the code exits with a non-zero exit status" do
78
+ code = "sh '#{fixtures_path.join('exit1.sh').to_path}'"
79
+ test_result = SnippetRunner.new(code, "sh").run_code
80
+ expect(test_result.captured_output).to match("exit status 1")
81
+ expect(test_result.success).to eq(false)
82
+ end
83
+ end
84
+
85
+ def failed_command_error
86
+ defined?(JRUBY_VERSION) ? "IOError" : "Errno::ENOENT"
87
+ end
88
+
89
+ def fixtures_path
90
+ fixtures_dir = File.join(File.expand_path("..", File.dirname(__FILE__)), "spec", "fixtures")
91
+ Pathname(fixtures_dir)
92
+ end
93
+ end
metadata ADDED
@@ -0,0 +1,735 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fastruby-metric_fu
3
+ version: !ruby/object:Gem::Version
4
+ version: 5.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jake Scruggs
8
+ - Sean Soper
9
+ - Andre Arko
10
+ - Petrik de Heus
11
+ - Grant McInnes
12
+ - Nick Quaranto
13
+ - Édouard Brière
14
+ - Carl Youngblood
15
+ - Richard Huang
16
+ - Dan Mayer
17
+ - Benjamin Fleischer
18
+ - Robin Curry
19
+ autorequire:
20
+ bindir: bin
21
+ cert_chain: []
22
+ date: 2020-04-28 00:00:00.000000000 Z
23
+ dependencies:
24
+ - !ruby/object:Gem::Dependency
25
+ name: flay
26
+ requirement: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: 2.0.1
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.1
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.1'
44
+ - !ruby/object:Gem::Dependency
45
+ name: churn
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: 0.0.35
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: 0.0.35
58
+ - !ruby/object:Gem::Dependency
59
+ name: flog
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '4.1'
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 4.1.1
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '4.1'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 4.1.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: reek
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 5.4.0
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: 5.4.0
92
+ - !ruby/object:Gem::Dependency
93
+ name: cane
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '2.5'
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 2.5.2
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.5'
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 2.5.2
112
+ - !ruby/object:Gem::Dependency
113
+ name: rails_best_practices
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.14'
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 1.14.3
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '1.14'
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 1.14.3
132
+ - !ruby/object:Gem::Dependency
133
+ name: metric_fu-Saikuro
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.1'
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 1.1.3
142
+ type: :runtime
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '1.1'
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 1.1.3
152
+ - !ruby/object:Gem::Dependency
153
+ name: roodi
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 5.0.0
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: 5.0.0
166
+ - !ruby/object:Gem::Dependency
167
+ name: code_metrics
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.1'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.1'
180
+ - !ruby/object:Gem::Dependency
181
+ name: redcard
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: coderay
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: multi_json
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: launchy
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '2.0'
229
+ type: :runtime
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '2.0'
236
+ - !ruby/object:Gem::Dependency
237
+ name: rspec
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '3.1'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '3.1'
250
+ - !ruby/object:Gem::Dependency
251
+ name: test_construct
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ type: :development
258
+ prerelease: false
259
+ version_requirements: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ - !ruby/object:Gem::Dependency
265
+ name: json
266
+ requirement: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ type: :development
272
+ prerelease: false
273
+ version_requirements: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ - !ruby/object:Gem::Dependency
279
+ name: simplecov
280
+ requirement: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - "<"
283
+ - !ruby/object:Gem::Version
284
+ version: '0.18'
285
+ type: :development
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - "<"
290
+ - !ruby/object:Gem::Version
291
+ version: '0.18'
292
+ description: Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics,
293
+ and Rails Best Practices. (and optionally RCov)
294
+ email: github@benjaminfleischer.com
295
+ executables:
296
+ - metric_fu
297
+ - mf-cane
298
+ - mf-churn
299
+ - mf-flay
300
+ - mf-reek
301
+ - mf-roodi
302
+ - mf-saikuro
303
+ extensions: []
304
+ extra_rdoc_files:
305
+ - HISTORY.md
306
+ - CONTRIBUTING.md
307
+ - TODO.md
308
+ - MIT-LICENSE
309
+ files:
310
+ - ".gitignore"
311
+ - ".metrics"
312
+ - ".rspec"
313
+ - ".rubocop.yml"
314
+ - ".rubocop_todo.yml"
315
+ - ".simplecov"
316
+ - ".travis.yml"
317
+ - ".yardopts"
318
+ - AUTHORS
319
+ - CONTRIBUTING.md
320
+ - CONTRIBUTORS
321
+ - DEV.md
322
+ - Gemfile
323
+ - Guardfile
324
+ - HISTORY.md
325
+ - MIT-LICENSE
326
+ - README.md
327
+ - Rakefile
328
+ - TODO.md
329
+ - appveyor.yml
330
+ - bin/metric_fu
331
+ - bin/mf-cane
332
+ - bin/mf-churn
333
+ - bin/mf-flay
334
+ - bin/mf-reek
335
+ - bin/mf-roodi
336
+ - bin/mf-saikuro
337
+ - certs/bf4.pem
338
+ - checksum/.gitkeep
339
+ - checksum/metric_fu-4.10.0.gem.sha512
340
+ - checksum/metric_fu-4.11.0.gem.sha512
341
+ - checksum/metric_fu-4.11.1.gem.sha512
342
+ - checksum/metric_fu-4.11.2.gem.sha512
343
+ - checksum/metric_fu-4.11.3.gem.sha512
344
+ - checksum/metric_fu-4.11.4.gem.sha512
345
+ - checksum/metric_fu-4.12.0.gem.sha512
346
+ - checksum/metric_fu-4.2.0.gem.sha512
347
+ - checksum/metric_fu-4.2.1.gem.sha512
348
+ - checksum/metric_fu-4.3.0.gem.sha512
349
+ - checksum/metric_fu-4.3.1.gem.sha512
350
+ - checksum/metric_fu-4.4.0.gem.sha512
351
+ - checksum/metric_fu-4.4.1.gem.sha512
352
+ - checksum/metric_fu-4.4.2.gem.sha512
353
+ - checksum/metric_fu-4.4.3.gem.sha512
354
+ - checksum/metric_fu-4.4.4.gem.sha512
355
+ - checksum/metric_fu-4.5.0.gem.sha512
356
+ - checksum/metric_fu-4.5.1.gem.sha512
357
+ - checksum/metric_fu-4.5.2.gem.sha512
358
+ - checksum/metric_fu-4.6.0.gem.sha512
359
+ - checksum/metric_fu-4.7.0.gem.sha512
360
+ - checksum/metric_fu-4.7.1.gem.sha512
361
+ - checksum/metric_fu-4.7.2.gem.sha512
362
+ - checksum/metric_fu-4.7.3.gem.sha512
363
+ - checksum/metric_fu-4.7.4.gem.sha512
364
+ - checksum/metric_fu-4.8.0.gem.sha512
365
+ - checksum/metric_fu-4.9.0.gem.sha512
366
+ - config/roodi_config.yml
367
+ - config/rubocop.yml
368
+ - gem_tasks/build.rake
369
+ - gem_tasks/rubocop.rake
370
+ - gem_tasks/usage_test.rake
371
+ - gem_tasks/yard.rake
372
+ - lib/metric_fu.rb
373
+ - lib/metric_fu/calculate.rb
374
+ - lib/metric_fu/cli/client.rb
375
+ - lib/metric_fu/cli/helper.rb
376
+ - lib/metric_fu/cli/parser.rb
377
+ - lib/metric_fu/configuration.rb
378
+ - lib/metric_fu/constantize.rb
379
+ - lib/metric_fu/data_structures/line_numbers.rb
380
+ - lib/metric_fu/data_structures/location.rb
381
+ - lib/metric_fu/data_structures/sexp_node.rb
382
+ - lib/metric_fu/environment.rb
383
+ - lib/metric_fu/errors/analysis_error.rb
384
+ - lib/metric_fu/formatter.rb
385
+ - lib/metric_fu/formatter/html.rb
386
+ - lib/metric_fu/formatter/syntax.rb
387
+ - lib/metric_fu/formatter/yaml.rb
388
+ - lib/metric_fu/gem_run.rb
389
+ - lib/metric_fu/gem_version.rb
390
+ - lib/metric_fu/generator.rb
391
+ - lib/metric_fu/io.rb
392
+ - lib/metric_fu/loader.rb
393
+ - lib/metric_fu/logger.rb
394
+ - lib/metric_fu/logging/mf_debugger.rb
395
+ - lib/metric_fu/metric.rb
396
+ - lib/metric_fu/metrics/cane/generator.rb
397
+ - lib/metric_fu/metrics/cane/grapher.rb
398
+ - lib/metric_fu/metrics/cane/metric.rb
399
+ - lib/metric_fu/metrics/cane/report.html.erb
400
+ - lib/metric_fu/metrics/cane/violations.rb
401
+ - lib/metric_fu/metrics/churn/generator.rb
402
+ - lib/metric_fu/metrics/churn/hotspot.rb
403
+ - lib/metric_fu/metrics/churn/metric.rb
404
+ - lib/metric_fu/metrics/churn/report.html.erb
405
+ - lib/metric_fu/metrics/flay/generator.rb
406
+ - lib/metric_fu/metrics/flay/grapher.rb
407
+ - lib/metric_fu/metrics/flay/hotspot.rb
408
+ - lib/metric_fu/metrics/flay/metric.rb
409
+ - lib/metric_fu/metrics/flay/report.html.erb
410
+ - lib/metric_fu/metrics/flog/generator.rb
411
+ - lib/metric_fu/metrics/flog/grapher.rb
412
+ - lib/metric_fu/metrics/flog/hotspot.rb
413
+ - lib/metric_fu/metrics/flog/metric.rb
414
+ - lib/metric_fu/metrics/flog/report.html.erb
415
+ - lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb
416
+ - lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb
417
+ - lib/metric_fu/metrics/hotspots/analysis/grouping.rb
418
+ - lib/metric_fu/metrics/hotspots/analysis/groupings.rb
419
+ - lib/metric_fu/metrics/hotspots/analysis/problems.rb
420
+ - lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb
421
+ - lib/metric_fu/metrics/hotspots/analysis/ranking.rb
422
+ - lib/metric_fu/metrics/hotspots/analysis/rankings.rb
423
+ - lib/metric_fu/metrics/hotspots/analysis/record.rb
424
+ - lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb
425
+ - lib/metric_fu/metrics/hotspots/analysis/table.rb
426
+ - lib/metric_fu/metrics/hotspots/generator.rb
427
+ - lib/metric_fu/metrics/hotspots/hotspot.rb
428
+ - lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb
429
+ - lib/metric_fu/metrics/hotspots/metric.rb
430
+ - lib/metric_fu/metrics/hotspots/report.html.erb
431
+ - lib/metric_fu/metrics/rails_best_practices/generator.rb
432
+ - lib/metric_fu/metrics/rails_best_practices/grapher.rb
433
+ - lib/metric_fu/metrics/rails_best_practices/metric.rb
434
+ - lib/metric_fu/metrics/rails_best_practices/report.html.erb
435
+ - lib/metric_fu/metrics/rcov/external_client.rb
436
+ - lib/metric_fu/metrics/rcov/generator.rb
437
+ - lib/metric_fu/metrics/rcov/grapher.rb
438
+ - lib/metric_fu/metrics/rcov/hotspot.rb
439
+ - lib/metric_fu/metrics/rcov/metric.rb
440
+ - lib/metric_fu/metrics/rcov/rcov_format_coverage.rb
441
+ - lib/metric_fu/metrics/rcov/rcov_line.rb
442
+ - lib/metric_fu/metrics/rcov/report.html.erb
443
+ - lib/metric_fu/metrics/rcov/simplecov_formatter.rb
444
+ - lib/metric_fu/metrics/reek/generator.rb
445
+ - lib/metric_fu/metrics/reek/grapher.rb
446
+ - lib/metric_fu/metrics/reek/hotspot.rb
447
+ - lib/metric_fu/metrics/reek/metric.rb
448
+ - lib/metric_fu/metrics/reek/report.html.erb
449
+ - lib/metric_fu/metrics/roodi/generator.rb
450
+ - lib/metric_fu/metrics/roodi/grapher.rb
451
+ - lib/metric_fu/metrics/roodi/hotspot.rb
452
+ - lib/metric_fu/metrics/roodi/metric.rb
453
+ - lib/metric_fu/metrics/roodi/report.html.erb
454
+ - lib/metric_fu/metrics/saikuro/generator.rb
455
+ - lib/metric_fu/metrics/saikuro/hotspot.rb
456
+ - lib/metric_fu/metrics/saikuro/metric.rb
457
+ - lib/metric_fu/metrics/saikuro/parsing_element.rb
458
+ - lib/metric_fu/metrics/saikuro/report.html.erb
459
+ - lib/metric_fu/metrics/saikuro/scratch_file.rb
460
+ - lib/metric_fu/metrics/stats/generator.rb
461
+ - lib/metric_fu/metrics/stats/grapher.rb
462
+ - lib/metric_fu/metrics/stats/hotspot.rb
463
+ - lib/metric_fu/metrics/stats/metric.rb
464
+ - lib/metric_fu/metrics/stats/report.html.erb
465
+ - lib/metric_fu/reporter.rb
466
+ - lib/metric_fu/reporting/graphs/graph.rb
467
+ - lib/metric_fu/reporting/graphs/grapher.rb
468
+ - lib/metric_fu/reporting/result.rb
469
+ - lib/metric_fu/run.rb
470
+ - lib/metric_fu/tasks/metric_fu.rake
471
+ - lib/metric_fu/templates/_graph.html.erb
472
+ - lib/metric_fu/templates/_report_footer.html.erb
473
+ - lib/metric_fu/templates/configuration.rb
474
+ - lib/metric_fu/templates/css/bluff.css
475
+ - lib/metric_fu/templates/css/buttons.css
476
+ - lib/metric_fu/templates/css/default.css
477
+ - lib/metric_fu/templates/css/integrity.css
478
+ - lib/metric_fu/templates/css/rcov.css
479
+ - lib/metric_fu/templates/css/reset.css
480
+ - lib/metric_fu/templates/css/syntax.css
481
+ - lib/metric_fu/templates/index.html.erb
482
+ - lib/metric_fu/templates/javascripts/bluff-min.js
483
+ - lib/metric_fu/templates/javascripts/bluff_graph.js
484
+ - lib/metric_fu/templates/javascripts/excanvas.js
485
+ - lib/metric_fu/templates/javascripts/highcharts.js
486
+ - lib/metric_fu/templates/javascripts/highcharts_graph.js
487
+ - lib/metric_fu/templates/javascripts/js-class.js
488
+ - lib/metric_fu/templates/javascripts/standalone-framework.js
489
+ - lib/metric_fu/templates/javascripts/utils.js
490
+ - lib/metric_fu/templates/layout.html.erb
491
+ - lib/metric_fu/templates/metrics_template.rb
492
+ - lib/metric_fu/templates/report.html.erb
493
+ - lib/metric_fu/templates/report.rb
494
+ - lib/metric_fu/templates/template.rb
495
+ - lib/metric_fu/utility.rb
496
+ - lib/metric_fu/version.rb
497
+ - metric_fu.gemspec
498
+ - spec/capture_warnings.rb
499
+ - spec/cli/helper_spec.rb
500
+ - spec/dummy/.gitignore
501
+ - spec/dummy/.gitkeep
502
+ - spec/dummy/lib/.gitkeep
503
+ - spec/dummy/lib/bad_encoding.rb
504
+ - spec/dummy/spec/.gitkeep
505
+ - spec/fixtures/20090630.yml
506
+ - spec/fixtures/coverage-153.rb
507
+ - spec/fixtures/coverage.rb
508
+ - spec/fixtures/exit0.sh
509
+ - spec/fixtures/exit1.sh
510
+ - spec/fixtures/hotspots/flog.yml
511
+ - spec/fixtures/hotspots/generator.yml
512
+ - spec/fixtures/hotspots/generator_analysis.yml
513
+ - spec/fixtures/hotspots/reek.yml
514
+ - spec/fixtures/hotspots/roodi.yml
515
+ - spec/fixtures/hotspots/saikuro.yml
516
+ - spec/fixtures/hotspots/several_metrics.yml
517
+ - spec/fixtures/hotspots/stats.yml
518
+ - spec/fixtures/hotspots/three_metrics_on_same_file.yml
519
+ - spec/fixtures/line_numbers/foo.rb
520
+ - spec/fixtures/line_numbers/module.rb
521
+ - spec/fixtures/line_numbers/module_surrounds_class.rb
522
+ - spec/fixtures/line_numbers/two_classes.rb
523
+ - spec/fixtures/metric_missing.yml
524
+ - spec/fixtures/rcov_output.txt
525
+ - spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html
526
+ - spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html
527
+ - spec/fixtures/saikuro/index_cyclo.html
528
+ - spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html
529
+ - spec/metric_fu/calculate_spec.rb
530
+ - spec/metric_fu/configuration_spec.rb
531
+ - spec/metric_fu/data_structures/line_numbers_spec.rb
532
+ - spec/metric_fu/data_structures/location_spec.rb
533
+ - spec/metric_fu/formatter/configuration_spec.rb
534
+ - spec/metric_fu/formatter/html_spec.rb
535
+ - spec/metric_fu/formatter/yaml_spec.rb
536
+ - spec/metric_fu/formatter_spec.rb
537
+ - spec/metric_fu/gem_version_spec.rb
538
+ - spec/metric_fu/generator_spec.rb
539
+ - spec/metric_fu/loader_spec.rb
540
+ - spec/metric_fu/metric_spec.rb
541
+ - spec/metric_fu/metrics/cane/configuration_spec.rb
542
+ - spec/metric_fu/metrics/cane/generator_spec.rb
543
+ - spec/metric_fu/metrics/churn/configuration_spec.rb
544
+ - spec/metric_fu/metrics/churn/generator_spec.rb
545
+ - spec/metric_fu/metrics/flay/configuration_spec.rb
546
+ - spec/metric_fu/metrics/flay/generator_spec.rb
547
+ - spec/metric_fu/metrics/flay/grapher_spec.rb
548
+ - spec/metric_fu/metrics/flog/configuration_spec.rb
549
+ - spec/metric_fu/metrics/flog/generator_spec.rb
550
+ - spec/metric_fu/metrics/flog/grapher_spec.rb
551
+ - spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb
552
+ - spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb
553
+ - spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb
554
+ - spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb
555
+ - spec/metric_fu/metrics/hotspots/analysis/table_spec.rb
556
+ - spec/metric_fu/metrics/hotspots/generator_spec.rb
557
+ - spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb
558
+ - spec/metric_fu/metrics/hotspots/hotspot_spec.rb
559
+ - spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb
560
+ - spec/metric_fu/metrics/rails_best_practices/generator_spec.rb
561
+ - spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb
562
+ - spec/metric_fu/metrics/rcov/configuration_spec.rb
563
+ - spec/metric_fu/metrics/rcov/generator_spec.rb
564
+ - spec/metric_fu/metrics/rcov/grapher_spec.rb
565
+ - spec/metric_fu/metrics/rcov/hotspot_spec.rb
566
+ - spec/metric_fu/metrics/rcov/rcov_line_spec.rb
567
+ - spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb
568
+ - spec/metric_fu/metrics/reek/configuration_spec.rb
569
+ - spec/metric_fu/metrics/reek/generator_spec.rb
570
+ - spec/metric_fu/metrics/reek/grapher_spec.rb
571
+ - spec/metric_fu/metrics/roodi/configuration_spec.rb
572
+ - spec/metric_fu/metrics/roodi/generator_spec.rb
573
+ - spec/metric_fu/metrics/roodi/grapher_spec.rb
574
+ - spec/metric_fu/metrics/saikuro/configuration_spec.rb
575
+ - spec/metric_fu/metrics/saikuro/generator_spec.rb
576
+ - spec/metric_fu/metrics/stats/generator_spec.rb
577
+ - spec/metric_fu/metrics/stats/grapher_spec.rb
578
+ - spec/metric_fu/reporter_spec.rb
579
+ - spec/metric_fu/reporting/graphs/graph_spec.rb
580
+ - spec/metric_fu/reporting/graphs/grapher_spec.rb
581
+ - spec/metric_fu/reporting/result_spec.rb
582
+ - spec/metric_fu/run_spec.rb
583
+ - spec/metric_fu/templates/configuration_spec.rb
584
+ - spec/metric_fu/templates/metrics_template_spec.rb
585
+ - spec/metric_fu/templates/report_spec.rb
586
+ - spec/metric_fu/templates/template_spec.rb
587
+ - spec/metric_fu/utility_spec.rb
588
+ - spec/metric_fu_spec.rb
589
+ - spec/quality_spec.rb
590
+ - spec/shared/configured.rb
591
+ - spec/shared/test_coverage.rb
592
+ - spec/spec_helper.rb
593
+ - spec/support/.metrics
594
+ - spec/support/deferred_garbaged_collection.rb
595
+ - spec/support/helper_methods.rb
596
+ - spec/support/matcher_create_file.rb
597
+ - spec/support/matcher_create_files.rb
598
+ - spec/support/samples/reek/alfa.rb
599
+ - spec/support/suite.rb
600
+ - spec/support/test_fixtures.rb
601
+ - spec/support/timeout.rb
602
+ - spec/support/usage_test.rb
603
+ - spec/usage_test_spec.rb
604
+ homepage: https://github.com/fastruby/metric_fu
605
+ licenses:
606
+ - MIT
607
+ metadata: {}
608
+ post_install_message:
609
+ rdoc_options:
610
+ - "--main"
611
+ - README.md
612
+ require_paths:
613
+ - lib
614
+ required_ruby_version: !ruby/object:Gem::Requirement
615
+ requirements:
616
+ - - ">="
617
+ - !ruby/object:Gem::Version
618
+ version: 1.9.0
619
+ required_rubygems_version: !ruby/object:Gem::Requirement
620
+ requirements:
621
+ - - ">="
622
+ - !ruby/object:Gem::Version
623
+ version: 1.3.6
624
+ requirements: []
625
+ rubygems_version: 3.0.6
626
+ signing_key:
627
+ specification_version: 4
628
+ summary: A fistful of code metrics, with awesome templates and graphs
629
+ test_files:
630
+ - spec/capture_warnings.rb
631
+ - spec/cli/helper_spec.rb
632
+ - spec/dummy/.gitignore
633
+ - spec/dummy/.gitkeep
634
+ - spec/dummy/lib/.gitkeep
635
+ - spec/dummy/lib/bad_encoding.rb
636
+ - spec/dummy/spec/.gitkeep
637
+ - spec/fixtures/20090630.yml
638
+ - spec/fixtures/coverage-153.rb
639
+ - spec/fixtures/coverage.rb
640
+ - spec/fixtures/exit0.sh
641
+ - spec/fixtures/exit1.sh
642
+ - spec/fixtures/hotspots/flog.yml
643
+ - spec/fixtures/hotspots/generator.yml
644
+ - spec/fixtures/hotspots/generator_analysis.yml
645
+ - spec/fixtures/hotspots/reek.yml
646
+ - spec/fixtures/hotspots/roodi.yml
647
+ - spec/fixtures/hotspots/saikuro.yml
648
+ - spec/fixtures/hotspots/several_metrics.yml
649
+ - spec/fixtures/hotspots/stats.yml
650
+ - spec/fixtures/hotspots/three_metrics_on_same_file.yml
651
+ - spec/fixtures/line_numbers/foo.rb
652
+ - spec/fixtures/line_numbers/module.rb
653
+ - spec/fixtures/line_numbers/module_surrounds_class.rb
654
+ - spec/fixtures/line_numbers/two_classes.rb
655
+ - spec/fixtures/metric_missing.yml
656
+ - spec/fixtures/rcov_output.txt
657
+ - spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html
658
+ - spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html
659
+ - spec/fixtures/saikuro/index_cyclo.html
660
+ - spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html
661
+ - spec/metric_fu/calculate_spec.rb
662
+ - spec/metric_fu/configuration_spec.rb
663
+ - spec/metric_fu/data_structures/line_numbers_spec.rb
664
+ - spec/metric_fu/data_structures/location_spec.rb
665
+ - spec/metric_fu/formatter/configuration_spec.rb
666
+ - spec/metric_fu/formatter/html_spec.rb
667
+ - spec/metric_fu/formatter/yaml_spec.rb
668
+ - spec/metric_fu/formatter_spec.rb
669
+ - spec/metric_fu/gem_version_spec.rb
670
+ - spec/metric_fu/generator_spec.rb
671
+ - spec/metric_fu/loader_spec.rb
672
+ - spec/metric_fu/metric_spec.rb
673
+ - spec/metric_fu/metrics/cane/configuration_spec.rb
674
+ - spec/metric_fu/metrics/cane/generator_spec.rb
675
+ - spec/metric_fu/metrics/churn/configuration_spec.rb
676
+ - spec/metric_fu/metrics/churn/generator_spec.rb
677
+ - spec/metric_fu/metrics/flay/configuration_spec.rb
678
+ - spec/metric_fu/metrics/flay/generator_spec.rb
679
+ - spec/metric_fu/metrics/flay/grapher_spec.rb
680
+ - spec/metric_fu/metrics/flog/configuration_spec.rb
681
+ - spec/metric_fu/metrics/flog/generator_spec.rb
682
+ - spec/metric_fu/metrics/flog/grapher_spec.rb
683
+ - spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb
684
+ - spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb
685
+ - spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb
686
+ - spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb
687
+ - spec/metric_fu/metrics/hotspots/analysis/table_spec.rb
688
+ - spec/metric_fu/metrics/hotspots/generator_spec.rb
689
+ - spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb
690
+ - spec/metric_fu/metrics/hotspots/hotspot_spec.rb
691
+ - spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb
692
+ - spec/metric_fu/metrics/rails_best_practices/generator_spec.rb
693
+ - spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb
694
+ - spec/metric_fu/metrics/rcov/configuration_spec.rb
695
+ - spec/metric_fu/metrics/rcov/generator_spec.rb
696
+ - spec/metric_fu/metrics/rcov/grapher_spec.rb
697
+ - spec/metric_fu/metrics/rcov/hotspot_spec.rb
698
+ - spec/metric_fu/metrics/rcov/rcov_line_spec.rb
699
+ - spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb
700
+ - spec/metric_fu/metrics/reek/configuration_spec.rb
701
+ - spec/metric_fu/metrics/reek/generator_spec.rb
702
+ - spec/metric_fu/metrics/reek/grapher_spec.rb
703
+ - spec/metric_fu/metrics/roodi/configuration_spec.rb
704
+ - spec/metric_fu/metrics/roodi/generator_spec.rb
705
+ - spec/metric_fu/metrics/roodi/grapher_spec.rb
706
+ - spec/metric_fu/metrics/saikuro/configuration_spec.rb
707
+ - spec/metric_fu/metrics/saikuro/generator_spec.rb
708
+ - spec/metric_fu/metrics/stats/generator_spec.rb
709
+ - spec/metric_fu/metrics/stats/grapher_spec.rb
710
+ - spec/metric_fu/reporter_spec.rb
711
+ - spec/metric_fu/reporting/graphs/graph_spec.rb
712
+ - spec/metric_fu/reporting/graphs/grapher_spec.rb
713
+ - spec/metric_fu/reporting/result_spec.rb
714
+ - spec/metric_fu/run_spec.rb
715
+ - spec/metric_fu/templates/configuration_spec.rb
716
+ - spec/metric_fu/templates/metrics_template_spec.rb
717
+ - spec/metric_fu/templates/report_spec.rb
718
+ - spec/metric_fu/templates/template_spec.rb
719
+ - spec/metric_fu/utility_spec.rb
720
+ - spec/metric_fu_spec.rb
721
+ - spec/quality_spec.rb
722
+ - spec/shared/configured.rb
723
+ - spec/shared/test_coverage.rb
724
+ - spec/spec_helper.rb
725
+ - spec/support/.metrics
726
+ - spec/support/deferred_garbaged_collection.rb
727
+ - spec/support/helper_methods.rb
728
+ - spec/support/matcher_create_file.rb
729
+ - spec/support/matcher_create_files.rb
730
+ - spec/support/samples/reek/alfa.rb
731
+ - spec/support/suite.rb
732
+ - spec/support/test_fixtures.rb
733
+ - spec/support/timeout.rb
734
+ - spec/support/usage_test.rb
735
+ - spec/usage_test_spec.rb