rubycritic 4.4.0 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -1
  3. data/CONTRIBUTING.md +0 -0
  4. data/Gemfile +0 -0
  5. data/LICENSE.txt +0 -0
  6. data/README.md +1 -1
  7. data/ROADMAP.md +0 -0
  8. data/Rakefile +0 -0
  9. data/lib/rubycritic.rb +0 -0
  10. data/lib/rubycritic/analysers/attributes.rb +0 -0
  11. data/lib/rubycritic/analysers/churn.rb +0 -0
  12. data/lib/rubycritic/analysers/complexity.rb +0 -0
  13. data/lib/rubycritic/analysers/coverage.rb +33 -27
  14. data/lib/rubycritic/analysers/helpers/ast_node.rb +0 -0
  15. data/lib/rubycritic/analysers/helpers/flay.rb +0 -0
  16. data/lib/rubycritic/analysers/helpers/flog.rb +0 -0
  17. data/lib/rubycritic/analysers/helpers/methods_counter.rb +0 -0
  18. data/lib/rubycritic/analysers/helpers/modules_locator.rb +0 -0
  19. data/lib/rubycritic/analysers/helpers/parser.rb +0 -0
  20. data/lib/rubycritic/analysers/helpers/reek.rb +0 -0
  21. data/lib/rubycritic/analysers/smells/flay.rb +0 -0
  22. data/lib/rubycritic/analysers/smells/flog.rb +0 -0
  23. data/lib/rubycritic/analysers/smells/reek.rb +0 -0
  24. data/lib/rubycritic/analysers_runner.rb +0 -0
  25. data/lib/rubycritic/analysis_summary.rb +0 -0
  26. data/lib/rubycritic/browser.rb +0 -0
  27. data/lib/rubycritic/cli/application.rb +0 -0
  28. data/lib/rubycritic/cli/options.rb +0 -0
  29. data/lib/rubycritic/cli/options/argv.rb +8 -1
  30. data/lib/rubycritic/cli/options/file.rb +0 -0
  31. data/lib/rubycritic/colorize.rb +0 -0
  32. data/lib/rubycritic/command_factory.rb +0 -0
  33. data/lib/rubycritic/commands/base.rb +0 -0
  34. data/lib/rubycritic/commands/ci.rb +0 -0
  35. data/lib/rubycritic/commands/compare.rb +3 -2
  36. data/lib/rubycritic/commands/default.rb +0 -0
  37. data/lib/rubycritic/commands/help.rb +0 -0
  38. data/lib/rubycritic/commands/status_reporter.rb +0 -0
  39. data/lib/rubycritic/commands/utils/build_number_file.rb +0 -0
  40. data/lib/rubycritic/commands/version.rb +0 -0
  41. data/lib/rubycritic/configuration.rb +14 -5
  42. data/lib/rubycritic/core/analysed_module.rb +0 -0
  43. data/lib/rubycritic/core/analysed_modules_collection.rb +0 -0
  44. data/lib/rubycritic/core/location.rb +0 -0
  45. data/lib/rubycritic/core/rating.rb +0 -0
  46. data/lib/rubycritic/core/smell.rb +0 -0
  47. data/lib/rubycritic/generators/console_report.rb +0 -0
  48. data/lib/rubycritic/generators/html/assets/javascripts/application.js +0 -0
  49. data/lib/rubycritic/generators/html/assets/stylesheets/application.css +1 -1
  50. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/FontAwesome.otf +0 -0
  51. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/fontawesome-webfont.eot +0 -0
  52. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/fontawesome-webfont.svg +0 -0
  53. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/fontawesome-webfont.ttf +0 -0
  54. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/fontawesome-webfont.woff +0 -0
  55. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/fontawesome-webfont.woff2 +0 -0
  56. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/glyphicons-halflings-regular.eot +0 -0
  57. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/glyphicons-halflings-regular.svg +0 -0
  58. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/glyphicons-halflings-regular.ttf +0 -0
  59. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/glyphicons-halflings-regular.woff +0 -0
  60. data/lib/rubycritic/generators/html/assets/{fonts → vendor/fonts}/glyphicons-halflings-regular.woff2 +0 -0
  61. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/bootstrap.min.js +0 -0
  62. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/highcharts.src-4.0.1.js +0 -0
  63. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.filtertable.min.js +0 -0
  64. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.min.js +0 -0
  65. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.scrollTo.min.js +0 -0
  66. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.tablesorter.js +0 -0
  67. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.tablesorter.min.js +0 -0
  68. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/jquery.timeago.js +0 -0
  69. data/lib/rubycritic/generators/html/assets/{javascripts → vendor/javascripts}/prettify.js +0 -0
  70. data/lib/rubycritic/generators/html/assets/{stylesheets → vendor/stylesheets}/bootstrap.min.css +0 -0
  71. data/lib/rubycritic/generators/html/assets/{stylesheets → vendor/stylesheets}/font-awesome.min.css +0 -0
  72. data/lib/rubycritic/generators/html/assets/{stylesheets → vendor/stylesheets}/prettify.css +0 -0
  73. data/lib/rubycritic/generators/html/assets/{stylesheets → vendor/stylesheets}/prettify.custom_theme.css +0 -0
  74. data/lib/rubycritic/generators/html/base.rb +0 -0
  75. data/lib/rubycritic/generators/html/code_file.rb +0 -0
  76. data/lib/rubycritic/generators/html/code_index.rb +0 -0
  77. data/lib/rubycritic/generators/html/line.rb +0 -0
  78. data/lib/rubycritic/generators/html/overview.rb +0 -0
  79. data/lib/rubycritic/generators/html/simple_cov_index.rb +0 -0
  80. data/lib/rubycritic/generators/html/smells_index.rb +0 -0
  81. data/lib/rubycritic/generators/html/templates/code_file.html.erb +0 -0
  82. data/lib/rubycritic/generators/html/templates/code_index.html.erb +0 -0
  83. data/lib/rubycritic/generators/html/templates/layouts/application.html.erb +14 -14
  84. data/lib/rubycritic/generators/html/templates/line.html.erb +0 -0
  85. data/lib/rubycritic/generators/html/templates/overview.html.erb +0 -0
  86. data/lib/rubycritic/generators/html/templates/simple_cov_index.html.erb +0 -0
  87. data/lib/rubycritic/generators/html/templates/smells_index.html.erb +0 -0
  88. data/lib/rubycritic/generators/html/templates/smelly_line.html.erb +0 -0
  89. data/lib/rubycritic/generators/html/turbulence.rb +0 -0
  90. data/lib/rubycritic/generators/html/view_helpers.rb +0 -12
  91. data/lib/rubycritic/generators/html_report.rb +0 -0
  92. data/lib/rubycritic/generators/json/simple.rb +0 -0
  93. data/lib/rubycritic/generators/json_report.rb +0 -0
  94. data/lib/rubycritic/generators/lint_report.rb +0 -0
  95. data/lib/rubycritic/generators/text/lint.rb +0 -0
  96. data/lib/rubycritic/generators/text/list.rb +0 -0
  97. data/lib/rubycritic/generators/text/templates/lint.erb +0 -0
  98. data/lib/rubycritic/generators/text/templates/list.erb +0 -0
  99. data/lib/rubycritic/rake_task.rb +0 -0
  100. data/lib/rubycritic/reporter.rb +0 -0
  101. data/lib/rubycritic/revision_comparator.rb +0 -0
  102. data/lib/rubycritic/serializer.rb +0 -0
  103. data/lib/rubycritic/smells_status_setter.rb +0 -0
  104. data/lib/rubycritic/source_control_systems/base.rb +1 -1
  105. data/lib/rubycritic/source_control_systems/double.rb +0 -0
  106. data/lib/rubycritic/source_control_systems/git.rb +7 -2
  107. data/lib/rubycritic/source_control_systems/git/churn.rb +93 -0
  108. data/lib/rubycritic/source_control_systems/mercurial.rb +0 -0
  109. data/lib/rubycritic/source_control_systems/perforce.rb +0 -0
  110. data/lib/rubycritic/source_locator.rb +0 -0
  111. data/lib/rubycritic/version.rb +1 -1
  112. metadata +56 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a45e87f4cbffc1c9e2bfa7b9f1fad1c78e93e772197cc33bfadd7c8e18890083
