rubocop-gradual 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0faebca65c344ef609bb905fb2db0e3f1fd30e5ef0eca7557421c36a01607978
4
- data.tar.gz: 9ccf0c6f68b185c4ac5859abf12ab79ced66fb1c82987655d714a7d365811788
3
+ metadata.gz: 5a09b07cf179aca2230eacccaa07666e3c12b10d7d7f3972130c300649f60c0f
4
+ data.tar.gz: 758580d293c1ce1cbaa48ab811074b0b08b09898d88152ece3b4c41f8c340148
5
5
  SHA512:
6
- metadata.gz: 9641cdb414d6c980fec5d0b066b7093022fd68dfb40995f55c41460a2c2bb3cd4793b6bcbabf774cfea2b5eab95ea925569b0aeff0bc1e774375d98749dcb114
7
- data.tar.gz: 72a1abe1d70e2f45e0bebbf4ab96e0254297f37839a11fe2d371e90574ba4a075512f92939a36898d0d150308bdd4b102003c767f04852ef6b4bdadbb9a5fe4b
6
+ metadata.gz: adf64a0823d530ea44ca6736914f14decc7dcbe006d0559392efa8576b28d176a7832a8b13d895ceb1d234fd0861a95f70f91b6313e5bb15c1da5cc8f83f9a57
7
+ data.tar.gz: 04a831f72f97429a2812de310884bcc7d31726858f5b0732bb4477a6be9a1776ad0adeafbd8efb7d5d6b5b38cb8e243e28cab2ec801aaad20e395bf4c35fb042
data/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.0] - 2022-07-26
11
+
12
+ - Add autocorrection options. ([@skryukov])
13
+ Run `rubocop-gradual -a` and `rubocop-gradual -A` to autocorrect new and changed files and then update the lock file.
14
+
15
+ - Rename `--ci` to `--check` option. ([@skryukov])
16
+
17
+ - Rename `-u, --update` to `-U, --force-update` option. ([@skryukov])
18
+
10
19
  ## [0.1.1] - 2022-07-05
11
20
 
12
21
  ### Changed
@@ -25,7 +34,8 @@ and this project adheres to [Semantic Versioning].
25
34
 
26
35
  [@skryukov]: https://github.com/skryukov
27
36
 
28
- [Unreleased]: https://github.com/skryukov/rubocop-gradual/compare/v0.1.1...HEAD
37
+ [Unreleased]: https://github.com/skryukov/rubocop-gradual/compare/v0.2.0...HEAD
38
+ [0.2.0]: https://github.com/skryukov/rubocop-gradual/compare/v0.1.1...v0.2.0
29
39
  [0.1.1]: https://github.com/skryukov/rubocop-gradual/compare/v0.1.0...v0.1.1
30
40
  [0.1.0]: https://github.com/skryukov/rubocop-gradual/commits/v0.1.0
31
41
 
data/README.md CHANGED
@@ -5,6 +5,14 @@
5
5
 
6
6
  RuboCop Gradual is a tool that helps track down and fix RuboCop offenses in your code gradually. It's a more flexible alternative to RuboCop's `--auto-gen-config` option.
7
7
 
8
+ RuboCop Gradual:
9
+
10
+ - generates the lock file with all RuboCop offenses and uses hashes to track each offense **line by line**
11
+ - **automatically** updates the lock file on every successful run, but returns errors on new offenses
12
+ - does not prevent your editor from **showing ignored offenses**
13
+
14
+ Gain full control of gradual improvements: just add `rubocop-gradual` and use it as proxy for `rubocop`.
15
+
8
16
  <a href="https://evilmartians.com/?utm_source=rubocop-gradual&utm_campaign=project_page">
9
17
  <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54">
10
18
  </a>
@@ -27,24 +35,23 @@ Run `rubocop-gradual` before commiting changes to update the lock file. RuboCop
27
35
 
28
36
  Proposed workflow:
29
37
 
38
+ - Remove `rubocop_todo.yml` if it exists.
30
39
  - Run `rubocop-gradual` to generate a lock file and commit it to the project repository.
31
-
32
- - Add `rubocop-gradual --CI` to your CI pipeline instead of `rubocop`/`standard`. It will throw an error if the lock file is out of date.
33
-
40
+ - Add `rubocop-gradual --check` to your CI pipeline instead of `rubocop`/`standard`. It will throw an error if the lock file is out of date.
41
+ - Run `rubocop-gradual` to update the lock file, or `rubocop-gradual -a` to run autocorrection for all new and changed files and then update the lock file.
34
42
  - Optionally, add `rubocop-gradual` as a pre-commit hook to your repository (using [lefthook], for example).
