haml_lint 0.34.0 → 0.37.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec144420e79ce50d60ef7cb159e51c33d6cd3d59a0dea8034a049c43f25ae189
4
- data.tar.gz: 1cff96bc9d0f2a77f4beaca14a872c56074a3aad5bf91785b711e55ed58c0f92
3
+ metadata.gz: a68b2308ea5b74941d9db3d5dfe22fa181bac800f89049c61db6ed533f381ca8
4
+ data.tar.gz: 78fc8f6241ad3cccace23abd95818ba461097ef4a11e51d5ec091de82de9e2ac
5
5
  SHA512:
6
- metadata.gz: 04ad57edca1e5b50a0206832bfd83bb8c482255b14a066389a98ac10163863adda72b66a0b97223a68fe8dea4104a7ad71420aa1b318823fa15bf3932273bfa6
7
- data.tar.gz: b34d5ac36b8b4cbba5b76982731af8f2b4d55cbcc01105144f1a6a8cb3fe9d2dd218bdb624940c5c2e767f11552891885380bdedabcb719685053f622bffe865
6
+ metadata.gz: 145a57a93ecf9960435ccd40fb02819e560bf4557be450494b5d3d1c920e65089925959b2377156172ed5cb10cbfbfd79a690b6b7c0ea99eb282ce2a3c7f5cd0
7
+ data.tar.gz: 81e45f26624c737b2cf750027aaca241d3c4c08ab0c05ad0233d802e75f4de803d5401ccf90c527416aec7987d00b1fe5a8ce8856c7bedba70a86243c5d3b26b
@@ -91,13 +91,17 @@ linters:
91
91
  - Lint/BlockAlignment
92
92
  - Lint/EndAlignment
93
93
  - Lint/Void
94
- - Layout/AlignHash
95
- - Layout/AlignParameters
94
+ - Layout/AlignHash # renamed to Layout/HashAlignment in rubocop 0.77
95
+ - Layout/AlignParameters # renamed to Layout/ParameterAlignment in rubocop 0.77
96
96
  - Layout/CaseIndentation
97
97
  - Layout/ElseAlignment
98
98
  - Layout/EndOfLine
99
+ - Layout/HashAlignment
99
100
  - Layout/IndentationWidth
100
- - Layout/TrailingBlankLines
101
+ - Layout/LineLength # renamed from Metrics/LineLength in rubocop 0.79.0
102
+ - Layout/ParameterAlignment
103
+ - Layout/TrailingBlankLines # renamed to Layout/TrailingEmptyLines in rubocop 0.77
104
+ - Layout/TrailingEmptyLines
101
105
  - Layout/TrailingWhitespace
102
106
  - Metrics/BlockLength
103
107
  - Metrics/BlockNesting
@@ -26,16 +26,16 @@ require 'haml_lint/severity'
26
26
  # Load all parse tree node classes
27
27
  require 'haml_lint/tree/node'
28
28
  require 'haml_lint/node_transformer'
29
- Dir[File.expand_path('haml_lint/tree/*.rb', File.dirname(__FILE__))].each do |file|
29
+ Dir[File.expand_path('haml_lint/tree/*.rb', File.dirname(__FILE__))].sort.each do |file|
30
30
  require file
31
31
  end
32
32
 
33
33
  # Load all linters
34
- Dir[File.expand_path('haml_lint/linter/*.rb', File.dirname(__FILE__))].each do |file|
34
+ Dir[File.expand_path('haml_lint/linter/*.rb', File.dirname(__FILE__))].sort.each do |file|
35
35
  require file
36
36
  end
37
37
 
38
38
  # Load all reporters
39
- Dir[File.expand_path('haml_lint/reporter/*.rb', File.dirname(__FILE__))].each do |file|
39
+ Dir[File.expand_path('haml_lint/reporter/*.rb', File.dirname(__FILE__))].sort.each do |file|
40
40
  require file
41
41
  end
@@ -19,7 +19,7 @@ module HamlLint
19
19
  version = haml_version
20
20
  case version
21
21
  when '~> 4.0' then HamlLint::Adapter::Haml4
22
- when '~> 5.0', '~> 5.1' then HamlLint::Adapter::Haml5
22
+ when '~> 5.0', '~> 5.1', '~> 5.2' then HamlLint::Adapter::Haml5
23
23
  else fail HamlLint::Exceptions::UnknownHamlVersion, "Cannot handle Haml version: #{version}"
24
24
  end
25
25
  end
@@ -94,7 +94,7 @@ module HamlLint
94
94
  # @return [HamlLint::Reporter]
95
95
  def reporter_from_options(options)
96
96
  if options[:auto_gen_config]
