scss-lint 0.1 → 0.2

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.
@@ -6,7 +6,6 @@ module SCSSLint
6
6
 
7
7
  DECLARATION_ORDER = [
8
8
  Sass::Tree::ExtendNode,
9
- Sass::Tree::MixinNode,
10
9
  Sass::Tree::PropNode,
11
10
  Sass::Tree::RuleNode,
12
11
  ]
@@ -14,17 +13,17 @@ module SCSSLint
14
13
  class << self
15
14
  def run(engine)
16
15
  lints = []
17
- #engine.tree.each do |node|
18
- #if node.is_a?(Sass::Tree::RuleNode)
19
- #lints << check_order_of_declarations(node)
20
- #end
21
- #end
22
- #lints.compact
16
+ engine.tree.each do |node|
17
+ if node.is_a?(Sass::Tree::RuleNode)
18
+ lints << check_order_of_declarations(node)
19
+ end
20
+ end
21
+ lints.compact
23
22
  end
24
23
 
25
24
  def description
26
25
  'Rule sets should start with @extend declarations, followed by ' <<
27
- 'mixins, properties, and nested rule sets, in that order'
26
+ 'properties and nested rule sets, in that order'
28
27
  end
29
28
 
30
29
  private
@@ -37,18 +36,17 @@ module SCSSLint
37
36
  end
38
37
 
39
38
  def check_order_of_declarations(rule_node)
40
- children = rule_node.children.select { |node| important_node?(node) }
39
+ children = rule_node.children.select { |node| important_node?(node) }.
40
+ map { |node| node.class }
41
41
 
42
- # Horribly inefficient, but we're not sorting thousands of declarations
42
+ # Inefficient, but we're not sorting thousands of declarations
43
43
  sorted_children = children.sort do |x,y|
44
- DECLARATION_ORDER.index(x.class) <=> DECLARATION_ORDER.index(y.class)
44
+ DECLARATION_ORDER.index(x) <=> DECLARATION_ORDER.index(y)
45
45
  end
46
46
 
47
47
  if children != sorted_children
48
- return create_lint(children.first)
48
+ return create_lint(rule_node.children.first)
49
49
  end
50
-
51
- nil
52
50
  end
53
51
  end
54
52
  end
@@ -17,13 +17,23 @@ module SCSSLint
17
17
 
18
18
  def description
19
19
  'Property declarations should always be on one line of the form ' <<
20
- '`property-name: value;`'
20
+ '`name: value;` or `name: [value] {`'
21
21
  end
22
22
 
23
23
  private
24
24
 
25
+ VALUE_RE = %r{(\S+\s)*\S+} # eg. "10px", "10px normal"
26
+ PROPERTY_RE = %r{
27
+ ^\s*[\w-]+:\s # property name, colon, one space
28
+ ( # followed by
29
+ #{VALUE_RE}; # property and terminating semi-colon eg. a b c;
30
+ | # or
31
+ ((#{VALUE_RE}\s)?\{) # nested property, optional value, trailing curly
32
+ )
33
+ }x
34
+
25
35
  def check_property_format(prop_node, line)
26
- return create_lint(prop_node) unless line =~ /^\s*[\w-]+: [^\s][^;]*;/
36
+ return create_lint(prop_node) unless line =~ PROPERTY_RE
27
37
  end
28
38
  end
29
39
  end
@@ -0,0 +1,50 @@
1
+ require 'sass'
2
+
3
+ module SCSSLint
4
+ class Linter::ShorthandLinter < Linter
5
+ include LinterRegistry
6
+
7
+ class << self
8
+ def run(engine)
9
+ lints = []
10
+ engine.tree.each do |node|
11
+ if node.is_a?(Sass::Tree::PropNode)
12
+ lints << check_valid_shorthand_value(node)
13
+ end
14
+ end
15
+ lints.compact
16
+ end
17
+
18
+ def description
19
+ 'Property values should use the shortest shorthand syntax allowed'
20
+ end
21
+
22
+ private
23
+
24
+ def check_valid_shorthand_value(prop_node)
25
+ if prop_node.value.is_a?(Sass::Script::String) &&
26
+ prop_node.value.to_s.strip =~ /\A(\S+\s+\S+\s+\S+(\s+\S+)?)\Z/
27
+ return create_lint(prop_node) unless valid_shorthand?($1)
28
+ end
29
+ end
30
+
31
+ def valid_shorthand?(shorthand)
32
+ values = shorthand.split(/\s+/)
33
+
34
+ if values[0] == values[1] &&
35
+ values[1] == values[2] &&
36
+ values[2] == values[3]
37
+ false
38
+ elsif values[0] == values[2] && values[1] == values[3]
39
+ false
40
+ elsif values[0] == values[2] && values[3].nil?
41
+ false
42
+ elsif values[1] == values[3]
43
+ false
44
+ else
45
+ true
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module SCSSLint
2
- VERSION = '0.1'
2
+ VERSION = '0.2'
3
3
  end
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.1'
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-18 00:00:00.000000000 Z
12
+ date: 2013-01-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
@@ -76,6 +76,7 @@ files:
76
76
  - lib/scss_lint/linter/empty_rule_linter.rb
77
77
  - lib/scss_lint/linter/debug_linter.rb
78
78
  - lib/scss_lint/linter/sorted_properties_linter.rb
79
+ - lib/scss_lint/linter/shorthand_linter.rb
79
80
  - lib/scss_lint/linter/property_format_linter.rb
80
81
  - lib/scss_lint/linter/zero_unit_linter.rb
81
82
  - lib/scss_lint/linter/hex_linter.rb