scss-lint 0.21.0 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +5 -0
- data/lib/scss_lint/engine.rb +3 -3
- data/lib/scss_lint/linter/empty_line_between_blocks.rb +0 -14
- data/lib/scss_lint/linter/final_newline.rb +20 -0
- data/lib/scss_lint/linter/space_after_property_colon.rb +9 -4
- data/lib/scss_lint/linter/space_before_brace.rb +11 -2
- data/lib/scss_lint/linter/trailing_semicolon_after_property_value.rb +17 -4
- data/lib/scss_lint/linter/url_format.rb +1 -0
- data/lib/scss_lint/linter/zero_unit.rb +2 -0
- data/lib/scss_lint/linter.rb +21 -9
- data/lib/scss_lint/version.rb +1 -1
- metadata +42 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70bae0144c5b9e28dc02a481787f9a59d6904829
|
4
|
+
data.tar.gz: 0ae51c9a6ab0cca63274d0026ad07c27acecad75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3040302bcde27b996f2f1bb0e3825c0173c6b965d5ffe41e50d7c9313de01ef00482a7c4b408837776882098c9a492c82fb1bd86a2f9eb9b8536c7db838e7c1
|
7
|
+
data.tar.gz: ded041dd16b6b836c21db252c2747acabe2be2296b321cbfc763a7cdd89f9c8232c00b76f37f11045deb4adbb30842316154a32670f7c29c831a94e4061f0943
|
data/config/default.yml
CHANGED
@@ -28,6 +28,10 @@ linters:
|
|
28
28
|
EmptyRule:
|
29
29
|
enabled: true
|
30
30
|
|
31
|
+
FinalNewline:
|
32
|
+
enabled: true
|
33
|
+
present: true
|
34
|
+
|
31
35
|
HexFormat:
|
32
36
|
enabled: true
|
33
37
|
|
@@ -77,6 +81,7 @@ linters:
|
|
77
81
|
|
78
82
|
SpaceBeforeBrace:
|
79
83
|
enabled: true
|
84
|
+
allow_single_line_padding: false
|
80
85
|
|
81
86
|
SpaceBetweenParens:
|
82
87
|
enabled: true
|
data/lib/scss_lint/engine.rb
CHANGED
@@ -20,11 +20,11 @@ module SCSSLint
|
|
20
20
|
@contents = scss_or_filename
|
21
21
|
end
|
22
22
|
|
23
|
-
@lines = @contents.
|
23
|
+
@lines = @contents.lines.to_a # Need `to_a` for Ruby 1.9.3
|
24
24
|
@tree = @engine.to_tree
|
25
|
-
rescue Encoding::UndefinedConversionError,
|
25
|
+
rescue Encoding::UndefinedConversionError, Sass::SyntaxError => error
|
26
26
|
if error.is_a?(Encoding::UndefinedConversionError) ||
|
27
|
-
error.message.
|
27
|
+
error.message.match(/invalid.*(byte sequence|character)/i)
|
28
28
|
raise FileEncodingError,
|
29
29
|
"Unable to parse SCSS file: #{error}",
|
30
30
|
error.backtrace
|
@@ -80,19 +80,5 @@ module SCSSLint
|
|
80
80
|
.children
|
81
81
|
.select { |child| child.is_a?(Sass::Tree::Node) }
|
82
82
|
end
|
83
|
-
|
84
|
-
def node_on_single_line(node)
|
85
|
-
return if node.source_range.start_pos.line != node.source_range.end_pos.line
|
86
|
-
|
87
|
-
# The Sass parser reports an incorrect source range if the trailing curly
|
88
|
-
# brace is on the next line, e.g.
|
89
|
-
#
|
90
|
-
# p {
|
91
|
-
# }
|
92
|
-
#
|
93
|
-
# Since we don't want to count this as a single line node, check if the
|
94
|
-
# last character on the first line is an opening curly brace.
|
95
|
-
engine.lines[node.line - 1].strip[-1] != '{'
|
96
|
-
end
|
97
83
|
end
|
98
84
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
# Checks for final newlines at the end of a file.
|
3
|
+
class Linter::FinalNewline < Linter
|
4
|
+
include LinterRegistry
|
5
|
+
|
6
|
+
def visit_root(node)
|
7
|
+
return if engine.lines.empty?
|
8
|
+
|
9
|
+
ends_with_newline = engine.lines[-1][-1] == "\n"
|
10
|
+
|
11
|
+
if config['present']
|
12
|
+
add_lint(engine.lines.count,
|
13
|
+
'Files should end with a trailing newline') unless ends_with_newline
|
14
|
+
else
|
15
|
+
add_lint(engine.lines.count,
|
16
|
+
'Files should not end with a trailing newline') if ends_with_newline
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,15 +4,20 @@ module SCSSLint
|
|
4
4
|
class Linter::SpaceAfterPropertyColon < Linter
|
5
5
|
include LinterRegistry
|
6
6
|
|
7
|
-
|
7
|
+
MINIMUM_SPACES_AFTER_COLON = 1
|
8
8
|
|
9
9
|
def visit_prop(node)
|
10
10
|
spaces = spaces_after_colon(node)
|
11
11
|
|
12
|
-
if
|
12
|
+
if config['allow_extra_spaces']
|
13
|
+
if spaces < MINIMUM_SPACES_AFTER_COLON
|
14
|
+
add_lint node, 'Colon after property should be followed by ' <<
|
15
|
+
"at least #{pluralize(MINIMUM_SPACES_AFTER_COLON, 'space')} "
|
16
|
+
end
|
17
|
+
elsif spaces != MINIMUM_SPACES_AFTER_COLON
|
13
18
|
add_lint node, 'Colon after property should be followed by ' <<
|
14
|
-
|
15
|
-
pluralize(spaces, 'space')
|
19
|
+
pluralize(MINIMUM_SPACES_AFTER_COLON, 'space') <<
|
20
|
+
" instead of #{pluralize(spaces, 'space')}"
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
@@ -5,8 +5,17 @@ module SCSSLint
|
|
5
5
|
|
6
6
|
def visit_root(node)
|
7
7
|
engine.lines.each_with_index do |line, index|
|
8
|
-
|
9
|
-
|
8
|
+
|
9
|
+
if config['allow_single_line_padding'] && node_on_single_line(node)
|
10
|
+
line.scan(/[^"#' ]\{/) do |match|
|
11
|
+
add_lint(index + 1, 'Opening curly brace `{` should be ' <<
|
12
|
+
'preceded by at least one space')
|
13
|
+
end
|
14
|
+
else
|
15
|
+
line.scan(/[^"#'](?<![^ ] )\{/) do |match|
|
16
|
+
add_lint(index + 1, 'Opening curly brace `{` should be ' <<
|
17
|
+
'preceded by one space')
|
18
|
+
end
|
10
19
|
end
|
11
20
|
end
|
12
21
|
end
|
@@ -7,8 +7,18 @@ module SCSSLint
|
|
7
7
|
def visit_prop(node)
|
8
8
|
has_nested_props = has_nested_properties?(node)
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
unless has_nested_props
|
11
|
+
if has_space_before_semicolon?(node)
|
12
|
+
line = node.source_range.end_pos
|
13
|
+
add_lint line, 'Property declaration should be terminated by a semicolon'
|
14
|
+
elsif !ends_with_semicolon?(node)
|
15
|
+
# Adjust line since lack of semicolon results in end of source range
|
16
|
+
# being on the next line
|
17
|
+
line = node.source_range.end_pos.line - 1
|
18
|
+
add_lint line,
|
19
|
+
'Property declaration should not have a space before ' <<
|
20
|
+
'the terminating semicolon'
|
21
|
+
end
|
12
22
|
end
|
13
23
|
|
14
24
|
yield if has_nested_props
|
@@ -22,8 +32,11 @@ module SCSSLint
|
|
22
32
|
|
23
33
|
# Checks that the property is ended by a semicolon (with no whitespace)
|
24
34
|
def ends_with_semicolon?(node)
|
25
|
-
|
26
|
-
|
35
|
+
source_from_range(node.source_range) =~ /;$/
|
36
|
+
end
|
37
|
+
|
38
|
+
def has_space_before_semicolon?(node)
|
39
|
+
source_from_range(node.source_range) =~ /\s;$/
|
27
40
|
end
|
28
41
|
end
|
29
42
|
end
|
data/lib/scss_lint/linter.rb
CHANGED
@@ -37,9 +37,6 @@ module SCSSLint
|
|
37
37
|
actual_line = source_position.line - 1
|
38
38
|
actual_offset = source_position.offset + offset - 1
|
39
39
|
|
40
|
-
# Return a newline if offset points at the very end of the line
|
41
|
-
return "\n" if actual_offset == engine.lines[actual_line].length
|
42
|
-
|
43
40
|
engine.lines[actual_line][actual_offset]
|
44
41
|
end
|
45
42
|
|
@@ -60,20 +57,35 @@ module SCSSLint
|
|
60
57
|
|
61
58
|
current_line += 1
|
62
59
|
while current_line < last_line
|
63
|
-
source += "#{engine.lines[current_line]}
|
60
|
+
source += "#{engine.lines[current_line]}"
|
64
61
|
current_line += 1
|
65
62
|
end
|
66
63
|
|
67
|
-
if source_range.start_pos.line != source_range.end_pos.line
|
68
|
-
|
69
|
-
# line after the last line; don't include the last line in this case.
|
70
|
-
engine.lines.count == current_line - 1
|
71
|
-
source += "#{engine.lines[current_line][0...source_range.end_pos.offset]}\n"
|
64
|
+
if source_range.start_pos.line != source_range.end_pos.line
|
65
|
+
source += "#{(engine.lines[current_line] || '')[0...source_range.end_pos.offset]}"
|
72
66
|
end
|
73
67
|
|
74
68
|
source
|
75
69
|
end
|
76
70
|
|
71
|
+
# Returns whether a given node spans only a single line.
|
72
|
+
#
|
73
|
+
# @param node [Sass::Tree::Node]
|
74
|
+
# @return [true,false] whether the node spans a single line
|
75
|
+
def node_on_single_line(node)
|
76
|
+
return if node.source_range.start_pos.line != node.source_range.end_pos.line
|
77
|
+
|
78
|
+
# The Sass parser reports an incorrect source range if the trailing curly
|
79
|
+
# brace is on the next line, e.g.
|
80
|
+
#
|
81
|
+
# p {
|
82
|
+
# }
|
83
|
+
#
|
84
|
+
# Since we don't want to count this as a single line node, check if the
|
85
|
+
# last character on the first line is an opening curly brace.
|
86
|
+
engine.lines[node.line - 1].strip[-1] != '{'
|
87
|
+
end
|
88
|
+
|
77
89
|
# Modified so we can also visit selectors in linters
|
78
90
|
#
|
79
91
|
# @param node [Sass::Tree::Node, Sass::Script::Tree::Node,
|
data/lib/scss_lint/version.rb
CHANGED
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.
|
4
|
+
version: 0.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Causes Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rainbow
|
@@ -78,56 +78,57 @@ extra_rdoc_files: []
|
|
78
78
|
files:
|
79
79
|
- config/default.yml
|
80
80
|
- data/properties.txt
|
81
|
-
- lib/scss_lint/
|
82
|
-
- lib/scss_lint/config.rb
|
81
|
+
- lib/scss_lint/version.rb
|
83
82
|
- lib/scss_lint/constants.rb
|
84
|
-
- lib/scss_lint/
|
83
|
+
- lib/scss_lint/utils.rb
|
84
|
+
- lib/scss_lint/reporter/files_reporter.rb
|
85
|
+
- lib/scss_lint/reporter/xml_reporter.rb
|
86
|
+
- lib/scss_lint/reporter/default_reporter.rb
|
87
|
+
- lib/scss_lint/runner.rb
|
88
|
+
- lib/scss_lint/reporter.rb
|
85
89
|
- lib/scss_lint/lint.rb
|
86
|
-
- lib/scss_lint/linter
|
87
|
-
- lib/scss_lint/
|
88
|
-
- lib/scss_lint/
|
89
|
-
- lib/scss_lint/
|
90
|
-
- lib/scss_lint/
|
90
|
+
- lib/scss_lint/linter.rb
|
91
|
+
- lib/scss_lint/rake_task.rb
|
92
|
+
- lib/scss_lint/selector_visitor.rb
|
93
|
+
- lib/scss_lint/sass/tree.rb
|
94
|
+
- lib/scss_lint/sass/script.rb
|
95
|
+
- lib/scss_lint/config.rb
|
91
96
|
- lib/scss_lint/linter/compass.rb
|
92
|
-
- lib/scss_lint/linter/
|
93
|
-
- lib/scss_lint/linter/
|
94
|
-
- lib/scss_lint/linter/
|
95
|
-
- lib/scss_lint/linter/empty_line_between_blocks.rb
|
96
|
-
- lib/scss_lint/linter/empty_rule.rb
|
97
|
-
- lib/scss_lint/linter/hex_format.rb
|
98
|
-
- lib/scss_lint/linter/id_with_extraneous_selector.rb
|
97
|
+
- lib/scss_lint/linter/space_after_comma.rb
|
98
|
+
- lib/scss_lint/linter/space_before_brace.rb
|
99
|
+
- lib/scss_lint/linter/capitalization_in_selector.rb
|
99
100
|
- lib/scss_lint/linter/indentation.rb
|
100
|
-
- lib/scss_lint/linter/
|
101
|
-
- lib/scss_lint/linter/
|
101
|
+
- lib/scss_lint/linter/trailing_semicolon_after_property_value.rb
|
102
|
+
- lib/scss_lint/linter/shorthand.rb
|
103
|
+
- lib/scss_lint/linter/final_newline.rb
|
104
|
+
- lib/scss_lint/linter/id_with_extraneous_selector.rb
|
105
|
+
- lib/scss_lint/linter/empty_line_between_blocks.rb
|
106
|
+
- lib/scss_lint/linter/declaration_order.rb
|
107
|
+
- lib/scss_lint/linter/zero_unit.rb
|
102
108
|
- lib/scss_lint/linter/placeholder_in_extend.rb
|
103
|
-
- lib/scss_lint/linter/property_sort_order.rb
|
104
|
-
- lib/scss_lint/linter/property_spelling.rb
|
105
109
|
- lib/scss_lint/linter/selector_depth.rb
|
106
|
-
- lib/scss_lint/linter/
|
107
|
-
- lib/scss_lint/linter/single_line_per_selector.rb
|
108
|
-
- lib/scss_lint/linter/space_after_comma.rb
|
109
|
-
- lib/scss_lint/linter/space_after_property_colon.rb
|
110
|
+
- lib/scss_lint/linter/compass/property_with_mixin.rb
|
110
111
|
- lib/scss_lint/linter/space_after_property_name.rb
|
111
|
-
- lib/scss_lint/linter/
|
112
|
+
- lib/scss_lint/linter/property_spelling.rb
|
113
|
+
- lib/scss_lint/linter/url_quotes.rb
|
114
|
+
- lib/scss_lint/linter/name_format.rb
|
112
115
|
- lib/scss_lint/linter/space_between_parens.rb
|
116
|
+
- lib/scss_lint/linter/border_zero.rb
|
117
|
+
- lib/scss_lint/linter/space_after_property_colon.rb
|
118
|
+
- lib/scss_lint/linter/debug_statement.rb
|
119
|
+
- lib/scss_lint/linter/duplicate_property.rb
|
120
|
+
- lib/scss_lint/linter/property_sort_order.rb
|
121
|
+
- lib/scss_lint/linter/hex_format.rb
|
122
|
+
- lib/scss_lint/linter/color_keyword.rb
|
113
123
|
- lib/scss_lint/linter/string_quotes.rb
|
114
|
-
- lib/scss_lint/linter/
|
124
|
+
- lib/scss_lint/linter/leading_zero.rb
|
125
|
+
- lib/scss_lint/linter/comment.rb
|
126
|
+
- lib/scss_lint/linter/empty_rule.rb
|
127
|
+
- lib/scss_lint/linter/single_line_per_selector.rb
|
115
128
|
- lib/scss_lint/linter/url_format.rb
|
116
|
-
- lib/scss_lint/
|
117
|
-
- lib/scss_lint/
|
118
|
-
- lib/scss_lint/linter.rb
|
129
|
+
- lib/scss_lint/cli.rb
|
130
|
+
- lib/scss_lint/engine.rb
|
119
131
|
- lib/scss_lint/linter_registry.rb
|
120
|
-
- lib/scss_lint/rake_task.rb
|
121
|
-
- lib/scss_lint/reporter/default_reporter.rb
|
122
|
-
- lib/scss_lint/reporter/files_reporter.rb
|
123
|
-
- lib/scss_lint/reporter/xml_reporter.rb
|
124
|
-
- lib/scss_lint/reporter.rb
|
125
|
-
- lib/scss_lint/runner.rb
|
126
|
-
- lib/scss_lint/sass/script.rb
|
127
|
-
- lib/scss_lint/sass/tree.rb
|
128
|
-
- lib/scss_lint/selector_visitor.rb
|
129
|
-
- lib/scss_lint/utils.rb
|
130
|
-
- lib/scss_lint/version.rb
|
131
132
|
- lib/scss_lint.rb
|
132
133
|
- bin/scss-lint
|
133
134
|
homepage: https://github.com/causes/scss-lint
|