35
-
36
- - RuboCop Gradual will throw an error on any new offense, but if you really want to force update the lock file, run `rubocop-gradual --update`.
43
+ - RuboCop Gradual will throw an error on any new offense, but if you really want to force update the lock file, run `rubocop-gradual --force-update`.
37
44
 
38
45
  ## Available options
39
46
 
40
47
  ```
41
- --ci Run Gradual in the CI mode.
42
- -u, --update Force update Gradual lock file.
48
+ -U, --force-update Force update Gradual lock file.
49
+ --check Check Gradual lock file is up-to-date.
50
+ -a, --autocorrect Autocorrect offenses (only when it's safe).
51
+ -A, --autocorrect-all Autocorrect offenses (safe and unsafe).
43
52
  --gradual-file FILE Specify Gradual lock file.
44
- --no-gradual Disable Gradual.
45
53
  -v, --version Display version.
46
- -V, --verbose-version Display verbose version.
47
- -h, --help Display help message.
54
+ -h, --help Prints this help.
48
55
  ```
49
56
 
50
57
  ## Alternatives
data/exe/rubocop-gradual CHANGED
@@ -11,6 +11,6 @@ cli = RuboCop::Gradual::CLI.new
11
11
 
12
12
  time = Benchmark.realtime { exit_status = cli.run }
13
13
 
14
- puts "Finished in #{time} seconds" if cli.options[:debug] || cli.options[:display_time]
14
+ puts "Finished in #{time} seconds" if RuboCop::Gradual::Configuration.display_time?
15
15
 
16
16
  exit exit_status
@@ -1,32 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "configuration"
3
4
  require_relative "options"
4
- require_relative "formatter"
5
5
 
6
6
  module RuboCop
7
7
  module Gradual
8
8
  # CLI is a wrapper around RuboCop::CLI.
9
- class CLI < RuboCop::CLI
10
- def run(args = ARGV)
11
- Gradual.mode = :base
12
- rubocop_args = Options.new.parse(args)
13
- super(rubocop_args)
9
+ class CLI
10
+ def run(argv = ARGV)
11
+ Configuration.apply(*Options.new.parse(argv))
12
+ puts "Gradual mode: #{Configuration.mode}" if Configuration.debug?
13
+ load_command(Configuration.command).call.to_i
14
14
  end
15
15
 
16
16
  private
17
17
 
18
- def apply_default_formatter
19
- return super if Gradual.mode == :disabled
20
- raise OptionArgumentError, "-f, --format cannot be used in gradual mode." if @options[:formatters]
21
-
22
- @options[:formatters] = [[Formatter, nil]]
23
- end
24
-
25
- def execute_runners
26
- raise OptionArgumentError, "--auto-gen-config cannot be used in gradual mode." if @options[:auto_gen_config]
27
-
28
- result = super
29
- Gradual.mode == :disabled ? result : Gradual.exit_code
18
+ def load_command(command)
19
+ require_relative "commands/#{command}"
20
+ ::RuboCop::Gradual::Commands.const_get(command.to_s.capitalize).new
30
21
  end
31
22
  end
