scss-lint 0.33.0 → 0.34.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +19 -1
  3. data/data/properties.txt +4 -0
  4. data/lib/scss_lint.rb +1 -0
  5. data/lib/scss_lint/cli.rb +4 -42
  6. data/lib/scss_lint/config.rb +1 -45
  7. data/lib/scss_lint/control_comment_processor.rb +47 -15
  8. data/lib/scss_lint/file_finder.rb +57 -0
  9. data/lib/scss_lint/linter/bang_format.rb +1 -1
  10. data/lib/scss_lint/linter/border_zero.rb +25 -9
  11. data/lib/scss_lint/linter/color_keyword.rb +3 -13
  12. data/lib/scss_lint/linter/color_variable.rb +36 -0
  13. data/lib/scss_lint/linter/declaration_order.rb +2 -2
  14. data/lib/scss_lint/linter/important_rule.rb +12 -0
  15. data/lib/scss_lint/linter/indentation.rb +7 -1
  16. data/lib/scss_lint/linter/property_count.rb +44 -0
  17. data/lib/scss_lint/linter/property_sort_order.rb +73 -19
  18. data/lib/scss_lint/linter/string_quotes.rb +9 -0
  19. data/lib/scss_lint/linter/variable_for_property.rb +20 -0
  20. data/lib/scss_lint/linter/vendor_prefixes.rb +3 -3
  21. data/lib/scss_lint/runner.rb +5 -7
  22. data/lib/scss_lint/utils.rb +34 -0
  23. data/lib/scss_lint/version.rb +1 -1
  24. data/spec/scss_lint/cli_spec.rb +1 -1
  25. data/spec/scss_lint/config_spec.rb +4 -203
  26. data/spec/scss_lint/engine_spec.rb +4 -4
  27. data/spec/scss_lint/file_finder_spec.rb +110 -0
  28. data/spec/scss_lint/linter/bang_format_spec.rb +28 -18
  29. data/spec/scss_lint/linter/border_zero_spec.rb +50 -16
  30. data/spec/scss_lint/linter/color_keyword_spec.rb +16 -16
  31. data/spec/scss_lint/linter/color_variable_spec.rb +102 -0
  32. data/spec/scss_lint/linter/comment_spec.rb +9 -9
  33. data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +10 -10
  34. data/spec/scss_lint/linter/debug_statement_spec.rb +4 -4
  35. data/spec/scss_lint/linter/declaration_order_spec.rb +80 -80
  36. data/spec/scss_lint/linter/duplicate_property_spec.rb +30 -30
  37. data/spec/scss_lint/linter/else_placement_spec.rb +16 -16
  38. data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +38 -38
  39. data/spec/scss_lint/linter/empty_rule_spec.rb +4 -4
  40. data/spec/scss_lint/linter/final_newline_spec.rb +6 -6
  41. data/spec/scss_lint/linter/hex_length_spec.rb +16 -16
  42. data/spec/scss_lint/linter/hex_notation_spec.rb +16 -16
  43. data/spec/scss_lint/linter/hex_validation_spec.rb +6 -6
  44. data/spec/scss_lint/linter/id_selector_spec.rb +10 -10
  45. data/spec/scss_lint/linter/import_path_spec.rb +45 -45
  46. data/spec/scss_lint/linter/important_rule_spec.rb +43 -0
  47. data/spec/scss_lint/linter/indentation_spec.rb +103 -43
  48. data/spec/scss_lint/linter/leading_zero_spec.rb +45 -45
  49. data/spec/scss_lint/linter/mergeable_selector_spec.rb +32 -32
  50. data/spec/scss_lint/linter/name_format_spec.rb +75 -41
  51. data/spec/scss_lint/linter/nesting_depth_spec.rb +14 -14
  52. data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +12 -12
  53. data/spec/scss_lint/linter/property_count_spec.rb +104 -0
  54. data/spec/scss_lint/linter/property_sort_order_spec.rb +138 -48
  55. data/spec/scss_lint/linter/property_spelling_spec.rb +14 -14
  56. data/spec/scss_lint/linter/qualifying_element_spec.rb +26 -26
  57. data/spec/scss_lint/linter/selector_depth_spec.rb +26 -26
  58. data/spec/scss_lint/linter/selector_format_spec.rb +114 -114
  59. data/spec/scss_lint/linter/shorthand_spec.rb +32 -32
  60. data/spec/scss_lint/linter/single_line_per_property_spec.rb +10 -10
  61. data/spec/scss_lint/linter/single_line_per_selector_spec.rb +24 -24
  62. data/spec/scss_lint/linter/space_after_comma_spec.rb +60 -60
  63. data/spec/scss_lint/linter/space_after_property_colon_spec.rb +44 -44
  64. data/spec/scss_lint/linter/space_after_property_name_spec.rb +6 -6
  65. data/spec/scss_lint/linter/space_before_brace_spec.rb +119 -119
  66. data/spec/scss_lint/linter/space_between_parens_spec.rb +48 -48
  67. data/spec/scss_lint/linter/string_quotes_spec.rb +74 -62
  68. data/spec/scss_lint/linter/trailing_semicolon_spec.rb +53 -54
  69. data/spec/scss_lint/linter/trailing_zero_spec.rb +34 -34
  70. data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +10 -10
  71. data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +18 -18
  72. data/spec/scss_lint/linter/url_format_spec.rb +4 -4
  73. data/spec/scss_lint/linter/url_quotes_spec.rb +14 -14
  74. data/spec/scss_lint/linter/variable_for_property_spec.rb +115 -0
  75. data/spec/scss_lint/linter/vendor_prefixes_spec.rb +66 -56
  76. data/spec/scss_lint/linter/zero_unit_spec.rb +22 -22
  77. data/spec/scss_lint/linter_spec.rb +72 -28
  78. data/spec/scss_lint/runner_spec.rb +0 -1
  79. data/spec/scss_lint/selector_visitor_spec.rb +23 -23
  80. data/spec/spec_helper.rb +2 -2
  81. 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(css) }
