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.
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