erb_lint 0.1.3 → 0.9.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/exe/erb_lint +10 -0
  3. data/exe/erblint +5 -4
  4. data/lib/erb_lint/all.rb +2 -0
  5. data/lib/erb_lint/cache.rb +88 -0
  6. data/lib/erb_lint/cached_offense.rb +58 -0
  7. data/lib/erb_lint/cli.rb +117 -22
  8. data/lib/erb_lint/corrector.rb +6 -17
  9. data/lib/erb_lint/file_loader.rb +2 -8
  10. data/lib/erb_lint/linter.rb +28 -2
  11. data/lib/erb_lint/linter_registry.rb +11 -1
  12. data/lib/erb_lint/linters/allowed_script_type.rb +8 -7
  13. data/lib/erb_lint/linters/closing_erb_tag_indent.rb +3 -3
  14. data/lib/erb_lint/linters/comment_syntax.rb +52 -0
  15. data/lib/erb_lint/linters/deprecated_classes.rb +2 -2
  16. data/lib/erb_lint/linters/erb_safety.rb +1 -1
  17. data/lib/erb_lint/linters/extra_newline.rb +1 -1
  18. data/lib/erb_lint/linters/final_newline.rb +4 -4
  19. data/lib/erb_lint/linters/hard_coded_string.rb +7 -4
  20. data/lib/erb_lint/linters/no_javascript_tag_helper.rb +6 -4
  21. data/lib/erb_lint/linters/no_unused_disable.rb +47 -0
  22. data/lib/erb_lint/linters/parser_errors.rb +1 -1
  23. data/lib/erb_lint/linters/partial_instance_variable.rb +2 -2
  24. data/lib/erb_lint/linters/require_input_autocomplete.rb +4 -4
  25. data/lib/erb_lint/linters/require_script_nonce.rb +2 -2
  26. data/lib/erb_lint/linters/right_trim.rb +1 -1
  27. data/lib/erb_lint/linters/rubocop.rb +32 -83
  28. data/lib/erb_lint/linters/rubocop_text.rb +2 -1
  29. data/lib/erb_lint/linters/self_closing_tag.rb +22 -5
  30. data/lib/erb_lint/linters/space_around_erb_tag.rb +8 -8
  31. data/lib/erb_lint/linters/space_in_html_tag.rb +7 -7
  32. data/lib/erb_lint/linters/space_indentation.rb +1 -1
  33. data/lib/erb_lint/linters/strict_locals.rb +50 -0
  34. data/lib/erb_lint/linters/trailing_whitespace.rb +1 -1
  35. data/lib/erb_lint/offense.rb +30 -3
  36. data/lib/erb_lint/processed_source.rb +1 -1
  37. data/lib/erb_lint/reporter.rb +3 -2
  38. data/lib/erb_lint/reporters/compact_reporter.rb +3 -2
  39. data/lib/erb_lint/reporters/gitlab_reporter.rb +55 -0
  40. data/lib/erb_lint/reporters/json_reporter.rb +4 -4
  41. data/lib/erb_lint/reporters/junit_reporter.rb +63 -0
  42. data/lib/erb_lint/reporters/multiline_reporter.rb +6 -1
  43. data/lib/erb_lint/runner.rb +36 -3
  44. data/lib/erb_lint/runner_config.rb +2 -1
  45. data/lib/erb_lint/runner_config_resolver.rb +1 -1
  46. data/lib/erb_lint/utils/block_map.rb +4 -4
  47. data/lib/erb_lint/utils/inline_configs.rb +15 -0
  48. data/lib/erb_lint/utils/severity_levels.rb +8 -2
  49. data/lib/erb_lint/version.rb +1 -1
  50. metadata +21 -28
  51. data/lib/erb_lint/utils/offset_corrector.rb +0 -72
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ERBLint
4
+ module Linters
5
+ # Enforces the use of strict locals in Rails view partial templates.
6
+ class StrictLocals < Linter
7
+ include LinterRegistry
8
+
9
+ STRICT_LOCALS_REGEX = /\s+locals:\s+\((.*)\)/
10
+
11
+ def initialize(file_loader, config)
12
+ super
13
+ end
14
+
15
+ def run(processed_source)
16
+ return unless processed_source.filename.match?(%r{(\A|.*/)_[^/\s]*\.html\.erb\z})
17
+
18
+ file_content = processed_source.file_content
19
+ return if file_content.empty?
20
+
21
+ strict_locals_node = processed_source.ast.descendants(:erb).find do |erb_node|
22
+ indicator_node, _, code_node, _ = *erb_node
23
+
24
+ indicator_node_str = indicator_node&.deconstruct&.last
25
+ next unless indicator_node_str == "#"
26
+
27
+ code_node_str = code_node&.deconstruct&.last
28
+
29
+ code_node_str.match(STRICT_LOCALS_REGEX)
30
+ end
31
+
32
+ unless strict_locals_node
33
+ add_offense(
34
+ processed_source.to_source_range(0...processed_source.file_content.size),
35
+ <<~EOF.chomp,
36
+ Missing strict locals declaration.
37
+ Add <%# locals: () %> at the top of the file to enforce strict locals.
38
+ EOF
39
+ )
40
+ end
41
+ end
42
+
43
+ def autocorrect(_processed_source, offense)
44
+ lambda do |corrector|
45
+ corrector.insert_before(offense.source_range, "<%# locals: () %>\n")
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -18,7 +18,7 @@ module ERBLint
18
18
 
