scss_lint 0.44.0 → 0.45.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 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