rubycritic 3.2.3 → 3.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b8572beecbb1728adcda3fd6814cca239ce53e1b
4
- data.tar.gz: 80825e46376df6b51b860055d01e86b80b64a340
3
+ metadata.gz: fb8941448d84144db4e15c3cb37731de9c78a9b9
4
+ data.tar.gz: 36cf41f7d42d12668c4abe9f6300e0cbdeec43a5
5
5
  SHA512:
6
- metadata.gz: fc743073fcc8bf35c343d65ed22aaf7a8aa28420c4cebfdfbde6d2081fe228a765391ef1e9f28ca08c5c69aec01d8a8379b177b1567d2ebf5b0ee2bdf9c63124
7
- data.tar.gz: '0990bfc4da09ad3b33c75819c73136d66b0fbb9c7ab57d971570157eb28c6d84ede2961f5505140d236184b7fd1e62449dedf4a5031120ca73d7c1cb19382836'
6
+ metadata.gz: 2174e7c073020b197681db5c4af3501b302f85d64cb858c224e772d93a268eeebd68bf9d530203a20f278918d5bd03370be8a7d5ff988e83e1d1a7792ab05908
7
+ data.tar.gz: fb77e4cc9ce6aafe5cc8239f90d79f6354046568934f6baf37eda7bb47786fe77b256c8fef53fa548e442d7caad8b0e627eda1f9e6beb5c68b0aada9d2e3feaf
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ tmp
20
20
  .ruby-gemset
21
21
  .ruby-version
22
22
  .DS_Store
23
+ .byebug_history
@@ -17,7 +17,7 @@ Metrics/MethodLength:
17
17
  - 'lib/rubycritic/platforms/base.rb'
18
18
 
19
19
  # Offense count: 4
20
- Style/AccessorMethodName:
20
+ Naming/AccessorMethodName:
21
21
  Exclude:
22
22
  - 'lib/rubycritic/analysers/helpers/ast_node.rb'
23
23
  - 'lib/rubycritic/generators/html/base.rb'
@@ -37,9 +37,9 @@ Style/SpecialGlobalVars:
37
37
 
38
38
  # Offense count: 1
39
39
  Style/MethodMissing:
40
- Exclude:
40
+ Exclude:
41
41
  - 'lib/rubycritic/configuration.rb'
42
42
 
43
43
  # Offense count: 3
44
- Style/IndentHeredoc:
44
+ Layout/IndentHeredoc:
45
45
  Enabled: false
@@ -1,4 +1,12 @@
1
- # master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v3.2.3...master)
1
+ # master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v3.3.0...master)
2
+
3
+ # 3.3.0 / 2017-10-10 [(commits)](https://github.com/whitesmith/rubycritic/compare/v3.2.3...v3.3.0)
4
+
5
+ * [FEATURE] Add lint format similar to Golint (by [@nightscape][])
6
+ * [CHANGE] Update `cucumber` to 3.0 (by [@onumis][])
7
+ * [CHANGE] Update `rake` to 12.0 (by [@onumis][])
8
+ * [CHANGE] Update `rubocop` to 0.50.0 (by [@onumis][])
9
+ * [CHANGE] Accepting floating point values from Flog (by [@onumis][])
2
10
 
3
11
  # 3.2.3 / 2017-05-31 [(commits)](https://github.com/whitesmith/rubycritic/compare/v3.2.2...v3.2.3)
4
12
 
@@ -215,3 +223,4 @@
215
223
  [@georgedrummond]: https://github.com/georgedrummond
216
224
  [@yuku-t]: https://github.com/yuku-t
217
225
  [@ochagata]: https://github.com/ochagata
226
+ [@nightscape]: https://github.com/nightscape
data/README.md CHANGED
@@ -117,7 +117,7 @@ $ rubycritic --help
117
117
  | `-v` / `--version` | Displays the current version and exits |
118
118
  | `-p` / `--path` | Set path where report will be saved (tmp/rubycritic by default) |
119
119
  | `-f` / `--format` | Report smells in the given format: `html` (default; will open in a browser), `json`, `console`. |
120
- | `-s` / `--minimum-score` | Set a minimum score |
120
+ | `-s` / `--minimum-score` | Set a minimum score (FLOAT: ex: 96.28) |
121
121
  | `--mode-ci` | Use CI mode (faster, but only analyses last commit) |
122
122
  | `--deduplicate-symlinks` | De-duplicate symlinks based on their final target |
