scss-lint 0.22.0 → 0.23.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: 70bae0144c5b9e28dc02a481787f9a59d6904829
4
- data.tar.gz: 0ae51c9a6ab0cca63274d0026ad07c27acecad75
3
+ metadata.gz: 1bbc506b11e888967c3a60b4ee497049899db21d
4
+ data.tar.gz: 3474861bb7c69bc96acfc51a6c4c78ac75372bb3
5
5
  SHA512:
6
- metadata.gz: a3040302bcde27b996f2f1bb0e3825c0173c6b965d5ffe41e50d7c9313de01ef00482a7c4b408837776882098c9a492c82fb1bd86a2f9eb9b8536c7db838e7c1
7
- data.tar.gz: ded041dd16b6b836c21db252c2747acabe2be2296b321cbfc763a7cdd89f9c8232c00b76f37f11045deb4adbb30842316154a32670f7c29c831a94e4061f0943
6
+ metadata.gz: abdcc9357f0db63b291114acf5748ea2df1ca077fca03033b8b71ac4faae48d26424d00ea23c846854f9da47a6c67baf5187cb34932182ced1f987932cc58970
7
+ data.tar.gz: 673461370cc8c5598b25bea6b2a06e8e61cb3b53389a7a729cebf6eb79b836b36d4e4c3d211a5aebf6826423b0536f27575042b1ee450712acc5f837b0031941
@@ -21,6 +21,9 @@ linters:
21
21
  DuplicateProperty:
22
22
  enabled: true
23
23
 
24
+ DuplicateRoot:
25
+ enabled: true
26
+
24
27
  EmptyLineBetweenBlocks:
25
28
  enabled: true
26
29
  ignore_single_line_blocks: true
@@ -94,6 +97,9 @@ linters:
94
97
  TrailingSemicolonAfterPropertyValue:
95
98
  enabled: true
96
99
 
100
+ UnnecessaryMantissa:
101
+ enabled: true
102
+
97
103
  UrlFormat:
98
104
  enabled: true
99
105
 
@@ -2,6 +2,7 @@ require 'scss_lint/constants'
2
2
  require 'scss_lint/config'
3
3
  require 'scss_lint/cli'
4
4
  require 'scss_lint/engine'
5
+ require 'scss_lint/location'
5
6
  require 'scss_lint/lint'
6
7
  require 'scss_lint/linter_registry'
7
8
  require 'scss_lint/runner'
@@ -181,7 +181,7 @@ module SCSSLint
181
181
 
182
182
  # @param lints [Array<Lint>]
183
183
  def report_lints(lints)
184
- sorted_lints = lints.sort_by { |l| [l.filename, l.line] }
184
+ sorted_lints = lints.sort_by { |l| [l.filename, l.location] }
185
185
  reporter = @options.fetch(:reporter, Reporter::DefaultReporter)
186
186
  .new(sorted_lints)
187
187
  output = reporter.report_lints
@@ -1,15 +1,15 @@
1
1
  module SCSSLint
2
2
  # Stores information about a single problem that was detected by a [Linter].
3
3
  class Lint
4
- attr_reader :filename, :line, :description, :severity
4
+ attr_reader :filename, :location, :description, :severity
5
5
 
6
6
  # @param filename [String]
7
- # @param line [Integer]
7
+ # @param location [SCSSLint::Location]
8
8
  # @param description [String]
9
9
  # @param severity [Symbol]
10
- def initialize(filename, line, description, severity = :warning)
10
+ def initialize(filename, location, description, severity = :warning)
11
11
  @filename = filename
12
- @line = line
12
+ @location = location
13
13
  @description = description
14
14
  @severity = severity
15
15
  end
@@ -23,13 +23,34 @@ module SCSSLint
23
23
  # @param node_or_line [Sass::Script::Tree::Node, Sass::Engine::Line]
24
24
  # @param message [String]
25
25
  def add_lint(node_or_line, message)
26
- line = node_or_line.respond_to?(:line) ? node_or_line.line : node_or_line
26
+ location = if node_or_line.respond_to?(:source_range) && node_or_line.source_range
27
+ location_from_range(node_or_line.source_range)
28
+ elsif node_or_line.respond_to?(:line)
29
+ Location.new(node_or_line.line)
30
+ else
31
+ Location.new(node_or_line)
32
+ end
27
33
 
