slimcop 0.1.0 → 0.5.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 +4 -4
- data/.rubocop.yml +18 -0
- data/CHANGELOG.md +43 -0
- data/Gemfile +3 -5
- data/Gemfile.lock +9 -5
- data/README.md +13 -0
- data/default.yml +6 -0
- data/lib/slimcop/cli.rb +56 -18
- data/lib/slimcop/configuration.rb +16 -0
- data/lib/slimcop/formatter.rb +72 -0
- data/lib/slimcop/offense.rb +70 -0
- data/lib/slimcop/path_finder.rb +20 -0
- data/lib/slimcop/ruby_extractor.rb +4 -2
- data/lib/slimcop/ruby_offense_collector.rb +7 -4
- data/lib/slimcop/slim_corrector.rb +4 -3
- data/lib/slimcop/slim_offense_collector.rb +14 -6
- data/lib/slimcop/version.rb +1 -1
- data/lib/slimcop.rb +4 -1
- data/slimcop.gemspec +2 -1
- metadata +22 -5
- data/lib/slimcop/runner.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 294e38d0a479f35dc2d3c6c2c042af57645927ec17cc2b91b6e6c68107defd40
|
4
|
+
data.tar.gz: 5f65145f2f89a7fbae3341228bc5d3b2ac8c53c065748ed2dc2e86a1f49d8d95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd736f85dafc680f45a77ab81f791620909eda2c23523cf0d7ce4e999587c464946c14a77a2e1853cd4f14da26e9cd2fd17b444ef0d53e031ae38220adef9998
|
7
|
+
data.tar.gz: 840ee9ef8e7db1c8fb6590b36c157114784c51c20de7adad8a947fc4df305bb54b838fd63faadcbfafb52f715533effaaa95d5fd408a5be81fea546456dfaf95
|
data/.rubocop.yml
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rspec
|
3
|
+
|
1
4
|
AllCops:
|
2
5
|
NewCops: enable
|
3
6
|
SuggestExtensions: false
|
@@ -9,5 +12,20 @@ Layout/LineLength:
|
|
9
12
|
Metrics:
|
10
13
|
Enabled: false
|
11
14
|
|
15
|
+
RSpec/AnyInstance:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
RSpec/ExampleLength:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
RSpec/ImplicitSubject:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
RSpec/MultipleExpectations:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
RSpec/NamedSubject:
|
28
|
+
Enabled: false
|
29
|
+
|
12
30
|
Style/Documentation:
|
13
31
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,49 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 0.5.0 - 2021-12-27
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
|
9
|
+
- Ignore Lint/EmptyFile by default.
|
10
|
+
- Ignore Style/RescueModifier by default.
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
|
14
|
+
- Fix NoMethodError on some RuboCop offenses.
|
15
|
+
- Fix bug when uncorrectable RuboCop offense exists.
|
16
|
+
|
17
|
+
## 0.4.0 - 2021-12-26
|
18
|
+
|
19
|
+
### Added
|
20
|
+
|
21
|
+
- Support glob pattern on arguments of executable.
|
22
|
+
|
23
|
+
### Fixed
|
24
|
+
|
25
|
+
- Fix bug on parsing invalid syntax Ruby code.
|
26
|
+
|
27
|
+
## 0.3.0 - 2021-12-25
|
28
|
+
|
29
|
+
### Added
|
30
|
+
|
31
|
+
- Show Slim file path on Slim syntax error.
|
32
|
+
|
33
|
+
### Changed
|
34
|
+
|
35
|
+
- Require slimi >= 0.4 for :file option handling.
|
36
|
+
|
37
|
+
## 0.2.0 - 2021-12-21
|
38
|
+
|
39
|
+
### Added
|
40
|
+
|
41
|
+
- Add --color and --no-color option.
|
42
|
+
|
43
|
+
### Changed
|
44
|
+
|
45
|
+
- Improve offenses CLI output format.
|
46
|
+
- Return exit status 1 if any offense found.
|
47
|
+
|
5
48
|
## 0.1.0 - 2021-12-21
|
6
49
|
|
7
50
|
- Initial release.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
slimcop (0.
|
4
|
+
slimcop (0.5.0)
|
5
|
+
rainbow
|
5
6
|
rubocop (>= 0.87)
|
6
|
-
slimi (>= 0.
|
7
|
+
slimi (>= 0.4)
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
@@ -41,8 +42,10 @@ GEM
|
|
41
42
|
unicode-display_width (>= 1.4.0, < 3.0)
|
42
43
|
rubocop-ast (1.15.0)
|
43
44
|
parser (>= 3.0.1.1)
|
45
|
+
rubocop-rspec (2.6.0)
|
46
|
+
rubocop (~> 1.19)
|
44
47
|
ruby-progressbar (1.11.0)
|
45
|
-
slimi (0.
|
48
|
+
slimi (0.4.1)
|
46
49
|
temple
|
47
50
|
temple (0.8.2)
|
48
51
|
unicode-display_width (2.1.0)
|
@@ -52,8 +55,9 @@ PLATFORMS
|
|
52
55
|
|
53
56
|
DEPENDENCIES
|
54
57
|
rake (~> 13.0)
|
55
|
-
rspec
|
56
|
-
rubocop
|
58
|
+
rspec
|
59
|
+
rubocop
|
60
|
+
rubocop-rspec
|
57
61
|
slimcop!
|
58
62
|
|
59
63
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Slimcop
|
2
2
|
|
3
|
+
[](https://rubygems.org/gems/slimcop)
|
3
4
|
[](https://github.com/r7kamura/slimcop/actions/workflows/test.yml)
|
4
5
|
|
5
6
|
[RuboCop](https://github.com/rubocop/rubocop) runner for [Slim template](https://github.com/slim-template/slim).
|
@@ -32,4 +33,16 @@ Use `slimcop` executable to check offenses and auto-correct them.
|
|
32
33
|
$ slimcop --help
|
33
34
|
Usage: slimcop [options] [file1, file2, ...]
|
34
35
|
-a, --auto-correct Auto-correct offenses.
|
36
|
+
--[no-]color Force color output on or off.
|
37
|
+
```
|
38
|
+
|
39
|
+
### Example
|
40
|
+
|
41
|
+
```console
|
42
|
+
$ slimcop spec/**/*.slim
|
43
|
+
|
44
|
+
Offenses:
|
45
|
+
|
46
|
+
spec/fixtures/dummy.slim:1:3 C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
|
47
|
+
spec/fixtures/dummy.slim:3:5 C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
|
35
48
|
```
|
data/default.yml
CHANGED
@@ -10,6 +10,9 @@ Layout/BlockAlignment:
|
|
10
10
|
Layout/ClosingParenthesisIndentation:
|
11
11
|
Enabled: false
|
12
12
|
|
13
|
+
Lint/EmptyFile:
|
14
|
+
Enabled: false
|
15
|
+
|
13
16
|
Layout/EmptyLineAfterGuardClause:
|
14
17
|
Enabled: false
|
15
18
|
|
@@ -100,6 +103,9 @@ Style/IfUnlessModifier:
|
|
100
103
|
Style/Next:
|
101
104
|
Enabled: false
|
102
105
|
|
106
|
+
Style/RescueModifier:
|
107
|
+
Enabled: false
|
108
|
+
|
103
109
|
Style/WhileUntilDo:
|
104
110
|
Enabled: false
|
105
111
|
|
data/lib/slimcop/cli.rb
CHANGED
@@ -1,36 +1,71 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'rubocop'
|
3
|
+
require 'rainbow'
|
5
4
|
|
6
5
|
module Slimcop
|
7
6
|
class Cli
|
8
7
|
def initialize(argv)
|
9
8
|
@argv = argv.dup
|
9
|
+
@configuration = Configuration.new
|
10
|
+
@formatter = Formatter.new
|
10
11
|
end
|
11
12
|
|
12
13
|
def call
|
13
14
|
options = parse!
|
14
|
-
@argv.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
else
|
24
|
-
messages = runner.offenses.map do |offense|
|
25
|
-
offense[:rubocop_offense].message
|
26
|
-
end
|
27
|
-
puts messages
|
28
|
-
end
|
29
|
-
end
|
15
|
+
slim_file_paths = PathFinder.new(patterns: @argv).call
|
16
|
+
|
17
|
+
Rainbow.enabled = options[:color] if options.key?(:color)
|
18
|
+
|
19
|
+
offenses_set = investigate(auto_correct: options[:auto_correct], slim_file_paths: slim_file_paths)
|
20
|
+
correct(offenses_set) if options[:auto_correct]
|
21
|
+
offenses = offenses_set.flat_map { |(_, _, array)| array }
|
22
|
+
report(offenses)
|
23
|
+
exit(offenses.empty? ? 0 : 1)
|
30
24
|
end
|
31
25
|
|
32
26
|
private
|
33
27
|
|
28
|
+
# @param [Array] offenses_set
|
29
|
+
def correct(offenses_set)
|
30
|
+
offenses_set.each do |(file_path, source, offenses)|
|
31
|
+
rewritten_source = SlimCorrector.new(
|
32
|
+
file_path: file_path,
|
33
|
+
offenses: offenses,
|
34
|
+
source: source
|
35
|
+
).call
|
36
|
+
::File.write(file_path, rewritten_source)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [Boolean] auto_correct
|
41
|
+
# @param [Array] slim_file_paths
|
42
|
+
# @return [Array]
|
43
|
+
def investigate(auto_correct:, slim_file_paths:)
|
44
|
+
slim_file_paths.map do |file_path|
|
45
|
+
source = ::File.read(file_path)
|
46
|
+
offenses = SlimOffenseCollector.new(
|
47
|
+
auto_correct: auto_correct,
|
48
|
+
file_path: file_path,
|
49
|
+
rubocop_config: @configuration.rubocop_config,
|
50
|
+
source: source
|
51
|
+
).call
|
52
|
+
[file_path, source, offenses]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param [Array<Slimcop::Offense>] offenses
|
57
|
+
def report(offenses)
|
58
|
+
result = +''
|
59
|
+
unless offenses.empty?
|
60
|
+
result << "\nOffenses:\n\n"
|
61
|
+
lines = offenses.map do |offense|
|
62
|
+
@formatter.format_offense(offense)
|
63
|
+
end
|
64
|
+
result << lines.join("\n")
|
65
|
+
end
|
66
|
+
puts(result)
|
67
|
+
end
|
68
|
+
|
34
69
|
# @return [Hash]
|
35
70
|
def parse!
|
36
71
|
options = {}
|
@@ -39,6 +74,9 @@ module Slimcop
|
|
39
74
|
parser.on('-a', '--auto-correct', 'Auto-correct offenses.') do
|
40
75
|
options[:auto_correct] = true
|
41
76
|
end
|
77
|
+
parser.on('--[no-]color', 'Force color output on or off.') do |value|
|
78
|
+
options[:color] = value
|
79
|
+
end
|
42
80
|
parser.parse!(@argv)
|
43
81
|
options
|
44
82
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubocop'
|
4
|
+
|
5
|
+
module Slimcop
|
6
|
+
class Configuration
|
7
|
+
# @return [RuboCop::Config]
|
8
|
+
def rubocop_config
|
9
|
+
@rubocop_config ||= begin
|
10
|
+
config_path = ::File.expand_path('../../default.yml', __dir__)
|
11
|
+
config = ::RuboCop::ConfigLoader.load_file(config_path)
|
12
|
+
::RuboCop::ConfigLoader.merge_with_default(config, config_path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'rainbow'
|
5
|
+
|
6
|
+
module Slimcop
|
7
|
+
# Format String for CLI output.
|
8
|
+
class Formatter
|
9
|
+
COLOR_FOR_SEVERITY_CODE = {
|
10
|
+
convention: :yellow,
|
11
|
+
error: :red,
|
12
|
+
fatal: :red,
|
13
|
+
info: :gray,
|
14
|
+
refactor: :yellow,
|
15
|
+
warning: :magenta
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
# @param [Slimcop::Offense] offense
|
19
|
+
# @return [String]
|
20
|
+
def format_offense(offense)
|
21
|
+
format(
|
22
|
+
'%<path>s:%<line>d:%<column>d %<severity>s: %<message>s',
|
23
|
+
column: offense.real_column,
|
24
|
+
line: offense.line,
|
25
|
+
message: message(offense),
|
26
|
+
path: file_path(offense),
|
27
|
+
severity: severity(offense)
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# @param [String] path e.g. "./spec/fixtures/dummy.slim"
|
34
|
+
# @return [String]
|
35
|
+
# @example "spec/fixtures/dummy.slim"
|
36
|
+
def canonicalize_path(path)
|
37
|
+
::File.expand_path(path).delete_prefix("#{::Dir.pwd}/")
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [Slimcop::Offense] offense
|
41
|
+
# @return [String]
|
42
|
+
def file_path(offense)
|
43
|
+
Rainbow(canonicalize_path(offense.file_path)).cyan
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [Slimcop::Offense] offense
|
47
|
+
# @return [String]
|
48
|
+
def message(offense)
|
49
|
+
"#{status(offense)}#{offense.message}"
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param [Slimcop::Offense] offense
|
53
|
+
# @return [String]
|
54
|
+
def severity(offense)
|
55
|
+
Rainbow(offense.severity.code).color(COLOR_FOR_SEVERITY_CODE[offense.severity.name])
|
56
|
+
end
|
57
|
+
|
58
|
+
# @param [Slimcop::Offense] offense
|
59
|
+
# @return [String]
|
60
|
+
def status(offense)
|
61
|
+
if offense.rubocop_offense.corrected_with_todo?
|
62
|
+
Rainbow('[Todo] ').green
|
63
|
+
elsif offense.rubocop_offense.corrected?
|
64
|
+
Rainbow('[Corrected] ').green
|
65
|
+
elsif offense.rubocop_offense.correctable?
|
66
|
+
Rainbow('[Correctable] ').yellow
|
67
|
+
else
|
68
|
+
''
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parser'
|
4
|
+
|
5
|
+
module Slimcop
|
6
|
+
class Offense
|
7
|
+
# @return [String]
|
8
|
+
attr_reader :file_path
|
9
|
+
|
10
|
+
# @return [Integer]
|
11
|
+
attr_reader :offset
|
12
|
+
|
13
|
+
# @return [RuboCop::Cop::Offense]
|
14
|
+
attr_reader :rubocop_offense
|
15
|
+
|
16
|
+
# @param [Integer] offset
|
17
|
+
# @param [RuboCop::Cop::Offense] rubocop_offense
|
18
|
+
# @param [String] source Slim code.
|
19
|
+
def initialize(file_path:, offset:, rubocop_offense:, source:)
|
20
|
+
@file_path = file_path
|
21
|
+
@offset = offset
|
22
|
+
@rubocop_offense = rubocop_offense
|
23
|
+
@source = source
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [RuboCop::Cop::Corrector]
|
27
|
+
def corrector
|
28
|
+
@rubocop_offense.corrector
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [Integer]
|
32
|
+
def line
|
33
|
+
range.line
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [String]
|
37
|
+
def message
|
38
|
+
@rubocop_offense.message
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Integer]
|
42
|
+
def real_column
|
43
|
+
range.column + 1
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [RuboCop::Cop::Severity]
|
47
|
+
def severity
|
48
|
+
@rubocop_offense.severity
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# @return [Parser::Source::Buffer]
|
54
|
+
def buffer
|
55
|
+
::Parser::Source::Buffer.new(
|
56
|
+
file_path,
|
57
|
+
source: @source
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [Parser::Source::Range]
|
62
|
+
def range
|
63
|
+
@range ||= ::Parser::Source::Range.new(
|
64
|
+
buffer,
|
65
|
+
@rubocop_offense.location.begin_pos + @offset,
|
66
|
+
@rubocop_offense.location.end_pos + @offset
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Slimcop
|
6
|
+
# Collect file paths from given path patterns.
|
7
|
+
class PathFinder
|
8
|
+
# @param [Array<String>] patterns Patterns normally given as CLI arguments (e.g. `["app/views/**/*.html.slim"]`).
|
9
|
+
def initialize(patterns:)
|
10
|
+
@patterns = patterns
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Array<String>]
|
14
|
+
def call
|
15
|
+
@patterns.flat_map do |pattern|
|
16
|
+
::Pathname.glob(pattern).select(&:file?).map(&:to_s)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,8 +5,10 @@ require 'slimi'
|
|
5
5
|
module Slimcop
|
6
6
|
# Extract codes from Slim source.
|
7
7
|
class RubyExtractor
|
8
|
+
# @param [String, nil] file_path
|
8
9
|
# @param [String] source
|
9
|
-
def initialize(source:)
|
10
|
+
def initialize(file_path:, source:)
|
11
|
+
@file_path = file_path
|
10
12
|
@source = source
|
11
13
|
end
|
12
14
|
|
@@ -26,7 +28,7 @@ module Slimcop
|
|
26
28
|
# @return [Array] Slim AST, represented in S-expression.
|
27
29
|
def ast
|
28
30
|
::Slimi::Filters::Interpolation.new.call(
|
29
|
-
::Slimi::Parser.new.call(@source)
|
31
|
+
::Slimi::Parser.new(file: @file_path).call(@source)
|
30
32
|
)
|
31
33
|
end
|
32
34
|
|
@@ -5,18 +5,21 @@ require 'rubocop'
|
|
5
5
|
module Slimcop
|
6
6
|
# Collect RuboCop offenses from Ruby code.
|
7
7
|
class RubyOffenseCollector
|
8
|
+
# @param [Boolean] auto_correct
|
8
9
|
# @param [String] file_path
|
9
10
|
# @param [RuboCop::Config] rubocop_config
|
10
11
|
# @param [String] source
|
11
|
-
def initialize(file_path:, rubocop_config:, source:)
|
12
|
+
def initialize(auto_correct:, file_path:, rubocop_config:, source:)
|
13
|
+
@auto_correct = auto_correct
|
12
14
|
@file_path = file_path
|
13
15
|
@rubocop_config = rubocop_config
|
14
16
|
@source = source
|
15
17
|
end
|
16
18
|
|
17
|
-
# @return [Array<RuboCop::Cop::Offense
|
19
|
+
# @return [Array<RuboCop::Cop::Offense>]
|
18
20
|
def call
|
19
|
-
|
21
|
+
# Skip if invalid syntax Ruby code is given. (e.g. "- if a?")
|
22
|
+
return [] unless rubocop_processed_source.valid_syntax?
|
20
23
|
|
21
24
|
rubocop_team.investigate(rubocop_processed_source).offenses
|
22
25
|
end
|
@@ -37,7 +40,7 @@ module Slimcop
|
|
37
40
|
::RuboCop::Cop::Team.new(
|
38
41
|
::RuboCop::Cop::Registry.new(::RuboCop::Cop::Cop.all),
|
39
42
|
@rubocop_config,
|
40
|
-
auto_correct:
|
43
|
+
auto_correct: @auto_correct,
|
41
44
|
display_cop_names: true,
|
42
45
|
extra_details: true,
|
43
46
|
stdin: ''
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'parser'
|
3
4
|
require 'rubocop/cop/legacy/corrector'
|
4
5
|
|
5
6
|
module Slimcop
|
6
7
|
# Apply auto-corrections to Slim file.
|
7
8
|
class SlimCorrector
|
8
9
|
# @param [String] file_path
|
9
|
-
# @param [Array<
|
10
|
+
# @param [Array<Slimcop::Offense>] offenses
|
10
11
|
# @param [String] source
|
11
12
|
def initialize(file_path:, offenses:, source:)
|
12
13
|
@file_path = file_path
|
@@ -23,9 +24,9 @@ module Slimcop
|
|
23
24
|
|
24
25
|
# @return [Array<Proc>]
|
25
26
|
def corrections
|
26
|
-
@offenses.map do |offense|
|
27
|
+
@offenses.select(&:corrector).map do |offense|
|
27
28
|
lambda do |corrector|
|
28
|
-
corrector.import!(offense
|
29
|
+
corrector.import!(offense.corrector, offset: offense.offset)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -3,27 +3,32 @@
|
|
3
3
|
module Slimcop
|
4
4
|
# Collect RuboCop offenses from Slim code.
|
5
5
|
class SlimOffenseCollector
|
6
|
+
# @param [Boolean] auto_correct
|
6
7
|
# @param [String] file_path Slim file path
|
7
8
|
# @param [RuboCop::Config] rubocop_config
|
8
9
|
# @param [String] source Slim code
|
9
|
-
def initialize(file_path:, rubocop_config:, source:)
|
10
|
+
def initialize(auto_correct:, file_path:, rubocop_config:, source:)
|
11
|
+
@auto_correct = auto_correct
|
10
12
|
@file_path = file_path
|
11
13
|
@rubocop_config = rubocop_config
|
12
14
|
@source = source
|
13
15
|
end
|
14
16
|
|
15
|
-
# @return [Array<
|
17
|
+
# @return [Array<Slimcop::Offense>]
|
16
18
|
def call
|
17
19
|
snippets.flat_map do |snippet|
|
18
20
|
RubyOffenseCollector.new(
|
21
|
+
auto_correct: @auto_correct,
|
19
22
|
file_path: @file_path,
|
20
23
|
rubocop_config: @rubocop_config,
|
21
24
|
source: snippet[:code]
|
22
25
|
).call.map do |rubocop_offense|
|
23
|
-
|
26
|
+
Offense.new(
|
27
|
+
file_path: @file_path,
|
24
28
|
offset: snippet[:begin_],
|
25
|
-
rubocop_offense: rubocop_offense
|
26
|
-
|
29
|
+
rubocop_offense: rubocop_offense,
|
30
|
+
source: @source
|
31
|
+
)
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
@@ -32,7 +37,10 @@ module Slimcop
|
|
32
37
|
|
33
38
|
# @return [Array<Hash>]
|
34
39
|
def snippets
|
35
|
-
RubyExtractor.new(
|
40
|
+
RubyExtractor.new(
|
41
|
+
file_path: @file_path,
|
42
|
+
source: @source
|
43
|
+
).call
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|
data/lib/slimcop/version.rb
CHANGED
data/lib/slimcop.rb
CHANGED
@@ -4,9 +4,12 @@ require_relative 'slimcop/version'
|
|
4
4
|
|
5
5
|
module Slimcop
|
6
6
|
autoload :Cli, 'slimcop/cli'
|
7
|
+
autoload :Configuration, 'slimcop/configuration'
|
8
|
+
autoload :Formatter, 'slimcop/formatter'
|
9
|
+
autoload :Offense, 'slimcop/offense'
|
10
|
+
autoload :PathFinder, 'slimcop/path_finder'
|
7
11
|
autoload :RubyExtractor, 'slimcop/ruby_extractor'
|
8
12
|
autoload :RubyOffenseCollector, 'slimcop/ruby_offense_collector'
|
9
|
-
autoload :Runner, 'slimcop/runner'
|
10
13
|
autoload :SlimCorrector, 'slimcop/slim_corrector'
|
11
14
|
autoload :SlimOffenseCollector, 'slimcop/slim_offense_collector'
|
12
15
|
end
|
data/slimcop.gemspec
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slimcop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rainbow
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rubocop
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -30,14 +44,14 @@ dependencies:
|
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
47
|
+
version: '0.4'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
54
|
+
version: '0.4'
|
41
55
|
description:
|
42
56
|
email:
|
43
57
|
- r7kamura@gmail.com
|
@@ -61,9 +75,12 @@ files:
|
|
61
75
|
- exe/slimcop
|
62
76
|
- lib/slimcop.rb
|
63
77
|
- lib/slimcop/cli.rb
|
78
|
+
- lib/slimcop/configuration.rb
|
79
|
+
- lib/slimcop/formatter.rb
|
80
|
+
- lib/slimcop/offense.rb
|
81
|
+
- lib/slimcop/path_finder.rb
|
64
82
|
- lib/slimcop/ruby_extractor.rb
|
65
83
|
- lib/slimcop/ruby_offense_collector.rb
|
66
|
-
- lib/slimcop/runner.rb
|
67
84
|
- lib/slimcop/slim_corrector.rb
|
68
85
|
- lib/slimcop/slim_offense_collector.rb
|
69
86
|
- lib/slimcop/version.rb
|
data/lib/slimcop/runner.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubocop'
|
4
|
-
|
5
|
-
module Slimcop
|
6
|
-
# Report offenses in Slim file, and apply auto-corrections if required.
|
7
|
-
class Runner
|
8
|
-
# @param [String] file_path
|
9
|
-
def initialize(file_path:)
|
10
|
-
@file_path = file_path
|
11
|
-
end
|
12
|
-
|
13
|
-
# @return [Array<Hash>]
|
14
|
-
def offenses
|
15
|
-
@offenses ||= SlimOffenseCollector.new(
|
16
|
-
file_path: @file_path,
|
17
|
-
rubocop_config: rubocop_config,
|
18
|
-
source: source
|
19
|
-
).call
|
20
|
-
end
|
21
|
-
|
22
|
-
def auto_correct
|
23
|
-
SlimCorrector.new(
|
24
|
-
file_path: @file_path,
|
25
|
-
offenses: offenses,
|
26
|
-
source: source
|
27
|
-
).call
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
# @return [RuboCop::Config]
|
33
|
-
def rubocop_config
|
34
|
-
config_path = ::File.expand_path('../../default.yml', __dir__)
|
35
|
-
config = ::RuboCop::ConfigLoader.load_file(config_path)
|
36
|
-
::RuboCop::ConfigLoader.merge_with_default(config, config_path)
|
37
|
-
end
|
38
|
-
|
39
|
-
# @return [Array<Hash>]
|
40
|
-
def snippets
|
41
|
-
RubyExtractor.new(source: source).call
|
42
|
-
end
|
43
|
-
|
44
|
-
# @return [String]
|
45
|
-
def source
|
46
|
-
::File.read(@file_path)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|