erb_lint 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) 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/cache.rb +3 -3
  5. data/lib/erb_lint/cached_offense.rb +1 -1
  6. data/lib/erb_lint/cli.rb +24 -8
  7. data/lib/erb_lint/linter.rb +1 -1
  8. data/lib/erb_lint/linter_registry.rb +11 -1
  9. data/lib/erb_lint/linters/allowed_script_type.rb +8 -7
  10. data/lib/erb_lint/linters/closing_erb_tag_indent.rb +3 -3
  11. data/lib/erb_lint/linters/comment_syntax.rb +1 -1
  12. data/lib/erb_lint/linters/deprecated_classes.rb +2 -2
  13. data/lib/erb_lint/linters/erb_safety.rb +1 -1
  14. data/lib/erb_lint/linters/extra_newline.rb +1 -1
  15. data/lib/erb_lint/linters/final_newline.rb +4 -4
  16. data/lib/erb_lint/linters/hard_coded_string.rb +4 -2
  17. data/lib/erb_lint/linters/no_javascript_tag_helper.rb +6 -4
  18. data/lib/erb_lint/linters/no_unused_disable.rb +4 -2
  19. data/lib/erb_lint/linters/parser_errors.rb +1 -1
  20. data/lib/erb_lint/linters/partial_instance_variable.rb +2 -2
  21. data/lib/erb_lint/linters/require_input_autocomplete.rb +4 -4
  22. data/lib/erb_lint/linters/require_script_nonce.rb +2 -2
  23. data/lib/erb_lint/linters/right_trim.rb +1 -1
  24. data/lib/erb_lint/linters/rubocop.rb +4 -4
  25. data/lib/erb_lint/linters/rubocop_text.rb +1 -1
  26. data/lib/erb_lint/linters/self_closing_tag.rb +22 -5
  27. data/lib/erb_lint/linters/space_around_erb_tag.rb +8 -8
  28. data/lib/erb_lint/linters/space_in_html_tag.rb +7 -7
  29. data/lib/erb_lint/linters/space_indentation.rb +1 -1
  30. data/lib/erb_lint/linters/trailing_whitespace.rb +1 -1
  31. data/lib/erb_lint/offense.rb +3 -3
  32. data/lib/erb_lint/processed_source.rb +1 -1
  33. data/lib/erb_lint/reporter.rb +3 -2
  34. data/lib/erb_lint/reporters/compact_reporter.rb +3 -2
  35. data/lib/erb_lint/reporters/gitlab_reporter.rb +55 -0
  36. data/lib/erb_lint/reporters/junit_reporter.rb +41 -90
  37. data/lib/erb_lint/reporters/multiline_reporter.rb +6 -1
  38. data/lib/erb_lint/runner.rb +1 -1
  39. data/lib/erb_lint/runner_config_resolver.rb +1 -1
  40. data/lib/erb_lint/utils/block_map.rb +4 -4
  41. data/lib/erb_lint/utils/offset_corrector.rb +2 -5
  42. data/lib/erb_lint/utils/severity_levels.rb +8 -2
  43. data/lib/erb_lint/version.rb +1 -1
  44. metadata +12 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98ba7a87f348e584502a9e4810f9311329c04aeddf34af0b05a37702648b495e
4
- data.tar.gz: 8728892a4c09fcbdbddb60316b911bf73ce099cc04e9ac10534b76f8aa6708a5
3
+ metadata.gz: ed317d0bcb868320c088c8788e5b14ba9f8224aab3e6ae2e4952e34df8fdefc4
4
+ data.tar.gz: 21fe3cfccf4d30225d11fa2f397186b5274bbb8d1fe6ff5bf593ac225bb327a9
5
5
  SHA512:
6
- metadata.gz: 8d01f3c07ddebb9482ee744c69df6e799b4c0cb06bd24ffd7939f3d86e612a4f1bb2d5b4040c8505d7c8f8e9cceaecaabcca7dc03cab6ea5f23e73f10e098345
7
- data.tar.gz: '080398f6522352b669bf21ea1fbdd8850b7b6b8dcef60493d8349fbfeb98eceeefc77c15442cad339612e83c5056d5498a286046c3a3749a73428661c962b695'
6
+ metadata.gz: d281ca485b9763dc2d7e3b3297b429c2fa08f1f043e557b7a9ad9ab65c5e0e422d5ccabbd66f40e3da43088bc1b580dd9dab5213dca39a894a7b0da82c0e113c
7
+ data.tar.gz: 9907b4b4089693f5787c96b0e5cef7b1c9bd49b6831d6e6c42757fb69911a0905b395f468fab7c0339d3b0e166b6962d1a4db772476f669d659f6380e88a90c4
data/exe/erb_lint ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ lib_path = File.expand_path("#{__dir__}/../lib")
5
+ $LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path)
6
+
7
+ require "erb_lint/cli"
8
+
9
+ cli = ERBLint::CLI.new
10
+ exit(cli.run)
data/exe/erblint CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.unshift("#{__dir__}/../lib")
4
+ lib_path = File.expand_path("#{__dir__}/../lib")
5
+ $LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path)
5
6
 
6
- require "erb_lint/cli"
7
+ require "rainbow"
7
8
 