4
- data.tar.gz: 1ad31a33e2fdf9ed9c3101c62c2c8dd205e3894e920f3e11b8e0cce5cfdf61c1
3
+ metadata.gz: 3e29663da0f7e6b712b6159000d212bc6a4857b1422058c0b5e9073cf211aabb
4
+ data.tar.gz: a735167e5d172d2fe951bbdd19fe16764246dfe6f6c632e95bad960a3bc57cbb
5
5
  SHA512:
6
- metadata.gz: 012ad61ae4afa4cc279beb5ad78d47f78f65600e99dc373a94db1fb0583fbd4296f11e40e9b2414615fe495eb38f62a91781e0e1a75e805f912d17f670fe304a
7
- data.tar.gz: c47b6878398d30f5bc5831198eb36414f63e195e43f1a6e20ccdfb3922f98d74bc5830652355303a80efc2170a7a76d0eea3626328314b3e1514be3af895eb72
6
+ metadata.gz: 572343ee07ec87aedc9d3774e89d2ff8ba1b9acd9682f9378070e197a3fdfe173d29cf112811213c08c3f95ce596dc71894496296a051bec504c87f486981c23
7
+ data.tar.gz: f34521dff687c6cc832ba6dd6e5afd60e2f76ef5e1fefc10db5be9ad273d5110867b6459c05a5e8081bd8dbb5e97f5d64f4d60cad8360f8c808b6ad0880b4977
@@ -1,4 +1,31 @@
1
- # master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v4.4.0...master)
1
+ # main [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v4.6.0...main)
2
+
3
+ # v4.6.0 / 2021-01-28 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.5.2...v4.6.0)
4
+
5
+ * [CHANGE] Fix rubocop offenses (by [@sl4vr][])
6
+ * [CHANGE] Make Github Linguist ignore vendored files (by [@sl4vr][])
7
+ * [BUGFIX] Fix directory structure of reports when comparing branches (by [@denny][])
8
+ * [BUGFIX] Restrict simplecov to versions before data format changed (by [@denny][])
9
+
10
+ # v4.5.2 / 2020-08-20 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.5.1...v4.5.2)
11
+
12
+ * [BUGFIX] Handle simplecov v0.19 and install appraisal (by [@MZiserman][])
13
+
14
+ # v4.5.1 / 2020-06-29 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.5.0...v4.5.1)
15
+
16
+ * [BUGFIX] Handle git --name-status Copied (C) operation (by [@rizalmuthi][])
17
+
18
+ * [FEATURE] Add --churn-after (only supports git) to limit churn analysis to recent history (by [@jackcasey][])
19
+
20
+ # v4.5.0 / 2020-05-14 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.4.1...v4.5.0)
21
+
22
+ * [CHANGE] Relax `launchy` version dependency requirement
23
+ * [CHANGE] Drop support for ruby 2.3 (by [@joshrpowell][])
24
+ * [CHANGE] Update Reek dependency to '~> 6.0', '< 7.0' (by [@joshrpowell][])
25
+
26
+ # v4.4.1 / 2020-02-20 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.4.0...v4.4.1)
27
+
28
+ * [CHANGE] Rewrite how churn is calculated to make it faster
2
29
 