28
34
  @lints << Lint.new(engine.filename,
29
- line,
35
+ location,
30
36
  message)
31
37
  end
32
38
 
39
+ # Extract {SCSSLint::Location} from a {Sass::Source::Range}.
40
+ #
41
+ # @param range [Sass::Source::Range]
42
+ # @return [SCSSLint::Location]
43
+ def location_from_range(range)
44
+ length = if range.start_pos.line == range.end_pos.line
45
+ range.end_pos.offset - range.start_pos.offset
46
+ else
47
+ line_source = engine.lines[range.start_pos.line]
48
+ line_source.length - range.start_pos.offset + 1
49
+ end
50
+
51
+ Location.new(range.start_pos.line, range.start_pos.offset, length)
52
+ end
53
+
33
54
  # @param source_position [Sass::Source::Position]
34
55
  # @param offset [Integer]
35
56
  # @return [String] the character at the given [Sass::Source::Position]
@@ -72,7 +93,7 @@ module SCSSLint
72
93
  #
73
94
  # @param node [Sass::Tree::Node]
74
95
  # @return [true,false] whether the node spans a single line
75
- def node_on_single_line(node)
96
+ def node_on_single_line?(node)
76
97
  return if node.source_range.start_pos.line != node.source_range.end_pos.line
77
98
 
78
99
  # The Sass parser reports an incorrect source range if the trailing curly
@@ -33,7 +33,7 @@ module SCSSLint
33
33
  name = node.name.join
34
34
  if name =~ /[A-Z]/
35
35
  selector_name ||= node.class.name.split('::').last