19
19
  add_offense(
20
20
  processed_source.to_source_range((document_pos - whitespace.length - 1)...(document_pos - 1)),
21
- "Extra whitespace detected at end of line."
21
+ "Extra whitespace detected at end of line.",
22
22
  )
23
23
  end
24
24
  end
@@ -15,12 +15,17 @@ module ERBLint
15
15
  @message = message
16
16
  @context = context
17
17
  @severity = severity
18
+ @disabled = false
19
+ end
20
+
21
+ def to_cached_offense_hash
22
+ ERBLint::CachedOffense.new_from_offense(self).to_h
18
23
  end
19
24
 
20
25
  def inspect
21
- "#<#{self.class.name} linter=#{linter.class.name} "\
22
- "source_range=#{source_range.begin_pos}...#{source_range.end_pos} "\
23
- "message=#{message}> "\
26
+ "#<#{self.class.name} linter=#{linter.class.name} " \
27
+ "source_range=#{source_range.begin_pos}...#{source_range.end_pos} " \
28
+ "message=#{message}> " \
24
29
  "severity=#{severity}"
25
30
  end
26
31
 
@@ -40,8 +45,30 @@ module ERBLint
40
45
  line_range.begin
41
46
  end
42
47
 
48
+ attr_writer :disabled
49
+
50
+ def disabled?
51
+ @disabled
52
+ end
53
+
43
54
  def column
44
55
  source_range.column
45
56
  end
57
+
58
+ def simple_name
59
+ linter.class.simple_name
60
+ end
61
+
62
+ def last_line
63
+ source_range.last_line
64
+ end
65
+
66
+ def last_column
67
+ source_range.last_column
68
+ end
69
+
70
+ def length
71
+ source_range.length
72
+ end
46
73
  end
47
74
  end
@@ -27,7 +27,7 @@ module ERBLint
27
27
  BetterHtml::Tokenizer::Location.new(
28
28
  source_buffer,
29
29
  range.begin,
30
- range.exclude_end? ? range.end : range.end + 1
30
+ range.exclude_end? ? range.end : range.end + 1,
31
31
  )
32
32
  end
33
33
  end
@@ -23,9 +23,10 @@ module ERBLint
23
23
  .sort
24
24
  end
25
25
 
26
- def initialize(stats, autocorrect)
26
+ def initialize(stats, autocorrect, show_linter_names = false)
27
27
  @stats = stats
28
28
  @autocorrect = autocorrect
29
+ @show_linter_names = show_linter_names
29
30
  end
30
31
 
31
32
  def preview; end
@@ -34,7 +35,7 @@ module ERBLint
34
35
 
35
36
  private
36
37
 
37
- attr_reader :stats, :autocorrect
38
+ attr_reader :stats, :autocorrect, :show_linter_names
38
39
 
39
40
  delegate :processed_files, to: :stats
40
41
  end
@@ -33,8 +33,9 @@ module ERBLint
33
33
  "#{filename}:",
34
34
  "#{offense.line_number}:",
35
35
  "#{offense.column}: ",
36
+ ("[#{offense.simple_name}] " if show_linter_names),
36
37
  offense.message.to_s,