8
- cli = ERBLint::CLI.new
9
- exit(cli.run)
9
+ warn(Rainbow("Calling `erblint` is deprecated, please call the renamed executable `erb_lint` instead.").yellow)
10
+ exec(File.join(__dir__, "erb_lint"), *ARGV)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ERBLint
4
4
  class Cache
5
- CACHE_DIRECTORY = ".erb-lint-cache"
5
+ CACHE_DIRECTORY = ".erb_lint_cache"
6
6
 
7
7
  def initialize(config, cache_dir = nil)
8
8
  @config = config
@@ -16,7 +16,7 @@ module ERBLint
16
16
  file_checksum = checksum(filename, file_content)
17
17
  begin
18
18
  cache_file_contents_as_offenses = JSON.parse(
19
- File.read(File.join(@cache_dir, file_checksum))
19
+ File.read(File.join(@cache_dir, file_checksum)),
20
20
  ).map do |offense_hash|
21
21
  ERBLint::CachedOffense.new(offense_hash)
22
22
  end
@@ -76,7 +76,7 @@ module ERBLint
76
76
  mode = File.stat(filename).mode
77
77
 
78
78
  digester.update(
79
- "#{mode}#{config.to_hash}#{ERBLint::VERSION}#{file_content}"
79
+ "#{mode}#{config.to_hash}#{ERBLint::VERSION}#{file_content}",
80
80
  )
81
81
  digester.hexdigest
82
82
  rescue Errno::ENOENT
@@ -38,7 +38,7 @@ module ERBLint
38
38
  last_line: offense.last_line,
39
39
  last_column: offense.last_column,
40
40
  length: offense.length,
41
- }
41
+ },
42
42
  )
43
43
  end
44
44
 
data/lib/erb_lint/cli.rb CHANGED
@@ -13,7 +13,8 @@ module ERBLint
13
13
  class CLI
14
14
  include Utils::SeverityLevels
15
15
 
16
- DEFAULT_CONFIG_FILENAME = ".erb-lint.yml"
16
+ DEPRECATED_CONFIG_FILENAME = ".erb-lint.yml"
17
+ DEFAULT_CONFIG_FILENAME = ".erb_lint.yml"
17
18
  DEFAULT_LINT_ALL_GLOB = "**/*.html{+*,}.erb"
18
19
 
19
20
  class ExitWithFailure < RuntimeError; end
@@ -74,7 +75,7 @@ module ERBLint
74
75
  @stats.linters = enabled_linter_classes.size
75
76
  @stats.autocorrectable_linters = enabled_linter_classes.count(&:support_autocorrect?)
76
77
 
77
- reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?)
78
+ reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?, @options[:show_linter_names])
78
79
  reporter.preview
79
80
 
80
81
  runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_configs])
@@ -87,7 +88,7 @@ module ERBLint
87
88
  rescue => e
88
89
  @stats.exceptions += 1
89
90
  puts "Exception occurred when processing: #{relative_filename(filename)}"
90
- puts "If this file cannot be processed by erb-lint, "\
91
+ puts "If this file cannot be processed by erb_lint, " \
91
92
  "you can exclude it in your configuration file."
92
93
  puts e.message
93
94
  puts Rainbow(e.backtrace.join("\n")).red
@@ -215,6 +216,13 @@ module ERBLint
215
216
  if File.exist?(config_filename)
216
217
  config = RunnerConfig.new(file_loader.yaml(config_filename), file_loader)
217
218
  @config = RunnerConfig.default_for(config)
219
+ elsif File.exist?(DEPRECATED_CONFIG_FILENAME)
220
+ deprecation_message = "The config file has been renamed to `#{DEFAULT_CONFIG_FILENAME}` and " \
221
+ "`#{DEPRECATED_CONFIG_FILENAME}` is deprecated. " \
222
+ "Please rename your config file to `#{DEFAULT_CONFIG_FILENAME}`."
223
+ warn(Rainbow(deprecation_message).yellow)
224
+ config = RunnerConfig.new(file_loader.yaml(DEPRECATED_CONFIG_FILENAME), file_loader)
225
+ @config = RunnerConfig.default_for(config)
218
226
  else
219
227
  warn(Rainbow("#{config_filename} not found: using default config").yellow)
220
228
  @config = RunnerConfig.default
@@ -303,7 +311,7 @@ module ERBLint
303
311
  ERBLint::LinterRegistry.linters.map do |klass|
304
312
  linters[klass.simple_name] = { "enabled" => enabled_linter_classes.include?(klass) }
305
313
  end
306
- end
314
+ end,
307
315
  )
308
316
  end
309
317
 
@@ -348,8 +356,12 @@ module ERBLint
348
356
  @options[:clear_cache] = config
349
357
  end
350
358
 
351
- opts.on("--enable-linters LINTER[,LINTER,...]", Array,
352
- "Only use specified linter", "Known linters are: #{known_linter_names.join(", ")}") do |linters|
359
+ opts.on(
360
+ "--enable-linters LINTER[,LINTER,...]",
361
+ Array,
362
+ "Only use specified linter",
363
+ "Known linters are: #{known_linter_names.join(", ")}",
364
+ ) do |linters|
353
365
  linters.each do |linter|
