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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +10 -1
  3. data/data/property-sort-orders/concentric.txt +99 -0
  4. data/lib/scss_lint.rb +1 -0
  5. data/lib/scss_lint/cli.rb +9 -3
  6. data/lib/scss_lint/exceptions.rb +4 -0
  7. data/lib/scss_lint/linter.rb +10 -1
  8. data/lib/scss_lint/linter/capitalization_in_selector.rb +14 -6
  9. data/lib/scss_lint/linter/compass/property_with_mixin.rb +9 -2
  10. data/lib/scss_lint/linter/indentation.rb +28 -6
  11. data/lib/scss_lint/linter/property_sort_order.rb +61 -9
  12. data/lib/scss_lint/linter/single_line_per_property.rb +53 -0
  13. data/lib/scss_lint/linter/single_line_per_selector.rb +6 -1
  14. data/lib/scss_lint/linter/space_after_comma.rb +27 -19
  15. data/lib/scss_lint/linter/space_before_brace.rb +5 -4
  16. data/lib/scss_lint/linter/trailing_semicolon.rb +53 -0
  17. data/lib/scss_lint/linter/unnecessary_parent_reference.rb +36 -0
  18. data/lib/scss_lint/reporter/default_reporter.rb +7 -2
  19. data/lib/scss_lint/reporter/xml_reporter.rb +2 -1
  20. data/lib/scss_lint/runner.rb +7 -3
  21. data/lib/scss_lint/version.rb +1 -1
  22. data/spec/scss_lint/cli_spec.rb +314 -0
  23. data/spec/scss_lint/config_spec.rb +439 -0
  24. data/spec/scss_lint/engine_spec.rb +24 -0
  25. data/spec/scss_lint/linter/border_zero_spec.rb +84 -0
  26. data/spec/scss_lint/linter/capitalization_in_selector_spec.rb +71 -0
  27. data/spec/scss_lint/linter/color_keyword_spec.rb +83 -0
  28. data/spec/scss_lint/linter/comment_spec.rb +55 -0
  29. data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +55 -0
  30. data/spec/scss_lint/linter/debug_statement_spec.rb +21 -0
  31. data/spec/scss_lint/linter/declaration_order_spec.rb +94 -0
  32. data/spec/scss_lint/linter/duplicate_property_spec.rb +176 -0
  33. data/spec/scss_lint/linter/else_placement_spec.rb +106 -0
  34. data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +263 -0
  35. data/spec/scss_lint/linter/empty_rule_spec.rb +27 -0
  36. data/spec/scss_lint/linter/final_newline_spec.rb +49 -0
  37. data/spec/scss_lint/linter/hex_length_spec.rb +104 -0
  38. data/spec/scss_lint/linter/hex_notation_spec.rb +104 -0
  39. data/spec/scss_lint/linter/hex_validation_spec.rb +36 -0
  40. data/spec/scss_lint/linter/id_with_extraneous_selector_spec.rb +139 -0
  41. data/spec/scss_lint/linter/indentation_spec.rb +242 -0
  42. data/spec/scss_lint/linter/leading_zero_spec.rb +233 -0
  43. data/spec/scss_lint/linter/mergeable_selector_spec.rb +283 -0
  44. data/spec/scss_lint/linter/name_format_spec.rb +206 -0
  45. data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +63 -0
  46. data/spec/scss_lint/linter/property_sort_order_spec.rb +246 -0
  47. data/spec/scss_lint/linter/property_spelling_spec.rb +57 -0
  48. data/spec/scss_lint/linter/selector_depth_spec.rb +159 -0
  49. data/spec/scss_lint/linter/shorthand_spec.rb +172 -0
  50. data/spec/scss_lint/linter/single_line_per_property_spec.rb +73 -0
  51. data/spec/scss_lint/linter/single_line_per_selector_spec.rb +121 -0
  52. data/spec/scss_lint/linter/space_after_comma_spec.rb +315 -0
  53. data/spec/scss_lint/linter/space_after_property_colon_spec.rb +238 -0
  54. data/spec/scss_lint/linter/space_after_property_name_spec.rb +23 -0
  55. data/spec/scss_lint/linter/space_before_brace_spec.rb +447 -0
  56. data/spec/scss_lint/linter/space_between_parens_spec.rb +263 -0
  57. data/spec/scss_lint/linter/string_quotes_spec.rb +303 -0
  58. data/spec/scss_lint/linter/trailing_semicolon_spec.rb +188 -0
  59. data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +67 -0
  60. data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +67 -0
  61. data/spec/scss_lint/linter/url_format_spec.rb +55 -0
  62. data/spec/scss_lint/linter/url_quotes_spec.rb +63 -0
  63. data/spec/scss_lint/linter/zero_unit_spec.rb +113 -0
  64. data/spec/scss_lint/linter_registry_spec.rb +50 -0
  65. data/spec/scss_lint/location_spec.rb +42 -0
  66. data/spec/scss_lint/reporter/config_reporter_spec.rb +42 -0
  67. data/spec/scss_lint/reporter/default_reporter_spec.rb +73 -0
  68. data/spec/scss_lint/reporter/files_reporter_spec.rb +38 -0
  69. data/spec/scss_lint/reporter/xml_reporter_spec.rb +103 -0
  70. data/spec/scss_lint/reporter_spec.rb +11 -0
  71. data/spec/scss_lint/runner_spec.rb +132 -0
  72. data/spec/scss_lint/selector_visitor_spec.rb +264 -0
  73. data/spec/spec_helper.rb +34 -0
  74. data/spec/support/isolated_environment.rb +25 -0
  75. data/spec/support/matchers/report_lint.rb +48 -0
  76. metadata +126 -8
  77. data/lib/scss_lint/linter/trailing_semicolon_after_property_value.rb +0 -40
