slimembedcop 0.1.0 → 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: e085bf2820cb1e136a62f6584721898d1177eb3cebda9e4735cd2f6ea5ab6ea8
4
- data.tar.gz: e21faefb596375c8a30919fad86d5585037a41e8f9a84cbeca222d382ea0e586
3
+ metadata.gz: 2de74f977f0c9b3d8668fb691ea042033412e2feee2b77638dca4d60bbac30a4
4
+ data.tar.gz: 7aea53f38ce0c1c3965cdcda6ffd4ad0260b0242d09aaae610484114f0580f1b
5
5
  SHA512:
6
- metadata.gz: 99f0354e919a707327ead19fa82335631d7b9b44fb938928ee425435c5816999577c79992ed35c08ba7b1accff42f9417ccd75bc5ae1158f8955258aa5a4741d
7
- data.tar.gz: 2c54f363d17d4a101fbef514505d9315a3eb1c38988506172876c8d820b42df37892ac40143c502009c1534a00da820e9d6fbf305f1261007c8256596f57cf54
6
+ metadata.gz: 63bead9c81a50545c49bc6b039b1362109b59710cd45e50ab88f2375e77089182320e6c624f8297b355521d5b3f6a99758008f087db6d2c843aa5942a7e623dc
7
+ data.tar.gz: db4c9e49e42d4fa6157627e4ad0f9497c114072a22b4944181b9308ef9a749d6b49763c0f25644465c034044f5be48b016e226295660c2b2983c1c5454f252a7
data/.rubocop.yml CHANGED
@@ -32,5 +32,3 @@ RSpec/NamedSubject:
32
32
  Style/Documentation:
33
33
  Enabled: false
34
34
 
35
- Style/StringLiterals:
36
- EnforcedStyle: double_quotes
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 0.2.0 - 2023-09-16
4
+
5
+ - Disable unnecessary cop for slimembedcop.
6
+ - Add `--debug` option.
7
+ - Remove .rubocop.yml for default implicit config path.
8
+
3
9
  ## 0.1.0 - 2023-09-07
4
10
 
5
11
  - Initial release
data/Rakefile CHANGED
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec)
8
+ RuboCop::RakeTask.new
7
9
 
8
- task default: %i[spec]
10
+ task default: %i[spec rubocop]
data/exe/slimembedcop CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
5
- require "slimembedcop"
4
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
5
+ require 'slimembedcop'
6
6
 
7
- exit Slimembedcop::Cli.run(ARGV)
7
+ exit Slimembedcop::Cli.new(ARGV).run
data/lib/default.yml CHANGED
@@ -1,8 +1,14 @@
1
- Style/FrozenStringLiteralComment:
2
- Enabled: false
3
1
  Layout/TrailingEmptyLines:
4
2
  Enabled: false
3
+
5
4
  Layout/InitialIndentation:
6
5
  Enabled: false
7
- Lint/CircularArgumentReference:
8
- Enabled: true
6
+
7
+ Lint/UselessAssignment:
8
+ Enabled: false
9
+
10
+ Naming/FileName:
11
+ Enabled: false
12
+
13
+ Style/FrozenStringLiteralComment:
14
+ Enabled: false
@@ -1,44 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "optparse"
4
- require "rubocop"
3
+ require 'rubocop'
5
4
 
6
5
  module Slimembedcop
7
6
  # Command line interface for Slimembedcop.
8
7
  class Cli
