rubycritic-simplecov 4.1.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 (115) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +290 -0
  3. data/CONTRIBUTING.md +93 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +259 -0
  7. data/ROADMAP.md +56 -0
  8. data/Rakefile +28 -0
  9. data/bin/rubycritic +10 -0
  10. data/lib/rubycritic/analysers/attributes.rb +29 -0
  11. data/lib/rubycritic/analysers/churn.rb +30 -0
  12. data/lib/rubycritic/analysers/complexity.rb +30 -0
  13. data/lib/rubycritic/analysers/coverage.rb +118 -0
  14. data/lib/rubycritic/analysers/helpers/ast_node.rb +76 -0
  15. data/lib/rubycritic/analysers/helpers/flay.rb +13 -0
  16. data/lib/rubycritic/analysers/helpers/flog.rb +17 -0
  17. data/lib/rubycritic/analysers/helpers/methods_counter.rb +25 -0
  18. data/lib/rubycritic/analysers/helpers/modules_locator.rb +42 -0
  19. data/lib/rubycritic/analysers/helpers/parser.rb +14 -0
  20. data/lib/rubycritic/analysers/helpers/reek.rb +11 -0
  21. data/lib/rubycritic/analysers/smells/flay.rb +79 -0
  22. data/lib/rubycritic/analysers/smells/flog.rb +69 -0
  23. data/lib/rubycritic/analysers/smells/reek.rb +53 -0
  24. data/lib/rubycritic/analysers_runner.rb +41 -0
  25. data/lib/rubycritic/analysis_summary.rb +40 -0
  26. data/lib/rubycritic/browser.rb +19 -0
  27. data/lib/rubycritic/cli/application.rb +34 -0
  28. data/lib/rubycritic/cli/options/argv.rb +137 -0
  29. data/lib/rubycritic/cli/options/file.rb +100 -0
  30. data/lib/rubycritic/cli/options.rb +33 -0
  31. data/lib/rubycritic/colorize.rb +17 -0
  32. data/lib/rubycritic/command_factory.rb +25 -0
  33. data/lib/rubycritic/commands/base.rb +18 -0
  34. data/lib/rubycritic/commands/ci.rb +14 -0
  35. data/lib/rubycritic/commands/compare.rb +106 -0
  36. data/lib/rubycritic/commands/default.rb +38 -0
  37. data/lib/rubycritic/commands/help.rb +18 -0
  38. data/lib/rubycritic/commands/status_reporter.rb +45 -0
  39. data/lib/rubycritic/commands/utils/build_number_file.rb +37 -0
  40. data/lib/rubycritic/commands/version.rb +16 -0
  41. data/lib/rubycritic/configuration.rb +69 -0
  42. data/lib/rubycritic/core/analysed_module.rb +93 -0
  43. data/lib/rubycritic/core/analysed_modules_collection.rb +95 -0
  44. data/lib/rubycritic/core/location.rb +47 -0
  45. data/lib/rubycritic/core/rating.rb +30 -0
  46. data/lib/rubycritic/core/smell.rb +84 -0
  47. data/lib/rubycritic/generators/console_report.rb +20 -0
  48. data/lib/rubycritic/generators/html/assets/fonts/FontAwesome.otf +0 -0
  49. data/lib/rubycritic/generators/html/assets/fonts/Roboto-Medium.ttf +0 -0
  50. data/lib/rubycritic/generators/html/assets/fonts/Roboto-Regular.ttf +0 -0
  51. data/lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.eot +0 -0
  52. data/lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.svg +2671 -0
  53. data/lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.ttf +0 -0
  54. data/lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.woff +0 -0
  55. data/lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.woff2 +0 -0
  56. data/lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  57. data/lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  58. data/lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  59. data/lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  60. data/lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  61. data/lib/rubycritic/generators/html/assets/images/logo.png +0 -0
  62. data/lib/rubycritic/generators/html/assets/javascripts/application.js +281 -0
  63. data/lib/rubycritic/generators/html/assets/javascripts/bootstrap.min.js +7 -0
  64. data/lib/rubycritic/generators/html/assets/javascripts/highcharts.src-4.0.1.js +17672 -0
  65. data/lib/rubycritic/generators/html/assets/javascripts/jquery.filtertable.min.js +13 -0
  66. data/lib/rubycritic/generators/html/assets/javascripts/jquery.min.js +4 -0
  67. data/lib/rubycritic/generators/html/assets/javascripts/jquery.scrollTo.min.js +7 -0
  68. data/lib/rubycritic/generators/html/assets/javascripts/jquery.tablesorter.js +1031 -0
  69. data/lib/rubycritic/generators/html/assets/javascripts/jquery.tablesorter.min.js +4 -0
  70. data/lib/rubycritic/generators/html/assets/javascripts/jquery.timeago.js +231 -0
  71. data/lib/rubycritic/generators/html/assets/javascripts/prettify.js +46 -0
  72. data/lib/rubycritic/generators/html/assets/stylesheets/application.css +570 -0
  73. data/lib/rubycritic/generators/html/assets/stylesheets/bootstrap.min.css +6 -0
  74. data/lib/rubycritic/generators/html/assets/stylesheets/font-awesome.min.css +4 -0
  75. data/lib/rubycritic/generators/html/assets/stylesheets/prettify.css +1 -0
  76. data/lib/rubycritic/generators/html/assets/stylesheets/prettify.custom_theme.css +69 -0
  77. data/lib/rubycritic/generators/html/base.rb +54 -0
  78. data/lib/rubycritic/generators/html/code_file.rb +51 -0
  79. data/lib/rubycritic/generators/html/code_index.rb +33 -0
  80. data/lib/rubycritic/generators/html/line.rb +37 -0
  81. data/lib/rubycritic/generators/html/overview.rb +38 -0
  82. data/lib/rubycritic/generators/html/simple_cov_index.rb +44 -0
  83. data/lib/rubycritic/generators/html/smells_index.rb +45 -0
  84. data/lib/rubycritic/generators/html/templates/code_file.html.erb +61 -0
  85. data/lib/rubycritic/generators/html/templates/code_index.html.erb +55 -0
  86. data/lib/rubycritic/generators/html/templates/layouts/application.html.erb +66 -0
  87. data/lib/rubycritic/generators/html/templates/line.html.erb +1 -0
  88. data/lib/rubycritic/generators/html/templates/overview.html.erb +68 -0
  89. data/lib/rubycritic/generators/html/templates/simple_cov_index.html.erb +44 -0
  90. data/lib/rubycritic/generators/html/templates/smells_index.html.erb +47 -0
  91. data/lib/rubycritic/generators/html/templates/smelly_line.html.erb +23 -0
  92. data/lib/rubycritic/generators/html/turbulence.rb +17 -0
  93. data/lib/rubycritic/generators/html/view_helpers.rb +58 -0
  94. data/lib/rubycritic/generators/html_report.rb +77 -0
  95. data/lib/rubycritic/generators/json/simple.rb +43 -0
  96. data/lib/rubycritic/generators/json_report.rb +26 -0
  97. data/lib/rubycritic/generators/lint_report.rb +30 -0
  98. data/lib/rubycritic/generators/text/lint.rb +41 -0
  99. data/lib/rubycritic/generators/text/list.rb +45 -0
  100. data/lib/rubycritic/generators/text/templates/lint.erb +3 -0
  101. data/lib/rubycritic/generators/text/templates/list.erb +12 -0
  102. data/lib/rubycritic/rake_task.rb +71 -0
  103. data/lib/rubycritic/reporter.rb +39 -0
  104. data/lib/rubycritic/revision_comparator.rb +45 -0
  105. data/lib/rubycritic/serializer.rb +32 -0
  106. data/lib/rubycritic/smells_status_setter.rb +18 -0
  107. data/lib/rubycritic/source_control_systems/base.rb +41 -0
  108. data/lib/rubycritic/source_control_systems/double.rb +19 -0
  109. data/lib/rubycritic/source_control_systems/git.rb +95 -0
  110. data/lib/rubycritic/source_control_systems/mercurial.rb +29 -0
  111. data/lib/rubycritic/source_control_systems/perforce.rb +116 -0
  112. data/lib/rubycritic/source_locator.rb +52 -0
  113. data/lib/rubycritic/version.rb +5 -0
  114. data/lib/rubycritic.rb +6 -0
  115. metadata +528 -0
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+ require 'rubycritic/generators/html/base'
5
+
6
+ module RubyCritic
7
+ module Generator
8
+ module Html
9
+ class Line < Base
10
+ NORMAL_TEMPLATE = erb_template('line.html.erb')
11
+ SMELLY_TEMPLATE = erb_template('smelly_line.html.erb')
12
+
13
+ attr_reader :file_directory
14
+
15
+ def initialize(file_directory, text, smells)
16
+ @file_directory = file_directory
17
+ @text = CGI.escapeHTML(text.chomp)
18
+ @smells = smells
19
+ end
20
+
21
+ def render
22
+ template.result(binding).delete("\n") + "\n"
23
+ end
24
+
25
+ private
26
+
27
+ def template
28
+ if @smells.empty?
29
+ NORMAL_TEMPLATE
30
+ else
31
+ SMELLY_TEMPLATE
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/generators/html/base'
4
+ require 'rubycritic/generators/html/turbulence'
5
+ require 'rubycritic/analysis_summary'
6
+
7
+ module RubyCritic
8
+ module Generator
9
+ module Html
10
+ class Overview < Base
11
+ TEMPLATE = erb_template('overview.html.erb')
12
+
13
+ def initialize(analysed_modules)
14
+ @turbulence_data = Turbulence.data(analysed_modules)
15
+ @score = analysed_modules.score
16
+ @max_score = AnalysedModulesCollection::MAX_SCORE
17
+ @summary = analysed_modules.summary
18
+ set_header_links if Config.compare_branches_mode?
19
+ end
20
+
21
+ def set_header_links
22
+ @base_path = code_index_path(Config.base_root_directory, file_name)
23
+ @feature_path = code_index_path(Config.feature_root_directory, file_name)
24
+ @build_path = code_index_path(Config.compare_root_directory, file_name)
25
+ end
26
+
27
+ def file_name
28
+ 'overview.html'
29
+ end
30
+
31
+ def render
32
+ index_body = TEMPLATE.result(base_binding)
33
+ LAYOUT_TEMPLATE.result(base_binding { index_body })
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/generators/html/base'
4
+
5
+ module RubyCritic
6
+ module Generator
7
+ module Html
8
+ class SimpleCovIndex < Base
9
+ TEMPLATE = erb_template('simple_cov_index.html.erb')
10
+
11
+ def initialize(analysed_modules)
12
+ @analysed_modules = sorted(filtered(analysed_modules))
13
+ set_header_links if Config.compare_branches_mode?
14
+ end
15
+
16
+ def set_header_links
17
+ @base_path = code_index_path(Config.base_root_directory, file_name)
18
+ @feature_path = code_index_path(Config.feature_root_directory, file_name)
19
+ @build_path = code_index_path(Config.compare_root_directory, file_name)
20
+ end
21
+
22
+ def file_name
23
+ 'simple_cov_index.html'
24
+ end
25
+
26
+ def render
27
+ index_body = TEMPLATE.result(base_binding)
28
+ LAYOUT_TEMPLATE.result(base_binding { index_body })
29
+ end
30
+
31
+ def sorted(mods)
32
+ mods.sort_by(&:coverage)
33
+ end
34
+
35
+ def filtered(mods)
36
+ mods.reject do |a_module|
37
+ path = a_module.pathname.to_s
38
+ path.start_with?('spec', 'test')
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/generators/html/base'
4
+
5
+ module RubyCritic
6
+ module Generator
7
+ module Html
8
+ class SmellsIndex < Base
9
+ TEMPLATE = erb_template('smells_index.html.erb')
10
+
11
+ def initialize(analysed_modules)
12
+ @smells = analysed_modules.flat_map(&:smells).uniq
13
+ @analysed_module_names = analysed_module_names(analysed_modules)
14
+ @show_status = (Config.mode == :default)
15
+ set_header_links if Config.compare_branches_mode?
16
+ end
17
+
18
+ def set_header_links
19
+ @base_path = code_index_path(Config.base_root_directory, file_name)
20
+ @feature_path = code_index_path(Config.feature_root_directory, file_name)
21
+ @build_path = code_index_path(Config.compare_root_directory, file_name)
22
+ end
23
+
24
+ def file_name
25
+ 'smells_index.html'
26
+ end
27
+
28
+ def render
29
+ index_body = TEMPLATE.result(base_binding)
30
+ LAYOUT_TEMPLATE.result(base_binding { index_body })
31
+ end
32
+
33
+ private
34
+
35
+ def analysed_module_names(analysed_modules)
36
+ names = {}
37
+ analysed_modules.each do |analysed_module|
38
+ names[analysed_module.pathname] = analysed_module.name
39
+ end
40
+ names
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,61 @@
1
+ <div class="row">
2
+ <!--Page Title -->
3
+ <div class="Page_Title">
4
+ <div class="file-time">
5
+ <span class="committed-at">
6
+ <% if @analysed_module.committed_at %>
7
+ Updated <%= timeago_tag(@analysed_module.committed_at) %>
8
+ <% else %>
9
+ Never committed
10
+ <% end %>
11
+ </span>
12
+ </div>
13
+ <div>
14
+ <h3><small><%= @analysed_module.file_location %> /</small> <%= @analysed_module.file_name %></h3>
15
+ </div>
16
+ </div>
17
+ <!--End Page Title -->
18
+ <div class="Content_Wrapper">
19
+ <!-- code detail -->
20
+ <div class="code-top-detail clearfix row">
21
+ <div class="col-md-8">
22
+ <div class="row">
23
+ <div class="col-md-1">
24
+ <div class="rating <%= @analysed_module.rating.to_s.downcase %> big">
25
+ <%= @analysed_module.rating %>
26
+ </div>
27
+ </div>
28
+ <div class="code-statistics col-md-11">
29
+ <div class="col-md-3">
30
+ <div><span class="metric"><%= @analysed_module.line_count %></span><small> lines of codes</small></div>
31
+ <div><span class="metric"><%= @analysed_module.methods_count %></span><small> methods</small></div>
32
+ </div>
33
+ <div class="col-md-3">
34
+ <div><span class="metric"><%= @analysed_module.complexity_per_method %></span><small> complexity/method</small></div>
35
+ <div><span class="metric"><%= @analysed_module.churn %></span><small> churn</small></div>
36
+ </div>
37
+ <div class="col-md-3">
38
+ <div><span class="metric"><%= @analysed_module.complexity %></span><small> complexity</small></div>
39
+ <div><span class="metric"><%= @analysed_module.duplication %></span><small> duplications</small></div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div class="col-md-4">
45
+ <div class="code-tabs">
46
+ <ul class="nav nav-pills right-to-left">
47
+ <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
48
+ <li class="active">
49
+ <a href="#" id="toggle-smells" class="toggle-button button">
50
+ <%= @analysed_module.smells_count %>
51
+ <%= @analysed_module.smells_count <= 1 ? 'smell' : 'smells' %>
52
+ </a>
53
+ </li>
54
+ </ul>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <code class="prettyprint linenums lang-ruby file-code js-file-code"><%= yield %></code>
60
+ </div>
61
+ </div>
@@ -0,0 +1,55 @@
1
+ <div class="row">
2
+ <!--Page Title -->
3
+ <div class="Page_Title">
4
+ <h3>Code</h3>
5
+ </div>
6
+ <!--End Page Title -->
7
+ <div class="Content_Wrapper">
8
+ <table id="codeTable" class="table code sortable-table tablesorter">
9
+ <thead>
10
+ <tr>
11
+ <% unless Config.suppress_ratings %>
12
+ <th width="10%" class="table-header">Rating<span class="sort-type"></span></th>
13
+ <% end %>
14
+ <th width="50%" class="table-header">Name<span class="sort-type"></span></th>
15
+ <th width="10%" class="table-header">Churn<span class="sort-type"></span></th>
16
+ <th width="10%" class="table-header">Complexity<span class="sort-type"></span></th>
17
+ <th width="10%" class="table-header">Duplication<span class="sort-type"></span></th>
18
+ <th width="10%" class="table-header">Smells<span class="sort-type"></span></th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% @analysed_modules.each do |analysed_module| %>
23
+ <tr>
24
+ <% unless Config.suppress_ratings %>
25
+ <td>
26
+ <% if Config.build_mode? %>
27
+ <% master_analysed_module = Config.base_branch_collection.find(analysed_module.pathname) %>
28
+ <% if master_analysed_module.cost > analysed_module.cost %>
29
+ <span class="glyphicon glyphicon-arrow-up green-color"></span>
30
+ <% elsif master_analysed_module.cost < analysed_module.cost %>
31
+ <span class="glyphicon glyphicon-arrow-down red-color"></span>
32
+ <% else %>
33
+ <span class="empty-span glyphicon"></span>
34
+ <% end %>
35
+ <% end %>
36
+ <div class="rating <%= analysed_module.rating.to_s.downcase %>"><%= analysed_module.rating %></div>
37
+ </td>
38
+ <% end %>
39
+ <td>
40
+ <ul class="nav nav-pills">
41
+ <li role="presentation" >
42
+ <a href="<%= file_path(analysed_module.pathname.sub_ext('.html')) %>"><%= analysed_module.name %></a>
43
+ </li>
44
+ </ul>
45
+ </td>
46
+ <td><%= analysed_module.churn %></td>
47
+ <td><%= analysed_module.complexity %></td>
48
+ <td><%= analysed_module.duplication %></td>
49
+ <td><%= analysed_module.smells_count %></td>
50
+ </tr>
51
+ <% end %>
52
+ </tbody>
53
+ </table>
54
+ </div>
55
+ </div>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <title>Ruby Critic - Home</title>
7
+ <meta name="description" content="">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1">
9
+
10
+ <!-- StyleSheets -->
11
+ <link href="<%= stylesheet_path(:'bootstrap.min') %>" media="screen, projection, print" rel="stylesheet" type="text/css">
12
+ <link href="<%= stylesheet_path(:'font-awesome.min') %>" media="screen, projection, print" rel="stylesheet" type="text/css">
13
+ <link href="<%= stylesheet_path(:'prettify.custom_theme') %>" media="screen, projection, print" rel="stylesheet" type="text/css">
14
+ <link href="<%= stylesheet_path(:application) %>" media="screen, projection, print" rel="stylesheet" type="text/css">
15
+ </head>
16
+
17
+ <body>
18
+ <header class="navbar navbar-default navbar-fixed-top">
19
+ <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
20
+ <a href="<%= file_path('overview.html') %>"><img src="<%= image_path('logo.png') %>" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
21
+ <% if Config.compare_branches_mode? %>
22
+ <ul class="nav navbar-nav navbar-right">
23
+ <a href="<%= @base_path %>"><span class="branch"><%= Config.base_branch %></span></a>
24
+ <a href="<%= @feature_path %>"><span class="branch"><%= Config.feature_branch %></span></a>
25
+ <a href="<%= @build_path %>"><span class="branch">Build</span></a>
26
+ </ul>
27
+ <% end %>
28
+ </header>
29
+ <div id="wrapper">
30
+ <!-- Sidebar -->
31
+ <aside id="sidebar-wrapper">
32
+ <ul class="sidebar-nav">
33
+ <li class="sidebar-item">
34
+ <a href="<%= file_path('overview.html') %>" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
35
+ </li>
36
+ <li class="sidebar-item">
37
+ <a href="<%= file_path('code_index.html') %>" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
38
+ </li>
39
+ <li class="sidebar-item">
40
+ <a href="<%= file_path('smells_index.html') %>" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
41
+ </li>
42
+ <li class="sidebar-item">
43
+ <a href="<%= file_path('simple_cov_index.html') %>" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
44
+ </li>
45
+ </ul>
46
+ </aside>
47
+ <!-- /#sidebar-wrapper -->
48
+ <div id="page-content-wrapper">
49
+ <div class="container-fluid">
50
+ <%= yield %>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <!-- JavaScripts -->
56
+ <%= javascript_tag(:'jquery.min') %>
57
+ <%= javascript_tag(:'jquery.tablesorter.min') %>
58
+ <%= javascript_tag(:'jquery.scrollTo.min') %>
59
+ <%= javascript_tag(:'jquery.timeago') %>
60
+ <%= javascript_tag(:'highcharts.src-4.0.1') %>
61
+ <%= javascript_tag(:'prettify') %>
62
+ <%= javascript_tag(:'bootstrap.min') %>
63
+ <%= javascript_tag(:application) %>
64
+ <%= javascript_tag(:'jquery.filtertable.min') %>
65
+ </body>
66
+ </html>
@@ -0,0 +1 @@
1
+ <%= @text %>
@@ -0,0 +1,68 @@
1
+ <!-- Page Content -->
2
+ <div id="page-content-wrapper">
3
+ <div class="container-fluid">
4
+ <div class="row">
5
+ <!--Page Title -->
6
+ <div class="Page_Title">
7
+ <h3>Overview</h3>
8
+ </div>
9
+ <!--End Page Title -->
10
+ <div class="Content_Wrapper">
11
+ <!--Grade Wrapper-->
12
+ <div class="col-xs-12 col-sm-4 col-md-6 col-lg-4">
13
+ <div class="Graph_Cards fadeIn">
14
+ <div id="gpa-chart" class="chart-container"></div>
15
+ <div id="addText" ></div>
16
+ </div>
17
+ </div>
18
+ <!--End Grade Wrapper-->
19
+
20
+ <!--Churn vs Complexity graph-->
21
+ <div class="col-xs-7 col-sm-7 col-md-6 col-lg-8">
22
+ <div class="Graph_Cards fadeIn">
23
+ <% if Config.source_control_present? %>
24
+ <div id="churn-vs-complexity-graph-container" class="chart-container"></div>
25
+ <% else %>
26
+ <div id="churn-error">We can't show you Churn-vs-Complexity graph because this project does not seem to be under a source code management system like git or perforce at the moment. This doesn't mean that anything is wrong, it just means certain features like this one are not available.</div>
27
+ <% end %>
28
+
29
+ <script>
30
+ var turbulenceData = <%= @turbulence_data %>;
31
+ var score = <%= @score %>;
32
+ </script>
33
+ </div>
34
+ </div>
35
+ <!--End Churn vs Complexity graph-->
36
+
37
+ <!--Summary Wrapper-->
38
+ <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
39
+ <div class="Graph_Cards Summary_Wrapper_Main fadeIn-3">
40
+ <h4>Summary</h4>
41
+ <% ratings = { 'A' => 'Green_DR', 'B' => 'Green_Light', 'C' => 'Yellow_Color',
42
+ 'D' => 'Orange_Color', 'F' => 'Red_Color' } %>
43
+ <div class="Summary_Wrapper">
44
+ <% ratings.each do |rating, color| %>
45
+ <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
46
+ <div class="summary_wrap <%= color %>">
47
+ <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
48
+ <h3><%= rating %></h3>
49
+ </div>
50
+ <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
51
+ <ul class="list-inline">
52
+ <li><h4 id="ratingAfileCount"><%= @summary[rating][:files] %></h4><span>files</span></li>
53
+ <li><h4 id="ratingAfileCount"><%= @summary[rating][:churns] %></h4><span>churns</span></li>
54
+ <li><h4 id="ratingAfileCount"><%= @summary[rating][:smells] %></h4><span>smells</span></li>
55
+ </ul>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ <% end %>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <!--End Summary Wrapper-->
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ <!-- /#page-content-wrapper -->
@@ -0,0 +1,44 @@
1
+ <!-- Page Content -->
2
+ <div id="page-content-wrapper">
3
+ <div class="container-fluid">
4
+ <div class="row">
5
+ <!--Page Title -->
6
+ <div class="Page_Title">
7
+ <h3>Coverage</h3>
8
+ </div>
9
+ <!--End Page Title -->
10
+ <div class="Content_Wrapper">
11
+ <table id="js-index-table" class="table coverage-index-table index-table sortable-table">
12
+ <thead>
13
+ <tr>
14
+ <% unless Config.suppress_ratings %>
15
+ <th width="10%" class="table-header">Rating<span class="sort-type"></span></th>
16
+ <% end %>
17
+ <th width="80%" class="table-header">Name<span class="sort-type"></span></th>
18
+ <th width="10%" class="table-header">Coverage<span class="sort-type"></span></th>
19
+ </tr>
20
+ </thead>
21
+ <% @analysed_modules.each do |analysed_module| %>
22
+ <tr>
23
+ <tr>
24
+ <% unless Config.suppress_ratings %>
25
+ <td>
26
+ <div class="rating <%= analysed_module.rating.to_s.downcase %>"><%= analysed_module.coverage_rating %></div>
27
+ </td>
28
+ <% end %>
29
+ <td>
30
+ <ul class="nav nav-pills">
31
+ <li role="presentation" >
32
+ <a href="<%= file_path(analysed_module.pathname.sub_ext('.html')) %>"><%= analysed_module.name %></a>
33
+ </li>
34
+ </ul>
35
+ </td>
36
+ <td><%= '%g' % analysed_module.coverage %>%</td>
37
+ </tr>
38
+ <% end %>
39
+ </table>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <!-- /#page-content-wrapper -->
@@ -0,0 +1,47 @@
1
+ <!-- Page Content -->
2
+ <div id="page-content-wrapper">
3
+ <div class="container-fluid">
4
+ <div class="row">
5
+ <!--Page Title -->
6
+ <div class="Page_Title">
7
+ <h3>Smells</h3>
8
+ </div>
9
+ <!--End Page Title -->
10
+ <div class="Content_Wrapper">
11
+ <table id="js-index-table" class="table smells-index-table index-table sortable-table">
12
+ <thead>
13
+ <tr>
14
+ <th width="30%" class="table-header">Smell<span class="sort-type"></span></th>
15
+ <th width="65%" class="table-header">Locations<span class="sort-type"></span></th>
16
+ <th width="5%" class="table-header">Status<span class="sort-type"></span></th>
17
+ </tr>
18
+ </thead>
19
+ <% @smells.each do |smell| %>
20
+ <tr>
21
+ <td><%= smell.type %></td>
22
+ <td>
23
+ <ul class="nav nav-pills">
24
+ <% smell.locations.each do |location| %>
25
+ <li role="presentation">
26
+ <a href="<%= smell_location_path(location) %>"><%= @analysed_module_names[location.pathname] %></a>
27
+ </li>
28
+ <% end %>
29
+ </ul>
30
+ </td>
31
+ <td>
32
+ <% if @show_status %>
33
+ <ul class="nav nav-pills">
34
+ <li role="presentation">
35
+ <td class="centered-cell"><span class="status-<%= smell.status %> circled-text circle"><%= smell.status %></span></td>
36
+ </li>
37
+ </ul>
38
+ <% end %>
39
+ </td>
40
+ </tr>
41
+ <% end %>
42
+ </table>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <!-- /#page-content-wrapper -->
@@ -0,0 +1,23 @@
1
+ <%= @text %>
2
+
3
+ <ol class="nocode errors smells">
4
+ <% @smells.each do |smell| %>
5
+ <li>
6
+ <div class="description">
7
+ <div class="heading">
8
+ <span>
9
+ <i class="fa fa-warning" aria-hidden="true"></i>
10
+ <a href="<%= smell.doc_url %>" target="_blank"><b><%= smell.type %></b></a>
11
+ </span>
12
+ </div>
13
+ <span><%= "#{smell.context} #{smell.message}" %></span>
14
+ <% if smell.multiple_locations? %>
15
+ <span>Locations:</span>
16
+ <% smell.locations.each_with_index do |location, index| %>
17
+ <a href="<%= smell_location_path(location) %>" class="js-smell-location"><%= index %></a>
18
+ <% end %>
19
+ <% end %>
20
+ </div>
21
+ </li>
22
+ <% end %>
23
+ </ol>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ module RubyCritic
5
+ module Turbulence
6
+ def self.data(analysed_modules)
7
+ analysed_modules.map do |analysed_module|
8
+ {
9
+ name: analysed_module.name,
10
+ x: analysed_module.churn,
11
+ y: analysed_module.complexity,
12
+ rating: analysed_module.rating.to_s
13
+ }
14
+ end.to_json
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyCritic
4
+ module ViewHelpers
5
+ def timeago_tag(time)
6
+ "<time class='js-timeago' datetime='#{time}'>#{time}</time>"
7
+ end
8
+
9
+ def javascript_tag(file)
10
+ "<script src='" + asset_path("javascripts/#{file}.js").to_s + "'></script>"
11
+ end
12
+
13
+ def stylesheet_path(file)
14
+ asset_path("stylesheets/#{file}.css")
15
+ end
16
+
17
+ def asset_path(file)
18
+ relative_path("assets/#{file}")
19
+ end
20
+
21
+ def image_path(file)
22
+ asset_path("images/#{file}")
23
+ end
24
+
25
+ def file_path(file)
26
+ relative_path(file)
27
+ end
28
+
29
+ def smell_location_path(location)
30
+ smell_location = "#{location.pathname.sub_ext('.html')}#L#{location.line}"
31
+ if Config.compare_branches_mode?
32
+ file_path("#{File.expand_path(Config.feature_root_directory)}/#{smell_location}")
33
+ else
34
+ file_path(smell_location)
35
+ end
36
+ end
37
+
38
+ def code_index_path(root_directory, file_name)
39
+ file_path("#{File.expand_path(root_directory)}/#{file_name}")
40
+ end
41
+
42
+ private
43
+
44
+ def relative_path(file)
45
+ (root_directory + file).relative_path_from(file_directory)
46
+ end
47
+
48
+ def file_directory
49
+ raise NotImplementedError,
50
+ "The #{self.class} class must implement the #{__method__} method."
51
+ end
52
+
53
+ def root_directory
54
+ raise NotImplementedError,
55
+ "The #{self.class} class must implement the #{__method__} method."
56
+ end
57
+ end
58
+ end