Hello community, here is the log from the commit of package rubygem-sass for openSUSE:Factory checked in at 2015-02-16 21:14:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-sass (Old) and /work/SRC/openSUSE:Factory/.rubygem-sass.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-sass" Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-sass/rubygem-sass.changes 2014-10-24 10:48:08.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-sass.new/rubygem-sass.changes 2015-02-16 21:14:01.000000000 +0100 @@ -1,0 +2,10 @@ +Sat Feb 14 05:31:35 UTC 2015 - [email protected] + +- updated to version 3.4.12 + +------------------------------------------------------------------- +Mon Feb 9 07:00:53 UTC 2015 - [email protected] + +- updated to version 3.4.11, no changelog + +------------------------------------------------------------------- Old: ---- sass-3.4.6.gem New: ---- sass-3.4.12.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-sass.spec ++++++ --- /var/tmp/diff_new_pack.UtIe6a/_old 2015-02-16 21:14:02.000000000 +0100 +++ /var/tmp/diff_new_pack.UtIe6a/_new 2015-02-16 21:14:02.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package rubygem-sass # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-sass -Version: 3.4.6 +Version: 3.4.12 Release: 0 %define mod_name sass %define mod_full_name %{mod_name}-%{version} ++++++ sass-3.4.6.gem -> sass-3.4.12.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CONTRIBUTING new/CONTRIBUTING --- old/CONTRIBUTING 2014-10-17 03:32:48.000000000 +0200 +++ new/CONTRIBUTING 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ -Contributions are welcomed. Please see the following sites for guidelines: - - http://sass-lang.com/community#Contribute diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CONTRIBUTING.md new/CONTRIBUTING.md --- old/CONTRIBUTING.md 1970-01-01 01:00:00.000000000 +0100 +++ new/CONTRIBUTING.md 2015-02-14 02:18:19.000000000 +0100 @@ -0,0 +1,3 @@ +Contributions are welcomed. Please see the following sites for guidelines: + +[http://sass-lang.com/community#Contribute](http://sass-lang.com/community#Contribute) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/VERSION new/VERSION --- old/VERSION 2014-10-17 03:32:48.000000000 +0200 +++ new/VERSION 2015-02-14 02:18:19.000000000 +0100 @@ -1 +1 @@ -3.4.6 +3.4.12 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/VERSION_DATE new/VERSION_DATE --- old/VERSION_DATE 2014-10-17 03:32:48.000000000 +0200 +++ new/VERSION_DATE 2015-02-14 02:18:19.000000000 +0100 @@ -1 +1 @@ -17 October 2014 01:32:48 UTC +14 February 2015 01:18:18 UTC Files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/exec/sass_scss.rb new/lib/sass/exec/sass_scss.rb --- old/lib/sass/exec/sass_scss.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/exec/sass_scss.rb 2015-02-14 02:18:19.000000000 +0100 @@ -42,6 +42,7 @@ if @args.size == 1 @args = split_colon_path(@args.first) else + @fake_update = true @options[:update] = true end end @@ -312,6 +313,16 @@ dirs, files = @args.map {|name| split_colon_path(name)}. partition {|i, _| File.directory? i} + + if @fake_update && !dirs.empty? + # Issue 1602. + Sass::Util.sass_warn <<WARNING.strip +DEPRECATION WARNING: Compiling directories without --update or --watch is +deprecated and won't work in future versions of Sass. Instead use: + #{@default_syntax} --update #{@args} +WARNING + end + files.map! do |from, to| to ||= from.gsub(/\.[^.]*?$/, '.css') sourcemap = Sass::Util.sourcemap_name(to) if @options[:sourcemap] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/plugin/compiler.rb new/lib/sass/plugin/compiler.rb --- old/lib/sass/plugin/compiler.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/plugin/compiler.rb 2015-02-14 02:18:19.000000000 +0100 @@ -399,7 +399,8 @@ def listen_to(listener) if Sass::Util.listen_geq_2? - listener.map {|l| l.start}.each {|thread| thread.join} + listener.map {|l| l.start} + sleep else listener.start! end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/functions.rb new/lib/sass/script/functions.rb --- old/lib/sass/script/functions.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/functions.rb 2015-02-14 02:18:19.000000000 +0100 @@ -170,6 +170,9 @@ # \{#nth nth($list, $n)} # : Returns a specific item in a list. # + # \{#set-nth set-nth($list, $n, $value)} + # : Replaces the nth item in a list. + # # \{#join join($list1, $list2, \[$separator\])} # : Joins together two lists into one. # @@ -479,8 +482,7 @@ include Value::Helpers # The human-readable names for [Sass::Script::Value::Base]. The default is - # just the downcased name of the type. The default is the downcased type - # name. + # just the downcased name of the type. TYPE_NAMES = {:ArgList => 'variable argument list'} # The environment for this function. This environment's @@ -649,11 +651,11 @@ # # @overload rgba($red, $green, $blue, $alpha) # @param $red [Sass::Script::Value::Number] The amount of red in the - # color. Must be between 0 and 255 inclusive + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive # @param $green [Sass::Script::Value::Number] The amount of green in the - # color. Must be between 0 and 255 inclusive + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive # @param $blue [Sass::Script::Value::Number] The amount of blue in the - # color. Must be between 0 and 255 inclusive + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive # @param $alpha [Sass::Script::Value::Number] The opacity of the color. # Must be between 0 and 1 inclusive # @return [Sass::Script::Value::Color] @@ -681,6 +683,7 @@ assert_type color, :Color, :color assert_type alpha, :Number, :alpha + check_alpha_unit alpha, 'rgba' color.with(:alpha => alpha.value) when 4 @@ -738,6 +741,7 @@ assert_type saturation, :Number, :saturation assert_type lightness, :Number, :lightness assert_type alpha, :Number, :alpha + check_alpha_unit alpha, 'hsla' h = hue.value s = saturation.value @@ -1287,7 +1291,7 @@ # @param $color1 [Sass::Script::Value::Color] # @param $color2 [Sass::Script::Value::Color] # @param $weight [Sass::Script::Value::Number] The relative weight of each - # color. Closer to `0%` gives more weight to `$color`, closer to `100%` + # color. Closer to `0%` gives more weight to `$color1`, closer to `100%` # gives more weight to `$color2` # @return [Sass::Script::Value::Color] # @raise [ArgumentError] if `$weight` is out of bounds or any parameter is @@ -1393,11 +1397,17 @@ # @return [Sass::Script::Value::String] # @raise [ArgumentError] if `$string` isn't a string def unquote(string) - if string.is_a?(Sass::Script::Value::String) && string.type != :identifier - identifier(string.value) - else - string + unless string.is_a?(Sass::Script::Value::String) + Sass::Util.sass_warn(<<MESSAGE.strip) +DEPRECATION WARNING: Passing #{string.to_sass}, a non-string value, to unquote() +will be an error in future versions of Sass. +#{environment.stack.to_s.gsub(/^/, ' ' * 8)} +MESSAGE + return string end + + return string if string.type == :identifier + identifier(string.value) end declare :unquote, [:string] @@ -1461,10 +1471,10 @@ assert_type insert, :String, :insert assert_integer index, :index assert_unit index, nil, :index - insertion_point = if index.value > 0 - [index.value - 1, original.value.size].min + insertion_point = if index.to_i > 0 + [index.to_i - 1, original.value.size].min else - [index.value, -original.value.size - 1].max + [index.to_i, -original.value.size - 1].max end result = original.value.dup.insert(insertion_point, insert.value) Sass::Script::Value::String.new(result, original.type) @@ -2306,7 +2316,7 @@ # Return a decimal between 0 and 1, inclusive of 0 but not 1. # @return [Sass::Script::Value::Number] A decimal value. # @overload random($limit) - # Return an integer between 1 and `$limit`, inclusive of 1 but not `$limit`. + # Return an integer between 1 and `$limit`, inclusive of both 1 and `$limit`. # @param $limit [Sass::Script::Value::Number] The maximum of the random integer to be # returned, a positive integer. # @return [Sass::Script::Value::Number] An integer. @@ -2315,10 +2325,10 @@ generator = Sass::Script::Functions.random_number_generator if limit assert_integer limit, "limit" - if limit.value < 1 + if limit.to_i < 1 raise ArgumentError.new("$limit #{limit} must be greater than or equal to 1") end - number(1 + generator.rand(limit.value)) + number(1 + generator.rand(limit.to_i)) else number(generator.rand) end @@ -2622,5 +2632,21 @@ color.with(attr => color.send(attr).send(op, amount.value)) end + + def check_alpha_unit(alpha, function) + return if alpha.unitless? + + if alpha.is_unit?("%") + Sass::Util.sass_warn(<<WARNING) +DEPRECATION WARNING: Passing a percentage as the alpha value to #{function}() will be +interpreted differently in future versions of Sass. For now, use #{alpha.value} instead. +WARNING + else + Sass::Util.sass_warn(<<WARNING) +DEPRECATION WARNING: Passing a number with units as the alpha value to #{function}() is +deprecated and will be an error in future versions of Sass. Use #{alpha.value} instead. +WARNING + end + end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/lexer.rb new/lib/sass/script/lexer.rb --- old/lib/sass/script/lexer.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/lexer.rb 2015-02-14 02:18:19.000000000 +0100 @@ -198,7 +198,8 @@ # @return [Boolean] Whether or not there's more source text to lex. def done? - whitespace unless after_interpolation? && @interpolation_stack.last + return if @next_tok + whitespace unless after_interpolation? && !@interpolation_stack.empty? @scanner.eos? && @tok.nil? end @@ -235,6 +236,11 @@ private def read_token + if (tok = @next_tok) + @next_tok = nil + return tok + end + return if done? start_pos = source_position value = token @@ -293,9 +299,9 @@ end if @scanner[2] == '#{' # ' - @scanner.pos -= 2 # Don't actually consume the #{ - @offset -= 2 @interpolation_stack << [:string, re] + start_pos = Sass::Source::Position.new(@line, @offset - 2) + @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2) end str = if re == :uri @@ -392,9 +398,9 @@ else raise "[BUG] Unreachable" unless @scanner[1] == '#{' # ' str.slice!(-2..-1) - @scanner.pos -= 2 # Don't actually consume the #{ - @offset -= 2 @interpolation_stack << [:special_fun, parens] + start_pos = Sass::Source::Position.new(@line, @offset - 2) + @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2) end return [:special_fun, Sass::Script::Value::String.new(str)] @@ -419,11 +425,8 @@ op = scan(REGULAR_EXPRESSIONS[:op]) return unless op name = OPERATORS[op] - if name == :begin_interpolation && !@interpolation_stack.empty? - [:string_interpolation] - else - [name] - end + @interpolation_stack << nil if name == :begin_interpolation + [name] end def raw(rx) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/parser.rb new/lib/sass/script/parser.rb --- old/lib/sass/script/parser.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/parser.rb 2015-02-14 02:18:19.000000000 +0100 @@ -498,7 +498,8 @@ return paren unless first str = literal_node(first.value, first.source_range) return str unless try_tok(:string_interpolation) - mid = parse_interpolated + mid = assert_expr :expr + assert_tok :end_interpolation last = assert_expr(:special_fun) node(Tree::Interpolation.new(str, mid, last, false, false), first.source_range.start_pos) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/tree/list_literal.rb new/lib/sass/script/tree/list_literal.rb --- old/lib/sass/script/tree/list_literal.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/tree/list_literal.rb 2015-02-14 02:18:19.000000000 +0100 @@ -32,7 +32,8 @@ members = elements.map do |v| if v.is_a?(ListLiteral) && Sass::Script::Parser.precedence_of(v.separator) <= precedence || separator == :space && v.is_a?(UnaryOperation) && - (v.operator == :minus || v.operator == :plus) + (v.operator == :minus || v.operator == :plus) || + separator == :space && v.is_a?(Operation) "(#{v.to_sass(opts)})" else v.to_sass(opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/tree/operation.rb new/lib/sass/script/tree/operation.rb --- old/lib/sass/script/tree/operation.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/tree/operation.rb 2015-02-14 02:18:19.000000000 +0100 @@ -79,11 +79,23 @@ end begin - opts(value1.send(@operator, value2)) + result = opts(value1.send(@operator, value2)) rescue NoMethodError => e raise e unless e.name.to_s == @operator.to_s raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".") end + + if @operator == :eq && value1.is_a?(Sass::Script::Value::Number) && + value2.is_a?(Sass::Script::Value::Number) && result == Sass::Script::Value::Bool::TRUE && + value1.unitless? != value2.unitless? + Sass::Util.sass_warn <<WARNING +DEPRECATION WARNING on line #{line}#{" of #{filename}" if filename}: +The result of `#{value1} == #{value2}` will be `false` in future releases of Sass. +Unitless numbers will no longer be equal to the same numbers with units. +WARNING + end + + result end private diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/value/color.rb new/lib/sass/script/value/color.rb --- old/lib/sass/script/value/color.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/value/color.rb 2015-02-14 02:18:19.000000000 +0100 @@ -204,7 +204,7 @@ # # @overload initialize(attrs) # The attributes are specified as a hash. This hash must contain either - # `:hue`, `:saturation`, and `:value` keys, or `:red`, `:green`, and + # `:hue`, `:saturation`, and `:lightness` keys, or `:red`, `:green`, and # `:blue` keys. It cannot contain both HSL and RGB keys. It may also # optionally contain an `:alpha` key, and a `:representation` key # indicating the original representation of the color that the user wrote diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/script/value/map.rb new/lib/sass/script/value/map.rb --- old/lib/sass/script/value/map.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/script/value/map.rb 2015-02-14 02:18:19.000000000 +0100 @@ -56,7 +56,7 @@ return "()" if value.empty? to_sass = lambda do |value| - if value.is_a?(Map) || (value.is_a?(List) && value.separator == :comma) + if value.is_a?(List) && value.separator == :comma "(#{value.to_sass(opts)})" else value.to_sass(opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/scss/parser.rb new/lib/sass/scss/parser.rb --- old/lib/sass/scss/parser.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/scss/parser.rb 2015-02-14 02:18:19.000000000 +0100 @@ -808,6 +808,8 @@ def almost_any_value_token tok(%r{ ( + \\. + | (?!url\() [^"'/\#!;\{\}] # " | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/selector/sequence.rb new/lib/sass/selector/sequence.rb --- old/lib/sass/selector/sequence.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/selector/sequence.rb 2015-02-14 02:18:20.000000000 +0100 @@ -490,8 +490,15 @@ if seq1[1].is_a?(String) return unless seq2[si + 1].is_a?(String) + # .foo ~ .bar is a superselector of .foo + .bar return unless seq1[1] == "~" ? seq2[si + 1] != ">" : seq1[1] == seq2[si + 1] + + # .foo > .baz is not a superselector of .foo > .bar > .baz or .foo > + # .bar .baz, despite the fact that .baz is a superselector of .bar > + # .baz and .bar .baz. Same goes for + and ~. + return if seq1.length == 3 && seq2.length > 3 + return _superselector?(seq1[2..-1], seq2[si + 2..-1]) elsif seq2[si + 1].is_a?(String) return unless seq2[si + 1] == ">" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/selector/simple_sequence.rb new/lib/sass/selector/simple_sequence.rb --- old/lib/sass/selector/simple_sequence.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/selector/simple_sequence.rb 2015-02-14 02:18:20.000000000 +0100 @@ -89,7 +89,7 @@ resolved_members = @members.map do |sel| next sel unless sel.is_a?(Pseudo) && sel.selector sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, !:implicit_parent)) - end + end.flatten # Parent selector only appears as the first selector in the sequence unless (parent = resolved_members.first).is_a?(Parent) @@ -133,9 +133,9 @@ end Sequence.new(members[0...-1] + - [SimpleSequence.new(parent_sub + @members[1..-1], subject?)] + + [SimpleSequence.new(parent_sub + resolved_members[1..-1], subject?)] + [newline].compact) - end) + end) end # Non-destructively extends this selector with the extensions specified in a hash @@ -164,6 +164,20 @@ extended = sel.selector.do_extend(extends, parent_directives, replace, seen, !:original) next sel if extended == sel.selector extended.members.reject! {|seq| seq.has_placeholder?} + + # For `:not()`, we usually want to get rid of any complex + # selectors becuase that will cause the selector to fail to + # parse on all browsers at time of writing. We can keep them + # if either the original selector had a complex selector, or + # the result of extending has only complex selectors, + # because either way we aren't breaking anything that isn't + # already broken. + if sel.normalized_name == 'not' && + (sel.selector.members.none? {|seq| seq.members.length > 1} && + extended.members.any? {|seq| seq.members.length == 1}) + extended.members.reject! {|seq| seq.members.length > 1} + end + modified_original = true result = sel.with_selector(extended) result.each {|new_sel| seen_with_pseudo_selectors << [new_sel]} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/tree/function_node.rb new/lib/sass/tree/function_node.rb --- old/lib/sass/tree/function_node.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/tree/function_node.rb 2015-02-14 02:18:20.000000000 +0100 @@ -20,6 +20,12 @@ # @return [Script::Tree::Node?] attr_accessor :splat + # Strips out any vendor prefixes. + # @return [String] The normalized name of the directive. + def normalized_name + @normalized_name ||= name.gsub(/^(?:-[a-zA-Z0-9]+-)?/, '\1') + end + # @param name [String] The function name # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] # The arguments for the function. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/tree/rule_node.rb new/lib/sass/tree/rule_node.rb --- old/lib/sass/tree/rule_node.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/tree/rule_node.rb 2015-02-14 02:18:20.000000000 +0100 @@ -132,14 +132,15 @@ private def try_to_parse_non_interpolated_rules - if @rule.all? {|t| t.kind_of?(String)} - # We don't use real filename/line info because we don't have it yet. - # When we get it, we'll set it on the parsed rules if possible. - parser = Sass::SCSS::StaticParser.new(@rule.join.strip, nil, nil, 1) - # rubocop:disable RescueModifier - @parsed_rules = parser.parse_selector rescue nil - # rubocop:enable RescueModifier - end + @parsed_rules = nil + return unless @rule.all? {|t| t.kind_of?(String)} + + # We don't use real filename/line info because we don't have it yet. + # When we get it, we'll set it on the parsed rules if possible. + parser = Sass::SCSS::StaticParser.new(@rule.join.strip, nil, nil, 1) + # rubocop:disable RescueModifier + @parsed_rules = parser.parse_selector rescue nil + # rubocop:enable RescueModifier end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/tree/visitors/convert.rb new/lib/sass/tree/visitors/convert.rb --- old/lib/sass/tree/visitors/convert.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/tree/visitors/convert.rb 2015-02-14 02:18:20.000000000 +0100 @@ -113,8 +113,8 @@ end def visit_extend(node) - "#{tab_str}@extend #{selector_to_src(node.selector).lstrip}#{semi}" + - "#{" !optional" if node.optional?}\n" + "#{tab_str}@extend #{selector_to_src(node.selector).lstrip}" + + "#{" !optional" if node.optional?}#{semi}\n" end def visit_for(node) @@ -274,7 +274,7 @@ "#{tab_str}@at-root #{query_interp_to_src(node.query)}#{yield}" elsif node.children.length == 1 && node.children.first.is_a?(Sass::Tree::RuleNode) rule = node.children.first - "#{tab_str}@at-root #{selector_to_src(rule.rule)}#{visit_children(rule)}" + "#{tab_str}@at-root #{selector_to_src(rule.rule).lstrip}#{visit_children(rule)}" else "#{tab_str}@at-root#{yield}" end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sass/tree/visitors/perform.rb new/lib/sass/tree/visitors/perform.rb --- old/lib/sass/tree/visitors/perform.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/lib/sass/tree/visitors/perform.rb 2015-02-14 02:18:20.000000000 +0100 @@ -275,6 +275,16 @@ # Loads the function into the environment. def visit_function(node) env = Sass::Environment.new(@environment, node.options) + + if node.normalized_name == 'calc' || node.normalized_name == 'element' || + node.name == 'expression' || node.name == 'url' + Sass::Util.sass_warn <<WARNING +DEPRECATION WARNING on line #{node.line}#{" of #{node.filename}" if node.filename}: +Naming a function "#{node.name}" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING + end + @environment.set_local_function(node.name, Sass::Callable.new(node.name, node.args, node.splat, env, node.children, !:has_content, "function")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2014-10-17 03:32:48.000000000 +0200 +++ new/metadata 2015-02-14 02:18:19.000000000 +0100 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: sass version: !ruby/object:Gem::Version - version: 3.4.6 + version: 3.4.12 platform: ruby authors: - Natalie Weizenbaum @@ -10,7 +10,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2014-10-17 00:00:00.000000000 Z +date: 2015-02-14 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: yard @@ -68,7 +68,7 @@ extra_rdoc_files: [] files: - .yardopts -- CONTRIBUTING +- CONTRIBUTING.md - MIT-LICENSE - README.md - REVISION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/compiler_test.rb new/test/sass/compiler_test.rb --- old/test/sass/compiler_test.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/test/sass/compiler_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -47,7 +47,11 @@ # used for Listen >= 2.0 def start - @thread = Thread.new {@run_during_start.call(self) if @run_during_start} + parent = Thread.current + @thread = Thread.new do + @run_during_start.call(self) if @run_during_start + parent.raise Interrupt + end end def stop diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/conversion_test.rb new/test/sass/conversion_test.rb --- old/test/sass/conversion_test.rb 2014-10-17 03:32:48.000000000 +0200 +++ new/test/sass/conversion_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -30,8 +30,7 @@ end def test_empty_directive - assert_scss_to_sass "@media screen", "@media screen {}" - assert_scss_to_scss "@media screen {}" + assert_renders "@media screen", "@media screen {}" end def test_empty_control_directive @@ -287,24 +286,24 @@ } SCSS - assert_sass_to_scss <<SCSS, <<SASS + assert_renders <<SASS, <<SCSS // foo // bar // baz // bang -foo bar { - a: b; -} -SCSS +foo bar + a: b +SASS // foo // bar // baz // bang -foo bar - a: b -SASS +foo bar { + a: b; +} +SCSS end def test_nested_silent_comments @@ -1275,26 +1274,7 @@ end def test_media_with_expressions - assert_sass_to_scss <<SCSS, <<SASS -$media1: screen; -$media2: print; -$var: -webkit-min-device-pixel-ratio; -$val: 20; - -@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} { - a: b; -} -SCSS -$media1: screen -$media2: print -$var: -webkit-min-device-pixel-ratio -$val: 20 - -@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} - a: b -SASS - - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS $media1: screen $media2: print $var: -webkit-min-device-pixel-ratio @@ -1315,14 +1295,14 @@ end def test_media_with_feature - assert_sass_to_scss <<SCSS, <<SASS + assert_renders <<SASS, <<SCSS +@media screen and (-webkit-transform-3d) + a: b +SASS @media screen and (-webkit-transform-3d) { a: b; } SCSS -@media screen and (-webkit-transform-3d) - a: b -SASS end def test_supports_with_expressions @@ -1678,7 +1658,7 @@ end def test_extend_with_optional - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS foo @extend .bar !optional SASS @@ -1689,7 +1669,7 @@ end def test_mixin_var_args - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS =foo($args...) a: b @@ -1716,7 +1696,7 @@ end def test_mixin_var_kwargs - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS =foo($a: b, $c: d) a: $a c: $c @@ -1738,7 +1718,7 @@ end def test_function_var_args - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS @function foo($args...) @return foo @@ -1765,7 +1745,7 @@ end def test_function_var_kwargs - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS @function foo($a: b, $c: d) @return foo @@ -1785,7 +1765,7 @@ end def test_at_root - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS .foo @at-root .bar @@ -1807,7 +1787,7 @@ end def test_at_root_with_selector - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS .foo @at-root .bar a: b @@ -1821,7 +1801,7 @@ end def test_at_root_without - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS .foo @at-root (without: media rule) a: b @@ -1835,7 +1815,7 @@ end def test_at_root_with - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS .foo @at-root (with: media rule) a: b @@ -1849,7 +1829,7 @@ end def test_function_var_kwargs_with_list - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS @function foo($a: b, $c: d) @return $a, $c @@ -1918,12 +1898,13 @@ end def test_media_query_with_expr - assert_scss_to_sass <<SASS, <<SCSS + assert_renders <<SASS, <<SCSS @media foo and (bar: baz) a: b SASS @media foo and (bar: baz) { - a: b; } + a: b; +} SCSS end @@ -2009,13 +1990,11 @@ ok: -$foo comma: 10px, -$foo needs-parens: 10px (-$foo) - no-parens: a 50px + 60px b SASS foo { ok: -$foo; comma: 10px, -$foo; needs-parens: 10px (-$foo); - no-parens: a 50px + 60px b; } SCSS end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/engine_test.rb new/test/sass/engine_test.rb --- old/test/sass/engine_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/engine_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -2059,20 +2059,21 @@ end def test_warn_with_imports + prefix = Sass::Util.cleanpath(File.dirname(__FILE__)).to_s expected_warning = <<WARN WARNING: In the main file - on line 1 of #{File.dirname(__FILE__)}/templates/warn.sass + on line 1 of #{prefix}/templates/warn.sass WARNING: Imported - on line 1 of #{File.dirname(__FILE__)}/templates/warn_imported.sass - from line 2 of #{File.dirname(__FILE__)}/templates/warn.sass + on line 1 of #{prefix}/templates/warn_imported.sass + from line 2 of #{prefix}/templates/warn.sass WARNING: In an imported mixin - on line 4 of #{File.dirname(__FILE__)}/templates/warn_imported.sass, in `emits-a-warning' - from line 3 of #{File.dirname(__FILE__)}/templates/warn.sass + on line 4 of #{prefix}/templates/warn_imported.sass, in `emits-a-warning' + from line 3 of #{prefix}/templates/warn.sass WARN assert_warning expected_warning do - renders_correctly "warn", :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"] + renders_correctly "warn", :style => :compact, :load_paths => ["#{prefix}/templates"] end end @@ -2457,6 +2458,18 @@ # Regression tests + def test_interpolation_in_multiline_selector + assert_equal(<<CSS, render(<<SASS)) +.foo, +.bar { + a: b; } +CSS +.foo, +\#{".bar"} + a: b +SASS + end + def test_list_separator_with_arg_list assert_equal(<<CSS, render(<<SASS)) .test { @@ -3287,7 +3300,8 @@ end def filename(name, type) - File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}" + path = File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}" + Sass::Util.cleanpath(path).to_s end def sassc_path(template) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/extend_test.rb new/test/sass/extend_test.rb --- old/test/sass/extend_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/extend_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -362,7 +362,21 @@ end def test_complex_extend_into_pseudoclass - assert_extends(':not(.bar)', '.x .y {@extend .bar}', ':not(.bar):not(.x .y)') + # Unlike other selectors, we don't allow complex selectors to be + # added to `:not` if they weren't there before. At time of + # writing, most browsers don't support that and will throw away + # the entire selector if it exists. + #assert_extends(':not(.bar)', '.x .y {@extend .bar}', ':not(.bar)') + + # If the `:not()` already has a complex selector, we won't break + # anything by adding a new one. + assert_extends(':not(.baz .bar)', '.x .y {@extend .bar}', + ':not(.baz .bar):not(.baz .x .y):not(.x .baz .y)') + + # If the `:not()` would only contain complex selectors, there's no + # harm in letting it continue to exist. + assert_extends(':not(%bar)', '.x .y {@extend %bar}', ':not(.x .y)') + assert_extends(':matches(.bar)', '.x .y {@extend .bar}', ':matches(.bar, .x .y)') assert_extends(':current(.bar)', '.x .y {@extend .bar}', ':current(.bar, .x .y)') assert_extends(':has(.bar)', '.x .y {@extend .bar}', ':has(.bar, .x .y)') @@ -514,6 +528,18 @@ SCSS end + def test_nested_pseudo_selectors + assert_equal <<CSS, render(<<SCSS) +.foo .bar:not(.baz), .bang .bar:not(.baz) { + a: b; } +CSS +.foo { + .bar:not(.baz) {a: b} +} +.bang {@extend .foo} +SCSS + end + ## Long Extendees def test_long_extendee diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/functions_test.rb new/test/sass/functions_test.rb --- old/test/sass/functions_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/functions_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -122,6 +122,20 @@ assert_error_message("$alpha: \"foo\" is not a number for `hsla'", "hsla(10, 10, 10, \"foo\")"); end + def test_hsla_percent_warning + assert_warning(<<WARNING) {evaluate("hsla(180, 60%, 50%, 40%)")} +DEPRECATION WARNING: Passing a percentage as the alpha value to hsla() will be +interpreted differently in future versions of Sass. For now, use 40 instead. +WARNING + end + + def test_hsla_unit_warning + assert_warning(<<WARNING) {evaluate("hsla(180, 60%, 50%, 40em)")} +DEPRECATION WARNING: Passing a number with units as the alpha value to hsla() is +deprecated and will be an error in future versions of Sass. Use 40 instead. +WARNING + end + def test_percentage assert_equal("50%", evaluate("percentage(.5)")) assert_equal("100%", evaluate("percentage(1)")) @@ -274,6 +288,20 @@ assert_error_message("wrong number of arguments (5 for 4) for `rgba'", "rgba(1, 2, 3, 0.4, 5)"); end + def test_rgba_percent_warning + assert_warning(<<WARNING) {evaluate("rgba(1, 2, 3, 40%)")} +DEPRECATION WARNING: Passing a percentage as the alpha value to rgba() will be +interpreted differently in future versions of Sass. For now, use 40 instead. +WARNING + end + + def test_rgba_unit_warning + assert_warning(<<WARNING) {evaluate("rgba(1, 2, 3, 40em)")} +DEPRECATION WARNING: Passing a number with units as the alpha value to rgba() is +deprecated and will be an error in future versions of Sass. Use 40 instead. +WARNING + end + def test_red assert_equal("18", evaluate("red(#123456)")) assert_equal("18", evaluate("red($color: #123456)")) @@ -857,6 +885,12 @@ assert_equal('foo', evaluate('unquote("foo")')) assert_equal('foo', evaluate('unquote(foo)')) assert_equal('foo', evaluate('unquote($string: foo)')) + assert_warning <<MESSAGE do +DEPRECATION WARNING: Passing blue, a non-string value, to unquote() +will be an error in future versions of Sass. +MESSAGE + assert_equal('blue', evaluate('unquote(blue)')) + end end def test_quote @@ -1593,6 +1627,9 @@ assert_equal "null", evaluate("inspect(null)") assert_equal "1px null 3px", evaluate("inspect(1px null 3px)") assert_equal "(a: 1, b: 2)", evaluate("inspect((a: 1, b: 2))") + assert_equal "(a: 1, b: (c: 2))", evaluate("inspect((a: 1, b: (c: 2)))") + assert_equal "(a: 1, b: (2, 3))", evaluate("inspect((a: 1, b: (2, 3)))") + assert_equal "(a: 1, b: 2 3)", evaluate("inspect((a: 1, b: 2 3))") end def test_random @@ -1627,6 +1664,14 @@ assert_error_message("Expected $limit to be an integer but got 1.5 for `random'", "random(1.5)") end + # Regression test for #1638. + def test_random_with_float_integer_limit + result = perform("random(1.0)") + assert_kind_of Sass::Script::Number, result + assert result.value >= 0, "Random number was below 0" + assert result.value <= 1, "Random number was above 1" + end + # This could *possibly* fail, but exceedingly unlikely def test_random_is_semi_unique if Sass::Script::Functions.instance_variable_defined?("@random_number_generator") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/script_conversion_test.rb new/test/sass/script_conversion_test.rb --- old/test/sass/script_conversion_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/script_conversion_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -76,6 +76,26 @@ assert_renders "null" end + def test_space_list + assert_renders "foo bar baz" + assert_renders "foo (bar baz) bip" + assert_renders "foo (bar, baz) bip" + end + + def test_comma_list + assert_renders "foo, bar, baz" + assert_renders "foo, (bar, baz), bip" + assert_renders "foo, bar baz, bip" + end + + def test_space_list_adds_parens_for_clarity + assert_renders "(1 + 1) (2 / 4) (3 * 5)" + end + + def test_comma_list_doesnt_add_parens + assert_renders "1 + 1, 2 / 4, 3 * 5" + end + def test_empty_list assert_renders "()" end @@ -221,8 +241,8 @@ assert_renders "$foo or ($bar $baz)" assert_renders "($foo $bar) or $baz" - assert_equal "$foo $bar or $baz", render("$foo ($bar or $baz)") - assert_equal "$foo or $bar $baz", render("($foo or $bar) $baz") + assert_renders "$foo ($bar or $baz)" + assert_renders "($foo or $bar) $baz" assert_equal "$foo ($bar $baz)", render("$foo ($bar $baz)") assert_equal "($foo $bar) $baz", render("($foo $bar) $baz") @@ -261,6 +281,11 @@ assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)' end + def test_interpolation_in_string_function + assert_renders 'calc(#{1 + "foo"})' + assert_renders 'calc(foo#{1 + "foo"}baz)' + end + def test_interpolation_near_operators assert_renders '#{1 + 2} , #{3 + 4}' assert_renders '#{1 + 2}, #{3 + 4}' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/script_test.rb new/test/sass/script_test.rb --- old/test/sass/script_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/script_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -206,6 +206,13 @@ assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'') end + def test_interpolation_in_interpolation + assert_equal 'foo', resolve('#{#{foo}}') + assert_equal 'foo', resolve('"#{#{foo}}"') + assert_equal 'foo', resolve('#{"#{foo}"}') + assert_equal 'foo', resolve('"#{"#{foo}"}"') + end + def test_interpolation_with_newline assert_equal "\nbang", resolve('"#{"\a "}bang"') assert_equal "\n\nbang", resolve('"#{"\a "}\a bang"') @@ -458,8 +465,13 @@ assert_equal "2in", resolve("1in + 96px") assert_equal "true", resolve("2mm < 1cm") assert_equal "true", resolve("10mm == 1cm") - assert_equal "true", resolve("1 == 1cm") assert_equal "true", resolve("1.1cm == 11mm") + + assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")} +DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass: +The result of `1 == 1cm` will be `false` in future releases of Sass. +Unitless numbers will no longer be equal to the same numbers with units. +WARNING end def test_length_units diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/scss/css_test.rb new/test/sass/scss/css_test.rb --- old/test/sass/scss/css_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/scss/css_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -1013,6 +1013,12 @@ assert_equal "E + F {\n a: b; }\n", render("E+F { a: b;} ") end + def test_escapes_in_selectors + assert_selector_parses('.\!foo') + assert_selector_parses('.\66 foo') + assert_selector_parses('.\21 foo') + end + def test_subject_selector_deprecation assert_warning(<<WARNING) {render(".foo .bar! .baz {a: b}")} DEPRECATION WARNING on line 1, column 1: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/scss/scss_test.rb new/test/sass/scss/scss_test.rb --- old/test/sass/scss/scss_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/scss/scss_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -1005,6 +1005,76 @@ SASS end + def test_disallowed_function_names + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "calc" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function calc() {} +SCSS + + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "-my-calc" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function -my-calc() {} +SCSS + + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "element" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function element() {} +SCSS + + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "-my-element" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function -my-element() {} +SCSS + + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "expression" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function expression() {} +SCSS + + assert_warning(<<WARNING) {render(<<SCSS)} +DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss: +Naming a function "url" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING +@function url() {} +SCSS + end + + def test_allowed_function_names + assert_no_warning {assert_equal(<<CSS, render(<<SCSS))} +.a { + b: c; } +CSS +@function -my-expression() {@return c} + +.a {b: -my-expression()} +SCSS + + assert_no_warning {assert_equal(<<CSS, render(<<SCSS))} +.a { + b: c; } +CSS +@function -my-url() {@return c} + +.a {b: -my-url()} +SCSS + end + ## Var Args def test_mixin_var_args @@ -3570,6 +3640,13 @@ # Regression + def test_escape_in_selector + assert_equal(<<CSS, render(".\\!foo {a: b}")) +.\\!foo { + a: b; } +CSS + end + def test_for_directive_with_float_bounds assert_equal(<<CSS, render(<<SCSS)) .a { @@ -3615,6 +3692,31 @@ } SCSS end + + def test_parent_selector_in_and_out_of_function_pseudo_selector + # Regression test for https://github.com/sass/sass/issues/1464#issuecomment-70352288 + assert_equal(<<CSS, render(<<SCSS)) +.a:not(.a-b) { + x: y; } +CSS +.a { + &:not(&-b) { + x: y; + } +} +SCSS + + assert_equal(<<CSS, render(<<SCSS)) +.a:nth-child(2n of .a-b) { + x: y; } +CSS +.a { + &:nth-child(2n of &-b) { + x: y; + } +} +SCSS + end def test_attribute_selector_in_selector_pseudoclass # Even though this is plain CSS, it only failed when given to the SCSS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/source_map_test.rb new/test/sass/source_map_test.rb --- old/test/sass/source_map_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/source_map_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -801,12 +801,12 @@ interpolated = engine.to_tree.children. first.children. first.value.children[1] - assert_equal interpolated.to_sass, "\#{123}" + assert_equal "123", interpolated.to_sass range = interpolated.source_range assert_equal 3, range.start_pos.line - assert_equal 12, range.start_pos.offset + assert_equal 14, range.start_pos.offset assert_equal 3, range.end_pos.line - assert_equal 18, range.end_pos.offset + assert_equal 17, range.end_pos.offset end def test_sources_array_is_uri_escaped diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/sass/superselector_test.rb new/test/sass/superselector_test.rb --- old/test/sass/superselector_test.rb 2014-10-17 03:32:49.000000000 +0200 +++ new/test/sass/superselector_test.rb 2015-02-14 02:18:20.000000000 +0100 @@ -55,6 +55,25 @@ def test_descendant_is_superselector_of_child assert_strict_superselector '.foo .bar', '.foo > .bar.baz' assert_strict_superselector '.foo .bar', '.foo.baz > .bar' + assert_strict_superselector '.foo .baz', '.foo > .bar > .baz' + end + + def test_child_isnt_superselector_of_longer_child + refute_superselector '.foo > .baz', '.foo > .bar > .baz' + refute_superselector '.foo > .baz', '.foo > .bar .baz' + end + + def test_following_sibling_isnt_superselector_of_longer_following_sibling + refute_superselector '.foo + .baz', '.foo + .bar + .baz' + refute_superselector '.foo + .baz', '.foo + .bar .baz' + end + + def test_sibling_isnt_superselector_of_longer_sibling + # This actually is a superselector, but it's a very narrow edge case and + # detecting it is very difficult and may be exponential in the worst case. + refute_superselector '.foo ~ .baz', '.foo ~ .bar ~ .baz' + + refute_superselector '.foo ~ .baz', '.foo ~ .bar .baz' end def test_matches_is_superselector_of_constituent_selectors -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