32
23
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+ require_relative "../formatters/autocorrect"
5
+
6
+ module RuboCop
7
+ module Gradual
8
+ module Commands
9
+ # Autocorrect command runs RuboCop autocorrect before running the base command.
10
+ class Autocorrect
11
+ def call
12
+ runner = RuboCop::CLI::Command::ExecuteRunner.new(
13
+ RuboCop::CLI::Environment.new(
14
+ Configuration.rubocop_options.merge(formatters: [[Formatters::Autocorrect, nil]]),
15
+ Configuration.rubocop_config_store,
16
+ changed_or_untracked_files.map(&:path)
17
+ )
18
+ )
19
+ runner.run
20
+ Base.new.call
21
+ end
22
+
23
+ private
24
+
25
+ def changed_or_untracked_files
26
+ tracked_files = LockFile.new(Configuration.path).read_results&.files || []
27
+
28
+ target_files.reject do |file|
29
+ tracked_files.any? { |r| r.path == file.path && r.file_hash == file.file_hash }
30
+ end
31
+ end
32
+
33
+ def target_files
34
+ Parallel.map(rubocop_target_file_paths) do |path|
35
+ Results::File.new(path: RuboCop::PathUtil.smart_path(path), issues: [])
36
+ end
37
+ end
38
+
39
+ def rubocop_target_file_paths
40
+ target_finder = RuboCop::TargetFinder.new(Configuration.rubocop_config_store, Configuration.rubocop_options)
41
+ mode = if Configuration.rubocop_options[:only_recognized_file_types]
42
+ :only_recognized_file_types
43
+ else
44
+ :all_file_types
45
+ end
46
+ target_finder.find([], mode)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "benchmark"
4
+
5
+ require_relative "../formatters/base"
6
+ require_relative "../process"
7
+
8
+ module RuboCop
9
+ module Gradual
10
+ module Commands
11
+ # Base command runs RuboCop, and processes the results with Gradual.
12
+ class Base
13
+ def call
14
+ exit_code = 0
15
+ run_rubocop
16
+ write_stats_message
17
+ time = Benchmark.realtime { exit_code = Process.new(Configuration.rubocop_results).call }
18
+ puts "Finished Gradual processing in #{time} seconds" if Configuration.display_time?
19
+
20
+ exit_code
21
+ end
22
+
23
+ private
24
+
25
+ def run_rubocop
26
+ rubocop_runner = RuboCop::CLI::Command::ExecuteRunner.new(
27
+ RuboCop::CLI::Environment.new(
28
+ rubocop_options,
29
+ Configuration.rubocop_config_store,
30
+ []
31
+ )
32
+ )
33
+ rubocop_runner.run
34
+ end
35
+
36
+ def rubocop_options
37
+ Configuration.rubocop_options
38
+ .slice(:config, :debug, :display_time)
39
+ .merge(formatters: [[Formatters::Base, nil]])
40
+ end
41
+
42
+ def write_stats_message
43
+ issues_count = Configuration.rubocop_results.sum { |f| f[:issues].size }
44
+ puts "\nFound #{Configuration.rubocop_results.size} files with #{issues_count} issue(s)."
45
+ puts "Processing results..."
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Gradual
5
+ # Configuration class stores Gradual and Rubocop options.
6
+ module Configuration
7
+ class << self
8
+ attr_reader :options, :rubocop_options, :rubocop_results
9
+
10
+ def apply(options = {}, rubocop_options = {})
11
+ @options = options
12
+ @rubocop_options = rubocop_options
13
+ @rubocop_results = []
14
+ end
15
+
16
+ def command
17
+ options.fetch(:command, :base)
18
+ end
19
+
20
+ def mode
21
+ options.fetch(:mode, :update)
22
+ end
23
+
24
+ def path
25
+ options.fetch(:path, ".rubocop_gradual.lock")
26
+ end
27
+
28
+ def debug?
29
+ rubocop_options[:debug]
30
+ end
31
+
32
+ def display_time?
33
+ rubocop_options[:debug] || rubocop_options[:display_time]
34
+ end
35
+
36
+ def rubocop_config_store
37
+ RuboCop::ConfigStore.new.tap do |config_store|
38
+ config_store.options_config = rubocop_options[:config] if rubocop_options[:config]
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module RuboCop
6
+ module Gradual
7
+ module Formatters
8
+ # Formatter is a RuboCop formatter class that collects RuboCop results and
9
+ # calls the Gradual::Process class at the end to process them.
10
+ class Autocorrect < RuboCop::Formatter::BaseFormatter
11
+ include PathUtil
12
+
13
+ def initialize(_output, options = {})
14
+ super
15
+ @corrected_files = 0
16
+ end
17
+
18
+ def started(target_files)
19
+ puts "Inspecting #{target_files.size} file(s) for autocorrection..."
20
+ end
21
+
22
+ def file_finished(_file, offenses)
23
+ print "."
24
+ return if offenses.empty?
25
+
26
+ @corrected_files += 1 if offenses.any?(&:corrected?)
27
+ end
28
+
29
+ def finished(_inspected_files)
30
+ puts "\nFixed #{@corrected_files} file(s).\n"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module RuboCop
6
+ module Gradual
7
+ module Formatters
8
+ # Base is a RuboCop formatter class that collects RuboCop results and
9
+ # writes them to Configuration.rubocop_results.
10
+ class Base < RuboCop::Formatter::BaseFormatter
11
+ include PathUtil
12
+
13
+ def file_finished(file, offenses)
14
+ print "."
15
+ return if offenses.empty?
16
+
17
+ Configuration.rubocop_results << {
18
+ path: smart_path(file),
19
+ issues: offenses.reject(&:corrected?).map { |o| issue_offense(o) }
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ def issue_offense(offense)
26
+ {
27
+ line: offense.line,
28
+ column: offense.real_column,
29
+ length: offense.location.length,
30
+ message: offense.message
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,61 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rainbow"
4
3
  require "shellwords"
5
4
 
6
5
  module RuboCop
7
6
  module Gradual
8
7
  # Options class defines RuboCop Gradual cli options.
9
- # It also extracts command line RuboCop Gradual arguments
10
- # before passing leftover arguments to RuboCop::CLI.
11
8
  class Options
9
+ AUTOCORRECT_KEY =
10
+ if Gem::Version.new(RuboCop::Version::STRING) >= Gem::Version.new("1.30")
11
+ :autocorrect
12
+ else
13
+ :auto_correct
14
+ end
15
+
16
+ def initialize
17
+ @options = {}
18
+ end
19
+
12
20
  def parse(args)
13
21
  parser = define_options
14
- @gradual_args, @rubocop_args = filter_args(parser, args_from_file + args)
15
- parser.parse(@gradual_args)
16
- @rubocop_args
22
+ gradual_args, rubocop_args = filter_args(parser, args_from_file + args)
23
+ @rubocop_options, _rubocop_paths = RuboCop::Options.new.parse(rubocop_args)
24
+ parser.parse(gradual_args)
25
+
26
+ [@options, @rubocop_options]
17
27
  end
18
28
 
19
29
  private
20
30
 
21
31
  def define_options
22
32
  OptionParser.new do |opts|
23
- opts.banner = rainbow.wrap("\nGradual options:").bright
24
-
33
+ define_mode_options(opts)
25
34
  define_gradual_options(opts)
26
35
 
27
- define_proxy_options(opts)
36
+ define_info_options(opts)
28
37
  end
29
38
  end
30
39
 
31
- def define_gradual_options(opts)
32
- opts.on("-u", "--update", "Force update Gradual lock file.") { Gradual.mode = :update }
33
-
34
- opts.on("--ci", "Run Gradual in the CI mode.") { Gradual.mode = :ci }
35
-
36
- opts.on("--gradual-file FILE", "Specify Gradual lock file.") { |path| Gradual.path = path }
40
+ def define_mode_options(opts)
41
+ opts.on("-U", "--force-update", "Force update Gradual lock file.") { @options[:mode] = :force_update }
42
+ opts.on("-u", "--update", "Same as --force-update (deprecated).") do
43
+ warn "-u, --update is deprecated. Use -U, --force-update instead."
44
+ @options[:mode] = :force_update
45
+ end
37
46
 
38
- opts.on("--no-gradual", "Disable Gradual.") { Gradual.mode = :disabled }
47
+ opts.on("--check", "Check Gradual lock file is up-to-date.") { @options[:mode] = :check }
48
+ opts.on("--ci", "Same as --check (deprecated).") do
49
+ warn "--ci is deprecated. Use --check instead."
50
+ @options[:mode] = :check
51
+ end
39
52
  end
40
53
 
41
- def define_proxy_options(opts)
42
- proxy_option(opts, "-v", "--version", "Display version.") do
43
- print "rubocop-gradual: #{VERSION}\nrubocop: "
54
+ def define_gradual_options(opts)
55
+ opts.on("-a", "--autocorrect", "Autocorrect offenses (only when it's safe).") do
56
+ @rubocop_options[AUTOCORRECT_KEY] = true
57
+ @rubocop_options[:"safe_#{AUTOCORRECT_KEY}"] = true
58
+ @options[:command] = :autocorrect
44
59
  end
45
-
46
- proxy_option(opts, "-V", "--verbose-version", "Display verbose version.") do
47
- print "rubocop-gradual: #{VERSION}\nrubocop:"
60
+ opts.on("-A", "--autocorrect-all", "Autocorrect offenses (safe and unsafe).") do
61
+ @rubocop_options[AUTOCORRECT_KEY] = true
62
+ @options[:command] = :autocorrect
48
63
  end
49
64
 
50
- proxy_option(opts, "-h", "--help", "Display help message.") do
51
- at_exit { puts opts }
52
- end
65
+ opts.on("--gradual-file FILE", "Specify Gradual lock file.") { |path| @options[:path] = path }
53
66
  end
54
67
 
55
- def proxy_option(opts, *attrs)
56
- opts.on(*attrs) do
57
- @rubocop_args << attrs[0]
58
- yield
68
+ def define_info_options(opts)
69
+ opts.on("-v", "--version", "Display version.") do
70
+ puts "rubocop-gradual: #{VERSION}, rubocop: #{RuboCop::Version.version}"
71
+ exit
72
+ end
73
+
74
+ opts.on("-h", "--help", "Prints this help.") do
75
+ puts opts
76
+ exit
59
77
  end
60
78
  end
61
79
 
@@ -86,12 +104,6 @@ module RuboCop
86
104
  []
87
105
  end
88
106
  end
89
-
90
- def rainbow
91
- @rainbow ||= Rainbow.new.tap do |r|
92
- r.enabled = false if ARGV.include?("--no-color")
93
- end
94
- end
95
107
  end
96
108
  end
97
109
  end
@@ -54,7 +54,7 @@ module RuboCop
54
54
  new: new,
55
55
  unchanged: unchanged
56
56
  }
57
- log_file_issues(path) if RuboCop::Gradual.debug
57
+ log_file_issues(path) if Configuration.debug?
58
58
  self
59
59
  end
60
60
 
@@ -10,7 +10,7 @@ module RuboCop
10
10
  end
11
11
 
12
12
  def print_results
13
- puts diff.statistics if RuboCop::Gradual.debug
13
+ puts diff.statistics if Configuration.debug?
14
14
 
15
15
  send "print_#{diff.state}"
16
16
  end
@@ -23,7 +23,7 @@ module RuboCop
23
23
  - Run `rubocop-gradual` locally and commit the results, or
24
24
  - EVEN BETTER: before doing the above, try to fix the remaining issues in those files!
25
25
 
26
- #{bold("`#{Gradual.path}` diff:")}
26
+ #{bold("`#{Configuration.path}` diff:")}
27
27
 
28
28
  #{diff.to_s(ARGV.include?("--no-color") ? :text : :color)}
29
29
  MSG
@@ -35,7 +35,7 @@ module RuboCop
35
35
 
36
36
  def print_complete
37
37
  puts bold("RuboCop Gradual is complete!")
38
- puts "Removing `#{Gradual.path}` lock file..."
38
+ puts "Removing `#{Configuration.path}` lock file..." if diff.statistics[:fixed].positive?
39
39
  end
40
40
 
41
41
  def print_updated
@@ -49,7 +49,7 @@ module RuboCop
49
49
  def print_new
50
50
  issues_left = diff.statistics[:left]
51
51
  puts bold("RuboCop Gradual got results for the first time. #{issues_left} issue(s) found.")
52
- puts "Don't forget to commit `#{Gradual.path}` log file."
52
+ puts "Don't forget to commit `#{Configuration.path}` log file."
53
53
  end
54
54
 
55
55
  def print_better
@@ -61,7 +61,7 @@ module RuboCop
61
61
  def print_worse
62
62
  puts bold("Uh oh, RuboCop Gradual got worse:")
63
63
  print_new_issues
64
- puts bold("Force updating lock file...") if Gradual.mode == :update
64
+ puts bold("Force updating lock file...") if Configuration.mode == :force_update
65
65
  end
66
66
 
67
67
  def print_new_issues
@@ -12,40 +12,37 @@ module RuboCop
12
12
  attr_reader :new_results, :lock_file
13
13
 
14
14
  def initialize(rubocop_result)
15
- @lock_file = LockFile.new(Gradual.path)
16
- @new_results = Results.new(**rubocop_result)
15
+ @lock_file = LockFile.new(Configuration.path)
16
+ @new_results = Results.new(files: rubocop_result)
17
17
  end
18
18
 
19
19
  def call
20
20
  diff = CalculateDiff.call(new_results, lock_file.read_results)
21
21
  printer = Printer.new(diff)
22
- if print_ci_warning?(diff)
23
- printer.print_ci_warning(lock_file.diff(new_results))
24
- else
25
- printer.print_results
26
- end
27
22
 
28
- Gradual.exit_code = error_code(diff)
23
+ printer.print_results
24
+ printer.print_ci_warning(lock_file.diff(new_results)) if fail_with_outdated_lock?(diff)
29
25
 
30
- sync_lock_file(diff)
26
+ exit_code = error_code(diff)
27
+ sync_lock_file(diff) if exit_code.zero?
28
+ exit_code
31
29
  end
32
30
 
33
31
  private
34
32
 
35
- def print_ci_warning?(diff)
36
- Gradual.mode == :ci && diff.state != :no_changes && diff.state != :worse
33
+ def fail_with_outdated_lock?(diff)
34
+ Configuration.mode == :check && diff.state != :no_changes
37
35
  end
38
36
 
39
37
  def sync_lock_file(diff)
40
- return unless Gradual.exit_code.zero?
41
38
  return lock_file.delete if diff.state == :complete
42
39
 
43
40
  lock_file.write_results(new_results)
44
41
  end
45
42
 
46
43
  def error_code(diff)
47
- return 1 if print_ci_warning?(diff)
48
- return 1 if diff.state == :worse && Gradual.mode != :update
44
+ return 1 if fail_with_outdated_lock?(diff)
45
+ return 1 if diff.state == :worse && Configuration.mode != :force_update
49
46
 
50
47
  0
51
48
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RuboCop
4
4
  module Gradual
5
- VERSION = "0.1.1"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -9,18 +9,5 @@ module RuboCop
9
9
  # RuboCop Gradual project namespace
10
10
  module Gradual
11
11
  class Error < StandardError; end
12
-
13
- class << self
14
- attr_accessor :debug, :exit_code, :mode, :path
15
-
16
- def set_defaults!
17
- self.debug = false
18
- self.exit_code = 0
19
- self.mode = :base
20
- self.path = ".rubocop_gradual.lock"
21
- end
22
- end
23
-
24
- set_defaults!
25
12
  end
26
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-gradual
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-05 00:00:00.000000000 Z
11
+ date: 2022-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -107,7 +107,11 @@ files:
107
107
  - lib/rubocop-gradual.rb
108
108
  - lib/rubocop/gradual.rb
109
109
  - lib/rubocop/gradual/cli.rb
110
- - lib/rubocop/gradual/formatter.rb
110
+ - lib/rubocop/gradual/commands/autocorrect.rb
111
+ - lib/rubocop/gradual/commands/base.rb
112
+ - lib/rubocop/gradual/configuration.rb
113
+ - lib/rubocop/gradual/formatters/autocorrect.rb
114
+ - lib/rubocop/gradual/formatters/base.rb
111
115
  - lib/rubocop/gradual/lock_file.rb
112
116
  - lib/rubocop/gradual/options.rb
113
117
  - lib/rubocop/gradual/process.rb
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "benchmark"
4
- require "pathname"
5
-
6
- require_relative "process"
7
-
8
- module RuboCop
9
- module Gradual
10
- # Formatter is a RuboCop formatter class that collects RuboCop results and
11
- # calls the Gradual::Process class at the end to process them.
12
- class Formatter < RuboCop::Formatter::BaseFormatter
13
- include PathUtil
14
-
15
- attr_reader :output_hash
16
-
17
- def initialize(_output, options = {})
18
- super
19
- Gradual.debug = options[:debug]
20
- puts "Gradual mode: #{Gradual.mode}" if Gradual.debug
21
- @output_hash = { files: [] }
22
- end
23
-
24
- def file_finished(file, offenses)
25
- print "."
26
- return if offenses.empty?
27
-
28
- output_hash[:files] << {
29
- path: smart_path(file),
30
- issues: offenses.reject(&:corrected?).map { |o| issue_offense(o) }
31
- }
32
- end
33
-
34
- def finished(_inspected_files)
35
- puts "\n#{stats_message}"
36
- puts "Processing results..."
37
-
38
- time = Benchmark.realtime { Process.new(output_hash).call }
39
-
40
- puts "Finished Gradual processing in #{time} seconds" if options[:debug] || options[:display_time]
41
- end
42
-
43
- private
44
-
45
- def issue_offense(offense)
46
- {
47
- line: offense.line,
48
- column: offense.real_column,
49
- length: offense.location.length,
50
- message: offense.message
51
- }
52
- end
53
-
54
- def stats_message
55
- issues_count = output_hash[:files].sum { |f| f[:issues].size }
56
- "Found #{output_hash[:files].size} files with #{issues_count} issue(s)."
57
- end
58
- end
59
- end
60
- end