rubycritic-simplecov 4.1.0

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