97
- HamlLint::Reporter::DisabledConfigReporter.new(log, limit: options[:auto_gen_exclude_limit] || 15) # rubocop:disable Metrics/LineLength
97
+ HamlLint::Reporter::DisabledConfigReporter.new(log, limit: options[:auto_gen_exclude_limit] || 15) # rubocop:disable Layout/LineLength
98
98
  else
99
99
  options.fetch(:reporter, HamlLint::Reporter::DefaultReporter).new(log)
100
100
  end
@@ -40,7 +40,7 @@ module HamlLint
40
40
  #
41
41
  # @param patterns [Array<String>]
42
42
  # @return [Array<String>]
43
- def extract_files_from(patterns) # rubocop:disable MethodLength
43
+ def extract_files_from(patterns) # rubocop:disable Metrics/MethodLength
44
44
  files = []
45
45
 
46
46
  patterns.each do |pattern|
@@ -17,7 +17,7 @@ module HamlLint
17
17
 
18
18
  nodes = (id_map[id] << node)
19
19
  case nodes.size
20
- when 1 then return
20
+ when 1 then nil
21
21
  when 2 then add_lints_for_first_duplications(nodes)
22
22
  else add_lint(node, id)
23
23
  end
@@ -29,6 +29,14 @@ module HamlLint
29
29
 
30
30
  private
31
31
 
32
+ # A single CLI instance is shared between files to avoid RuboCop
33
+ # having to repeatedly reload .rubocop.yml.
34
+ def self.rubocop_cli
35
+ # The ivar is stored on the class singleton rather than the Linter instance
36
+ # because it can't be Marshal.dump'd (as used by Parallel.map)
37
+ @rubocop_cli ||= ::RuboCop::CLI.new
38
+ end
39
+
32
40
  # Executes RuboCop against the given Ruby code and records the offenses as
33
41
  # lints.
34
42
  #
@@ -36,8 +44,6 @@ module HamlLint
36
44
  # @param source_map [Hash] map of Ruby code line numbers to original line
37
45
  # numbers in the template
38
46
  def find_lints(ruby, source_map)
39
- rubocop = ::RuboCop::CLI.new
40
-
41
47
  filename =
42
48
  if document.file
43
49
  "#{document.file}.rb"
@@ -46,7 +52,7 @@ module HamlLint
46
52
  end
47
53
 
48
54
  with_ruby_from_stdin(ruby) do
49
- extract_lints_from_offenses(lint_file(rubocop, filename), source_map)
55
+ extract_lints_from_offenses(lint_file(self.class.rubocop_cli, filename), source_map)
50
56
  end
51
57
  end
52
58
 
@@ -56,7 +62,12 @@ module HamlLint
56
62
  # @param file [String]
57
63
  # @return [Array<RuboCop::Cop::Offense>]
58
64
  def lint_file(rubocop, file)
59
- rubocop.run(rubocop_flags << file)
65
+ status = rubocop.run(rubocop_flags << file)
66
+ unless [::RuboCop::CLI::STATUS_SUCCESS, ::RuboCop::CLI::STATUS_OFFENSES].include?(status)
67
+ raise HamlLint::Exceptions::ConfigurationError,
68
+ "RuboCop exited unsuccessfully with status #{status}." \
69
+ ' Check the stack trace to see if there was a misconfiguration.'
70
+ end
60
71
  OffenseCollector.offenses
61
72
  end
62
73
 
@@ -9,7 +9,7 @@ module HamlLint
9
9
 
10
10
  ALLOWED_SEPARATORS = [' ', '#'].freeze
11
11
 
