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,155 @@
1
+ <html><head><title>Index for cyclomatic complexity</title></head>
2
+ <style>
3
+ body {
4
+ margin: 20px;
5
+ padding: 0;
6
+ font-size: 12px;
7
+ font-family: bitstream vera sans, verdana, arial, sans serif;
8
+ background-color: #efefef;
9
+ }
10
+
11
+ table {
12
+ border-collapse: collapse;
13
+ /*border-spacing: 0;*/
14
+ border: 1px solid #666;
15
+ background-color: #fff;
16
+ margin-bottom: 20px;
17
+ }
18
+
19
+ table, th, th+th, td, td+td {
20
+ border: 1px solid #ccc;
21
+ }
22
+
23
+ table th {
24
+ font-size: 12px;
25
+ color: #fc0;
26
+ padding: 4px 0;
27
+ background-color: #336;
28
+ }
29
+
30
+ th, td {
31
+ padding: 4px 10px;
32
+ }
33
+
34
+ td {
35
+ font-size: 13px;
36
+ }
37
+
38
+ .class_name {
39
+ font-size: 17px;
40
+ margin: 20px 0 0;
41
+ }
42
+
43
+ .class_complexity {
44
+ margin: 0 auto;
45
+ }
46
+
47
+ .class_complexity>.class_complexity {
48
+ margin: 0;
49
+ }
50
+
51
+ .class_total_complexity, .class_total_lines, .start_token_count, .file_count {
52
+ font-size: 13px;
53
+ font-weight: bold;
54
+ }
55
+
56
+ .class_total_complexity, .class_total_lines {
57
+ color: #c00;
58
+ }
59
+
60
+ .start_token_count, .file_count {
61
+ color: #333;
62
+ }
63
+
64
+ .warning {
65
+ background-color: yellow;
66
+ }
67
+
68
+ .error {
69
+ background-color: #f00;
70
+ }
71
+ </style>
72
+
73
+ <body>
74
+ <h1>Index for cyclomatic complexity</h1>
75
+ <h2 class="class_name">Errors and Warnings</h2>
76
+ <table width="100%" border="1">
77
+ <tr><th>Class</th><th>Method</th><th>Complexity</th></tr>
78
+
79
+ <tr><td><a href="./app/controllers/activity_reports_controller.rb_cyclo.html">ActivityReportsController</a></td><td>authorize_user</td>
80
+ <td class="warning">6</td></tr>
81
+ <tr><td><a href="./app/controllers/primary_sites_controller.rb_cyclo.html">PrimarySitesController</a></td><td>create</td>
82
+ <td class="warning">5</td></tr>
83
+ <tr><td><a href="./app/controllers/primary_sites_controller.rb_cyclo.html">PrimarySitesController</a></td><td>save_link_targets</td>
84
+ <td class="warning">5</td></tr>
85
+ <tr><td><a href="./app/models/link_target.rb_cyclo.html">LinkTarget</a></td><td>update_backlink_status</td>
86
+ <td class="warning">5</td></tr>
87
+ </table>
88
+ <hr/>
89
+ <h2 class="class_name">Analyzed Files</h2>
90
+ <ul>
91
+ <li>
92
+ <p class="file_name"><a href="./app/models/user.rb_cyclo.html">app/models/user.rb</a>
93
+ </li>
94
+ <li>
95
+ <p class="file_name"><a href="./app/models/subscriber.rb_cyclo.html">app/models/subscriber.rb</a>
96
+ </li>
97
+ <li>
98
+ <p class="file_name"><a href="./app/models/primary_site.rb_cyclo.html">app/models/primary_site.rb</a>
99
+ </li>
100
+ <li>
101
+ <p class="file_name"><a href="./app/models/link_target.rb_cyclo.html">app/models/link_target.rb</a>
102
+ </li>
103
+ <li>
104
+ <p class="file_name"><a href="./app/models/comparison_site.rb_cyclo.html">app/models/comparison_site.rb</a>
105
+ </li>
106
+ <li>
107
+ <p class="file_name"><a href="./app/models/backlink_crawl_status.rb_cyclo.html">app/models/backlink_crawl_status.rb</a>
108
+ </li>
109
+ <li>
110
+ <p class="file_name"><a href="./app/models/backlink_crawl_notifier.rb_cyclo.html">app/models/backlink_crawl_notifier.rb</a>
111
+ </li>
112
+ <li>
113
+ <p class="file_name"><a href="./app/models/activity_report_measure.rb_cyclo.html">app/models/activity_report_measure.rb</a>
114
+ </li>
115
+ <li>
116
+ <p class="file_name"><a href="./app/models/activity_report.rb_cyclo.html">app/models/activity_report.rb</a>
117
+ </li>
118
+ <li>
119
+ <p class="file_name"><a href="./app/helpers/users_helper.rb_cyclo.html">app/helpers/users_helper.rb</a>
120
+ </li>
121
+ <li>
122
+ <p class="file_name"><a href="./app/helpers/sessions_helper.rb_cyclo.html">app/helpers/sessions_helper.rb</a>
123
+ </li>
124
+ <li>
125
+ <p class="file_name"><a href="./app/helpers/primary_sites_helper.rb_cyclo.html">app/helpers/primary_sites_helper.rb</a>
126
+ </li>
127
+ <li>
128
+ <p class="file_name"><a href="./app/helpers/link_targets_helper.rb_cyclo.html">app/helpers/link_targets_helper.rb</a>
129
+ </li>
130
+ <li>
131
+ <p class="file_name"><a href="./app/helpers/application_helper.rb_cyclo.html">app/helpers/application_helper.rb</a>
132
+ </li>
133
+ <li>
134
+ <p class="file_name"><a href="./app/controllers/users_controller.rb_cyclo.html">app/controllers/users_controller.rb</a>
135
+ </li>
136
+ <li>
137
+ <p class="file_name"><a href="./app/controllers/sessions_controller.rb_cyclo.html">app/controllers/sessions_controller.rb</a>
138
+ </li>
139
+ <li>
140
+ <p class="file_name"><a href="./app/controllers/primary_sites_controller.rb_cyclo.html">app/controllers/primary_sites_controller.rb</a>
141
+ </li>
142
+ <li>
143
+ <p class="file_name"><a href="./app/controllers/link_targets_controller.rb_cyclo.html">app/controllers/link_targets_controller.rb</a>
144
+ </li>
145
+ <li>
146
+ <p class="file_name"><a href="./app/controllers/bookmarklet_integration_controller.rb_cyclo.html">app/controllers/bookmarklet_integration_controller.rb</a>
147
+ </li>
148
+ <li>
149
+ <p class="file_name"><a href="./app/controllers/application.rb_cyclo.html">app/controllers/application.rb</a>
150
+ </li>
151
+ <li>
152
+ <p class="file_name"><a href="./app/controllers/activity_reports_controller.rb_cyclo.html">app/controllers/activity_reports_controller.rb</a>
153
+ </li>
154
+ </ul>
155
+ </body></html>
@@ -0,0 +1,11 @@
1
+ -- START Mod --
2
+ Type:Module Name:Mod Complexity:2 Lines:7
3
+ Type:Def Name:self.included Complexity:2 Lines:5
4
+ -- START --
5
+ Type:Class Name: Complexity:0 Lines:1
6
+ -- END --
7
+ Type:Def Name:update Complexity:1 Lines:1
8
+ -- END Mod --
9
+ -- START Thing --
10
+ Type:Class Name:Thing Complexity:0 Lines:2
11
+ -- END Thing --
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+ MetricFu.lib_require { "calculate" }
3
+
4
+ describe MetricFu::Calculate do
5
+ describe "returns a percent rounded to the nearest integer" do
6
+ specify "3 / 10 == 30" do
7
+ expect(MetricFu::Calculate.integer_percent(3, 10)).to eq(30)
8
+ end
9
+ specify "3.0 / 10 == 30" do
10
+ expect(MetricFu::Calculate.integer_percent(3.0, 10)).to eq(30)
11
+ end
12
+ it "raises an ArgumentError on non-numeric input" do
13
+ expect {
14
+ MetricFu::Calculate.integer_percent("", 10)
15
+ }.to raise_error(ArgumentError)
16
+ end
17
+ it "returns 0 when the denominator is 0" do
18
+ expect(MetricFu::Calculate.integer_percent(3, 0)).to eq(0)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,90 @@
1
+ require "spec_helper"
2
+ require "shared/configured"
3
+
4
+ describe MetricFu::Configuration do
5
+ it_behaves_like "configured" do
6
+ describe "#is_cruise_control_rb?" do
7
+ before(:each) { get_new_config }
8
+ describe "when the CC_BUILD_ARTIFACTS env var is not nil" do
9
+ before(:each) do
10
+ ENV["CC_BUILD_ARTIFACTS"] = "is set"
11
+ end
12
+
13
+ it "should return true" do
14
+ expect(@config.is_cruise_control_rb?).to be_truthy
15
+ end
16
+
17
+ after(:each) do
18
+ ENV["CC_BUILD_ARTIFACTS"] = nil
19
+ FileUtils.rm_rf(File.join(MetricFu.root_dir, "is set"))
20
+ end
21
+ end
22
+
23
+ describe "when the CC_BUILD_ARTIFACTS env var is nil" do
24
+ before(:each) { ENV["CC_BUILD_ARTIFACTS"] = nil }
25
+
26
+ it "should return false" do
27
+ expect(@config.is_cruise_control_rb?).to be_falsey
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "#reset" do
33
+ describe "when there is a CC_BUILD_ARTIFACTS environment variable" do
34
+ before do
35
+ ENV["CC_BUILD_ARTIFACTS"] = "foo"
36
+ @config = MetricFu.configuration
37
+ @config.reset
38
+ MetricFu.configure
39
+ end
40
+ it "should return the CC_BUILD_ARTIFACTS environment variable" do
41
+ compare_paths(base_directory, ENV["CC_BUILD_ARTIFACTS"])
42
+ end
43
+ after do
44
+ ENV["CC_BUILD_ARTIFACTS"] = nil
45
+ FileUtils.rm_rf(File.join(MetricFu.root_dir, "foo"))
46
+ end
47
+ end
48
+
49
+ describe "when there is no CC_BUILD_ARTIFACTS environment variable" do
50
+ before(:each) do
51
+ ENV["CC_BUILD_ARTIFACTS"] = nil
52
+ get_new_config
53
+ end
54
+ it "should return 'tmp/metric_fu'" do
55
+ expect(base_directory).to eq(MetricFu.artifact_dir)
56
+ end
57
+
58
+ it "should set @metric_fu_root_directory to the base of the "\
59
+ "metric_fu application" do
60
+ app_root = File.join(File.dirname(__FILE__), "..", "..")
61
+ app_root_absolute_path = File.expand_path(app_root)
62
+ metric_fu_absolute_path = File.expand_path(metric_fu_root)
63
+ expect(metric_fu_absolute_path).to eq(app_root_absolute_path)
64
+ expect(MetricFu.root.to_s).to eq(app_root_absolute_path)
65
+ end
66
+
67
+ it "should set @scratch_directory to scratch relative "\
68
+ "to @base_directory" do
69
+ scratch_dir = MetricFu.scratch_dir
70
+ expect(scratch_directory).to eq(scratch_dir)
71
+ end
72
+
73
+ it "should set @output_directory to output relative "\
74
+ "to @base_directory" do
75
+ output_dir = MetricFu.output_dir
76
+ expect(output_directory).to eq(output_dir)
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "#platform" do
82
+ before(:each) { get_new_config }
83
+
84
+ it "should return the value of the PLATFORM constant" do
85
+ this_platform = RUBY_PLATFORM
86
+ expect(@config.platform).to eq(this_platform)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,63 @@
1
+ require "spec_helper"
2
+ MetricFu.data_structures_require { "line_numbers" }
3
+
4
+ describe MetricFu::LineNumbers do
5
+ FIXTURE_DATA = ->(paths) {
6
+ FIXTURE.load_file(["line_numbers"].concat(Array(paths)))
7
+ }
8
+ describe "in_method?" do
9
+ it "should know if a line is NOT in a method" do
10
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
11
+ expect(ln.in_method?(2)).to eq(false)
12
+ end
13
+
14
+ it "should know if a line is in an instance method" do
15
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
16
+ expect(ln.in_method?(8)).to eq(true)
17
+ end
18
+
19
+ it "should know if a line is in an class method" do
20
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
21
+ expect(ln.in_method?(3)).to eq(true)
22
+ end
23
+ end
24
+
25
+ describe "method_at_line" do
26
+ it "should know the name of an instance method at a particular line" do
27
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
28
+ expect(ln.method_at_line(8)).to eq("Foo#what")
29
+ end
30
+
31
+ it "should know the name of a class method at a particular line" do
32
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
33
+ expect(ln.method_at_line(3)).to eq("Foo::awesome")
34
+ end
35
+
36
+ it "should know the name of a private method at a particular line" do
37
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
38
+ expect(ln.method_at_line(28)).to eq("Foo#whoop")
39
+ end
40
+
41
+ it "should know the name of a class method defined in a 'class << self block at a particular line" do
42
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["foo.rb"])
43
+ expect(ln.method_at_line(22)).to eq("Foo::neat")
44
+ end
45
+
46
+ it "should know the name of an instance method at a particular line in a file with two classes" do
47
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["two_classes.rb"])
48
+ expect(ln.method_at_line(3)).to eq("Foo#stuff")
49
+ expect(ln.method_at_line(9)).to eq("Bar#stuff")
50
+ end
51
+
52
+ it "should work with modules" do
53
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["module.rb"])
54
+ expect(ln.method_at_line(4)).to eq("KickAss#get_beat_up?")
55
+ end
56
+
57
+ it "should work with module surrounding class" do
58
+ ln = MetricFu::LineNumbers.new(FIXTURE_DATA["module_surrounds_class.rb"])
59
+ expect(ln.method_at_line(5)).to eq("StuffModule::ThingClass#do_it")
60
+ # ln.method_at_line(12).should == "StuffModule#blah" #why no work?
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,110 @@
1
+ require "spec_helper"
2
+ MetricFu.data_structures_require { "location" }
3
+
4
+ describe MetricFu::Location do
5
+ context "with non-standard Reek method names" do
6
+ # reek reports the method with :: not # on modules like
7
+ # module ApplicationHelper \n def signed_in?, convert it so it records correctly
8
+ # class_or_method_name = class_or_method_name.gsub(/\:\:/,"#") if method_bug_conversion
9
+
10
+ before do
11
+ @location = Location.for("ApplicationHelper::section_link")
12
+ end
13
+
14
+ it "has method name" do
15
+ expect(@location.method_name).to eq("ApplicationHelper#section_link")
16
+ end
17
+
18
+ it "has nil file path" do
19
+ expect(@location.file_path).to eq(nil)
20
+ end
21
+
22
+ it "has class name" do
23
+ expect(@location.class_name).to eq("ApplicationHelper")
24
+ end
25
+ end
26
+
27
+ context "using new" do
28
+ before do
29
+ @location = Location.new("lib/foo.rb", "Foo", "Foo#some_method")
30
+ end
31
+
32
+ it "should return fully qualified method" do
33
+ expect(@location.method_name).to eq("Foo#some_method")
34
+ end
35
+ end
36
+
37
+ context "using .for with class" do
38
+ before do
39
+ @location = Location.for("Module::Foo")
40
+ end
41
+
42
+ it "has nil method_name" do
43
+ expect(@location.method_name).to be nil
44
+ end
45
+
46
+ it "has nil file_path" do
47
+ expect(@location.file_path).to be nil
48
+ end
49
+
50
+ it "has class_name" do
51
+ expect(@location.class_name).to eq("Foo")
52
+ end
53
+ end
54
+
55
+ context "using .for with method" do
56
+ before do
57
+ @location = Location.for("Module::Foo#some_method")
58
+ end
59
+
60
+ it "strips module from class name" do
61
+ expect(@location.class_name).to eq("Foo")
62
+ end
63
+
64
+ it "strips module from method name" do
65
+ expect(@location.method_name).to eq("Foo#some_method")
66
+ end
67
+
68
+ it "has nil file_path" do
69
+ expect(@location.file_path).to be nil
70
+ end
71
+ end
72
+
73
+ context "with class method" do
74
+ it "provides non-qualified name" do
75
+ location = Location.for("Foo.some_class_method")
76
+ expect(location.simple_method_name).to eq(".some_class_method")
77
+ end
78
+ end
79
+
80
+ context "with instance method" do
81
+ it "provides non-qualified name" do
82
+ location = Location.for("Foo#some_class_method")
83
+ expect(location.simple_method_name).to eq("#some_class_method")
84
+ end
85
+ end
86
+ context "testing equality" do
87
+ before :each do
88
+ @location1 = MetricFu::Location.get("/some/path", "some_class", "some_method")
89
+
90
+ # ensure that we get a new object
91
+ @location2 = MetricFu::Location.new("/some/path", "some_class", "some_method")
92
+ end
93
+ it "should match two locations with the same paths as equal" do
94
+ hsh1 = {}
95
+ hsh1[@location1] = 1
96
+
97
+ hsh2 = {}
98
+ hsh2[@location2] = 1
99
+
100
+ expect(hsh1).to eq(hsh2)
101
+ expect(hsh1.eql?(hsh2)).to be_truthy
102
+
103
+ expect(@location1.eql?(@location2)).to be_truthy
104
+ end
105
+
106
+ it "should produce the same hash value given the same paths" do
107
+ expect(@location1.hash).to eq(@location2.hash)
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+ require "shared/configured"
3
+
4
+ describe MetricFu::Configuration, "for formatters" do
5
+ it_behaves_like "configured" do
6
+ describe "#configure_formatter" do
7
+ before(:each) { get_new_config }
8
+
9
+ context "given a built-in formatter" do
10
+ before do
11
+ @config.configure_formatter("html")
12
+ end
13
+
14
+ it "adds to the list of formatters" do
15
+ expect(@config.formatters.first).to be_an_instance_of(MetricFu::Formatter::HTML)
16
+ end
17
+ end
18
+
19
+ context "given a custom formatter by class name" do
20
+ before do
21
+ stub_const("MyCustomFormatter", Class.new { def initialize(*); end })
22
+ @config.configure_formatter("MyCustomFormatter")
23
+ end
24
+
25
+ it "adds to the list of formatters" do
26
+ expect(@config.formatters.first).to be_an_instance_of(MyCustomFormatter)
27
+ end
28
+ end
29
+
30
+ context "given multiple formatters" do
31
+ before do
32
+ stub_const("MyCustomFormatter", Class.new { def initialize(*); end })
33
+ @config.configure_formatter("html")
34
+ @config.configure_formatter("yaml")
35
+ @config.configure_formatter("MyCustomFormatter")
36
+ end
37
+
38
+ it "adds each to the list of formatters" do
39
+ expect(@config.formatters.count).to eq(3)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,138 @@
1
+ require "spec_helper"
2
+ MetricFu.formatter_require { "html" }
3
+
4
+ describe MetricFu::Formatter::HTML do
5
+ before do
6
+ setup_fs
7
+
8
+ # TODO: Use mock metrics?
9
+ # Right now, have to select from metrics
10
+ # based on platform, resulting in slow specs
11
+ # for some platforms.
12
+ config = MetricFu.configuration
13
+ if config.mri?
14
+ @metric_with_graph = :cane
15
+ else
16
+ @metric_with_graph = :stats
17
+ config.templates_configuration do |c|
18
+ c.syntax_highlighting = false
19
+ end
20
+ end
21
+ allow(MetricFu::Metric.get_metric(@metric_with_graph)).to receive(:run_external).and_return("")
22
+ @metric_without_graph = :hotspots
23
+ config.configure_metrics.each do |metric|
24
+ metric.enabled = true if [@metric_with_graph, @metric_without_graph].include?(metric.name)
25
+ end
26
+
27
+ MetricFu.result.add(@metric_with_graph) # metric w/ graph
28
+ MetricFu.result.add(@metric_without_graph) # metric w/out graph
29
+ end
30
+
31
+ def directory(name)
32
+ MetricFu::Io::FileSystem.directory(name)
33
+ end
34
+
35
+ context "In general" do
36
+ it "creates a report yaml file" do
37
+ # For backward compatibility.
38
+ expect {
39
+ MetricFu::Formatter::HTML.new.finish
40
+ }.to create_file("#{directory('base_directory')}/report.yml")
41
+ end
42
+
43
+ it "creates a data yaml file" do
44
+ # For use with graphs.
45
+ expect {
46
+ MetricFu::Formatter::HTML.new.finish
47
+ }.to create_file("#{directory('data_directory')}/#{MetricFu.report_id}.yml")
48
+ end
49
+
50
+ it "creates a report index html file" do
51
+ expect {
52
+ MetricFu::Formatter::HTML.new.finish
53
+ }.to create_file("#{directory('output_directory')}/index.html")
54
+ end
55
+
56
+ it "creates templatized html files for each metric" do
57
+ expect {
58
+ MetricFu::Formatter::HTML.new.finish
59
+ }.to create_files([
60
+ "#{directory('output_directory')}/#{@metric_with_graph}.html",
61
+ "#{directory('output_directory')}/#{@metric_without_graph}.html"
62
+ ])
63
+ end
64
+
65
+ it "copies common javascripts to the output directory" do
66
+ expect {
67
+ MetricFu::Formatter::HTML.new.finish
68
+ }.to create_file("#{directory('output_directory')}/highcharts*.js")
69
+ end
70
+
71
+ it "creates graphs for appropriate metrics" do
72
+ expect {
73
+ MetricFu::Formatter::HTML.new.finish
74
+ }.to create_files([
75
+ "#{directory('output_directory')}/#{@metric_with_graph}.js",
76
+ ])
77
+ end
78
+
79
+ it "can open the results in the browser" do
80
+ allow(MetricFu.configuration).to receive(:is_cruise_control_rb?).and_return(false)
81
+ formatter = MetricFu::Formatter::HTML.new
82
+ path = MetricFu.run_path.join(directory("output_directory"))
83
+ uri = URI.join(URI.escape("file://#{path}/"), "index.html")
84
+ expect(Launchy).to receive(:open).with(uri)
85
+ formatter.finish
86
+ formatter.display_results
87
+ end
88
+ end
89
+
90
+ context "given a custom output directory" do
91
+ before do
92
+ @output = "customdir"
93
+ end
94
+
95
+ it "creates the report index html file in the custom output directory" do
96
+ expect {
97
+ MetricFu::Formatter::HTML.new(output: @output).finish
98
+ }.to create_file("#{directory('base_directory')}/#{@output}/index.html")
99
+ end
100
+
101
+ it "creates templatized html files for each metric in the custom output directory" do
102
+ expect {
103
+ MetricFu::Formatter::HTML.new(output: @output).finish
104
+ }.to create_files([
105
+ "#{directory('base_directory')}/#{@output}/#{@metric_with_graph}.html",
106
+ "#{directory('base_directory')}/#{@output}/#{@metric_without_graph}.html"
107
+ ])
108
+ end
109
+
110
+ it "copies common javascripts to the custom output directory" do
111
+ expect {
112
+ MetricFu::Formatter::HTML.new(output: @output).finish
113
+ }.to create_file("#{directory('base_directory')}/#{@output}/highcharts*.js")
114
+ end
115
+
116
+ it "creates graphs for appropriate metrics in the custom output directory " do
117
+ expect {
118
+ MetricFu::Formatter::HTML.new(output: @output).finish
119
+ }.to create_file(
120
+ "#{directory('base_directory')}/#{@output}/#{@metric_with_graph}.js",
121
+ )
122
+ end
123
+
124
+ it "can open the results in the browser from the custom output directory" do
125
+ allow(MetricFu.configuration).to receive(:is_cruise_control_rb?).and_return(false)
126
+ formatter = MetricFu::Formatter::HTML.new(output: @output)
127
+ path = MetricFu.run_path.join("#{directory('base_directory')}/#{@output}")
128
+ uri = URI.join(URI.escape("file://#{path}/"), "index.html")
129
+ expect(Launchy).to receive(:open).with(uri)
130
+ formatter.finish
131
+ formatter.display_results
132
+ end
133
+ end
134
+
135
+ after do
136
+ cleanup_fs
137
+ end
138
+ end