4
+ let(:engine) { described_class.new(scss) }
5
5
 
6
6
  context 'when a @media directive is present' do
7
- let(:css) { <<-CSS }
7
+ let(:scss) { <<-SCSS }
8
8
  @media only screen {
9
9
  }
10
- CSS
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(:css) { "\xC0\u0001" }
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(:css) { <<-CSS }
5
+ let(:scss) { <<-SCSS }
6
6
  p {
7
7
  color: #000;
8
8
  }
9
- CSS
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(:css) { <<-CSS }
15
+ let(:scss) { <<-SCSS }
16
16
  p {
17
17
  color: #000 !important;
18
18
  }
19
- CSS
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(:css) { <<-CSS }
25
+ let(:scss) { <<-SCSS }
26
26
  p {
27
27
  color: #000!important;
28
28
  }
29
- CSS
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(:css) { <<-CSS }
35
+ let(:scss) { <<-SCSS }
36
36
  p {
37
37
  color: #000 ! important;
38
38
  }
39
- CSS
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(:css) { <<-CSS }
47
+ let(:scss) { <<-SCSS }
48
48
  p {
49
49
  color: #000 ! important;
50
50
  }
51
- CSS
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(:css) { <<-CSS }
59
+ let(:scss) { <<-SCSS }
60
60
  p {
61
61
  color: #000 ! important;
62
62
  }
63
- CSS
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(:css) { <<-CSS }
71
+ let(:scss) { <<-SCSS }
72
72
  p {
73
73
  color: #000!important;
74
74
  }
75
- CSS
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(:css) { <<-CSS }
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
- CSS
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(:css) { <<-CSS }
101
+ let(:scss) { <<-SCSS }
102
102
  .class {
103
103
  margin: 0 !important
104
104
  }
105
- CSS
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(:css) { <<-CSS }
5
+ let(:scss) { <<-SCSS }
6
6
  p {
7
7
  }
8
- CSS
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(:css) { <<-CSS }
15
+ let(:scss) { <<-SCSS }
16
16
  p {
17
17
  border: 1px solid #000;
18
18
  }
19
- CSS
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(:css) { <<-CSS }
25
+ let(:scss) { <<-SCSS }
26
26
  p {
27
27
  border: 0;
28
28
  }
29
- CSS
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(:css) { <<-CSS }
35
+ let(:scss) { <<-SCSS }
36
36
  p {
37
37
  border: none;
38
38
  }
39
- CSS
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(:css) { <<-CSS }
45
+ let(:scss) { <<-SCSS }
46
46
  p {
47
47
  border-top: none;
48
48
  }
49
- CSS
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(:css) { <<-CSS }
55
+ let(:scss) { <<-SCSS }
56
56
  p {
57
57
  border-right: none;
58
58
  }
59
- CSS
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(:css) { <<-CSS }
65
+ let(:scss) { <<-SCSS }
66
66
  p {
67
67
  border-bottom: none;
68
68
  }
69
- CSS
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(:css) { <<-CSS }
75
+ let(:scss) { <<-SCSS }
76
76
  p {
77
77
  border-left: none;
78
78
  }
79
- CSS
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(:css) { <<-CSS }
5
+ let(:scss) { <<-SCSS }
6
6
  p {
7
7
  color: #fff;
8
8
  }
9
- CSS
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(:css) { <<-CSS }
15
+ let(:scss) { <<-SCSS }
16
16
  p {
17
17
  color: white;
18
18
  }
19
- CSS
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(:css) { <<-CSS }
25
+ let(:scss) { <<-SCSS }
26
26
  p {
27
27
  border: 1px solid black;
28
28
  }
29
- CSS
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(:css) { <<-CSS }
35
+ let(:scss) { <<-SCSS }
36
36
  p {
37
37
  content: 'white';
38
38
  }
39
- CSS
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(:css) { <<-CSS }
45
+ let(:scss) { <<-SCSS }
46
46
  p {
47
47
  color: function(red);
48
48
  }
49
- CSS
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(:css) { <<-CSS }
55
+ let(:scss) { <<-SCSS }
56
56
  p {
57
57
  @include some-mixin(red);
58
58
  }
59
- CSS
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(:css) { <<-CSS }
65
+ let(:scss) { <<-SCSS }
66
66
  p {
67
67
  @include mixin(transparent);
68
68
  }
69
- CSS
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(:css) { <<-CSS }
75
+ let(:scss) { <<-SCSS }
76
76
  p {
77
77
  content: content-with-blue-in-name;
78
78
  }
79
- CSS
79
+ SCSS
80
80
 
81
81
  it { should_not report_lint }
82
82
  end