scss_lint 0.38.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 (157) hide show
  1. checksums.yaml +7 -0
  2. data/bin/scss-lint +6 -0
  3. data/config/default.yml +205 -0
  4. data/data/prefixed-identifiers/base.txt +107 -0
  5. data/data/prefixed-identifiers/bourbon.txt +71 -0
  6. data/data/properties.txt +477 -0
  7. data/data/property-sort-orders/concentric.txt +134 -0
  8. data/data/property-sort-orders/recess.txt +149 -0
  9. data/data/property-sort-orders/smacss.txt +137 -0
  10. data/lib/scss_lint.rb +31 -0
  11. data/lib/scss_lint/cli.rb +215 -0
  12. data/lib/scss_lint/config.rb +251 -0
  13. data/lib/scss_lint/constants.rb +8 -0
  14. data/lib/scss_lint/control_comment_processor.rb +126 -0
  15. data/lib/scss_lint/engine.rb +56 -0
  16. data/lib/scss_lint/exceptions.rb +21 -0
  17. data/lib/scss_lint/file_finder.rb +68 -0
  18. data/lib/scss_lint/lint.rb +24 -0
  19. data/lib/scss_lint/linter.rb +161 -0
  20. data/lib/scss_lint/linter/bang_format.rb +52 -0
  21. data/lib/scss_lint/linter/border_zero.rb +39 -0
  22. data/lib/scss_lint/linter/color_keyword.rb +32 -0
  23. data/lib/scss_lint/linter/color_variable.rb +60 -0
  24. data/lib/scss_lint/linter/comment.rb +21 -0
  25. data/lib/scss_lint/linter/compass.rb +7 -0
  26. data/lib/scss_lint/linter/compass/property_with_mixin.rb +47 -0
  27. data/lib/scss_lint/linter/debug_statement.rb +10 -0
  28. data/lib/scss_lint/linter/declaration_order.rb +71 -0
  29. data/lib/scss_lint/linter/duplicate_property.rb +58 -0
  30. data/lib/scss_lint/linter/else_placement.rb +48 -0
  31. data/lib/scss_lint/linter/empty_line_between_blocks.rb +85 -0
  32. data/lib/scss_lint/linter/empty_rule.rb +11 -0
  33. data/lib/scss_lint/linter/final_newline.rb +20 -0
  34. data/lib/scss_lint/linter/hex_length.rb +56 -0
  35. data/lib/scss_lint/linter/hex_notation.rb +38 -0
  36. data/lib/scss_lint/linter/hex_validation.rb +23 -0
  37. data/lib/scss_lint/linter/id_selector.rb +10 -0
  38. data/lib/scss_lint/linter/import_path.rb +62 -0
  39. data/lib/scss_lint/linter/important_rule.rb +12 -0
  40. data/lib/scss_lint/linter/indentation.rb +197 -0
  41. data/lib/scss_lint/linter/leading_zero.rb +49 -0
  42. data/lib/scss_lint/linter/mergeable_selector.rb +60 -0
  43. data/lib/scss_lint/linter/name_format.rb +117 -0
  44. data/lib/scss_lint/linter/nesting_depth.rb +24 -0
  45. data/lib/scss_lint/linter/placeholder_in_extend.rb +22 -0
  46. data/lib/scss_lint/linter/property_count.rb +44 -0
  47. data/lib/scss_lint/linter/property_sort_order.rb +198 -0
  48. data/lib/scss_lint/linter/property_spelling.rb +49 -0
  49. data/lib/scss_lint/linter/property_units.rb +59 -0
  50. data/lib/scss_lint/linter/qualifying_element.rb +42 -0
  51. data/lib/scss_lint/linter/selector_depth.rb +64 -0
  52. data/lib/scss_lint/linter/selector_format.rb +102 -0
  53. data/lib/scss_lint/linter/shorthand.rb +139 -0
  54. data/lib/scss_lint/linter/single_line_per_property.rb +59 -0
  55. data/lib/scss_lint/linter/single_line_per_selector.rb +35 -0
  56. data/lib/scss_lint/linter/space_after_comma.rb +110 -0
  57. data/lib/scss_lint/linter/space_after_property_colon.rb +92 -0
  58. data/lib/scss_lint/linter/space_after_property_name.rb +27 -0
  59. data/lib/scss_lint/linter/space_before_brace.rb +72 -0
  60. data/lib/scss_lint/linter/space_between_parens.rb +35 -0
  61. data/lib/scss_lint/linter/string_quotes.rb +94 -0
  62. data/lib/scss_lint/linter/trailing_semicolon.rb +67 -0
  63. data/lib/scss_lint/linter/trailing_zero.rb +41 -0
  64. data/lib/scss_lint/linter/unnecessary_mantissa.rb +42 -0
  65. data/lib/scss_lint/linter/unnecessary_parent_reference.rb +49 -0
  66. data/lib/scss_lint/linter/url_format.rb +56 -0
  67. data/lib/scss_lint/linter/url_quotes.rb +27 -0
  68. data/lib/scss_lint/linter/variable_for_property.rb +30 -0
  69. data/lib/scss_lint/linter/vendor_prefix.rb +64 -0
  70. data/lib/scss_lint/linter/zero_unit.rb +39 -0
  71. data/lib/scss_lint/linter_registry.rb +26 -0
  72. data/lib/scss_lint/location.rb +38 -0
  73. data/lib/scss_lint/options.rb +109 -0
  74. data/lib/scss_lint/rake_task.rb +106 -0
  75. data/lib/scss_lint/reporter.rb +18 -0
  76. data/lib/scss_lint/reporter/config_reporter.rb +26 -0
  77. data/lib/scss_lint/reporter/default_reporter.rb +27 -0
  78. data/lib/scss_lint/reporter/files_reporter.rb +8 -0
  79. data/lib/scss_lint/reporter/json_reporter.rb +30 -0
  80. data/lib/scss_lint/reporter/xml_reporter.rb +33 -0
  81. data/lib/scss_lint/runner.rb +51 -0
  82. data/lib/scss_lint/sass/script.rb +78 -0
  83. data/lib/scss_lint/sass/tree.rb +168 -0
  84. data/lib/scss_lint/selector_visitor.rb +34 -0
  85. data/lib/scss_lint/utils.rb +112 -0
  86. data/lib/scss_lint/version.rb +4 -0
  87. data/spec/scss_lint/cli_spec.rb +177 -0
  88. data/spec/scss_lint/config_spec.rb +253 -0
  89. data/spec/scss_lint/engine_spec.rb +24 -0
  90. data/spec/scss_lint/file_finder_spec.rb +134 -0
  91. data/spec/scss_lint/linter/bang_format_spec.rb +121 -0
  92. data/spec/scss_lint/linter/border_zero_spec.rb +118 -0
  93. data/spec/scss_lint/linter/color_keyword_spec.rb +83 -0
  94. data/spec/scss_lint/linter/color_variable_spec.rb +155 -0
  95. data/spec/scss_lint/linter/comment_spec.rb +79 -0
  96. data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +55 -0
  97. data/spec/scss_lint/linter/debug_statement_spec.rb +21 -0
  98. data/spec/scss_lint/linter/declaration_order_spec.rb +575 -0
  99. data/spec/scss_lint/linter/duplicate_property_spec.rb +189 -0
  100. data/spec/scss_lint/linter/else_placement_spec.rb +106 -0
  101. data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +276 -0
  102. data/spec/scss_lint/linter/empty_rule_spec.rb +27 -0
  103. data/spec/scss_lint/linter/final_newline_spec.rb +49 -0
  104. data/spec/scss_lint/linter/hex_length_spec.rb +104 -0
  105. data/spec/scss_lint/linter/hex_notation_spec.rb +104 -0
  106. data/spec/scss_lint/linter/hex_validation_spec.rb +40 -0
  107. data/spec/scss_lint/linter/id_selector_spec.rb +62 -0
  108. data/spec/scss_lint/linter/import_path_spec.rb +300 -0
  109. data/spec/scss_lint/linter/important_rule_spec.rb +43 -0
  110. data/spec/scss_lint/linter/indentation_spec.rb +347 -0
  111. data/spec/scss_lint/linter/leading_zero_spec.rb +233 -0
  112. data/spec/scss_lint/linter/mergeable_selector_spec.rb +283 -0
  113. data/spec/scss_lint/linter/name_format_spec.rb +282 -0
  114. data/spec/scss_lint/linter/nesting_depth_spec.rb +114 -0
  115. data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +63 -0
  116. data/spec/scss_lint/linter/property_count_spec.rb +104 -0
  117. data/spec/scss_lint/linter/property_sort_order_spec.rb +482 -0
  118. data/spec/scss_lint/linter/property_spelling_spec.rb +84 -0
  119. data/spec/scss_lint/linter/property_units_spec.rb +229 -0
  120. data/spec/scss_lint/linter/qualifying_element_spec.rb +125 -0
  121. data/spec/scss_lint/linter/selector_depth_spec.rb +159 -0
  122. data/spec/scss_lint/linter/selector_format_spec.rb +632 -0
  123. data/spec/scss_lint/linter/shorthand_spec.rb +198 -0
  124. data/spec/scss_lint/linter/single_line_per_property_spec.rb +73 -0
  125. data/spec/scss_lint/linter/single_line_per_selector_spec.rb +130 -0
  126. data/spec/scss_lint/linter/space_after_comma_spec.rb +332 -0
  127. data/spec/scss_lint/linter/space_after_property_colon_spec.rb +373 -0
  128. data/spec/scss_lint/linter/space_after_property_name_spec.rb +37 -0
  129. data/spec/scss_lint/linter/space_before_brace_spec.rb +829 -0
  130. data/spec/scss_lint/linter/space_between_parens_spec.rb +263 -0
  131. data/spec/scss_lint/linter/string_quotes_spec.rb +335 -0
  132. data/spec/scss_lint/linter/trailing_semicolon_spec.rb +304 -0
  133. data/spec/scss_lint/linter/trailing_zero_spec.rb +176 -0
  134. data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +67 -0
  135. data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +98 -0
  136. data/spec/scss_lint/linter/url_format_spec.rb +55 -0
  137. data/spec/scss_lint/linter/url_quotes_spec.rb +73 -0
  138. data/spec/scss_lint/linter/variable_for_property_spec.rb +145 -0
  139. data/spec/scss_lint/linter/vendor_prefix_spec.rb +371 -0
  140. data/spec/scss_lint/linter/zero_unit_spec.rb +113 -0
  141. data/spec/scss_lint/linter_registry_spec.rb +50 -0
  142. data/spec/scss_lint/linter_spec.rb +292 -0
  143. data/spec/scss_lint/location_spec.rb +42 -0
  144. data/spec/scss_lint/options_spec.rb +34 -0
  145. data/spec/scss_lint/rake_task_spec.rb +43 -0
  146. data/spec/scss_lint/reporter/config_reporter_spec.rb +42 -0
  147. data/spec/scss_lint/reporter/default_reporter_spec.rb +73 -0
  148. data/spec/scss_lint/reporter/files_reporter_spec.rb +38 -0
  149. data/spec/scss_lint/reporter/json_reporter_spec.rb +96 -0
  150. data/spec/scss_lint/reporter/xml_reporter_spec.rb +103 -0
  151. data/spec/scss_lint/reporter_spec.rb +11 -0
  152. data/spec/scss_lint/runner_spec.rb +123 -0
  153. data/spec/scss_lint/selector_visitor_spec.rb +264 -0
  154. data/spec/spec_helper.rb +34 -0
  155. data/spec/support/isolated_environment.rb +25 -0
  156. data/spec/support/matchers/report_lint.rb +48 -0
  157. metadata +328 -0
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::ZeroUnit do
4
+ context 'when no properties exist' do
5
+ let(:scss) { <<-SCSS }
6
+ p {
7
+ }
8
+ SCSS
9
+
10
+ it { should_not report_lint }
11
+ end
12
+
13
+ context 'when properties with unit-less zeros exist' do
14
+ let(:scss) { <<-SCSS }
15
+ p {
16
+ margin: 0;
17
+ }
18
+ SCSS
19
+
20
+ it { should_not report_lint }
21
+ end
22
+
23
+ context 'when properties with non-zero values exist' do
24
+ let(:scss) { <<-SCSS }
25
+ p {
26
+ margin: 5px;
27
+ line-height: 1.5em;
28
+ }
29
+ SCSS
30
+
31
+ it { should_not report_lint }
32
+ end
33
+
34
+ context 'when properties with zero values contain units' do
35
+ let(:scss) { <<-SCSS }
36
+ p {
37
+ margin: 0px;
38
+ }
39
+ SCSS
40
+
41
+ it { should report_lint line: 2 }
42
+ end
43
+
44
+ context 'when properties with multiple zero values containing units exist' do
45
+ let(:scss) { <<-SCSS }
46
+ p {
47
+ margin: 5em 0em 2em 0px;
48
+ }
49
+ SCSS
50
+
51
+ it { should report_lint line: 2, count: 2 }
52
+ end
53
+
54
+ context 'when function call contains a zero value with units' do
55
+ let(:scss) { <<-SCSS }
56
+ p {
57
+ margin: some-function(0em);
58
+ }
59
+ SCSS
60
+
61
+ it { should report_lint line: 2 }
62
+ end
63
+
64
+ context 'when mixin include contains a zero value with units' do
65
+ let(:scss) { <<-SCSS }
66
+ p {
67
+ @include some-mixin(0em);
68
+ }
69
+ SCSS
70
+
71
+ it { should report_lint line: 2 }
72
+ end
73
+
74
+ context 'when string contains a zero value with units' do
75
+ let(:scss) { <<-SCSS }
76
+ p {
77
+ content: func("0em");
78
+ }
79
+ SCSS
80
+
81
+ it { should_not report_lint }
82
+ end
83
+
84
+ context 'when property value has a ".0" fractional component' do
85
+ let(:scss) { <<-SCSS }
86
+ p {
87
+ margin: 4.0em;
88
+ }
89
+ SCSS
90
+
91
+ it { should_not report_lint }
92
+ end
93
+
94
+ context 'when property value has a color hex with a leading 0' do
95
+ let(:scss) { <<-SCSS }
96
+ p {
97
+ color: #0af;
98
+ }
99
+ SCSS
100
+
101
+ it { should_not report_lint }
102
+ end
103
+
104
+ context 'when property with zero value is a dimension' do
105
+ let(:scss) { <<-SCSS }
106
+ p {
107
+ transition-delay: 0s;
108
+ }
109
+ SCSS
110
+
111
+ it { should_not report_lint }
112
+ end
113
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::LinterRegistry do
4
+ context 'when including the LinterRegistry module' do
5
+ after do
6
+ described_class.linters.delete(FakeLinter)
7
+ end
8
+
9
+ it 'adds the linter to the set of registered linters' do
10
+ expect do
11
+ class FakeLinter < SCSSLint::Linter
12
+ include SCSSLint::LinterRegistry
13
+ end
14
+ end.to change { described_class.linters.count }.by(1)
15
+ end
16
+ end
17
+
18
+ describe '.extract_linters_from' do
19
+ module SCSSLint
20
+ class Linter::SomeLinter < Linter; end
21
+ class Linter::SomeOtherLinter < Linter; end
22
+ end
23
+
24
+ let(:linters) do
25
+ [SCSSLint::Linter::SomeLinter, SCSSLint::Linter::SomeOtherLinter]
26
+ end
27
+
28
+ before do
29
+ described_class.stub(:linters).and_return(linters)
30
+ end
31
+
32
+ context 'when the linters exist' do
33
+ let(:linter_names) { %w[SomeLinter SomeOtherLinter] }
34
+
35
+ it 'returns the linters' do
36
+ subject.extract_linters_from(linter_names).should == linters
37
+ end
38
+ end
39
+
40
+ context "when the linters don't exist" do
41
+ let(:linter_names) { ['SomeRandomLinter'] }
42
+
43
+ it 'raises an error' do
44
+ expect do
45
+ subject.extract_linters_from(linter_names)
46
+ end.to raise_error(SCSSLint::NoSuchLinter)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,292 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter do
4
+ describe 'control comments' do
5
+ let(:linter_config) { {} }
6
+ subject { SCSSLint::Linter::Fake.new }
7
+
8
+ module SCSSLint
9
+ class Linter::Fake < SCSSLint::Linter
10
+ def visit_prop(node)
11
+ return unless node.value.to_sass.strip == 'fail1'
12
+ add_lint(node, 'everything offends me')
13
+ end
14
+
15
+ def visit_class(klass)
16
+ return unless klass.to_s == '.badClass'
17
+ add_lint(klass, 'a bad class was used')
18
+ end
19
+
20
+ # Bypasses the visit order so a control comment might not be reached before a lint is
21
+ # added
22
+ def visit_rule(node)
23
+ node.children
24
+ .select { |child| child.is_a?(Sass::Tree::PropNode) }
25
+ .reject { |prop| prop.name.any? { |item| item.is_a?(Sass::Script::Node) } }
26
+ .each do |prop|
27
+ add_lint(prop, 'everything offends me 2') if prop.value.to_sass.strip == 'fail2'
28
+ end
29
+
30
+ yield
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'when a disable is not present' do
36
+ let(:scss) { <<-SCSS }
37
+ p {
38
+ border: fail1;
39
+
40
+ a {
41
+ border: fail1;
42
+ }
43
+ }
44
+ SCSS
45
+
46
+ it { should report_lint }
47
+ end
48
+
49
+ context 'when a disable is present at the top level' do
50
+ let(:scss) { <<-SCSS }
51
+ // scss-lint:disable Fake
52
+ p {
53
+ border: fail1;
54
+
55
+ a {
56
+ border: fail1;
57
+ }
58
+ }
59
+ SCSS
60
+
61
+ it { should_not report_lint }
62
+ end
63
+
64
+ context 'when a disable is present at the top level for another linter' do
65
+ let(:scss) { <<-SCSS }
66
+ // scss-lint:disable Bogus
67
+ p {
68
+ border: fail1;
69
+ }
70
+ p {
71
+ border: bogus;
72
+ }
73
+ SCSS
74
+
75
+ it { should report_lint lint: 3 }
76
+ end
77
+
78
+ context 'when a linter is disabled then enabled again' do
79
+ let(:scss) { <<-SCSS }
80
+ // scss-lint:disable Fake
81
+ p {
82
+ border: fail1;
83
+ }
84
+ // scss-lint:enable Fake
85
+ p {
86
+ border: fail1;
87
+ }
88
+ SCSS
89
+
90
+ it { should_not report_lint line: 3 }
91
+ it { should report_lint line: 7 }
92
+ end
93
+
94
+ context 'when a linter is disabled within a rule' do
95
+ let(:scss) { <<-SCSS }
96
+ p {
97
+ // scss-lint:disable Fake
98
+ border: fail1;
99
+
100
+ a {
101
+ border: fail1;
102
+ }
103
+ }
104
+
105
+ p {
106
+ border: fail1;
107
+ }
108
+ SCSS
109
+
110
+ it { should_not report_lint line: 3 }
111
+ it { should_not report_lint line: 6 }
112
+ it { should report_lint line: 11 }
113
+ end
114
+
115
+ context 'when more than one linter is disabled' do
116
+ let(:scss) { <<-SCSS }
117
+ // scss-lint:disable Bogus, Fake
118
+ p {
119
+ border: fail1;
120
+ }
121
+
122
+ p {
123
+ border: bogus;
124
+ }
125
+ SCSS
126
+
127
+ it { should_not report_lint }
128
+ end
129
+
130
+ context 'when more than one linter is disabled without spaces between the linter names' do
131
+ let(:scss) { <<-SCSS }
132
+ // scss-lint:disable Fake,Bogus
133
+ p {
134
+ border: fail1;
135
+ }
136
+
137
+ p {
138
+ border: Bogus;
139
+ }
140
+ SCSS
141
+
142
+ it { should_not report_lint }
143
+ end
144
+
145
+ context 'when more than one linter is disabled without commas between the linter names' do
146
+ let(:scss) { <<-SCSS }
147
+ // scss-lint:disable Fake Bogus
148
+ p {
149
+ border: fail1;
150
+ }
151
+
152
+ p {
153
+ border: bogus;
154
+ }
155
+ SCSS
156
+
157
+ it { should_not report_lint }
158
+ end
159
+
160
+ context 'when two linters are disabled and only one is reenabled' do
161
+ let(:scss) { <<-SCSS }
162
+ // scss-lint:disable Fake, Bogus
163
+ p {
164
+ border: fail1;
165
+ }
166
+ // scss-lint:enable Fake
167
+
168
+ p {
169
+ margin: fail1;
170
+ border: bogus;
171
+ }
172
+ SCSS
173
+
174
+ it { should_not report_lint line: 3 }
175
+ it { should report_lint line: 8 }
176
+ end
177
+
178
+ context 'when all linters are disabled' do
179
+ let(:scss) { <<-SCSS }
180
+ // scss-lint:disable all
181
+ p {
182
+ border: fail1;
183
+ }
184
+
185
+ p {
186
+ margin: fail1;
187
+ border: bogus;
188
+ }
189
+ SCSS
190
+
191
+ it { should_not report_lint }
192
+ end
193
+
194
+ context 'when all linters are disabled and then one is re-enabled' do
195
+ let(:scss) { <<-SCSS }
196
+ // scss-lint:disable all
197
+ p {
198
+ border: fail1;
199
+ }
200
+ // scss-lint:enable Fake
201
+
202
+ p {
203
+ margin: fail1;
204
+ border: bogus;
205
+ }
206
+ SCSS
207
+
208
+ it { should_not report_lint line: 3 }
209
+ it { should report_lint line: 8 }
210
+ end
211
+
212
+ context 'when a linter is bypassing the visit tree order' do
213
+ let(:scss) { <<-SCSS }
214
+ p {
215
+ // scss-lint:disable Fake
216
+ border: fail2;
217
+ }
218
+ SCSS
219
+
220
+ it { should_not report_lint }
221
+ end
222
+
223
+ context 'when the command comment is next to other comments' do
224
+ let(:scss) { <<-SCSS }
225
+ p {
226
+ // scss-lint:disable Fake
227
+ // more comments
228
+ border: fail2;
229
+ }
230
+
231
+ p {
232
+ // more comments
233
+ // scss-lint:disable Fake
234
+ border: fail2;
235
+ }
236
+ SCSS
237
+
238
+ it { should_not report_lint }
239
+ end
240
+
241
+ context 'when the command comment is at the end of a statement' do
242
+ let(:scss) { <<-SCSS }
243
+ p {
244
+ border: fail1; // scss-lint:disable Fake
245
+ border: fail1;
246
+ }
247
+ SCSS
248
+
249
+ it { should_not report_lint line: 2 }
250
+ it { should report_lint line: 3 }
251
+ end
252
+
253
+ context 'when global disable comes before an @include' do
254
+ let(:scss) { <<-SCSS }
255
+ // scss-lint:disable Fake
256
+ p {
257
+ border: fail1;
258
+ }
259
+
260
+ @include mixin(param) {
261
+ border: fail1;
262
+ }
263
+ SCSS
264
+
265
+ it { should_not report_lint }
266
+ end
267
+
268
+ context 'when // control comment appears in the middle of a comma sequence' do
269
+ let(:scss) { <<-SCSS }
270
+ .badClass, // scss-lint:disable Fake
271
+ .good-selector {
272
+ border: fail1;
273
+ }
274
+ SCSS
275
+
276
+ it { should_not report_lint line: 1 }
277
+ it { should report_lint line: 3 }
278
+ end
279
+
280
+ context 'when /* control comment appears in the middle of a comma sequence' do
281
+ let(:scss) { <<-SCSS }
282
+ .badClass, /* scss-lint:disable Fake */
283
+ .good-selector {
284
+ border: fail1;
285
+ }
286
+ SCSS
287
+
288
+ it { should_not report_lint line: 1 }
289
+ it { should report_lint line: 3 }
290
+ end
291
+ end
292
+ end