scss-lint 0.7.1 → 0.9.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 +7 -0
- data/lib/sass/script.rb +12 -0
- data/lib/scss_lint.rb +3 -1
- data/lib/scss_lint/cli.rb +27 -5
- data/lib/scss_lint/linter.rb +1 -1
- data/lib/scss_lint/linter/{border_zero_linter.rb → border_zero.rb} +1 -3
- data/lib/scss_lint/linter/capitalization_in_selector.rb +15 -0
- data/lib/scss_lint/linter/{comment_linter.rb → comment.rb} +1 -3
- data/lib/scss_lint/linter/{debug_linter.rb → debug_statement.rb} +1 -3
- data/lib/scss_lint/linter/{declaration_order_linter.rb → declaration_order.rb} +1 -3
- data/lib/scss_lint/linter/{declared_name_linter.rb → declared_name.rb} +9 -18
- data/lib/scss_lint/linter/{empty_rule_linter.rb → empty_rule.rb} +1 -3
- data/lib/scss_lint/linter/{hex_linter.rb → hex_format.rb} +1 -3
- data/lib/scss_lint/linter/no_zero_before_decimal.rb +22 -0
- data/lib/scss_lint/linter/placeholder_in_extend.rb +17 -0
- data/lib/scss_lint/linter/{property_format_linter.rb → property_format.rb} +1 -3
- data/lib/scss_lint/linter/{shorthand_linter.rb → shorthand.rb} +1 -3
- data/lib/scss_lint/linter/{single_line_per_selector_linter.rb → single_line_per_selector.rb} +0 -2
- data/lib/scss_lint/linter/sorted_properties.rb +68 -0
- data/lib/scss_lint/linter/space_before_brace.rb +17 -0
- data/lib/scss_lint/linter/{type_in_id_selector_linter.rb → type_in_id_selector.rb} +1 -3
- data/lib/scss_lint/linter/usage_name.rb +40 -0
- data/lib/scss_lint/linter/{zero_unit_linter.rb → zero_unit.rb} +1 -3
- data/lib/scss_lint/linter_registry.rb +2 -3
- data/lib/scss_lint/runner.rb +8 -10
- data/lib/scss_lint/utils.rb +38 -0
- data/lib/scss_lint/version.rb +1 -1
- metadata +34 -37
- data/lib/scss_lint/linter/sorted_properties_linter.rb +0 -27
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dbee51206b106602ef0961c6c03bfb6974d4f2eb
|
4
|
+
data.tar.gz: 2e87d30b614973420c6a8956ff4248325dbcc05d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4c3cba3c53f301916ee8ebcdab2e6ee7167e3014c7dae55bcf0b48a490f5f091cbb9ef20335a4133ab20de8b1e8b031900f6e6bf46b293b3a95e92a997195083
|
7
|
+
data.tar.gz: 10fc7fe143641a411666fe6ff26b434fe98d0fad0b58ac4e99113dd24e5fa09a0299a5ffdcded16bfd0eee8fff8728eeef4187e9a49aec8f74ba2f9adcc36302
|
data/lib/sass/script.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Contains extensions of Sass::Script::Nodes to add support for accessing
|
2
|
+
# various parts of the parse tree not provided out-of-the-box.
|
3
|
+
module Sass::Script
|
4
|
+
class Variable
|
5
|
+
# When accessing keyword arguments, the Sass parser treats the underscored
|
6
|
+
# name as canonical. Since this only matters during the compilation step, we
|
7
|
+
# can safely override the behaviour to return the original name.
|
8
|
+
def underscored_name
|
9
|
+
@name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/scss_lint.rb
CHANGED
@@ -8,11 +8,13 @@ module SCSSLint
|
|
8
8
|
autoload :Linter, 'scss_lint/linter'
|
9
9
|
autoload :Reporter, 'scss_lint/reporter'
|
10
10
|
autoload :Runner, 'scss_lint/runner'
|
11
|
+
autoload :Utils, 'scss_lint/utils'
|
11
12
|
autoload :VERSION, 'scss_lint/version'
|
12
13
|
|
13
14
|
# Preload Sass so we can monkey patch it
|
14
15
|
require 'sass'
|
15
|
-
require 'sass/
|
16
|
+
require File.expand_path('sass/script', File.dirname(__FILE__))
|
17
|
+
require File.expand_path('sass/tree', File.dirname(__FILE__))
|
16
18
|
|
17
19
|
# Load all linters
|
18
20
|
Dir[File.expand_path('scss_lint/linter/*.rb', File.dirname(__FILE__))].each do |file|
|
data/lib/scss_lint/cli.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'scss_lint'
|
2
1
|
require 'optparse'
|
3
2
|
|
4
3
|
module SCSSLint
|
@@ -22,9 +21,18 @@ module SCSSLint
|
|
22
21
|
options[:excluded_files] = files
|
23
22
|
end
|
24
23
|
|
25
|
-
opts.on('-i', '--
|
24
|
+
opts.on('-i', '--include-linter linter,...', Array,
|
25
|
+
'Specify which linters you want to run') do |linters|
|
26
|
+
options[:included_linters] = linters
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on('-x', '--exclude-linter linter,...', Array,
|
26
30
|
"Specify which linters you don't want to run") do |linters|
|
27
|
-
options[:
|
31
|
+
options[:excluded_linters] = linters
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on_tail('--show-linters', 'Shows available linters') do
|
35
|
+
print_linters
|
28
36
|
end
|
29
37
|
|
30
38
|
opts.on_tail('-h', '--help', 'Show this message') do
|
@@ -35,7 +43,7 @@ module SCSSLint
|
|
35
43
|
print_version opts.program_name, VERSION
|
36
44
|
end
|
37
45
|
|
38
|
-
opts.on('
|
46
|
+
opts.on('--xml', 'Output the results in XML format') do
|
39
47
|
options[:reporter] = SCSSLint::Reporter::XMLReporter
|
40
48
|
end
|
41
49
|
end
|
@@ -55,7 +63,7 @@ module SCSSLint
|
|
55
63
|
runner.run(find_files)
|
56
64
|
report_lints(runner.lints)
|
57
65
|
halt 1 if runner.lints?
|
58
|
-
rescue NoFilesError, NoSuchLinter => ex
|
66
|
+
rescue NoFilesError, NoSuchLinter, Errno::ENOENT => ex
|
59
67
|
puts ex.message
|
60
68
|
halt -1
|
61
69
|
end
|
@@ -77,6 +85,20 @@ module SCSSLint
|
|
77
85
|
print output if output
|
78
86
|
end
|
79
87
|
|
88
|
+
def print_linters
|
89
|
+
puts 'Installed linters:'
|
90
|
+
|
91
|
+
linter_names = LinterRegistry.linters.map do |linter|
|
92
|
+
linter.name.split('::').last
|
93
|
+
end
|
94
|
+
|
95
|
+
linter_names.sort.each do |linter_name|
|
96
|
+
puts " - #{linter_name}"
|
97
|
+
end
|
98
|
+
|
99
|
+
halt
|
100
|
+
end
|
101
|
+
|
80
102
|
def print_help(help_message, err = nil)
|
81
103
|
puts err, '' if err
|
82
104
|
puts help_message
|
data/lib/scss_lint/linter.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::CapitalizationInSelector < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_rule(node)
|
6
|
+
add_lint(node) if node.rule.first =~ /[A-Z]/
|
7
|
+
|
8
|
+
yield # Continue linting children
|
9
|
+
end
|
10
|
+
|
11
|
+
def description
|
12
|
+
'Selectors should be lowercase'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require 'sass'
|
2
|
-
|
3
1
|
module SCSSLint
|
4
|
-
class Linter::
|
2
|
+
class Linter::DeclaredName < Linter
|
5
3
|
include LinterRegistry
|
6
4
|
|
7
5
|
def visit_function(node)
|
@@ -9,37 +7,30 @@ module SCSSLint
|
|
9
7
|
yield # Continue into content block of this function definition
|
10
8
|
end
|
11
9
|
|
12
|
-
def visit_mixin(node)
|
13
|
-
check(node)
|
14
|
-
yield # Continue into content block of this mixin's block
|
15
|
-
end
|
16
|
-
|
17
10
|
def visit_mixindef(node)
|
18
11
|
check(node)
|
19
12
|
yield # Continue into content block of this mixin definition
|
20
13
|
end
|
21
14
|
|
22
|
-
def
|
23
|
-
|
24
|
-
yield # Continue into
|
25
|
-
end
|
26
|
-
|
27
|
-
def visit_script_funcall(node)
|
28
|
-
check(node)
|
15
|
+
def visit_rule(node)
|
16
|
+
add_lint(node) if selector_has_bad_placeholder?(node.rule)
|
17
|
+
yield # Continue linting into content block of this rule definition
|
29
18
|
end
|
30
19
|
|
31
|
-
def
|
20
|
+
def visit_variable(node)
|
32
21
|
check(node)
|
22
|
+
yield # Continue into expression tree for this variable definition
|
33
23
|
end
|
34
24
|
|
35
25
|
def description
|
36
|
-
'Names of variables, functions, and
|
26
|
+
'Names of variables, functions, mixins, and placeholders should be ' <<
|
27
|
+
'lowercase and use hyphens instead of underscores.'
|
37
28
|
end
|
38
29
|
|
39
30
|
private
|
40
31
|
|
41
32
|
def check(node)
|
42
|
-
add_lint(node) if node
|
33
|
+
add_lint(node) if node_has_bad_name?(node)
|
43
34
|
end
|
44
35
|
end
|
45
36
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::NoZeroBeforeDecimal < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_prop(node)
|
6
|
+
# Misleading, but anything that isn't Sass Script is considered an
|
7
|
+
# `identifier` in the context of a Sass::Script::String.
|
8
|
+
return unless node.value.is_a?(Sass::Script::String) && node.value.type == :identifier
|
9
|
+
|
10
|
+
# Remove string chunks (e.g. `"hello" 3 'world'` -> `3`
|
11
|
+
non_string_values = node.value.value.gsub(/"[^"]*"|'[^']'/, '').split
|
12
|
+
|
13
|
+
non_string_values.each do |value|
|
14
|
+
add_lint(node) if value =~ /\b0\.\d+/
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def description
|
19
|
+
'Leading zero should be omitted in fractional values'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::PlaceholderInExtend < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_extend(node)
|
6
|
+
# The array returned by the parser is a bit awkward in that it splits on
|
7
|
+
# every word boundary (so %placeholder becomes ['%', 'placeholder']).
|
8
|
+
selector = node.selector.join
|
9
|
+
|
10
|
+
add_lint(node) unless selector.start_with?('%')
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
'Always use placeholder selectors (e.g. %some-placeholder) with @extend'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::SortedProperties < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_rule(node)
|
6
|
+
# Ignore properties that contain interpolation
|
7
|
+
sortable_props = node.children.select do |child|
|
8
|
+
child.is_a?(Sass::Tree::PropNode) &&
|
9
|
+
child.name.all? { |part| part.is_a?(String) }
|
10
|
+
end
|
11
|
+
|
12
|
+
sortable_prop_names = sortable_props.map { |child| child.name.join }
|
13
|
+
|
14
|
+
sorted_prop_names = sortable_prop_names.map do |name|
|
15
|
+
/^(?<vendor>-\w+-)?(?<property>.+)/ =~ name
|
16
|
+
{ name: name, vendor: vendor, property: property }
|
17
|
+
end.sort { |a, b| compare_properties(a, b) }
|
18
|
+
.map { |fields| fields[:name] }
|
19
|
+
|
20
|
+
sorted_prop_names.each_with_index do |name, index|
|
21
|
+
# Report the first property out of order with the sorted list
|
22
|
+
if name != sortable_prop_names[index]
|
23
|
+
add_lint(sortable_props[index])
|
24
|
+
break
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
yield # Continue linting children
|
29
|
+
end
|
30
|
+
|
31
|
+
def description
|
32
|
+
'Properties should be sorted in alphabetical order, with ' <<
|
33
|
+
'vendor-prefixed extensions before the standardized CSS property'
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Compares two properties which can contain a vendor prefix. It allows for a
|
39
|
+
# sort order like:
|
40
|
+
#
|
41
|
+
# p {
|
42
|
+
# border: ...
|
43
|
+
# -moz-border-radius: ...
|
44
|
+
# -o-border-radius: ...
|
45
|
+
# -webkit-border-radius: ...
|
46
|
+
# border-radius: ...
|
47
|
+
# color: ...
|
48
|
+
# }
|
49
|
+
#
|
50
|
+
# ...where vendor-prefixed properties come before the standard property, and
|
51
|
+
# are ordered amongst themselves by vendor prefix.
|
52
|
+
def compare_properties(a, b)
|
53
|
+
if a[:property] == b[:property]
|
54
|
+
if a[:vendor] && b[:vendor]
|
55
|
+
a[:vendor] <=> b[:vendor]
|
56
|
+
elsif a[:vendor]
|
57
|
+
-1
|
58
|
+
elsif b[:vendor]
|
59
|
+
1
|
60
|
+
else
|
61
|
+
0
|
62
|
+
end
|
63
|
+
else
|
64
|
+
a[:property] <=> b[:property]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::SpaceBeforeBrace < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_root(node)
|
6
|
+
engine.lines.each_with_index do |line, index|
|
7
|
+
line.scan /(?<![^ ] )\{$/ do |match|
|
8
|
+
@lints << Lint.new(engine.filename, index + 1, description)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
'Opening curly braces ({) must be preceded by one space'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
class Linter::UsageName < Linter
|
3
|
+
include LinterRegistry
|
4
|
+
|
5
|
+
def visit_extend(node)
|
6
|
+
add_lint(node) if selector_has_bad_placeholder?(node.selector)
|
7
|
+
end
|
8
|
+
|
9
|
+
def visit_mixin(node)
|
10
|
+
check(node)
|
11
|
+
yield # Continue into content block of this mixin's block
|
12
|
+
end
|
13
|
+
|
14
|
+
def visit_script_funcall(node)
|
15
|
+
check(node) unless FUNCTION_WHITELIST.include?(node.name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def visit_script_variable(node)
|
19
|
+
check(node)
|
20
|
+
end
|
21
|
+
|
22
|
+
def description
|
23
|
+
'Usages of variables, functions, mixins, and placeholders should be ' <<
|
24
|
+
'lowercase and use hyphens instead of underscores.'
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
FUNCTION_WHITELIST = %w[
|
30
|
+
rotateX rotateY rotateZ
|
31
|
+
scaleX scaleY scaleZ
|
32
|
+
skewX skewY
|
33
|
+
translateX translateY translateZ
|
34
|
+
].to_set
|
35
|
+
|
36
|
+
def check(node)
|
37
|
+
add_lint(node) if node_has_bad_name?(node)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -14,10 +14,9 @@ module SCSSLint
|
|
14
14
|
def extract_linters_from(linter_names)
|
15
15
|
linter_names.map do |linter_name|
|
16
16
|
begin
|
17
|
-
|
18
|
-
Linter.const_get(linter_class)
|
17
|
+
Linter.const_get(linter_name)
|
19
18
|
rescue NameError
|
20
|
-
raise NoSuchLinter.new("Linter #{
|
19
|
+
raise NoSuchLinter.new("Linter #{linter_name} does not exist")
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
data/lib/scss_lint/runner.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'scss_lint'
|
2
|
-
require 'sass'
|
3
|
-
|
4
1
|
module SCSSLint
|
5
2
|
class NoFilesError < StandardError; end
|
6
3
|
class NoLintersError < StandardError; end
|
@@ -11,14 +8,15 @@ module SCSSLint
|
|
11
8
|
def initialize(options = {})
|
12
9
|
@lints = []
|
13
10
|
|
14
|
-
|
15
|
-
extract_linters_from(options.fetch(:
|
11
|
+
included_linters = LinterRegistry.
|
12
|
+
extract_linters_from(options.fetch(:included_linters, []))
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
included_linters = LinterRegistry.linters if included_linters.empty?
|
15
|
+
|
16
|
+
excluded_linters = LinterRegistry.
|
17
|
+
extract_linters_from(options.fetch(:excluded_linters, []))
|
18
|
+
|
19
|
+
@linters = (included_linters - excluded_linters).map(&:new)
|
22
20
|
end
|
23
21
|
|
24
22
|
def run(files = [])
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module SCSSLint
|
2
|
+
module Utils
|
3
|
+
# Given a selector array which is a list of strings with Sass::Script::Nodes
|
4
|
+
# interspersed within them, return an array of strings representing those
|
5
|
+
# selectors with the Sass::Script::Nodes removed (i.e., ignoring
|
6
|
+
# interpolation). For example:
|
7
|
+
#
|
8
|
+
# .selector-one, .selector-#{$var}-two
|
9
|
+
#
|
10
|
+
# becomes:
|
11
|
+
#
|
12
|
+
# .selector-one, .selector--two
|
13
|
+
#
|
14
|
+
# This is useful for lints that wish to ignore interpolation, since
|
15
|
+
# interpolation can't be resolved at this step.
|
16
|
+
def extract_string_selectors(selector_array)
|
17
|
+
selector_array.reject { |item| item.is_a? Sass::Script::Node }.
|
18
|
+
join.
|
19
|
+
split
|
20
|
+
end
|
21
|
+
|
22
|
+
# Given a selector array, returns whether it contains any placeholder
|
23
|
+
# selectors with invalid names.
|
24
|
+
def selector_has_bad_placeholder?(selector_array)
|
25
|
+
extract_string_selectors(selector_array).any? do |selector_str|
|
26
|
+
selector_str =~ /%\w*#{INVALID_NAME_CHARS}/
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def node_has_bad_name?(node)
|
31
|
+
node.name =~ /#{INVALID_NAME_CHARS}/
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
INVALID_NAME_CHARS = '[_A-Z]'
|
37
|
+
end
|
38
|
+
end
|
data/lib/scss_lint/version.rb
CHANGED
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scss-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Causes Engineering
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-09-03 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: colorize
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: sass
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - '='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - '='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,33 +41,29 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: nokogiri
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
description: Opinionated tool that tells you whether or not your SCSS is "bad"
|
@@ -85,54 +76,60 @@ extensions: []
|
|
85
76
|
extra_rdoc_files: []
|
86
77
|
files:
|
87
78
|
- lib/scss_lint/version.rb
|
79
|
+
- lib/scss_lint/utils.rb
|
88
80
|
- lib/scss_lint/reporter/xml_reporter.rb
|
89
81
|
- lib/scss_lint/reporter/default_reporter.rb
|
90
82
|
- lib/scss_lint/runner.rb
|
91
83
|
- lib/scss_lint/reporter.rb
|
92
84
|
- lib/scss_lint/lint.rb
|
93
85
|
- lib/scss_lint/linter.rb
|
94
|
-
- lib/scss_lint/linter/
|
95
|
-
- lib/scss_lint/linter/
|
96
|
-
- lib/scss_lint/linter/
|
97
|
-
- lib/scss_lint/linter/
|
98
|
-
- lib/scss_lint/linter/
|
99
|
-
- lib/scss_lint/linter/
|
100
|
-
- lib/scss_lint/linter/
|
101
|
-
- lib/scss_lint/linter/
|
102
|
-
- lib/scss_lint/linter/
|
103
|
-
- lib/scss_lint/linter/
|
104
|
-
- lib/scss_lint/linter/
|
105
|
-
- lib/scss_lint/linter/
|
106
|
-
- lib/scss_lint/linter/
|
86
|
+
- lib/scss_lint/linter/property_format.rb
|
87
|
+
- lib/scss_lint/linter/space_before_brace.rb
|
88
|
+
- lib/scss_lint/linter/capitalization_in_selector.rb
|
89
|
+
- lib/scss_lint/linter/declared_name.rb
|
90
|
+
- lib/scss_lint/linter/sorted_properties.rb
|
91
|
+
- lib/scss_lint/linter/type_in_id_selector.rb
|
92
|
+
- lib/scss_lint/linter/shorthand.rb
|
93
|
+
- lib/scss_lint/linter/declaration_order.rb
|
94
|
+
- lib/scss_lint/linter/no_zero_before_decimal.rb
|
95
|
+
- lib/scss_lint/linter/zero_unit.rb
|
96
|
+
- lib/scss_lint/linter/placeholder_in_extend.rb
|
97
|
+
- lib/scss_lint/linter/usage_name.rb
|
98
|
+
- lib/scss_lint/linter/border_zero.rb
|
99
|
+
- lib/scss_lint/linter/debug_statement.rb
|
100
|
+
- lib/scss_lint/linter/hex_format.rb
|
101
|
+
- lib/scss_lint/linter/comment.rb
|
102
|
+
- lib/scss_lint/linter/empty_rule.rb
|
103
|
+
- lib/scss_lint/linter/single_line_per_selector.rb
|
107
104
|
- lib/scss_lint/cli.rb
|
108
105
|
- lib/scss_lint/engine.rb
|
109
106
|
- lib/scss_lint/linter_registry.rb
|
110
107
|
- lib/sass/tree.rb
|
108
|
+
- lib/sass/script.rb
|
111
109
|
- lib/scss_lint.rb
|
112
110
|
- bin/scss-lint
|
113
111
|
homepage: http://github.com/causes/scss-lint
|
114
112
|
licenses:
|
115
113
|
- MIT
|
114
|
+
metadata: {}
|
116
115
|
post_install_message:
|
117
116
|
rdoc_options: []
|
118
117
|
require_paths:
|
119
118
|
- lib
|
120
119
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
120
|
requirements:
|
123
|
-
- -
|
121
|
+
- - '>='
|
124
122
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
123
|
+
version: 1.9.3
|
126
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
-
none: false
|
128
125
|
requirements:
|
129
|
-
- -
|
126
|
+
- - '>='
|
130
127
|
- !ruby/object:Gem::Version
|
131
128
|
version: '0'
|
132
129
|
requirements: []
|
133
130
|
rubyforge_project:
|
134
|
-
rubygems_version:
|
131
|
+
rubygems_version: 2.0.2
|
135
132
|
signing_key:
|
136
|
-
specification_version:
|
133
|
+
specification_version: 4
|
137
134
|
summary: SCSS lint tool
|
138
135
|
test_files: []
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'sass'
|
2
|
-
|
3
|
-
module SCSSLint
|
4
|
-
class Linter::SortedPropertiesLinter < Linter
|
5
|
-
include LinterRegistry
|
6
|
-
|
7
|
-
def visit_rule(node)
|
8
|
-
properties = node.children.select do |child|
|
9
|
-
child.is_a?(Sass::Tree::PropNode)
|
10
|
-
end
|
11
|
-
|
12
|
-
prop_names = properties.map do |prop_node|
|
13
|
-
prop_node.name.first.to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
if prop_names.sort != prop_names
|
17
|
-
add_lint(properties.first)
|
18
|
-
end
|
19
|
-
|
20
|
-
yield # Continue linting children
|
21
|
-
end
|
22
|
-
|
23
|
-
def description
|
24
|
-
'Properties should be sorted in alphabetical order'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|