354
366
  unless known_linter_names.include?(linter)
355
367
  failure!("#{linter}: not a valid linter name (#{known_linter_names.join(", ")})")
@@ -371,6 +383,10 @@ module ERBLint
371
383
  @options[:autocorrect] = config
372
384
  end
373
385
 
386
+ opts.on("--show-linter-names", "Show linter names") do
387
+ @options[:show_linter_names] = true
388
+ end
389
+
374
390
  opts.on("--allow-no-files", "When no matching files found, exit successfully (default: false)") do |config|
375
391
  @options[:allow_no_files] = config
376
392
  end
@@ -382,7 +398,7 @@ module ERBLint
382
398
  opts.on(
383
399
  "-sFILE",
384
400
  "--stdin FILE",
385
- "Pipe source from STDIN. Takes the path to be used to check which rules to apply."
401
+ "Pipe source from STDIN. Takes the path to be used to check which rules to apply.",
386
402
  ) do |file|
387
403
  @options[:stdin] = [file]
388
404
  end
@@ -398,7 +414,7 @@ module ERBLint
398
414
  end
399
415
 
400
416
  def format_options_help
401
- "Report offenses in the given format: "\
417
+ "Report offenses in the given format: " \
402
418
  "(#{Reporter.available_formats.join(", ")}) (default: multiline)"
403
419
  end
404
420
 
@@ -38,7 +38,7 @@ module ERBLint
38
38
  def initialize(file_loader, config)
39
39
  @file_loader = file_loader
40
40
  @config = config
41
- raise ArgumentError, "expect `config` to be #{self.class.config_schema} instance, "\
41
+ raise ArgumentError, "expect `config` to be #{self.class.config_schema} instance, " \
42
42
  "not #{config.class}" unless config.is_a?(self.class.config_schema)
43
43
  @offenses = []
44
44
  end
@@ -3,7 +3,8 @@
3
3
  module ERBLint
4
4
  # Stores all linters available to the application.
5
5
  module LinterRegistry
6
- CUSTOM_LINTERS_DIR = ".erb-linters"
6
+ DEPRECATED_CUSTOM_LINTERS_DIR = ".erb-linters"
7
+ CUSTOM_LINTERS_DIR = ".erb_linters"
7
8
  @loaded_linters = []
8
9
 
9
10
  class << self
@@ -28,6 +29,15 @@ module ERBLint
28
29
 
29
30
  def load_custom_linters(directory = CUSTOM_LINTERS_DIR)
30
31
  ruby_files = Dir.glob(File.expand_path(File.join(directory, "**", "*.rb")))
32
+
33
+ deprecated_ruby_files = Dir.glob(File.expand_path(File.join(DEPRECATED_CUSTOM_LINTERS_DIR, "**", "*.rb")))
34
+ if deprecated_ruby_files.any?
35
+ deprecation_message = "The '#{DEPRECATED_CUSTOM_LINTERS_DIR}' directory for custom linters is deprecated. " \
36
+ "Please rename it to '#{CUSTOM_LINTERS_DIR}'"
37
+ warn(Rainbow(deprecation_message).yellow)
38
+ ruby_files.concat(deprecated_ruby_files)
39
+ end
40
+
31
41
  ruby_files.each { |file| require file }
32
42
  end
33
43
  end
@@ -12,7 +12,8 @@ module ERBLint
12
12
  include LinterRegistry
13
13
 
14
14
  class ConfigSchema < LinterConfig
15
- property :allowed_types, accepts: array_of?(String),
15
+ property :allowed_types,
16
+ accepts: array_of?(String),
16
17
  default: -> { ["text/javascript"] }
17
18
  property :allow_blank, accepts: [true, false], default: true, reader: :allow_blank?
18
19
  property :disallow_inline_scripts, accepts: [true, false], default: false, reader: :disallow_inline_scripts?
@@ -30,8 +31,8 @@ module ERBLint
30
31
  name_node = tag_node.to_a[1]
31
32
  add_offense(
32
33
  name_node.loc,
33
- "Avoid using inline `<script>` tags altogether. "\
34
- "Instead, move javascript code into a static file."
34
+ "Avoid using inline `<script>` tags altogether. " \
35
+ "Instead, move javascript code into a static file.",
35
36
  )
36
37
  next
37
38
  end
@@ -44,14 +45,14 @@ module ERBLint
44
45
  add_offense(
45
46
  name_node.loc,
46
47
  "Missing a `type=\"text/javascript\"` attribute to `<script>` tag.",
47
- [type_attribute]
48
+ [type_attribute],
48
49
  )
49
50
  elsif type_present && !@config.allowed_types.include?(type_attribute.value)
50
51
  add_offense(
51
52
  type_attribute.loc,
52
- "Avoid using #{type_attribute.value.inspect} as type for `<script>` tag. "\
53
- "Must be one of: #{@config.allowed_types.join(", ")}"\
54
- "#{" (or no type attribute)" if @config.allow_blank?}."
53
+ "Avoid using #{type_attribute.value.inspect} as type for `<script>` tag. " \
54
+ "Must be one of: #{@config.allowed_types.join(", ")}" \
55
+ "#{" (or no type attribute)" if @config.allow_blank?}.",
55
56
  )