12
- def visit_tag(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/LineLength, Metrics/PerceivedComplexity
12
+ def visit_tag(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
13
13
  # If this tag has inline script
14
14
  return unless node.contains_script?
15
15
 
@@ -35,7 +35,7 @@ module HamlLint
35
35
  return unless tree = parse_ruby(script_node.script)
36
36
  %i[str dstr].include?(tree.type) &&
37
37
  !starts_with_reserved_character?(tree.children.first)
38
- rescue ::Parser::SyntaxError # rubocop:disable Lint/HandleExceptions
38
+ rescue ::Parser::SyntaxError # rubocop:disable Lint/SuppressedException
39
39
  # Gracefully ignore syntax errors, as that's managed by a different linter
40
40
  end
41
41
 
@@ -43,7 +43,7 @@ module HamlLint
43
43
  # given special treatment, thus making enclosing it in a string necessary.
44
44
  def starts_with_reserved_character?(stringish)
45
45
  string = stringish.respond_to?(:children) ? stringish.children.first : stringish
46
- string =~ %r{\A\s*[/#-=%~]}
46
+ string =~ %r{\A\s*[/#-=%~]} if string.is_a?(String)
47
47
  end
48
48
  end
49
49
  end
@@ -38,7 +38,7 @@ module HamlLint
38
38
  end
39
39
 
40
40
  parser.on('--auto-gen-exclude-limit limit', Integer,
41
- 'Number of failures to allow in the TODO list before the entire rule is excluded') do |limit| # rubocop:disable Metrics/LineLength
41
+ 'Number of failures to allow in the TODO list before the entire rule is excluded') do |limit| # rubocop:disable Layout/LineLength
42
42
  @options[:auto_gen_exclude_limit] = limit
43
43
  end
44
44
 
@@ -51,6 +51,10 @@ module HamlLint
51
51
  "Specify which linters you don't want to run") do |linters|
52
52
  @options[:excluded_linters] = linters
53
53
  end
54
+
55
+ parser.on('-p', '--parallel', 'Run linters in parallel using available CPUs') do
56
+ @options[:parallel] = true
57
+ end
54
58
  end
55
59
 
56
60
  def add_report_options(parser)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'parallel'
4
+
3
5
  module HamlLint
4
6
  # Responsible for running the applicable linters against the desired files.
5
7
  class Runner
@@ -21,6 +23,7 @@ module HamlLint
21
23
  @files = extract_applicable_files(config, options)
22
24
  @linter_selector = HamlLint::LinterSelector.new(config, options)
23
25
  @fail_fast = options.fetch(:fail_fast, false)
26
+ @cache = {}
24
27
 
25
28
  report(options)
26
29
  end
@@ -121,7 +124,7 @@ module HamlLint
121
124
  # @param report [HamlLint::Report]
122
125
  # @return [void]
123
126
  def process_file(file, report)
124
- lints = collect_lints(file, linter_selector, config)
127
+ lints = @cache[file] || collect_lints(file, linter_selector, config)
125
128
  lints.each { |lint| report.add_lint(lint) }
126
129
  report.finish_file(file, lints)
127
130
  end
@@ -134,8 +137,20 @@ module HamlLint
134
137
  def report(options)
135
138
  report = HamlLint::Report.new(reporter: options[:reporter], fail_level: options[:fail_level])
136
139
  report.start(@files)
140
+ warm_cache if options[:parallel]
137
141
  process_files(report)
138
142
  report
139
143
  end
144
+
145
+ # Cache the result of processing lints in parallel.
146
+ #
147
+ # @return [void]
148
+ def warm_cache
149
+ results = Parallel.map(files) do |file|
150
+ lints = collect_lints(file, linter_selector, config)
151
+ [file, lints]
152
+ end
153
+ @cache = results.to_h
154
+ end
140
155
  end
141
156
  end
@@ -17,7 +17,9 @@ module HamlLint::Tree
17
17
  # @param line [Integer] the line number of the node
18
18
  # @return [HamlLint::Node]
19
19
  def node_for_line(line)
20
- find(-> { HamlLint::Tree::NullNode.new }) { |node| node.line_numbers.cover?(line) }
20
+ find(-> { HamlLint::Tree::NullNode.new }) do |node|
21
+ node.line_numbers.cover?(line) && node != self
22
+ end
21
23
  end
22
24
  end
23
25
  end
@@ -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 ClassLength
5
+ class TagNode < Node # rubocop:disable Metrics/ClassLength
6
6
  # Computed set of attribute hashes code.
7
7
  #
8
8
  # This is a combination of all dynamically calculated attributes from the
@@ -66,7 +66,7 @@ module HamlLint
66
66
  dumped_interpolated_str = Haml::Util.balance(scan, '{', '}', 1)[0][0...-1]
67
67
 
68
68
  # Hacky way to turn a dumped string back into a regular string
69
- yield [eval('"' + dumped_interpolated_str + '"'), line] # rubocop:disable Eval
69
+ yield [eval('"' + dumped_interpolated_str + '"'), line] # rubocop:disable Security/Eval
70
70
  end
71
71
  end
72
72
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Defines the gem version.
4
4
  module HamlLint
5
- VERSION = '0.34.0'
5
+ VERSION = '0.37.0'
6
6
  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.34.0
4
+ version: 0.37.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: 2019-10-02 00:00:00.000000000 Z
11
+ date: 2021-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.2'
22
+ version: '5.3'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,21 @@ dependencies:
29
29
  version: '4.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.2'
32
+ version: '5.3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: parallel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.10'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.10'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: rainbow
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -186,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
200
  - !ruby/object:Gem::Version
187
201
  version: '0'
188
202
  requirements: []
189
- rubygems_version: 3.0.3
203
+ rubygems_version: 3.1.4
190
204
  signing_key:
191
205
  specification_version: 4
192
206
  summary: HAML lint tool