scss_lint 0.44.0 → 0.45.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a86d234a01ef87070b4fd7889111970e80def37
4
- data.tar.gz: 2a461b84b74cc8728e64dc9366a67be4df308c10
3
+ metadata.gz: 3c80256e0f694ade8ef5c0651dfc3cd95d1ed76a
4
+ data.tar.gz: ea61d9083a223c299df36c0bc827e92716b941e5
5
5
  SHA512:
6
- metadata.gz: a0badb74dbb5f26d727b38dd71319b8429c35f23602bb73c30a7d197100a4d16f61df75604a4b19992aa1237d1d226b5941e786efe7c459bbde18f4a71b36a76
7
- data.tar.gz: 4059abd1bac9430f32af1f7b125fe22a5a3ae24b146e026283648a4bfb7623453df0eb111cc9659b6f6e1866e3248425574617cef14662f5e1e32732851dc962
6
+ metadata.gz: bdd1c5afb4507f544ec533ee8387506edcf1ad30e8466b0d01a0faaec2db376c4413fbd7b822fac687ba6c7ffd9672ad8103fdf2796a8521c6ae08815511269d
7
+ data.tar.gz: 22a40913e53ebf7e82b181aca67af574a26d5a00ce10b7b090c77f7ba1756e084b038d634b0ff4dc244bd0561922a02f2a780b0f073aa4419e93a7638fea54b9
data/config/default.yml CHANGED
@@ -184,6 +184,10 @@ linters:
184
184
  SpaceAfterPropertyName:
185
185
  enabled: true
186
186
 
187
+ SpaceAfterVariableColon:
188
+ enabled: false
189
+ style: one_space # or 'no_space', 'at_least_one_space' or 'one_space_or_newline'
190
+
187
191
  SpaceAfterVariableName:
188
192
  enabled: true
189
193
 
@@ -121,6 +121,9 @@ content
121
121
  quotes
122
122
  outline
123
123
  outline-offset
124
+ outline-width
125
+ outline-style
126
+ outline-color
124
127
  opacity
125
128
  filter
126
129
  visibility
@@ -8,7 +8,7 @@ module SCSSLint
8
8
  FILE_NAME = '.scss-lint.yml'.freeze
9
9
  DEFAULT_FILE = File.join(SCSS_LINT_HOME, 'config', 'default.yml')
10
10
 
11
- attr_reader :options, :warnings
11
+ attr_reader :options, :warnings, :file
12
12
 
13
13
  class << self
14
14
  def default
@@ -20,7 +20,7 @@ module SCSSLint
20
20
  def load(file, options = {})
21
21
  config_options = load_options_hash_from_file(file)
22
22
 
23
- config = new(config_options)
23
+ config = new(config_options, file)
24
24
 
25
25
  # Need to call this before merging with the default configuration so
26
26
  # that plugins can override the default configuration while still being
@@ -201,9 +201,10 @@ module SCSSLint
201
201
  end
202
202
  end
203
203
 
204
- def initialize(options)
204
+ def initialize(options, file = Config.user_file)
205
205
  @options = options
206
206
  @warnings = []
207
+ @file = file
207
208
 
208
209
  validate_linters
209
210
  end
@@ -24,8 +24,12 @@ module SCSSLint
24
24
  end
25
25
 
26
26
  # Need to force encoding to avoid Windows-related bugs.
27
+ # Need to encode with universal newline to avoid other Windows-related bugs.
27
28
  # Need `to_a` for Ruby 1.9.3.
28
- @lines = @contents.force_encoding('UTF-8').lines.to_a
29
+ encoding = 'UTF-8'
30
+ @lines = @contents.force_encoding(encoding)
31
+ .encode(encoding, universal_newline: true)
32
+ .lines.to_a
29
33
  @tree = @engine.to_tree
30
34
  find_any_control_commands
31
35
  rescue Encoding::UndefinedConversionError, Sass::SyntaxError, ArgumentError => error
@@ -47,7 +47,7 @@ module SCSSLint
47
47
  end
48
48
  end
49
49
 
50
- files.uniq
50
+ files.uniq.sort
51
51
  end
52
52
 
53
53
  # @param file [String]
@@ -23,17 +23,17 @@ module SCSSLint
23
23
 
24
24
  def visit_prop(node)
25
25
  return unless BORDER_PROPERTIES.include?(node.name.first.to_s)
26
- check_border(node, node.value.to_sass.strip)
26
+ check_border(node, node.name.first.to_s, node.value.to_sass.strip)
27
27
  end
28
28
 
29
29
  private
30
30
 
31
- def check_border(node, border)
32
- return unless %w[0 none].include?(border)
33
- return if @preference[0] == border
31
+ def check_border(node, border_property, border_value)
32
+ return unless %w[0 none].include?(border_value)
33
+ return if @preference[0] == border_value
34
34
 
35
- add_lint(node, "`border: #{@preference[0]}` is preferred over " \
36
- "`border: #{@preference[1]}`")
35
+ add_lint(node, "`#{border_property}: #{@preference[0]}` is preferred over " \
36
+ "`#{border_property}: #{@preference[1]}`")
37
37
  end
38
38
  end
39
39
  end
@@ -4,6 +4,8 @@ module SCSSLint
4
4
  include LinterRegistry
5
5
 
6
6
  def visit_rule(node)
7
+ yield # Continue linting children
8
+
7
9
  single_line = single_line_rule_set?(node)
8
10
  return if single_line && config['allow_single_line_rule_sets']
9
11
 
@@ -0,0 +1,62 @@
1
+ module SCSSLint
2
+ # Checks for spaces following the colon that separates a variable's name from
3
+ # its value.
4
+ class Linter::SpaceAfterVariableColon < Linter
5
+ include LinterRegistry
6
+
7
+ def visit_variable(node)
8
+ whitespace = whitespace_after_colon(node)
9
+
10
+ case config['style']
11
+ when 'no_space'
12
+ check_for_no_spaces(node, whitespace)
13
+ when 'one_space'
14
+ check_for_one_space(node, whitespace)
15
+ when 'at_least_one_space'
16
+ check_for_at_least_one_space(node, whitespace)
17
+ when 'one_space_or_newline'
18
+ check_for_one_space_or_newline(node, whitespace)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def check_for_no_spaces(node, whitespace)
25
+ return if whitespace == []
26
+ add_lint(node, 'Colon after variable should not be followed by any spaces')
27
+ end
28
+
29
+ def check_for_one_space(node, whitespace)
30
+ return if whitespace == [' ']
31
+ add_lint(node, 'Colon after variable should be followed by one space')
32
+ end
33
+
34
+ def check_for_at_least_one_space(node, whitespace)
35
+ return if whitespace.uniq == [' ']
36
+ add_lint(node, 'Colon after variable should be followed by at least one space')
37
+ end
38
+
39
+ def check_for_one_space_or_newline(node, whitespace)
40
+ return if whitespace == [' '] || whitespace == ["\n"]
41
+ return if whitespace[0] == "\n" && whitespace[1..-1].uniq == [' ']
42
+ add_lint(node, 'Colon after variable should be followed by one space or a newline')
43
+ end
44
+
45
+ def whitespace_after_colon(node)
46
+ whitespace = []
47
+ offset = 0
48
+ start_pos = node.source_range.start_pos
49
+
50
+ # Find the colon after the variable name
51
+ offset = offset_to(start_pos, ':', offset) + 1
52
+
53
+ # Count spaces after the colon
54
+ while [' ', "\t", "\n"].include? character_at(start_pos, offset)
55
+ whitespace << character_at(start_pos, offset)
56
+ offset += 1
57
+ end
58
+
59
+ whitespace
60
+ end
61
+ end
62
+ end
@@ -19,9 +19,8 @@ module SCSSLint
19
19
  # `node.expr` will give us everything except the last right paren, and
20
20
  # the semicolon if it exists. In these cases, use the source range of
21
21
  # `node` as above.
22
- if (node.expr.is_a?(Sass::Script::Tree::ListLiteral) ||
23
- node.expr.is_a?(Sass::Script::Tree::MapLiteral)) &&
24
- !node_on_single_line?(node)
22
+ if node.expr.is_a?(Sass::Script::Tree::ListLiteral) ||
23
+ node.expr.is_a?(Sass::Script::Tree::MapLiteral)
25
24
  return check_semicolon(node)