3
30
  # v4.4.0 / 2020-02-15 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.3.3...v4.4.0)
4
31
 
@@ -330,3 +357,6 @@
330
357
  [@GeoffTidey]: https://github.com/GeoffTidey
331
358
  [@lloydwatkin]: https://github.com/lloydwatkin
332
359
  [@Flink]: https://github.com/Flink
360
+ [@jackcasey]: https://github.com/jackcasey
361
+ [@sl4vr]: https://github.com/sl4vr
362
+ [@denny]: https://github.com/denny
File without changes
data/Gemfile CHANGED
File without changes
File without changes
data/README.md CHANGED
@@ -216,10 +216,10 @@ See [formatters](docs/formatters.md)
216
216
 
217
217
  RubyCritic is supporting Ruby versions:
218
218
 
219
- * 2.3
220
219
  * 2.4
221
220
  * 2.5
222
221
  * 2.6
222
+ * 2.7
223
223
 
224
224
  ## Improving RubyCritic
225
225
 
data/ROADMAP.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -9,6 +9,8 @@ module RubyCritic
9
9
  class Coverage
10
10
  include Colorize
11
11
 
12
+ RESULTSET_FILENAME = '.resultset.json'
13
+
12
14
  def initialize(analysed_modules)
13
15
  @analysed_modules = analysed_modules
14
16
  @result = results.first
@@ -44,30 +46,28 @@ module RubyCritic
44
46
  @result.source_files.detect { |file| file.filename == needle }
