sass 3.4.18 → 3.4.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bd8b86fbb1af2645a7d82f27de07d7f39e5f36de
4
- data.tar.gz: 49afe949dd2d70186bd8b855a770d83ade01cf4f
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWUyNTcwMjI2MDViMjQ1MjdkMTUzYjAyMzAwNDM4OGMyODUwNmQ3ZA==
5
+ data.tar.gz: !binary |-
6
+ NDU0NjNmOTk2MzU2ODllMGRjMGMwYTU5OTNiOTk2YzYwNGRmYjg2MQ==
5
7
  SHA512:
6
- metadata.gz: 3c97e8192675375f9adff2b79a79bdd322382689af2ab5f2192682e7c17eccffb173d9ef36cc0ca85fbd527a96f35c59d74e0ff2e4f2b31f90deeacc21951068
7
- data.tar.gz: a37bb1312824bcf8c46543b31066b12aa0cd87c44d8970da5390eeb172d55a04df66d9db26d26c4156071c5afb393f6d117154f3107a6fc63f943557db93495a
8
+ metadata.gz: !binary |-
9
+ ODVlN2I2NjI5NGUyNjMyZjIyNGE4YzkwNmUwYzZhOThlMWE3OWM4N2U3MDMw
10
+ OGNiODViMmRiMGZlZTA1MGZjNTUzYTg1MzY2YWRhOGM3MTdhZDNlMmVmODk5
11
+ MTJmOGJhYWQ4YWMxNzRkN2JiNjJlNGYwMWJlZWFiNWY5MjIxYTY=
12
+ data.tar.gz: !binary |-
13
+ ZWY5NDhjODk1YThkMGE5OTcyMmQ5MTY3NWZlNDEzNWFjMDI0YWMxZDlmMWU4
14
+ YjcwZWJiNDdkM2RlYmI5Njc1MTVmYzM0YzA5OGQ5N2UxNzA4YjUzMGQ5Nzk2
15
+ YzNkYzVjYjI1NTBjMDdlODdkZjcwNmMzNWI0NzBkZTY4MjgyODU=
@@ -1,3 +1,3 @@
1
- Contributions are welcomed. Please see the following sites for guidelines:
1
+ Contributions are welcomed. Please see the following site for guidelines:
2
2
 
