scss-lint 0.25.1 → 0.26.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 +10 -1
- data/data/property-sort-orders/concentric.txt +99 -0
- data/lib/scss_lint.rb +1 -0
- data/lib/scss_lint/cli.rb +9 -3
- data/lib/scss_lint/exceptions.rb +4 -0
- data/lib/scss_lint/linter.rb +10 -1
- data/lib/scss_lint/linter/capitalization_in_selector.rb +14 -6
- data/lib/scss_lint/linter/compass/property_with_mixin.rb +9 -2
- data/lib/scss_lint/linter/indentation.rb +28 -6
- data/lib/scss_lint/linter/property_sort_order.rb +61 -9
- data/lib/scss_lint/linter/single_line_per_property.rb +53 -0
- data/lib/scss_lint/linter/single_line_per_selector.rb +6 -1
- data/lib/scss_lint/linter/space_after_comma.rb +27 -19
- data/lib/scss_lint/linter/space_before_brace.rb +5 -4
- data/lib/scss_lint/linter/trailing_semicolon.rb +53 -0
- data/lib/scss_lint/linter/unnecessary_parent_reference.rb +36 -0
- data/lib/scss_lint/reporter/default_reporter.rb +7 -2
- data/lib/scss_lint/reporter/xml_reporter.rb +2 -1
- data/lib/scss_lint/runner.rb +7 -3
- data/lib/scss_lint/version.rb +1 -1
- data/spec/scss_lint/cli_spec.rb +314 -0
- data/spec/scss_lint/config_spec.rb +439 -0
- data/spec/scss_lint/engine_spec.rb +24 -0
- data/spec/scss_lint/linter/border_zero_spec.rb +84 -0
- data/spec/scss_lint/linter/capitalization_in_selector_spec.rb +71 -0
- data/spec/scss_lint/linter/color_keyword_spec.rb +83 -0
- data/spec/scss_lint/linter/comment_spec.rb +55 -0
- data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +55 -0
- data/spec/scss_lint/linter/debug_statement_spec.rb +21 -0
- data/spec/scss_lint/linter/declaration_order_spec.rb +94 -0
- data/spec/scss_lint/linter/duplicate_property_spec.rb +176 -0
- data/spec/scss_lint/linter/else_placement_spec.rb +106 -0
- data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +263 -0
- data/spec/scss_lint/linter/empty_rule_spec.rb +27 -0
- data/spec/scss_lint/linter/final_newline_spec.rb +49 -0
- data/spec/scss_lint/linter/hex_length_spec.rb +104 -0
- data/spec/scss_lint/linter/hex_notation_spec.rb +104 -0
- data/spec/scss_lint/linter/hex_validation_spec.rb +36 -0
- data/spec/scss_lint/linter/id_with_extraneous_selector_spec.rb +139 -0
- data/spec/scss_lint/linter/indentation_spec.rb +242 -0
- data/spec/scss_lint/linter/leading_zero_spec.rb +233 -0
- data/spec/scss_lint/linter/mergeable_selector_spec.rb +283 -0
- data/spec/scss_lint/linter/name_format_spec.rb +206 -0
- data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +63 -0
- data/spec/scss_lint/linter/property_sort_order_spec.rb +246 -0
- data/spec/scss_lint/linter/property_spelling_spec.rb +57 -0
- data/spec/scss_lint/linter/selector_depth_spec.rb +159 -0
- data/spec/scss_lint/linter/shorthand_spec.rb +172 -0
- data/spec/scss_lint/linter/single_line_per_property_spec.rb +73 -0
- data/spec/scss_lint/linter/single_line_per_selector_spec.rb +121 -0
- data/spec/scss_lint/linter/space_after_comma_spec.rb +315 -0
- data/spec/scss_lint/linter/space_after_property_colon_spec.rb +238 -0
- data/spec/scss_lint/linter/space_after_property_name_spec.rb +23 -0
- data/spec/scss_lint/linter/space_before_brace_spec.rb +447 -0
- data/spec/scss_lint/linter/space_between_parens_spec.rb +263 -0
- data/spec/scss_lint/linter/string_quotes_spec.rb +303 -0
- data/spec/scss_lint/linter/trailing_semicolon_spec.rb +188 -0
- data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +67 -0
- data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +67 -0
- data/spec/scss_lint/linter/url_format_spec.rb +55 -0
- data/spec/scss_lint/linter/url_quotes_spec.rb +63 -0
- data/spec/scss_lint/linter/zero_unit_spec.rb +113 -0
- data/spec/scss_lint/linter_registry_spec.rb +50 -0
- data/spec/scss_lint/location_spec.rb +42 -0
- data/spec/scss_lint/reporter/config_reporter_spec.rb +42 -0
- data/spec/scss_lint/reporter/default_reporter_spec.rb +73 -0
- data/spec/scss_lint/reporter/files_reporter_spec.rb +38 -0
- data/spec/scss_lint/reporter/xml_reporter_spec.rb +103 -0
- data/spec/scss_lint/reporter_spec.rb +11 -0
- data/spec/scss_lint/runner_spec.rb +132 -0
- data/spec/scss_lint/selector_visitor_spec.rb +264 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/isolated_environment.rb +25 -0
- data/spec/support/matchers/report_lint.rb +48 -0
- metadata +126 -8
- data/lib/scss_lint/linter/trailing_semicolon_after_property_value.rb +0 -40
@@ -0,0 +1,283 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SCSSLint::Linter::MergeableSelector do
|
4
|
+
context 'when single root' do
|
5
|
+
let(:css) { <<-CSS }
|
6
|
+
p {
|
7
|
+
}
|
8
|
+
CSS
|
9
|
+
|
10
|
+
it { should_not report_lint }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when different roots' do
|
14
|
+
let(:css) { <<-CSS }
|
15
|
+
p {
|
16
|
+
background: #000;
|
17
|
+
margin: 5px;
|
18
|
+
}
|
19
|
+
a {
|
20
|
+
background: #000;
|
21
|
+
margin: 5px;
|
22
|
+
}
|
23
|
+
CSS
|
24
|
+
|
25
|
+
it { should_not report_lint }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when different roots with matching inner rules' do
|
29
|
+
let(:css) { <<-CSS }
|
30
|
+
p {
|
31
|
+
background: #000;
|
32
|
+
margin: 5px;
|
33
|
+
.foo {
|
34
|
+
color: red;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
a {
|
38
|
+
background: #000;
|
39
|
+
margin: 5px;
|
40
|
+
.foo {
|
41
|
+
color: red;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
CSS
|
45
|
+
|
46
|
+
it { should_not report_lint }
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when multi-selector roots and parital rule match' do
|
50
|
+
let(:css) { <<-CSS }
|
51
|
+
p, a {
|
52
|
+
background: #000;
|
53
|
+
margin: 5px;
|
54
|
+
.foo {
|
55
|
+
color: red;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
a {
|
59
|
+
background: #000;
|
60
|
+
margin: 5px;
|
61
|
+
.foo {
|
62
|
+
color: red;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
CSS
|
66
|
+
|
67
|
+
it { should_not report_lint }
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when nested and unnested selectors match' do
|
71
|
+
let(:css) { <<-CSS }
|
72
|
+
a.current {
|
73
|
+
background: #000;
|
74
|
+
margin: 5px;
|
75
|
+
.foo {
|
76
|
+
color: red;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
a {
|
80
|
+
&.current {
|
81
|
+
background: #000;
|
82
|
+
margin: 5px;
|
83
|
+
.foo {
|
84
|
+
color: red;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
CSS
|
89
|
+
|
90
|
+
context 'when force_nesting is enabled' do
|
91
|
+
let(:linter_config) { { 'force_nesting' => true } }
|
92
|
+
it { should report_lint }
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when force_nesting is disabled' do
|
96
|
+
let(:linter_config) { { 'force_nesting' => false } }
|
97
|
+
it { should_not report_lint }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'when same class roots' do
|
102
|
+
let(:css) { <<-CSS }
|
103
|
+
.warn {
|
104
|
+
font-weight: bold;
|
105
|
+
}
|
106
|
+
.warn {
|
107
|
+
color: #f00;
|
108
|
+
@extend .warn;
|
109
|
+
a {
|
110
|
+
color: #ccc;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
CSS
|
114
|
+
|
115
|
+
it { should report_lint }
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when same compond selector roots' do
|
119
|
+
let(:css) { <<-CSS }
|
120
|
+
.warn .alert {
|
121
|
+
font-weight: bold;
|
122
|
+
}
|
123
|
+
.warn .alert {
|
124
|
+
color: #f00;
|
125
|
+
@extend .warn;
|
126
|
+
a {
|
127
|
+
color: #ccc;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
CSS
|
131
|
+
|
132
|
+
it { should report_lint }
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when same class roots separated by another class' do
|
136
|
+
let(:css) { <<-CSS }
|
137
|
+
.warn {
|
138
|
+
font-weight: bold;
|
139
|
+
}
|
140
|
+
.foo {
|
141
|
+
color: red;
|
142
|
+
}
|
143
|
+
.warn {
|
144
|
+
color: #f00;
|
145
|
+
@extend .warn;
|
146
|
+
a {
|
147
|
+
color: #ccc;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
CSS
|
151
|
+
|
152
|
+
it { should report_lint }
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when rule in a mixin @include matches a root root' do
|
156
|
+
let(:css) { <<-CSS }
|
157
|
+
p {
|
158
|
+
font-weight: bold;
|
159
|
+
}
|
160
|
+
@include enhance(small-tablet) {
|
161
|
+
p {
|
162
|
+
font-weight: normal;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
CSS
|
166
|
+
|
167
|
+
it { should_not report_lint }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'when rule in a mixin definition matches a root rule' do
|
171
|
+
let(:css) { <<-CSS }
|
172
|
+
p {
|
173
|
+
font-weight: bold;
|
174
|
+
}
|
175
|
+
@mixin my-mixin {
|
176
|
+
p {
|
177
|
+
font-weight: normal;
|
178
|
+
}
|
179
|
+
}
|
180
|
+
CSS
|
181
|
+
|
182
|
+
it { should_not report_lint }
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'when rule in a media directive matches a root rule' do
|
186
|
+
let(:css) { <<-CSS }
|
187
|
+
p {
|
188
|
+
font-weight: bold;
|
189
|
+
}
|
190
|
+
@media only screen and (min-device-pixel-ratio: 1.5) {
|
191
|
+
p {
|
192
|
+
font-weight: normal;
|
193
|
+
}
|
194
|
+
}
|
195
|
+
CSS
|
196
|
+
|
197
|
+
it { should_not report_lint }
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'when rule in a keyframes directive matches a root rule' do
|
201
|
+
let(:css) { <<-CSS }
|
202
|
+
@keyframes slideouttoleft {
|
203
|
+
from {
|
204
|
+
transform: translateX(0);
|
205
|
+
}
|
206
|
+
|
207
|
+
to {
|
208
|
+
transform: translateX(-100%);
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
@keyframes slideouttoright {
|
213
|
+
from {
|
214
|
+
transform: translateX(0);
|
215
|
+
}
|
216
|
+
|
217
|
+
to {
|
218
|
+
transform: translateX(100%);
|
219
|
+
}
|
220
|
+
}
|
221
|
+
CSS
|
222
|
+
|
223
|
+
it { should_not report_lint }
|
224
|
+
end
|
225
|
+
|
226
|
+
context 'when there are duplicate rules nested in a rule set' do
|
227
|
+
let(:css) { <<-CSS }
|
228
|
+
.foo {
|
229
|
+
.bar {
|
230
|
+
font-weight: bold;
|
231
|
+
}
|
232
|
+
.baz {
|
233
|
+
font-weight: bold;
|
234
|
+
}
|
235
|
+
.bar {
|
236
|
+
color: #ff0;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
CSS
|
240
|
+
|
241
|
+
it { should report_lint }
|
242
|
+
end
|
243
|
+
|
244
|
+
context 'when force_nesting is enabled' do
|
245
|
+
let(:linter_config) { { 'force_nesting' => true } }
|
246
|
+
|
247
|
+
context 'when one of the duplicate rules is in a comma sequence' do
|
248
|
+
let(:css) { <<-CSS }
|
249
|
+
.foo,
|
250
|
+
.bar {
|
251
|
+
color: #000;
|
252
|
+
}
|
253
|
+
.foo {
|
254
|
+
color: #f00;
|
255
|
+
}
|
256
|
+
CSS
|
257
|
+
|
258
|
+
it { should_not report_lint }
|
259
|
+
end
|
260
|
+
|
261
|
+
context 'when rules start with the same prefix but are not the same' do
|
262
|
+
let(:css) { <<-CSS }
|
263
|
+
.foo {
|
264
|
+
color: #000;
|
265
|
+
}
|
266
|
+
.foobar {
|
267
|
+
color: #f00;
|
268
|
+
}
|
269
|
+
CSS
|
270
|
+
|
271
|
+
it { should_not report_lint }
|
272
|
+
end
|
273
|
+
|
274
|
+
context 'when a rule contains interpolation' do
|
275
|
+
let(:css) { <<-CSS }
|
276
|
+
.\#{$class-name} {}
|
277
|
+
.foobar {}
|
278
|
+
CSS
|
279
|
+
|
280
|
+
it { should_not report_lint }
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SCSSLint::Linter::NameFormat do
|
4
|
+
context 'when no variable, functions, or mixin declarations exist' do
|
5
|
+
let(:css) { <<-CSS }
|
6
|
+
p {
|
7
|
+
margin: 0;
|
8
|
+
}
|
9
|
+
CSS
|
10
|
+
|
11
|
+
it { should_not report_lint }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when a variable name contains a hyphen' do
|
15
|
+
let(:css) { '$content-padding: 10px;' }
|
16
|
+
|
17
|
+
it { should_not report_lint }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when a variable name contains an underscore' do
|
21
|
+
let(:css) { '$content_padding: 10px;' }
|
22
|
+
|
23
|
+
it { should report_lint line: 1 }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when a variable name contains an uppercase character' do
|
27
|
+
let(:css) { '$contentPadding: 10px;' }
|
28
|
+
|
29
|
+
it { should report_lint line: 1 }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when a function is declared with a capital letter' do
|
33
|
+
let(:css) { <<-CSS }
|
34
|
+
@function badFunction() {
|
35
|
+
}
|
36
|
+
CSS
|
37
|
+
|
38
|
+
it { should report_lint line: 1 }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when a function is declared with an underscore' do
|
42
|
+
let(:css) { <<-CSS }
|
43
|
+
@function bad_function() {
|
44
|
+
}
|
45
|
+
CSS
|
46
|
+
|
47
|
+
it { should report_lint line: 1 }
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when a mixin is declared with a capital letter' do
|
51
|
+
let(:css) { <<-CSS }
|
52
|
+
@mixin badMixin() {
|
53
|
+
}
|
54
|
+
CSS
|
55
|
+
|
56
|
+
it { should report_lint line: 1 }
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when a mixin is declared with an underscore' do
|
60
|
+
let(:css) { <<-CSS }
|
61
|
+
@mixin bad_mixin() {
|
62
|
+
}
|
63
|
+
CSS
|
64
|
+
|
65
|
+
it { should report_lint line: 1 }
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when no invalid usages exist' do
|
69
|
+
let(:css) { <<-CSS }
|
70
|
+
p {
|
71
|
+
margin: 0;
|
72
|
+
}
|
73
|
+
CSS
|
74
|
+
|
75
|
+
it { should_not report_lint }
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when a referenced variable name has a capital letter' do
|
79
|
+
let(:css) { <<-CSS }
|
80
|
+
p {
|
81
|
+
margin: $badVar;
|
82
|
+
}
|
83
|
+
CSS
|
84
|
+
|
85
|
+
it { should report_lint line: 2 }
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when a referenced variable name has an underscore' do
|
89
|
+
let(:css) { <<-CSS }
|
90
|
+
p {
|
91
|
+
margin: $bad_var;
|
92
|
+
}
|
93
|
+
CSS
|
94
|
+
|
95
|
+
it { should report_lint line: 2 }
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when a referenced function name has a capital letter' do
|
99
|
+
let(:css) { <<-CSS }
|
100
|
+
p {
|
101
|
+
margin: badFunc();
|
102
|
+
}
|
103
|
+
CSS
|
104
|
+
|
105
|
+
it { should report_lint line: 2 }
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when a referenced function name has an underscore' do
|
109
|
+
let(:css) { <<-CSS }
|
110
|
+
p {
|
111
|
+
margin: bad_func();
|
112
|
+
}
|
113
|
+
CSS
|
114
|
+
|
115
|
+
it { should report_lint line: 2 }
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when an included mixin name has a capital letter' do
|
119
|
+
let(:css) { '@include badMixin();' }
|
120
|
+
|
121
|
+
it { should report_lint line: 1 }
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'when an included mixin name has an underscore' do
|
125
|
+
let(:css) { '@include bad_mixin();' }
|
126
|
+
|
127
|
+
it { should report_lint line: 1 }
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'when function is a transform function' do
|
131
|
+
%w[rotateX rotateY rotateZ
|
132
|
+
scaleX scaleY scaleZ
|
133
|
+
skewX skewY
|
134
|
+
translateX translateY translateZ].each do |function|
|
135
|
+
let(:css) { <<-CSS }
|
136
|
+
p {
|
137
|
+
transform: #{function}(2);
|
138
|
+
}
|
139
|
+
CSS
|
140
|
+
|
141
|
+
it { should_not report_lint }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when mixin is a transform function' do
|
146
|
+
let(:css) { <<-CSS }
|
147
|
+
p {
|
148
|
+
@include translateX(2);
|
149
|
+
}
|
150
|
+
CSS
|
151
|
+
|
152
|
+
it { should_not report_lint }
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when a mixin contains keyword arguments with underscores' do
|
156
|
+
let(:css) { '@include mixin($some_var: 4);' }
|
157
|
+
|
158
|
+
it { should report_lint }
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'when a mixin contains keyword arguments with hyphens' do
|
162
|
+
let(:css) { '@include mixin($some-var: 4);' }
|
163
|
+
|
164
|
+
it { should_not report_lint }
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when the BEM convention is specified' do
|
168
|
+
let(:linter_config) { { 'convention' => 'BEM' } }
|
169
|
+
|
170
|
+
context 'when a name contains no underscores or hyphens' do
|
171
|
+
let(:css) { '@extend %block;' }
|
172
|
+
|
173
|
+
it { should_not report_lint }
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'when a name contains a single underscore' do
|
177
|
+
let(:css) { '@extend %block_thing;' }
|
178
|
+
|
179
|
+
it { should report_lint }
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'when a name contains a single hyphen' do
|
183
|
+
let(:css) { '@extend %block-thing;' }
|
184
|
+
|
185
|
+
it { should_not report_lint }
|
186
|
+
end
|
187
|
+
|
188
|
+
context 'when a name contains a double hyphen' do
|
189
|
+
let(:css) { '@extend %block--thing;' }
|
190
|
+
|
191
|
+
it { should_not report_lint }
|
192
|
+
end
|
193
|
+
|
194
|
+
context 'when a name contains a double underscore' do
|
195
|
+
let(:css) { '@extend %block__thing;' }
|
196
|
+
|
197
|
+
it { should_not report_lint }
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'when a name contains a double underscore and double hyphen' do
|
201
|
+
let(:css) { '@extend %block--thing__word;' }
|
202
|
+
|
203
|
+
it { should_not report_lint }
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|