36
- add_lint(node, "#{selector_name} `#{name}` in selector should be " <<
36
+ add_lint(node, "#{selector_name} `#{name}` in selector should be " \
37
37
  "written in all lowercase as `#{name.downcase}`")
38
38
  end
39
39
  end
@@ -28,7 +28,7 @@ module SCSSLint
28
28
  end.inspect
29
29
 
30
30
  add_lint(node,
31
- "Color `#{original}` should be written in hexadecimal form " <<
31
+ "Color `#{original}` should be written in hexadecimal form " \
32
32
  "as `#{shortest_hex_form(hex_form)}`")
33
33
  end
34
34
 
@@ -9,6 +9,11 @@ module SCSSLint
9
9
  if PROPERTIES_WITH_MIXINS.include?(prop_name)
10
10
  add_lint node, "Use the Compass `#{prop_name}` mixin instead of the property"
11
11
  end
12
+
13
+ if prop_name == 'display' && node.value.to_sass == 'inline-block'
14
+ add_lint node,
15
+ 'Use the Compass `inline-block` mixin instead of `display: inline-block`'
16
+ end
12
17
  end
13
18
 
14
19
  private
@@ -27,7 +27,7 @@ module SCSSLint
27
27
  private
28
28
 
29
29
  MESSAGE =
30
- 'Rule sets should start with @extend declarations, followed by ' <<
30
+ 'Rule sets should start with @extend declarations, followed by ' \
31
31
  'properties and nested rule sets, in that order'
32
32
 
33
33
  def important_node?(node)
@@ -0,0 +1,33 @@
1
+ module SCSSLint
2
+ # Checks for identical root selectors.
3
+ class Linter::DuplicateRoot < Linter
4
+ include LinterRegistry
5
+
6
+ def visit_root(node)
7
+ # Root rules are evaluated per document, so use new hashes for eash file
8
+ @roots = {}
9
+ yield # Continue linting children
10
+ end
11
+
12
+ def visit_rule(node)
13
+ if @roots[node.rule]
14
+ add_lint node.line,
15
+ "Merge root rule `#{node.rule.join}` with identical " \
16
+ "rule on line #{@roots[node.rule].line}"
17
+ else
18
+ @roots[node.rule] = node
19
+ end
20
+
21
+ # Don't yield so we only check one level deep
22
+ end
23
+
24
+ # Define stubs so we don't check rules nested in other constructs
25
+ %w[
26
+ media
27
+ mixin
28
+ mixindef
29
+ ].each do |node_type|
30
+ define_method("visit_#{node_type}") { |*args| }
31
+ end
32
+ end
33
+ end
@@ -30,7 +30,7 @@ module SCSSLint
30
30
  MESSAGE_FORMAT = '%s declaration should be %s by an empty line'
31
31
 
32
32
  def check(node, type)
33
- return if config['ignore_single_line_blocks'] && node_on_single_line(node)
33
+ return if config['ignore_single_line_blocks'] && node_on_single_line?(node)
34
34
  check_preceding_node(node, type)
35
35
  check_following_node(node, type)
36
36
  end
@@ -13,8 +13,10 @@ module SCSSLint
13
13
  end
14
14
 
15
15
  if can_be_simplified
16
- add_lint(seq, "Selector `#{seq}` can be simplified to `#{id_sel}`, " <<
17
- 'since IDs should be uniquely identifying')
16
+ # TODO: Sass::Selector::SimpleSequence#source_range sometimes lies about
17
+ # its line, so reference `#line` directly
18
+ add_lint(seq.line, "Selector `#{seq}` can be simplified to `#{id_sel}`, " <<
19
+ 'since IDs should be uniquely identifying')
18
20
  end
19
21
  end
20
22
  end
@@ -31,7 +31,7 @@ module SCSSLint
31
31
 
32
32
  if actual_indent.length != @indent
33
33
  add_lint(node.line,
34
- "Line should be indented #{@indent} spaces, " <<
34
+ "Line should be indented #{@indent} spaces, " \
35
35
  "but was indented #{actual_indent.length} spaces")
36
36
  return true
37
37
  end
@@ -47,7 +47,7 @@ module SCSSLint
47
47
 
48
48
  def check_name(node, node_type, node_text = node.name)
49
49
  if convention = violated_convention(node_text)
50
- add_lint(node, "Name of #{node_type} `#{node_text}` should be " <<
50
+ add_lint(node, "Name of #{node_type} `#{node_text}` should be " \
51
51
  "written #{convention[:explanation]}")
52
52
  end
53
53
  end
@@ -32,7 +32,7 @@ module SCSSLint
32
32
 
33
33
  private
34
34
 
35
- MESSAGE = 'Properties should be sorted in order, with vendor-prefixed ' <<
35
+ MESSAGE = 'Properties should be sorted in order, with vendor-prefixed ' \
36
36
  'extensions before the standardized CSS property'
37
37
 
38
38
  # Compares two properties which can contain a vendor prefix. It allows for a
@@ -15,7 +15,7 @@ module SCSSLint
15
15
 
16
16
  if @depth > @max_depth
17
17
  add_lint(node.parsed_rules || node,
18
- 'Selector should have depth of applicability no greater ' <<
18
+ 'Selector should have depth of applicability no greater ' \
19
19
  "than #{@max_depth}, but was #{@depth}")
20
20
  end
21
21
 
@@ -43,10 +43,17 @@ module SCSSLint
43
43
  end
44
44
  end
45
45
 
46
+ LIST_LITERAL_REGEX = %r{
47
+ \A
48
+ (\S+\s+\S+(\s+\S+){0,2}) # Two to four values separated by spaces
49
+ (\s+!\w+)? # Ignore `!important` priority overrides
50
+ \z
51
+ }x
52
+
46
53
  def check_script_string(prop, script_string)
47
54
  return unless script_string.type == :identifier
48
55
 
49
- if values = script_string.value.strip[/\A(\S+\s+\S+(\s+\S+){0,2})\z/, 1]
56
+ if values = script_string.value.strip[LIST_LITERAL_REGEX, 1]
50
57
  check_shorthand(prop, script_string, values.split)
51
58
  end
52
59
  end
@@ -57,8 +64,8 @@ module SCSSLint
57
64
  shortest_form = condensed_shorthand(*values)
58
65
  return if values == shortest_form
59
66
 
60
- add_lint(node, "Shorthand form for property `#{prop}` should be " <<
61
- "written more concisely as `#{shortest_form.join(' ')}` " <<
67
+ add_lint(node, "Shorthand form for property `#{prop}` should be " \
68
+ "written more concisely as `#{shortest_form.join(' ')}` " \
62
69
  "instead of `#{values.join(' ')}`")
63
70
  end
64
71
 
@@ -11,13 +11,13 @@ module SCSSLint
11
11
 
12
12
  if config['allow_extra_spaces']
13
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')} "
14
+ add_lint node, 'Colon after property should be followed by ' \
15
+ "at least #{pluralize(MINIMUM_SPACES_AFTER_COLON, 'space')}"
16
16
  end
17
17
  elsif spaces != MINIMUM_SPACES_AFTER_COLON
18
- add_lint node, 'Colon after property should be followed by ' <<
19
- pluralize(MINIMUM_SPACES_AFTER_COLON, 'space') <<
20
- " instead of #{pluralize(spaces, 'space')}"
18
+ add_lint node, 'Colon after property should be followed by ' \
19
+ "#{pluralize(MINIMUM_SPACES_AFTER_COLON, 'space')} " \
20
+ "instead of #{pluralize(spaces, 'space')}"
21
21
  end
22
22
  end
23
23
 
@@ -3,19 +3,40 @@ module SCSSLint
3
3
  class Linter::SpaceBeforeBrace < Linter
4
4
  include LinterRegistry
5
5
 
6
- def visit_root(node)
7
- engine.lines.each_with_index do |line, index|
6
+ def check_node(node)
7
+ source = source_from_range(node.source_range).strip
8
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
9
+ # Only lint `@include`s which have curly braces
10
+ if source[-1] == '{'
11
+ check_for_space(node, source)
12
+ end
13
+
14
+ yield
15
+ end
16
+
17
+ alias_method :visit_function, :check_node
18
+ alias_method :visit_each, :check_node
19
+ alias_method :visit_for, :check_node
20
+ alias_method :visit_function, :check_node
21
+ alias_method :visit_mixindef, :check_node
22
+ alias_method :visit_mixin, :check_node
23
+ alias_method :visit_rule, :check_node
24
+ alias_method :visit_while, :check_node
25
+
26
+ private
27
+
28
+ def check_for_space(node, string)
29
+ line = node.source_range.end_pos.line
30
+
31
+ if config['allow_single_line_padding'] && node_on_single_line?(node)
32
+ if string[-2] != ' '
33
+ add_lint(line, 'Opening curly brace `{` should be ' \
34
+ 'preceded by at least one space')
35
+ end
36
+ else
37
+ if string[-2] != ' ' || string[-3] == ' '
38
+ add_lint(line, 'Opening curly brace `{` should be ' \
39
+ 'preceded by one space')
19
40
  end
20
41
  end
21
42
  end
@@ -26,8 +26,10 @@ module SCSSLint
26
26
  spaces = str.count ' '
27
27
 
28
28
  if spaces != @spaces
29
- @lints << Lint.new(engine.filename, index + 1, "Expected #{pluralize(@spaces, 'space')}" <<
30
- " between parentheses instead of #{spaces}")
29
+ location = Location.new(index + 1)
30
+ message = "Expected #{pluralize(@spaces, 'space')}" <<
31
+ " between parentheses instead of #{spaces}"
32
+ @lints << Lint.new(engine.filename, location, message)
31
33
  end
32
34
  end
33
35
  end
@@ -53,7 +53,7 @@ module SCSSLint
53
53
  add_lint(node, 'Prefer single quoted strings') if string !~ /'/
54
54
  else
55
55
  if string =~ /(?<! \\) \\"/x && string !~ /'/
56
- add_lint(node, 'Use single-quoted strings when writing double ' <<
56
+ add_lint(node, 'Use single-quoted strings when writing double ' \
57
57
  'quotes to avoid having to escape the double quotes')
58
58
  end
59
59
  end
@@ -62,7 +62,7 @@ module SCSSLint
62
62
  def check_single_quotes(node, string)
63
63
  if config['style'] == 'single_quotes'
64
64
  if string =~ /(?<! \\) \\'/x && string !~ /"/
65
- add_lint(node, 'Use double-quoted strings when writing single ' <<
65
+ add_lint(node, 'Use double-quoted strings when writing single ' \
66
66
  'quotes to avoid having to escape the single quotes')
67
67
  elsif string =~ /(?<! \\) \\"/x
68
68
  add_lint(node, "Don't escape double quotes in single-quoted strings")
@@ -16,7 +16,7 @@ module SCSSLint
16
16
  # being on the next line
17
17
  line = node.source_range.end_pos.line - 1
18
18
  add_lint line,
19
- 'Property declaration should not have a space before ' <<
19
+ 'Property declaration should not have a space before ' \
20
20
  'the terminating semicolon'
21
21
  end
22
22
  end
@@ -0,0 +1,42 @@
1
+ module SCSSLint
2
+ # Checks for the unnecessary inclusion of a zero-value mantissa in numbers.
3
+ # (e.g. `4.0` could be written as just `4`)
4
+ class Linter::UnnecessaryMantissa < Linter
5
+ include LinterRegistry
6
+
7
+ def visit_script_string(node)
8
+ return unless node.type == :identifier
9
+
10
+ node.value.scan(REAL_NUMBER_REGEX) do |number, integer, mantissa, units|
11
+ if unnecessary_mantissa?(mantissa)
12
+ add_lint(node, MESSAGE_FORMAT % [number, integer, units])
13
+ end
14
+ end
15
+ end
16
+
17
+ def visit_script_number(node)
18
+ return unless match = REAL_NUMBER_REGEX.match(source_from_range(node.source_range))
19
+
20
+ if unnecessary_mantissa?(match[:mantissa])
21
+ add_lint(node, MESSAGE_FORMAT % [match[:number], match[:integer], match[:units]])
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ REAL_NUMBER_REGEX = %r{
28
+ \b(?<number>
29
+ (?<integer>\d*)
30
+ \.
31
+ (?<mantissa>\d+)
32
+ (?<units>\w*)
33
+ )\b
34
+ }ix
35
+
36
+ MESSAGE_FORMAT = '`%s` should be written without the mantissa as `%s%s`'
37
+
38
+ def unnecessary_mantissa?(mantissa)
39
+ mantissa !~ /[^0]/
40
+ end
41
+ end
42
+ end
@@ -21,7 +21,12 @@ module SCSSLint
21
21
 
22
22
  private
23
23
 
24
- ZERO_UNIT_REGEX = /\b(0[a-z]+)\b/i
24
+ ZERO_UNIT_REGEX = %r{
25
+ \b
26
+ (?<!\.|\#) # Ignore zeroes following `#` or `.` (colors / decimals)
27
+ (0[a-z]+) # Zero followed by letters (indicating some sort of unit)
28
+ \b
29
+ }ix
25
30
 
26
31
  MESSAGE_FORMAT = '`%s` should be written without units as `0`'
27
32
 
@@ -0,0 +1,38 @@
1
+ module SCSSLint
2
+ # Stores a location of {Lint} in a source.
3
+ class Location
4
+ include Comparable
5
+
6
+ attr_reader :line, :column, :length
7
+
8
+ # @param line [Integer] One-based index
9
+ # @param column [Integer] One-based index
10
+ # @param length [Integer] Number of characters, including the first character
11
+ def initialize(line = 1, column = 1, length = 1)
12
+ raise ArgumentError, "Line must be more than 0, passed #{line}" if line < 1
13
+ raise ArgumentError, "Column must be more than 0, passed #{column}" if column < 1
14
+ raise ArgumentError, "Length must be more than 0, passed #{length}" if length < 1
15
+
16
+ @line = line
17
+ @column = column
18
+ @length = length
19
+ end
20
+
21
+ def ==(other)
22
+ [:line, :column, :length].all? do |attr|
23
+ send(attr) == other.send(attr)
24
+ end
25
+ end
26
+
27
+ alias_method :eql?, :==
28
+
29
+ def <=>(other)
30
+ [:line, :column, :length].each do |attr|
31
+ result = send(attr) <=> other.send(attr)
32
+ return result unless result == 0
33
+ end
34
+
35
+ 0
36
+ end
37
+ end
38
+ end
@@ -5,7 +5,7 @@ module SCSSLint
5
5
  if lints.any?
6
6
  lints.map do |lint|
7
7
  type = lint.error? ? '[E]'.color(:red) : '[W]'.color(:yellow)
8
- "#{lint.filename.color(:cyan)}:" << "#{lint.line}".color(:magenta) <<
8
+ "#{lint.filename.color(:cyan)}:" << "#{lint.location.line}".color(:magenta) <<
9
9
  " #{type} #{lint.description}"
10
10
  end.join("\n") + "\n"
11
11
  end
@@ -6,12 +6,14 @@ module SCSSLint
6
6
 
7
7
  output << '<lint>'
8
8
  lints.group_by(&:filename).each do |filename, file_lints|
9
- output << "<file name='#{filename}'>"
9
+ output << "<file name=#{filename.encode(:xml => :attr)}>"
10
10
 
11
11
  file_lints.each do |lint|
12
- output << "<issue line='#{lint.line}' " <<
13
- "severity='#{lint.severity}' " <<
14
- "reason='#{lint.description}' />"
12
+ output << "<issue line=\"#{lint.location.line}\" " <<
13
+ "column=\"#{lint.location.column}\" " <<
14
+ "length=\"#{lint.location.length}\" " <<
15
+ "severity=\"#{lint.severity}\" " <<
16
+ "reason=#{lint.description.encode(:xml => :attr)} />"
15
17
  end
16
18
 
17
19
  output << '</file>'
@@ -43,15 +43,15 @@ module SCSSLint
43
43
  linter.run(engine, config.linter_options(linter))
44
44
  rescue => error
45
45
  raise LinterError,
46
- "#{linter.class} raised unexpected error linting file #{file}: " <<
46
+ "#{linter.class} raised unexpected error linting file #{file}: " \
47
47
  "'#{error.message}'",
48
48
  error.backtrace
49
49
  end
50
50
  end
51
51
  rescue Sass::SyntaxError => ex
52
- @lints << Lint.new(ex.sass_filename, ex.sass_line, ex.to_s, :error)
52
+ @lints << Lint.new(ex.sass_filename, Location.new(ex.sass_line), ex.to_s, :error)
53
53
  rescue FileEncodingError => ex
54
- @lints << Lint.new(file, 1, ex.to_s, :error)
54
+ @lints << Lint.new(file, Location.new, ex.to_s, :error)
55
55
  end
56
56
  end
57
57
  end
@@ -1,4 +1,4 @@
1
1
  # Defines the gem version.
2
2
  module SCSSLint
3
- VERSION = '0.22.0'
3
+ VERSION = '0.23.0'
4
4
  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.22.0
4
+ version: 0.23.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-04-07 00:00:00.000000000 Z
12
+ date: 2014-04-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rainbow
@@ -81,6 +81,7 @@ files:
81
81
  - lib/scss_lint/version.rb
82
82
  - lib/scss_lint/constants.rb
83
83
  - lib/scss_lint/utils.rb
84
+ - lib/scss_lint/location.rb
84
85
  - lib/scss_lint/reporter/files_reporter.rb
85
86
  - lib/scss_lint/reporter/xml_reporter.rb
86
87
  - lib/scss_lint/reporter/default_reporter.rb
@@ -106,6 +107,7 @@ files:
106
107
  - lib/scss_lint/linter/declaration_order.rb
107
108
  - lib/scss_lint/linter/zero_unit.rb
108
109
  - lib/scss_lint/linter/placeholder_in_extend.rb
110
+ - lib/scss_lint/linter/duplicate_root.rb
109
111
  - lib/scss_lint/linter/selector_depth.rb
110
112
  - lib/scss_lint/linter/compass/property_with_mixin.rb
111
113
  - lib/scss_lint/linter/space_after_property_name.rb
@@ -122,6 +124,7 @@ files:
122
124
  - lib/scss_lint/linter/color_keyword.rb
123
125
  - lib/scss_lint/linter/string_quotes.rb
124
126
  - lib/scss_lint/linter/leading_zero.rb
127
+ - lib/scss_lint/linter/unnecessary_mantissa.rb
125
128
  - lib/scss_lint/linter/comment.rb
126
129
  - lib/scss_lint/linter/empty_rule.rb
127
130
  - lib/scss_lint/linter/single_line_per_selector.rb
@@ -156,4 +159,3 @@ signing_key:
156
159
  specification_version: 4
157
160
  summary: SCSS lint tool
158
161
  test_files: []
159
- has_rdoc: