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,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::EmptyRule do
4
+ context 'when rule is empty' do
5
+ let(:scss) { <<-SCSS }
6
+ p {
7
+ }
8
+ SCSS
9
+
10
+ it { should report_lint line: 1 }
11
+ end
12
+
13
+ context 'when rule contains an empty nested rule' do
14
+ let(:scss) { <<-SCSS }
15
+ p {
16
+ background: #000;
17
+ display: none;
18
+ margin: 5px;
19
+ padding: 10px;
20
+ a {
21
+ }
22
+ }
23
+ SCSS
24
+
25
+ it { should report_lint line: 6 }
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::FinalNewline do
4
+ let(:linter_config) { { 'present' => present } }
5
+
6
+ context 'when trailing newline is preferred' do
7
+ let(:present) { true }
8
+
9
+ context 'when the file is empty' do
10
+ let(:scss) { '' }
11
+
12
+ it { should_not report_lint }
13
+ end
14
+
15
+ context 'when the file ends with a newline' do
16
+ let(:scss) { "p {}\n" }
17
+
18
+ it { should_not report_lint }
19
+ end
20
+
21
+ context 'when the file does not end with a newline' do
22
+ let(:scss) { 'p {}' }
23
+
24
+ it { should report_lint }
25
+ end
26
+ end
27
+
28
+ context 'when no trailing newline is preferred' do
29
+ let(:present) { false }
30
+
31
+ context 'when the file is empty' do
32
+ let(:scss) { '' }
33
+
34
+ it { should_not report_lint }
35
+ end
36
+
37
+ context 'when the file ends with a newline' do
38
+ let(:scss) { "p {}\n" }
39
+
40
+ it { should report_lint }
41
+ end
42
+
43
+ context 'when the file does not end with a newline' do
44
+ let(:scss) { 'p {}' }
45
+
46
+ it { should_not report_lint }
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::HexLength do
4
+ let(:linter_config) { { 'style' => style } }
5
+ let(:style) { 'short' }
6
+
7
+ context 'when rule is empty' do
8
+ let(:scss) { <<-SCSS }
9
+ p {
10
+ }
11
+ SCSS
12
+
13
+ it { should_not report_lint }
14
+ end
15
+
16
+ context 'when rule contains properties with valid hex code' do
17
+ let(:scss) { <<-SCSS }
18
+ p {
19
+ color: #1234ab;
20
+ }
21
+ SCSS
22
+
23
+ it { should_not report_lint }
24
+ end
25
+
26
+ context 'when ID selector starts with a hex code' do
27
+ let(:scss) { <<-SCSS }
28
+ #aabbcc {
29
+ }
30
+ SCSS
31
+
32
+ it { should_not report_lint }
33
+ end
34
+
35
+ context 'when color is specified as a color keyword' do
36
+ let(:scss) { <<-SCSS }
37
+ p {
38
+ @include box-shadow(0 0 1px 1px gold);
39
+ }
40
+ SCSS
41
+
42
+ it { should_not report_lint }
43
+ end
44
+
45
+ context 'when short style is preferred' do
46
+ let(:style) { 'short' }
47
+
48
+ context 'with short hex code' do
49
+ let(:scss) { <<-SCSS }
50
+ p {
51
+ background: #ccc;
52
+ background: #CCC;
53
+ @include crazy-color(#fff);
54
+ }
55
+ SCSS
56
+
57
+ it { should_not report_lint }
58
+ end
59
+
60
+ context 'with long hex code that could be condensed to 3 digits' do
61
+ let(:scss) { <<-SCSS }
62
+ p {
63
+ background: #cccccc;
64
+ background: #CCCCCC;
65
+ @include crazy-color(#ffffff);
66
+ }
67
+ SCSS
68
+
69
+ it { should report_lint line: 2 }
70
+ it { should report_lint line: 3 }
71
+ it { should report_lint line: 4 }
72
+ end
73
+ end
74
+
75
+ context 'when long style is preferred' do
76
+ let(:style) { 'long' }
77
+
78
+ context 'with long hex code that could be condensed to 3 digits' do
79
+ let(:scss) { <<-SCSS }
80
+ p {
81
+ background: #cccccc;
82
+ background: #CCCCCC;
83
+ @include crazy-color(#ffffff);
84
+ }
85
+ SCSS
86
+
87
+ it { should_not report_lint }
88
+ end
89
+
90
+ context 'with short hex code' do
91
+ let(:scss) { <<-SCSS }
92
+ p {
93
+ background: #ccc;
94
+ background: #CCC;
95
+ @include crazy-color(#fff);
96
+ }
97
+ SCSS
98
+
99
+ it { should report_lint line: 2 }
100
+ it { should report_lint line: 3 }
101
+ it { should report_lint line: 4 }
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::HexNotation do
4
+ let(:linter_config) { { 'style' => style } }
5
+ let(:style) { nil }
6
+
7
+ context 'when rule is empty' do
8
+ let(:scss) { <<-SCSS }
9
+ p {
10
+ }
11
+ SCSS
12
+
13
+ it { should_not report_lint }
14
+ end
15
+
16
+ context 'when rule contains color keyword' do
17
+ let(:scss) { <<-SCSS }
18
+ p {
19
+ border-color: red;
20
+ }
21
+ SCSS
22
+
23
+ it { should_not report_lint }
24
+ end
25
+
26
+ context 'lowercase style' do
27
+ let(:style) { 'lowercase' }
28
+
29
+ context 'when rule contains properties with lowercase hex code' do
30
+ let(:scss) { <<-SCSS }
31
+ p {
32
+ background: #ccc;
33
+ color: #cccccc;
34
+ @include crazy-color(#fff);
35
+ }
36
+ SCSS
37
+
38
+ it { should_not report_lint }
39
+ end
40
+
41
+ context 'with uppercase hex codes' do
42
+ let(:scss) { <<-SCSS }
43
+ p {
44
+ background: #CCC;
45
+ color: #CCCCCC;
46
+ @include crazy-color(#FFF);
47
+ }
48
+ SCSS
49
+
50
+ it { should report_lint line: 2 }
51
+ it { should report_lint line: 3 }
52
+ it { should report_lint line: 4 }
53
+ end
54
+ end
55
+
56
+ context 'uppercase style' do
57
+ let(:style) { 'uppercase' }
58
+
59
+ context 'with uppercase hex codes' do
60
+ let(:scss) { <<-SCSS }
61
+ p {
62
+ background: #CCC;
63
+ color: #CCCCCC;
64
+ @include crazy-color(#FFF);
65
+ }
66
+ SCSS
67
+
68
+ it { should_not report_lint }
69
+ end
70
+
71
+ context 'when rule contains properties with lowercase hex code' do
72
+ let(:scss) { <<-SCSS }
73
+ p {
74
+ background: #ccc;
75
+ color: #cccccc;
76
+ @include crazy-color(#fff);
77
+ }
78
+ SCSS
79
+
80
+ it { should report_lint line: 2 }
81
+ it { should report_lint line: 3 }
82
+ it { should report_lint line: 4 }
83
+ end
84
+ end
85
+
86
+ context 'when ID selector starts with a hex code' do
87
+ let(:scss) { <<-SCSS }
88
+ #aabbcc {
89
+ }
90
+ SCSS
91
+
92
+ it { should_not report_lint }
93
+ end
94
+
95
+ context 'when color is specified as a color keyword' do
96
+ let(:scss) { <<-SCSS }
97
+ p {
98
+ @include box-shadow(0 0 1px 1px gold);
99
+ }
100
+ SCSS
101
+
102
+ it { should_not report_lint }
103
+ end
104
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::HexValidation do
4
+ context 'when rule is empty' do
5
+ let(:scss) { <<-SCSS }
6
+ p {
7
+ }
8
+ SCSS
9
+
10
+ it { should_not report_lint }
11
+ end
12
+
13
+ context 'when rule contains valid hex codes or color keyword' do
14
+ gradient_css = 'progid:DXImageTransform.Microsoft.gradient' \
15
+ '(startColorstr=#99000000, endColorstr=#99000000)'
16
+
17
+ let(:scss) { <<-SCSS }
18
+ p {
19
+ background: #000;
20
+ color: #FFFFFF;
21
+ border-color: red;
22
+ filter: #{gradient_css};
23
+ }
24
+ SCSS
25
+
26
+ it { should_not report_lint }
27
+ end
28
+
29
+ context 'when rule contains invalid hex codes' do
30
+ let(:scss) { <<-SCSS }
31
+ p {
32
+ background: #dd;
33
+ color: #dddd;
34
+ }
35
+ SCSS
36
+
37
+ it { should report_lint line: 2 }
38
+ it { should report_lint line: 3 }
39
+ end
40
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::IdSelector do
4
+ context 'when rule is a type' do
5
+ let(:scss) { 'p {}' }
6
+
7
+ it { should_not report_lint }
8
+ end
9
+
10
+ context 'when rule is an ID' do
11
+ let(:scss) { '#identifier {}' }
12
+
13
+ it { should report_lint line: 1 }
14
+ end
15
+
16
+ context 'when rule is a class' do
17
+ let(:scss) { '.class {}' }
18
+
19
+ it { should_not report_lint }
20
+ end
21
+
22
+ context 'when rule is a type with a class' do
23
+ let(:scss) { 'a.class {}' }
24
+
25
+ it { should_not report_lint }
26
+ end
27
+
28
+ context 'when rule is a type with an ID' do
29
+ let(:scss) { 'a#identifier {}' }
30
+
31
+ it { should report_lint line: 1 }
32
+ end
33
+
34
+ context 'when rule is an ID with a pseudo-selector' do
35
+ let(:scss) { '#identifier:active {}' }
36
+
37
+ it { should report_lint line: 1 }
38
+ end
39
+
40
+ context 'when rule contains a nested rule with type and ID' do
41
+ let(:scss) { <<-SCSS }
42
+ p {
43
+ a#identifier {}
44
+ }
45
+ SCSS
46
+
47
+ it { should report_lint line: 2 }
48
+ end
49
+
50
+ context 'when rule contains multiple selectors' do
51
+ context 'when all of the selectors are just IDs, classes, or types' do
52
+ let(:scss) { <<-SCSS }
53
+ #identifier,
54
+ .class,
55
+ a {
56
+ }
57
+ SCSS
58
+
59
+ it { should report_lint line: 1 }
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,300 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::ImportPath do
4
+ context 'when the path includes no directories' do
5
+ context 'and the filename has no leading underscore or filename extension' do
6
+ let(:scss) { '@import "filename";' }
7
+
8
+ it { should_not report_lint }
9
+ end
10
+
11
+ context 'and the filename has a leading underscore' do
12
+ let(:scss) { '@import "_filename";' }
13
+
14
+ it { should report_lint line: 1 }
15
+ end
16
+
17
+ context 'and the filename has a filename extension' do
18
+ let(:scss) { '@import "filename.scss";' }
19
+
20
+ it { should report_lint line: 1 }
21
+ end
22
+
23
+ context 'and the filename has a leading underscore and a filename extension' do
24
+ let(:scss) { '@import "_filename.scss";' }
25
+
26
+ it { should report_lint line: 1 }
27
+ end
28
+
29
+ context 'and multiple files are @imported' do
30
+ context 'and neither have leading underscores or filename extensions' do
31
+ let(:scss) { '@import "foo", "bar";' }
32
+
33
+ it { should_not report_lint }
34
+ end
35
+
36
+ context 'and the second has a leading underscore' do
37
+ let(:scss) { '@import "foo", "_bar";' }
38
+
39
+ it { should report_lint line: 1 }
40
+ end
41
+
42
+ context 'and the first has a filename extension' do
43
+ let(:scss) { '@import "foo.scss", "bar";' }
44
+
45
+ it { should report_lint line: 1 }
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'when the path includes directories' do
51
+ context 'and the filename has no leading underscore or filename extension' do
52
+ let(:scss) { '@import "path/to/filename";' }
53
+
54
+ it { should_not report_lint }
55
+ end
56
+
57
+ context 'and the filename has a leading underscore' do
58
+ let(:scss) { '@import "../to/_filename";' }
59
+
60
+ it { should report_lint line: 1 }
61
+ end
62
+
63
+ context 'and the filename has a filename extension' do
64
+ let(:scss) { '@import "/path/to/filename.scss";' }
65
+
66
+ it { should report_lint line: 1 }
67
+ end
68
+
69
+ context 'and the filename has a leading underscore and a filename extension' do
70
+ let(:scss) { '@import "path/to/_filename.scss";' }
71
+
72
+ it { should report_lint line: 1 }
73
+ end
74
+
75
+ context 'and multiple files are @imported' do
76
+ context 'and neither have leading underscores or filename extensions' do
77
+ let(:scss) { '@import "path/to/foo", "../../bar";' }
78
+
79
+ it { should_not report_lint }
80
+ end
81
+
82
+ context 'and the second has a leading underscore' do
83
+ let(:scss) { '@import "path/to/foo", "../../_bar";' }
84
+
85
+ it { should report_lint line: 1 }
86
+ end
87
+
88
+ context 'and the first has a filename extension' do
89
+ let(:scss) { '@import "path/to/foo.scss", "../../bar";' }
90
+
91
+ it { should report_lint line: 1 }
92
+ end
93
+ end
94
+ end
95
+
96
+ context 'when option `leading_underscore` is true' do
97
+ let(:linter_config) { { 'leading_underscore' => true } }
98
+
99
+ context 'and the filename has no leading underscore or filename extension' do
100
+ let(:scss) { '@import "path/to/filename";' }
101
+
102
+ it { should report_lint line: 1 }
103
+ end
104
+
105
+ context 'and the filename has a leading underscore' do
106
+ let(:scss) { '@import "../to/_filename";' }
107
+
108
+ it { should_not report_lint }
109
+ end
110
+
111
+ context 'and the filename has a filename extension' do
112
+ let(:scss) { '@import "/path/to/filename.scss";' }
113
+
114
+ it { should report_lint line: 1 }
115
+ end
116
+
117
+ context 'and the filename has a leading underscore and a filename extension' do
118
+ let(:scss) { '@import "path/to/_filename.scss";' }
119
+
120
+ it { should report_lint line: 1 }
121
+ end
122
+
123
+ context 'and multiple files are @imported' do
124
+ context 'and neither have leading underscores or filename extensions' do
125
+ let(:scss) { '@import "path/to/foo", "../../bar";' }
126
+
127
+ it { should report_lint line: 1 }
128
+ end
129
+
130
+ context 'and both have a leading underscore' do
131
+ let(:scss) { '@import "path/to/_foo", "../../_bar";' }
132
+
133
+ it { should_not report_lint }
134
+ end
135
+
136
+ context 'and only one has a leading underscore' do
137
+ let(:scss) { '@import "path/to/foo.scss", "../../_bar";' }
138
+
139
+ it { should report_lint line: 1 }
140
+ end
141
+ end
142
+ end
143
+
144
+ context 'when option `filename_extension` is true' do
145
+ let(:linter_config) { { 'filename_extension' => true } }
146
+
147
+ context 'and the filename has no leading underscore or filename extension' do
148
+ let(:scss) { '@import "path/to/filename";' }
149
+
150
+ it { should report_lint line: 1 }
151
+ end
152
+
153
+ context 'and the filename has a leading underscore' do
154
+ let(:scss) { '@import "../to/_filename";' }
155
+
156
+ it { should report_lint line: 1 }
157
+ end
158
+
159
+ context 'and the filename has a filename extension' do
160
+ let(:scss) { '@import "/path/to/filename.scss";' }
161
+
162
+ it { should_not report_lint }
163
+ end
164
+
165
+ context 'and the filename has a leading underscore and a filename extension' do
166
+ let(:scss) { '@import "path/to/_filename.scss";' }
167
+
168
+ it { should report_lint line: 1 }
169
+ end
170
+
171
+ context 'and multiple files are @imported' do
172
+ context 'and neither have leading underscores or filename extensions' do
173
+ let(:scss) { '@import "path/to/foo", "../../bar";' }
174
+
175
+ it { should report_lint line: 1 }
176
+ end
177
+
178
+ context 'and both have filename extensions' do
179
+ let(:scss) { '@import "path/to/foo.scss", "../../bar.scss";' }
180
+
181
+ it { should_not report_lint }
182
+ end
183
+
184
+ context 'and only one has a filename extensions' do
185
+ let(:scss) { '@import "path/to/foo.scss", "../../bar";' }
186
+
187
+ it { should report_lint line: 1 }
188
+ end
189
+ end
190
+ end
191
+
192
+ context 'when options `leading_underscore` and `filename_extension` are true' do
193
+ let(:linter_config) { { 'leading_underscore' => true, 'filename_extension' => true } }
194
+
195
+ context 'and the filename has no leading underscore or filename extension' do
196
+ let(:scss) { '@import "path/to/filename";' }
197
+
198
+ it { should report_lint line: 1 }
199
+ end
200
+
201
+ context 'and the filename has a leading underscore' do
202
+ let(:scss) { '@import "../to/_filename";' }
203
+
204
+ it { should report_lint line: 1 }
205
+ end
206
+
207
+ context 'and the filename has a filename extension' do
208
+ let(:scss) { '@import "/path/to/filename.scss";' }
209
+
210
+ it { should report_lint line: 1 }
211
+ end
212
+
213
+ context 'and the filename has a leading underscore and a filename extension' do
214
+ let(:scss) { '@import "path/to/_filename.scss";' }
215
+
216
+ it { should_not report_lint }
217
+ end
218
+
219
+ context 'and multiple files are @imported' do
220
+ context 'and neither have leading underscores or filename extensions' do
221
+ let(:scss) { '@import "path/to/foo", "../../bar";' }
222
+
223
+ it { should report_lint line: 1 }
224
+ end
225
+
226
+ context 'and both have filename extensions and leading underscores' do
227
+ let(:scss) { '@import "path/to/_foo.scss", "../../_bar.scss";' }
228
+
229
+ it { should_not report_lint }
230
+ end
231
+
232
+ context 'and only one has both a filename extension and a leading underscore' do
233
+ let(:scss) { '@import "path/to/_foo.scss", "../../bar.scss";' }
234
+
235
+ it { should report_lint line: 1 }
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'when the @import directive compiles directly to a CSS @import rule' do
241
+ context 'and the @import is a CSS file' do
242
+ let(:scss) { '@import "_foo.css";' }
243
+
244
+ it { should_not report_lint }
245
+ end
246
+
247
+ context 'and the @import contains a protocol' do
248
+ let(:scss) { '@import "http://foo.com/_bar.css";' }
249
+
250
+ it { should_not report_lint }
251
+ end
252
+
253
+ context 'and the @import contains a media query' do
254
+ let(:scss) { '@import "_foo.css" screen;' }
255
+
256
+ it { should_not report_lint }
257
+ end
258
+
259
+ context 'and the @import is a URL' do
260
+ let(:scss) { '@import url(_foo.css);' }
261
+
262
+ it { should_not report_lint }
263
+ end
264
+
265
+ context 'and the @import contains interpolation' do
266
+ let(:scss) { <<-SCSS }
267
+ $family: unquote("Droid+Sans");
268
+ @import url("http://fonts.googleapis.com/css?family=\#{$family}");
269
+ SCSS
270
+
271
+ it { should_not report_lint }
272
+ end
273
+ end
274
+
275
+ context 'when the partial has the same name as its directory' do
276
+ context 'and the filename has no leading underscore or filename extension' do
277
+ let(:scss) { '@import "foo/foo";' }
278
+
279
+ it { should_not report_lint }
280
+ end
281
+
282
+ context 'and the filename has a leading underscore' do
283
+ let(:scss) { '@import "_foo/_foo";' }
284
+
285
+ it { should report_lint line: 1 }
286
+ end
287
+
288
+ context 'and the filename has a filename extension' do
289
+ let(:scss) { '@import "foo/foo.scss";' }
290
+
291
+ it { should report_lint line: 1 }
292
+ end
293
+
294
+ context 'and the filename has a leading underscore and a filename extension' do
295
+ let(:scss) { '@import "_foo/_foo.scss";' }
296
+
297
+ it { should report_lint line: 1 }
298
+ end
299
+ end
300
+ end