fastruby-metric_fu 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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