56
57
  end
57
58
  end
@@ -25,13 +25,13 @@ module ERBLint
25
25
  add_offense(
26
26
  code_node.loc.end.adjust(begin_pos: -end_spaces.size),
27
27
  "Remove newline before `%>` to match start of tag.",
28
- " "
28
+ " ",
29
29
  )
30
30
  elsif start_with_newline && !end_with_newline
31
31
  add_offense(
32
32
  code_node.loc.end.adjust(begin_pos: -end_spaces.size),
33
33
  "Insert newline before `%>` to match start of tag.",
34
- "\n"
34
+ "\n",
35
35
  )
36
36
  elsif start_with_newline && end_with_newline
37
37
  current_indent = end_spaces.split("\n", -1).last
@@ -39,7 +39,7 @@ module ERBLint
39
39
  add_offense(
40
40
  code_node.loc.end.adjust(begin_pos: -current_indent.size),
41
41
  "Indent `%>` on column #{erb_node.loc.column} to match start of tag.",
42
- " " * erb_node.loc.column
42
+ " " * erb_node.loc.column,
43
43
  )
44
44
  end
45
45
  end
@@ -31,7 +31,7 @@ module ERBLint
31
31
 
32
32
  add_offense(
33
33
  source_range,
34
- <<~EOF.chomp
34
+ <<~EOF.chomp,
35
35
  Bad ERB comment syntax. Should be #{correct_erb_tag} without a space between.
36
36
  Leaving a space between ERB tags and the Ruby comment character can cause parser errors.
37
37
  EOF
@@ -49,7 +49,7 @@ module ERBLint
49
49
  process_nested_offenses(
50
50
  source: sub_source,
51
51
  offset: offset + content_node.loc.begin_pos,
52
- parent_source: parent_source
52
+ parent_source: parent_source,
53
53
  )
54
54
  end
55
55
  end
@@ -99,7 +99,7 @@ module ERBLint
99
99
 
100
100
  add_offense(
101
101
  range,
102
- format(message, class_name, violated_rule[:class_expr], suggestion)
102
+ format(message, class_name, violated_rule[:class_expr], suggestion),
103
103
  )
104
104
  end
105
105
  end
@@ -26,7 +26,7 @@ module ERBLint
26
26
  tester.errors.each do |error|
27
27
  add_offense(
28
28
  error.location,
29
- error.message
29
+ error.message,
30
30
  )
31
31
  end
32
32
  end
@@ -15,7 +15,7 @@ module ERBLint
15
15
  add_offense(
16
16
  processed_source
17
17
  .to_source_range((matches.begin(index) + 2)...matches.end(index)),
18
- "Extra blank line detected."
18
+ "Extra blank line detected.",
19
19
  )
20
20
  end
21
21
  end
@@ -29,22 +29,22 @@ module ERBLint
29
29
  add_offense(
30
30
  processed_source.to_source_range(file_content.size...file_content.size),
31
31
  "Missing a trailing newline at the end of the file.",
32
- :insert
32
+ :insert,
33
33
  )
34
34
  else
35
35
  add_offense(
36
36
  processed_source.to_source_range(
37
- (file_content.size - final_newline.size + 1)...file_content.size
37
+ (file_content.size - final_newline.size + 1)...file_content.size,
38
38
  ),
39
39
  "Remove multiple trailing newline at the end of the file.",
40
- :remove
40
+ :remove,
41
41
  )
42
42
  end
43
43
  elsif !@new_lines_should_be_present && !final_newline.empty?
44
44
  add_offense(
45
45
  processed_source.to_source_range(match.begin(0)...match.end(0)),
46
46
  "Remove #{final_newline.size} trailing newline at the end of the file.",
47
- :remove
47
+ :remove,
48
48
  )
49
49
  end
50
50
  end
@@ -41,6 +41,8 @@ module ERBLint
41
41
  "&emsp;",
42
42
  "&thinsp;",
43
43
  "&times;",
44
+ "&laquo;",
45
+ "&raquo;",
44
46
  ])
45
47
 
46
48
  class ConfigSchema < LinterConfig
@@ -67,7 +69,7 @@ module ERBLint
67
69
 
68
70
  add_offense(
69
71
  source_range,
70
- message(source_range.source)
72
+ message(source_range.source),
71
73
  )
72
74
  end
73
75
  end
@@ -84,7 +86,7 @@ module ERBLint
84
86
  def autocorrect(processed_source, offense)
85
87
  string = offense.source_range.source
86
88
  return unless (klass = load_corrector)
87
- return unless string.strip.length > 1
89
+ return if string.strip.length <= 1
88
90
 
89
91
  node = ::RuboCop::AST::StrNode.new(:str, [string])
90
92
  corrector = klass.new(node, processed_source.filename, corrector_i18n_load_path, offense.source_range)
@@ -38,9 +38,9 @@ module ERBLint
38
38
 
39
39
  add_offense(
40
40
  erb_node.loc,
41
- "Avoid using 'javascript_tag do' as it confuses tests "\
41
+ "Avoid using 'javascript_tag do' as it confuses tests " \
42
42
  "that validate html, use inline <script> instead",
43
- [erb_node, send_node]
43
+ [erb_node, send_node],
44
44
  )