3
3
  [http://sass-lang.com/community#Contribute](http://sass-lang.com/community#Contribute)
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Sass [![Gem Version](https://badge.fury.io/rb/sass.png)](http://badge.fury.io/rb/sass) [![Inline docs](http://inch-ci.org/github/sass/sass.svg)](http://inch-ci.org/github/sass/sass)
2
2
 
3
- **Sass makes CSS fun again**. Sass is an extension of CSS3,
3
+ **Sass makes CSS fun again**. Sass is an extension of CSS,
4
4
  adding nested rules, variables, mixins, selector inheritance, and more.
5
5
  It's translated to well-formatted, standard CSS
6
6
  using the command line tool or a web-framework plugin.
7
7
 
8
8
  Sass has two syntaxes. The new main syntax (as of Sass 3)
9
9
  is known as "SCSS" (for "Sassy CSS"),
10
- and is a superset of CSS3's syntax.
11
- This means that every valid CSS3 stylesheet is valid SCSS as well.
10
+ and is a superset of CSS's syntax.
11
+ This means that every valid CSS stylesheet is valid SCSS as well.
12
12
  SCSS files use the extension `.scss`.
13
13
 
14
14
  The second, older syntax is known as the indented syntax (or just "Sass").
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.4.18
1
+ 3.4.19
@@ -1 +1 @@
1
- 25 August 2015 20:10:56 UTC
1
+ 10 October 2015 01:18:29 UTC
@@ -174,9 +174,6 @@ MESSAGE
174
174
  'Read input from standard input instead of an input file.',
175
175
  'This is the default if no input file is specified.') do
176
176
  @options[:input] = $stdin
177
-
178
- # See issue 1745
179
- (@options[:for_engine][:load_paths] ||= []) << ::Sass::Importers::DeprecatedPath.new(".")
180
177
  end
181
178
 
182
179
  encoding_option(opts)
@@ -390,6 +387,11 @@ WARNING
390
387
  input = @options[:input]
391
388
  output = @options[:output]
392
389
 
390
+ if input == $stdin
391
+ # See issue 1745
392
+ (@options[:for_engine][:load_paths] ||= []) << ::Sass::Importers::DeprecatedPath.new(".")
393
+ end
394
+
393
395
  @options[:for_engine][:syntax] ||= :scss if input.is_a?(File) && input.path =~ /\.scss$/
394
396
  @options[:for_engine][:syntax] ||= @default_syntax
395
397
  engine =
@@ -150,8 +150,7 @@ module Sass
150
150
  full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR)
151
151
  [Sass::Util.cleanpath(full_path).to_s, s]
152
152
  end
153
- end
154
- found = Sass::Util.flatten(found, 1)
153
+ end.flatten(1)
155
154
  return if found.empty?
156
155
 
157
156
  if found.size > 1 && !@same_name_warnings.include?(found.first.first)
@@ -188,7 +188,7 @@ module Sass::Script
188
188
  # \{#index index($list, $value)}
189
189
  # : Returns the position of a value within a list.
190
190
  #
191
- # \{#list_separator list-separator(#list)}
191
+ # \{#list_separator list-separator($list)}
192
192
  # : Returns the separator of a list.
193
193
  #
194
194
  # ## Map Functions {#map-functions}
@@ -1,5 +1,5 @@
1
1
  require 'sass/script/functions'
2
- require 'sass/util/normalized_map'
2
+ require 'sass/util'
3
3
 
4
4
  module Sass::Script::Tree
5
5
  # A SassScript parse node representing a function call.
@@ -62,6 +62,10 @@ module Sass::Script::Tree
62
62
 
63
63
  # Returns the text of this SassScript expression.
64
64
  #
65
+ # @options opts :quote [String]
66
+ # The preferred quote style for quoted strings. If `:none`, strings are
67
+ # always emitted unquoted.
68
+ #
65
69
  # @return [String]
66
70
  def to_sass(opts = {})
67
71
  Sass::Util.abstract(self)
@@ -3,12 +3,33 @@ module Sass::Script::Tree
3
3
  #
4
4
  # @see Interpolation
5
5
  class StringInterpolation < Node
6
+ # @return [Literal] The string literal before this interpolation.
7
+ attr_reader :before
8
+
9
+ # @return [Node] The SassScript within the interpolation
10
+ attr_reader :mid
11
+
12
+ # @return [StringInterpolation, Literal]
13
+ # The string literal or string interpolation before this interpolation.
14
+ attr_reader :after
15
+
16
+ # Whether this is a CSS string or a CSS identifier. The difference is that
17
+ # strings are written with double-quotes, while identifiers aren't.
18
+ #
19
+ # String interpolations are only ever identifiers if they're quote-like
20
+ # functions such as `url()`.
21
+ #
22
+ # @return [Symbol] `:string` or `:identifier`
23
+ def type
24
+ @before.value.type
25
+ end
26
+
6
27
  # Interpolation in a string is of the form `"before #{mid} after"`,
7
28
  # where `before` and `after` may include more interpolation.
8
29
  #
9
- # @param before [Node] The string before the interpolation
10
- # @param mid [Node] The SassScript within the interpolation
11
- # @param after [Node] The string after the interpolation
30
+ # @param before [StringInterpolation, Literal] See {StringInterpolation#before}
31
+ # @param mid [Node] See {StringInterpolation#mid}
32
+ # @param after [Literal] See {StringInterpolation#after}
12
33
  def initialize(before, mid, after)
13
34
  @before = before
14
35
  @mid = mid
@@ -22,32 +43,15 @@ module Sass::Script::Tree
22
43
 
23
44
  # @see Node#to_sass
24
45
  def to_sass(opts = {})
25
- # We can get rid of all of this when we remove the deprecated :equals context
26
- # XXX CE: It's gone now but I'm not sure what can be removed now.
27
- before_unquote, before_quote_char, before_str = parse_str(@before.to_sass(opts))
28
- after_unquote, after_quote_char, after_str = parse_str(@after.to_sass(opts))
29
- unquote = before_unquote || after_unquote ||
30
- (before_quote_char && !after_quote_char && !after_str.empty?) ||
31
- (!before_quote_char && after_quote_char && !before_str.empty?)
32
- quote_char =
33
- if before_quote_char && after_quote_char && before_quote_char != after_quote_char
34
- before_str.gsub!("\\'", "'")
35
- before_str.gsub!('"', "\\\"")
36
- after_str.gsub!("\\'", "'")
37
- after_str.gsub!('"', "\\\"")
38
- '"'
39
- else
40
- before_quote_char || after_quote_char
41
- end
46
+ quote = type == :string ? opts[:quote] || quote_for(self) || '"' : :none
47
+ opts = opts.merge(:quote => quote)
42
48
 
43
49
  res = ""
44
- res << 'unquote(' if unquote
45
- res << quote_char if quote_char
46
- res << before_str
47
- res << '#{' << @mid.to_sass(opts) << '}'
48
- res << after_str
49
- res << quote_char if quote_char
50
- res << ')' if unquote
50
+ res << quote if quote != :none
51
+ res << _to_sass(before, opts)
52
+ res << '#{' << @mid.to_sass(opts.merge(:quote => nil)) << '}'
53
+ res << _to_sass(after, opts)
54
+ res << quote if quote != :none
51
55
  res
52
56
  end
53
57
 
@@ -88,17 +92,28 @@ module Sass::Script::Tree
88
92
 
89
93
  private
90
94
 
91
- def parse_str(str)
92
- case str
93
- when /^unquote\((["'])(.*)\1\)$/
94
- return true, $1, $2
95
- when '""'
96
- return false, nil, ""
97
- when /^(["'])(.*)\1$/
98
- return false, $1, $2
99
- else
100
- return false, nil, str
95
+ def _to_sass(string_or_interp, opts)
96
+ result = string_or_interp.to_sass(opts)
97
+ opts[:quote] == :none ? result : result.slice(1...-1)
98
+ end
99
+
100
+ def quote_for(string_or_interp)
101
+ if string_or_interp.is_a?(Sass::Script::Tree::Literal)
102
+ return nil if string_or_interp.value.value.empty?
103
+ return '"' if string_or_interp.value.value.include?("'")
104
+ return "'" if string_or_interp.value.value.include?('"')
105
+ return nil
101
106
  end
107
+
108
+ # Double-quotes take precedence over single quotes.
109
+ before_quote = quote_for(string_or_interp.before)
110
+ return '"' if before_quote == '"'
111
+ after_quote = quote_for(string_or_interp.after)
112
+ return '"' if after_quote == '"'
113
+
114
+ # Returns "'" if either or both insist on single quotes, and nil
115
+ # otherwise.
116
+ before_quote || after_quote
102
117
  end
103
118
  end
104
119
  end
@@ -43,6 +43,7 @@ module Sass::Script::Value
43
43
  def self.precision=(digits)
44
44
  @precision = digits.round
45
45
  @precision_factor = 10.0**@precision
46
+ @epsilon = 1 / (@precision_factor * 10)
46
47
  end
47
48
 
48
49
  # the precision factor used in numeric output
@@ -51,6 +52,13 @@ module Sass::Script::Value
51
52
  @precision_factor ||= 10.0**precision
52
53
  end
53
54
 
55
+ # Used in checking equality of floating point numbers. Any
56
+ # numbers within an `epsilon` of each other are considered functionally equal.
57
+ # The value for epsilon is one tenth of the current numeric precision.
58
+ def self.epsilon
59
+ @epsilon ||= 1 / (precision_factor * 10)
60
+ end
61
+
54
62
  # Used so we don't allocate two new arrays for each new number.
55
63
  NO_UNITS = []
56
64
 
@@ -200,7 +208,7 @@ module Sass::Script::Value
200
208
  rescue Sass::UnitConversionError
201
209
  return Bool::FALSE
202
210
  end
203
- Bool.new(this.value == other.value)
211
+ Bool.new(basically_equal?(this.value, other.value))
204
212
  end
205
213
 
206
214
  def hash
@@ -211,7 +219,7 @@ module Sass::Script::Value
211
219
  # Hash-equality must be transitive, so it just compares the exact value,
212
220
  # numerator units, and denominator units.
213
221
  def eql?(other)
214
- value == other.value && numerator_units == other.numerator_units &&
222
+ basically_equal?(value, other.value) && numerator_units == other.numerator_units &&
215
223
  denominator_units == other.denominator_units
216
224
  end
217
225
 
@@ -294,7 +302,7 @@ module Sass::Script::Value
294
302
 
295
303
  # @return [Boolean] Whether or not this number is an integer.
296
304
  def int?
297
- value % 1 == 0.0
305
+ basically_equal?(value % 1, 0.0)
298
306
  end
299
307
 
300
308
  # @return [Boolean] Whether or not this number has no units.
@@ -375,11 +383,23 @@ module Sass::Script::Value
375
383
 
376
384
  private
377
385
 
386
+ # @private
387
+ # @see Sass::Script::Number.basically_equal?
388
+ def basically_equal?(num1, num2)
389
+ self.class.basically_equal?(num1, num2)
390
+ end
391
+
392
+ # Checks whether two numbers are within an epsilon of each other.
393
+ # @return [Boolean]
394
+ def self.basically_equal?(num1, num2)
395
+ (num1 - num2).abs < epsilon
396
+ end
397
+
378
398
  # @private
379
399
  def self.round(num)
380
400
  if num.is_a?(Float) && (num.infinite? || num.nan?)
381
401
  num
382
- elsif num % 1 == 0.0
402
+ elsif basically_equal?(num % 1, 0.0)
383
403
  num.to_i
384
404
  else
385
405
  ((num * precision_factor).round / precision_factor).to_f
@@ -28,9 +28,18 @@ module Sass::Script::Value
28
28
  end
29
29
  end
30
30
 
31
- def self.quote(contents, quote = nil)
31
+ # Returns the quoted string representation of `contents`.
32
+ #
33
+ # @options opts :quote [String]
34
+ # The preferred quote style for quoted strings. If `:none`, strings are
35
+ # always emitted unquoted. If `nil`, quoting is determined automatically.
36
+ # @options opts :sass [String]
37
+ # Whether to quote strings for Sass source, as opposed to CSS. Defaults to `false`.
38
+ def self.quote(contents, opts = {})
39
+ quote = opts[:quote]
40
+
32
41
  # Short-circuit if there are no characters that need quoting.
33
- unless contents =~ /[\n\\"']/
42
+ unless contents =~ /[\n\\"']|\#\{/
34
43
  quote ||= '"'
35
44
  return "#{quote}#{contents}#{quote}"
36
45
  end
@@ -50,6 +59,9 @@ module Sass::Script::Value
50
59
  # Replace single backslashes with multiples.
51
60
  contents = contents.gsub("\\", "\\\\\\\\")
52
61
 
62
+ # Escape interpolation.
63
+ contents = contents.gsub('#{', "\\\#{") if opts[:sass]
64
+
53
65
  if quote == '"'
54
66
  contents = contents.gsub('"', "\\\"")
55
67
  else
@@ -82,12 +94,12 @@ module Sass::Script::Value
82
94
  # @see Value#to_s
83
95
  def to_s(opts = {})
84
96
  return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier
85
- Sass::Script::Value::String.quote(value, opts[:quote])
97
+ String.quote(value, opts)
86
98
  end
87
99
 
88
100
  # @see Value#to_sass
89
101
  def to_sass(opts = {})
90
- to_s
102
+ to_s(opts.merge(:sass => true))
91
103
  end
92
104
 
93
105
  def inspect
@@ -156,13 +156,12 @@ module Sass
156
156
  else
157
157
  value = Sass::Engine.parse_interp(
158
158
  text, line, @scanner.pos - text.size, :filename => @filename)
159
- string_before_comment = @scanner.string[0...@scanner.pos - text.length]
160
- newline_before_comment = string_before_comment.rindex("\n")
159
+ newline_before_comment = @scanner.string.rindex("\n", @scanner.pos - text.length)
161
160
  last_line_before_comment =
162
161
  if newline_before_comment
163
- string_before_comment[newline_before_comment + 1..-1]
162
+ @scanner.string[newline_before_comment + 1...@scanner.pos - text.length]
164
163
  else
165
- string_before_comment
164
+ @scanner.string[0...@scanner.pos - text.length]
166
165
  end
167
166
  value.unshift(last_line_before_comment.gsub(/[^\s]/, ' '))
168
167
  end
@@ -215,12 +214,12 @@ module Sass
215
214
  end
216
215
 
217
216
  def special_directive(name, start_pos)
218
- sym = name.gsub('-', '_').to_sym
217
+ sym = name.tr('-', '_').to_sym
219
218
  DIRECTIVES.include?(sym) && send("#{sym}_directive", start_pos)
220
219
  end
221
220
 
222
221
  def prefixed_directive(name, start_pos)
223
- sym = deprefix(name).gsub('-', '_').to_sym
222
+ sym = deprefix(name).tr('-', '_').to_sym
224
223
  PREFIXED_DIRECTIVES.include?(sym) && send("#{sym}_directive", name, start_pos)
225
224
  end
226
225
 
@@ -228,11 +228,11 @@ module Sass
228
228
  next if current.empty?
229
229
  current = current.dup
230
230
  last_current = [current.pop]
231
- prefixes = Sass::Util.flatten(prefixes.map do |prefix|
231
+ prefixes = prefixes.map do |prefix|
232
232
  sub = subweave(prefix, current)
233
233
  next [] unless sub
234
234
  sub.map {|seqs| seqs + last_current}
235
- end, 1)
235
+ end.flatten(1)
236
236
  end
237
237
  prefixes
238
238
  end
@@ -551,7 +551,7 @@ module Sass
551
551
  def trim(seqses)
552
552
  # Avoid truly horrific quadratic behavior. TODO: I think there
553
553
  # may be a way to get perfect trimming without going quadratic.
554
- return Sass::Util.flatten(seqses, 1) if seqses.size > 100
554
+ return seqses.flatten(1) if seqses.size > 100
555
555
 
556
556
  # Keep the results in a separate array so we can be sure we aren't
557
557
  # comparing against an already-trimmed selector. This ensures that two
@@ -586,7 +586,7 @@ module Sass
586
586
  end
587
587
  end
588
588
  end
589
- Sass::Util.flatten(result, 1)
589
+ result.flatten(1)
590
590
  end
591
591
 
592
592
  def _hash
@@ -332,12 +332,12 @@ MESSAGE
332
332
  end
333
333
 
334
334
  def _hash
335
- [base, Sass::Util.set_hash(rest)].hash
335
+ [base, rest.hash].hash
336
336
  end
337
337
 
338
338
  def _eql?(other)
339
339
  other.base.eql?(base) && other.pseudo_elements == pseudo_elements &&
340
- Sass::Util.set_eql?(other.rest, rest) && other.subject? == subject?
340
+ other.rest.eql?(rest) && other.subject? == subject?
341
341
  end
342
342
  end
343
343
  end
@@ -276,7 +276,7 @@ module Sass
276
276
  # # [2, 4, 5]]
277
277
  def paths(arrs)
278
278
  arrs.inject([[]]) do |paths, arr|
279
- flatten(arr.map {|e| paths.map {|path| path + [e]}}, 1)
279
+ arr.map {|e| paths.map {|path| path + [e]}}.flatten(1)
280
280
  end
281
281
  end
282
282
 
@@ -783,15 +783,6 @@ module Sass
783
783
  (RUBY_VERSION_COMPONENTS[0] == 1 && RUBY_VERSION_COMPONENTS[1] < 9)
784
784
  end
785
785
 
786
- # Whether or not this is running under Ruby 1.8.6 or lower.
787
- # Note that lower versions are not officially supported.
788
- #
789
- # @return [Boolean]
790
- def ruby1_8_6?
791
- return @ruby1_8_6 if defined?(@ruby1_8_6)
792
- @ruby1_8_6 = ruby1_8? && RUBY_VERSION_COMPONENTS[2] < 7
793
- end
794
-
795
786
  # Whether or not this is running under Ruby 1.9.2 exactly.
796
787
  #
797
788
  # @return [Boolean]
@@ -841,7 +832,7 @@ module Sass
841
832
  end
842
833
 
843
834
  return Hash[pairs_or_hash] unless ruby1_8?
844
- (pairs_or_hash.is_a?(NormalizedMap) ? NormalizedMap : OrderedHash)[*flatten(pairs_or_hash, 1)]
835
+ (pairs_or_hash.is_a?(NormalizedMap) ? NormalizedMap : OrderedHash)[*pairs_or_hash.flatten(1)]
845
836
  end
846
837
 
847
838
  unless ruby1_8?
@@ -987,17 +978,6 @@ module Sass
987
978
  ruby1_8? ? c[0] : c.ord
988
979
  end
989
980
 
990
- # Flattens the first `n` nested arrays in a cross-version manner.
991
- #
992
- # @param arr [Array] The array to flatten
993
- # @param n [Fixnum] The number of levels to flatten
994
- # @return [Array] The flattened array
995
- def flatten(arr, n)
996
- return arr.flatten(n) unless ruby1_8_6?
997
- return arr if n == 0
998
- arr.inject([]) {|res, e| e.is_a?(Array) ? res.concat(flatten(e, n - 1)) : res << e}
999
- end
1000
-
1001
981
  # Flattens the first level of nested arrays in `arrs`. Unlike
1002
982
  # `Array#flatten`, this orders the result by taking the first
1003
983
  # values from each array in order, then the second, and so on.
@@ -1016,27 +996,6 @@ module Sass
1016
996
  result
1017
997
  end
1018
998
 
1019
- # Returns the hash code for a set in a cross-version manner.
1020
- # Aggravatingly, this is order-dependent in Ruby 1.8.6.
1021
- #
1022
- # @param set [Set]
1023
- # @return [Fixnum] The order-independent hashcode of `set`
1024
- def set_hash(set)
1025
- return set.hash unless ruby1_8_6?
1026
- set.map {|e| e.hash}.uniq.sort.hash
1027
- end
1028
-
1029
- # Tests the hash-equality of two sets in a cross-version manner.
1030
- # Aggravatingly, this is order-dependent in Ruby 1.8.6.
1031
- #
1032
- # @param set1 [Set]
1033
- # @param set2 [Set]
1034
- # @return [Boolean] Whether or not the sets are hashcode equal
1035
- def set_eql?(set1, set2)
1036
- return set1.eql?(set2) unless ruby1_8_6?
1037
- set1.to_a.uniq.sort_by {|e| e.hash}.eql?(set2.to_a.uniq.sort_by {|e| e.hash})
1038
- end
1039
-
1040
999
  # Like `Object#inspect`, but preserves non-ASCII characters rather than
1041
1000
  # escaping them under Ruby 1.9.2. This is necessary so that the
1042
1001
  # precompiled Haml template can be `#encode`d into `@options[:encoding]`
@@ -1,5 +1,4 @@
1
1
  require 'delegate'
2
- require 'sass/util'
3
2
 
4
3
  module Sass
5
4
  module Util
@@ -78,8 +78,7 @@ module Sass
78
78
  next unless subset.subset?(set)
79
79
  [index, subenum]
80
80
  end
81
- end
82
- res = Sass::Util.flatten(res, 1)
81
+ end.flatten(1)
83
82
  res.compact!
84
83
  res.uniq!
85
84
  res.sort!
@@ -78,7 +78,6 @@ MSG
78
78
  "& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
79
79
  "a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
80
80
  "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
81
- "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
82
81
  "@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
83
82
  "foo\n @import foo.css" => "CSS import directives may only be used at the root of a document.",
84
83
  "@if true\n @import foo" => "Import directives may not be used within control directives or mixins.",
@@ -334,7 +334,10 @@ RUBY
334
334
  assert_renders '"foo #{$bar} #{$bang} baz"'
335
335
  assert_renders '"#{$bar}baz"'
336
336
  assert_renders '"foo#{$bar}"'
337
- assert_equal '#{$bar}', render('"#{$bar}"')
337
+ assert_renders '"#{$bar}"'
338
+
339
+ assert_renders "'\"\#{\"bar\"}\"'"
340
+ assert_renders '"\#{bar}"'
338
341
 
339
342
  assert_equal '"foo#{$bar}baz"', render("'foo\#{$bar}baz'")
340
343
  end
@@ -44,6 +44,7 @@ class SassScriptTest < MiniTest::Test
44
44
  assert_equal "☃f", resolve("\"\\2603 f\"")
45
45
  assert_equal "☃x", resolve("\"\\2603x\"")
46
46
  assert_equal "\\2603", resolve("\"\\\\2603\"")
47
+ assert_equal "\#{foo}", resolve("\"\\\#{foo}\"")
47
48
 
48
49
  # U+FFFD is the replacement character, "�".
49
50
  assert_equal [0xFFFD].pack("U"), resolve("\"\\0\"")
@@ -71,6 +72,7 @@ class SassScriptTest < MiniTest::Test
71
72
  assert_equal '"☃abcdef"', resolve_quoted('"\2603 abcdef"')
72
73
  assert_equal '"\\\\"', resolve_quoted('"\\\\"')
73
74
  assert_equal '"foobar"', resolve_quoted("\"foo\\\nbar\"")
75
+ assert_equal '"#{foo}"', resolve_quoted("\"\\\#{foo}\"")
74
76
  end
75
77
 
76
78
  def test_color_names
@@ -1162,6 +1164,13 @@ SASS
1162
1164
  assert_equal "NaN", resolve("(0.0/0.0)")
1163
1165
  end
1164
1166
 
1167
+ def test_equality_uses_an_epsilon
1168
+ # At least on my machine, this calculation introduces a floating point error:
1169
+ # 29.0 / 7 * 7
1170
+ # => 29.000000000000004
1171
+ assert_equal "true", resolve("29 == (29 / 7 * 7)")
1172
+ end
1173
+
1165
1174
  private
1166
1175
 
1167
1176
  def resolve(str, opts = {}, environment = env)
@@ -881,11 +881,12 @@ JSON
881
881
  source_ranges = build_ranges(source, source_file_name)
882
882
  target_ranges = build_ranges(css)
883
883
  map = Sass::Source::Map.new
884
- Sass::Util.flatten(source_ranges.map do |(name, sources)|
884
+ source_ranges.map do |(name, sources)|
885
885
  assert(sources.length == 1, "#{sources.length} source ranges encountered for annotation #{name}")
886
886
  assert(target_ranges[name], "No target ranges for annotation #{name}")
887
887
  target_ranges[name].map {|target_range| [sources.first, target_range]}
888
- end, 1).
888
+ end.
889
+ flatten(1).
889
890
  sort_by {|(_, target)| [target.start_pos.line, target.start_pos.offset]}.
890
891
  each {|(s2, target)| map.add(s2, target)}
891
892
  map
@@ -206,20 +206,6 @@ class UtilTest < MiniTest::Test
206
206
  assert_equal(98, ord("bar"))
207
207
  end
208
208
 
209
- def test_flatten
210
- assert_equal([1, 2, 3], flatten([1, 2, 3], 0))
211
- assert_equal([1, 2, 3], flatten([1, 2, 3], 1))
212
- assert_equal([1, 2, 3], flatten([1, 2, 3], 2))
213
-
214
- assert_equal([[1, 2], 3], flatten([[1, 2], 3], 0))
215
- assert_equal([1, 2, 3], flatten([[1, 2], 3], 1))
216
- assert_equal([1, 2, 3], flatten([[1, 2], 3], 2))
217
-
218
- assert_equal([[[1], 2], [3], 4], flatten([[[1], 2], [3], 4], 0))
219
- assert_equal([[1], 2, 3, 4], flatten([[[1], 2], [3], 4], 1))
220
- assert_equal([1, 2, 3, 4], flatten([[[1], 2], [3], 4], 2))
221
- end
222
-
223
209
  def test_flatten_vertically
224
210
  assert_equal([1, 2, 3], flatten_vertically([1, 2, 3]))
225
211
  assert_equal([1, 3, 5, 2, 4, 6], flatten_vertically([[1, 2], [3, 4], [5, 6]]))
@@ -227,36 +213,6 @@ class UtilTest < MiniTest::Test
227
213
  assert_equal([1, 4, 6, 2, 5, 3], flatten_vertically([[1, 2, 3], [4, 5], 6]))
228
214
  end
229
215
 
230
- def test_set_hash
231
- assert(set_hash(Set[1, 2, 3]) == set_hash(Set[3, 2, 1]))
232
- assert(set_hash(Set[1, 2, 3]) == set_hash(Set[1, 2, 3]))
233
-
234
- s1 = Set[]
235
- s1 << 1
236
- s1 << 2
237
- s1 << 3
238
- s2 = Set[]
239
- s2 << 3
240
- s2 << 2
241
- s2 << 1
242
- assert(set_hash(s1) == set_hash(s2))
243
- end
244
-
245
- def test_set_eql
246
- assert(set_eql?(Set[1, 2, 3], Set[3, 2, 1]))
247
- assert(set_eql?(Set[1, 2, 3], Set[1, 2, 3]))
248
-
249
- s1 = Set[]
250
- s1 << 1
251
- s1 << 2
252
- s1 << 3
253
- s2 = Set[]
254
- s2 << 3
255
- s2 << 2
256
- s2 << 1
257
- assert(set_eql?(s1, s2))
258
- end
259
-
260
216
  def test_extract_and_inject_values
261
217
  test = lambda {|arr| assert_equal(arr, with_extracted_values(arr) {|str| str})}
262
218
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.18
4
+ version: 3.4.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natalie Weizenbaum
@@ -10,55 +10,54 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-08-25 00:00:00.000000000 Z
13
+ date: 2015-10-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: yard
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '>='
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 0.5.3
22
22
  type: :development
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '>='
26
+ - - ! '>='
27
27
  - !ruby/object:Gem::Version
28
28
  version: 0.5.3
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: maruku
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - '>='
33
+ - - ! '>='
34
34
  - !ruby/object:Gem::Version
35
35
  version: 0.5.9
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - '>='
40
+ - - ! '>='
41
41
  - !ruby/object:Gem::Version
42
42
  version: 0.5.9
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: minitest
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ! '>='
48
48
  - !ruby/object:Gem::Version
49
49
  version: '5'
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - '>='
54
+ - - ! '>='
55
55
  - !ruby/object:Gem::Version
56
56
  version: '5'
57
- description: |2
58
- Sass makes CSS fun again. Sass is an extension of CSS3, adding
59
- nested rules, variables, mixins, selector inheritance, and more.
60
- It's translated to well-formatted, standard CSS using the
61
- command line tool or a web-framework plugin.
57
+ description: ! " Sass makes CSS fun again. Sass is an extension of CSS, adding\n
58
+ \ nested rules, variables, mixins, selector inheritance, and more.\n It's
59
+ translated to well-formatted, standard CSS using the\n command line tool or
60
+ a web-framework plugin.\n"
62
61
  email: sass-lang@googlegroups.com
63
62
  executables:
64
63
  - sass
@@ -67,31 +66,47 @@ executables:
67
66
  extensions: []
68
67
  extra_rdoc_files: []
69
68
  files:
70
- - rails/init.rb
69
+ - .yardopts
70
+ - CODE_OF_CONDUCT.md
71
+ - CONTRIBUTING.md
72
+ - MIT-LICENSE
73
+ - README.md
74
+ - REVISION
75
+ - Rakefile
76
+ - VERSION
77
+ - VERSION_DATE
78
+ - VERSION_NAME
79
+ - bin/sass
80
+ - bin/sass-convert
81
+ - bin/scss
82
+ - extra/update_watch.rb
83
+ - init.rb
84
+ - lib/sass.rb
85
+ - lib/sass/cache_stores.rb
71
86
  - lib/sass/cache_stores/base.rb
72
87
  - lib/sass/cache_stores/chain.rb
73
88
  - lib/sass/cache_stores/filesystem.rb
74
89
  - lib/sass/cache_stores/memory.rb
75
90
  - lib/sass/cache_stores/null.rb
76
- - lib/sass/cache_stores.rb
77
91
  - lib/sass/callbacks.rb
78
92
  - lib/sass/css.rb
79
93
  - lib/sass/engine.rb
80
94
  - lib/sass/environment.rb
81
95
  - lib/sass/error.rb
96
+ - lib/sass/exec.rb
82
97
  - lib/sass/exec/base.rb
83
98
  - lib/sass/exec/sass_convert.rb
84
99
  - lib/sass/exec/sass_scss.rb
85
- - lib/sass/exec.rb
86
100
  - lib/sass/features.rb
101
+ - lib/sass/importers.rb
87
102
  - lib/sass/importers/base.rb
88
103
  - lib/sass/importers/deprecated_path.rb
89
104
  - lib/sass/importers/filesystem.rb
90
- - lib/sass/importers.rb
105
+ - lib/sass/logger.rb
91
106
  - lib/sass/logger/base.rb
92
107
  - lib/sass/logger/log_level.rb
93
- - lib/sass/logger.rb
94
108
  - lib/sass/media.rb
109
+ - lib/sass/plugin.rb
95
110
  - lib/sass/plugin/compiler.rb
96
111
  - lib/sass/plugin/configuration.rb
97
112
  - lib/sass/plugin/generic.rb
@@ -99,15 +114,16 @@ files:
99
114
  - lib/sass/plugin/rack.rb
100
115
  - lib/sass/plugin/rails.rb
101
116
  - lib/sass/plugin/staleness_checker.rb
102
- - lib/sass/plugin.rb
103
117
  - lib/sass/railtie.rb
104
118
  - lib/sass/repl.rb
105
119
  - lib/sass/root.rb
120
+ - lib/sass/script.rb
106
121
  - lib/sass/script/css_lexer.rb
107
122
  - lib/sass/script/css_parser.rb
108
123
  - lib/sass/script/functions.rb
109
124
  - lib/sass/script/lexer.rb
110
125
  - lib/sass/script/parser.rb
126
+ - lib/sass/script/tree.rb
111
127
  - lib/sass/script/tree/funcall.rb
112
128
  - lib/sass/script/tree/interpolation.rb
113
129
  - lib/sass/script/tree/list_literal.rb
@@ -119,7 +135,7 @@ files:
119
135
  - lib/sass/script/tree/string_interpolation.rb
120
136
  - lib/sass/script/tree/unary_operation.rb
121
137
  - lib/sass/script/tree/variable.rb
122
- - lib/sass/script/tree.rb
138
+ - lib/sass/script/value.rb
123
139
  - lib/sass/script/value/arg_list.rb
124
140
  - lib/sass/script/value/base.rb
125
141
  - lib/sass/script/value/bool.rb
@@ -130,22 +146,20 @@ files:
130
146
  - lib/sass/script/value/null.rb
131
147
  - lib/sass/script/value/number.rb
132
148
  - lib/sass/script/value/string.rb
133
- - lib/sass/script/value.rb
134
- - lib/sass/script.rb
149
+ - lib/sass/scss.rb
135
150
  - lib/sass/scss/css_parser.rb
136
151
  - lib/sass/scss/parser.rb
137
152
  - lib/sass/scss/rx.rb
138
153
  - lib/sass/scss/script_lexer.rb
139
154
  - lib/sass/scss/script_parser.rb
140
155
  - lib/sass/scss/static_parser.rb
141
- - lib/sass/scss.rb
156
+ - lib/sass/selector.rb
142
157
  - lib/sass/selector/abstract_sequence.rb
143
158
  - lib/sass/selector/comma_sequence.rb
144
159
  - lib/sass/selector/pseudo.rb
145
160
  - lib/sass/selector/sequence.rb
146
161
  - lib/sass/selector/simple.rb
147
162
  - lib/sass/selector/simple_sequence.rb
148
- - lib/sass/selector.rb
149
163
  - lib/sass/shared.rb
150
164
  - lib/sass/source/map.rb
151
165
  - lib/sass/source/position.rb
@@ -189,54 +203,15 @@ files:
189
203
  - lib/sass/tree/visitors/to_css.rb
190
204
  - lib/sass/tree/warn_node.rb
191
205
  - lib/sass/tree/while_node.rb
206
+ - lib/sass/util.rb
192
207
  - lib/sass/util/cross_platform_random.rb
193
208
  - lib/sass/util/multibyte_string_scanner.rb
194
209
  - lib/sass/util/normalized_map.rb
195
210
  - lib/sass/util/ordered_hash.rb
196
211
  - lib/sass/util/subset_map.rb
197
212
  - lib/sass/util/test.rb
198
- - lib/sass/util.rb
199
213
  - lib/sass/version.rb
200
- - lib/sass.rb
201
- - vendor/listen/CHANGELOG.md
202
- - vendor/listen/CONTRIBUTING.md
203
- - vendor/listen/Gemfile
204
- - vendor/listen/Guardfile
205
- - vendor/listen/lib/listen/adapter.rb
206
- - vendor/listen/lib/listen/adapters/bsd.rb
207
- - vendor/listen/lib/listen/adapters/darwin.rb
208
- - vendor/listen/lib/listen/adapters/linux.rb
209
- - vendor/listen/lib/listen/adapters/polling.rb
210
- - vendor/listen/lib/listen/adapters/windows.rb
211
- - vendor/listen/lib/listen/directory_record.rb
212
- - vendor/listen/lib/listen/listener.rb
213
- - vendor/listen/lib/listen/turnstile.rb
214
- - vendor/listen/lib/listen/version.rb
215
- - vendor/listen/lib/listen.rb
216
- - vendor/listen/LICENSE
217
- - vendor/listen/listen.gemspec
218
- - vendor/listen/Rakefile
219
- - vendor/listen/README.md
220
- - vendor/listen/spec/listen/adapter_spec.rb
221
- - vendor/listen/spec/listen/adapters/bsd_spec.rb
222
- - vendor/listen/spec/listen/adapters/darwin_spec.rb
223
- - vendor/listen/spec/listen/adapters/linux_spec.rb
224
- - vendor/listen/spec/listen/adapters/polling_spec.rb
225
- - vendor/listen/spec/listen/adapters/windows_spec.rb
226
- - vendor/listen/spec/listen/directory_record_spec.rb
227
- - vendor/listen/spec/listen/listener_spec.rb
228
- - vendor/listen/spec/listen/turnstile_spec.rb
229
- - vendor/listen/spec/listen_spec.rb
230
- - vendor/listen/spec/spec_helper.rb
231
- - vendor/listen/spec/support/adapter_helper.rb
232
- - vendor/listen/spec/support/directory_record_helper.rb
233
- - vendor/listen/spec/support/fixtures_helper.rb
234
- - vendor/listen/spec/support/listeners_helper.rb
235
- - vendor/listen/spec/support/platform_helper.rb
236
- - vendor/listen/Vagrantfile
237
- - bin/sass
238
- - bin/sass-convert
239
- - bin/scss
214
+ - rails/init.rb
240
215
  - test/sass/cache_test.rb
241
216
  - test/sass/callbacks_test.rb
242
217
  - test/sass/compiler_test.rb
@@ -361,18 +336,42 @@ files:
361
336
  - test/sass/util_test.rb
362
337
  - test/sass/value_helpers_test.rb
363
338
  - test/test_helper.rb
364
- - extra/update_watch.rb
365
- - Rakefile
366
- - init.rb
367
- - .yardopts
368
- - CODE_OF_CONDUCT.md
369
- - CONTRIBUTING.md
370
- - MIT-LICENSE
371
- - README.md
372
- - REVISION
373
- - VERSION
374
- - VERSION_DATE
375
- - VERSION_NAME
339
+ - vendor/listen/CHANGELOG.md
340
+ - vendor/listen/CONTRIBUTING.md
341
+ - vendor/listen/Gemfile
342
+ - vendor/listen/Guardfile
343
+ - vendor/listen/LICENSE
344
+ - vendor/listen/README.md
345
+ - vendor/listen/Rakefile
346
+ - vendor/listen/Vagrantfile
347
+ - vendor/listen/lib/listen.rb
348
+ - vendor/listen/lib/listen/adapter.rb
349
+ - vendor/listen/lib/listen/adapters/bsd.rb
350
+ - vendor/listen/lib/listen/adapters/darwin.rb
351
+ - vendor/listen/lib/listen/adapters/linux.rb
352
+ - vendor/listen/lib/listen/adapters/polling.rb
353
+ - vendor/listen/lib/listen/adapters/windows.rb
354
+ - vendor/listen/lib/listen/directory_record.rb
355
+ - vendor/listen/lib/listen/listener.rb
356
+ - vendor/listen/lib/listen/turnstile.rb
357
+ - vendor/listen/lib/listen/version.rb
358
+ - vendor/listen/listen.gemspec
359
+ - vendor/listen/spec/listen/adapter_spec.rb
360
+ - vendor/listen/spec/listen/adapters/bsd_spec.rb
361
+ - vendor/listen/spec/listen/adapters/darwin_spec.rb
362
+ - vendor/listen/spec/listen/adapters/linux_spec.rb
363
+ - vendor/listen/spec/listen/adapters/polling_spec.rb
364
+ - vendor/listen/spec/listen/adapters/windows_spec.rb
365
+ - vendor/listen/spec/listen/directory_record_spec.rb
366
+ - vendor/listen/spec/listen/listener_spec.rb
367
+ - vendor/listen/spec/listen/turnstile_spec.rb
368
+ - vendor/listen/spec/listen_spec.rb
369
+ - vendor/listen/spec/spec_helper.rb
370
+ - vendor/listen/spec/support/adapter_helper.rb
371
+ - vendor/listen/spec/support/directory_record_helper.rb
372
+ - vendor/listen/spec/support/fixtures_helper.rb
373
+ - vendor/listen/spec/support/listeners_helper.rb
374
+ - vendor/listen/spec/support/platform_helper.rb
376
375
  homepage: http://sass-lang.com/
377
376
  licenses:
378
377
  - MIT
@@ -383,43 +382,43 @@ require_paths:
383
382
  - lib
384
383
  required_ruby_version: !ruby/object:Gem::Requirement
385
384
  requirements:
386
- - - '>='
385
+ - - ! '>='
387
386
  - !ruby/object:Gem::Version
388
387
  version: 1.8.7
389
388
  required_rubygems_version: !ruby/object:Gem::Requirement
390
389
  requirements:
391
- - - '>='
390
+ - - ! '>='
392
391
  - !ruby/object:Gem::Version
393
392
  version: '0'
394
393
  requirements: []
395
394
  rubyforge_project: sass
396
- rubygems_version: 2.0.3
395
+ rubygems_version: 2.4.3
397
396
  signing_key:
398
397
  specification_version: 4
399
398
  summary: A powerful but elegant CSS compiler that makes CSS fun again.
400
399
  test_files:
400
+ - test/sass/importer_test.rb
401
+ - test/sass/engine_test.rb
402
+ - test/sass/value_helpers_test.rb
403
+ - test/sass/superselector_test.rb
404
+ - test/sass/logger_test.rb
405
+ - test/sass/util_test.rb
401
406
  - test/sass/cache_test.rb
402
- - test/sass/callbacks_test.rb
403
- - test/sass/compiler_test.rb
404
- - test/sass/conversion_test.rb
405
- - test/sass/css2sass_test.rb
406
407
  - test/sass/encoding_test.rb
407
- - test/sass/engine_test.rb
408
+ - test/sass/source_map_test.rb
409
+ - test/sass/css2sass_test.rb
410
+ - test/sass/plugin_test.rb
411
+ - test/sass/conversion_test.rb
412
+ - test/sass/util/subset_map_test.rb
413
+ - test/sass/util/multibyte_string_scanner_test.rb
414
+ - test/sass/util/normalized_map_test.rb
408
415
  - test/sass/exec_test.rb
409
- - test/sass/extend_test.rb
416
+ - test/sass/scss/rx_test.rb
417
+ - test/sass/scss/scss_test.rb
418
+ - test/sass/scss/css_test.rb
419
+ - test/sass/callbacks_test.rb
410
420
  - test/sass/functions_test.rb
411
- - test/sass/importer_test.rb
412
- - test/sass/logger_test.rb
413
- - test/sass/plugin_test.rb
421
+ - test/sass/extend_test.rb
414
422
  - test/sass/script_conversion_test.rb
415
423
  - test/sass/script_test.rb
416
- - test/sass/scss/css_test.rb
417
- - test/sass/scss/rx_test.rb
418
- - test/sass/scss/scss_test.rb
419
- - test/sass/source_map_test.rb
420
- - test/sass/superselector_test.rb
421
- - test/sass/util/multibyte_string_scanner_test.rb
422
- - test/sass/util/normalized_map_test.rb
423
- - test/sass/util/subset_map_test.rb
424
- - test/sass/util_test.rb
425
- - test/sass/value_helpers_test.rb
424
+ - test/sass/compiler_test.rb