26
25
  end
27
26
 
@@ -26,7 +26,7 @@ module SCSSLint
26
26
 
27
27
  def plugin_directories
28
28
  Array(@config['plugin_directories']).map do |directory|
29
- LinterDir.new(directory)
29
+ LinterDir.new(File.join(File.dirname(@config.file), directory))
30
30
  end
31
31
  end
32
32
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Defines the gem version.
4
4
  module SCSSLint
5
- VERSION = '0.44.0'.freeze
5
+ VERSION = '0.45.0'.freeze
6
6
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'fileutils'
2
3
 
3
4
  describe SCSSLint::FileFinder do
4
5
  let(:config) { SCSSLint::Config.default }
@@ -21,12 +22,12 @@ describe SCSSLint::FileFinder do
21
22
 
22
23
  context 'and there are SCSS files under the current directory' do
23
24
  before do
24
- `touch blah.scss`
25
- `mkdir -p more`
26
- `touch more/more.scss`
25
+ FileUtils.touch('blah.scss')
26
+ FileUtils.mkdir_p('more')
27
+ FileUtils.touch(File.join('more', 'more.scss'))
27
28
  end
28
29
 
29
- it { should == ['blah.scss', 'more/more.scss'] }
30
+ it { should == ['blah.scss', File.join('more', 'more.scss')] }
30
31
  end
31
32
 
32
33
  context 'and a default set of files is specified in the config' do
@@ -45,7 +46,7 @@ describe SCSSLint::FileFinder do
45
46
 
46
47
  context 'and those files exist' do
47
48
  before do
48
- `touch test.txt`
49
+ FileUtils.touch('test.txt')
49
50
  end
50
51
 
51
52
  it { should == ['test.txt'] }
@@ -66,10 +67,10 @@ describe SCSSLint::FileFinder do
66
67
 
67
68
  context 'and they contain SCSS files' do
68
69
  before do
69
- `touch some-dir/test.scss`
70
+ FileUtils.touch(File.join('some-dir', 'test.scss'))
70
71
  end
71
72
 
72
- it { should == ['some-dir/test.scss'] }
73
+ it { should == [File.join('some-dir', 'test.scss')] }
73
74
 
74
75
  context 'and those SCSS files are excluded by the config' do
75
76
  before do
@@ -82,19 +83,20 @@ describe SCSSLint::FileFinder do
82
83
 
83
84
  context 'and they contain CSS files' do
84
85
  before do
85
- `touch some-dir/test.css`
86
+ FileUtils.touch(File.join('some-dir', 'test.css'))
86
87
  end
87
88
 
88
- it { should == ['some-dir/test.css'] }
89
+ it { should == [File.join('some-dir', 'test.css')] }
89
90
  end
90
91
 
91
92
  context 'and they contain more directories with files with recognized extensions' do
92
93
  before do
93
94
  `mkdir -p some-dir/more-dir`
94
- `touch some-dir/more-dir/test.scss`
95
+ FileUtils.mkdir_p(File.join('some-dir', 'more-dir'))
96
+ FileUtils.touch(File.join('some-dir', 'more-dir', 'test.scss'))
95
97
  end
96
98
 
97
- it { should == ['some-dir/more-dir/test.scss'] }
99
+ it { should == [File.join('some-dir', 'more-dir', 'test.scss')] }
98
100
 
99
101
  context 'and those SCSS files are excluded by the config' do
100
102
  before do
@@ -107,7 +109,7 @@ describe SCSSLint::FileFinder do
107
109
 
108
110
  context 'and they contain no SCSS files' do
109
111
  before do
110
- `touch some-dir/test.txt`
112
+ FileUtils.touch(File.join('some-dir', 'test.txt'))
111
113
  end
112
114
 
113
115
  it 'raises an error' do
@@ -11,6 +11,8 @@ describe SCSSLint::Linter::BorderZero do
11
11
  end
12
12
 
13
13
  context 'when a property' do
14
+ let(:lint_description) { subject.lints.first.description }
15
+
14
16
  context 'contains a normal border' do
15
17
  let(:scss) { <<-SCSS }