45
45
  end
46
46
  end
@@ -82,8 +82,10 @@ module ERBLint
82
82
  corrector.replace(end_node.loc, end_content)
83
83
  elsif script_content
84
84
  script_content = "\n//<![CDATA[\n#{script_content}\n//]]>\n" if @config.correction_style == :cdata
85
- corrector.replace(begin_node.loc,
86
- "<script#{arguments}>#{script_content}</script>")
85
+ corrector.replace(
86
+ begin_node.loc,
87
+ "<script#{arguments}>#{script_content}</script>",
88
+ )
87
89
  end
88
90
  rescue Utils::RubyToERB::Error, Utils::BlockMap::ParseError
89
91
  nil
@@ -35,8 +35,10 @@ module ERBLint
35
35
 
36
36
  disabled_rules_and_line_number.each do |rule, line_numbers|
37
37
  line_numbers.each do |line_number|
38
- add_offense(processed_source.source_buffer.line_range(line_number),
39
- "Unused erblint:disable comment for #{rule}")
38
+ add_offense(
39
+ processed_source.source_buffer.line_range(line_number),
40
+ "Unused erblint:disable comment for #{rule}",
41
+ )
40
42
  end
41
43
  end
42
44
  end
@@ -9,7 +9,7 @@ module ERBLint
9
9
  processed_source.parser.parser_errors.each do |error|
10
10
  add_offense(
11
11
  error.loc,
12
- "#{error.message} (at #{error.loc.source})"
12
+ "#{error.message} (at #{error.loc.source})",
13
13
  )
14
14
  end
15
15
  end
@@ -13,9 +13,9 @@ module ERBLint
13
13
 
14
14
  add_offense(
15
15
  processed_source.to_source_range(
16
- processed_source.file_content =~ instance_variable_regex..processed_source.file_content.size
16
+ processed_source.file_content =~ instance_variable_regex..processed_source.file_content.size,
17
17
  ),
18
- "Instance variable detected in partial."
18
+ "Instance variable detected in partial.",
19
19
  )
20
20
  end
21
21
  end
@@ -62,9 +62,9 @@ module ERBLint
62
62
 
63
63
  add_offense(
64
64
  tag_node.to_a[1].loc,
65
- "Input tag is missing an autocomplete attribute. If no "\
65
+ "Input tag is missing an autocomplete attribute. If no " \
66
66
  "autocomplete behaviour is desired, use the value `off` or `nope`.",
67
- [autocomplete_attribute]
67
+ [autocomplete_attribute],
68
68
  )
69
69
  end
70
70
  end
@@ -96,9 +96,9 @@ module ERBLint
96
96
 
97
97
  add_offense(
98
98
  erb_node.loc,
99
- "Input field helper is missing an autocomplete attribute. If no "\
99
+ "Input field helper is missing an autocomplete attribute. If no " \
100
100
  "autocomplete behaviour is desired, use the value `off` or `nope`.",
101
- [erb_node, send_node]
101
+ [erb_node, send_node],
102
102
  )
103
103
  end
104
104
  end
@@ -29,7 +29,7 @@ module ERBLint
29
29
  add_offense(
30
30
  tag_node.to_a[1].loc,
31
31
  "Missing a nonce attribute. Use request.content_security_policy_nonce",
32
- [nonce_attribute]
32
+ [nonce_attribute],
33
33
  )
34
34
  end
35
35
  end
@@ -67,7 +67,7 @@ module ERBLint
67
67
  add_offense(
68
68
  erb_node.loc,
69
69
  "Missing a nonce attribute. Use nonce: true",
70
- [erb_node, send_node]
70
+ [erb_node, send_node],
71
71
  )
72
72
  end
73
73
  end
@@ -19,7 +19,7 @@ module ERBLint
19
19
 
20
20
  add_offense(
21
21
  trim_node.loc,
22
- "Prefer #{@config.enforced_style}%> instead of #{trim_node.loc.source}%> for trimming on the right."
22
+ "Prefer #{@config.enforced_style}%> instead of #{trim_node.loc.source}%> for trimming on the right.",
23
23
  )
24
24
  end
25
25
  end
@@ -134,7 +134,7 @@ module ERBLint
134
134
  source = ::RuboCop::ProcessedSource.new(
135
135
  content,
136
136
  @rubocop_config.target_ruby_version,
137
- filename
137
+ filename,
138
138
  )
139
139
  if ::RuboCop::Version::STRING.to_f >= 1.38
140
140
  registry = RuboCop::Cop::Registry.global
@@ -146,15 +146,15 @@ module ERBLint
146
146
 
147
147
  def cop_classes
148
148
  if @only_cops.present?
149
- selected_cops = ::RuboCop::Cop::Cop.all.select { |cop| cop.match?(@only_cops) }
149
+ selected_cops = ::RuboCop::Cop::Registry.all.select { |cop| cop.match?(@only_cops) }
150
150
  ::RuboCop::Cop::Registry.new(selected_cops)
151
151
  else
152
- ::RuboCop::Cop::Registry.new(::RuboCop::Cop::Cop.all)
152
+ ::RuboCop::Cop::Registry.new(::RuboCop::Cop::Registry.all)
153
153
  end
154
154
  end