9
- class << self
10
- DEFAULT_CONFIG_PATH = File.expand_path("../default.yml", __dir__)
11
- DEFAULT_PATH_PATTERNS = %w[**/*.slim].freeze
12
-
13
- def run(argv)
14
- options = parse_options!(argv)
15
- formatter = ::RuboCop::Formatter::ProgressFormatter.new($stdout, color: options[:color])
16
- config = ConfigGenerator.run(DEFAULT_CONFIG_PATH, options[:forced_config_path])
17
- paths = PathFinder.run(DEFAULT_PATH_PATTERNS, config.for_all_cops["Exclude"], argv)
18
- offenses = Runner.run(paths, formatter, config, options[:autocorrect])
19
- exit(offenses.empty? ? 0 : 1)
20
- end
21
-
22
- private
8
+ def initialize(argv)
9
+ @argv = argv
10
+ end
23
11
 
24
- def parse_options!(argv)
25
- options = {}
26
- parser = ::OptionParser.new
27
- parser.banner = "Usage: slimembedcop [options] [file1, file2, ...]"
28
- parser.version = VERSION
29
- parser.on("-a", "--autocorrect", "Autocorrect offenses.") do
30
- p "autocorrect"
31
- options[:autocorrect] = true
32
- end
33
- parser.on("-c", "--config=", "Specify configuration file. (default: #{DEFAULT_CONFIG_PATH} or .rubocop.yml)") do |file_path|
34
- options[:forced_config_path] = file_path
35
- end
36
- parser.on("--[no-]color", "Force color output on or off.") do |value|
37
- options[:color] = value
38
- end
39
- parser.parse!(argv)
40
- options
41
- end
12
+ def run
13
+ options = Option.new(@argv)
14
+ formatter = ::RuboCop::Formatter::ProgressFormatter.new($stdout, color: options.color)
15
+ config = ConfigGenerator.new(options).run
16
+ paths = PathFinder.new(options, config).run
17
+ offenses = Runner.new(paths, formatter, options, config).run
18
+ exit(offenses.empty? ? 0 : 1)
42
19
  end
43
20
  end
44
21
  end
@@ -1,57 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rubocop"
3
+ require 'rubocop'
4
4
 
5
5
  module Slimembedcop
6
6
  # Generates a configuration for RuboCop.
7
7
  class ConfigGenerator
8
- class << self
9
- def run(default_config_path, forced_config_path)
10
- @default_config_path = default_config_path
11
- @forced_config_path = forced_config_path
12
- ::RuboCop::ConfigLoader.merge_with_default(merged_config, loaded_path)
13
- end
8
+ def initialize(option)
9
+ @default_config_path = option.default_config_path
10
+ @forced_config_path = option.forced_config_path
11
+ end
14
12
 
15
- private
13
+ def run
14
+ ::RuboCop::ConfigLoader.merge_with_default(merged_config, loaded_path)
15
+ end
16
16
 
17
- def loaded_path
18
- @forced_config_path || implicit_config_path || @default_config_path
19
- end
17
+ private
20
18
 
21
- def merged_config
22
- ::RuboCop::Config.create(merged_config_hash, loaded_path)
23
- end
19
+ def loaded_path
20
+ @forced_config_path || implicit_config_path || @default_config_path
21
+ end
24
22
 
25
- def merged_config_hash
26
- result = default_config
27
- result = ::RuboCop::ConfigLoader.merge(result, user_config) if user_config
28
- result
29
- end
23
+ def merged_config
24
+ ::RuboCop::Config.create(merged_config_hash, loaded_path)
25
+ end
30
26
 
31
- def user_config
32
- if instance_variable_defined?(:@user_config)
33
- @user_config
34
- else
35
- @user_config =
36
- if @forced_config_path
37
- ::RuboCop::ConfigLoader.load_file(@forced_config_path)
38
- elsif (path = implicit_config_path)
39
- ::RuboCop::ConfigLoader.load_file(path)
40
- end
41
- end
42
- end
27
+ def merged_config_hash
28
+ result = default_config
29
+ result = ::RuboCop::ConfigLoader.merge(result, user_config) if user_config
30
+ result
31
+ end
43
32
 
44
- def default_config
45
- ::RuboCop::ConfigLoader.load_file(@default_config_path)
33
+ def user_config
34
+ if instance_variable_defined?(:@user_config)
35
+ @user_config
36
+ else
37
+ @user_config =
38
+ if @forced_config_path
39
+ ::RuboCop::ConfigLoader.load_file(@forced_config_path)
40
+ elsif (path = implicit_config_path)
41
+ ::RuboCop::ConfigLoader.load_file(path)
42
+ end
46
43
  end
44
+ end
47
45
 
48
- def implicit_config_path
49
- if instance_variable_defined?(:@implicit_config_path)
50
- @implicit_config_path
51
- else
52
- @implicit_config_path = %w[.slimembedcop.yml .rubocop.yml].find do |path|
53
- ::File.exist?(path)
54
- end
46
+ def default_config
47
+ ::RuboCop::ConfigLoader.load_file(@default_config_path)
48
+ end
49
+
50
+ def implicit_config_path
51
+ if instance_variable_defined?(:@implicit_config_path)
52
+ @implicit_config_path
53
+ else
54
+ @implicit_config_path = %w[.slimembedcop.yml].find do |path|
55
+ ::File.exist?(path)
55
56
  end
56
57
  end
57
58
  end
@@ -1,57 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "slimi"
4
-
5
3
  module Slimembedcop
6
4
  # Extract Ruby codes from Slim embedded code.
7
5
  class Extractor
8
- class << self
9
- def run(path, source)
10
- @path = path
11
- @source = source
6
+ def initialize(source)
7
+ @source = source
8
+ end
12
9
 
13
- ranges.map do |(begin_, end_)|
14
- { code: source[begin_...end_], offset: begin_ }
15
- end
10
+ def run
11
+ ranges.map do |(begin_, end_)|
12
+ { code: @source[begin_...end_], offset: begin_ }
16
13
  end
14
+ end
17
15
 
18
- private
19
-
20
- def ranges
21
- result = []
22
- index = 0
23
- begin_pos = 0
24
- leading_spaces = 0
25
- inside_ruby = false
26
- @source.each_line do |line|
27
- if block_start?(line)
28
- leading_spaces = line.match(/^\s*/)[0].length
29
- inside_ruby = true
30
- begin_pos = index += line.length
31
- next
32
- end
33
-
34
- if inside_ruby && block_end?(line, leading_spaces)
35
- result << [begin_pos, index - 1]
36
- inside_ruby = false
37
- end
38
-
39
- index += line.length
16
+ private
17
+
18
+ def ranges
19
+ result = []
20
+ index = 0
21
+ begin_pos = 0
22
+ leading_spaces = 0
23
+ inside_ruby = false
24
+ @source.each_line do |line|
25
+ if block_start?(line)
26
+ leading_spaces = line.match(/^\s*/)[0].length
27
+ inside_ruby = true
28
+ begin_pos = index += line.length
29
+ next
40
30
  end