@@ -0,0 +1,188 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::TrailingSemicolon do
4
+ context 'when a property does not end with a semicolon' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ margin: 0
8
+ }
9
+ CSS
10
+
11
+ it { should report_lint line: 2 }
12
+ end
13
+
14
+ context 'when a property ends with a semicolon' do
15
+ let(:css) { <<-CSS }
16
+ p {
17
+ margin: 0;
18
+ }
19
+ CSS
20
+
21
+ it { should_not report_lint }
22
+ end
23
+
24
+ context 'when a property ends with a space followed by a semicolon' do
25
+ let(:css) { <<-CSS }
26
+ p {
27
+ margin: 0 ;
28
+ }
29
+ CSS
30
+
31
+ it { should report_lint line: 2 }
32
+ end
33
+
34
+ context 'when a property ends with a semicolon and is followed by a comment' do
35
+ let(:css) { <<-CSS }
36
+ p {
37
+ margin: 0; // This is a comment
38
+ padding: 0; /* This is another comment */
39
+ }
40
+ CSS
41
+
42
+ it { should_not report_lint }
43
+ end
44
+
45
+ context 'when a property contains nested properties' do
46
+ context 'and there is a value on the namespace' do
47
+ let(:css) { <<-CSS }
48
+ p {
49
+ font: 2px/3px {
50
+ style: italic;
51
+ weight: bold;
52
+ }
53
+ }
54
+ CSS
55
+
56
+ it { should_not report_lint }
57
+ end
58
+
59
+ context 'and there is no value on the namespace' do
60
+ let(:css) { <<-CSS }
61
+ p {
62
+ font: {
63
+ style: italic;
64
+ weight: bold;
65
+ }
66
+ }
67
+ CSS
68
+
69
+ it { should_not report_lint }
70
+ end
71
+ end
72
+
73
+ context 'when a nested property does not end with a semicolon' do
74
+ let(:css) { <<-CSS }
75
+ p {
76
+ font: {
77
+ weight: bold
78
+ }
79
+ }
80
+ CSS
81
+
82
+ it { should report_lint line: 3 }
83
+ end
84
+
85
+ context 'when a multi-line property ends with a semicolon' do
86
+ let(:css) { <<-CSS }
87
+ p {
88
+ background:
89
+ top repeat-x url('top-image.jpg'),
90
+ right repeat-y url('right-image.jpg'),
91
+ bottom repeat-x url('bottom-image.jpg'),
92
+ left repeat-y url('left-image.jpg');
93
+ }
94
+ CSS
95
+
96
+ it { should_not report_lint }
97
+ end
98
+
99
+ context 'when a multi-line property does not end with a semicolon' do
100
+ let(:css) { <<-CSS }
101
+ p {
102
+ background:
103
+ top repeat-x url('top-image.jpg'),
104
+ right repeat-y url('right-image.jpg'),
105
+ bottom repeat-x url('bottom-image.jpg'),
106
+ left repeat-y url('left-image.jpg')
107
+ }
108
+ CSS
109
+
110
+ it { should report_lint line: 2 }
111
+ end
112
+
113
+ context 'when a oneline rule does not end with a semicolon' do
114
+ let(:css) { <<-CSS }
115
+ .foo { border: 0 }
116
+ CSS
117
+
118
+ it { should report_lint line: 1 }
119
+ end
120
+
121
+ context 'when a oneline rule has a space before a semicolon' do
122
+ let(:css) { <<-CSS }
123
+ .foo { border: 0 ; }
124
+ CSS
125
+
126
+ it { should report_lint line: 1 }
127
+ end
128
+
129
+ context 'when @extend does not end with a semicolon' do
130
+ let(:css) { <<-CSS }
131
+ .foo {
132
+ @extend %bar
133
+ }
134
+ CSS
135
+
136
+ it { should report_lint line: 2 }
137
+ end
138
+
139
+ context 'when @extend ends with a semicolon' do
140
+ let(:css) { <<-CSS }
141
+ .foo {
142
+ @extend %bar;
143
+ }
144
+ CSS
145
+
146
+ it { should_not report_lint }
147
+ end
148
+
149
+ context 'when @include does not end with a semicolon' do
150
+ let(:css) { <<-CSS }
151
+ .foo {
152
+ @include bar
153
+ }
154
+ CSS
155
+
156
+ it { should report_lint line: 2 }
157
+ end
158
+
159
+ context 'when @extend ends with a semicolon' do
160
+ let(:css) { <<-CSS }
161
+ .foo {
162
+ @include bar;
163
+ }
164
+ CSS
165
+
166
+ it { should_not report_lint }
167
+ end
168
+
169
+ context 'when variable declaration does not end with a semicolon' do
170
+ let(:css) { <<-CSS }
171
+ .foo {
172
+ $bar: 1
173
+ }
174
+ CSS
175
+
176
+ it { should report_lint line: 2 }
177
+ end
178
+
179
+ context 'when @extend ends with a semicolon' do
180
+ let(:css) { <<-CSS }
181
+ .foo {
182
+ $bar: 1;
183
+ }
184
+ CSS
185
+
186
+ it { should_not report_lint }
187
+ end
188
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::UnnecessaryMantissa do
4
+ context 'when value is zero' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ margin: 0;
8
+ padding: func(0);
9
+ top: 0em;
10
+ }
11
+ CSS
12
+
13
+ it { should_not report_lint }
14
+ end
15
+
16
+ context 'when value contains no mantissa' do
17
+ let(:css) { <<-CSS }
18
+ p {
19
+ margin: 1;
20
+ padding: func(1);
21
+ top: 1em;
22
+ }
23
+ CSS
24
+
25
+ it { should_not report_lint }
26
+ end
27
+
28
+ context 'when value contains a mantissa with a zero' do
29
+ let(:css) { <<-CSS }
30
+ p {
31
+ margin: 1.0;
32
+ padding: func(1.0);
33
+ top: 1.0em;
34
+ }
35
+ CSS
36
+
37
+ it { should report_lint line: 2 }
38
+ it { should report_lint line: 3 }
39
+ it { should report_lint line: 4 }
40
+ end
41
+
42
+ context 'when value contains a mantissa with multiple zeroes' do
43
+ let(:css) { <<-CSS }
44
+ p {
45
+ margin: 1.000;
46
+ padding: func(1.000);
47
+ top: 1.000em;
48
+ }
49
+ CSS
50
+
51
+ it { should report_lint line: 2 }
52
+ it { should report_lint line: 3 }
53
+ it { should report_lint line: 4 }
54
+ end
55
+
56
+ context 'when value contains a mantissa with multiple zeroes followed by a number' do
57
+ let(:css) { <<-CSS }
58
+ p {
59
+ margin: 1.0001;
60
+ padding: func(1.0001);
61
+ top: 1.0001em;
62
+ }
63
+ CSS
64
+
65
+ it { should_not report_lint }
66
+ end
67
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::UnnecessaryParentReference do
4
+ context 'when an amperand precedes a direct descendant operator' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ & > a {}
8
+ }
9
+ CSS
10
+
11
+ it { should report_lint line: 2 }
12
+ end
13
+
14
+ context 'when an amperand precedes a general child' do
15
+ let(:css) { <<-CSS }
16
+ p {
17
+ & a {}
18
+ }
19
+ CSS
20
+
21
+ it { should report_lint line: 2 }
22
+ end
23
+
24
+ context 'when an amperand is chained with class' do
25
+ let(:css) { <<-CSS }
26
+ p {
27
+ &.foo {}
28
+ }
29
+ CSS
30
+
31
+ it { should_not report_lint }
32
+ end
33
+
34
+ context 'when an amperand follows a direct descendant operator' do
35
+ let(:css) { <<-CSS }
36
+ p {
37
+ .foo > & {}
38
+ }
39
+ CSS
40
+
41
+ it { should_not report_lint }
42
+ end
43
+
44
+ context 'when an amperand is used in a comma sequence to DRY up code' do
45
+ let(:css) { <<-CSS }
46
+ p {
47
+ &,
48
+ .foo,
49
+ .bar {
50
+ margin: 0;
51
+ }
52
+ }
53
+ CSS
54
+
55
+ it { should_not report_lint }
56
+ end
57
+
58
+ context 'when an ampersand is used by itself' do
59
+ let(:css) { <<-CSS }
60
+ p {
61
+ & {}
62
+ }
63
+ CSS
64
+
65
+ it { should report_lint line: 2 }
66
+ end
67
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::UrlFormat do
4
+ shared_examples_for 'UrlFormat linter' do
5
+ context 'when URL contains protocol' do
6
+ let(:url) { 'https://something.com/image.png' }
7
+
8
+ it { should report_lint }
9
+ end
10
+
11
+ context 'when URL contains domain with protocol-less double slashes' do
12
+ let(:url) { '//something.com/image.png' }
13
+
14
+ it { should report_lint }
15
+ end
16
+
17
+ context 'when URL contains absolute path' do
18
+ let(:url) { '/absolute/path/to/image.png' }
19
+
20
+ it { should_not report_lint }
21
+ end
22
+
23
+ context 'when URL contains relative path' do
24
+ let(:url) { 'relative/path/to/image.png' }
25
+
26
+ it { should_not report_lint }
27
+ end
28
+
29
+ context 'when URL is a data URI' do
30
+ let(:url) { 'data:image/png;base64,iVBORI=' }
31
+
32
+ it { should_not report_lint }
33
+ end
34
+ end
35
+
36
+ context 'when URL is enclosed in quotes' do
37
+ let(:css) { <<-CSS }
38
+ .block {
39
+ background: url('#{url}');
40
+ }
41
+ CSS
42
+
43
+ it_should_behave_like 'UrlFormat linter'
44
+ end
45
+
46
+ context 'when URL is not enclosed in quotes' do
47
+ let(:css) { <<-CSS }
48
+ .block {
49
+ background: url(#{url});
50
+ }
51
+ CSS
52
+
53
+ it_should_behave_like 'UrlFormat linter'
54
+ end
55
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::UrlQuotes do
4
+ context 'when property has a literal URL' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ background: url(example.png);
8
+ }
9
+ CSS
10
+
11
+ it { should report_lint line: 2 }
12
+ end
13
+
14
+ context 'when property has a URL enclosed in single quotes' do
15
+ let(:css) { <<-CSS }
16
+ p {
17
+ background: url('example.png');
18
+ }
19
+ CSS
20
+
21
+ it { should_not report_lint }
22
+ end
23
+
24
+ context 'when property has a URL enclosed in double quotes' do
25
+ let(:css) { <<-CSS }
26
+ p {
27
+ background: url("example.png");
28
+ }
29
+ CSS
30
+
31
+ it { should_not report_lint }
32
+ end
33
+
34
+ context 'when property has a literal URL in a list' do
35
+ let(:css) { <<-CSS }
36
+ p {
37
+ background: transparent url(example.png);
38
+ }
39
+ CSS
40
+
41
+ it { should report_lint line: 2 }
42
+ end
43
+
44
+ context 'when property has a single-quoted URL in a list' do
45
+ let(:css) { <<-CSS }
46
+ p {
47
+ background: transparent url('example.png');
48
+ }
49
+ CSS
50
+
51
+ it { should_not report_lint }
52
+ end
53
+
54
+ context 'when property has a double-quoted URL in a list' do
55
+ let(:css) { <<-CSS }
56
+ p {
57
+ background: transparent url("example.png");
58
+ }
59
+ CSS
60
+
61
+ it { should_not report_lint }
62
+ end
63
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::ZeroUnit do
4
+ context 'when no properties exist' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ }
8
+ CSS
9
+
10
+ it { should_not report_lint }
11
+ end
12
+
13
+ context 'when properties with unit-less zeros exist' do
14
+ let(:css) { <<-CSS }
15
+ p {
16
+ margin: 0;
17
+ }
18
+ CSS
19
+
20
+ it { should_not report_lint }
21
+ end
22
+
23
+ context 'when properties with non-zero values exist' do
24
+ let(:css) { <<-CSS }
25
+ p {
26
+ margin: 5px;
27
+ line-height: 1.5em;
28
+ }
29
+ CSS
30
+
31
+ it { should_not report_lint }
32
+ end
33
+
34
+ context 'when properties with zero values contain units' do
35
+ let(:css) { <<-CSS }
36
+ p {
37
+ margin: 0px;
38
+ }
39
+ CSS
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(:css) { <<-CSS }
46
+ p {
47
+ margin: 5em 0em 2em 0px;
48
+ }
49
+ CSS
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(:css) { <<-CSS }
56
+ p {
57
+ margin: some-function(0em);
58
+ }
59
+ CSS
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(:css) { <<-CSS }
66
+ p {
67
+ @include some-mixin(0em);
68
+ }
69
+ CSS
70
+
71
+ it { should report_lint line: 2 }
72
+ end
73
+
74
+ context 'when string contains a zero value with units' do
75
+ let(:css) { <<-CSS }
76
+ p {
77
+ content: func("0em");
78
+ }
79
+ CSS
80
+
81
+ it { should_not report_lint }
82
+ end
83
+
84
+ context 'when property value has a ".0" fractional component' do
85
+ let(:css) { <<-CSS }
86
+ p {
87
+ margin: 4.0em;
88
+ }
89
+ CSS
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(:css) { <<-CSS }
96
+ p {
97
+ color: #0af;
98
+ }
99
+ CSS
100
+
101
+ it { should_not report_lint }
102
+ end
103
+
104
+ context 'when property with zero value is a dimension' do
105
+ let(:css) { <<-CSS }
106
+ p {
107
+ transition-delay: 0s;
108
+ }
109
+ CSS
110
+
111
+ it { should_not report_lint }
112
+ end
113
+ end