16
18
  p {
@@ -39,6 +41,10 @@ describe SCSSLint::Linter::BorderZero do
39
41
  SCSS
40
42
 
41
43
  it { should report_lint line: 2 }
44
+
45
+ it 'should report lint with the border property in the description' do
46
+ lint_description.should == '`border: 0` is preferred over `border: none`'
47
+ end
42
48
  end
43
49
 
44
50
  context 'has a border-top of none' do
@@ -49,6 +55,10 @@ describe SCSSLint::Linter::BorderZero do
49
55
  SCSS
50
56
 
51
57
  it { should report_lint line: 2 }
58
+
59
+ it 'should report lint with the border-top property in the description' do
60
+ lint_description.should == '`border-top: 0` is preferred over `border-top: none`'
61
+ end
52
62
  end
53
63
 
54
64
  context 'has a border-right of none' do
@@ -59,6 +69,10 @@ describe SCSSLint::Linter::BorderZero do
59
69
  SCSS
60
70
 
61
71
  it { should report_lint line: 2 }
72
+
73
+ it 'should report lint with the border-right property in the description' do
74
+ lint_description.should == '`border-right: 0` is preferred over `border-right: none`'
75
+ end
62
76
  end
63
77
 
64
78
  context 'has a border-bottom of none' do
@@ -69,6 +83,10 @@ describe SCSSLint::Linter::BorderZero do
69
83
  SCSS
70
84
 
71
85
  it { should report_lint line: 2 }
86
+
87
+ it 'should report lint with the border-bottom property in the description' do
88
+ lint_description.should == '`border-bottom: 0` is preferred over `border-bottom: none`'
89
+ end
72
90
  end
73
91
 
74
92
  context 'has a border-left of none' do
@@ -79,6 +97,10 @@ describe SCSSLint::Linter::BorderZero do
79
97
  SCSS
80
98
 
81
99
  it { should report_lint line: 2 }
100
+
101
+ it 'should report lint with the border-left property in the description' do
102
+ lint_description.should == '`border-left: 0` is preferred over `border-left: none`'
103
+ end
82
104
  end
83
105
  end
84
106
 
@@ -19,6 +19,11 @@ describe SCSSLint::Linter::Indentation do
19
19
  SCSS
20
20
 
21
21
  it { should_not report_lint }
22
+
23
+ context 'with carriage returns for newlines' do
24
+ let(:scss) { "p {\r margin: 0;\r}" }
25
+ it { should_not report_lint }
26
+ end
22
27
  end
23
28
 
24
29
  context 'when lines in a rule set are not properly indented' do
@@ -33,6 +38,13 @@ describe SCSSLint::Linter::Indentation do
33
38
  it { should report_lint line: 2 }
34
39
  it { should_not report_lint line: 3 }
35
40
  it { should report_lint line: 4 }
41
+
42
+ context 'with carriage returns for newlines' do
43
+ let(:scss) { "p {\rmargin: 0;\r padding: 1em;}" }
44
+ it { should_not report_lint line: 1 }
45
+ it { should report_lint line: 2 }
46
+ it { should_not report_lint line: 3 }
47
+ end
36
48
  end
37
49
 
38
50
  context 'when selector of a nested rule set is not properly indented' do
@@ -70,4 +70,24 @@ describe SCSSLint::Linter::SingleLinePerProperty do
70
70
  it { should report_lint }
71
71
  end
72
72
  end
73
+
74
+ context 'when a nested single line rule set contains a single property' do
75
+ let(:scss) { <<-SCSS }
76
+ .my-selector {
77
+ p { color: #fff; }
78
+ }
79
+ SCSS
80
+
81
+ context 'and single line rule sets are allowed' do
82
+ let(:linter_config) { { 'allow_single_line_rule_sets' => true } }
83
+
84
+ it { should_not report_lint }
85
+ end
86
+
87
+ context 'and single line rule sets are not allowed' do
88
+ let(:linter_config) { { 'allow_single_line_rule_sets' => false } }
89
+
90
+ it { should report_lint }
91
+ end
92
+ end
73
93
  end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::SpaceAfterVariableColon do
4
+ let(:linter_config) { { 'style' => style } }
5
+
6
+ context 'when one space is preferred' do
7
+ let(:style) { 'one_space' }
8
+
9
+ context 'when the colon after a variable is not followed by space' do
10
+ let(:scss) { '$my-color:#fff;' }
11
+
12
+ it { should report_lint line: 1 }
13
+ end
14
+
15
+ context 'when the colon after a variable is followed by more than one space' do
16
+ let(:scss) { '$my-color: #fff;' }
17
+
18
+ it { should report_lint line: 1 }
19
+ end
20
+
21
+ context 'when the colon after a variable is followed by a space' do
22
+ let(:scss) { '$my-color: #fff;' }
23
+
24
+ it { should_not report_lint }
25
+ end
26
+
27
+ context 'when the colon after a variable is surrounded by spaces' do
28
+ let(:scss) { '$my-color : #fff;' }
29
+
30
+ it { should_not report_lint }
31
+ end
32
+
33
+ context 'when the colon after a variable is followed by a space and a newline' do
34
+ let(:scss) { <<-SCSS }
35
+ $my-color:\s
36
+ #fff;
37
+ SCSS
38
+
39
+ it { should report_lint line: 1 }
40
+ end
41
+
42
+ context 'when the colon after a property is followed by a tab' do
43
+ let(:scss) { <<-SCSS }
44
+ $my-color:\t#fff;
45
+ SCSS
46
+
47
+ it { should report_lint line: 1 }
48
+ end
49
+ end
50
+
51
+ context 'when no spaces are allowed' do
52
+ let(:style) { 'no_space' }
53
+
54
+ context 'when the colon after a variable is not followed by space' do
55
+ let(:scss) { '$my-color:#fff;' }
56
+
57
+ it { should_not report_lint }
58
+ end
59
+
60
+ context 'when colon after variable is not followed by space and the semicolon is missing' do
61
+ let(:scss) { '$my-color:#fff' }
62
+
63
+ it { should_not report_lint }
64
+ end
65
+
66
+ context 'when the colon after a property is followed by a space' do
67
+ let(:scss) { '$my-color: #fff;' }
68
+
69
+ it { should report_lint line: 1 }
70
+ end
71
+
72
+ context 'when the colon after a property is surrounded by spaces' do
73
+ let(:scss) { '$my-color : #fff;' }
74
+
75
+ it { should report_lint line: 1 }
76
+ end
77
+
78
+ context 'when the colon after a property is followed by multiple spaces' do
79
+ let(:scss) { '$my-color: #fff;' }
80
+
81
+ it { should report_lint line: 1 }
82
+ end
83
+
84
+ context 'when the colon after a property is followed by a newline' do
85
+ let(:scss) { <<-SCSS }
86
+ $my-color:
87
+ #fff;
88
+ SCSS
89
+
90
+ it { should report_lint line: 1 }
91
+ end
92
+
93
+ context 'when the colon after a property is followed by a tab' do
94
+ let(:scss) { <<-SCSS }
95
+ $my-color:\t#fff;
96
+ SCSS
97
+
98
+ it { should report_lint line: 1 }
99
+ end
100
+ end
101
+
102
+ context 'when at least one space is preferred' do
103
+ let(:style) { 'at_least_one_space' }
104
+
105
+ context 'when the colon after a variable is not followed by space' do
106
+ let(:scss) { '$my-color:#fff;' }
107
+
108
+ it { should report_lint line: 1 }
109
+ end
110
+
111
+ context 'when colon after variable is not followed by space and the semicolon is missing' do
112
+ let(:scss) { '$my-color:#fff' }
113
+
114
+ it { should report_lint line: 1 }
115
+ end
116
+
117
+ context 'when the colon after a variable is followed by a space' do
118
+ let(:scss) { '$my-color: #fff;' }
119
+
120
+ it { should_not report_lint }
121
+ end
122
+
123
+ context 'when the colon after a variable is surrounded by spaces' do
124
+ let(:scss) { '$my-color : #fff;' }
125
+
126
+ it { should_not report_lint }
127
+ end
128
+
129
+ context 'when the colon after a variable is followed by multiple spaces' do
130
+ let(:scss) { '$my-color: #fff;' }
131
+
132
+ it { should_not report_lint }
133
+ end
134
+
135
+ context 'when the colon after a property is followed by multiple spaces and a tab' do
136
+ let(:scss) { <<-SCSS }
137
+ $my-color: \t#fff;
138
+ SCSS
139
+
140
+ it { should report_lint line: 1 }
141
+ end
142
+ end
143
+
144
+ context 'when one space or newline is preferred' do
145
+ let(:style) { 'one_space_or_newline' }
146
+
147
+ context 'when the colon after a variabl is not followed by space' do
148
+ let(:scss) { '$my-color:#fff;' }
149
+
150
+ it { should report_lint line: 1 }
151
+ end
152
+
153
+ context 'when the colon after a variable is followed by a space' do
154
+ let(:scss) { '$my-color: #fff;' }
155
+
156
+ it { should_not report_lint }
157
+ end
158
+
159
+ context 'when the colon after a variable is followed by a newline and spaces' do
160
+ let(:scss) { <<-SCSS }
161
+ $my-color:
162
+ #fff;
163
+ SCSS
164
+
165
+ it { should_not report_lint }
166
+ end
167
+
168
+ context 'when the colon after a variable is followed by a newline and no spaces' do
169
+ let(:scss) { <<-SCSS }
170
+ $my-color:
171
+ #fff;
172
+ SCSS
173
+
174
+ it { should_not report_lint }
175
+ end
176
+
177
+ context 'when the colon after a variable is followed by a space and then a newline' do
178
+ let(:scss) { <<-SCSS }
179
+ $my-color:\s
180
+ #fff;
181
+ SCSS
182
+
183
+ it { should report_lint line: 1 }
184
+ end
185
+ end
186
+ end
@@ -442,62 +442,226 @@ describe SCSSLint::Linter::TrailingSemicolon do
442
442
  end
443
443
  end
444
444
 
445
- context 'when a variable declaration contains a multiline map' do
446
- context 'with a trailing comma' do
445
+ context 'when a variable declaration contains a list' do
446
+ context 'with parentheses' do
447
447
  context 'and ends with a semicolon' do
448
- let(:scss) { "$foo: (\n one: 1,\ntwo: 2,\n);" }
448
+ let(:scss) { '$foo: (1 2);' }
449
449
 
450
450
  it { should_not report_lint }
451
451
  end
452
452
 
453
453
  context 'and is missing a semicolon' do
454
- let(:scss) { "$foo: (\n one: 1,\ntwo: 2,\n)" }
454
+ let(:scss) { '$foo: (1 2)' }
455
455
 
456
456
  it { should report_lint }
457
457
  end
458
+
459
+ context 'and a nested list' do
460
+ context 'with parentheses' do
461
+ context 'on a single line' do
462
+ context 'and ends with a semicolon' do
463
+ let(:scss) { '$foo: (1 (2 3));' }
464
+
465
+ it { should_not report_lint }
466
+ end
467
+
468
+ context 'and is missing a semicolon' do
469
+ let(:scss) { '$foo: (1 (2 3))' }
470
+
471
+ it { should report_lint }
472
+ end
473
+ end
474
+
475
+ context 'over multiple lines' do
476
+ context 'and ends with a semicolon' do
477
+ let(:scss) { <<-SCSS }
478
+ $foo: (1
479
+ (2 3)
480
+ );
481
+ SCSS
482
+ it { should_not report_lint }
483
+ end
484
+
485
+ context 'and is missing a semicolon' do
486
+ let(:scss) { <<-SCSS }
487
+ $foo: (1
488
+ (2 3)
489
+ )
490
+ SCSS
491
+
492
+ it { should report_lint }
493
+ end
494
+ end
495
+ end
496
+
497
+ context 'without parentheses' do
498
+ context 'and ends with a semicolon' do
499
+ let(:scss) { <<-SCSS }
500
+ $foo: (10
501
+ 20 21 22
502
+ 30);
503
+ SCSS
504
+
505
+ it { should_not report_lint }
506
+ end
507
+
508
+ context 'and is missing a semicolon' do
509
+ let(:scss) { <<-SCSS }
510
+ $foo: (10
511
+ 20 21 22
512
+ 30)
513
+ SCSS
514
+
515
+ it { should report_lint }
516
+ end
517
+ end
518
+ end
458
519
  end
459
520
 
460
- context 'without a trailing comma' do
521
+ context 'without parentheses' do
461
522
  context 'and ends with a semicolon' do
462
- let(:scss) { "$foo: (\n one: 1,\ntwo: 2\n);" }
523
+ let(:scss) { '$foo: 1 2;' }
463
524
 
464
525
  it { should_not report_lint }
465
526
  end
466
527
 
467
528
  context 'and is missing a semicolon' do
468
- let(:scss) { "$foo: (\n one: 1,\ntwo: 2\n)" }
529
+ let(:scss) { '$foo: 1 2' }
469
530
 
470
531
  it { should report_lint }
471
532
  end
533
+
534
+ context 'and a nested list' do
535
+ context 'with parentheses' do
536
+ context 'on a single line' do
537
+ context 'and ends with a semicolon' do
538
+ let(:scss) { '$foo: 1 (2 3);' }
539
+
540
+ it { should_not report_lint }
541
+ end
542
+
543
+ context 'and is missing a semicolon' do
544
+ let(:scss) { '$foo: 1 (2 3)' }
545
+
546
+ it { should report_lint }
547
+ end
548
+ end
549
+
550
+ context 'over multiple lines' do
551
+ context 'and ends with a semicolon' do
552
+ let(:scss) { <<-SCSS }
553
+ $foo: 1
554
+ (2 3);
555
+ SCSS
556
+ it { should_not report_lint }
557
+ end
558
+
559
+ context 'and is missing a semicolon' do
560
+ let(:scss) { <<-SCSS }
561
+ $foo: 1
562
+ (2 3)
563
+ SCSS
564
+
565
+ it { should report_lint }
566
+ end
567
+ end
568
+ end
569
+
570
+ context 'without parentheses' do
571
+ context 'and ends with a semicolon' do
572
+ let(:scss) { <<-SCSS }
573
+ $foo: 1,
574
+ 2 3;
575
+ SCSS
576
+
577
+ it { should_not report_lint }
578
+ end
579
+
580
+ context 'and is missing a semicolon' do
581
+ let(:scss) { <<-SCSS }
582
+ $foo: 1,
583
+ 2 3
584
+ SCSS
585
+
586
+ it { should report_lint }
587
+ end
588
+ end
589
+ end
472
590
  end
591
+ end
473
592
 
474
- context 'and a nested list' do
593
+ context 'when a variable declaration contains a map' do
594
+ context 'on a single line' do
475
595
  context 'and ends with a semicolon' do
476
- let(:scss) { <<-SCSS }
477
- $foo: (
478
- "a": (
479
- "b",
480
- "c"
481
- )
482
- );
483
- SCSS
596
+ let(:scss) { '$foo: ("a": ("b": "c"));' }
484
597
 
485
598
  it { should_not report_lint }
486
599
  end
487
600
 
488
601
  context 'and is missing a semicolon' do
489
- let(:scss) { <<-SCSS }
490
- $foo: (
491
- "a": (
492
- "b",
493
- "c"
494
- )
495
- )
496
- SCSS
602
+ let(:scss) { '$foo: ("a": ("b": "c"))' }
497
603
 
498
604
  it { should report_lint }
499
605
  end
500
606
  end
607
+
608
+ context 'over multiple lines' do
609
+ context 'with a trailing comma' do
610
+ context 'and ends with a semicolon' do
611
+ let(:scss) { "$foo: (\n one: 1,\ntwo: 2,\n);" }
612
+
613
+ it { should_not report_lint }
614
+ end
615
+
616
+ context 'and is missing a semicolon' do
617
+ let(:scss) { "$foo: (\n one: 1,\ntwo: 2,\n)" }
618
+
619
+ it { should report_lint }
620
+ end
621
+ end
622
+
623
+ context 'without a trailing comma' do
624
+ context 'and ends with a semicolon' do
625
+ let(:scss) { "$foo: (\n one: 1,\ntwo: 2\n);" }
626
+
627
+ it { should_not report_lint }
628
+ end
629
+
630
+ context 'and is missing a semicolon' do
631
+ let(:scss) { "$foo: (\n one: 1,\ntwo: 2\n)" }
632
+
633
+ it { should report_lint }
634
+ end
635
+ end
636
+
637
+ context 'and a nested list' do
638
+ context 'and ends with a semicolon' do
639
+ let(:scss) { <<-SCSS }
640
+ $foo: (
641
+ "a": (
642
+ "b",
643
+ "c"
644
+ )
645
+ );
646
+ SCSS
647
+
648
+ it { should_not report_lint }
649
+ end
650
+
651
+ context 'and is missing a semicolon' do
652
+ let(:scss) { <<-SCSS }
653
+ $foo: (
654
+ "a": (
655
+ "b",
656
+ "c"
657
+ )
658
+ )
659
+ SCSS
660
+
661
+ it { should report_lint }
662
+ end
663
+ end
664
+ end
501
665
  end
502
666
 
503
667
  context 'with an @extend directive' do
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module SCSSLint
4
4
  describe Plugins do
5
- let(:subject) { described_class.new(Config.new(config_options)) }
5
+ let(:subject) { described_class.new(Config.new(config_options, Config.user_file)) }
6
6
 
7
7
  describe '#load' do
8
8
  context 'when gem plugins are specified' do
@@ -22,9 +22,10 @@ module SCSSLint
22
22
  context 'when directory plugins are specified' do
23
23
  let(:config_options) { { 'plugin_directories' => ['some_dir'] } }
24
24
  let(:plugin) { double(load: nil) }
25
+ let(:plugin_dir) { File.join(File.dirname(Config.user_file), 'some_dir') }
25
26
 
26
27
  before do
27
- Plugins::LinterDir.stub(:new).with('some_dir').and_return(plugin)
28
+ Plugins::LinterDir.stub(:new).with(plugin_dir).and_return(plugin)
28
29
  end
29
30
 
30
31
  it 'loads the plugin' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scss_lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.44.0
4
+ version: 0.45.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brigade Engineering
@@ -9,22 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-01-22 00:00:00.000000000 Z
12
+ date: 2016-02-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0.9'
21
+ - - "<"
19
22
  - !ruby/object:Gem::Version
20
- version: '10.0'
23
+ version: '11'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - "~>"
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '0.9'
31
+ - - "<"
26
32
  - !ruby/object:Gem::Version
27
- version: '10.0'
33
+ version: '11'
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: sass
30
36
  requirement: !ruby/object:Gem::Requirement
@@ -126,6 +132,7 @@ files:
126
132
  - lib/scss_lint/linter/space_after_comma.rb
127
133
  - lib/scss_lint/linter/space_after_property_colon.rb
128
134
  - lib/scss_lint/linter/space_after_property_name.rb
135
+ - lib/scss_lint/linter/space_after_variable_colon.rb
129
136
  - lib/scss_lint/linter/space_after_variable_name.rb
130
137
  - lib/scss_lint/linter/space_around_operator.rb
131
138
  - lib/scss_lint/linter/space_before_brace.rb
@@ -210,6 +217,7 @@ files:
210
217
  - spec/scss_lint/linter/space_after_comma_spec.rb
211
218
  - spec/scss_lint/linter/space_after_property_colon_spec.rb
212
219
  - spec/scss_lint/linter/space_after_property_name_spec.rb
220
+ - spec/scss_lint/linter/space_after_variable_colon_spec.rb
213
221
  - spec/scss_lint/linter/space_after_variable_name_spec.rb
214
222
  - spec/scss_lint/linter/space_around_operator_spec.rb
215
223
  - spec/scss_lint/linter/space_before_brace_spec.rb
@@ -320,6 +328,7 @@ test_files:
320
328
  - spec/scss_lint/linter/space_after_comma_spec.rb
321
329
  - spec/scss_lint/linter/space_after_property_colon_spec.rb
322
330
  - spec/scss_lint/linter/space_after_property_name_spec.rb
331
+ - spec/scss_lint/linter/space_after_variable_colon_spec.rb
323
332
  - spec/scss_lint/linter/space_after_variable_name_spec.rb
324
333
  - spec/scss_lint/linter/space_around_operator_spec.rb
325
334
  - spec/scss_lint/linter/space_before_brace_spec.rb