slim_lint 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|