slim_lint_standard 0.0.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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +21 -0
  3. data/bin/slim-lint-standard +7 -0
  4. data/config/default.yml +109 -0
  5. data/lib/slim_lint/atom.rb +129 -0
  6. data/lib/slim_lint/capture_map.rb +19 -0
  7. data/lib/slim_lint/cli.rb +167 -0
  8. data/lib/slim_lint/configuration.rb +111 -0
  9. data/lib/slim_lint/configuration_loader.rb +86 -0
  10. data/lib/slim_lint/constants.rb +10 -0
  11. data/lib/slim_lint/document.rb +78 -0
  12. data/lib/slim_lint/engine.rb +41 -0
  13. data/lib/slim_lint/exceptions.rb +20 -0
  14. data/lib/slim_lint/file_finder.rb +88 -0
  15. data/lib/slim_lint/filter.rb +126 -0
  16. data/lib/slim_lint/filters/attribute_processor.rb +46 -0
  17. data/lib/slim_lint/filters/auto_indenter.rb +39 -0
  18. data/lib/slim_lint/filters/control_processor.rb +46 -0
  19. data/lib/slim_lint/filters/do_inserter.rb +39 -0
  20. data/lib/slim_lint/filters/end_inserter.rb +74 -0
  21. data/lib/slim_lint/filters/interpolation.rb +73 -0
  22. data/lib/slim_lint/filters/multi_flattener.rb +32 -0
  23. data/lib/slim_lint/filters/splat_processor.rb +20 -0
  24. data/lib/slim_lint/filters/static_merger.rb +47 -0
  25. data/lib/slim_lint/lint.rb +70 -0
  26. data/lib/slim_lint/linter/avoid_multiline_expressions.rb +41 -0
  27. data/lib/slim_lint/linter/comment_control_statement.rb +26 -0
  28. data/lib/slim_lint/linter/consecutive_control_statements.rb +26 -0
  29. data/lib/slim_lint/linter/control_statement_spacing.rb +32 -0
  30. data/lib/slim_lint/linter/dynamic_output_spacing.rb +77 -0
  31. data/lib/slim_lint/linter/embedded_engines.rb +18 -0
  32. data/lib/slim_lint/linter/empty_control_statement.rb +15 -0
  33. data/lib/slim_lint/linter/empty_lines.rb +24 -0
  34. data/lib/slim_lint/linter/file_length.rb +18 -0
  35. data/lib/slim_lint/linter/line_length.rb +18 -0
  36. data/lib/slim_lint/linter/redundant_div.rb +21 -0
  37. data/lib/slim_lint/linter/rubocop.rb +131 -0
  38. data/lib/slim_lint/linter/standard.rb +69 -0
  39. data/lib/slim_lint/linter/tab.rb +20 -0
  40. data/lib/slim_lint/linter/tag_case.rb +15 -0
  41. data/lib/slim_lint/linter/trailing_blank_lines.rb +19 -0
  42. data/lib/slim_lint/linter/trailing_whitespace.rb +17 -0
  43. data/lib/slim_lint/linter.rb +93 -0
  44. data/lib/slim_lint/linter_registry.rb +37 -0
  45. data/lib/slim_lint/linter_selector.rb +87 -0
  46. data/lib/slim_lint/logger.rb +103 -0
  47. data/lib/slim_lint/matcher/anything.rb +11 -0
  48. data/lib/slim_lint/matcher/base.rb +21 -0
  49. data/lib/slim_lint/matcher/capture.rb +32 -0
  50. data/lib/slim_lint/matcher/nothing.rb +13 -0
  51. data/lib/slim_lint/options.rb +110 -0
  52. data/lib/slim_lint/parser.rb +584 -0
  53. data/lib/slim_lint/rake_task.rb +125 -0
  54. data/lib/slim_lint/report.rb +25 -0
  55. data/lib/slim_lint/reporter/checkstyle_reporter.rb +42 -0
  56. data/lib/slim_lint/reporter/default_reporter.rb +40 -0
  57. data/lib/slim_lint/reporter/emacs_reporter.rb +40 -0
  58. data/lib/slim_lint/reporter/json_reporter.rb +50 -0
  59. data/lib/slim_lint/reporter.rb +44 -0
  60. data/lib/slim_lint/ruby_extract_engine.rb +30 -0
  61. data/lib/slim_lint/ruby_extractor.rb +175 -0
  62. data/lib/slim_lint/ruby_parser.rb +32 -0
  63. data/lib/slim_lint/runner.rb +82 -0
  64. data/lib/slim_lint/sexp.rb +134 -0
  65. data/lib/slim_lint/sexp_visitor.rb +150 -0
  66. data/lib/slim_lint/source_location.rb +45 -0
  67. data/lib/slim_lint/utils.rb +84 -0
  68. data/lib/slim_lint/version.rb +6 -0
  69. data/lib/slim_lint.rb +55 -0
  70. metadata +218 -0
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlimLint
4
+ # Provides an interface which when included allows a class to visit nodes in
5
+ # the Sexp of a Slim document.
6
+ module SexpVisitor
7
+ # Traverse the Sexp looking for matches with registered patterns, firing
8
+ # callbacks for all matches.
9
+ #
10
+ # @param sexp [SlimLint::Sexp]
11
+ def trigger_pattern_callbacks(sexp)
12
+ return if on_start(sexp) == :stop
13
+
14
+ traverse sexp
15
+ end
16
+
17
+ # Traverse the given Sexp, firing callbacks if they are defined.
18
+ #
19
+ # @param sexp [SlimLint::Sexp]
20
+ def traverse(sexp)
21
+ patterns.each do |pattern|
22
+ next unless sexp.match?(pattern.sexp)
23
+
24
+ result = method(pattern.callback_method_name).call(sexp)
25
+
26
+ # Returning :stop indicates we should stop searching this Sexp
27
+ # (i.e. stop descending this branch of depth-first search).
28
+ # The `return` here is very intentional.
29
+ return if result == :stop # rubocop:disable Lint/NonLocalExitFromIterator
30
+ end
31
+
32
+ # Continue traversing children by default (match blocks can return `:stop`
33
+ # to not continue).
34
+ traverse_children(sexp)
35
+ end
36
+
37
+ # Traverse the children of this {Sexp}.
38
+ #
39
+ # @param sexp [SlimLint::Sexp]
40
+ def traverse_children(sexp)
41
+ sexp.each do |nested_sexp|
42
+ traverse nested_sexp if nested_sexp.is_a?(Sexp)
43
+ end
44
+ end
45
+
46
+ # Returns the map of capture names to captured values.
47
+ #
48
+ # @return [Hash, CaptureMap]
49
+ def captures
50
+ self.class.captures || {}
51
+ end
52
+
53
+ # Returns the list of registered Sexp patterns.
54
+ #
55
+ # @return [Array<SlimLint::SexpVisitor::SexpPattern>]
56
+ def patterns
57
+ self.class.patterns || []
58
+ end
59
+
60
+ # Executed before searching for any pattern matches.
61
+ #
62
+ # @param sexp [SlimLint::Sexp] see {SexpVisitor::DSL.on_start}
63
+ # @return [Symbol] see {SexpVisitor::DSL.on_start}
64
+ def on_start(*)
65
+ # Overidden by DSL.on_start
66
+ end
67
+
68
+ # Mapping of Sexp pattern to callback method name.
69
+ #
70
+ # @attr_reader sexp [Array] S-expression pattern that when matched triggers the
71
+ # callback
72
+ # @attr_reader callback_method_name [Symbol] name of the method to call when pattern is matched
73
+ SexpPattern = Struct.new(:sexp, :callback_method_name) do
74
+ def match?(expr)
75
+ expr.match?(sexp)
76
+ end
77
+ end
78
+ private_constant :SexpPattern
79
+
80
+ # Exposes a convenient Domain-specific Language (DSL) that makes declaring
81
+ # Sexp match patterns very easy.
82
+ #
83
+ # Include them with `extend SlimLint::SexpVisitor::DSL`
84
+ module DSL
85
+ # Registered patterns that this visitor will look for when traversing the
86
+ # {SlimLint::Sexp}.
87
+ attr_reader :patterns
88
+
89
+ # @return [Hash] map of capture names to captured values
90
+ attr_reader :captures
91
+
92
+ # DSL helper that defines a sexp pattern and block that will be executed if
93
+ # the given pattern is found.
94
+ #
95
+ # @param sexp_pattern [Sexp]
96
+ # @yield block to execute when the specified pattern is matched
97
+ # @yieldparam sexp [SlimLint::Sexp] Sexp that matched the pattern
98
+ # @yieldreturn [SlimLint::Sexp,Symbol,void]
99
+ # If a Sexp is returned, indicates that traversal should jump directly
100
+ # to that Sexp.
101
+ # If `:stop` is returned, halts further traversal down this branch
102
+ # (i.e. stops recursing, but traversal at higher levels will continue).
103
+ # Otherwise traversal will continue as normal.
104
+ def on(sexp_pattern, &block)
105
+ # TODO: Index Sexps on creation so we can quickly jump to potential
106
+ # matches instead of checking array.
107
+ @patterns ||= []
108
+ @pattern_number ||= 1
109
+
110
+ # Use a monotonically increasing number to identify the method so that in
111
+ # debugging we can simply look at the nth defintion in the class.
112
+ unique_method_name = :"on_pattern_#{@pattern_number}"
113
+ define_method(unique_method_name, block)
114
+
115
+ @pattern_number += 1
116
+ @patterns << SexpPattern.new(sexp_pattern, unique_method_name)
117
+ end
118
+
119
+ # Define a block of code to run before checking for any pattern matches.
120
+ #
121
+ # @yield block to execute
122
+ # @yieldparam sexp [SlimLint::Sexp] the root Sexp
123
+ # @yieldreturn [Symbol] if `:stop`, indicates that no further processing
124
+ # should occur
125
+ def on_start(&block)
126
+ define_method(:on_start, block)
127
+ end
128
+
129
+ # Represents a pattern that matches anything.
130
+ #
131
+ # @return [SlimLint::Matcher::Anything]
132
+ def anything
133
+ SlimLint::Matcher::Anything.new
134
+ end
135
+
136
+ # Represents a pattern that matches the specified matcher, storing the
137
+ # matched value in the captures list under the given name.
138
+ #
139
+ # @param capture_name [Symbol]
140
+ # @param matcher [Array, SlimLint::Matcher::Base]
141
+ # @return [SlimLint::Matcher::Capture]
142
+ def capture(capture_name, matcher)
143
+ @captures ||= SlimLint::CaptureMap.new
144
+
145
+ matcher = SexpPattern.new(matcher, nil) unless matcher.respond_to?(:match?)
146
+ @captures[capture_name] = SlimLint::Matcher::Capture.from_matcher(matcher)
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,45 @@
1
+ module SlimLint
2
+ class SourceLocation
3
+ attr_accessor :start_line, :start_column, :last_line, :last_column, :line, :column, :length
4
+
5
+ def self.merge(start, finish, length:)
6
+ new(
7
+ start_line: start.start_line,
8
+ start_column: start.start_column,
9
+ last_line: finish.start_line,
10
+ last_column: finish.start_column,
11
+ length: length
12
+ )
13
+ end
14
+
15
+ def initialize(start_line: nil, start_column: nil, last_line: nil, last_column: nil, length: nil)
16
+ @start_line = @line = start_line
17
+ @start_column = @column = start_column
18
+ @last_line = last_line || @start_line
19
+ @last_column = last_column || @start_column
20
+ @length = length || (start_line == last_line ? last_column - start_column : nil)
21
+ end
22
+
23
+ def as_json
24
+ {
25
+ line: line,
26
+ column: column,
27
+ length: length,
28
+ start_line: start_line,
29
+ start_column: start_column,
30
+ last_line: last_line,
31
+ last_column: last_column
32
+ }.compact
33
+ end
34
+
35
+ def adjust(line: 0, column: 0)
36
+ self.class.new(
37
+ length: @length,
38
+ start_line: @start_line + line,
39
+ start_column: @start_column + column,
40
+ last_line: @last_line + line,
41
+ last_column: @last_column + column
42
+ )
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlimLint
4
+ # Miscellaneus collection of helper functions.
5
+ module Utils
6
+ module_function
7
+
8
+ # Returns whether a glob pattern (or any of a list of patterns) matches the
9
+ # specified file.
10
+ #
11
+ # This is defined here so our file globbing options are consistent
12
+ # everywhere we perform globbing.
13
+ #
14
+ # @param glob [String, Array]
15
+ # @param file [String]
16
+ # @return [Boolean]
17
+ def any_glob_matches?(globs_or_glob, file)
18
+ path = File.expand_path(file)
19
+ flags = File::FNM_PATHNAME | File::FNM_DOTMATCH
20
+ Array(globs_or_glob).any? do |glob|
21
+ File.fnmatch?(File.expand_path(glob), path, flags)
22
+ end
23
+ end
24
+
25
+ # Find all consecutive items satisfying the given block of a minimum size,
26
+ # yielding each group of consecutive items to the provided block.
27
+ #
28
+ # @param items [Array]
29
+ # @param satisfies [Proc] function that takes an item and returns true/false
30
+ # @param min_consecutive [Fixnum] minimum number of consecutive items before
31
+ # yielding the group
32
+ # @yield Passes list of consecutive items all matching the criteria defined
33
+ # by the `satisfies` {Proc} to the provided block
34
+ # @yieldparam group [Array] List of consecutive items
35
+ # @yieldreturn [Boolean] block should return whether item matches criteria
36
+ # for inclusion
37
+ def for_consecutive_items(items, satisfies, min_consecutive = 2)
38
+ current_index = -1
39
+
40
+ while (current_index += 1) < items.count
41
+ next unless satisfies[items[current_index]]
42
+
43
+ count = count_consecutive(items, current_index, &satisfies)
44
+ next unless count >= min_consecutive
45
+
46
+ # Yield the chunk of consecutive items
47
+ yield items[current_index...(current_index + count)]
48
+
49
+ current_index += count # Skip this patch of consecutive items to find more
50
+ end
51
+ end
52
+
53
+ # Count the number of consecutive items satisfying the given {Proc}.
54
+ #
55
+ # @param items [Array]
56
+ # @param offset [Fixnum] index to start searching from
57
+ # @yield [item] Passes item to the provided block.
58
+ # @yieldparam item [Object] Item to evaluate as matching criteria for
59
+ # inclusion
60
+ # @yieldreturn [Boolean] whether to include the item
61
+ # @return [Integer]
62
+ def count_consecutive(items, offset = 0)
63
+ count = 1
64
+ count += 1 while (offset + count < items.count) && yield(items[offset + count])
65
+ count
66
+ end
67
+
68
+ # Calls a block of code with a modified set of environment variables,
69
+ # restoring them once the code has executed.
70
+ #
71
+ # @param env [Hash] environment variables to set
72
+ def with_environment(env)
73
+ old_env = {}
74
+ env.each do |var, value|
75
+ old_env[var] = ENV[var.to_s]
76
+ ENV[var.to_s] = value
77
+ end
78
+
79
+ yield
80
+ ensure
81
+ old_env.each { |var, value| ENV[var.to_s] = value }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the gem version.
4
+ module SlimLint
5
+ VERSION = "0.0.0"
6
+ end
data/lib/slim_lint.rb ADDED
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Load all slim-lint-standard modules necessary to parse and lint a file.
4
+ # Ordering here can be important depending on class references in each module.
5
+
6
+ # Need to load slim before we can reference some classes or define filters
7
+ require "slim"
8
+
9
+ require "slim_lint/constants"
10
+ require "slim_lint/exceptions"
11
+ require "slim_lint/configuration"
12
+ require "slim_lint/configuration_loader"
13
+ require "slim_lint/utils"
14
+ require "slim_lint/atom"
15
+ require "slim_lint/sexp"
16
+ require "slim_lint/file_finder"
17
+ require "slim_lint/linter_registry"
18
+ require "slim_lint/logger"
19
+ require "slim_lint/version"
20
+ require "slim_lint/filter"
21
+
22
+ # Load all filters (required by SlimLint::Engine)
23
+ Dir[File.expand_path("slim_lint/filters/*.rb", File.dirname(__FILE__))].sort.each do |file|
24
+ require file
25
+ end
26
+
27
+ require "slim_lint/parser"
28
+ require "slim_lint/engine"
29
+ require "slim_lint/document"
30
+ require "slim_lint/capture_map"
31
+ require "slim_lint/sexp_visitor"
32
+ require "slim_lint/source_location"
33
+ require "slim_lint/lint"
34
+ require "slim_lint/ruby_parser"
35
+ require "slim_lint/linter"
36
+ require "slim_lint/reporter"
37
+ require "slim_lint/report"
38
+ require "slim_lint/linter_selector"
39
+ require "slim_lint/runner"
40
+
41
+ # Load all matchers
42
+ require "slim_lint/matcher/base"
43
+ Dir[File.expand_path("slim_lint/matcher/*.rb", File.dirname(__FILE__))].sort.each do |file|
44
+ require file
45
+ end
46
+
47
+ # Load all linters
48
+ Dir[File.expand_path("slim_lint/linter/*.rb", File.dirname(__FILE__))].sort.each do |file|
49
+ require file
50
+ end
51
+
52
+ # Load all reporters
53
+ Dir[File.expand_path("slim_lint/reporter/*.rb", File.dirname(__FILE__))].sort.each do |file|
54
+ require file
55
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slim_lint_standard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Pieter van de Bruggen
8
+ - Shane da Silva
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2022-12-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rubocop
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 0.78.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 0.78.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: slim
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '3.0'
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '5.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '3.0'
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: pry
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.13'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.13'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: rspec-its
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: standard
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.16.1
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 1.16.1
104
+ - !ruby/object:Gem::Dependency
105
+ name: simplecov
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.21.2
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.21.2
118
+ description: Configurable tool for writing clean and consistent Slim templates
119
+ email:
120
+ - pvande@gmail.com
121
+ - shane@dasilva.io
122
+ executables:
123
+ - slim-lint-standard
124
+ extensions: []
125
+ extra_rdoc_files: []
126
+ files:
127
+ - LICENSE.md
128
+ - bin/slim-lint-standard
129
+ - config/default.yml
130
+ - lib/slim_lint.rb
131
+ - lib/slim_lint/atom.rb
132
+ - lib/slim_lint/capture_map.rb
133
+ - lib/slim_lint/cli.rb
134
+ - lib/slim_lint/configuration.rb
135
+ - lib/slim_lint/configuration_loader.rb
136
+ - lib/slim_lint/constants.rb
137
+ - lib/slim_lint/document.rb
138
+ - lib/slim_lint/engine.rb
139
+ - lib/slim_lint/exceptions.rb
140
+ - lib/slim_lint/file_finder.rb
141
+ - lib/slim_lint/filter.rb
142
+ - lib/slim_lint/filters/attribute_processor.rb
143
+ - lib/slim_lint/filters/auto_indenter.rb
144
+ - lib/slim_lint/filters/control_processor.rb
145
+ - lib/slim_lint/filters/do_inserter.rb
146
+ - lib/slim_lint/filters/end_inserter.rb
147
+ - lib/slim_lint/filters/interpolation.rb
148
+ - lib/slim_lint/filters/multi_flattener.rb
149
+ - lib/slim_lint/filters/splat_processor.rb
150
+ - lib/slim_lint/filters/static_merger.rb
151
+ - lib/slim_lint/lint.rb
152
+ - lib/slim_lint/linter.rb
153
+ - lib/slim_lint/linter/avoid_multiline_expressions.rb
154
+ - lib/slim_lint/linter/comment_control_statement.rb
155
+ - lib/slim_lint/linter/consecutive_control_statements.rb
156
+ - lib/slim_lint/linter/control_statement_spacing.rb
157
+ - lib/slim_lint/linter/dynamic_output_spacing.rb
158
+ - lib/slim_lint/linter/embedded_engines.rb
159
+ - lib/slim_lint/linter/empty_control_statement.rb
160
+ - lib/slim_lint/linter/empty_lines.rb
161
+ - lib/slim_lint/linter/file_length.rb
162
+ - lib/slim_lint/linter/line_length.rb
163
+ - lib/slim_lint/linter/redundant_div.rb
164
+ - lib/slim_lint/linter/rubocop.rb
165
+ - lib/slim_lint/linter/standard.rb
166
+ - lib/slim_lint/linter/tab.rb
167
+ - lib/slim_lint/linter/tag_case.rb
168
+ - lib/slim_lint/linter/trailing_blank_lines.rb
169
+ - lib/slim_lint/linter/trailing_whitespace.rb
170
+ - lib/slim_lint/linter_registry.rb
171
+ - lib/slim_lint/linter_selector.rb
172
+ - lib/slim_lint/logger.rb
173
+ - lib/slim_lint/matcher/anything.rb
174
+ - lib/slim_lint/matcher/base.rb
175
+ - lib/slim_lint/matcher/capture.rb
176
+ - lib/slim_lint/matcher/nothing.rb
177
+ - lib/slim_lint/options.rb
178
+ - lib/slim_lint/parser.rb
179
+ - lib/slim_lint/rake_task.rb
180
+ - lib/slim_lint/report.rb
181
+ - lib/slim_lint/reporter.rb
182
+ - lib/slim_lint/reporter/checkstyle_reporter.rb
183
+ - lib/slim_lint/reporter/default_reporter.rb
184
+ - lib/slim_lint/reporter/emacs_reporter.rb
185
+ - lib/slim_lint/reporter/json_reporter.rb
186
+ - lib/slim_lint/ruby_extract_engine.rb
187
+ - lib/slim_lint/ruby_extractor.rb
188
+ - lib/slim_lint/ruby_parser.rb
189
+ - lib/slim_lint/runner.rb
190
+ - lib/slim_lint/sexp.rb
191
+ - lib/slim_lint/sexp_visitor.rb
192
+ - lib/slim_lint/source_location.rb
193
+ - lib/slim_lint/utils.rb
194
+ - lib/slim_lint/version.rb
195
+ homepage: https://github.com/pvande/slim-lint-standard
196
+ licenses:
197
+ - MIT
198
+ metadata: {}
199
+ post_install_message:
200
+ rdoc_options: []
201
+ require_paths:
202
+ - lib
203
+ required_ruby_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: 2.6.0
208
+ required_rubygems_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ requirements: []
214
+ rubygems_version: 3.0.3.1
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: Linter for Slim templates
218
+ test_files: []