37
- ].join
38
+ ].compact.join
38
39
  end
39
40
 
40
41
  def footer; end
@@ -60,7 +61,7 @@ module ERBLint
60
61
 
61
62
  if corrected_found_diff > 0
62
63
  message = Rainbow(
63
- "#{stats.corrected} error(s) corrected and #{corrected_found_diff} error(s) remaining in ERB files"
64
+ "#{stats.corrected} error(s) corrected and #{corrected_found_diff} error(s) remaining in ERB files",
64
65
  ).red
65
66
 
66
67
  warn(message)
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module ERBLint
6
+ module Reporters
7
+ class GitlabReporter < Reporter
8
+ def preview; end
9
+
10
+ def show
11
+ puts formatted_data
12
+ end
13
+
14
+ private
15
+
16
+ def formatted_data
17
+ formatted_files.to_json
18
+ end
19
+
20
+ def formatted_files
21
+ processed_files.flat_map do |filename, offenses|
22
+ formatted_offenses(filename, offenses)
23
+ end
24
+ end
25
+
26
+ def formatted_offenses(filename, offenses)
27
+ offenses.map do |offense|
28
+ format_offense(filename, offense)
29
+ end
30
+ end
31
+
32
+ def format_offense(filename, offense)
33
+ {
34
+ description: offense.message,
35
+ check_name: offense.simple_name,
36
+ fingerprint: generate_fingerprint(filename, offense),
37
+ severity: offense.severity,
38
+ location: {
39
+ path: filename,
40
+ lines: {
41
+ begin: offense.line_number,
42
+ end: offense.last_line,
43
+ },
44
+ },
45
+ }
46
+ end
47
+
48
+ def generate_fingerprint(filename, offense)
49
+ Digest::MD5.hexdigest(
50
+ "#{offense.simple_name}@#{filename}:#{offense.line_number}:#{offense.last_line}",
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
@@ -56,14 +56,14 @@ module ERBLint
56
56
 
57
57
  def format_offense(offense)
58
58
  {
59
- linter: offense.linter.class.simple_name,
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.source_range.last_line,
65
- last_column: offense.source_range.last_column,
66
- length: offense.source_range.length,
64
+ last_line: offense.last_line,
65
+ last_column: offense.last_column,
66
+ length: offense.length,
67
67
  },
68
68
  }
