scss-lint 0.33.0 → 0.34.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 +19 -1
- data/data/properties.txt +4 -0
- data/lib/scss_lint.rb +1 -0
- data/lib/scss_lint/cli.rb +4 -42
- data/lib/scss_lint/config.rb +1 -45
- data/lib/scss_lint/control_comment_processor.rb +47 -15
- data/lib/scss_lint/file_finder.rb +57 -0
- data/lib/scss_lint/linter/bang_format.rb +1 -1
- data/lib/scss_lint/linter/border_zero.rb +25 -9
- data/lib/scss_lint/linter/color_keyword.rb +3 -13
- data/lib/scss_lint/linter/color_variable.rb +36 -0
- data/lib/scss_lint/linter/declaration_order.rb +2 -2
- data/lib/scss_lint/linter/important_rule.rb +12 -0
- data/lib/scss_lint/linter/indentation.rb +7 -1
- data/lib/scss_lint/linter/property_count.rb +44 -0
- data/lib/scss_lint/linter/property_sort_order.rb +73 -19
- data/lib/scss_lint/linter/string_quotes.rb +9 -0
- data/lib/scss_lint/linter/variable_for_property.rb +20 -0
- data/lib/scss_lint/linter/vendor_prefixes.rb +3 -3
- data/lib/scss_lint/runner.rb +5 -7
- data/lib/scss_lint/utils.rb +34 -0
- data/lib/scss_lint/version.rb +1 -1
- data/spec/scss_lint/cli_spec.rb +1 -1
- data/spec/scss_lint/config_spec.rb +4 -203
- data/spec/scss_lint/engine_spec.rb +4 -4
- data/spec/scss_lint/file_finder_spec.rb +110 -0
- data/spec/scss_lint/linter/bang_format_spec.rb +28 -18
- data/spec/scss_lint/linter/border_zero_spec.rb +50 -16
- data/spec/scss_lint/linter/color_keyword_spec.rb +16 -16
- data/spec/scss_lint/linter/color_variable_spec.rb +102 -0
- data/spec/scss_lint/linter/comment_spec.rb +9 -9
- data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +10 -10
- data/spec/scss_lint/linter/debug_statement_spec.rb +4 -4
- data/spec/scss_lint/linter/declaration_order_spec.rb +80 -80
- data/spec/scss_lint/linter/duplicate_property_spec.rb +30 -30
- data/spec/scss_lint/linter/else_placement_spec.rb +16 -16
- data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +38 -38
- data/spec/scss_lint/linter/empty_rule_spec.rb +4 -4
- data/spec/scss_lint/linter/final_newline_spec.rb +6 -6
- data/spec/scss_lint/linter/hex_length_spec.rb +16 -16
- data/spec/scss_lint/linter/hex_notation_spec.rb +16 -16
- data/spec/scss_lint/linter/hex_validation_spec.rb +6 -6
- data/spec/scss_lint/linter/id_selector_spec.rb +10 -10
- data/spec/scss_lint/linter/import_path_spec.rb +45 -45
- data/spec/scss_lint/linter/important_rule_spec.rb +43 -0
- data/spec/scss_lint/linter/indentation_spec.rb +103 -43
- data/spec/scss_lint/linter/leading_zero_spec.rb +45 -45
- data/spec/scss_lint/linter/mergeable_selector_spec.rb +32 -32
- data/spec/scss_lint/linter/name_format_spec.rb +75 -41
- data/spec/scss_lint/linter/nesting_depth_spec.rb +14 -14
- data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +12 -12
- data/spec/scss_lint/linter/property_count_spec.rb +104 -0
- data/spec/scss_lint/linter/property_sort_order_spec.rb +138 -48
- data/spec/scss_lint/linter/property_spelling_spec.rb +14 -14
- data/spec/scss_lint/linter/qualifying_element_spec.rb +26 -26
- data/spec/scss_lint/linter/selector_depth_spec.rb +26 -26
- data/spec/scss_lint/linter/selector_format_spec.rb +114 -114
- data/spec/scss_lint/linter/shorthand_spec.rb +32 -32
- data/spec/scss_lint/linter/single_line_per_property_spec.rb +10 -10
- data/spec/scss_lint/linter/single_line_per_selector_spec.rb +24 -24
- data/spec/scss_lint/linter/space_after_comma_spec.rb +60 -60
- data/spec/scss_lint/linter/space_after_property_colon_spec.rb +44 -44
- data/spec/scss_lint/linter/space_after_property_name_spec.rb +6 -6
- data/spec/scss_lint/linter/space_before_brace_spec.rb +119 -119
- data/spec/scss_lint/linter/space_between_parens_spec.rb +48 -48
- data/spec/scss_lint/linter/string_quotes_spec.rb +74 -62
- data/spec/scss_lint/linter/trailing_semicolon_spec.rb +53 -54
- data/spec/scss_lint/linter/trailing_zero_spec.rb +34 -34
- data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +10 -10
- data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +18 -18
- data/spec/scss_lint/linter/url_format_spec.rb +4 -4
- data/spec/scss_lint/linter/url_quotes_spec.rb +14 -14
- data/spec/scss_lint/linter/variable_for_property_spec.rb +115 -0
- data/spec/scss_lint/linter/vendor_prefixes_spec.rb +66 -56
- data/spec/scss_lint/linter/zero_unit_spec.rb +22 -22
- data/spec/scss_lint/linter_spec.rb +72 -28
- data/spec/scss_lint/runner_spec.rb +0 -1
- data/spec/scss_lint/selector_visitor_spec.rb +23 -23
- data/spec/spec_helper.rb +2 -2
- metadata +27 -12
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SCSSLint::Engine do
|
4
|
-
let(:engine) { described_class.new(
|
4
|
+
let(:engine) { described_class.new(scss) }
|
5
5
|
|
6
6
|
context 'when a @media directive is present' do
|
7
|
-
let(:
|
7
|
+
let(:scss) { <<-SCSS }
|
8
8
|
@media only screen {
|
9
9
|
}
|
10
|
-
|
10
|
+
SCSS
|
11
11
|
|
12
12
|
it 'has a parse tree' do
|
13
13
|
engine.tree.should_not be_nil
|
@@ -15,7 +15,7 @@ describe SCSSLint::Engine do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'when the file being linted has an invalid byte sequence' do
|
18
|
-
let(:
|
18
|
+
let(:scss) { "\xC0\u0001" }
|
19
19
|
|
20
20
|
it 'raises a SyntaxError' do
|
21
21
|
expect { engine }.to raise_error(SCSSLint::FileEncodingError)
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SCSSLint::FileFinder do
|
4
|
+
let(:config) { SCSSLint::Config.default }
|
5
|
+
|
6
|
+
subject { described_class.new(config) }
|
7
|
+
|
8
|
+
describe '#find' do
|
9
|
+
include_context 'isolated environment'
|
10
|
+
|
11
|
+
subject { super().find(patterns) }
|
12
|
+
|
13
|
+
context 'when no patterns are given' do
|
14
|
+
let(:patterns) { [] }
|
15
|
+
|
16
|
+
context 'and there are no SCSS files under the current directory' do
|
17
|
+
it { should == [] }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'and there are SCSS files under the current directory' do
|
21
|
+
before do
|
22
|
+
`touch blah.scss`
|
23
|
+
`mkdir -p more`
|
24
|
+
`touch more/more.scss`
|
25
|
+
end
|
26
|
+
|
27
|
+
it { should == ['blah.scss', 'more/more.scss'] }
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'and a default set of files is specified in the config' do
|
31
|
+
let(:files) { ['file1.scss', 'file2.scss'] }
|
32
|
+
|
33
|
+
before do
|
34
|
+
config.stub(:scss_files).and_return(files)
|
35
|
+
end
|
36
|
+
|
37
|
+
it { should == files }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when files without valid extension are given' do
|
42
|
+
let(:patterns) { ['test.txt'] }
|
43
|
+
|
44
|
+
context 'and those files exist' do
|
45
|
+
before do
|
46
|
+
`touch test.txt`
|
47
|
+
end
|
48
|
+
|
49
|
+
it { should == ['test.txt'] }
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'and those files do not exist' do
|
53
|
+
it { should == ['test.txt'] }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when directories are given' do
|
58
|
+
let(:patterns) { ['some-dir'] }
|
59
|
+
|
60
|
+
context 'and those directories exist' do
|
61
|
+
before do
|
62
|
+
`mkdir -p some-dir`
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'and they contain SCSS files' do
|
66
|
+
before do
|
67
|
+
`touch some-dir/test.scss`
|
68
|
+
end
|
69
|
+
|
70
|
+
it { should == ['some-dir/test.scss'] }
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'and they contain CSS files' do
|
74
|
+
before do
|
75
|
+
`touch some-dir/test.css`
|
76
|
+
end
|
77
|
+
|
78
|
+
it { should == ['some-dir/test.css'] }
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'and they contain more directories with files with recognized extensions' do
|
82
|
+
before do
|
83
|
+
`mkdir -p some-dir/more-dir`
|
84
|
+
`touch some-dir/more-dir/test.scss`
|
85
|
+
end
|
86
|
+
|
87
|
+
it { should == ['some-dir/more-dir/test.scss'] }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'and they contain files with some other extension' do
|
91
|
+
before do
|
92
|
+
`touch some-dir/test.txt`
|
93
|
+
end
|
94
|
+
|
95
|
+
it { should == [] }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'and those directories do not exist' do
|
100
|
+
it { should == ['some-dir'] }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'when the same file is specified multiple times' do
|
105
|
+
let(:patterns) { ['test.scss'] * 3 }
|
106
|
+
|
107
|
+
it { should == ['test.scss'] }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -2,41 +2,41 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SCSSLint::Linter::BangFormat do
|
4
4
|
context 'when no bang is used' do
|
5
|
-
let(:
|
5
|
+
let(:scss) { <<-SCSS }
|
6
6
|
p {
|
7
7
|
color: #000;
|
8
8
|
}
|
9
|
-
|
9
|
+
SCSS
|
10
10
|
|
11
11
|
it { should_not report_lint }
|
12
12
|
end
|
13
13
|
|
14
14
|
context 'when !important is used correctly' do
|
15
|
-
let(:
|
15
|
+
let(:scss) { <<-SCSS }
|
16
16
|
p {
|
17
17
|
color: #000 !important;
|
18
18
|
}
|
19
|
-
|
19
|
+
SCSS
|
20
20
|
|
21
21
|
it { should_not report_lint }
|
22
22
|
end
|
23
23
|
|
24
24
|
context 'when !important has no space before' do
|
25
|
-
let(:
|
25
|
+
let(:scss) { <<-SCSS }
|
26
26
|
p {
|
27
27
|
color: #000!important;
|
28
28
|
}
|
29
|
-
|
29
|
+
SCSS
|
30
30
|
|
31
31
|
it { should report_lint line: 2 }
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'when !important has a space after' do
|
35
|
-
let(:
|
35
|
+
let(:scss) { <<-SCSS }
|
36
36
|
p {
|
37
37
|
color: #000 ! important;
|
38
38
|
}
|
39
|
-
|
39
|
+
SCSS
|
40
40
|
|
41
41
|
it { should report_lint line: 2 }
|
42
42
|
end
|
@@ -44,11 +44,11 @@ describe SCSSLint::Linter::BangFormat do
|
|
44
44
|
context 'when !important has a space after and config allows it' do
|
45
45
|
let(:linter_config) { { 'space_before_bang' => true, 'space_after_bang' => true } }
|
46
46
|
|
47
|
-
let(:
|
47
|
+
let(:scss) { <<-SCSS }
|
48
48
|
p {
|
49
49
|
color: #000 ! important;
|
50
50
|
}
|
51
|
-
|
51
|
+
SCSS
|
52
52
|
|
53
53
|
it { should_not report_lint }
|
54
54
|
end
|
@@ -56,11 +56,11 @@ describe SCSSLint::Linter::BangFormat do
|
|
56
56
|
context 'when !important has a space before but config does not allow it' do
|
57
57
|
let(:linter_config) { { 'space_before_bang' => false, 'space_after_bang' => true } }
|
58
58
|
|
59
|
-
let(:
|
59
|
+
let(:scss) { <<-SCSS }
|
60
60
|
p {
|
61
61
|
color: #000 ! important;
|
62
62
|
}
|
63
|
-
|
63
|
+
SCSS
|
64
64
|
|
65
65
|
it { should report_lint line: 2 }
|
66
66
|
end
|
@@ -68,17 +68,17 @@ describe SCSSLint::Linter::BangFormat do
|
|
68
68
|
context 'when !important has no spaces around and config allows it' do
|
69
69
|
let(:linter_config) { { 'space_before_bang' => false, 'space_after_bang' => false } }
|
70
70
|
|
71
|
-
let(:
|
71
|
+
let(:scss) { <<-SCSS }
|
72
72
|
p {
|
73
73
|
color: #000!important;
|
74
74
|
}
|
75
|
-
|
75
|
+
SCSS
|
76
76
|
|
77
77
|
it { should_not report_lint }
|
78
78
|
end
|
79
79
|
|
80
80
|
context 'when ! appears within a string' do
|
81
|
-
let(:
|
81
|
+
let(:scss) { <<-SCSS }
|
82
82
|
p:before { content: "!important"; }
|
83
83
|
p:before { content: "imp!ortant"; }
|
84
84
|
p:after { content: '!'; }
|
@@ -92,20 +92,30 @@ describe SCSSLint::Linter::BangFormat do
|
|
92
92
|
$foo: "bar!";
|
93
93
|
$foo: "!bar";
|
94
94
|
$foo: "b!ar";
|
95
|
-
|
95
|
+
SCSS
|
96
96
|
|
97
97
|
it { should_not report_lint }
|
98
98
|
end
|
99
99
|
|
100
100
|
context 'when !<word> is not followed by a semicolon' do
|
101
|
-
let(:
|
101
|
+
let(:scss) { <<-SCSS }
|
102
102
|
.class {
|
103
103
|
margin: 0 !important
|
104
104
|
}
|
105
|
-
|
105
|
+
SCSS
|
106
106
|
|
107
107
|
it 'does not loop forever' do
|
108
108
|
subject.should_not report_lint
|
109
109
|
end
|
110
110
|
end
|
111
|
+
|
112
|
+
context 'when property contains a list literal with an empty list' do
|
113
|
+
let(:scss) { <<-SCSS }
|
114
|
+
p {
|
115
|
+
content: 0 ();
|
116
|
+
}
|
117
|
+
SCSS
|
118
|
+
|
119
|
+
it { should_not report_lint }
|
120
|
+
end
|
111
121
|
end
|
@@ -2,83 +2,117 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SCSSLint::Linter::BorderZero do
|
4
4
|
context 'when a rule is empty' do
|
5
|
-
let(:
|
5
|
+
let(:scss) { <<-SCSS }
|
6
6
|
p {
|
7
7
|
}
|
8
|
-
|
8
|
+
SCSS
|
9
9
|
|
10
10
|
it { should_not report_lint }
|
11
11
|
end
|
12
12
|
|
13
13
|
context 'when a property' do
|
14
14
|
context 'contains a normal border' do
|
15
|
-
let(:
|
15
|
+
let(:scss) { <<-SCSS }
|
16
16
|
p {
|
17
17
|
border: 1px solid #000;
|
18
18
|
}
|
19
|
-
|
19
|
+
SCSS
|
20
20
|
|
21
21
|
it { should_not report_lint }
|
22
22
|
end
|
23
23
|
|
24
24
|
context 'has a border of 0' do
|
25
|
-
let(:
|
25
|
+
let(:scss) { <<-SCSS }
|
26
26
|
p {
|
27
27
|
border: 0;
|
28
28
|
}
|
29
|
-
|
29
|
+
SCSS
|
30
30
|
|
31
31
|
it { should_not report_lint }
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'has a border of none' do
|
35
|
-
let(:
|
35
|
+
let(:scss) { <<-SCSS }
|
36
36
|
p {
|
37
37
|
border: none;
|
38
38
|
}
|
39
|
-
|
39
|
+
SCSS
|
40
40
|
|
41
41
|
it { should report_lint line: 2 }
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'has a border-top of none' do
|
45
|
-
let(:
|
45
|
+
let(:scss) { <<-SCSS }
|
46
46
|
p {
|
47
47
|
border-top: none;
|
48
48
|
}
|
49
|
-
|
49
|
+
SCSS
|
50
50
|
|
51
51
|
it { should report_lint line: 2 }
|
52
52
|
end
|
53
53
|
|
54
54
|
context 'has a border-right of none' do
|
55
|
-
let(:
|
55
|
+
let(:scss) { <<-SCSS }
|
56
56
|
p {
|
57
57
|
border-right: none;
|
58
58
|
}
|
59
|
-
|
59
|
+
SCSS
|
60
60
|
|
61
61
|
it { should report_lint line: 2 }
|
62
62
|
end
|
63
63
|
|
64
64
|
context 'has a border-bottom of none' do
|
65
|
-
let(:
|
65
|
+
let(:scss) { <<-SCSS }
|
66
66
|
p {
|
67
67
|
border-bottom: none;
|
68
68
|
}
|
69
|
-
|
69
|
+
SCSS
|
70
70
|
|
71
71
|
it { should report_lint line: 2 }
|
72
72
|
end
|
73
73
|
|
74
74
|
context 'has a border-left of none' do
|
75
|
-
let(:
|
75
|
+
let(:scss) { <<-SCSS }
|
76
76
|
p {
|
77
77
|
border-left: none;
|
78
78
|
}
|
79
|
-
|
79
|
+
SCSS
|
80
80
|
|
81
81
|
it { should report_lint line: 2 }
|
82
82
|
end
|
83
83
|
end
|
84
|
+
|
85
|
+
context 'when a convention of `none` is preferred' do
|
86
|
+
let(:linter_config) { { 'convention' => 'none' } }
|
87
|
+
|
88
|
+
context 'and the border is `none`' do
|
89
|
+
let(:scss) { <<-SCSS }
|
90
|
+
p {
|
91
|
+
border: none;
|
92
|
+
}
|
93
|
+
SCSS
|
94
|
+
|
95
|
+
it { should_not report_lint }
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'and the border is `0`' do
|
99
|
+
let(:scss) { <<-SCSS }
|
100
|
+
p {
|
101
|
+
border: 0;
|
102
|
+
}
|
103
|
+
SCSS
|
104
|
+
|
105
|
+
it { should report_lint }
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'and the border is a non-zero value' do
|
109
|
+
let(:scss) { <<-SCSS }
|
110
|
+
p {
|
111
|
+
border: 5px;
|
112
|
+
}
|
113
|
+
SCSS
|
114
|
+
|
115
|
+
it { should_not report_lint }
|
116
|
+
end
|
117
|
+
end
|
84
118
|
end
|
@@ -2,81 +2,81 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SCSSLint::Linter::ColorKeyword do
|
4
4
|
context 'when a color is specified as a hex' do
|
5
|
-
let(:
|
5
|
+
let(:scss) { <<-SCSS }
|
6
6
|
p {
|
7
7
|
color: #fff;
|
8
8
|
}
|
9
|
-
|
9
|
+
SCSS
|
10
10
|
|
11
11
|
it { should_not report_lint }
|
12
12
|
end
|
13
13
|
|
14
14
|
context 'when a color is specified as a keyword' do
|
15
|
-
let(:
|
15
|
+
let(:scss) { <<-SCSS }
|
16
16
|
p {
|
17
17
|
color: white;
|
18
18
|
}
|
19
|
-
|
19
|
+
SCSS
|
20
20
|
|
21
21
|
it { should report_lint line: 2 }
|
22
22
|
end
|
23
23
|
|
24
24
|
context 'when a color keyword exists in a shorthand property' do
|
25
|
-
let(:
|
25
|
+
let(:scss) { <<-SCSS }
|
26
26
|
p {
|
27
27
|
border: 1px solid black;
|
28
28
|
}
|
29
|
-
|
29
|
+
SCSS
|
30
30
|
|
31
31
|
it { should report_lint line: 2 }
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'when a property contains a color keyword as a string' do
|
35
|
-
let(:
|
35
|
+
let(:scss) { <<-SCSS }
|
36
36
|
p {
|
37
37
|
content: 'white';
|
38
38
|
}
|
39
|
-
|
39
|
+
SCSS
|
40
40
|
|
41
41
|
it { should_not report_lint }
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'when a function call contains a color keyword' do
|
45
|
-
let(:
|
45
|
+
let(:scss) { <<-SCSS }
|
46
46
|
p {
|
47
47
|
color: function(red);
|
48
48
|
}
|
49
|
-
|
49
|
+
SCSS
|
50
50
|
|
51
51
|
it { should report_lint line: 2 }
|
52
52
|
end
|
53
53
|
|
54
54
|
context 'when a mixin include contains a color keyword' do
|
55
|
-
let(:
|
55
|
+
let(:scss) { <<-SCSS }
|
56
56
|
p {
|
57
57
|
@include some-mixin(red);
|
58
58
|
}
|
59
|
-
|
59
|
+
SCSS
|
60
60
|
|
61
61
|
it { should report_lint line: 2 }
|
62
62
|
end
|
63
63
|
|
64
64
|
context 'when the "transparent" color keyword is used' do
|
65
|
-
let(:
|
65
|
+
let(:scss) { <<-SCSS }
|
66
66
|
p {
|
67
67
|
@include mixin(transparent);
|
68
68
|
}
|
69
|
-
|
69
|
+
SCSS
|
70
70
|
|
71
71
|
it { should_not report_lint }
|
72
72
|
end
|
73
73
|
|
74
74
|
context 'when color keyword appears in a string identifier' do
|
75
|
-
let(:
|
75
|
+
let(:scss) { <<-SCSS }
|
76
76
|
p {
|
77
77
|
content: content-with-blue-in-name;
|
78
78
|
}
|
79
|
-
|
79
|
+
SCSS
|
80
80
|
|
81
81
|
it { should_not report_lint }
|
82
82
|
end
|