123
123
  | `--suppress-ratings` | Suppress letter ratings |
@@ -0,0 +1,64 @@
1
+ # Making Jenkins review Pull Requests
2
+
3
+ ## Installing Jenkins and setting up RubyCritic
4
+
5
+ There is a step-by-step tutorial on how to set up Jenkins in [`building-own-code-climate.md`](./building-own-code-climate.md).
6
+
7
+ ### Installing required plugins
8
+
9
+ Installing a Jenkins Plugin is extremely easy. All you have to do is proceed to `Manage Jenkins`, go to `Manage Plugins`, select the `Available` tab and then check the desired plugin.
10
+
11
+ For creating comments on PRs we are going to use the [Violation Comments to GitHub Jenkins Plugin](https://github.com/jenkinsci/violation-comments-to-github-plugin).
12
+
13
+ ## Configuring the project
14
+
15
+ The Violation plugin has parsers for many different formats, and the GoLint one is compatible with the `lint` format created by RubyCritic.
16
+ We're assuming that you use a `Jenkinsfile` for creating a pipeline, but the approach can be adapted to other scenarios.
17
+
18
+
19
+ ```groovy
20
+ pipeline {
21
+ agent any
22
+
23
+ stages {
24
+ stage('Build') {
25
+ steps {
26
+ // Install gems etc.
27
+ }
28
+ }
29
+ stage('Test') {
30
+ steps {
31
+ parallel tests: { // We are running tests and code_checks in parallel to shorten build times
32
+ sh 'bundle exec rspec'
33
+ },
34
+ code_checks: {
35
+ sh 'bundle exec rubycritic -f lint'
36
+ }
37
+ }
38
+ }
39
+ stage('Package / Deploy') {
40
+ steps {
41
+ parallel deploy: {
42
+ // Create Docker image / deploy via Capistrano / ...
43
+ },
44
+ publish_code_review: {
45
+ step([
46
+ $class: 'ViolationsToGitHubRecorder',
47
+ config: [
48
+ repositoryName: 'your_project_name',
49
+ pullRequestId: env.CHANGE_ID, // The CHANGE_ID env variable will be set to the PR ID by Jenkins
50
+ createSingleFileComments: true, // Create one comment per violation
51
+ commentOnlyChangedContent: true, // Only comment on lines that have changed
52
+ keepOldComments: false,
53
+ violationConfigs: [
54
+ [ pattern: '.*/lint\\.txt$', parser: 'GOLINT', reporter: 'RubyCritic' ], // RubyCritic will output a lint.txt file in GoLint compatible format
55
+ ]
56
+ ]])
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ For further information, check out the documentation of the [Violation Comments to GitHub Jenkins Plugin](https://github.com/jenkinsci/violation-comments-to-github-plugin).
@@ -3,17 +3,17 @@ Feature: Break if overall score is below minimum
3
3
  RubyCritic returns the exit status according with the score
4
4
 
5
5
  Scenario: Status indicates a success when not using --minimum-score
6
- Given the smelly file 'smelly.rb' with a score of 93.75
6
+ Given the smelly file 'smelly.rb' with a score of 93.19
7
7
  When I run rubycritic smelly.rb
8
8
  Then the exit status indicates a success
9
9
 
10
10
  Scenario: Status indicates an error when score below the minimum
11
- Given the smelly file 'smelly.rb' with a score of 93.75
11
+ Given the smelly file 'smelly.rb' with a score of 93.19
12
12
  When I run rubycritic --minimum-score 100 smelly.rb
13
13
  Then the exit status indicates an error
14
14
 
15
15
  Scenario: Status indicates a success when score is above the minimum
16
- Given the smelly file 'smelly.rb' with a score of 93.75
16
+ Given the smelly file 'smelly.rb' with a score of 93.19
17
17
  When I run rubycritic --minimum-score 93 smelly.rb
18
18
  Then the exit status indicates a success
19
19
 
@@ -23,11 +23,11 @@ Feature: Break if overall score is below minimum
23
23
  Then the exit status indicates a success
24
24
 
25
25
  Scenario: Prints the score on output
26
- Given the smelly file 'smelly.rb' with a score of 93.75
26
+ Given the smelly file 'smelly.rb' with a score of 93.19
27
27
  When I run rubycritic smelly.rb
28
28
  Then the output should contain:
29
29
  """
30
- Score: 93.75
30
+ Score: 93.19
31
31
  """
32
32
 
33
33
  Scenario: Prints a message informing the score is below the minimum
@@ -25,6 +25,7 @@ Feature: RubyCritic can be controlled using command-line options
25
25
  html (default; will open in a browser)
26
26
  json
27
27
  console
28
+ lint
28
29
  -s, --minimum-score [MIN_SCORE] Set a minimum score
29
30
  -m, --mode-ci Use CI mode (faster, but only analyses last commit)
30
31
  --deduplicate-symlinks De-duplicate symlinks based on their final target
@@ -61,5 +61,5 @@ Feature: RubyCritic can be run via Rake task
61
61
  """
62
62
  Then the output should contain:
63
63
  """
64
- Score (93.75) is below the minimum 95
64
+ Score (93.19) is below the minimum 95
65
65
  """
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Given(/^the smelly file 'smelly.rb'/) do
4
- contents = <<-EOS.strip_heredoc
4
+ contents = <<-RUBY.strip_heredoc
5
5
  class AllTheMethods
6
6
  def method_missing(method, *args, &block)
7
7
  message = "I"
@@ -13,17 +13,17 @@ Given(/^the smelly file 'smelly.rb'/) do
13
13
  self.send(method)
14
14
  end
15
15
  end
16
- EOS
16
+ RUBY
17
17
  write_file('smelly.rb', contents)
18
18
  end
19
19
 
20
20
  Given(/^the clean file 'clean.rb'/) do
21
- contents = <<-EOS.strip_heredoc
21
+ contents = <<-RUBY.strip_heredoc
22
22
  # Explanatory comment
23
23
  class Clean
24
24
  def foo; end
25
25
  end
26
- EOS
26
+ RUBY
27
27
  write_file('clean.rb', contents)
28
28
  end
29
29
 
@@ -22,11 +22,11 @@ class RubyCriticWorld
22
22
  end
23
23
 
24
24
  def rake(name, task_def)
25
- header = <<-EOS.strip_heredoc
25
+ header = <<-RUBY.strip_heredoc
26
26
  require 'rubycritic'
27
27
  require 'rubycritic/rake_task'
28
28
 
29
- EOS
29
+ RUBY
30
30
  write_file 'Rakefile', header + task_def
31
31
  run_simple("rake #{name}", false)
32
32
  end
@@ -16,7 +16,7 @@ module RubyCritic
16
16
  @analysed_modules.each do |analysed_module|
17
17
  @flog.reset
18
18
  @flog.flog(analysed_module.path)
19
- analysed_module.complexity = @flog.total_score.round
19
+ analysed_module.complexity = @flog.total_score.round(2)
20
20
  print green '.'
21
21
  end
22
22
  puts ''
@@ -22,17 +22,18 @@ module RubyCritic
22
22
 
23
23
  opts.on(
24
24
  '-f', '--format [FORMAT]',
25
- %i[html json console],
25
+ %i[html json console lint],
26
26
  'Report smells in the given format:',
27
27
  ' html (default; will open in a browser)',
28
28
  ' json',
29
- ' console'
29
+ ' console',
30
+ ' lint'
30
31
  ) do |format|
31
32
  self.format = format
32
33
  end
33
34
 
34
35
  opts.on('-s', '--minimum-score [MIN_SCORE]', 'Set a minimum score') do |min_score|
35
- self.minimum_score = Integer(min_score)
36
+ self.minimum_score = Float(min_score)
36
37
  end
37
38
 
38
39
  opts.on('-m', '--mode-ci', 'Use CI mode (faster, but only analyses last commit)') do
@@ -7,6 +7,9 @@ module RubyCritic
7
7
  class AnalysedModule
8
8
  include Virtus.model
9
9
 
10
+ # Complexity is reduced by a factor of 25 when calculating cost
11
+ COMPLEXITY_FACTOR = 25.0
12
+
10
13
  attribute :name
11
14
  attribute :smells_count
12
15
  attribute :file_location
@@ -16,7 +19,7 @@ module RubyCritic
16
19
  attribute :smells, Array, default: []
17
20
  attribute :churn
18
21
  attribute :committed_at
19
- attribute :complexity
22
+ attribute :complexity, Float, default: Float::INFINITY
20
23
  attribute :duplication, Integer, default: 0
21
24
  attribute :methods_count
22
25
 
@@ -37,7 +40,8 @@ module RubyCritic
37
40
  end
38
41
 
39
42
  def cost
40
- @cost ||= smells.map(&:cost).inject(0, :+) + (complexity / 25)
43
+ @cost ||= smells.map(&:cost).inject(0.0, :+) +
44
+ (complexity / COMPLEXITY_FACTOR)
41
45
  end
42
46
 
43
47
  def rating
@@ -32,9 +32,11 @@ module RubyCritic
32
32
  end
33
33
 
34
34
  def score
35
- MAX_SCORE - average_limited_cost * COST_MULTIPLIER
36
- rescue
37
- 0.0
35
+ if @modules.any?
36
+ MAX_SCORE - average_limited_cost * COST_MULTIPLIER
37
+ else
38
+ 0.0
39
+ end
38
40
  end
39
41
 
40
42
  def summary
@@ -48,8 +50,16 @@ module RubyCritic
48
50
  private
49
51
 
50
52
  def average_limited_cost
51
- avg = map { |mod| limited_cost_for(mod) }.reduce(:+) / @modules.size.to_f
52
- [avg, ZERO_SCORE_COST].min
53
+ [average_cost, ZERO_SCORE_COST].min
54
+ end
55
+
56
+ def average_cost
57
+ num_modules = @modules.size
58
+ if num_modules > 0
59
+ map { |mod| limited_cost_for(mod) }.reduce(:+) / num_modules.to_f
60
+ else
61
+ 0.0
62
+ end
53
63
  end
54
64
 
55
65
  def limited_cost_for(mod)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/generators/text/lint'
4
+
5
+ module RubyCritic
6
+ module Generator
7
+ class LintReport
8
+ def initialize(analysed_modules)
9
+ @analysed_modules = analysed_modules
10
+ end
11
+
12
+ def generate_report
13
+ FileUtils.mkdir_p(generator.file_directory)
14
+ File.open(generator.file_pathname, 'w+') do |file|
15
+ file.write(reports.join("\n"))
16
+ end
17
+ end
18
+
19
+ def generator
20
+ Text::Lint
21
+ end
22
+
23
+ def reports
24
+ @analysed_modules.sort.map do |mod|
25
+ generator.new(mod).render
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ module RubyCritic
5
+ module Generator
6
+ module Text
7
+ class Lint
8
+ class << self
9
+ TEMPLATE_PATH = File.expand_path('../templates/lint.erb', __FILE__)
10
+ FILE_NAME = 'lint.txt'.freeze
11
+
12
+ def file_directory
13
+ @file_directory ||= Pathname.new(Config.root)
14
+ end
15
+
16
+ def file_pathname
17
+ Pathname.new(file_directory).join FILE_NAME
18
+ end
19
+
20
+ def erb_template
21
+ @erb_template ||= ERB.new(File.read(TEMPLATE_PATH), nil, '-')
22
+ end
23
+ end
24
+
25
+ def initialize(analysed_module)
26
+ @analysed_module = analysed_module
27
+ end
28
+
29
+ def render
30
+ erb_template.result(binding)
31
+ end
32
+
33
+ private
34
+
35
+ def erb_template
36
+ self.class.erb_template
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ <%- @analysed_module.smells.each do |smell| -%>
2
+ <%= smell.locations.first.to_s %>: <%= smell.to_s %>
3
+ <%- end -%>
@@ -14,6 +14,9 @@ module RubyCritic
14
14
  when :console
15
15
  require 'rubycritic/generators/console_report'
16
16
  Generator::ConsoleReport
17
+ when :lint
18
+ require 'rubycritic/generators/lint_report'
19
+ Generator::LintReport
17
20
  else
18
21
  require 'rubycritic/generators/html_report'
19
22
  Generator::HtmlReport
@@ -1,12 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'tty/which'
4
+
3
5
  module RubyCritic
4
6
  module SourceControlSystem
5
7
  class Git < Base
6
8
  register_system
9
+ GIT_EXECUTABLE = TTY::Which.which('git')
10
+
11
+ def self.git(arg)
12
+ `#{GIT_EXECUTABLE} #{arg}`
13
+ end
14
+
15
+ def git(arg)
16
+ self.class.git(arg)
17
+ end
7
18
 
8
19
  def self.supported?
9
- `git branch 2>&1` && $?.success?
20
+ git('branch 2>&1') && $?.success?
10
21
  end
11
22
 
12
23
  def self.to_s
@@ -14,11 +25,11 @@ module RubyCritic
14
25
  end
15
26
 
16
27
  def revisions_count(path)
17
- `git log --follow --format=%h #{path.shellescape}`.count("\n")
28
+ git("log --follow --format=%h #{path.shellescape}").count("\n")
18
29
  end
19
30
 
20
31
  def date_of_last_commit(path)
21
- `git log -1 --date=iso --format=%ad #{path.shellescape}`.chomp!
32
+ git("log -1 --date=iso --format=%ad #{path.shellescape}").chomp!
22
33
  end
23
34
 
24
35
  def revision?
@@ -26,7 +37,7 @@ module RubyCritic
26
37
  end
27
38
 
28
39
  def head_reference
29
- `git rev-parse --verify HEAD`.chomp!
40
+ git('rev-parse --verify HEAD').chomp!
30
41
  end
31
42
 
32
43
  def travel_to_head
@@ -40,17 +51,17 @@ module RubyCritic
40
51
 
41
52
  def stash_changes
42
53
  stashes_count_before = stashes_count
43
- `git stash`
54
+ git('stash')
44
55
  stashes_count_after = stashes_count
45
56
  stashes_count_after > stashes_count_before
46
57
  end
47
58
 
48
59
  def stashes_count
49
- `git stash list --format=%h`.count("\n")
60
+ git('stash list --format=%h').count("\n")
50
61
  end
51
62
 
52
63
  def travel_to_original_state
53
- `git stash pop`
64
+ git('stash pop')
54
65
  end
55
66
  end
56
67
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
+ require 'rubycritic/configuration'
4
5
 
5
6
  module RubyCritic
6
7
  class SourceLocator
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyCritic
4
- VERSION = '3.2.3'.freeze
4
+ VERSION = '3.3.0'.freeze
5
5
  end
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  lib = File.expand_path('../lib', __FILE__)
@@ -25,6 +24,7 @@ Gem::Specification.new do |spec|
25
24
  spec.add_runtime_dependency 'flay', '~> 2.8'
26
25
  spec.add_runtime_dependency 'flog', '~> 4.4'
27
26
  spec.add_runtime_dependency 'launchy', '2.4.3'
27
+ spec.add_runtime_dependency 'tty-which', '~> 0.3.0'
28
28
  spec.add_runtime_dependency 'parser', '~> 2.4.0'
29
29
  spec.add_runtime_dependency 'rainbow', '~> 2.1'
30
30
  spec.add_runtime_dependency 'reek', '~> 4.4'
@@ -33,10 +33,13 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_development_dependency 'aruba', '~> 0.12', '>= 0.12.0'
35
35
  spec.add_development_dependency 'bundler', '~> 1.3', '>= 1.3.0'
36
- spec.add_development_dependency 'cucumber', '~> 2.2', '>= 2.2.0'
36
+ spec.add_development_dependency 'cucumber', '~> 3.0', '>= 2.2.0'
37
37
  spec.add_development_dependency 'fakefs', '~> 0.10', '>= 0.10.0'
38
38
  spec.add_development_dependency 'minitest', '~> 5.3', '>= 5.3.0'
39
+ spec.add_development_dependency 'minitest-around', '~> 0.4.0'
40
+ spec.add_development_dependency 'diff-lcs', '~> 1.3'
39
41
  spec.add_development_dependency 'mocha', '~> 1.1', '>= 1.1.0'
40
- spec.add_development_dependency 'rake', '~> 11.0', '>= 11.0.0'
41
- spec.add_development_dependency 'rubocop', '~> 0.48.0'
42
+ spec.add_development_dependency 'rake', '~> 12.0', '>= 11.0.0'
43
+ spec.add_development_dependency 'rubocop', '~> 0.50.0'
44
+ spec.add_development_dependency 'byebug', '~> 9.0', '>= 8.0'
42
45
  end
@@ -50,13 +50,13 @@ describe RubyCritic::Command::StatusReporter do
50
50
  it 'should return the correct status' do
51
51
  @reporter.score = score
52
52
  @reporter.status.must_equal score_below_minimum
53
- @reporter.status_message.must_equal 'Score (98.0) is below the minimum 99'
53
+ @reporter.status_message.must_equal 'Score (98.0) is below the minimum 99.0'
54
54
  end
55
55
 
56
56
  it 'should format the score' do
57
57
  @reporter.score = 98.95258620689656
58
58
  @reporter.status.must_equal score_below_minimum
59
- @reporter.status_message.must_equal 'Score (98.95) is below the minimum 99'
59
+ @reporter.status_message.must_equal 'Score (98.95) is below the minimum 99.0'
60
60
  end
61
61
  end
62
62
 
@@ -1,34 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'test_helper'
4
- require 'rubycritic/core/analysed_modules_collection'
4
+ require 'rubycritic/analysers_runner'
5
5
  require 'rubycritic/generators/json_report'
6
6
  require 'json'
7
7
  require 'fakefs/safe'
8
8
 
9
9
  describe RubyCritic::Generator::JsonReport do
10
10
  describe '#generate_report' do
11
- before(:each) do
12
- FakeFS.activate!
13
- create_analysed_modules_collection
14
- generate_report
11
+ around do |example|
12
+ capture_output_streams do
13
+ with_cloned_fs(&example)
14
+ end
15
15
  end
16
16
 
17
- after(:each) { FakeFS.deactivate! }
18
-
19
- it 'creates a report.json file' do
20
- assert File.file?('test/samples/report.json'), 'expected report.json file to be created'
21
- end
22
-
23
- it 'report file has data inside' do
24
- data = File.read('test/samples/report.json')
25
- assert data != '', 'expected report file not to be empty'
17
+ it 'creates a report file with JSON data inside' do
18
+ sample_files = Dir['test/samples/**/*.rb']
19
+ create_analysed_modules_collection
20
+ generate_report
21
+ data = JSON.parse(File.read('test/samples/report.json'))
22
+ analysed_files = data['analysed_modules'].map { |h| h['path'] }.uniq
23
+ assert_matched_arrays analysed_files, sample_files
26
24
  end
27
25
  end
28
26
 
29
27
  def create_analysed_modules_collection
30
- @analysed_modules_collection = RubyCritic::AnalysedModulesCollection.new('test/samples/')
31
28
  RubyCritic::Config.root = 'test/samples'
29
+ RubyCritic::Config.source_control_system = RubyCritic::SourceControlSystem::Git.new
30
+ analyser_runner = RubyCritic::AnalysersRunner.new('test/samples/')
31
+ @analysed_modules_collection = analyser_runner.run
32
32
  end
33
33
 
34
34
  def generate_report
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+ require 'rubycritic/analysers_runner'
5
+ require 'rubycritic/generators/lint_report'
6
+ require 'fakefs/safe'
7
+
8
+ describe RubyCritic::Generator::LintReport do
9
+ describe '#generate_report' do
10
+ around do |example|
11
+ capture_output_streams do
12
+ with_cloned_fs(&example)
13
+ end
14
+ end
15
+
16
+ it 'report file has data inside' do
17
+ sample_files = Dir['test/samples/**/*.rb'].reject { |f| File.zero?(f) }
18
+ create_analysed_modules_collection
19
+ generate_report
20
+ lines = File.readlines('test/samples/lint.txt').map(&:strip).reject(&:empty?)
21
+ analysed_files = lines.map { |line| line.split(':').first }.uniq
22
+ assert_matched_arrays analysed_files, sample_files
23
+ end
24
+ end
25
+
26
+ def create_analysed_modules_collection
27
+ RubyCritic::Config.root = 'test/samples'
28
+ RubyCritic::Config.source_control_system = RubyCritic::SourceControlSystem::Git.new
29
+ analyser_runner = RubyCritic::AnalysersRunner.new('test/samples/')
30
+ @analysed_modules_collection = analyser_runner.run
31
+ end
32
+
33
+ def generate_report
34
+ report = RubyCritic::Generator::LintReport.new(@analysed_modules_collection)
35
+ report.generate_report
36
+ end
37
+ end
@@ -66,7 +66,7 @@ describe RubyCritic::SourceControlSystem::Perforce do
66
66
  describe '::in_client_directory?' do
67
67
  context 'current directory is in p4 client' do
68
68
  let(:p4_info) do
69
- <<-END
69
+ <<-P4INFO
70
70
  User name: unit_test_user
71
71
  Client name: UNIT_TEST_CLIENT
72
72
  Client host: MACHINE_NAME
@@ -75,7 +75,7 @@ Current directory: /path/to/client/root/ruby_project/unit_test
75
75
  Peer address: 127.0.0.1::3000
76
76
  Client address: 127.0.0.1
77
77
  Server address: the.server.address.com
78
- END
78
+ P4INFO
79
79
  end
80
80
 
81
81
  it 'calls p4 info and parse the result' do
@@ -86,7 +86,7 @@ Server address: the.server.address.com
86
86
 
87
87
  context 'current directory is not in p4 client' do
88
88
  let(:p4_info) do
89
- <<-END
89
+ <<-P4INFO
90
90
  User name: unit_test_user
91
91
  Client name: UNIT_TEST_CLIENT
92
92
  Client host: MACHINE_NAME
@@ -95,7 +95,7 @@ Current directory: /somewhere/else/ruby_project/unit_test
95
95
  Peer address: 127.0.0.1::3000
96
96
  Client address: 127.0.0.1
97
97
  Server address: the.server.address.com
98
- END
98
+ P4INFO
99
99
  end
100
100
 
101
101
  it 'calls p4 info and parse the result' do
@@ -107,7 +107,7 @@ Server address: the.server.address.com
107
107
 
108
108
  describe 'retrieve informations' do
109
109
  let(:p4_stats) do
110
- <<-END
110
+ <<-P4STATS
111
111
  ... clientFile /path/to/client/a_ruby_file.rb
112
112
  ... headTime 1473075551
113
113
  ... headRev 16
@@ -118,7 +118,7 @@ Server address: the.server.address.com
118
118
  ... action opened
119
119
  ... headRev 12
120
120
  ... headChange 2103504
121
- END
121
+ P4STATS
122
122
  end
123
123
 
124
124
  describe 'build_file_cache' do
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'minitest/autorun'
4
+ require 'minitest/around/spec'
4
5
  require 'minitest/pride'
5
6
  require 'mocha/mini_test'
6
7
  require 'ostruct'
8
+ require 'diff/lcs'
7
9
 
8
10
  def context(*args, &block)
9
11
  describe(*args, &block)
@@ -18,6 +20,19 @@ ensure
18
20
  $stderr = STDERR
19
21
  end
20
22
 
23
+ def with_cloned_fs
24
+ FakeFS do
25
+ begin
26
+ config = File.expand_path('..', __dir__)
27
+ FakeFS::FileSystem.clone(config)
28
+ Dir.chdir(config)
29
+ yield
30
+ ensure
31
+ FakeFS::FileSystem.clear
32
+ end
33
+ end
34
+ end
35
+
21
36
  module MiniTest
22
37
  module Assertions
23
38
  ##
@@ -31,7 +46,8 @@ module MiniTest
31
46
  assert_kind_of Array, exp_ary
32
47
  act_ary = act.to_ary
33
48
  assert_kind_of Array, act_ary
34
- assert_equal exp_ary.sort, act_ary.sort
49
+ diffs = Diff::LCS.sdiff(act_ary.sort, exp_ary.sort).reject(&:unchanged?)
50
+ assert diffs.empty?, "There are diffs between expected and actual values:\n#{diffs.map(&:inspect).join("\n")}"
35
51
  end
36
52
  end
37
53
 
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: 3.2.3
4
+ version: 3.3.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: 2017-05-31 00:00:00.000000000 Z
11
+ date: 2017-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: flay
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.4.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-which
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.3.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: parser
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -168,7 +182,7 @@ dependencies:
168
182
  requirements:
169
183
  - - "~>"
170
184
  - !ruby/object:Gem::Version
171
- version: '2.2'
185
+ version: '3.0'
172
186
  - - ">="
173
187
  - !ruby/object:Gem::Version
174
188
  version: 2.2.0
@@ -178,7 +192,7 @@ dependencies:
178
192
  requirements:
179
193
  - - "~>"
180
194
  - !ruby/object:Gem::Version
181
- version: '2.2'
195
+ version: '3.0'
182
196
  - - ">="
183
197
  - !ruby/object:Gem::Version
184
198
  version: 2.2.0
@@ -222,6 +236,34 @@ dependencies:
222
236
  - - ">="
223
237
  - !ruby/object:Gem::Version
224
238
  version: 5.3.0
239
+ - !ruby/object:Gem::Dependency
240
+ name: minitest-around
241
+ requirement: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - "~>"
244
+ - !ruby/object:Gem::Version
245
+ version: 0.4.0
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - "~>"
251
+ - !ruby/object:Gem::Version
252
+ version: 0.4.0
253
+ - !ruby/object:Gem::Dependency
254
+ name: diff-lcs
255
+ requirement: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - "~>"
258
+ - !ruby/object:Gem::Version
259
+ version: '1.3'
260
+ type: :development
261
+ prerelease: false
262
+ version_requirements: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - "~>"
265
+ - !ruby/object:Gem::Version
266
+ version: '1.3'
225
267
  - !ruby/object:Gem::Dependency
226
268
  name: mocha
227
269
  requirement: !ruby/object:Gem::Requirement
@@ -248,7 +290,7 @@ dependencies:
248
290
  requirements:
249
291
  - - "~>"
250
292
  - !ruby/object:Gem::Version
251
- version: '11.0'
293
+ version: '12.0'
252
294
  - - ">="
253
295
  - !ruby/object:Gem::Version
254
296
  version: 11.0.0
@@ -258,7 +300,7 @@ dependencies:
258
300
  requirements:
259
301
  - - "~>"
260
302
  - !ruby/object:Gem::Version
261
- version: '11.0'
303
+ version: '12.0'
262
304
  - - ">="
263
305
  - !ruby/object:Gem::Version
264
306
  version: 11.0.0
@@ -268,14 +310,34 @@ dependencies:
268
310
  requirements:
269
311
  - - "~>"
270
312
  - !ruby/object:Gem::Version
271
- version: 0.48.0
313
+ version: 0.50.0
272
314
  type: :development
273
315
  prerelease: false
274
316
  version_requirements: !ruby/object:Gem::Requirement
275
317
  requirements:
276
318
  - - "~>"
277
319
  - !ruby/object:Gem::Version
278
- version: 0.48.0
320
+ version: 0.50.0
321
+ - !ruby/object:Gem::Dependency
322
+ name: byebug
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - "~>"
326
+ - !ruby/object:Gem::Version
327
+ version: '9.0'
328
+ - - ">="
329
+ - !ruby/object:Gem::Version
330
+ version: '8.0'
331
+ type: :development
332
+ prerelease: false
333
+ version_requirements: !ruby/object:Gem::Requirement
334
+ requirements:
335
+ - - "~>"
336
+ - !ruby/object:Gem::Version
337
+ version: '9.0'
338
+ - - ">="
339
+ - !ruby/object:Gem::Version
340
+ version: '8.0'
279
341
  description: RubyCritic is a tool that wraps around various static analysis gems to
280
342
  provide a quality report of your Ruby code.
281
343
  email:
@@ -301,6 +363,7 @@ files:
301
363
  - bin/rubycritic
302
364
  - docs/building-own-code-climate.md
303
365
  - docs/core-metrics.md
366
+ - docs/jenkins-pr-reviews.md
304
367
  - features/command_line_interface/minimum_score.feature
305
368
  - features/command_line_interface/options.feature
306
369
  - features/rake_task.feature
@@ -398,7 +461,10 @@ files:
398
461
  - lib/rubycritic/generators/html_report.rb
399
462
  - lib/rubycritic/generators/json/simple.rb
400
463
  - lib/rubycritic/generators/json_report.rb
464
+ - lib/rubycritic/generators/lint_report.rb
465
+ - lib/rubycritic/generators/text/lint.rb
401
466
  - lib/rubycritic/generators/text/list.rb
467
+ - lib/rubycritic/generators/text/templates/lint.erb
402
468
  - lib/rubycritic/generators/text/templates/list.erb
403
469
  - lib/rubycritic/rake_task.rb
404
470
  - lib/rubycritic/reporter.rb
@@ -432,6 +498,7 @@ files:
432
498
  - test/lib/rubycritic/core/smells_array_test.rb
433
499
  - test/lib/rubycritic/generators/console_report_test.rb
434
500
  - test/lib/rubycritic/generators/json_report_test.rb
501
+ - test/lib/rubycritic/generators/lint_report_test.rb
435
502
  - test/lib/rubycritic/generators/turbulence_test.rb
436
503
  - test/lib/rubycritic/generators/view_helpers_test.rb
437
504
  - test/lib/rubycritic/revision_comparator_test.rb
@@ -482,7 +549,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
482
549
  version: '0'
483
550
  requirements: []
484
551
  rubyforge_project:
485
- rubygems_version: 2.6.10
552
+ rubygems_version: 2.6.13
486
553
  signing_key:
487
554
  specification_version: 4
488
555
  summary: RubyCritic is a Ruby code quality reporter
@@ -506,6 +573,7 @@ test_files:
506
573
  - test/lib/rubycritic/core/smells_array_test.rb
507
574
  - test/lib/rubycritic/generators/console_report_test.rb
508
575
  - test/lib/rubycritic/generators/json_report_test.rb
576
+ - test/lib/rubycritic/generators/lint_report_test.rb
509
577
  - test/lib/rubycritic/generators/turbulence_test.rb
510
578
  - test/lib/rubycritic/generators/view_helpers_test.rb
511
579
  - test/lib/rubycritic/revision_comparator_test.rb