69
69
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ERBLint
4
+ module Reporters
5
+ class JunitReporter < Reporter
6
+ ESCAPE_MAP = {
7
+ '"' => "&quot;",
8
+ "'" => "&apos;",
9
+ "<" => "&lt;",
10
+ ">" => "&gt;",
11
+ "&" => "&amp;",
12
+ }.freeze
13
+
14
+ PROPERTIES = [
15
+ ["erb_lint_version", ERBLint::VERSION],
16
+ ["ruby_engine", RUBY_ENGINE],
17
+ ["ruby_version", RUBY_VERSION],
18
+ ["ruby_patchlevel", RUBY_PATCHLEVEL.to_s],
19
+ ["ruby_platform", RUBY_PLATFORM],
20
+ ].freeze
21
+
22
+ def preview; end
23
+
24
+ def show
25
+ puts %(<?xml version="1.0" encoding="UTF-8"?>)
26
+ puts %(<testsuite name="erblint" tests="#{@stats.processed_files.size}" failures="#{@stats.found}">)
27
+
28
+ puts %( <properties>)
29
+ PROPERTIES.each do |key, value|
30
+ puts %( <property name="#{xml_escape(key)}" value="#{xml_escape(value)}"/>)
31
+ end
32
+ puts %( </properties>)
33
+
34
+ processed_files.each do |filename, offenses|
35
+ filename_escaped = xml_escape(filename)
36
+ if offenses.empty?
37
+ puts %( <testcase name="#{filename_escaped}" file="#{filename_escaped}"/>)
38
+ else
39
+ offenses.each do |offense|
40
+ type = offense.simple_name
41
+ message = "#{type}: #{offense.message}"
42
+ body = "#{message} at #{filename}:#{offense.line_number}:#{offense.column}"
43
+
44
+ puts %( <testcase name="#{filename_escaped}" file="#{filename_escaped}" lineno="#{offense.line_number}">)
45
+ puts %( <failure message="#{xml_escape(message)}" type="#{xml_escape(type)}">)
46
+ puts %( #{xml_escape(body)})
47
+ puts %( </failure>)
48
+ puts %( </testcase>)
49
+ end
50
+ end
51
+ end
52
+
53
+ puts %(</testsuite>)
54
+ end
55
+
56
+ private
57
+
58
+ def xml_escape(string)
59
+ string.gsub(Regexp.union(ESCAPE_MAP.keys), ESCAPE_MAP)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -8,9 +8,14 @@ module ERBLint
8
8
  private
9
9
 
10
10
  def format_offense(filename, offense)
11
+ details = "#{offense.message}#{Rainbow(" (not autocorrected)").red if autocorrect}"
12
+ if show_linter_names
13
+ details = "[#{offense.simple_name}] " + details
14
+ end
15
+
11
16
  <<~EOF
12
17
 
13
- #{offense.message}#{Rainbow(" (not autocorrected)").red if autocorrect}
18
+ #{details}
14
19
  In file: #{filename}:#{offense.line_number}
15
20
  EOF
16
21
  end
@@ -5,15 +5,19 @@ module ERBLint
5
5
  class Runner
6
6
  attr_reader :offenses
7
7
 
8
- def initialize(file_loader, config)
8
+ def initialize(file_loader, config, disable_inline_configs = false)
9
9
  @file_loader = file_loader
10
10
  @config = config || RunnerConfig.default
11
11
  raise ArgumentError, "expect `config` to be a RunnerConfig instance" unless @config.is_a?(RunnerConfig)
12
12
 
13
- linter_classes = LinterRegistry.linters.select { |klass| @config.for_linter(klass).enabled? }
13
+ linter_classes = LinterRegistry.linters.select do |klass|
14
+ @config.for_linter(klass).enabled? && klass != ERBLint::Linters::NoUnusedDisable
15
+ end
14
16
  @linters = linter_classes.map do |linter_class|
15
17
  linter_class.new(@file_loader, @config.for_linter(linter_class))
16
18
  end
19
+ @no_unused_disable = nil
20
+ @disable_inline_configs = disable_inline_configs
17
21
  @offenses = []
18
22
  end
19
23
 
@@ -21,14 +25,43 @@ module ERBLint
21
25
  @linters
22
26
  .reject { |linter| linter.excludes_file?(processed_source.filename) }
23
27
  .each do |linter|
24
- linter.run(processed_source)
28
+ linter.run_and_update_offense_status(processed_source, enable_inline_configs?)
25
29
  @offenses.concat(linter.offenses)
26
30
  end
31
+ report_unused_disable(processed_source)
32
+ @offenses = @offenses.reject(&:disabled?)
27
33
  end
28
34
 
29
35
  def clear_offenses
30
36
  @offenses = []
31
37
  @linters.each(&:clear_offenses)
38
+ @no_unused_disable&.clear_offenses
39
+ end
40
+
41
+ def restore_offenses(offenses)
42
+ @offenses.concat(offenses)
43
+ end
44
+
45
+ private
46
+
47
+ def enable_inline_configs?
48
+ !@disable_inline_configs
49
+ end
50
+
51
+ def no_unused_disable_enabled?
52
+ LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) &&
53
+ @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled?
54
+ end
55
+
56
+ def report_unused_disable(processed_source)
57
+ if no_unused_disable_enabled? && enable_inline_configs?
58
+ @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(
59
+ @file_loader,
60
+ @config.for_linter(ERBLint::Linters::NoUnusedDisable),
61
+ )
62
+ @no_unused_disable.run(processed_source, @offenses)
63
+ @offenses.concat(@no_unused_disable.offenses)
64
+ end
32
65
  end
33
66
  end
34
67
  end
@@ -63,6 +63,7 @@ module ERBLint
63
63
  SpaceInHtmlTag: { enabled: default_enabled },
64
64
  TrailingWhitespace: { enabled: default_enabled },
65
65
  RequireInputAutocomplete: { enabled: default_enabled },
66
+ CommentSyntax: { enabled: default_enabled },
66
67
  },
67
68
  )
68
69
  end
@@ -82,7 +83,7 @@ module ERBLint
82
83
  def config_hash_for_linter(klass_name)
83
84
  config_hash = linters_config[klass_name] || {}