155
155
 
156
156
  def build_team
157
- ::RuboCop::Cop::Team.new(
157
+ ::RuboCop::Cop::Team.mobilize(
158
158
  cop_classes,
159
159
  @rubocop_config,
160
160
  extra_details: true,
@@ -29,7 +29,7 @@ module ERBLint
29
29
  end
30
30
 
31
31
  def cop_classes
32
- selected_cops = ::RuboCop::Cop::Cop.all.select { |cop| cop.match?(@only_cops) }
32
+ selected_cops = ::RuboCop::Cop::Registry.all.select { |cop| cop.match?(@only_cops) }
33
33
 
34
34
  ::RuboCop::Cop::Registry.new(selected_cops)
35
35
  end
@@ -11,8 +11,25 @@ module ERBLint
11
11
  end
12
12
  self.config_schema = ConfigSchema
13
13
 
14
- SELF_CLOSING_TAGS = ["area", "base", "br", "col", "command", "embed", "hr", "input", "keygen", "link",
15
- "menuitem", "meta", "param", "source", "track", "wbr", "img",]
14
+ SELF_CLOSING_TAGS = [
15
+ "area",
16
+ "base",
17
+ "br",
18
+ "col",
19
+ "command",
20
+ "embed",
21
+ "hr",
22
+ "input",
23
+ "keygen",
24
+ "link",
25
+ "menuitem",
26
+ "meta",
27
+ "param",
28
+ "source",
29
+ "track",
30
+ "wbr",
31
+ "img",
32
+ ]
16
33
 
17
34
  def run(processed_source)
18
35
  processed_source.ast.descendants(:tag).each do |tag_node|
@@ -24,7 +41,7 @@ module ERBLint
24
41
  add_offense(
25
42
  start_solidus.loc,
26
43
  "Tag `#{tag.name}` is a void element, it must not start with `</`.",
27
- ""
44
+ "",
28
45
  )
29
46
  end
30
47
 
@@ -32,7 +49,7 @@ module ERBLint
32
49
  add_offense(
33
50
  tag_node.loc.end.offset(-1),
34
51
  "Tag `#{tag.name}` is self-closing, it must end with `/>`.",
35
- "/"
52
+ "/",
36
53
  )
37
54
  end
38
55
 
@@ -42,7 +59,7 @@ module ERBLint
42
59
  add_offense(
43
60
  end_solidus.loc,
44
61
  "Tag `#{tag.name}` is a void element, it must end with `>` and not `/>`.",
45
- ""
62
+ "",
46
63
  )
47
64
  end
48
65
  end
@@ -23,17 +23,17 @@ module ERBLint
23
23
  if start_spaces.size != 1 && !start_spaces.include?("\n")
24
24
  add_offense(
25
25
  code_node.loc.resize(start_spaces.size),
26
- "Use 1 space after `<%#{indicator}#{ltrim&.loc&.source}` "\
26
+ "Use 1 space after `<%#{indicator}#{ltrim&.loc&.source}` " \
27
27
  "instead of #{start_spaces.size} space#{"s" if start_spaces.size > 1}.",
28
- " "
28
+ " ",
29
29
  )
30
30
  elsif start_spaces.count("\n") > 1
31
31
  lines = start_spaces.split("\n", -1)
32
32
  add_offense(
33
33
  code_node.loc.resize(start_spaces.size),
34
- "Use 1 newline after `<%#{indicator&.loc&.source}#{ltrim&.loc&.source}` "\
34
+ "Use 1 newline after `<%#{indicator&.loc&.source}#{ltrim&.loc&.source}` " \
35
35
  "instead of #{start_spaces.count("\n")}.",
36
- "#{lines.first}\n#{lines.last}"
36
+ "#{lines.first}\n#{lines.last}",
37
37
  )
38
38
  end
39
39
 
@@ -41,17 +41,17 @@ module ERBLint
41
41
  if end_spaces.size != 1 && !end_spaces.include?("\n")
42
42
  add_offense(
43
43
  code_node.loc.end.adjust(begin_pos: -end_spaces.size),
44
- "Use 1 space before `#{rtrim&.loc&.source}%>` "\
44
+ "Use 1 space before `#{rtrim&.loc&.source}%>` " \
45
45
  "instead of #{end_spaces.size} space#{"s" if start_spaces.size > 1}.",
46
- " "
46
+ " ",
47
47
  )
48
48
  elsif end_spaces.count("\n") > 1
49
49
  lines = end_spaces.split("\n", -1)
50
50
  add_offense(
51
51
  code_node.loc.end.adjust(begin_pos: -end_spaces.size),
52
- "Use 1 newline before `#{rtrim&.loc&.source}%>` "\
52
+ "Use 1 newline before `#{rtrim&.loc&.source}%>` " \
53
53
  "instead of #{end_spaces.count("\n")}.",
54
- "#{lines.first}\n#{lines.last}"
54
+ "#{lines.first}\n#{lines.last}",
55
55
  )
56
56
  end
57
57
  end
@@ -50,7 +50,7 @@ module ERBLint
50
50
  add_offense(
51
51
  processed_source.to_source_range(range),
52
52
  "Extra space detected where there should be no space.",
53
- ""
53
+ "",
54
54
  )
55
55
  end
56
56
 
@@ -69,24 +69,24 @@ module ERBLint
69
69
  if non_space && !non_space.captures.empty?
70
70
  add_offense(
71
71
  processed_source.to_source_range(range),
72
- "Non-whitespace character(s) detected: "\
72
+ "Non-whitespace character(s) detected: " \
73
73
  "#{non_space.captures.map(&:inspect).join(", ")}.",
74
- expected
74
+ expected,
75
75
  )
76
76
  elsif newlines && accept_newline
77
77
  if expected != chars
78
78
  add_offense(
79
79
  processed_source.to_source_range(range),
80
- "#{chars.empty? ? "No" : "Extra"} space detected where there should be "\
80
+ "#{chars.empty? ? "No" : "Extra"} space detected where there should be " \
81
81
  "a single space or a single line break.",
82
- expected
82
+ expected,
83
83
  )
84
84
  end
85
85
  else
86
86
  add_offense(
87
87
  processed_source.to_source_range(range),
88
88
  "#{chars.empty? ? "No" : "Extra"} space detected where there should be a single space.",
89
- expected
89
+ expected,
90
90
  )
91
91
  end
92
92
  end
@@ -103,7 +103,7 @@ module ERBLint
103
103
 
104
104
  single_space_or_newline(
105
105
  processed_source,
106
- attribute.loc.end_pos...next_attribute.loc.begin_pos
106
+ attribute.loc.end_pos...next_attribute.loc.begin_pos,
107
107
  )
108
108
  end
109
109
  end
@@ -23,7 +23,7 @@ module ERBLint
23
23
  add_offense(
24
24
  processed_source.to_source_range(document_pos...(document_pos + spaces.length)),
25
25
  "Indent with spaces instead of tabs.",
26
- spaces.gsub("\t", " " * @config.tab_width)
26
+ spaces.gsub("\t", " " * @config.tab_width),
27
27
  )
28
28
  end
29
29
 
@@ -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
@@ -23,9 +23,9 @@ module ERBLint
23
23
  end
24
24
 
25
25
  def inspect
26
- "#<#{self.class.name} linter=#{linter.class.name} "\
27
- "source_range=#{source_range.begin_pos}...#{source_range.end_pos} "\
28
- "message=#{message}> "\
26
+ "#<#{self.class.name} linter=#{linter.class.name} " \
27
+ "source_range=#{source_range.begin_pos}...#{source_range.end_pos} " \
28
+ "message=#{message}> " \
29
29
  "severity=#{severity}"
30
30
  end
31
31
 
@@ -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
@@ -1,111 +1,62 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rexml/document"
4
- require "rexml/formatters/pretty"
5
-
6
3
  module ERBLint
7
4
  module Reporters
8
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
+
9
22
  def preview; end
10
23
 
11
24
  def show
12
- xml = create_junit_xml
13
- formatted_xml_string = StringIO.new
14
- REXML::Formatters::Pretty.new.write(xml, formatted_xml_string)
15
- puts formatted_xml_string.string
16
- end
17
-
18
- private
19
-
20
- CONTEXT = {
21
- prologue_quote: :quote,
22
- attribute_quote: :quote,
23
- }
24
-
25
- def create_junit_xml
26
- # create prologue
27
- xml = REXML::Document.new(nil, CONTEXT)
28
- xml << REXML::XMLDecl.new("1.0", "UTF-8")
29
-
30
- xml.add_element(create_testsuite_element)
25
+ puts %(<?xml version="1.0" encoding="UTF-8"?>)
26
+ puts %(<testsuite name="erblint" tests="#{@stats.processed_files.size}" failures="#{@stats.found}">)
31
27
 
32
- xml
33
- end
34
-
35
- def create_testsuite_element
36
- tests = stats.processed_files.size
37
- failures = stats.found
38
- testsuite_element = REXML::Element.new("testsuite", nil, CONTEXT)
39
- testsuite_element.add_attribute("name", "erblint")
40
- testsuite_element.add_attribute("tests", tests.to_s)
41
- testsuite_element.add_attribute("failures", failures.to_s)
42
-
43
- testsuite_element.add_element(create_properties)
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>)
44
33
 
45
34
  processed_files.each do |filename, offenses|
35
+ filename_escaped = xml_escape(filename)
46
36
  if offenses.empty?
47
- testcase_element = REXML::Element.new("testcase", nil, CONTEXT)
48
- testcase_element.add_attribute("name", filename.to_s)
49
- testcase_element.add_attribute("file", filename.to_s)
50
-
51
- testsuite_element.add_element(testcase_element)
52
- end
53
-
54
- offenses.each do |offense|
55
- testsuite_element.add_element(create_testcase(filename, offense))
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
56
50
  end
57
51
  end
58
52
 
59
- testsuite_element
53
+ puts %(</testsuite>)
60
54
  end
61
55
 
62
- def create_properties
63
- properties_element = REXML::Element.new("properties", nil, CONTEXT)
64
-
65
- [
66
- ["erb_lint_version", ERBLint::VERSION],
67
- ["ruby_engine", RUBY_ENGINE],
68
- ["ruby_version", RUBY_VERSION],
69
- ["ruby_patchlevel", RUBY_PATCHLEVEL.to_s],
70
- ["ruby_platform", RUBY_PLATFORM],
71
- ].each do |property_attribute|
72
- properties_element.add_element(create_property(*property_attribute))
73
- end
74
-
75
- properties_element
76
- end
77
-
78
- def create_property(name, value)
79
- property_element = REXML::Element.new("property")
80
- property_element.add_attribute("name", name)
81
- property_element.add_attribute("value", value)
82
-
83
- property_element
84
- end
85
-
86
- def create_testcase(filename, offense)
87
- testcase_element = REXML::Element.new("testcase", nil, CONTEXT)
88
- testcase_element.add_attribute("name", filename.to_s)
89
- testcase_element.add_attribute("file", filename.to_s)
90
- testcase_element.add_attribute("lineno", offense.line_number.to_s)
91
-
92
- testcase_element.add_element(create_failure(filename, offense))
93
-
94
- testcase_element
95
- end
96
-
97
- def create_failure(filename, offense)
98
- message = offense.message
99
- type = offense.simple_name
100
-
101
- failure_element = REXML::Element.new("failure", nil, CONTEXT)
102
- failure_element.add_attribute("message", "#{type}: #{message}")
103
- failure_element.add_attribute("type", type.to_s)
104
-
105
- cdata_element = REXML::CData.new("#{type}: #{message} at #{filename}:#{offense.line_number}:#{offense.column}")
106
- failure_element.add_text(cdata_element)
56
+ private
107
57
 
108
- failure_element
58
+ def xml_escape(string)
59
+ string.gsub(Regexp.union(ESCAPE_MAP.keys), ESCAPE_MAP)
109
60
  end
110
61
  end
111
62
  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
@@ -57,7 +57,7 @@ module ERBLint
57
57
  if no_unused_disable_enabled? && enable_inline_configs?
58
58
  @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(
59
59
  @file_loader,
60
- @config.for_linter(ERBLint::Linters::NoUnusedDisable)
60
+ @config.for_linter(ERBLint::Linters::NoUnusedDisable),
61
61
  )
62
62
  @no_unused_disable.run(processed_source, @offenses)
63
63
  @offenses.concat(@no_unused_disable.offenses)
@@ -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
 
@@ -42,15 +42,12 @@ module ERBLint
42
42
  range = to_range(node_or_range)
43
43
 
44
44
  @processed_source.to_source_range(
45
- bound(@offset + range.begin_pos)..bound(@offset + (range.end_pos - 1))
45
+ bound(@offset + range.begin_pos)..bound(@offset + (range.end_pos - 1)),
46
46
  )
47
47
  end
48
48
 
49
49
  def bound(pos)
50
- [
51
- [pos, @bound_range.min].max,
52
- @bound_range.max,
53
- ].min
50
+ pos.clamp(@bound_range.min, @bound_range.max)
54
51
  end
55
52
 
56
53
  private
@@ -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.5.0"
4
+ VERSION = "0.7.0"
5
5
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erb_lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Chan
8
8
  - Shopify Developers
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-08-25 00:00:00.000000000 Z
12
+ date: 2024-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -73,14 +73,14 @@ dependencies:
73
73
  requirements:
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: '1'
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: '0'
83
+ version: '1'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: smart_properties
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -141,10 +141,12 @@ description: ERB Linter tool.
141
141
  email:
142
142
  - ruby@shopify.com
143
143
  executables:
144
+ - erb_lint
144
145
  - erblint
145
146
  extensions: []
146
147
  extra_rdoc_files: []
147
148
  files:
149
+ - exe/erb_lint
148
150
  - exe/erblint
149
151
  - lib/erb_lint.rb
150
152
  - lib/erb_lint/all.rb
@@ -182,6 +184,7 @@ files:
182
184
  - lib/erb_lint/processed_source.rb
183
185
  - lib/erb_lint/reporter.rb
184
186
  - lib/erb_lint/reporters/compact_reporter.rb
187
+ - lib/erb_lint/reporters/gitlab_reporter.rb
185
188
  - lib/erb_lint/reporters/json_reporter.rb
186
189
  - lib/erb_lint/reporters/junit_reporter.rb
187
190
  - lib/erb_lint/reporters/multiline_reporter.rb
@@ -195,12 +198,12 @@ files:
195
198
  - lib/erb_lint/utils/ruby_to_erb.rb
196
199
  - lib/erb_lint/utils/severity_levels.rb
197
200
  - lib/erb_lint/version.rb
198
- homepage: https://github.com/Shopify/erb-lint
201
+ homepage: https://github.com/Shopify/erb_lint
199
202
  licenses:
200
203
  - MIT
201
204
  metadata:
202
205
  allowed_push_host: https://rubygems.org
203
- post_install_message:
206
+ post_install_message:
204
207
  rdoc_options: []
205
208
  require_paths:
206
209
  - lib
@@ -215,8 +218,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
218
  - !ruby/object:Gem::Version
216
219
  version: '0'
217
220
  requirements: []
218
- rubygems_version: 3.4.18
219
- signing_key:
221
+ rubygems_version: 3.5.21
222
+ signing_key:
220
223
  specification_version: 4
221
224
  summary: ERB lint tool
222
225
  test_files: []