45
47
  end
46
48
 
47
- # The path to the .resultset.json cache file
49
+ # The path to the cache file
48
50
  def resultset_path
49
- File.join(SimpleCov.coverage_path, '.resultset.json')
51
+ File.join(SimpleCov.coverage_path, RESULTSET_FILENAME)
50
52
  end
51
53
 
52
54
  def resultset_writelock
53
- File.join(SimpleCov.coverage_path, '.resultset.json.lock')
55
+ "#{resultset_path}.lock"
54
56
  end
55
57
 
56
58
  # Loads the cached resultset from JSON and returns it as a Hash,
57
59
  # caching it for subsequent accesses.
58
60
  def resultset
59
- @resultset ||= begin
60
- if (data = stored_data)
61
- begin
62
- JSON.parse(data) || {}
63
- rescue JSON::ParserError => err
64
- puts "Error: Loading .resultset.json: #{err.message}"
65
- {}
66
- end
67
- else
68
- {}
69
- end
70
- end
61
+ @resultset ||= parse_resultset(stored_data)
62
+ end
63
+
64
+ def parse_resultset(data)
65
+ return {} unless data
66
+
67
+ JSON.parse(data) || {}
68
+ rescue JSON::ParserError => err
69
+ puts "Error: Loading #{RESULTSET_FILENAME}: #{err.message}"
70
+ {}
71
71
  end
72
72
 
73
73
  # Returns the contents of the resultset cache as a string or if the file is missing or empty nil
@@ -91,15 +91,17 @@ module RubyCritic
91
91
 
92
92
  return yield unless File.exist?(resultset_writelock)
93
93
 
94
- begin
95
- @resultset_locked = true
96
- File.open(resultset_writelock, 'w+') do |file|
97
- file.flock(File::LOCK_EX)
98
- yield
99
- end
100
- ensure
101
- @resultset_locked = false
94
+ with_lock(&proc)
95
+ end
96
+
97
+ def with_lock
98
+ @resultset_locked = true
99
+ File.open(resultset_writelock, 'w+') do |file|
100
+ file.flock(File::LOCK_EX)
101
+ yield
102
102
  end
103
+ ensure
104
+ @resultset_locked = false
103
105
  end
104
106
 
105
107
  # Gets the resultset hash and re-creates all included instances
@@ -107,11 +109,15 @@ module RubyCritic
107
109
  # All results that are above the SimpleCov.merge_timeout will be
108
110
  # dropped. Returns an array of SimpleCov::Result items.
109
111
  def results
110
- array = []
111
- resultset.each do |command_name, data|
112
- array << ::SimpleCov::Result.from_hash(command_name => data)
112
+ if Gem.loaded_specs['simplecov'].version >= Gem::Version.new('0.19')
113
+ ::SimpleCov::Result.from_hash(resultset)
114
+ else
115
+ array = []
116
+ resultset.each do |command_name, data|
117
+ array << ::SimpleCov::Result.from_hash(command_name => data)
118
+ end
119
+ array
113
120
  end
114
- array
115
121
  end
116
122
  end
117
123
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -70,6 +70,12 @@ module RubyCritic
70
70
  self.minimum_score = Float(min_score)
71
71
  end
72
72
 
73
+ opts.on('--churn-after [DATE]', 'Only count churn from a certain date.',
74
+ 'The date is passed through to version control (currently git only).',
75
+ 'Example: 2017-01-01') do |churn_after|
76
+ self.churn_after = churn_after
77
+ end
78
+
73
79
  opts.on('-m', '--mode-ci [BASE_BRANCH]',
74
80
  'Use CI mode (faster, analyses diffs w.r.t base_branch (default: master))') do |branch|
75
81
  self.base_branch = branch || 'master'
@@ -110,6 +116,7 @@ module RubyCritic
110
116
  suppress_ratings: suppress_ratings,
111
117
  help_text: parser.help,
112
118
  minimum_score: minimum_score,
119
+ churn_after: churn_after,
113
120
  no_browser: no_browser,
114
121
  base_branch: base_branch,
115
122
  feature_branch: feature_branch,
@@ -121,7 +128,7 @@ module RubyCritic
121
128
  private
122
129
 
123
130
  attr_accessor :mode, :root, :formats, :formatters, :deduplicate_symlinks,
