haml_lint 0.44.0 → 0.46.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/bin/haml-lint +1 -1
  3. data/config/default.yml +6 -28
  4. data/config/forced_rubocop_config.yml +156 -0
  5. data/lib/haml_lint/adapter/haml_4.rb +18 -0
  6. data/lib/haml_lint/adapter/haml_5.rb +11 -0
  7. data/lib/haml_lint/adapter/haml_6.rb +11 -0
  8. data/lib/haml_lint/cli.rb +8 -3
  9. data/lib/haml_lint/configuration_loader.rb +13 -12
  10. data/lib/haml_lint/document.rb +89 -8
  11. data/lib/haml_lint/exceptions.rb +6 -0
  12. data/lib/haml_lint/extensions/haml_util_unescape_interpolation_tracking.rb +35 -0
  13. data/lib/haml_lint/file_finder.rb +2 -2
  14. data/lib/haml_lint/lint.rb +10 -1
  15. data/lib/haml_lint/linter/final_newline.rb +4 -3
  16. data/lib/haml_lint/linter/implicit_div.rb +1 -1
  17. data/lib/haml_lint/linter/indentation.rb +3 -3
  18. data/lib/haml_lint/linter/no_placeholders.rb +18 -0
  19. data/lib/haml_lint/linter/rubocop.rb +351 -59
  20. data/lib/haml_lint/linter/space_before_script.rb +8 -10
  21. data/lib/haml_lint/linter/unnecessary_string_output.rb +1 -1
  22. data/lib/haml_lint/linter/view_length.rb +1 -1
  23. data/lib/haml_lint/linter.rb +56 -9
  24. data/lib/haml_lint/linter_registry.rb +3 -5
  25. data/lib/haml_lint/logger.rb +2 -2
  26. data/lib/haml_lint/options.rb +26 -2
  27. data/lib/haml_lint/rake_task.rb +2 -2
  28. data/lib/haml_lint/reporter/hash_reporter.rb +1 -3
  29. data/lib/haml_lint/reporter/offense_count_reporter.rb +1 -1
  30. data/lib/haml_lint/reporter/utils.rb +33 -4
  31. data/lib/haml_lint/ruby_extraction/ad_hoc_chunk.rb +20 -0
  32. data/lib/haml_lint/ruby_extraction/base_chunk.rb +113 -0
  33. data/lib/haml_lint/ruby_extraction/chunk_extractor.rb +504 -0
  34. data/lib/haml_lint/ruby_extraction/coordinator.rb +181 -0
  35. data/lib/haml_lint/ruby_extraction/haml_comment_chunk.rb +54 -0
  36. data/lib/haml_lint/ruby_extraction/implicit_end_chunk.rb +17 -0
  37. data/lib/haml_lint/ruby_extraction/interpolation_chunk.rb +26 -0
  38. data/lib/haml_lint/ruby_extraction/non_ruby_filter_chunk.rb +32 -0
  39. data/lib/haml_lint/ruby_extraction/placeholder_marker_chunk.rb +40 -0
  40. data/lib/haml_lint/ruby_extraction/ruby_filter_chunk.rb +33 -0
  41. data/lib/haml_lint/ruby_extraction/ruby_source.rb +5 -0
  42. data/lib/haml_lint/ruby_extraction/script_chunk.rb +132 -0
  43. data/lib/haml_lint/ruby_extraction/tag_attributes_chunk.rb +39 -0
  44. data/lib/haml_lint/ruby_extraction/tag_script_chunk.rb +30 -0
  45. data/lib/haml_lint/ruby_extractor.rb +11 -10
  46. data/lib/haml_lint/runner.rb +35 -3
  47. data/lib/haml_lint/spec/matchers/report_lint.rb +22 -7
  48. data/lib/haml_lint/spec/normalize_indent.rb +2 -2
  49. data/lib/haml_lint/spec/shared_linter_context.rb +9 -1
  50. data/lib/haml_lint/spec/shared_rubocop_autocorrect_context.rb +143 -0
  51. data/lib/haml_lint/spec.rb +1 -0
  52. data/lib/haml_lint/tree/filter_node.rb +10 -0
  53. data/lib/haml_lint/tree/node.rb +13 -4
  54. data/lib/haml_lint/tree/tag_node.rb +5 -9
  55. data/lib/haml_lint/utils.rb +130 -5
  56. data/lib/haml_lint/version.rb +1 -1
  57. data/lib/haml_lint/version_comparer.rb +25 -0
  58. data/lib/haml_lint.rb +12 -0
  59. metadata +25 -6
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Makes writing tests for linters a lot DRYer by taking any currently `haml`
4
+ # variable defined via `let` and normalizing it and running the linter against
5
+ # it, allowing specs to simply specify whether a lint was reported.
6
+
7
+ module HamlLint
8
+ module Spec
9
+ module SharedRubocopAutocorrectContext
10
+ RSpec.shared_context 'rubocop_autocorrect' do
11
+ # Setting ENV['STUB_RUBOCOP'] to 1 or true makes rubocop tests faster by not involving rubocop.
12
+ # It is sometimes automatically activated for tests which need a different Rubocop version
13
+ stub_rubocop_env_result = %w[1 true].include?(ENV['STUB_RUBOCOP'])
14
+
15
+ let(:stub_rubocop?) do |example|
16
+ # Tries to match `{% rubocop_version <= '1.2' %}`, extracting the operator and the "number"
17
+ rubocop_version_regex = /\{%\s*rubocop_version\s*([^\w\s]+?)\s*['"]?(\d+(\.\d+)*)['"]?\s*%\}/
18
+ requirements = example.metadata[:full_description].scan(rubocop_version_regex)
19
+
20
+ # This can be used by the requirements in eval
21
+ rubocop_version = HamlLint::VersionComparer.for_rubocop
22
+
23
+ accepted = requirements.all? do |(operator, version)|
24
+ rubocop_version.send(operator, version)
25
+ end
26
+
27
+ next true unless accepted
28
+
29
+ # Doing this last so that exceptions in the requirements always fail
30
+ next true if stub_rubocop_env_result
31
+
32
+ false
33
+ end
34
+
35
+ before do
36
+ if stub_rubocop?
37
+ skip if end_ruby.include?('SKIP')
38
+ subject.stub(:process_ruby_source).and_return(end_ruby)
39
+ end
40
+ subject.stub(:transfer_corrections?).and_return(true)
41
+ end
42
+
43
+ include_context 'linter'
44
+ # The goal is not to test rubocop the gem, so no need to test the details using both
45
+ # :safe and :all
46
+ let(:autocorrect) { :all }
47
+
48
+ # We want want to do error handling ourself
49
+ let(:run_method_to_use) { nil }
50
+
51
+ let(:steps_parts) do
52
+ parts = steps_string.split(/^[ \t]*---[ \t]*\n/, -1)
53
+ raise "Expected 4 steps, got: #{parts.size}" if parts.size != 4
54
+ parts
55
+ end
56
+
57
+ let(:start_haml) { steps_parts[0] }
58
+
59
+ let(:start_ruby) do
60
+ lines = steps_parts[1].split("\n", -1)
61
+ current_matching_line = 1
62
+ @source_map = {}
63
+ lines.each.with_index do |line, i|
64
+ next unless line =~ /\S/
65
+ mo = line.match(/^(.*?)\$?\s*\$\$(\d+)$/)
66
+ if mo
67
+ lines[i] = mo[1]
68
+ current_matching_line = Integer(mo[2])
69
+ end
70
+ @source_map[i + 1] = current_matching_line
71
+ end
72
+ lines.join("\n")
73
+ end
74
+
75
+ let(:source_map) do
76
+ start_ruby
77
+ @source_map
78
+ end
79
+
80
+ let(:end_ruby) { steps_parts[2] }
81
+
82
+ let(:end_haml) { steps_parts[3] }
83
+
84
+ # Used by the 'linter' context
85
+ let(:haml) { start_haml }
86
+
87
+ # steps_string is string of multiple lines describing the steps that
88
+ # the code will take:
89
+ # 1) input haml
90
+ # 2) extracted ruby
91
+ # 3) the corrected ruby
92
+ # 4) the corrected haml
93
+ # Each steps is delimited by a line with ---
94
+ def follows_steps # rubocop:disable Metrics
95
+ begin
96
+ subject.run_or_raise(document, autocorrect: autocorrect)
97
+ rescue StandardError => e
98
+ exception_while_running = e
99
+ end
100
+
101
+ syntax_lints = subject.lints.select { |lint| lint.message =~ %r{Lint/Syntax} }
102
+
103
+ if start_ruby.strip != 'SKIP' && subject.last_extracted_source
104
+ matcher = eq(start_ruby)
105
+ subject.last_extracted_source.source.should(
106
+ matcher,
107
+ -> { "Extracted Ruby is different from expected. #{matcher.failure_message}\n#{format_lints}" }
108
+ )
109
+ end
110
+
111
+ syntax_lints.should(be_empty, "Generated Ruby has Syntax Lints:\n#{format_lints(syntax_lints)}")
112
+
113
+ if end_ruby.strip != 'SKIP' && subject.last_new_ruby_source
114
+ matcher = eq(end_ruby)
115
+ subject.last_new_ruby_source.should(
116
+ matcher,
117
+ -> { "Ruby generated by RuboCop is different from expected. #{matcher.failure_message}\n#{format_lints}" }
118
+ )
119
+ end
120
+
121
+ raise exception_while_running if exception_while_running
122
+
123
+ matcher = eq(end_haml)
124
+ document.source.should(
125
+ matcher,
126
+ -> { "Final HAML is different from expected. #{matcher.failure_message}\n#{format_lints}" }
127
+ )
128
+
129
+ if subject.last_extracted_source && start_ruby.strip != 'SKIP'
130
+ subject.last_extracted_source.source_map.should == source_map
131
+ end
132
+
133
+ haml_different = start_haml != end_haml
134
+ document.source_was_changed.should == haml_different
135
+ end
136
+
137
+ def format_lints(lints = subject.lints)
138
+ lints.map { |lint| "#{lint.line}:#{lint.message}" }.join("\n")
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -2,4 +2,5 @@
2
2
 
3
3
  require 'haml_lint/spec/normalize_indent'
4
4
  require 'haml_lint/spec/shared_linter_context'
5
+ require 'haml_lint/spec/shared_rubocop_autocorrect_context'
5
6
  require 'haml_lint/spec/matchers/report_lint'
@@ -7,5 +7,15 @@ module HamlLint::Tree
7
7
  def filter_type
8
8
  @value[:name]
9
9
  end
10
+
11
+ def text
12
+ # Seems HAML strips the starting blank lines... without them, line numbers become offset,
13
+ # breaking the source_map and auto-correct
14
+
15
+ nb_blank_lines = 0
16
+ nb_blank_lines += 1 while @document.source_lines[line + nb_blank_lines]&.empty?
17
+
18
+ "#{"\n" * nb_blank_lines}#{super}"
19
+ end
10
20
  end
11
21
  end
@@ -104,8 +104,13 @@ module HamlLint::Tree
104
104
  def line_numbers
105
105
  return (line..line) unless @value && text
106
106
 
107
- end_line = line + lines.count
108
- end_line = nontrivial_end_line if line == end_line && children.empty?
107
+ end_line = if !lines.empty?
108
+ line + lines.count - 1
109
+ elsif children.empty?
110
+ nontrivial_end_line
111
+ else
112
+ line
113
+ end
109
114
 
110
115
  (line..end_line)
111
116
  end
@@ -155,6 +160,10 @@ module HamlLint::Tree
155
160
  @value[:text].to_s
156
161
  end
157
162
 
163
+ def keyword
164
+ @value[:keyword]
165
+ end
166
+
158
167
  private
159
168
 
160
169
  # Discovers the end line of the node when there are no lines.
@@ -164,7 +173,7 @@ module HamlLint::Tree
164
173
  if successor
165
174
  successor.line_numbers.begin - 1
166
175
  else
167
- @document.source_lines.count
176
+ @document.last_non_empty_line
168
177
  end
169
178
  end
170
179
 
@@ -212,7 +221,7 @@ module HamlLint::Tree
212
221
  # @param node [HamlLint::Tree::Node]
213
222
  # @return [Array<HamlLint::Tree::Node>]
214
223
  def subsequents(node)
215
- siblings[(position(node) + 1)..-1]
224
+ siblings[(position(node) + 1)..]
216
225
  end
217
226
 
218
227
  private
@@ -2,7 +2,7 @@
2
2
 
3
3
  module HamlLint::Tree
4
4
  # Represents a tag node in a HAML document.
5
- class TagNode < Node # rubocop:disable Metrics/ClassLength
5
+ class TagNode < Node
6
6
  # Computed set of attribute hashes code.
7
7
  #
8
8
  # This is a combination of all dynamically calculated attributes from the
@@ -49,9 +49,7 @@ module HamlLint::Tree
49
49
  # dot removed
50
50
  def static_classes
51
51
  @static_classes ||=
52
- begin
53
- static_attributes_source.scan(/\.([-:\w]+)/)
54
- end
52
+ static_attributes_source.scan(/\.([-:\w]+)/)
55
53
  end
56
54
 
57
55
  # List of ids statically defined for this tag.
@@ -63,9 +61,7 @@ module HamlLint::Tree
63
61
  # removed
64
62
  def static_ids
65
63
  @static_ids ||=
66
- begin
67
- static_attributes_source.scan(/#([-:\w]+)/)
68
- end
64
+ static_attributes_source.scan(/#([-:\w]+)/)
69
65
  end
70
66
 
71
67
  # Static element attributes defined after the tag name.
@@ -101,7 +97,7 @@ module HamlLint::Tree
101
97
  @attributes_source ||=
102
98
  begin
103
99
  _explicit_tag, static_attrs, rest =
104
- source_code.scan(/\A\s*(%[-:\w]+)?([-:\w\.\#]*)(.*)/m)[0]
100
+ source_code.scan(/\A\s*(%[-:\w]+)?([-:\w.\#]*)(.*)/m)[0]
105
101
 
106
102
  attr_types = {
107
103
  '{' => [:hash, %w[{ }]],
@@ -220,7 +216,7 @@ module HamlLint::Tree
220
216
  #
221
217
  # @return [true,false]
222
218
  def remove_outer_whitespace?
223
- !!@value[:nuke_outer_whitespace] # rubocop:disable Style/DoubleNegation
219
+ !!@value[:nuke_outer_whitespace]
224
220
  end
225
221
 
226
222
  # Returns the script source that will be evaluated to produce this tag's
@@ -4,7 +4,7 @@ require 'pathname'
4
4
 
5
5
  module HamlLint
6
6
  # A miscellaneous set of utility functions.
7
- module Utils
7
+ module Utils # rubocop:disable Metrics/ModuleLength
8
8
  module_function
9
9
 
10
10
  # Returns whether a glob pattern (or any of a list of patterns) matches the
@@ -52,12 +52,21 @@ module HamlLint
52
52
  # the text.
53
53
  # @yieldparam interpolated_code [String] code that was interpolated
54
54
  # @yieldparam line [Integer] line number code appears on in text
55
- def extract_interpolated_values(text)
55
+ def extract_interpolated_values(text) # rubocop:disable Metrics/AbcSize
56
56
  dumped_text = text.dump
57
- newline_positions = extract_substring_positions(dumped_text, '\\\n')
57
+
58
+ # Basically, match pairs of '\' and '\ followed by the letter 'n'
59
+ quoted_regex_s = "(#{Regexp.quote('\\\\')}|#{Regexp.quote('\\n')})"
60
+ newline_positions = extract_substring_positions(dumped_text, quoted_regex_s)
61
+
62
+ # Filter the matches to only keep those ending in 'n'.
63
+ # This way, escaped \n will not be considered
64
+ newline_positions.select! do |pos|
65
+ dumped_text[pos - 1] == 'n'
66
+ end
58
67
 
59
68
  Haml::Util.handle_interpolation(dumped_text) do |scan|
60
- line = (newline_positions.find_index { |marker| scan.pos <= marker } ||
69
+ line = (newline_positions.find_index { |marker| scan.charpos <= marker } ||
61
70
  newline_positions.size) + 1
62
71
 
63
72
  escape_count = (scan[2].size - 1) / 2
@@ -70,6 +79,41 @@ module HamlLint
70
79
  end
71
80
  end
72
81
 
82
+ def handle_interpolation_with_indexes(text)
83
+ newline_indexes = extract_substring_positions(text, "\n")
84
+
85
+ handle_interpolation_with_newline(text) do |scan|
86
+ line_index = newline_indexes.find_index { |index| scan.charpos <= index }
87
+ line_index ||= newline_indexes.size
88
+
89
+ line_start_char_index = if line_index == 0
90
+ 0
91
+ else
92
+ newline_indexes[line_index - 1]
93
+ end
94
+
95
+ char_index = scan.charpos - line_start_char_index
96
+
97
+ yield scan, line_index, char_index
98
+ end
99
+ end
100
+
101
+ if Gem::Version.new(Haml::VERSION) >= Gem::Version.new('5')
102
+ # Same as Haml::Util.handle_interpolation, but enables multiline mode on the regex
103
+ def handle_interpolation_with_newline(str)
104
+ scan = StringScanner.new(str)
105
+ yield scan while scan.scan(/(.*?)(\\*)#([{@$])/m)
106
+ scan.rest
107
+ end
108
+ else
109
+ # Same as Haml::Util.handle_interpolation, but enables multiline mode on the regex
110
+ def handle_interpolation_with_newline(str)
111
+ scan = StringScanner.new(str)
112
+ yield scan while scan.scan(/(.*?)(\\*)\#\{/m)
113
+ scan.rest
114
+ end
115
+ end
116
+
73
117
  # Returns indexes of all occurrences of a substring within a string.
74
118
  #
75
119
  # Note, this will not return overlaping substrings, so searching for "aa"
@@ -81,7 +125,7 @@ module HamlLint
81
125
  def extract_substring_positions(text, substr)
82
126
  positions = []
83
127
  scanner = StringScanner.new(text)
84
- positions << scanner.pos while scanner.scan(/(.*?)#{substr}/)
128
+ positions << scanner.charpos while scanner.scan(/(.*?)#{substr}/)
85
129
  positions
86
130
  end
87
131
 
@@ -136,6 +180,22 @@ module HamlLint
136
180
  count
137
181
  end
138
182
 
183
+ # Process ERB, providing some values for for versions to it
184
+ #
185
+ # @param content [String] the (usually yaml) content to process
186
+ # @return [String]
187
+ def process_erb(content)
188
+ # Variables for use in the ERB's post-processing
189
+ rubocop_version = HamlLint::VersionComparer.for_rubocop
190
+
191
+ ERB.new(content).result(binding)
192
+ end
193
+
194
+ def insert_after_indentation(code, insert)
195
+ index = code.index(/\S/)
196
+ "#{code[0...index]}#{insert}#{code[index..]}"
197
+ end
198
+
139
199
  # Calls a block of code with a modified set of environment variables,
140
200
  # restoring them once the code has executed.
141
201
  #
@@ -151,5 +211,70 @@ module HamlLint
151
211
  ensure
152
212
  old_env.each { |var, value| ENV[var.to_s] = value }
153
213
  end
214
+
215
+ def indent(string, nb_indent)
216
+ if nb_indent < 0
217
+ string.gsub(/^ {1,#{-nb_indent}}/, '')
218
+ else
219
+ string.gsub(/^/, ' ' * nb_indent)
220
+ end
221
+ end
222
+
223
+ def map_subset!(array, range, &block)
224
+ subset = array[range]
225
+ return if subset.nil? || subset.empty?
226
+
227
+ array[range] = subset.map(&block)
228
+ end
229
+
230
+ def map_after_first!(array, &block)
231
+ map_subset!(array, 1..-1, &block)
232
+ end
233
+
234
+ # Returns true if line is only whitespace.
235
+ # Note, this is not like blank? is rails. For nil, this returns false.
236
+ def is_blank_line?(line)
237
+ line && line.index(/\S/).nil?
238
+ end
239
+
240
+ def check_error_when_compiling_haml(haml_string)
241
+ begin
242
+ ruby_code = ::HamlLint::Adapter.detect_class.new(haml_string).precompile
243
+ rescue StandardError => e
244
+ return e
245
+ end
246
+ eval("BEGIN {return nil}; #{ruby_code}", binding, __FILE__, __LINE__) # rubocop:disable Security/Eval
247
+ # The eval will return nil
248
+ rescue ::SyntaxError
249
+ $!
250
+ end
251
+
252
+ # Overrides the global stdin, stdout and stderr while within the block, to
253
+ # push a string in stdin, and capture both stdout and stderr which are returned.
254
+ #
255
+ # @param stdin_str [String] the string to push in as stdin
256
+ # @param _block [Block] the block to perform with the overridden std streams
257
+ # @return [String, String]
258
+ def with_captured_streams(stdin_str, &_block)
259
+ original_stdin = $stdin
260
+ # The dup is needed so that stdin_data isn't altered (encoding-wise at least)
261
+ $stdin = StringIO.new(stdin_str.dup)
262
+ begin
263
+ original_stdout = $stdout
264
+ $stdout = StringIO.new
265
+ begin
266
+ original_stderr = $stderr
267
+ $stderr = StringIO.new
268
+ yield
269
+ [$stdout.string, $stderr.string]
270
+ ensure
271
+ $stderr = original_stderr
272
+ end
273
+ ensure
274
+ $stdout = original_stdout
275
+ end
276
+ ensure
277
+ $stdin = original_stdin
278
+ end
154
279
  end
155
280
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Defines the gem version.
4
4
  module HamlLint
5
- VERSION = '0.44.0'
5
+ VERSION = '0.46.0'
6
6
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HamlLint
4
+ # A simple wrapper around Gem::Version to allow comparison with String instances
5
+ # This makes code shorter in some places
6
+ class VersionComparer
7
+ def initialize(version)
8
+ @version = Gem::Version.new(version)
9
+ end
10
+
11
+ include Comparable
12
+ def <=>(other)
13
+ @version <=> Gem::Version.new(other)
14
+ end
15
+
16
+ # Shortcut to create a version comparer for the current RuboCop's version
17
+ def self.for_rubocop
18
+ new(RuboCop::Version::STRING)
19
+ end
20
+
21
+ def self.for_haml
22
+ new(Haml::VERSION)
23
+ end
24
+ end
25
+ end
data/lib/haml_lint.rb CHANGED
@@ -21,8 +21,14 @@ require 'haml_lint/file_finder'
21
21
  require 'haml_lint/runner'
22
22
  require 'haml_lint/utils'
23
23
  require 'haml_lint/version'
24
+ require 'haml_lint/version_comparer'
24
25
  require 'haml_lint/severity'
25
26
 
27
+ # Lead all extensions to external source code
28
+ Dir[File.expand_path('haml_lint/extensions/*.rb', File.dirname(__FILE__))].sort.each do |file|
29
+ require file
30
+ end
31
+
26
32
  # Load all parse tree node classes
27
33
  require 'haml_lint/tree/node'
28
34
  require 'haml_lint/node_transformer'
@@ -39,3 +45,9 @@ end
39
45
  Dir[File.expand_path('haml_lint/reporter/*.rb', File.dirname(__FILE__))].sort.each do |file|
40
46
  require file
41
47
  end
48
+
49
+ # Load all the chunks for RubyExtraction
50
+ require 'haml_lint/ruby_extraction/base_chunk'
51
+ Dir[File.expand_path('haml_lint/ruby_extraction/*.rb', File.dirname(__FILE__))].sort.each do |file|
52
+ require file
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml_lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.44.0
4
+ version: 0.46.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane da Silva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-27 00:00:00.000000000 Z
11
+ date: 2023-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 0.50.0
67
+ version: '1.0'
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 0.50.0
74
+ version: '1.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: sysexits
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -96,6 +96,7 @@ extra_rdoc_files: []
96
96
  files:
97
97
  - bin/haml-lint
98
98
  - config/default.yml
99
+ - config/forced_rubocop_config.yml
99
100
  - lib/haml_lint.rb
100
101
  - lib/haml_lint/adapter.rb
101
102
  - lib/haml_lint/adapter/haml_4.rb
@@ -109,6 +110,7 @@ files:
109
110
  - lib/haml_lint/directive.rb
110
111
  - lib/haml_lint/document.rb
111
112
  - lib/haml_lint/exceptions.rb
113
+ - lib/haml_lint/extensions/haml_util_unescape_interpolation_tracking.rb
112
114
  - lib/haml_lint/file_finder.rb
113
115
  - lib/haml_lint/haml_visitor.rb
114
116
  - lib/haml_lint/lint.rb
@@ -132,6 +134,7 @@ files:
132
134
  - lib/haml_lint/linter/line_length.rb
133
135
  - lib/haml_lint/linter/multiline_pipe.rb
134
136
  - lib/haml_lint/linter/multiline_script.rb
137
+ - lib/haml_lint/linter/no_placeholders.rb
135
138
  - lib/haml_lint/linter/object_reference_attributes.rb
136
139
  - lib/haml_lint/linter/repeated_id.rb
137
140
  - lib/haml_lint/linter/rubocop.rb
@@ -162,6 +165,20 @@ files:
162
165
  - lib/haml_lint/reporter/offense_count_reporter.rb
163
166
  - lib/haml_lint/reporter/progress_reporter.rb
164
167
  - lib/haml_lint/reporter/utils.rb
168
+ - lib/haml_lint/ruby_extraction/ad_hoc_chunk.rb
169
+ - lib/haml_lint/ruby_extraction/base_chunk.rb
170
+ - lib/haml_lint/ruby_extraction/chunk_extractor.rb
171
+ - lib/haml_lint/ruby_extraction/coordinator.rb
172
+ - lib/haml_lint/ruby_extraction/haml_comment_chunk.rb
173
+ - lib/haml_lint/ruby_extraction/implicit_end_chunk.rb
174
+ - lib/haml_lint/ruby_extraction/interpolation_chunk.rb
175
+ - lib/haml_lint/ruby_extraction/non_ruby_filter_chunk.rb
176
+ - lib/haml_lint/ruby_extraction/placeholder_marker_chunk.rb
177
+ - lib/haml_lint/ruby_extraction/ruby_filter_chunk.rb
178
+ - lib/haml_lint/ruby_extraction/ruby_source.rb
179
+ - lib/haml_lint/ruby_extraction/script_chunk.rb
180
+ - lib/haml_lint/ruby_extraction/tag_attributes_chunk.rb
181
+ - lib/haml_lint/ruby_extraction/tag_script_chunk.rb
165
182
  - lib/haml_lint/ruby_extractor.rb
166
183
  - lib/haml_lint/ruby_parser.rb
167
184
  - lib/haml_lint/runner.rb
@@ -170,6 +187,7 @@ files:
170
187
  - lib/haml_lint/spec/matchers/report_lint.rb
171
188
  - lib/haml_lint/spec/normalize_indent.rb
172
189
  - lib/haml_lint/spec/shared_linter_context.rb
190
+ - lib/haml_lint/spec/shared_rubocop_autocorrect_context.rb
173
191
  - lib/haml_lint/tree/comment_node.rb
174
192
  - lib/haml_lint/tree/doctype_node.rb
175
193
  - lib/haml_lint/tree/filter_node.rb
@@ -183,6 +201,7 @@ files:
183
201
  - lib/haml_lint/tree/tag_node.rb
184
202
  - lib/haml_lint/utils.rb
185
203
  - lib/haml_lint/version.rb
204
+ - lib/haml_lint/version_comparer.rb
186
205
  homepage: https://github.com/sds/haml-lint
187
206
  licenses:
188
207
  - MIT
@@ -195,14 +214,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
214
  requirements:
196
215
  - - ">="
197
216
  - !ruby/object:Gem::Version
198
- version: 2.4.0
217
+ version: 2.6.0
199
218
  required_rubygems_version: !ruby/object:Gem::Requirement
200
219
  requirements:
201
220
  - - ">="
202
221
  - !ruby/object:Gem::Version
203
222
  version: '0'
204
223
  requirements: []
205
- rubygems_version: 3.1.6
224
+ rubygems_version: 3.0.3.1
206
225
  signing_key:
207
226
  specification_version: 4
208
227
  summary: HAML lint tool