41
31
 
42
- result << [begin_pos, index - 1] if inside_ruby
32
+ if inside_ruby && block_end?(line, leading_spaces)
33
+ result << [begin_pos, index - 1]
34
+ inside_ruby = false
35
+ end
43
36
 
44
- result
37
+ index += line.length
45
38
  end
46
39
 
47
- def block_start?(line)
48
- line.strip.start_with?("ruby:")
49
- end
40
+ result << [begin_pos, index - 1] if inside_ruby
50
41
 
51
- def block_end?(line, leading_spaces)
52
- line.match(/^\s{#{leading_spaces}}\S/) ||
53
- (leading_spaces.zero? && line.match(/^\S/))
54
- end
42
+ result
43
+ end
44
+
45
+ def block_start?(line)
46
+ line.strip.start_with?('ruby:')
47
+ end
48
+
49
+ def block_end?(line, leading_spaces)
50
+ line.match(/^\s{#{leading_spaces}}\S/) ||
51
+ (leading_spaces.zero? && line.match(/^\S/))
55
52
  end
56
53
  end
57
54
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "forwardable"
3
+ require 'forwardable'
4
4
 
5
- require "parser"
6
- require "rubocop"
5
+ require 'parser'
6
+ require 'rubocop'
7
7
 
8
8
  module Slimembedcop
9
9
  # Wraps a RuboCop offense.
@@ -3,20 +3,26 @@
3
3
  module Slimembedcop
4
4
  # Collect RuboCop offenses from Template code.
5
5
  class OffenseCollector
6
- class << self
7
- def run(path, config, source, autocorrect)
8
- snippets(path, source).flat_map do |snippet|
9
- RubyOffenseCollector.run(path, config, snippet[:code], autocorrect).map do |offense|
10
- Offense.new(path, snippet[:offset], offense, source)
11
- end
6
+ def initialize(path, config, source, autocorrect, debug)
7
+ @path = path
8
+ @config = config
9
+ @source = source
10
+ @autocorrect = autocorrect
11
+ @debug = debug
12
+ end
13
+
14
+ def run
15
+ snippets.flat_map do |snippet|
16
+ RubyOffenseCollector.new(@path, @config, snippet[:code], @autocorrect, @debug).run.map do |offense|
17
+ Offense.new(@path, snippet[:offset], offense, @source)
12
18
  end
13
19
  end
20
+ end
14
21
 
15
- private
22
+ private
16
23
 
17
- def snippets(path, source)
18
- Extractor.run(path, source)
19
- end
24
+ def snippets
25
+ Extractor.new(@source).run
20
26
  end
21
27
  end
22
28
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slimembedcop
4
+ # Command line options.
5
+ class Option
6
+ attr_reader :version, :autocorrect, :forced_config_path, :color, :debug,
7
+ :args, :default_config_path, :default_path_patterns
8
+
9
+ def initialize(argv)
10
+ opt = OptionParser.new
11
+ @version = false
12
+ @autocorrect = false
13
+ @forced_config_path = nil
14
+ @color = nil
15
+ @debug = false
16
+ @default_config_path = File.expand_path('../default.yml', __dir__)
17
+ @default_path_patterns = %w[**/*.slim].freeze
18
+
19
+ opt.banner = 'Usage: slimembedcop [options] [file1, file2, ...]'
20
+ opt.on('-v', '--version', 'Display version.') { @version = true }
21
+ opt.on('-a', '--autocorrect', 'Autocorrect offenses.') { @autocorrect = true }
22
+ opt.on('-c', '--config=', 'Specify configuration file.') { |path| @forced_config_path = path }
23
+ opt.on('--[no-]color', 'Force color output on or off.') { |value| @color = value }
24
+ opt.on('-d', '--debug', 'Display debug info.') { |value| @debug = value }
25
+ @args = opt.parse(argv)
26
+ end
27
+ end
28
+ end
@@ -1,52 +1,51 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
- require "set"
3
+ require 'pathname'
4
+ require 'set'
5
5
 
6
6
  module Slimembedcop
7
7
  # Collect file paths from given path patterns.
8
8
  class PathFinder
9
- class << self
10
- def run(default_patterns, exclude_patterns, path_patterns)
11
- @default_patterns = default_patterns
12
- @exclude_patterns = exclude_patterns || []
13
- @path_patterns = path_patterns
14
- matching_paths(patterns) do |path|
15
- !excluded?(path)
16
- end.sort
17
- end
9
+ def initialize(options, config)
10
+ @default_patterns = options.default_path_patterns
11
+ @exclude_patterns = config.for_all_cops['Exclude'] || []
12
+ @path_patterns = options.args
13
+ end
18
14
 
19
- private
15
+ def run
16
+ matching_paths(patterns) { |path| !excluded?(path) }.sort
17
+ end
20
18
 
21
- def matching_paths(patterns, &block)
22
- patterns.each_with_object(Set.new) do |pattern, set|
23
- ::Pathname.glob(pattern) do |pathname|
24
- next unless pathname.file?
19
+ private
25
20
 
26
- path = pathname.expand_path.to_s
27
- set.add(path) if block.nil? || yield(path)
28
- end
21
+ def matching_paths(patterns, &block)
22
+ patterns.each_with_object(Set.new) do |pattern, set|
23
+ ::Pathname.glob(pattern) do |pathname|
24
+ next unless pathname.file?
25
+
26
+ path = pathname.expand_path.to_s
27
+ set.add(path) if block.nil? || yield(path)
29
28
  end
30
29
  end
30
+ end
31
31
 
32
- def excluded?(path)
33
- excluded.include?(path)
34
- end
32
+ def excluded?(path)
33
+ excluded.include?(path)
34
+ end
35
35
 
36
- def excluded
37
- @excluded ||= matching_paths(@exclude_patterns)
38
- end
36
+ def excluded
37
+ @excluded ||= matching_paths(@exclude_patterns)
38
+ end
39
39
 
40
- def patterns
41
- return @default_patterns if @path_patterns.empty?
40
+ def patterns
41
+ return @default_patterns if @path_patterns.empty?
42
42
 
43
- @path_patterns.map do |pattern|
44
- next pattern unless File.directory?(pattern)
43
+ @path_patterns.map do |pattern|
44
+ next pattern unless File.directory?(pattern)
45
45
 
46
- @default_patterns.map do |default|
47
- File.join(pattern, default)
48
- end.flatten
49
- end
46
+ @default_patterns.map do |default|
47
+ File.join(pattern, default)
48
+ end.flatten
50
49
  end
51
50
  end
52
51
  end
@@ -1,47 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rubocop"
3
+ require 'rubocop'
4
4
 
5
5
  module Slimembedcop
6
6
  # Collect RuboCop offenses from Ruby code.
7
7
  class RubyOffenseCollector
8
- class << self
9
- def run(path, config, source, autocorrect)
10
- return [] unless rubocop_processed_source(path, config, source).valid_syntax?
8
+ def initialize(path, config, source, autocorrect, debug)
9
+ @path = path
10
+ @config = config
11
+ @source = source
12
+ @autocorrect = autocorrect
13
+ @debug = debug
14
+ end
11
15
 
12
- rubocop_team(config, autocorrect).investigate(rubocop_processed_source(path, config, source)).offenses.reject(&:disabled?)
13
- end
16
+ def run
17
+ return [] unless processed_source.valid_syntax?
14
18
 
15
- private
19
+ team.investigate(processed_source).offenses.reject(&:disabled?)
20
+ end
16
21
 
17
- def registry
18
- @registry ||= begin
19
- all_cops = if ::RuboCop::Cop::Registry.respond_to?(:all)
20
- ::RuboCop::Cop::Registry.all
21
- else
22
- ::RuboCop::Cop::Cop.all
23
- end
22
+ private
24
23
 
25
- ::RuboCop::Cop::Registry.new(all_cops)
26
- end
24
+ def processed_source
25
+ ::RuboCop::ProcessedSource.new(@source, @config.target_ruby_version, @path).tap do |processed_source|
26
+ processed_source.config = @config if processed_source.respond_to?(:config)
27
+ processed_source.registry = registry if processed_source.respond_to?(:registry)
27
28
  end
29
+ end
28
30
 
29
- def rubocop_processed_source(path, config, source)
30
- ::RuboCop::ProcessedSource.new(source, config.target_ruby_version, path).tap do |processed_source|
31
- processed_source.config = config if processed_source.respond_to?(:config)
32
- processed_source.registry = registry if processed_source.respond_to?(:registry)
33
- end
34
- end
31
+ def team
32
+ ::RuboCop::Cop::Team.new(
33
+ registry,
34
+ @config,
35
+ autocorrect: @autocorrect,
36
+ debug: @debug,
37
+ display_cop_names: true,
38
+ extra_details: true,
39
+ stdin: ''
40
+ )
41
+ end
42
+
43
+ def registry
44
+ @registry ||= begin
45
+ all_cops = if ::RuboCop::Cop::Registry.respond_to?(:all)
46
+ ::RuboCop::Cop::Registry.all
47
+ else
48
+ ::RuboCop::Cop::Cop.all
49
+ end
35
50
 
36
- def rubocop_team(config, autocorrect)
37
- ::RuboCop::Cop::Team.new(
38
- registry,
39
- config,
40
- autocorrect: autocorrect,
41
- display_cop_names: true,
42
- extra_details: true,
43
- stdin: ""
44
- )
51
+ ::RuboCop::Cop::Registry.new(all_cops)
45
52
  end
46
53
  end
47
54
  end
@@ -1,83 +1,87 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parallel"
4
- require "stringio"
3
+ require 'parallel'
4
+ require 'stringio'
5
5
 
6
6
  module Slimembedcop
7
7
  # Run investigation and auto-correction.
8
8
  class Runner
9
- class << self
10
- def run(paths, formatter, config, autocorrect)
11
- @autocorrect = autocorrect
12
-
13
- on_started(formatter, paths)
14
- result = run_in_parallel(paths, formatter, config)
15
- on_finished(paths, formatter, result)
16
- result.flat_map { |(_, offenses)| offenses }
17
- end
9
+ def initialize(paths, formatter, options, config)
10
+ @paths = paths
11
+ @formatter = formatter
12
+ @autocorrect = options.autocorrect
13
+ @debug = options.debug
14
+ @config = config
15
+ end
18
16
 
19
- private
17
+ def run
18
+ on_started
19
+ result = run_in_parallel
20
+ on_finished(result)
21
+ result.flat_map { |(_, offenses)| offenses }
22
+ end
20
23
 
21
- def on_started(formatter, paths)
22
- formatter.started(paths)
23
- end
24
+ private
24
25
 
25
- def run_in_parallel(paths, formatter, config)
26
- ::Parallel.map(paths) do |path|
27
- offenses_per_file = []
28
- max_trials_count.times do
29
- on_file_started(formatter, path)
30
- source = ::File.read(path)
31
- offenses = investigate(path, config, source)
32
- offenses_per_file |= offenses
33
- break if offenses.none?(&:correctable?)
26
+ def on_started
27
+ @formatter.started(@paths)
28
+ end
34
29
 
35
- next unless @autocorrect
30
+ def run_in_parallel
31
+ ::Parallel.map(@paths) do |path|
32
+ offenses_per_file = []
33
+ max_trials_count.times do
34
+ on_file_started(path)
35
+ source = ::File.read(path)
36
+ offenses = investigate(path, source)
37
+ offenses_per_file |= offenses
38
+ break if offenses.none?(&:correctable?)
36
39
 
37
- correct(path, offenses, source)
38
- end
40
+ next unless @autocorrect
39
41
 
40
- on_file_finished(path, formatter, offenses_per_file)
41
- [path, offenses_per_file]
42
+ correct(path, offenses, source)
42
43
  end
43
- end
44
44
 
45
- def max_trials_count
46
- if @autocorrect
47
- 7
48
- else
49
- 1
50
- end
45
+ on_file_finished(path, offenses_per_file)
46
+ [path, offenses_per_file]
51
47
  end
48
+ end
52
49
 
53
- def investigate(path, config, source)
54
- OffenseCollector.run(path, config, source, @autocorrect)
50
+ def max_trials_count
51
+ if @autocorrect
52
+ 7
53
+ else
54
+ 1
55
55
  end
56
+ end
56
57
 
57
- def correct(path, offenses, source)
58
- rewritten_source = TemplateCorrector.new(path, offenses, source).run
59
- ::File.write(path, rewritten_source)
60
- end
58
+ def investigate(path, source)
59
+ OffenseCollector.new(path, @config, source, @autocorrect, @debug).run
60
+ end
61
61
 
62
- def on_file_started(formatter, path)
63
- formatter.file_started(path, {})
64
- end
62
+ def correct(path, offenses, source)
63
+ rewritten_source = TemplateCorrector.new(path, offenses, source).run
64
+ ::File.write(path, rewritten_source)
65
+ end
65
66
 
66
- def on_file_finished(path, formatter, offenses)
67
- formatter.file_finished(path, offenses)
68
- end
67
+ def on_file_started(path)
68
+ @formatter.file_started(path, {})
69
+ end
69
70
 
70
- def on_finished(paths, formatter, result)
71
- original = formatter.output
72
- formatter.instance_variable_set(:@output, ::StringIO.new)
73
- result.each do |(path, offenses)|
74
- on_file_started(formatter, path)
75
- on_file_finished(path, formatter, offenses)
76
- end
77
- formatter.instance_variable_set(:@output, original)
71
+ def on_file_finished(path, offenses)
72
+ @formatter.file_finished(path, offenses)
73
+ end
78
74
 
79
- formatter.finished(paths)
75
+ def on_finished(result)
76
+ original = @formatter.output
77
+ @formatter.instance_variable_set(:@output, ::StringIO.new)
78
+ result.each do |(path, offenses)|
79
+ on_file_started(path)
80
+ on_file_finished(path, offenses)
80
81
  end
82
+ @formatter.instance_variable_set(:@output, original)
83
+
84
+ @formatter.finished(@paths)
81
85
  end
82
86
  end
83
87
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parser"
4
- require "rubocop/cop/legacy/corrector"
3
+ require 'parser'
4
+ require 'rubocop/cop/legacy/corrector'
5
5
 
6
6
  module Slimembedcop
7
7
  # Apply auto-corrections to Template file.
@@ -18,6 +18,10 @@ module Slimembedcop
18
18
 
19
19
  private
20
20
 
21
+ def source_buffer
22
+ ::Parser::Source::Buffer.new(@path, source: @source)
23
+ end
24
+
21
25
  def corrections
22
26
  @offenses.select(&:corrector).map do |offense|
23
27
  lambda do |corrector|
@@ -25,9 +29,5 @@ module Slimembedcop
25
29
  end
26
30
  end
27
31
  end
28
-
29
- def source_buffer
30
- ::Parser::Source::Buffer.new(@path, source: @source)
31
- end
32
32
  end
33
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Slimembedcop
4
- VERSION = "0.1.0"
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/slimembedcop.rb CHANGED
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "slimembedcop/version"
3
+ require_relative 'slimembedcop/version'
4
4
 
5
5
  module Slimembedcop
6
- autoload :Cli, "slimembedcop/cli"
7
- autoload :ConfigGenerator, "slimembedcop/config_generator"
8
- autoload :Extractor, "slimembedcop/extractor"
9
- autoload :Offense, "slimembedcop/offense"
10
- autoload :OffenseCollector, "slimembedcop/offense_collector"
11
- autoload :PathFinder, "slimembedcop/path_finder"
12
- autoload :RubyOffenseCollector, "slimembedcop/ruby_offense_collector"
13
- autoload :Runner, "slimembedcop/runner"
14
- autoload :TemplateCorrector, "slimembedcop/template_corrector"
6
+ autoload :Cli, 'slimembedcop/cli'
7
+ autoload :ConfigGenerator, 'slimembedcop/config_generator'
8
+ autoload :Extractor, 'slimembedcop/extractor'
9
+ autoload :Offense, 'slimembedcop/offense'
10
+ autoload :Option, 'slimembedcop/option'
11
+ autoload :OffenseCollector, 'slimembedcop/offense_collector'
12
+ autoload :PathFinder, 'slimembedcop/path_finder'
13
+ autoload :RubyOffenseCollector, 'slimembedcop/ruby_offense_collector'
14
+ autoload :Runner, 'slimembedcop/runner'
15
+ autoload :TemplateCorrector, 'slimembedcop/template_corrector'
15
16
  end
data/slimembedcop.gemspec CHANGED
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "lib/slimembedcop/version"
3
+ require_relative 'lib/slimembedcop/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "slimembedcop"
6
+ spec.name = 'slimembedcop'
7
7
  spec.version = Slimembedcop::VERSION
8
- spec.authors = ["Yudai Takada"]
9
- spec.email = ["t.yudai92@gmail.com"]
8
+ spec.authors = ['Yudai Takada']
9
+ spec.email = ['t.yudai92@gmail.com']
10
10
 
11
- spec.summary = "RuboCop runner for Ruby code embedded in Slim."
12
- spec.homepage = "https://github.com/ydah/slimembedcop"
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 2.7.0"
11
+ spec.summary = 'RuboCop runner for Ruby code embedded in Slim.'
12
+ spec.homepage = 'https://github.com/ydah/slimembedcop'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = '>= 2.7.0'
15
15
 
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = spec.homepage
18
- spec.metadata["changelog_uri"] = "#{spec.homepage}/releases"
19
- spec.metadata["rubygems_mfa_required"] = "true"
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = spec.homepage
18
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/releases"
19
+ spec.metadata['rubygems_mfa_required'] = 'true'
20
20
 
21
21
  spec.files = Dir.chdir(__dir__) do
22
22
  `git ls-files -z`.split("\x0").reject do |f|
@@ -24,9 +24,9 @@ Gem::Specification.new do |spec|
24
24
  f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
25
25
  end
26
26
  end
27
- spec.bindir = "exe"
27
+ spec.bindir = 'exe'
28
28
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
- spec.require_paths = ["lib"]
29
+ spec.require_paths = ['lib']
30
30
 
31
- spec.add_dependency "rubocop", "~> 1.0"
31
+ spec.add_dependency 'rubocop', '~> 1.0'
32
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slimembedcop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yudai Takada
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-06 00:00:00.000000000 Z
11
+ date: 2023-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -46,6 +46,7 @@ files:
46
46
  - lib/slimembedcop/extractor.rb
47
47
  - lib/slimembedcop/offense.rb
48
48
  - lib/slimembedcop/offense_collector.rb
49
+ - lib/slimembedcop/option.rb
49
50
  - lib/slimembedcop/path_finder.rb
50
51
  - lib/slimembedcop/ruby_offense_collector.rb
51
52
  - lib/slimembedcop/runner.rb