code_metric_fu 4.14.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 +22 -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 +74 -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 +31 -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/calculate.rb +10 -0
  65. data/lib/metric_fu/cli/client.rb +26 -0
  66. data/lib/metric_fu/cli/helper.rb +80 -0
  67. data/lib/metric_fu/cli/parser.rb +138 -0
  68. data/lib/metric_fu/configuration.rb +150 -0
  69. data/lib/metric_fu/constantize.rb +57 -0
  70. data/lib/metric_fu/data_structures/line_numbers.rb +112 -0
  71. data/lib/metric_fu/data_structures/location.rb +110 -0
  72. data/lib/metric_fu/data_structures/sexp_node.rb +107 -0
  73. data/lib/metric_fu/environment.rb +129 -0
  74. data/lib/metric_fu/errors/analysis_error.rb +4 -0
  75. data/lib/metric_fu/formatter/html.rb +96 -0
  76. data/lib/metric_fu/formatter/syntax.rb +45 -0
  77. data/lib/metric_fu/formatter/yaml.rb +18 -0
  78. data/lib/metric_fu/formatter.rb +40 -0
  79. data/lib/metric_fu/gem_run.rb +70 -0
  80. data/lib/metric_fu/gem_version.rb +92 -0
  81. data/lib/metric_fu/generator.rb +135 -0
  82. data/lib/metric_fu/io.rb +132 -0
  83. data/lib/metric_fu/loader.rb +105 -0
  84. data/lib/metric_fu/logger.rb +62 -0
  85. data/lib/metric_fu/logging/mf_debugger.rb +23 -0
  86. data/lib/metric_fu/metric.rb +143 -0
  87. data/lib/metric_fu/metrics/cane/generator.rb +95 -0
  88. data/lib/metric_fu/metrics/cane/grapher.rb +37 -0
  89. data/lib/metric_fu/metrics/cane/metric.rb +34 -0
  90. data/lib/metric_fu/metrics/cane/report.html.erb +87 -0
  91. data/lib/metric_fu/metrics/cane/violations.rb +46 -0
  92. data/lib/metric_fu/metrics/churn/generator.rb +37 -0
  93. data/lib/metric_fu/metrics/churn/hotspot.rb +43 -0
  94. data/lib/metric_fu/metrics/churn/metric.rb +29 -0
  95. data/lib/metric_fu/metrics/churn/report.html.erb +58 -0
  96. data/lib/metric_fu/metrics/flay/generator.rb +51 -0
  97. data/lib/metric_fu/metrics/flay/grapher.rb +37 -0
  98. data/lib/metric_fu/metrics/flay/hotspot.rb +52 -0
  99. data/lib/metric_fu/metrics/flay/metric.rb +28 -0
  100. data/lib/metric_fu/metrics/flay/report.html.erb +29 -0
  101. data/lib/metric_fu/metrics/flog/generator.rb +113 -0
  102. data/lib/metric_fu/metrics/flog/grapher.rb +77 -0
  103. data/lib/metric_fu/metrics/flog/hotspot.rb +46 -0
  104. data/lib/metric_fu/metrics/flog/metric.rb +29 -0
  105. data/lib/metric_fu/metrics/flog/report.html.erb +50 -0
  106. data/lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb +34 -0
  107. data/lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb +114 -0
  108. data/lib/metric_fu/metrics/hotspots/analysis/grouping.rb +23 -0
  109. data/lib/metric_fu/metrics/hotspots/analysis/groupings.rb +12 -0
  110. data/lib/metric_fu/metrics/hotspots/analysis/problems.rb +20 -0
  111. data/lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb +70 -0
  112. data/lib/metric_fu/metrics/hotspots/analysis/ranking.rb +29 -0
  113. data/lib/metric_fu/metrics/hotspots/analysis/rankings.rb +91 -0
  114. data/lib/metric_fu/metrics/hotspots/analysis/record.rb +32 -0
  115. data/lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb +24 -0
  116. data/lib/metric_fu/metrics/hotspots/analysis/table.rb +67 -0
  117. data/lib/metric_fu/metrics/hotspots/generator.rb +40 -0
  118. data/lib/metric_fu/metrics/hotspots/hotspot.rb +87 -0
  119. data/lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb +61 -0
  120. data/lib/metric_fu/metrics/hotspots/metric.rb +20 -0
  121. data/lib/metric_fu/metrics/hotspots/report.html.erb +60 -0
  122. data/lib/metric_fu/metrics/rails_best_practices/generator.rb +47 -0
  123. data/lib/metric_fu/metrics/rails_best_practices/grapher.rb +38 -0
  124. data/lib/metric_fu/metrics/rails_best_practices/metric.rb +31 -0
  125. data/lib/metric_fu/metrics/rails_best_practices/report.html.erb +22 -0
  126. data/lib/metric_fu/metrics/rcov/external_client.rb +22 -0
  127. data/lib/metric_fu/metrics/rcov/generator.rb +75 -0
  128. data/lib/metric_fu/metrics/rcov/grapher.rb +37 -0
  129. data/lib/metric_fu/metrics/rcov/hotspot.rb +46 -0
  130. data/lib/metric_fu/metrics/rcov/metric.rb +61 -0
  131. data/lib/metric_fu/metrics/rcov/rcov_format_coverage.rb +149 -0
  132. data/lib/metric_fu/metrics/rcov/rcov_line.rb +48 -0
  133. data/lib/metric_fu/metrics/rcov/report.html.erb +40 -0
  134. data/lib/metric_fu/metrics/rcov/simplecov_formatter.rb +74 -0
  135. data/lib/metric_fu/metrics/reek/generator.rb +97 -0
  136. data/lib/metric_fu/metrics/reek/grapher.rb +55 -0
  137. data/lib/metric_fu/metrics/reek/hotspot.rb +95 -0
  138. data/lib/metric_fu/metrics/reek/metric.rb +26 -0
  139. data/lib/metric_fu/metrics/reek/report.html.erb +35 -0
  140. data/lib/metric_fu/metrics/roodi/generator.rb +41 -0
  141. data/lib/metric_fu/metrics/roodi/grapher.rb +37 -0
  142. data/lib/metric_fu/metrics/roodi/hotspot.rb +39 -0
  143. data/lib/metric_fu/metrics/roodi/metric.rb +24 -0
  144. data/lib/metric_fu/metrics/roodi/report.html.erb +22 -0
  145. data/lib/metric_fu/metrics/saikuro/generator.rb +145 -0
  146. data/lib/metric_fu/metrics/saikuro/hotspot.rb +51 -0
  147. data/lib/metric_fu/metrics/saikuro/metric.rb +31 -0
  148. data/lib/metric_fu/metrics/saikuro/parsing_element.rb +37 -0
  149. data/lib/metric_fu/metrics/saikuro/report.html.erb +71 -0
  150. data/lib/metric_fu/metrics/saikuro/scratch_file.rb +108 -0
  151. data/lib/metric_fu/metrics/stats/generator.rb +82 -0
  152. data/lib/metric_fu/metrics/stats/grapher.rb +40 -0
  153. data/lib/metric_fu/metrics/stats/hotspot.rb +35 -0
  154. data/lib/metric_fu/metrics/stats/metric.rb +28 -0
  155. data/lib/metric_fu/metrics/stats/report.html.erb +44 -0
  156. data/lib/metric_fu/reporter.rb +37 -0
  157. data/lib/metric_fu/reporting/graphs/graph.rb +69 -0
  158. data/lib/metric_fu/reporting/graphs/grapher.rb +66 -0
  159. data/lib/metric_fu/reporting/result.rb +59 -0
  160. data/lib/metric_fu/run.rb +82 -0
  161. data/lib/metric_fu/tasks/metric_fu.rake +54 -0
  162. data/lib/metric_fu/templates/_gem_info.html.erb +8 -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 +13 -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 +41 -0
  183. data/lib/metric_fu/templates/metrics_template.rb +86 -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 +247 -0
  187. data/lib/metric_fu/utility.rb +79 -0
  188. data/lib/metric_fu/version.rb +9 -0
  189. data/lib/metric_fu.rb +143 -0
  190. data/metric_fu.gemspec +72 -0
  191. data/spec/capture_warnings.rb +55 -0
  192. data/spec/cli/helper_spec.rb +165 -0
  193. data/spec/dummy/.gitignore +1 -0
  194. data/spec/dummy/.gitkeep +0 -0
  195. data/spec/dummy/.metrics +4 -0
  196. data/spec/dummy/lib/.gitkeep +0 -0
  197. data/spec/dummy/lib/bad_encoding.rb +6 -0
  198. data/spec/dummy/spec/.gitkeep +0 -0
  199. data/spec/fixtures/20090630.yml +7922 -0
  200. data/spec/fixtures/coverage-153.rb +11 -0
  201. data/spec/fixtures/coverage.rb +13 -0
  202. data/spec/fixtures/exit0.sh +3 -0
  203. data/spec/fixtures/exit1.sh +3 -0
  204. data/spec/fixtures/hotspots/flog.yml +86 -0
  205. data/spec/fixtures/hotspots/generator.yml +47 -0
  206. data/spec/fixtures/hotspots/generator_analysis.yml +53 -0
  207. data/spec/fixtures/hotspots/reek.yml +14 -0
  208. data/spec/fixtures/hotspots/roodi.yml +13 -0
  209. data/spec/fixtures/hotspots/saikuro.yml +27 -0
  210. data/spec/fixtures/hotspots/several_metrics.yml +47 -0
  211. data/spec/fixtures/hotspots/stats.yml +4 -0
  212. data/spec/fixtures/hotspots/three_metrics_on_same_file.yml +36 -0
  213. data/spec/fixtures/line_numbers/foo.rb +33 -0
  214. data/spec/fixtures/line_numbers/module.rb +11 -0
  215. data/spec/fixtures/line_numbers/module_surrounds_class.rb +15 -0
  216. data/spec/fixtures/line_numbers/two_classes.rb +11 -0
  217. data/spec/fixtures/metric_missing.yml +1 -0
  218. data/spec/fixtures/rcov_output.txt +135 -0
  219. data/spec/fixtures/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
  220. data/spec/fixtures/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
  221. data/spec/fixtures/saikuro/index_cyclo.html +155 -0
  222. data/spec/fixtures/saikuro_sfiles/thing.rb_cyclo.html +11 -0
  223. data/spec/metric_fu/calculate_spec.rb +21 -0
  224. data/spec/metric_fu/configuration_spec.rb +90 -0
  225. data/spec/metric_fu/data_structures/line_numbers_spec.rb +63 -0
  226. data/spec/metric_fu/data_structures/location_spec.rb +110 -0
  227. data/spec/metric_fu/formatter/configuration_spec.rb +44 -0
  228. data/spec/metric_fu/formatter/html_spec.rb +138 -0
  229. data/spec/metric_fu/formatter/yaml_spec.rb +61 -0
  230. data/spec/metric_fu/formatter_spec.rb +49 -0
  231. data/spec/metric_fu/gem_version_spec.rb +12 -0
  232. data/spec/metric_fu/generator_spec.rb +130 -0
  233. data/spec/metric_fu/loader_spec.rb +10 -0
  234. data/spec/metric_fu/metric_spec.rb +46 -0
  235. data/spec/metric_fu/metrics/cane/configuration_spec.rb +22 -0
  236. data/spec/metric_fu/metrics/cane/generator_spec.rb +184 -0
  237. data/spec/metric_fu/metrics/churn/configuration_spec.rb +13 -0
  238. data/spec/metric_fu/metrics/churn/generator_spec.rb +64 -0
  239. data/spec/metric_fu/metrics/flay/configuration_spec.rb +13 -0
  240. data/spec/metric_fu/metrics/flay/generator_spec.rb +105 -0
  241. data/spec/metric_fu/metrics/flay/grapher_spec.rb +57 -0
  242. data/spec/metric_fu/metrics/flog/configuration_spec.rb +18 -0
  243. data/spec/metric_fu/metrics/flog/generator_spec.rb +77 -0
  244. data/spec/metric_fu/metrics/flog/grapher_spec.rb +107 -0
  245. data/spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb +104 -0
  246. data/spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb +71 -0
  247. data/spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb +30 -0
  248. data/spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb +97 -0
  249. data/spec/metric_fu/metrics/hotspots/analysis/table_spec.rb +6 -0
  250. data/spec/metric_fu/metrics/hotspots/generator_spec.rb +46 -0
  251. data/spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb +10 -0
  252. data/spec/metric_fu/metrics/hotspots/hotspot_spec.rb +16 -0
  253. data/spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb +55 -0
  254. data/spec/metric_fu/metrics/rails_best_practices/generator_spec.rb +33 -0
  255. data/spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb +62 -0
  256. data/spec/metric_fu/metrics/rcov/configuration_spec.rb +28 -0
  257. data/spec/metric_fu/metrics/rcov/generator_spec.rb +22 -0
  258. data/spec/metric_fu/metrics/rcov/grapher_spec.rb +57 -0
  259. data/spec/metric_fu/metrics/rcov/hotspot_spec.rb +20 -0
  260. data/spec/metric_fu/metrics/rcov/rcov_line_spec.rb +89 -0
  261. data/spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb +67 -0
  262. data/spec/metric_fu/metrics/reek/configuration_spec.rb +13 -0
  263. data/spec/metric_fu/metrics/reek/generator_spec.rb +169 -0
  264. data/spec/metric_fu/metrics/reek/grapher_spec.rb +66 -0
  265. data/spec/metric_fu/metrics/roodi/configuration_spec.rb +14 -0
  266. data/spec/metric_fu/metrics/roodi/generator_spec.rb +82 -0
  267. data/spec/metric_fu/metrics/roodi/grapher_spec.rb +57 -0
  268. data/spec/metric_fu/metrics/saikuro/configuration_spec.rb +25 -0
  269. data/spec/metric_fu/metrics/saikuro/generator_spec.rb +71 -0
  270. data/spec/metric_fu/metrics/stats/generator_spec.rb +96 -0
  271. data/spec/metric_fu/metrics/stats/grapher_spec.rb +69 -0
  272. data/spec/metric_fu/reporter_spec.rb +41 -0
  273. data/spec/metric_fu/reporting/graphs/graph_spec.rb +44 -0
  274. data/spec/metric_fu/reporting/graphs/grapher_spec.rb +24 -0
  275. data/spec/metric_fu/reporting/result_spec.rb +50 -0
  276. data/spec/metric_fu/run_spec.rb +197 -0
  277. data/spec/metric_fu/templates/configuration_spec.rb +51 -0
  278. data/spec/metric_fu/templates/metrics_template_spec.rb +11 -0
  279. data/spec/metric_fu/templates/report_spec.rb +15 -0
  280. data/spec/metric_fu/templates/template_spec.rb +233 -0
  281. data/spec/metric_fu/utility_spec.rb +12 -0
  282. data/spec/metric_fu_spec.rb +33 -0
  283. data/spec/quality_spec.rb +114 -0
  284. data/spec/shared/configured.rb +45 -0
  285. data/spec/shared/test_coverage.rb +95 -0
  286. data/spec/spec_helper.rb +54 -0
  287. data/spec/support/deferred_garbaged_collection.rb +33 -0
  288. data/spec/support/helper_methods.rb +32 -0
  289. data/spec/support/matcher_create_file.rb +37 -0
  290. data/spec/support/matcher_create_files.rb +43 -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 +757 -0