84
85
  config_hash["exclude"] ||= []
85
- config_hash["exclude"].concat(global_exclude) if config_hash["exclude"].is_a?(Array)
86
+ config_hash["exclude"].concat(global_exclude).uniq! if config_hash["exclude"].is_a?(Array)
86
87
  config_hash
87
88
  end
88
89
 
@@ -37,7 +37,7 @@ module ERBLint
37
37
 
38
38
  def resolve_inheritance_from_gems(hash, gems)
39
39
  (gems || {}).each_pair do |gem_name, config_path|
40
- raise(ArgumentError, "can't inherit configuration from the erb-lint gem") if gem_name == "erb-lint"
40
+ raise(ArgumentError, "can't inherit configuration from the erb_lint gem") if gem_name == "erb_lint"
41
41
 
42
42
  hash["inherit_from"] = Array(hash["inherit_from"])
43
43
  Array(config_path).reverse_each do |path|
@@ -60,7 +60,7 @@ module ERBLint
60
60
  end
61
61
 
62
62
  def inspect
63
- "\#<#{self.class.name} type=#{type.inspect} nodes=#{nodes.inspect}>"
63
+ "#<#{self.class.name} type=#{type.inspect} nodes=#{nodes.inspect}>"
64
64
  end
65
65
 
66
66
  def &(other)
@@ -102,7 +102,7 @@ module ERBLint
102
102
  node.type,
103
103
  extract_map_locations(node)
104
104
  .map { |loc| find_entry(loc) }
105
- .compact.map(&:node)
105
+ .compact.map(&:node),
106
106
  )
107
107
  end
108
108
 
@@ -111,7 +111,7 @@ module ERBLint
111
111
  :begin,
112
112
  (extract_map_locations(node) + rescue_locations(node))
113
113
  .map { |loc| find_entry(loc) }
114
- .compact.map(&:node)
114
+ .compact.map(&:node),
115
115
  )
116
116
  end
117
117
 
@@ -120,7 +120,7 @@ module ERBLint
120
120
  node.type,
121
121
  (extract_map_locations(node) + when_locations(node))
122
122
  .map { |loc| find_entry(loc) }
123
- .compact.map(&:node)
123
+ .compact.map(&:node),
124
124
  )
125
125
  end