124
- :suppress_ratings, :minimum_score, :no_browser,
131
+ :suppress_ratings, :minimum_score, :churn_after, :no_browser,
125
132
  :parser, :base_branch, :feature_branch, :threshold_score
126
133
  def paths
127
134
  @argv unless @argv.empty?
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -13,6 +13,7 @@ module RubyCritic
13
13
  class Compare < Default
14
14
  def initialize(options)
15
15
  super
16
+ @original_config_root = Config.root
16
17
  @build_number = 0
17
18
  end
18
19
 
@@ -57,7 +58,7 @@ module RubyCritic
57
58
  def analyse_modified_files
58
59
  modified_files = Config.feature_branch_collection.where(SourceControlSystem::Git.modified_files)
59
60
  analysed_modules = AnalysedModulesCollection.new(modified_files.map(&:path), modified_files)
60
- Config.root = "#{Config.root}/compare"
61
+ Config.root = Config.compare_root_directory
61
62
  report(analysed_modules)
62
63
  end
63
64
 
@@ -85,7 +86,7 @@ module RubyCritic
85
86
  end
86
87
 
87
88
  def branch_directory(branch)
88
- "#{Config.root}/compare/#{Config.send(branch)}"
89
+ "#{@original_config_root}/compare/#{Config.send(branch)}"
89
90
  end
90
91
 
91
92
  # create a txt file with the branch score details
File without changes
File without changes
File without changes
@@ -10,7 +10,7 @@ module RubyCritic
10
10
  :feature_branch, :base_branch_score, :feature_branch_score,
11
11
  :base_root_directory, :feature_root_directory,
12
12
  :compare_root_directory, :threshold_score, :base_branch_collection,
13
- :feature_branch_collection
13
+ :feature_branch_collection, :churn_after
14
14
 
15
15
  def set(options)
16
16
  self.mode = options[:mode] || :default
@@ -19,12 +19,17 @@ module RubyCritic
19
19
  self.suppress_ratings = options[:suppress_ratings]
20
20
  self.open_with = options[:open_with]
21
21
  self.no_browser = options[:no_browser]
22
- self.base_branch = options[:base_branch]
23
- self.feature_branch = options[:feature_branch]
24
22
  self.threshold_score = options[:threshold_score].to_i
23
+ setup_version_control(options)
25
24
  setup_formats(options)
26
25
  end
27
26
 
27
+ def setup_version_control(options)
28
+ self.base_branch = options[:base_branch]
29
+ self.feature_branch = options[:feature_branch]
30
+ self.churn_after = options[:churn_after]
31
+ end
32
+
28
33
  def setup_formats(options)
29
34
  formats = options[:formats].to_a
30
35
  self.formats = formats.empty? ? [:html] : formats
@@ -59,11 +64,15 @@ module RubyCritic
59
64
  end
60
65
 
61
66
  def self.method_missing(method, *args, &block)
62
- configuration.public_send(method, *args, &block)
67
+ if configuration.respond_to?(method)
68
+ configuration.public_send(method, *args, &block)
69
+ else
70
+ super
71
+ end
63
72
  end
64
73
 
65
74
  def self.respond_to_missing?(symbol, include_all = false)
66
- configuration.respond_to_missing?(symbol) || super
75
+ configuration.respond_to?(symbol) || super
67
76
  end
68
77
  end
69
78
  end
File without changes
File without changes
File without changes
File without changes
@@ -221,7 +221,7 @@ header {
221
221
  }
