sass 3.4.18 → 3.4.19

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,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