126
126
 
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ERBLint
4
+ module Utils
5
+ class InlineConfigs
6
+ def self.rule_disable_comment_for_lines?(rule, lines)
7
+ lines.match?(/# erb_?lint:disable (?<rules>.*#{rule}).*/)
8
+ end
9
+
10
+ def self.disabled_rules(line)
11
+ line.match(/# erb_?lint:disable (?<rules>.*) %>/)&.named_captures&.fetch("rules")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,8 +5,14 @@ module ERBLint
5
5
  module SeverityLevels
6
6
  SEVERITY_NAMES = [:info, :refactor, :convention, :warning, :error, :fatal].freeze
7
7
 
8
- SEVERITY_CODE_TABLE = { I: :info, R: :refactor, C: :convention,
9
- W: :warning, E: :error, F: :fatal, }.freeze
8
+ SEVERITY_CODE_TABLE = {
9
+ I: :info,
10
+ R: :refactor,
11
+ C: :convention,
12
+ W: :warning,
13
+ E: :error,
14
+ F: :fatal,
15
+ }.freeze
10
16
 
11
17
  def severity_level_for_name(name)
12
18
  SEVERITY_NAMES.index(name || :error) + 1
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ERBLint
4
- VERSION = "0.1.3"
4
+ VERSION = "0.9.0"
5
5
  end
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.1.3
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Chan
8
- autorequire:
8
+ - Shopify Developers
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-16 00:00:00.000000000 Z
11
+ date: 2025-01-20 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: '0'
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: '0'
40
+ version: 2.0.1
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: parser
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +72,14 @@ dependencies:
86
72
  requirements:
87
73
  - - ">="
88
74
  - !ruby/object:Gem::Version
89
- version: '0'
75
+ version: '1'
90
76
  type: :runtime
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - ">="
95
81
  - !ruby/object:Gem::Version
96
- version: '0'
82
+ version: '1'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: smart_properties
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -152,15 +138,19 @@ dependencies:
152
138
  version: '0'
153
139
  description: ERB Linter tool.
154
140
  email:
155
- - justin.the.c@gmail.com
141
+ - ruby@shopify.com
156
142
  executables:
143
+ - erb_lint
157
144
  - erblint
158
145
  extensions: []
159
146
  extra_rdoc_files: []
160
147
  files:
148
+ - exe/erb_lint
161
149
  - exe/erblint
162
150
  - lib/erb_lint.rb
163
151
  - lib/erb_lint/all.rb
152
+ - lib/erb_lint/cache.rb
153
+ - lib/erb_lint/cached_offense.rb
164
154
  - lib/erb_lint/cli.rb
165
155
  - lib/erb_lint/corrector.rb
166
156
  - lib/erb_lint/file_loader.rb
@@ -169,12 +159,14 @@ files:
169
159
  - lib/erb_lint/linter_registry.rb
170
160
  - lib/erb_lint/linters/allowed_script_type.rb
171
161
  - lib/erb_lint/linters/closing_erb_tag_indent.rb
162
+ - lib/erb_lint/linters/comment_syntax.rb
172
163
  - lib/erb_lint/linters/deprecated_classes.rb
173
164
  - lib/erb_lint/linters/erb_safety.rb
174
165
  - lib/erb_lint/linters/extra_newline.rb
175
166
  - lib/erb_lint/linters/final_newline.rb
176
167
  - lib/erb_lint/linters/hard_coded_string.rb
177
168
  - lib/erb_lint/linters/no_javascript_tag_helper.rb
169
+ - lib/erb_lint/linters/no_unused_disable.rb
178
170
  - lib/erb_lint/linters/parser_errors.rb
179
171
  - lib/erb_lint/linters/partial_instance_variable.rb
180
172
  - lib/erb_lint/linters/require_input_autocomplete.rb
@@ -186,28 +178,30 @@ files:
186
178
  - lib/erb_lint/linters/space_around_erb_tag.rb
187
179
  - lib/erb_lint/linters/space_in_html_tag.rb
188
180
  - lib/erb_lint/linters/space_indentation.rb
181
+ - lib/erb_lint/linters/strict_locals.rb
189
182
  - lib/erb_lint/linters/trailing_whitespace.rb
190
183
  - lib/erb_lint/offense.rb
191
184
  - lib/erb_lint/processed_source.rb
192
185
  - lib/erb_lint/reporter.rb
193
186
  - lib/erb_lint/reporters/compact_reporter.rb
187
+ - lib/erb_lint/reporters/gitlab_reporter.rb
194
188
  - lib/erb_lint/reporters/json_reporter.rb
189
+ - lib/erb_lint/reporters/junit_reporter.rb
195
190
  - lib/erb_lint/reporters/multiline_reporter.rb
196
191
  - lib/erb_lint/runner.rb
197
192
  - lib/erb_lint/runner_config.rb
198
193
  - lib/erb_lint/runner_config_resolver.rb
199
194
  - lib/erb_lint/stats.rb
200
195
  - lib/erb_lint/utils/block_map.rb
201
- - lib/erb_lint/utils/offset_corrector.rb
196
+ - lib/erb_lint/utils/inline_configs.rb
202
197
  - lib/erb_lint/utils/ruby_to_erb.rb
203
198
  - lib/erb_lint/utils/severity_levels.rb
204
199
  - lib/erb_lint/version.rb
205
- homepage: https://github.com/Shopify/erb-lint
200
+ homepage: https://github.com/Shopify/erb_lint
206
201
  licenses:
207
202
  - MIT
208
203
  metadata:
209
204
  allowed_push_host: https://rubygems.org
210
- post_install_message:
211
205
  rdoc_options: []
212
206
  require_paths:
213
207
  - lib
@@ -215,15 +209,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
215
209
  requirements:
216
210
  - - ">="
217
211
  - !ruby/object:Gem::Version
218
- version: 2.5.0
212
+ version: 2.7.0
219
213
  required_rubygems_version: !ruby/object:Gem::Requirement
220
214
  requirements:
221
215
  - - ">="
222
216
  - !ruby/object:Gem::Version
223
217
  version: '0'
224
218
  requirements: []
225
- rubygems_version: 3.3.3
226
- signing_key:
219
+ rubygems_version: 3.6.2
227
220
  specification_version: 4
228
221
  summary: ERB lint tool
229
222
  test_files: []