slim_lint 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/config/default.yml +2 -0
- data/lib/slim_lint/filters/attribute_processor.rb +29 -0
- data/lib/slim_lint/filters/control_processor.rb +45 -0
- data/lib/slim_lint/filters/splat_processor.rb +13 -0
- data/lib/slim_lint/linter/consecutive_control_statements.rb +8 -1
- data/lib/slim_lint/linter/rubocop.rb +4 -2
- data/lib/slim_lint/ruby_extract_engine.rb +3 -12
- data/lib/slim_lint/ruby_extractor.rb +11 -7
- data/lib/slim_lint/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3389992065a4202ee3f1541ccade01b424df4115
|
4
|
+
data.tar.gz: 27e0e7ef9d0155dd54b5729ecf237b72f4b24464
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f419a7cd896f9dec484719c95e4b7ceb6fac3b3c37cdf7432de40ce9581381256d4b108dc20da1e30391bf6128bbe3519ae6cfac6875669dac7b39e4851779ef
|
7
|
+
data.tar.gz: adc31508f162b7182d79eb81641d8ac5648f498d43f4decbbd38240fd720def57349979cfb9eba76504a9e3c4f97336b9d65fe7d9a25b14530762661a817fb28
|
data/config/default.yml
CHANGED
@@ -34,9 +34,11 @@ linters:
|
|
34
34
|
- Lint/EndAlignment
|
35
35
|
- Lint/Void
|
36
36
|
- Metrics/LineLength
|
37
|
+
- Style/AlignHash
|
37
38
|
- Style/AlignParameters
|
38
39
|
- Style/BlockNesting
|
39
40
|
- Style/FileName
|
41
|
+
- Style/FirstParameterIndentation
|
40
42
|
- Style/IfUnlessModifier
|
41
43
|
- Style/IndentationConsistency
|
42
44
|
- Style/IndentationWidth
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module SlimLint::Filters
|
2
|
+
# A dumbed-down version of {Slim::CodeAttributes} which doesn't introduce any
|
3
|
+
# temporary variables or other cruft.
|
4
|
+
class AttributeProcessor < Slim::Filter
|
5
|
+
define_options :merge_attrs
|
6
|
+
|
7
|
+
# Handle attributes expression `[:html, :attrs, *attrs]`
|
8
|
+
#
|
9
|
+
# @param attrs [Array]
|
10
|
+
# @return [Array]
|
11
|
+
def on_html_attrs(*attrs)
|
12
|
+
[:multi, *attrs.map { |a| compile(a) }]
|
13
|
+
end
|
14
|
+
|
15
|
+
# Handle attribute expression `[:html, :attr, name, value]`
|
16
|
+
#
|
17
|
+
# @param name [String] name of the attribute
|
18
|
+
# @param value [Array] Sexp representing the value
|
19
|
+
def on_html_attr(name, value)
|
20
|
+
if value[0] == :slim && value[1] == :attrvalue
|
21
|
+
code = value[3]
|
22
|
+
[:code, code]
|
23
|
+
else
|
24
|
+
@attr = name
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SlimLint::Filters
|
2
|
+
# A dumbed-down version of {Slim::Controls} which doesn't introduce temporary
|
3
|
+
# variables and other cruft (which in the context of extracting Ruby code,
|
4
|
+
# results in a lot of weird cops reported by RuboCop).
|
5
|
+
class ControlProcessor < Slim::Filter
|
6
|
+
BLOCK_RE = /\A(if|unless)\b|\bdo\s*(\|[^\|]*\|)?\s*$/
|
7
|
+
|
8
|
+
# Handle control expression `[:slim, :control, code, content]`
|
9
|
+
#
|
10
|
+
# @param code [String]
|
11
|
+
# @param content [Array]
|
12
|
+
def on_slim_control(code, content)
|
13
|
+
[:multi,
|
14
|
+
[:code, code],
|
15
|
+
compile(content)]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Handle output expression `[:slim, :output, escape, code, content]`
|
19
|
+
#
|
20
|
+
# @param _escape [Boolean]
|
21
|
+
# @param code [String]
|
22
|
+
# @param content [Array]
|
23
|
+
# @return [Array
|
24
|
+
def on_slim_output(_escape, code, content)
|
25
|
+
if code[BLOCK_RE]
|
26
|
+
[:multi,
|
27
|
+
[:code, code, compile(content)],
|
28
|
+
[:code, 'end']]
|
29
|
+
else
|
30
|
+
[:multi, [:dynamic, code], compile(content)]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Handle text expression `[:slim, :text, type, content]`
|
35
|
+
#
|
36
|
+
# @param _type [Symbol]
|
37
|
+
# @param content [Array]
|
38
|
+
# @return [Array]
|
39
|
+
def on_slim_text(_type, content)
|
40
|
+
# Ensures :newline expressions from static output are still represented in
|
41
|
+
# the final expression
|
42
|
+
compile(content)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SlimLint::Filters
|
2
|
+
# A dumbed-down version of {Slim::Splat::Filter} which doesn't introduced
|
3
|
+
# temporary variables or other cruft.
|
4
|
+
class SplatProcessor < Slim::Filter
|
5
|
+
# Handle slim splat expressions `[:slim, :splat, code]`
|
6
|
+
#
|
7
|
+
# @param code [String]
|
8
|
+
# @return [Array]
|
9
|
+
def on_slim_splat(code)
|
10
|
+
[:code, code]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -6,12 +6,19 @@ module SlimLint
|
|
6
6
|
|
7
7
|
on [:multi] do |sexp|
|
8
8
|
Utils.for_consecutive_items(sexp,
|
9
|
-
|
9
|
+
method(:flat_control_statement?),
|
10
10
|
config['max_consecutive'] + 1) do |group|
|
11
11
|
report_lint(group.first,
|
12
12
|
"#{group.count} consecutive control statements can be " \
|
13
13
|
'merged into a single `ruby:` filter')
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def flat_control_statement?(sexp)
|
20
|
+
sexp.match?([:slim, :control]) &&
|
21
|
+
sexp[3] == [:multi, [:newline]]
|
22
|
+
end
|
16
23
|
end
|
17
24
|
end
|
@@ -12,9 +12,11 @@ module SlimLint
|
|
12
12
|
processed_sexp = SlimLint::RubyExtractEngine.new.call(document.source)
|
13
13
|
|
14
14
|
extractor = SlimLint::RubyExtractor.new
|
15
|
-
|
15
|
+
extracted_source = extractor.extract(processed_sexp)
|
16
16
|
|
17
|
-
|
17
|
+
next if extracted_source.source.empty?
|
18
|
+
|
19
|
+
find_lints(extracted_source.source, extracted_source.source_map)
|
18
20
|
end
|
19
21
|
|
20
22
|
private
|
@@ -5,12 +5,6 @@ module SlimLint
|
|
5
5
|
# This is mostly copied from Slim::Engine, with some filters and generators
|
6
6
|
# omitted.
|
7
7
|
class RubyExtractEngine < Temple::Engine
|
8
|
-
define_options sort_attrs: true,
|
9
|
-
format: :xhtml,
|
10
|
-
attr_quote: '"',
|
11
|
-
merge_attrs: { 'class' => ' ' },
|
12
|
-
default_tag: 'div'
|
13
|
-
|
14
8
|
filter :Encoding
|
15
9
|
filter :RemoveBOM
|
16
10
|
|
@@ -23,14 +17,11 @@ module SlimLint
|
|
23
17
|
# matter in this case.
|
24
18
|
use Slim::Embedded
|
25
19
|
use Slim::Interpolation
|
26
|
-
use
|
20
|
+
use SlimLint::Filters::SplatProcessor
|
27
21
|
use Slim::DoInserter
|
28
22
|
use Slim::EndInserter
|
29
|
-
use
|
30
|
-
|
31
|
-
html :AttributeMerger
|
32
|
-
use Slim::CodeAttributes
|
33
|
-
filter :ControlFlow
|
23
|
+
use SlimLint::Filters::ControlProcessor
|
24
|
+
use SlimLint::Filters::AttributeProcessor
|
34
25
|
filter :MultiFlattener
|
35
26
|
filter :StaticMerger
|
36
27
|
|
@@ -30,16 +30,20 @@ module SlimLint
|
|
30
30
|
include SexpVisitor
|
31
31
|
extend SexpVisitor::DSL
|
32
32
|
|
33
|
-
#
|
34
|
-
#
|
35
|
-
|
33
|
+
# Stores the extracted source and a map of lines of generated source to the
|
34
|
+
# original source that created them.
|
35
|
+
#
|
36
|
+
# @attr_reader source [String] generated source code
|
37
|
+
# @attr_reader source_map [Hash] map of line numbers from generated source
|
38
|
+
# to original source line number
|
39
|
+
RubySource = Struct.new(:source, :source_map)
|
36
40
|
|
37
41
|
# Extracts Ruby code from Sexp representing a Slim document.
|
38
42
|
#
|
39
43
|
# @param sexp [SlimLint::Sexp]
|
40
44
|
def extract(sexp)
|
41
45
|
trigger_pattern_callbacks(sexp)
|
42
|
-
@source_lines.join("\n")
|
46
|
+
RubySource.new(@source_lines.join("\n"), @source_map)
|
43
47
|
end
|
44
48
|
|
45
49
|
on_start do |_sexp|
|
@@ -79,14 +83,14 @@ module SlimLint
|
|
79
83
|
def append(code, sexp)
|
80
84
|
return if code.empty?
|
81
85
|
|
82
|
-
@source_lines << code
|
83
86
|
original_line = sexp.line
|
84
87
|
|
85
88
|
# For code that spans multiple lines, the resulting code will span
|
86
89
|
# multiple lines, so we need to create a mapping for each line.
|
87
|
-
|
90
|
+
code.split("\n").each_with_index do |line, index|
|
91
|
+
@source_lines << line
|
88
92
|
@line_count += 1
|
89
|
-
@source_map[@line_count] = original_line
|
93
|
+
@source_map[@line_count] = original_line + index
|
90
94
|
end
|
91
95
|
end
|
92
96
|
end
|
data/lib/slim_lint/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slim_lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.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: 2015-04
|
11
|
+
date: 2015-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slim
|
@@ -101,8 +101,11 @@ files:
|
|
101
101
|
- lib/slim_lint/engine.rb
|
102
102
|
- lib/slim_lint/exceptions.rb
|
103
103
|
- lib/slim_lint/file_finder.rb
|
104
|
+
- lib/slim_lint/filters/attribute_processor.rb
|
105
|
+
- lib/slim_lint/filters/control_processor.rb
|
104
106
|
- lib/slim_lint/filters/inject_line_numbers.rb
|
105
107
|
- lib/slim_lint/filters/sexp_converter.rb
|
108
|
+
- lib/slim_lint/filters/splat_processor.rb
|
106
109
|
- lib/slim_lint/lint.rb
|
107
110
|
- lib/slim_lint/linter.rb
|
108
111
|
- lib/slim_lint/linter/comment_control_statement.rb
|
@@ -159,3 +162,4 @@ signing_key:
|
|
159
162
|
specification_version: 4
|
160
163
|
summary: Slim template linting tool
|
161
164
|
test_files: []
|
165
|
+
has_rdoc:
|