@@ -0,0 +1,169 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "reek/generator" }
3
+
4
+ describe MetricFu::ReekGenerator do
5
+ describe "emit" do
6
+ let(:options) { { dirs_to_reek: [] } }
7
+ let(:files_to_analyze) { ["lib/foo.rb", "lib/bar.rb"] }
8
+ let(:reek) { MetricFu::ReekGenerator.new(options) }
9
+
10
+ before :each do
11
+ allow(reek).to receive(:files_to_analyze).and_return(files_to_analyze)
12
+ end
13
+
14
+ it "includes config file pattern into reek parameters when specified" do
15
+ options.merge!(config_file_pattern: "lib/config/*.reek")
16
+
17
+ expect(reek).to receive(:run!) do |_files, config_files|
18
+ expect(config_files).to eq(["lib/config/*.reek"])
19
+ end.and_return("")
20
+
21
+ reek.emit
22
+ end
23
+
24
+ it "passes an empty array when no config file pattern is specified" do
25
+ expect(reek).to receive(:run!) do |_files, config_files|
26
+ expect(config_files).to eq([])
27
+ end.and_return("")
28
+
29
+ reek.emit
30
+ end
31
+
32
+ it "includes files to analyze into reek parameters" do
33
+ expect(reek).to receive(:run!) do |files, _config_files|
34
+ expect(files).to eq(["lib/foo.rb", "lib/bar.rb"])
35
+ end.and_return("")
36
+
37
+ reek.emit
38
+ end
39
+ end
40
+
41
+ describe "analyze method" do
42
+ before :each do
43
+ MetricFu::Configuration.run {}
44
+ allow(File).to receive(:directory?).and_return(true)
45
+ @reek = MetricFu::ReekGenerator.new
46
+ @examiner = @reek.send(:examiner)
47
+ @smell_warning = Reek.const_defined?(:SmellWarning) ? Reek.const_get(:SmellWarning) : Reek.const_get(:Smells).const_get(:SmellWarning)
48
+ if @smell_warning.instance_methods.include?(:subclass)
49
+ @smell_warning.send(:alias_method, :smell_type, :subclass)
50
+ end
51
+ end
52
+
53
+ context "with reek warnings" do
54
+ before :each do
55
+ @smells = [
56
+ instance_double(@smell_warning,
57
+ source: "app/controllers/activity_reports_controller.rb",
58
+ context: "ActivityReportsController#authorize_user",
59
+ message: "calls current_user.primary_site_ids multiple times",
60
+ smell_type: "Duplication",
61
+ lines: [2, 4]),
62
+ instance_double(@smell_warning,
63
+ source: "app/controllers/activity_reports_controller.rb",
64
+ context: "ActivityReportsController#authorize_user",
65
+ message: "calls params[id] multiple times",
66
+ smell_type: "Duplication",
67
+ lines: [5, 7]),
68
+ instance_double(@smell_warning,
69
+ source: "app/controllers/activity_reports_controller.rb",
70
+ context: "ActivityReportsController#authorize_user",
71
+ message: "calls params[primary_site_id] multiple times",
72
+ smell_type: "Duplication",
73
+ lines: [11, 15]),
74
+ instance_double(@smell_warning,
75
+ source: "app/controllers/activity_reports_controller.rb",
76
+ context: "ActivityReportsController#authorize_user",
77
+ message: "has approx 6 statements",
78
+ smell_type: "Long Method",
79
+ lines: [8]),
80
+
81
+ instance_double(@smell_warning,
82
+ source: "app/controllers/application.rb",
83
+ context: "ApplicationController#start_background_task/block/block",
84
+ message: "is nested",
85
+ smell_type: "Nested Iterators",
86
+ lines: [23]),
87
+
88
+ instance_double(@smell_warning,
89
+ source: "app/controllers/link_targets_controller.rb",
90
+ context: "LinkTargetsController#authorize_user",
91
+ message: "calls current_user.role multiple times",
92
+ smell_type: "Duplication",
93
+ lines: [8]),
94
+
95
+ instance_double(@smell_warning,
96
+ source: "app/controllers/newline_controller.rb",
97
+ context: "NewlineController#some_method",
98
+ message: "calls current_user.<< \"new line\n\" multiple times",
99
+ smell_type: "Duplication",
100
+ lines: [6, 9])
101
+ ]
102
+ @lines = instance_double(@examiner, smells: @smells)
103
+ @reek.instance_variable_set(:@output, @lines)
104
+ @matches = @reek.analyze
105
+ end
106
+
107
+ it "should find the code smell's line numbers" do
108
+ smell = @matches.first[:code_smells].first
109
+ expect(smell[:lines]).to eq([2, 4])
110
+ end
111
+
112
+ it "should find the code smell's method name" do
113
+ smell = @matches.first[:code_smells].first
114
+ expect(smell[:method]).to eq("ActivityReportsController#authorize_user")
115
+ end
116
+
117
+ it "should find the code smell's type" do
118
+ smell = @matches[1][:code_smells].first
119
+ expect(smell[:type]).to eq("Nested Iterators")
120
+ end
121
+
122
+ it "should find the code smell's message" do
123
+ smell = @matches[1][:code_smells].first
124
+ expect(smell[:message]).to eq("is nested")
125
+ end
126
+
127
+ it "should find the code smell's type" do
128
+ smell = @matches.first
129
+ expect(smell[:file_path]).to eq("app/controllers/activity_reports_controller.rb")
130
+ end
131
+
132
+ it "should NOT insert nil smells into the array when there's a newline in the method call" do
133
+ expect(@matches.last[:code_smells]).to eq(@matches.last[:code_smells].compact)
134
+ end
135
+ end
136
+
137
+ context "with reek 1.3 output" do
138
+ before :each do
139
+ @smells = [
140
+ double(source: "app/controllers/activity_reports_controller.rb",
141
+ context: "ActivityReportsController#authorize_user",
142
+ message: "calls current_user.primary_site_ids multiple times",
143
+ subclass: "Duplication",
144
+ lines: [2, 4]),
145
+ ]
146
+ @lines = instance_double(@examiner, smells: @smells)
147
+ @reek.instance_variable_set(:@output, @lines)
148
+ @matches = @reek.analyze
149
+ end
150
+
151
+ it "uses the subclass field to find the smell type" do
152
+ smell = @matches.first[:code_smells].first
153
+ expect(smell[:type]).to eq('Duplication')
154
+ end
155
+ end
156
+
157
+ context "without reek warnings" do
158
+ before :each do
159
+ @lines = instance_double(@examiner, smells: [])
160
+ @reek.instance_variable_set(:@output, @lines)
161
+ @matches = @reek.analyze
162
+ end
163
+
164
+ it "returns empty analysis" do
165
+ expect(@matches).to eq([])
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,66 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "reek/grapher" }
3
+
4
+ describe ReekGrapher do
5
+ before :each do
6
+ @reek_grapher = MetricFu::ReekGrapher.new
7
+ MetricFu.configuration
8
+ end
9
+
10
+ it "should respond to reek_count and labels" do
11
+ expect(@reek_grapher).to respond_to(:reek_count)
12
+ expect(@reek_grapher).to respond_to(:labels)
13
+ end
14
+
15
+ describe "responding to #initialize" do
16
+ it "should initialise reek_count and labels" do
17
+ expect(@reek_grapher.reek_count).to eq({})
18
+ expect(@reek_grapher.labels).to eq({})
19
+ end
20
+ end
21
+
22
+ describe "responding to #get_metrics" do
23
+ context "when metrics were not generated" do
24
+ before(:each) do
25
+ @metrics = FIXTURE.load_metric("metric_missing.yml")
26
+ @date = "1/2"
27
+ end
28
+
29
+ it "should not set a hash of code smells to reek_count" do
30
+ @reek_grapher.get_metrics(@metrics, @date)
31
+ expect(@reek_grapher.reek_count).to eq({})
32
+ end
33
+
34
+ it "should not update labels with the date" do
35
+ expect(@reek_grapher.labels).not_to receive(:update)
36
+ @reek_grapher.get_metrics(@metrics, @date)
37
+ end
38
+ end
39
+
40
+ context "when metrics have been generated" do
41
+ before(:each) do
42
+ @metrics = FIXTURE.load_metric("20090630.yml")
43
+ @date = "1/2"
44
+ end
45
+
46
+ it "should set a hash of code smells to reek_count" do
47
+ @reek_grapher.get_metrics(@metrics, @date)
48
+ expect(@reek_grapher.reek_count).to eq(
49
+ "Uncommunicative Name" => [27],
50
+ "Feature Envy" => [20],
51
+ "Utility Function" => [15],
52
+ "Long Method" => [26],
53
+ "Nested Iterators" => [12],
54
+ "Control Couple" => [4],
55
+ "Duplication" => [48],
56
+ "Large Class" => [1]
57
+ )
58
+ end
59
+
60
+ it "should update labels with the date" do
61
+ expect(@reek_grapher.labels).to receive(:update).with(0 => "1/2")
62
+ @reek_grapher.get_metrics(@metrics, @date)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+ require "shared/configured"
3
+
4
+ describe MetricFu::Configuration, "for roodi" do
5
+ it_behaves_like "configured" do
6
+ it "should set @roodi to {:dirs_to_roodi => @code_dirs}" do
7
+ load_metric "roodi"
8
+ expect(MetricFu::Metric.get_metric(:roodi).run_options).to eq(
9
+ dirs_to_roodi: directory("code_dirs"),
10
+ roodi_config: "#{directory('root_directory')}/config/roodi_config.yml"
11
+ )
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "roodi/generator" }
3
+
4
+ describe MetricFu::RoodiGenerator do
5
+ describe "emit" do
6
+ it "should add config options when present" do
7
+ options = { roodi_config: "lib/config/roodi_config.yml", dirs_to_roodi: [] }
8
+ roodi = MetricFu::RoodiGenerator.new(options)
9
+ expect(roodi).to receive(:run!).with(/-config=lib\/config\/roodi_config\.yml/).and_return("")
10
+ roodi.emit
11
+ end
12
+
13
+ it "should NOT add config options when NOT present" do
14
+ options = { dirs_to_roodi: [] }
15
+ roodi = MetricFu::RoodiGenerator.new(options)
16
+ allow(roodi).to receive(:run!)
17
+ expect(roodi).to receive(:run!).with(/-config/).never
18
+ roodi.emit
19
+ end
20
+ end
21
+
22
+ describe "analyze" do
23
+ context "when it has multiple failures" do
24
+ before :each do
25
+ lines = <<-HERE
26
+
27
+ Running Roodi checks
28
+ ./app/models/some_model.rb:14 - Found = in conditional. It should probably be an ==
29
+ lib/some_file.rb:53 - Rescue block should not be empty.
30
+
31
+ Checked 65 files
32
+ HERE
33
+
34
+ roodi = MetricFu::RoodiGenerator.new
35
+ roodi.instance_variable_set(:@output, lines)
36
+ @matches = roodi.analyze
37
+ end
38
+
39
+ it "should find all problems" do
40
+ problem_count = @matches[:problems].size
41
+ expect(problem_count).to eq(2)
42
+ end
43
+
44
+ it "should find the file of the problem" do
45
+ problem = @matches[:problems].first
46
+ expect(problem[:file]).to eq("./app/models/some_model.rb")
47
+ end
48
+
49
+ it "should find the line of the problem" do
50
+ problem = @matches[:problems].first
51
+ expect(problem[:line]).to eq("14")
52
+ end
53
+
54
+ it "should find the description of the problem" do
55
+ problem = @matches[:problems].first
56
+ expect(problem[:problem]).to eq("Found = in conditional. It should probably be an ==")
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when it has no failures" do
62
+ before :each do
63
+ lines = <<-HERE
64
+
65
+ Running Roodi checks
66
+
67
+ Checked 42 files
68
+ Found 0 errors.
69
+
70
+ HERE
71
+
72
+ roodi = MetricFu::RoodiGenerator.new
73
+ roodi.instance_variable_set(:@output, lines)
74
+ @matches = roodi.analyze
75
+ end
76
+
77
+ it "should have no problems" do
78
+ problem_count = @matches[:problems].size
79
+ expect(problem_count).to eq(0)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "roodi/grapher" }
3
+
4
+ describe RoodiGrapher do
5
+ before :each do
6
+ @roodi_grapher = MetricFu::RoodiGrapher.new
7
+ MetricFu.configuration
8
+ end
9
+
10
+ it "should respond to roodi_count and labels" do
11
+ expect(@roodi_grapher).to respond_to(:roodi_count)
12
+ expect(@roodi_grapher).to respond_to(:labels)
13
+ end
14
+
15
+ describe "responding to #initialize" do
16
+ it "should initialise roodi_count and labels" do
17
+ expect(@roodi_grapher.roodi_count).to eq([])
18
+ expect(@roodi_grapher.labels).to eq({})
19
+ end
20
+ end
21
+
22
+ describe "responding to #get_metrics" do
23
+ context "when metrics were not generated" do
24
+ before(:each) do
25
+ @metrics = FIXTURE.load_metric("metric_missing.yml")
26
+ @date = "1/2"
27
+ end
28
+
29
+ it "should not push to roodi_count" do
30
+ expect(@roodi_grapher.roodi_count).not_to receive(:push)
31
+ @roodi_grapher.get_metrics(@metrics, @date)
32
+ end
33
+
34
+ it "should not update labels with the date" do
35
+ expect(@roodi_grapher.labels).not_to receive(:update)
36
+ @roodi_grapher.get_metrics(@metrics, @date)
37
+ end
38
+ end
39
+
40
+ context "when metrics have been generated" do
41
+ before(:each) do
42
+ @metrics = FIXTURE.load_metric("20090630.yml")
43
+ @date = "1/2"
44
+ end
45
+
46
+ it "should push to roodi_count" do
47
+ expect(@roodi_grapher.roodi_count).to receive(:push).with(13)
48
+ @roodi_grapher.get_metrics(@metrics, @date)
49
+ end
50
+
51
+ it "should update labels with the date" do
52
+ expect(@roodi_grapher.labels).to receive(:update).with(0 => "1/2")
53
+ @roodi_grapher.get_metrics(@metrics, @date)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+ require "shared/configured"
3
+
4
+ describe MetricFu::Configuration, "for saikuro" do
5
+ it_behaves_like "configured" do
6
+ it "should set @saikuro to { :output_directory => @scratch_directory + '/saikuro',
7
+ :input_directory => @code_dirs,
8
+ :cyclo => '',
9
+ :filter_cyclo => '0',
10
+ :warn_cyclo => '5',
11
+ :error_cyclo => '7',
12
+ :formater => 'text' }" do
13
+ load_metric "saikuro"
14
+ expect(MetricFu::Metric.get_metric(:saikuro).run_options).to eq(
15
+ output_directory: "#{scratch_directory}/saikuro",
16
+ input_directory: ["lib"],
17
+ cyclo: "",
18
+ filter_cyclo: "0",
19
+ warn_cyclo: "5",
20
+ error_cyclo: "7",
21
+ formater: "text"
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,71 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "saikuro/generator" }
3
+
4
+ describe MetricFu::SaikuroGenerator do
5
+ STUB_TEST_DATA = lambda do |generator|
6
+ # set test data dir; ensure it doesn't get cleared
7
+ def generator.metric_directory
8
+ FIXTURE.fixtures_path.join("saikuro").to_s
9
+ end
10
+ def generator.clear_scratch_files!
11
+ # no-op
12
+ end
13
+ end
14
+ describe "to_h method" do
15
+ before do
16
+ options = {}
17
+ saikuro = MetricFu::SaikuroGenerator.new(options)
18
+ STUB_TEST_DATA[saikuro]
19
+
20
+ saikuro.analyze
21
+ @output = saikuro.to_h
22
+ end
23
+
24
+ it "should find the filename of a file" do
25
+ expect(@output[:saikuro][:files].first[:filename]).to eq("app/controllers/users_controller.rb")
26
+ end
27
+
28
+ it "should find the name of the classes" do
29
+ expect(@output[:saikuro][:classes].first[:name]).to eq("UsersController")
30
+ expect(@output[:saikuro][:classes][1][:name]).to eq("SessionsController")
31
+ end
32
+
33
+ it "should put the most complex method first" do
34
+ expect(@output[:saikuro][:methods].first[:name]).to eq("UsersController#create")
35
+ expect(@output[:saikuro][:methods].first[:complexity]).to eq(4)
36
+ end
37
+
38
+ it "should find the complexity of a method" do
39
+ expect(@output[:saikuro][:methods].first[:complexity]).to eq(4)
40
+ end
41
+
42
+ it "should find the lines of a method" do
43
+ expect(@output[:saikuro][:methods].first[:lines]).to eq(15)
44
+ end
45
+ end
46
+
47
+ describe "per_file_info method" do
48
+ before :all do
49
+ options = {}
50
+ @saikuro = MetricFu::SaikuroGenerator.new(options)
51
+ STUB_TEST_DATA[@saikuro]
52
+ @saikuro.analyze
53
+ @output = @saikuro.to_h
54
+ end
55
+
56
+ it "doesn't try to get information if the file does not exist" do
57
+ expect(@saikuro).to receive(:file_not_exists?).at_least(:once).and_return(true)
58
+ @saikuro.per_file_info("ignore_me")
59
+ end
60
+ end
61
+
62
+ describe MetricFu::SaikuroScratchFile do
63
+ describe "getting elements from a Saikuro result file" do
64
+ it "should parse nested START/END sections" do
65
+ path = FIXTURE.fixtures_path.join("saikuro_sfiles", "thing.rb_cyclo.html").to_s
66
+ sfile = MetricFu::SaikuroScratchFile.new path
67
+ expect(sfile.elements.map(&:complexity).sort).to eql(["0", "0", "2"])
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,96 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "stats/generator" }
3
+
4
+ describe StatsGenerator do
5
+ describe "emit method" do
6
+ it "should gather the raw data" do
7
+ ENV["CC_BUILD_ARTIFACTS"] = nil
8
+ MetricFu.configure.reset
9
+ allow(File).to receive(:directory?).and_return(true)
10
+ stats = MetricFu::StatsGenerator.new
11
+ stats.emit
12
+ end
13
+ end
14
+
15
+ # TODO review tested output
16
+ describe "analyze method" do
17
+ before :each do
18
+ @lines = <<-HERE.gsub(/^\s*/, "")
19
+ +----------------------+-------+-------+---------+---------+-----+-------+
20
+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
21
+ +----------------------+-------+-------+---------+---------+-----+-------+
22
+ | Controllers | 470 | 382 | 7 | 53 | 7 | 5 |
23
+ | Helpers | 128 | 65 | 0 | 6 | 0 | 8 |
24
+ | Models | 351 | 285 | 9 | 31 | 3 | 7 |
25
+ | Libraries | 305 | 183 | 2 | 30 | 15 | 4 |
26
+ | Model specs | 860 | 719 | 0 | 2 | 0 | 357 |
27
+ | View specs | 0 | 0 | 0 | 0 | 0 | 0 |
28
+ | Controller specs | 1570 | 1308 | 1 | 10 | 10 | 128 |
29
+ | Helper specs | 191 | 172 | 0 | 0 | 0 | 0 |
30
+ | Library specs | 31 | 27 | 0 | 0 | 0 | 0 |
31
+ +----------------------+-------+-------+---------+---------+-----+-------+
32
+ | Total | 3906 | 3141 | 19 | 132 | 6 | 21 |
33
+ +----------------------+-------+-------+---------+---------+-----+-------+
34
+ Code LOC: 915 Test LOC: 2226 Code to Test Ratio: 1:2.4
35
+
36
+ HERE
37
+ ENV["CC_BUILD_ARTIFACTS"] = nil
38
+ MetricFu.configure.reset
39
+ allow(File).to receive(:directory?).and_return(true)
40
+ stats = MetricFu::StatsGenerator.new
41
+ stats.instance_variable_set("@output", @lines)
42
+ @results = stats.analyze
43
+ end
44
+
45
+ it "should get code Lines Of Code" do
46
+ expect(@results[:codeLOC]).to eq(915)
47
+ end
48
+
49
+ it "should get test Lines Of Code" do
50
+ expect(@results[:testLOC]).to eq(2226)
51
+ end
52
+
53
+ it "should get code to test ratio" do
54
+ expect(@results[:code_to_test_ratio]).to eq(2.4)
55
+ end
56
+
57
+ it "should get data on models" do
58
+ model_data = @results[:lines].find { |line| line[:name] == "Models" }
59
+ expect(model_data[:classes]).to eq(9)
60
+ expect(model_data[:methods]).to eq(31)
61
+ expect(model_data[:loc]).to eq(285)
62
+ expect(model_data[:lines]).to eq(351)
63
+ expect(model_data[:methods_per_class]).to eq(3)
64
+ expect(model_data[:loc_per_method]).to eq(7)
65
+ end
66
+
67
+ it "handles code to test ratio is ratio is 1:NaN" do
68
+ lines = <<-HERE.gsub(/^\s*/, "")
69
+ +----------------------+-------+-------+---------+---------+-----+-------+
70
+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
71
+ +----------------------+-------+-------+---------+---------+-----+-------+
72
+ +----------------------+-------+-------+---------+---------+-----+-------+
73
+ Code LOC: 0 Test LOC: 0 Code to Test Ratio: 1:NaN
74
+
75
+ HERE
76
+ ENV["CC_BUILD_ARTIFACTS"] = nil
77
+ MetricFu.configure.reset
78
+ allow(File).to receive(:directory?).and_return(true)
79
+ stats = MetricFu::StatsGenerator.new(MetricFu::Metric.get_metric(:stats).run_options)
80
+ stats.instance_variable_set("@output", lines)
81
+ @results = stats.analyze
82
+ expect(@results[:code_to_test_ratio]).to eq(0.0)
83
+ end
84
+ end
85
+
86
+ describe "to_h method" do
87
+ it "should put things into a hash" do
88
+ ENV["CC_BUILD_ARTIFACTS"] = nil
89
+ MetricFu.configure.reset
90
+ allow(File).to receive(:directory?).and_return(true)
91
+ stats = MetricFu::StatsGenerator.new
92
+ stats.instance_variable_set(:@stats, "the_stats")
93
+ expect(stats.to_h[:stats]).to eq("the_stats")
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,69 @@
1
+ require "spec_helper"
2
+ MetricFu.metrics_require { "stats/grapher" }
3
+
4
+ describe StatsGrapher do
5
+ before :each do
6
+ @stats_grapher = MetricFu::StatsGrapher.new
7
+ MetricFu.configuration
8
+ end
9
+
10
+ it "should respond to loc_counts and lot_counts and labels" do
11
+ expect(@stats_grapher).to respond_to(:loc_counts)
12
+ expect(@stats_grapher).to respond_to(:lot_counts)
13
+ expect(@stats_grapher).to respond_to(:labels)
14
+ end
15
+
16
+ describe "responding to #initialize" do
17
+ it "should initialise loc_counts and lot_counts and labels" do
18
+ expect(@stats_grapher.loc_counts).to eq([])
19
+ expect(@stats_grapher.lot_counts).to eq([])
20
+ expect(@stats_grapher.labels).to eq({})
21
+ end
22
+ end
23
+
24
+ describe "responding to #get_metrics" do
25
+ context "when metrics were not generated" do
26
+ before(:each) do
27
+ @metrics = FIXTURE.load_metric("metric_missing.yml")
28
+ @date = "01022003"
29
+ end
30
+
31
+ it "should not push to loc_counts" do
32
+ expect(@stats_grapher.loc_counts).not_to receive(:push)
33
+ @stats_grapher.get_metrics(@metrics, @date)
34
+ end
35
+
36
+ it "should not push to lot_counts" do
37
+ expect(@stats_grapher.lot_counts).not_to receive(:push)
38
+ @stats_grapher.get_metrics(@metrics, @date)
39
+ end
40
+
41
+ it "should not update labels with the date" do
42
+ expect(@stats_grapher.labels).not_to receive(:update)
43
+ @stats_grapher.get_metrics(@metrics, @date)
44
+ end
45
+ end
46
+
47
+ context "when metrics have been generated" do
48
+ before(:each) do
49
+ @metrics = FIXTURE.load_metric("20090630.yml")
50
+ @date = "01022003"
51
+ end
52
+
53
+ it "should push to loc_counts" do
54
+ expect(@stats_grapher.loc_counts).to receive(:push).with(15935)
55
+ @stats_grapher.get_metrics(@metrics, @date)
56
+ end
57
+
58
+ it "should push to lot_counts" do
59
+ expect(@stats_grapher.lot_counts).to receive(:push).with(7438)
60
+ @stats_grapher.get_metrics(@metrics, @date)
61
+ end
62
+
63
+ it "should update labels with the date" do
64
+ expect(@stats_grapher.labels).to receive(:update).with(0 => "01022003")
65
+ @stats_grapher.get_metrics(@metrics, @date)
66
+ end
67
+ end
68
+ end
69
+ end