erb_lint 0.1.3 → 0.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 +4 -4
- data/lib/erb_lint/all.rb +2 -0
- data/lib/erb_lint/cache.rb +88 -0
- data/lib/erb_lint/cached_offense.rb +58 -0
- data/lib/erb_lint/cli.rb +83 -7
- data/lib/erb_lint/corrector.rb +1 -1
- data/lib/erb_lint/linter.rb +1 -1
- data/lib/erb_lint/linters/comment_syntax.rb +52 -0
- data/lib/erb_lint/linters/rubocop.rb +6 -25
- data/lib/erb_lint/linters/rubocop_text.rb +1 -0
- data/lib/erb_lint/offense.rb +20 -0
- data/lib/erb_lint/reporters/json_reporter.rb +4 -4
- data/lib/erb_lint/runner.rb +4 -0
- data/lib/erb_lint/runner_config.rb +1 -0
- data/lib/erb_lint/version.rb +1 -1
- metadata +8 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbd70ba43608a99a550faaf48bff18ab2f31931810504ca9f16a45e6645530e8
|
4
|
+
data.tar.gz: c7460b7c72b7cd50b77d5b4a14de71ea0379802bc0730b7b6b52c0cc20645536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2130fdbaaea0d24ae83a3cff2ac19af4b7b7720d3266190312d193f1379e51e210c432376ad5c242b064982374fd1fb8efe84baef414c3784401f018826c4569
|
7
|
+
data.tar.gz: c542ce48834276542f21d4a492fc22f012cd14451fde9f87395ad5f46060355a92467f1b4a27efd10ebd120001783af3861051e461cb1e230d52a4fa7262dbf0
|
data/lib/erb_lint/all.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ERBLint
|
4
|
+
class Cache
|
5
|
+
CACHE_DIRECTORY = ".erb-lint-cache"
|
6
|
+
|
7
|
+
def initialize(config, cache_dir = nil)
|
8
|
+
@config = config
|
9
|
+
@cache_dir = cache_dir || CACHE_DIRECTORY
|
10
|
+
@hits = []
|
11
|
+
@new_results = []
|
12
|
+
puts "Cache mode is on"
|
13
|
+
end
|
14
|
+
|
15
|
+
def get(filename, file_content)
|
16
|
+
file_checksum = checksum(filename, file_content)
|
17
|
+
begin
|
18
|
+
cache_file_contents_as_offenses = JSON.parse(
|
19
|
+
File.read(File.join(@cache_dir, file_checksum))
|
20
|
+
).map do |offense_hash|
|
21
|
+
ERBLint::CachedOffense.new(offense_hash)
|
22
|
+
end
|
23
|
+
rescue Errno::ENOENT
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
@hits.push(file_checksum)
|
27
|
+
cache_file_contents_as_offenses
|
28
|
+
end
|
29
|
+
|
30
|
+
def set(filename, file_content, offenses_as_json)
|
31
|
+
file_checksum = checksum(filename, file_content)
|
32
|
+
@new_results.push(file_checksum)
|
33
|
+
|
34
|
+
FileUtils.mkdir_p(@cache_dir)
|
35
|
+
|
36
|
+
File.open(File.join(@cache_dir, file_checksum), "wb") do |f|
|
37
|
+
f.write(offenses_as_json)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def close
|
42
|
+
prune_cache
|
43
|
+
end
|
44
|
+
|
45
|
+
def prune_cache
|
46
|
+
if hits.empty?
|
47
|
+
puts "Cache being created for the first time, skipping prune"
|
48
|
+
return
|
49
|
+
end
|
50
|
+
|
51
|
+
cache_files = Dir.new(@cache_dir).children
|
52
|
+
cache_files.each do |cache_file|
|
53
|
+
next if hits.include?(cache_file) || new_results.include?(cache_file)
|
54
|
+
|
55
|
+
File.delete(File.join(@cache_dir, cache_file))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def cache_dir_exists?
|
60
|
+
File.directory?(@cache_dir)
|
61
|
+
end
|
62
|
+
|
63
|
+
def clear
|
64
|
+
return unless cache_dir_exists?
|
65
|
+
|
66
|
+
puts "Clearing cache by deleting cache directory"
|
67
|
+
FileUtils.rm_r(@cache_dir)
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
attr_reader :config, :hits, :new_results
|
73
|
+
|
74
|
+
def checksum(filename, file_content)
|
75
|
+
digester = Digest::SHA1.new
|
76
|
+
mode = File.stat(filename).mode
|
77
|
+
|
78
|
+
digester.update(
|
79
|
+
"#{mode}#{config.to_hash}#{ERBLint::VERSION}#{file_content}"
|
80
|
+
)
|
81
|
+
digester.hexdigest
|
82
|
+
rescue Errno::ENOENT
|
83
|
+
# Spurious files that come and go should not cause a crash, at least not
|
84
|
+
# here.
|
85
|
+
"_"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ERBLint
|
4
|
+
# A Cached version of an Offense with only essential information represented as strings
|
5
|
+
class CachedOffense
|
6
|
+
attr_reader(
|
7
|
+
:message,
|
8
|
+
:line_number,
|
9
|
+
:severity,
|
10
|
+
:column,
|
11
|
+
:simple_name,
|
12
|
+
:last_line,
|
13
|
+
:last_column,
|
14
|
+
:length,
|
15
|
+
)
|
16
|
+
|
17
|
+
def initialize(params)
|
18
|
+
params = params.transform_keys(&:to_sym)
|
19
|
+
|
20
|
+
@message = params[:message]
|
21
|
+
@line_number = params[:line_number]
|
22
|
+
@severity = params[:severity]&.to_sym
|
23
|
+
@column = params[:column]
|
24
|
+
@simple_name = params[:simple_name]
|
25
|
+
@last_line = params[:last_line]
|
26
|
+
@last_column = params[:last_column]
|
27
|
+
@length = params[:length]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.new_from_offense(offense)
|
31
|
+
new(
|
32
|
+
{
|
33
|
+
message: offense.message,
|
34
|
+
line_number: offense.line_number,
|
35
|
+
severity: offense.severity,
|
36
|
+
column: offense.column,
|
37
|
+
simple_name: offense.simple_name,
|
38
|
+
last_line: offense.last_line,
|
39
|
+
last_column: offense.last_column,
|
40
|
+
length: offense.length,
|
41
|
+
}
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_h
|
46
|
+
{
|
47
|
+
message: message,
|
48
|
+
line_number: line_number,
|
49
|
+
severity: severity,
|
50
|
+
column: column,
|
51
|
+
simple_name: simple_name,
|
52
|
+
last_line: last_line,
|
53
|
+
last_column: last_column,
|
54
|
+
length: length,
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/erb_lint/cli.rb
CHANGED
@@ -30,12 +30,33 @@ module ERBLint
|
|
30
30
|
def run(args = ARGV)
|
31
31
|
dupped_args = args.dup
|
32
32
|
load_options(dupped_args)
|
33
|
+
|
34
|
+
if cache? && autocorrect?
|
35
|
+
failure!("cannot run autocorrect mode with cache")
|
36
|
+
end
|
37
|
+
|
33
38
|
@files = @options[:stdin] || dupped_args
|
34
39
|
|
35
40
|
load_config
|
36
41
|
|
42
|
+
cache_dir = @options[:cache_dir]
|
43
|
+
@cache = Cache.new(@config, cache_dir) if cache? || clear_cache?
|
44
|
+
|
45
|
+
if clear_cache?
|
46
|
+
if cache.cache_dir_exists?
|
47
|
+
cache.clear
|
48
|
+
success!("cache directory cleared")
|
49
|
+
else
|
50
|
+
failure!("cache directory doesn't exist, skipping deletion.")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
37
54
|
if !@files.empty? && lint_files.empty?
|
38
|
-
|
55
|
+
if allow_no_files?
|
56
|
+
success!("no files found...\n")
|
57
|
+
else
|
58
|
+
failure!("no files found...\n")
|
59
|
+
end
|
39
60
|
elsif lint_files.empty?
|
40
61
|
failure!("no files found or given, specify files or config...\n#{option_parser}")
|
41
62
|
end
|
@@ -61,7 +82,7 @@ module ERBLint
|
|
61
82
|
lint_files.each do |filename|
|
62
83
|
runner.clear_offenses
|
63
84
|
begin
|
64
|
-
file_content =
|
85
|
+
file_content = run_on_file(runner, filename)
|
65
86
|
rescue => e
|
66
87
|
@stats.exceptions += 1
|
67
88
|
puts "Exception occurred when processing: #{relative_filename(filename)}"
|
@@ -73,6 +94,8 @@ module ERBLint
|
|
73
94
|
end
|
74
95
|
end
|
75
96
|
|
97
|
+
cache&.close
|
98
|
+
|
76
99
|
reporter.show
|
77
100
|
|
78
101
|
if stdin? && autocorrect?
|
@@ -95,13 +118,43 @@ module ERBLint
|
|
95
118
|
|
96
119
|
private
|
97
120
|
|
121
|
+
attr_reader :cache, :config
|
122
|
+
|
123
|
+
def run_on_file(runner, filename)
|
124
|
+
file_content = read_content(filename)
|
125
|
+
|
126
|
+
if cache? && !autocorrect?
|
127
|
+
run_using_cache(runner, filename, file_content)
|
128
|
+
else
|
129
|
+
file_content = run_with_corrections(runner, filename, file_content)
|
130
|
+
end
|
131
|
+
|
132
|
+
log_offense_stats(runner, filename)
|
133
|
+
file_content
|
134
|
+
end
|
135
|
+
|
136
|
+
def run_using_cache(runner, filename, file_content)
|
137
|
+
if (cache_result_offenses = cache.get(filename, file_content))
|
138
|
+
runner.restore_offenses(cache_result_offenses)
|
139
|
+
else
|
140
|
+
run_with_corrections(runner, filename, file_content)
|
141
|
+
cache.set(filename, file_content, runner.offenses.map(&:to_cached_offense_hash).to_json)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
98
145
|
def autocorrect?
|
99
146
|
@options[:autocorrect]
|
100
147
|
end
|
101
148
|
|
102
|
-
def
|
103
|
-
|
149
|
+
def cache?
|
150
|
+
@options[:cache]
|
151
|
+
end
|
152
|
+
|
153
|
+
def clear_cache?
|
154
|
+
@options[:clear_cache]
|
155
|
+
end
|
104
156
|
|
157
|
+
def run_with_corrections(runner, filename, file_content)
|
105
158
|
7.times do
|
106
159
|
processed_source = ERBLint::ProcessedSource.new(filename, file_content)
|
107
160
|
runner.run(processed_source)
|
@@ -123,6 +176,11 @@ module ERBLint
|
|
123
176
|
file_content = corrector.corrected_content
|
124
177
|
runner.clear_offenses
|
125
178
|
end
|
179
|
+
|
180
|
+
file_content
|
181
|
+
end
|
182
|
+
|
183
|
+
def log_offense_stats(runner, filename)
|
126
184
|
offenses_filename = relative_filename(filename)
|
127
185
|
offenses = runner.offenses || []
|
128
186
|
|
@@ -134,8 +192,6 @@ module ERBLint
|
|
134
192
|
|
135
193
|
@stats.processed_files[offenses_filename] ||= []
|
136
194
|
@stats.processed_files[offenses_filename] |= offenses
|
137
|
-
|
138
|
-
file_content
|
139
195
|
end
|
140
196
|
|
141
197
|
def read_content(filename)
|
@@ -262,7 +318,7 @@ module ERBLint
|
|
262
318
|
end
|
263
319
|
end
|
264
320
|
|
265
|
-
opts.on("--format FORMAT", format_options_help) do |format|
|
321
|
+
opts.on("-f", "--format FORMAT", format_options_help) do |format|
|
266
322
|
unless Reporter.available_format?(format)
|
267
323
|
error_message = invalid_format_error_message(format)
|
268
324
|
failure!(error_message)
|
@@ -279,6 +335,18 @@ module ERBLint
|
|
279
335
|
@options[:enabled_linters] = known_linter_names
|
280
336
|
end
|
281
337
|
|
338
|
+
opts.on("--cache", "Enable caching") do |config|
|
339
|
+
@options[:cache] = config
|
340
|
+
end
|
341
|
+
|
342
|
+
opts.on("--cache-dir DIR", "Set the cache directory") do |dir|
|
343
|
+
@options[:cache_dir] = dir
|
344
|
+
end
|
345
|
+
|
346
|
+
opts.on("--clear-cache", "Clear cache") do |config|
|
347
|
+
@options[:clear_cache] = config
|
348
|
+
end
|
349
|
+
|
282
350
|
opts.on("--enable-linters LINTER[,LINTER,...]", Array,
|
283
351
|
"Only use specified linter", "Known linters are: #{known_linter_names.join(", ")}") do |linters|
|
284
352
|
linters.each do |linter|
|
@@ -302,6 +370,10 @@ module ERBLint
|
|
302
370
|
@options[:autocorrect] = config
|
303
371
|
end
|
304
372
|
|
373
|
+
opts.on("--allow-no-files", "When no matching files found, exit successfully (default: false)") do |config|
|
374
|
+
@options[:allow_no_files] = config
|
375
|
+
end
|
376
|
+
|
305
377
|
opts.on(
|
306
378
|
"-sFILE",
|
307
379
|
"--stdin FILE",
|
@@ -333,5 +405,9 @@ module ERBLint
|
|
333
405
|
def stdin?
|
334
406
|
@options[:stdin].present?
|
335
407
|
end
|
408
|
+
|
409
|
+
def allow_no_files?
|
410
|
+
@options[:allow_no_files]
|
411
|
+
end
|
336
412
|
end
|
337
413
|
end
|
data/lib/erb_lint/corrector.rb
CHANGED
@@ -12,7 +12,7 @@ module ERBLint
|
|
12
12
|
|
13
13
|
def corrections
|
14
14
|
@corrections ||= @offenses.map do |offense|
|
15
|
-
offense.linter.autocorrect(@processed_source, offense)
|
15
|
+
offense.linter.autocorrect(@processed_source, offense) if offense.linter.class.support_autocorrect?
|
16
16
|
end.compact
|
17
17
|
end
|
18
18
|
|
data/lib/erb_lint/linter.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ERBLint
|
4
|
+
module Linters
|
5
|
+
# Detects comment syntax that isn't valid ERB.
|
6
|
+
class CommentSyntax < Linter
|
7
|
+
include LinterRegistry
|
8
|
+
|
9
|
+
def initialize(file_loader, config)
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(processed_source)
|
14
|
+
file_content = processed_source.file_content
|
15
|
+
return if file_content.empty?
|
16
|
+
|
17
|
+
processed_source.ast.descendants(:erb).each do |erb_node|
|
18
|
+
indicator_node, _, code_node, _ = *erb_node
|
19
|
+
next if code_node.nil?
|
20
|
+
|
21
|
+
indicator_node_str = indicator_node&.deconstruct&.last
|
22
|
+
next if indicator_node_str == "#"
|
23
|
+
|
24
|
+
code_node_str = code_node.deconstruct.last
|
25
|
+
next unless code_node_str.start_with?(" #")
|
26
|
+
|
27
|
+
range = find_range(erb_node, code_node_str)
|
28
|
+
source_range = processed_source.to_source_range(range)
|
29
|
+
|
30
|
+
correct_erb_tag = indicator_node_str == "=" ? "<%#=" : "<%#"
|
31
|
+
|
32
|
+
add_offense(
|
33
|
+
source_range,
|
34
|
+
<<~EOF.chomp
|
35
|
+
Bad ERB comment syntax. Should be #{correct_erb_tag} without a space between.
|
36
|
+
Leaving a space between ERB tags and the Ruby comment character can cause parser errors.
|
37
|
+
EOF
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_range(node, str)
|
43
|
+
match = node.loc.source.match(Regexp.new(Regexp.quote(str.strip)))
|
44
|
+
return unless match
|
45
|
+
|
46
|
+
range_begin = match.begin(0) + node.loc.begin_pos
|
47
|
+
range_end = match.end(0) + node.loc.begin_pos
|
48
|
+
(range_begin...range_end)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -13,6 +13,7 @@ module ERBLint
|
|
13
13
|
class ConfigSchema < LinterConfig
|
14
14
|
property :only, accepts: array_of?(String)
|
15
15
|
property :rubocop_config, accepts: Hash, default: -> { {} }
|
16
|
+
property :config_file_path, accepts: String
|
16
17
|
end
|
17
18
|
|
18
19
|
self.config_schema = ConfigSchema
|
@@ -24,7 +25,8 @@ module ERBLint
|
|
24
25
|
def initialize(file_loader, config)
|
25
26
|
super
|
26
27
|
@only_cops = @config.only
|
27
|
-
custom_config =
|
28
|
+
custom_config = config_from_path(@config.config_file_path) if @config.config_file_path
|
29
|
+
custom_config ||= config_from_hash(@config.rubocop_config)
|
28
30
|
@rubocop_config = ::RuboCop::ConfigLoader.merge_with_default(custom_config, "")
|
29
31
|
end
|
30
32
|
|
@@ -158,34 +160,13 @@ module ERBLint
|
|
158
160
|
end
|
159
161
|
|
160
162
|
def config_from_hash(hash)
|
161
|
-
inherit_from = hash&.delete("inherit_from")
|
162
|
-
resolve_inheritance(hash, inherit_from)
|
163
|
-
|
164
163
|
tempfile_from(".erblint-rubocop", hash.to_yaml) do |tempfile|
|
165
|
-
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def resolve_inheritance(hash, inherit_from)
|
170
|
-
base_configs(inherit_from)
|
171
|
-
.reverse_each do |base_config|
|
172
|
-
base_config.each do |k, v|
|
173
|
-
hash[k] = hash.key?(k) ? ::RuboCop::ConfigLoader.merge(v, hash[k]) : v if v.is_a?(Hash)
|
174
|
-
end
|
164
|
+
config_from_path(tempfile.path)
|
175
165
|
end
|
176
166
|
end
|
177
167
|
|
178
|
-
def
|
179
|
-
|
180
|
-
configs = Array(inherit_from).compact.map do |base_name|
|
181
|
-
if base_name =~ /\A#{regex}\z/
|
182
|
-
::RuboCop::ConfigLoader.load_file(::RuboCop::RemoteConfig.new(base_name, Dir.pwd))
|
183
|
-
else
|
184
|
-
config_from_hash(@file_loader.yaml(base_name))
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
configs.compact
|
168
|
+
def config_from_path(path)
|
169
|
+
::RuboCop::ConfigLoader.load_file(path)
|
189
170
|
end
|
190
171
|
|
191
172
|
def add_offense(rubocop_offense, offense_range, correction, offset, bound_range)
|
data/lib/erb_lint/offense.rb
CHANGED
@@ -17,6 +17,10 @@ module ERBLint
|
|
17
17
|
@severity = severity
|
18
18
|
end
|
19
19
|
|
20
|
+
def to_cached_offense_hash
|
21
|
+
ERBLint::CachedOffense.new_from_offense(self).to_h
|
22
|
+
end
|
23
|
+
|
20
24
|
def inspect
|
21
25
|
"#<#{self.class.name} linter=#{linter.class.name} "\
|
22
26
|
"source_range=#{source_range.begin_pos}...#{source_range.end_pos} "\
|
@@ -43,5 +47,21 @@ module ERBLint
|
|
43
47
|
def column
|
44
48
|
source_range.column
|
45
49
|
end
|
50
|
+
|
51
|
+
def simple_name
|
52
|
+
linter.class.simple_name
|
53
|
+
end
|
54
|
+
|
55
|
+
def last_line
|
56
|
+
source_range.last_line
|
57
|
+
end
|
58
|
+
|
59
|
+
def last_column
|
60
|
+
source_range.last_column
|
61
|
+
end
|
62
|
+
|
63
|
+
def length
|
64
|
+
source_range.length
|
65
|
+
end
|
46
66
|
end
|
47
67
|
end
|
@@ -56,14 +56,14 @@ module ERBLint
|
|
56
56
|
|
57
57
|
def format_offense(offense)
|
58
58
|
{
|
59
|
-
linter: offense.
|
59
|
+
linter: offense.simple_name,
|
60
60
|
message: offense.message.to_s,
|
61
61
|
location: {
|
62
62
|
start_line: offense.line_number,
|
63
63
|
start_column: offense.column,
|
64
|
-
last_line: offense.
|
65
|
-
last_column: offense.
|
66
|
-
length: offense.
|
64
|
+
last_line: offense.last_line,
|
65
|
+
last_column: offense.last_column,
|
66
|
+
length: offense.length,
|
67
67
|
},
|
68
68
|
}
|
69
69
|
end
|
data/lib/erb_lint/runner.rb
CHANGED
data/lib/erb_lint/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erb_lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Chan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -26,32 +26,18 @@ dependencies:
|
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: better_html
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.0.7
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.0.7
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: html_tokenizer
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
33
|
+
version: 2.0.1
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
40
|
+
version: 2.0.1
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: parser
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -161,6 +147,8 @@ files:
|
|
161
147
|
- exe/erblint
|
162
148
|
- lib/erb_lint.rb
|
163
149
|
- lib/erb_lint/all.rb
|
150
|
+
- lib/erb_lint/cache.rb
|
151
|
+
- lib/erb_lint/cached_offense.rb
|
164
152
|
- lib/erb_lint/cli.rb
|
165
153
|
- lib/erb_lint/corrector.rb
|
166
154
|
- lib/erb_lint/file_loader.rb
|
@@ -169,6 +157,7 @@ files:
|
|
169
157
|
- lib/erb_lint/linter_registry.rb
|
170
158
|
- lib/erb_lint/linters/allowed_script_type.rb
|
171
159
|
- lib/erb_lint/linters/closing_erb_tag_indent.rb
|
160
|
+
- lib/erb_lint/linters/comment_syntax.rb
|
172
161
|
- lib/erb_lint/linters/deprecated_classes.rb
|
173
162
|
- lib/erb_lint/linters/erb_safety.rb
|
174
163
|
- lib/erb_lint/linters/extra_newline.rb
|
@@ -215,7 +204,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
215
204
|
requirements:
|
216
205
|
- - ">="
|
217
206
|
- !ruby/object:Gem::Version
|
218
|
-
version: 2.
|
207
|
+
version: 2.7.0
|
219
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
209
|
requirements:
|
221
210
|
- - ">="
|