222
222
  .sidebar-nav li a:hover {color:#9B111D;}
223
223
  .sidebar-nav li a i,.sidebar-nav li a img {font-size:18px;display:block;margin:0 auto;}
224
- /*End of Layout Stlyes*/
224
+ /*End of Layout Styles*/
225
225
 
226
226
  .fadeIn {-webkit-animation: fadein 2s; /* Safari, Chrome and Opera > 12.1 */
227
227
  -moz-animation: fadein 2s; /* Firefox < 16 */
File without changes
File without changes
@@ -8,16 +8,16 @@
8
8
  <meta name="viewport" content="width=device-width, initial-scale=1">
9
9
 
10
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">
11
+ <link href="<%= asset_path("vendor/stylesheets/bootstrap.min.css") %>" media="screen, projection, print" rel="stylesheet" type="text/css">
12
+ <link href="<%= asset_path("vendor/stylesheets/font-awesome.min.css") %>" media="screen, projection, print" rel="stylesheet" type="text/css">
13
+ <link href="<%= asset_path("vendor/stylesheets/prettify.custom_theme.css") %>" media="screen, projection, print" rel="stylesheet" type="text/css">
14
+ <link href="<%= asset_path("stylesheets/application.css") %>" media="screen, projection, print" rel="stylesheet" type="text/css">
15
15
  </head>
16
16
 
17
17
  <body>
18
18
  <header class="navbar navbar-default navbar-fixed-top">
19
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>
20
+ <a href="<%= file_path('overview.html') %>"><img src="<%= asset_path('images/logo.png') %>" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
21
21
  <% if Config.compare_branches_mode? %>
22
22
  <ul class="nav navbar-nav navbar-right">
23
23
  <a href="<%= @base_path %>"><span class="branch"><%= Config.base_branch %></span></a>
@@ -53,14 +53,14 @@
53
53
  </div>
54
54
 
55
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') %>
56
+ <script src="<%= asset_path("vendor/javascripts/jquery.min.js") %>"></script>
57
+ <script src="<%= asset_path("vendor/javascripts/jquery.tablesorter.min.js") %>"></script>
58
+ <script src="<%= asset_path("vendor/javascripts/jquery.scrollTo.min.js") %>"></script>
59
+ <script src="<%= asset_path("vendor/javascripts/jquery.timeago.js") %>"></script>
60
+ <script src="<%= asset_path("vendor/javascripts/highcharts.src-4.0.1.js") %>"></script>
61
+ <script src="<%= asset_path("vendor/javascripts/prettify.js") %>"></script>
62
+ <script src="<%= asset_path("vendor/javascripts/bootstrap.min.js") %>"></script>
63
+ <script src="<%= asset_path("javascripts/application.js") %>"></script>
64
+ <script src="<%= asset_path("vendor/javascripts/jquery.filtertable.min.js") %>"></script>
65
65
  </body>
66
66
  </html>
@@ -6,22 +6,10 @@ module RubyCritic
6
6
  "<time class='js-timeago' datetime='#{time}'>#{time}</time>"
7
7
  end
8
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
9
  def asset_path(file)
18
10
  relative_path("assets/#{file}")
19
11
  end
20
12
 
21
- def image_path(file)
22
- asset_path("images/#{file}")
23
- end
24
-
25
13
  def file_path(file)
26
14
  relative_path(file)
27
15
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -6,7 +6,7 @@ require 'shellwords'
6
6
  module RubyCritic
7
7
  module SourceControlSystem
8
8
  class Base
9
- @@systems = []
9
+ @@systems = [] # rubocop:disable Style/ClassVars
10
10
 
11
11
  def self.register_system
12
12
  @@systems << self
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'tty/which'
4
+ require 'rubycritic/source_control_systems/git/churn'
4
5
 
5
6
  module RubyCritic
6
7
  module SourceControlSystem
@@ -28,12 +29,16 @@ module RubyCritic
28
29
  'Git'
29
30
  end
30
31
 
32
+ def churn
33
+ @churn ||= Churn.new(churn_after: Config.churn_after)
34
+ end
35
+
31
36
  def revisions_count(path)
32
- git("log --follow --format=%h #{path.shellescape}").count("\n")
37
+ churn.revisions_count(path)
33
38
  end
34
39
 
35
40
  def date_of_last_commit(path)
36
- git("log -1 --date=iso --format=%ad #{path.shellescape}").chomp!
41
+ churn.date_of_last_commit(path)
37
42
  end
38
43
 
39
44
  def revision?
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyCritic
4
+ module SourceControlSystem
5
+ class Git < Base
6
+ Stats = Struct.new(:count, :date)
7
+
8
+ class Renames
9
+ def initialize
10
+ @data = {}
11
+ end
12
+
13
+ def renamed(from, to)
14
+ current = current(to)
15
+ @data[from] = current
16
+ end
17
+
18
+ def current(name)
19
+ @data.fetch(name, name)
20
+ end
21
+ end
22
+
23
+ class Churn
24
+ def initialize(churn_after: nil)
25
+ @renames = Renames.new
26
+ @date = nil
27
+ @stats = {}
28
+ @churn_after = churn_after
29
+
30
+ call
31
+ end
32
+
33
+ def revisions_count(path)
34
+ stats(path).count
35
+ end
36
+
37
+ def date_of_last_commit(path)
38
+ stats(path).date
39
+ end
40
+
41
+ private
42
+
43
+ def call
44
+ Git
45
+ .git(git_log_command)
46
+ .split("\n")
47
+ .reject(&:empty?)
48
+ .each { |line| process_line(line) }
49
+ end
50
+
51
+ def git_log_command
52
+ after_clause = @churn_after ? "--after='#{@churn_after}' " : ''
53
+ "log --all --date=iso --follow --format='format:date:%x09%ad' --name-status #{after_clause}."
54
+ end
55
+
56
+ def process_line(line)
57
+ operation, *rest = line.split("\t")
58
+
59
+ case operation
60
+ when /^date:/
61
+ process_date(*rest)
62
+ when /^[RC]/
63
+ process_rename(*rest)
64
+ else
65
+ process_file(*rest)
66
+ end
67
+ end
68
+
69
+ def process_date(date)
70
+ @date = date
71
+ end
72
+
73
+ def process_rename(from, to)
74
+ @renames.renamed(from, to)
75
+ process_file(to)
76
+ end
77
+
78
+ def process_file(filename)
79
+ record_commit(@renames.current(filename), @date)
80
+ end
81
+
82
+ def record_commit(filename, date)
83
+ stats = @stats[filename] ||= Stats.new(0, date)
84
+ stats.count += 1
85
+ end
86
+
87
+ def stats(path)
88
+ @stats.fetch(path, Stats.new(0))
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
File without changes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyCritic
4
- VERSION = '4.4.0'.freeze
4
+ VERSION = '4.6.0'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycritic
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.0
4
+ version: 4.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guilherme Simoes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-15 00:00:00.000000000 Z
11
+ date: 2021-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: flay
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: launchy
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 2.4.3
47
+ version: 2.0.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 2.4.3
54
+ version: 2.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: parser
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,20 +86,20 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '5.0'
89
+ version: '6.0'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
- version: '6.0'
92
+ version: '7.0'
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: '5.0'
99
+ version: '6.0'
100
100
  - - "<"
101
101
  - !ruby/object:Gem::Version
102
- version: '6.0'
102
+ version: '7.0'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: ruby_parser
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +121,9 @@ dependencies:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: 0.17.0
124
+ - - "<"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.21'
124
127
  type: :runtime
125
128
  prerelease: false
126
129
  version_requirements: !ruby/object:Gem::Requirement
@@ -128,6 +131,9 @@ dependencies:
128
131
  - - ">="
129
132
  - !ruby/object:Gem::Version
130
133
  version: 0.17.0
134
+ - - "<"
135
+ - !ruby/object:Gem::Version
136
+ version: '0.21'
131
137
  - !ruby/object:Gem::Dependency
132
138
  name: tty-which
133
139
  requirement: !ruby/object:Gem::Requirement
@@ -156,6 +162,20 @@ dependencies:
156
162
  - - "~>"
157
163
  - !ruby/object:Gem::Version
158
164
  version: '1.0'
165
+ - !ruby/object:Gem::Dependency
166
+ name: appraisal
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
159
179
  - !ruby/object:Gem::Dependency
160
180
  name: aruba
161
181
  requirement: !ruby/object:Gem::Requirement
@@ -434,35 +454,35 @@ files:
434
454
  - lib/rubycritic/core/rating.rb
435
455
  - lib/rubycritic/core/smell.rb
436
456
  - lib/rubycritic/generators/console_report.rb
437
- - lib/rubycritic/generators/html/assets/fonts/FontAwesome.otf
438
457
  - lib/rubycritic/generators/html/assets/fonts/Roboto-Medium.ttf
439
458
  - lib/rubycritic/generators/html/assets/fonts/Roboto-Regular.ttf
440
- - lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.eot
441
- - lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.svg
442
- - lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.ttf
443
- - lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.woff
444
- - lib/rubycritic/generators/html/assets/fonts/fontawesome-webfont.woff2
445
- - lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.eot
446
- - lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.svg
447
- - lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.ttf
448
- - lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.woff
449
- - lib/rubycritic/generators/html/assets/fonts/glyphicons-halflings-regular.woff2
450
459
  - lib/rubycritic/generators/html/assets/images/logo.png
451
460
  - lib/rubycritic/generators/html/assets/javascripts/application.js
452
- - lib/rubycritic/generators/html/assets/javascripts/bootstrap.min.js
453
- - lib/rubycritic/generators/html/assets/javascripts/highcharts.src-4.0.1.js
454
- - lib/rubycritic/generators/html/assets/javascripts/jquery.filtertable.min.js
455
- - lib/rubycritic/generators/html/assets/javascripts/jquery.min.js
456
- - lib/rubycritic/generators/html/assets/javascripts/jquery.scrollTo.min.js
457
- - lib/rubycritic/generators/html/assets/javascripts/jquery.tablesorter.js
458
- - lib/rubycritic/generators/html/assets/javascripts/jquery.tablesorter.min.js
459
- - lib/rubycritic/generators/html/assets/javascripts/jquery.timeago.js
460
- - lib/rubycritic/generators/html/assets/javascripts/prettify.js
461
461
  - lib/rubycritic/generators/html/assets/stylesheets/application.css
462
- - lib/rubycritic/generators/html/assets/stylesheets/bootstrap.min.css
463
- - lib/rubycritic/generators/html/assets/stylesheets/font-awesome.min.css
464
- - lib/rubycritic/generators/html/assets/stylesheets/prettify.css
465
- - lib/rubycritic/generators/html/assets/stylesheets/prettify.custom_theme.css
462
+ - lib/rubycritic/generators/html/assets/vendor/fonts/FontAwesome.otf
463
+ - lib/rubycritic/generators/html/assets/vendor/fonts/fontawesome-webfont.eot
464
+ - lib/rubycritic/generators/html/assets/vendor/fonts/fontawesome-webfont.svg
465
+ - lib/rubycritic/generators/html/assets/vendor/fonts/fontawesome-webfont.ttf
466
+ - lib/rubycritic/generators/html/assets/vendor/fonts/fontawesome-webfont.woff
467
+ - lib/rubycritic/generators/html/assets/vendor/fonts/fontawesome-webfont.woff2
468
+ - lib/rubycritic/generators/html/assets/vendor/fonts/glyphicons-halflings-regular.eot
469
+ - lib/rubycritic/generators/html/assets/vendor/fonts/glyphicons-halflings-regular.svg
470
+ - lib/rubycritic/generators/html/assets/vendor/fonts/glyphicons-halflings-regular.ttf
471
+ - lib/rubycritic/generators/html/assets/vendor/fonts/glyphicons-halflings-regular.woff
472
+ - lib/rubycritic/generators/html/assets/vendor/fonts/glyphicons-halflings-regular.woff2
473
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/bootstrap.min.js
474
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/highcharts.src-4.0.1.js
475
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.filtertable.min.js
476
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.min.js
477
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.scrollTo.min.js
478
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.tablesorter.js
479
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.tablesorter.min.js
480
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/jquery.timeago.js
481
+ - lib/rubycritic/generators/html/assets/vendor/javascripts/prettify.js
482
+ - lib/rubycritic/generators/html/assets/vendor/stylesheets/bootstrap.min.css
483
+ - lib/rubycritic/generators/html/assets/vendor/stylesheets/font-awesome.min.css
484
+ - lib/rubycritic/generators/html/assets/vendor/stylesheets/prettify.css
485
+ - lib/rubycritic/generators/html/assets/vendor/stylesheets/prettify.custom_theme.css
466
486
  - lib/rubycritic/generators/html/base.rb
467
487
  - lib/rubycritic/generators/html/code_file.rb
468
488
  - lib/rubycritic/generators/html/code_index.rb
@@ -496,6 +516,7 @@ files:
496
516
  - lib/rubycritic/source_control_systems/base.rb
497
517
  - lib/rubycritic/source_control_systems/double.rb
498
518
  - lib/rubycritic/source_control_systems/git.rb
519
+ - lib/rubycritic/source_control_systems/git/churn.rb
499
520
  - lib/rubycritic/source_control_systems/mercurial.rb
500
521
  - lib/rubycritic/source_control_systems/perforce.rb
501
522
  - lib/rubycritic/source_locator.rb
@@ -512,7 +533,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
512
533
  requirements:
513
534
  - - ">="
514
535
  - !ruby/object:Gem::Version
515
- version: 2.3.0
536
+ version: 2.4.0
516
537
  required_rubygems_version: !ruby/object:Gem::Requirement
517
538
  requirements:
518
539
  - - ">="