scss-lint 0.15.0 → 0.16.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 +4 -0
- data/lib/scss_lint/constants.rb +1 -0
- data/lib/scss_lint/linter/empty_line_between_blocks.rb +83 -0
- data/lib/scss_lint/linter/property_spelling.rb +10 -258
- data/lib/scss_lint/linter/space_between_parens.rb +9 -2
- data/lib/scss_lint/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62de0759332c7a6b7f6875564132d5a57d279ec7
|
4
|
+
data.tar.gz: 7ddb756b1a9f1fb8ce38dfa1809e78d64cade852
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b432b1c02ea96468df966153142aee54cef52da51b184f1dab3dc019e54d6022a3e3f9ee184d70a36e2a4c928dcc41f78df7515f7d9b748b9fc1e09196aacfea
|
7
|
+
data.tar.gz: 2377c8e052114ac59e5b9b85d67a3e93d15b64a1bcbeb6109c694a6b81a9a0ffb31b3d341bcf640b70116aa8d5bcda9a2938de4e57c85b2c8d6405f20f92a67e
|
data/config/default.yml
CHANGED
@@ -24,6 +24,9 @@ linters:
|
|
24
24
|
DuplicateProperty:
|
25
25
|
enabled: true
|
26
26
|
|
27
|
+
EmptyLineBetweenBlocks:
|
28
|
+
enabled: true
|
29
|
+
|
27
30
|
EmptyRule:
|
28
31
|
enabled: true
|
29
32
|
|
@@ -45,6 +48,7 @@ linters:
|
|
45
48
|
|
46
49
|
PropertySpelling:
|
47
50
|
enabled: true
|
51
|
+
extra_properties: []
|
48
52
|
|
49
53
|
SelectorDepth:
|
50
54
|
enabled: true
|
data/lib/scss_lint/constants.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Global application constants.
|
2
2
|
module SCSSLint
|
3
3
|
SCSS_LINT_HOME = File.realpath(File.join(File.dirname(__FILE__), '..', '..'))
|
4
|
+
SCSS_LINT_DATA = File.join(SCSS_LINT_HOME, 'data')
|
4
5
|
|
5
6
|
REPO_URL = 'https://github.com/causes/scss-lint'
|
6
7
|
BUG_REPORT_URL = "#{REPO_URL}/issues"
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
# Reports the lack of empty lines between block defintions.
|
3
|
+
class Linter::EmptyLineBetweenBlocks < Linter
|
4
|
+
include LinterRegistry
|
5
|
+
|
6
|
+
def visit_function(node)
|
7
|
+
check(node, '@function')
|
8
|
+
yield
|
9
|
+
end
|
10
|
+
|
11
|
+
def visit_mixin(node)
|
12
|
+
# Ignore @includes which don't have any block content
|
13
|
+
check(node, '@include') if node.children
|
14
|
+
.any? { |child| child.is_a?(Sass::Tree::Node) }
|
15
|
+
yield
|
16
|
+
end
|
17
|
+
|
18
|
+
def visit_mixindef(node)
|
19
|
+
check(node, '@mixin')
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
|
23
|
+
def visit_rule(node)
|
24
|
+
check(node, 'Rule')
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
MESSAGE_FORMAT = '%s declaration should be %s by an empty line'
|
31
|
+
|
32
|
+
def check(node, type)
|
33
|
+
check_preceding_node(node, type)
|
34
|
+
check_following_node(node, type)
|
35
|
+
end
|
36
|
+
|
37
|
+
def check_following_node(node, type)
|
38
|
+
if (following_node = next_node(node)) && (next_start_line = following_node.line)
|
39
|
+
unless engine.lines[next_start_line - 2].strip.empty?
|
40
|
+
add_lint(next_start_line - 1, MESSAGE_FORMAT % [type, 'followed'])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# In cases where the previous node is not a block declaration, we won't
|
46
|
+
# have run any checks against it, so we need to check here if the previous
|
47
|
+
# line is an empty line
|
48
|
+
def check_preceding_node(node, type)
|
49
|
+
case prev_node(node)
|
50
|
+
when
|
51
|
+
nil,
|
52
|
+
Sass::Tree::FunctionNode,
|
53
|
+
Sass::Tree::MixinNode,
|
54
|
+
Sass::Tree::MixinDefNode,
|
55
|
+
Sass::Tree::RuleNode,
|
56
|
+
Sass::Tree::CommentNode
|
57
|
+
# Ignore
|
58
|
+
else
|
59
|
+
unless engine.lines[node.line - 2].strip.empty?
|
60
|
+
add_lint(node.line, MESSAGE_FORMAT % [type, 'preceded'])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def next_node(node)
|
66
|
+
return unless siblings = node_siblings(node)
|
67
|
+
siblings[siblings.index(node) + 1] if siblings.count > 1
|
68
|
+
end
|
69
|
+
|
70
|
+
def prev_node(node)
|
71
|
+
return unless siblings = node_siblings(node)
|
72
|
+
index = siblings.index(node)
|
73
|
+
siblings[index - 1] if index > 0 && siblings.count > 1
|
74
|
+
end
|
75
|
+
|
76
|
+
def node_siblings(node)
|
77
|
+
return unless node && node.node_parent
|
78
|
+
node.node_parent
|
79
|
+
.children
|
80
|
+
.select { |child| child.is_a?(Sass::Tree::Node) }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -3,6 +3,11 @@ module SCSSLint
|
|
3
3
|
class Linter::PropertySpelling < Linter
|
4
4
|
include LinterRegistry
|
5
5
|
|
6
|
+
def visit_root(node)
|
7
|
+
@extra_properties = config['extra_properties'].to_set
|
8
|
+
yield # Continue linting children
|
9
|
+
end
|
10
|
+
|
6
11
|
def visit_prop(node)
|
7
12
|
# Ignore properties with interpolation
|
8
13
|
return if node.name.count > 1 || !node.name.first.is_a?(String)
|
@@ -12,269 +17,16 @@ module SCSSLint
|
|
12
17
|
# Ignore vendor-prefixed properties
|
13
18
|
return if name.start_with?('-')
|
14
19
|
|
15
|
-
unless KNOWN_PROPERTIES.include?(name)
|
20
|
+
unless KNOWN_PROPERTIES.include?(name) || @extra_properties.include?(name)
|
16
21
|
add_lint(node, "Unknown property #{name}")
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
20
25
|
private
|
21
26
|
|
22
|
-
KNOWN_PROPERTIES =
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
animation
|
27
|
-
animation-delay
|
28
|
-
animation-direction
|
29
|
-
animation-duration
|
30
|
-
animation-fill-mode
|
31
|
-
animation-iteration-count
|
32
|
-
animation-name
|
33
|
-
animation-play-state
|
34
|
-
animation-timing-function
|
35
|
-
appearance
|
36
|
-
backface-visibility
|
37
|
-
background
|
38
|
-
background-attachment
|
39
|
-
background-clip
|
40
|
-
background-color
|
41
|
-
background-image
|
42
|
-
background-origin
|
43
|
-
background-position
|
44
|
-
background-repeat
|
45
|
-
background-size
|
46
|
-
baseline-shift
|
47
|
-
bookmark-label
|
48
|
-
bookmark-level
|
49
|
-
bookmark-target
|
50
|
-
border
|
51
|
-
border-bottom
|
52
|
-
border-bottom-color
|
53
|
-
border-bottom-left-radius
|
54
|
-
border-bottom-right-radius
|
55
|
-
border-bottom-style
|
56
|
-
border-bottom-width
|
57
|
-
border-collapse
|
58
|
-
border-color
|
59
|
-
border-image
|
60
|
-
border-image-outset
|
61
|
-
border-image-repeat
|
62
|
-
border-image-slice
|
63
|
-
border-image-source
|
64
|
-
border-image-width
|
65
|
-
border-left
|
66
|
-
border-left-color
|
67
|
-
border-left-style
|
68
|
-
border-left-width
|
69
|
-
border-radius
|
70
|
-
border-right
|
71
|
-
border-right-color
|
72
|
-
border-right-style
|
73
|
-
border-right-width
|
74
|
-
border-spacing
|
75
|
-
border-style
|
76
|
-
border-top
|
77
|
-
border-top-color
|
78
|
-
border-top-left-radius
|
79
|
-
border-top-right-radius
|
80
|
-
border-top-style
|
81
|
-
border-top-width
|
82
|
-
border-width
|
83
|
-
bottom
|
84
|
-
box-align
|
85
|
-
box-decoration-break
|
86
|
-
box-direction
|
87
|
-
box-flex
|
88
|
-
box-flex-group
|
89
|
-
box-lines
|
90
|
-
box-ordinal-group
|
91
|
-
box-orient
|
92
|
-
box-pack
|
93
|
-
box-shadow
|
94
|
-
box-sizing
|
95
|
-
caption-side
|
96
|
-
clear
|
97
|
-
clip
|
98
|
-
color
|
99
|
-
color-profile
|
100
|
-
column-count
|
101
|
-
column-fill
|
102
|
-
column-gap
|
103
|
-
column-rule
|
104
|
-
column-rule-color
|
105
|
-
column-rule-style
|
106
|
-
column-rule-width
|
107
|
-
column-span
|
108
|
-
column-width
|
109
|
-
columns
|
110
|
-
content
|
111
|
-
counter-increment
|
112
|
-
counter-reset
|
113
|
-
crop
|
114
|
-
cursor
|
115
|
-
direction
|
116
|
-
display
|
117
|
-
dominant-baseline
|
118
|
-
drop-initial-after-adjust
|
119
|
-
drop-initial-after-align
|
120
|
-
drop-initial-before-adjust
|
121
|
-
drop-initial-before-align
|
122
|
-
drop-initial-size
|
123
|
-
drop-initial-value
|
124
|
-
empty-cells
|
125
|
-
fill
|
126
|
-
filter
|
127
|
-
fit
|
128
|
-
fit-position
|
129
|
-
float
|
130
|
-
float-offset
|
131
|
-
font
|
132
|
-
font-family
|
133
|
-
font-size
|
134
|
-
font-size-adjust
|
135
|
-
font-stretch
|
136
|
-
font-style
|
137
|
-
font-variant
|
138
|
-
font-weight
|
139
|
-
grid-columns
|
140
|
-
grid-rows
|
141
|
-
hanging-punctuation
|
142
|
-
height
|
143
|
-
hyphenate-after
|
144
|
-
hyphenate-before
|
145
|
-
hyphenate-character
|
146
|
-
hyphenate-lines
|
147
|
-
hyphenate-resource
|
148
|
-
hyphens
|
149
|
-
icon
|
150
|
-
image-orientation
|
151
|
-
image-resolution
|
152
|
-
inline-box-align
|
153
|
-
left
|
154
|
-
letter-spacing
|
155
|
-
line-height
|
156
|
-
line-stacking
|
157
|
-
line-stacking-ruby
|
158
|
-
line-stacking-shift
|
159
|
-
line-stacking-strategy
|
160
|
-
list-style
|
161
|
-
list-style-image
|
162
|
-
list-style-position
|
163
|
-
list-style-type
|
164
|
-
margin
|
165
|
-
margin-bottom
|
166
|
-
margin-left
|
167
|
-
margin-right
|
168
|
-
margin-top
|
169
|
-
mark
|
170
|
-
mark-after
|
171
|
-
mark-before
|
172
|
-
marks
|
173
|
-
marquee-direction
|
174
|
-
marquee-play-count
|
175
|
-
marquee-speed
|
176
|
-
marquee-style
|
177
|
-
max-height
|
178
|
-
max-width
|
179
|
-
min-height
|
180
|
-
min-width
|
181
|
-
move-to
|
182
|
-
nav-down
|
183
|
-
nav-index
|
184
|
-
nav-left
|
185
|
-
nav-right
|
186
|
-
nav-up
|
187
|
-
opacity
|
188
|
-
orphans
|
189
|
-
outline
|
190
|
-
outline-color
|
191
|
-
outline-offset
|
192
|
-
outline-style
|
193
|
-
outline-width
|
194
|
-
overflow
|
195
|
-
overflow-style
|
196
|
-
overflow-x
|
197
|
-
overflow-y
|
198
|
-
padding
|
199
|
-
padding-bottom
|
200
|
-
padding-left
|
201
|
-
padding-right
|
202
|
-
padding-top
|
203
|
-
page
|
204
|
-
page-break-after
|
205
|
-
page-break-before
|
206
|
-
page-break-inside
|
207
|
-
page-policy
|
208
|
-
perspective
|
209
|
-
perspective-origin
|
210
|
-
phonemes
|
211
|
-
pointer-events
|
212
|
-
position
|
213
|
-
punctuation-trim
|
214
|
-
quotes
|
215
|
-
rendering-intent
|
216
|
-
resize
|
217
|
-
rest
|
218
|
-
rest-after
|
219
|
-
rest-before
|
220
|
-
right
|
221
|
-
rotation
|
222
|
-
rotation-point
|
223
|
-
ruby-align
|
224
|
-
ruby-overhang
|
225
|
-
ruby-position
|
226
|
-
ruby-span
|
227
|
-
shape-rendering
|
228
|
-
size
|
229
|
-
speak
|
230
|
-
src
|
231
|
-
stroke
|
232
|
-
stroke-width
|
233
|
-
string-set
|
234
|
-
table-layout
|
235
|
-
target
|
236
|
-
target-name
|
237
|
-
target-new
|
238
|
-
target-position
|
239
|
-
text-align
|
240
|
-
text-align-last
|
241
|
-
text-decoration
|
242
|
-
text-height
|
243
|
-
text-indent
|
244
|
-
text-justify
|
245
|
-
text-outline
|
246
|
-
text-overflow
|
247
|
-
text-rendering
|
248
|
-
text-shadow
|
249
|
-
text-transform
|
250
|
-
text-wrap
|
251
|
-
top
|
252
|
-
transform
|
253
|
-
transform-origin
|
254
|
-
transform-style
|
255
|
-
transition
|
256
|
-
transition-delay
|
257
|
-
transition-duration
|
258
|
-
transition-property
|
259
|
-
transition-timing-function
|
260
|
-
unicode-bidi
|
261
|
-
vertical-align
|
262
|
-
visibility
|
263
|
-
voice-balance
|
264
|
-
voice-duration
|
265
|
-
voice-pitch
|
266
|
-
voice-pitch-range
|
267
|
-
voice-rate
|
268
|
-
voice-stress
|
269
|
-
voice-volume
|
270
|
-
white-space
|
271
|
-
widows
|
272
|
-
width
|
273
|
-
word-break
|
274
|
-
word-spacing
|
275
|
-
word-wrap
|
276
|
-
z-index
|
277
|
-
zoom
|
278
|
-
]
|
27
|
+
KNOWN_PROPERTIES = File.open(File.join(SCSS_LINT_DATA, 'properties.txt'))
|
28
|
+
.read
|
29
|
+
.split
|
30
|
+
.to_set
|
279
31
|
end
|
280
32
|
end
|
@@ -6,8 +6,15 @@ module SCSSLint
|
|
6
6
|
def visit_root(node)
|
7
7
|
@spaces = config['spaces']
|
8
8
|
engine.lines.each_with_index do |line, index|
|
9
|
-
line.scan
|
10
|
-
|
9
|
+
line.scan(/
|
10
|
+
(^(\t|\s)*\))? # Capture leading spaces and tabs followed by a `)`
|
11
|
+
(
|
12
|
+
\([ ]*(?!$) # Find `( ` as long as its not EOL )
|
13
|
+
|
|
14
|
+
[ ]*\)
|
15
|
+
)?
|
16
|
+
/x) do |match|
|
17
|
+
check(match[2], index, engine) if match[2]
|
11
18
|
end
|
12
19
|
end
|
13
20
|
end
|
data/lib/scss_lint/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scss-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Causes Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: colorize
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- lib/scss_lint/linter/trailing_semicolon_after_property_value.rb
|
101
101
|
- lib/scss_lint/linter/shorthand.rb
|
102
102
|
- lib/scss_lint/linter/id_with_extraneous_selector.rb
|
103
|
+
- lib/scss_lint/linter/empty_line_between_blocks.rb
|
103
104
|
- lib/scss_lint/linter/declaration_order.rb
|
104
105
|
- lib/scss_lint/linter/zero_unit.rb
|
105
106
|
- lib/scss_lint/linter/placeholder_in_extend.rb
|