sass 3.4.22 → 3.4.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 414603b66564f231de620f9baff16563174a4b72
4
- data.tar.gz: 4f09c7d1af56afa99f42b2c5922144774befd481
3
+ metadata.gz: 87969e0a80091cd78a2acae89e1fcb30abedcebf
4
+ data.tar.gz: d7297b39a2a1e46434b89fec0ba878b671a29e14
5
5
  SHA512:
6
- metadata.gz: 40de104dabb794e5fd4fb20bdfcf0c2d57444d4b2f283312d4698482c3117fc5093b7e65daaacbae1b4ccd93989d0e6c3a3c0f3548a3c5710de74563d9ee6b96
7
- data.tar.gz: 738319bc6f7d3b10e4ec16e0e5c5b9ed7b7c21f6c09d7bc244cbd5d0fab785778ccf4b2270ba86eb68597a8b1eb4836ef4f7460c7063381a7cfa2c9017b73c15
6
+ metadata.gz: 96e87063a0f068712aeb63593e7861f69db072d306b6005c8a49780bf9553bca1dc1bbfa7d4cef1a8a29d1f198aa636823260af4eaed0f75c0fb45a08c903526
7
+ data.tar.gz: 8bb8cef35fc3c2d5dd4be949d1a0ebd075f6468dc37d97c8d0af8252ab213788cc66350d636153877a4fa025bf42955ab7a209e8c3401d63b7e8fdea3ac5316e
@@ -37,6 +37,29 @@ branch, but don't worry about it too much; if you make a request against the
37
37
  wrong branch, the maintainer will take responsibility for rebasing it before
38
38
  merging.
39
39
 
40
+ ### Testing
41
+
42
+ Tests for changes to the Sass language go in
43
+ [sass-spec](https://github.com/sass/sass-spec) so that other
44
+ implementations (E.g. libSass) can be tested against the same test
45
+ suite. The sass-spec repo follows a "trunk development" model in that
46
+ the tests there test against different version of the Sass language (as
47
+ opposed to having branches that track different Sass versions). When
48
+ contributing changes to Sass, update the Gemfile to use sass-spec from a
49
+ branch or fork that has the new tests. When the feature lands in Sass,
50
+ the committer will also merge the corresponding sass-spec changes.
51
+
52
+ The [documentation of
53
+ sass-spec](https://github.com/sass/sass-spec/blob/master/README.md)
54
+ explains how to run sass-spec and contribute changes. In development,
55
+ Change the Gemfile(s) to use the `:path` option against the sass-spec gem
56
+ to link your local checkout of sass and sass-spec together in one or
57
+ both directions.
58
+
59
+ Changes to Sass internals or Ruby Sass specific features (E.g.
60
+ the `sass-convert` tool) should always have tests in the Sass `test`
61
+ directory following the conventions you see there.
62
+
40
63
  ### Feature Branches
41
64
 
42
65
  Sometimes it won't be possible to merge a new feature into `next` or `master`
data/README.md CHANGED
@@ -1,4 +1,4 @@
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)
1
+ # Sass [![Gem Version](https://badge.fury.io/rb/sass.svg)](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
3
  **Sass makes CSS fun again**. Sass is an extension of CSS,
4
4
  adding nested rules, variables, mixins, selector inheritance, and more.
@@ -184,7 +184,7 @@ See `sass-convert --help` for further information and options.
184
184
  To run the Sass executables from a source checkout instead of from rubygems:
185
185
 
186
186
  ```
187
- $ cd <SASS_CHECKOUT_DIRECTORY>
187
+ $ cd sass
188
188
  $ bundle
189
189
  $ bundle exec sass ...
190
190
  $ bundle exec scss ...
@@ -199,12 +199,12 @@ and now occasionally consults on the language issues. Hampton lives in San
199
199
  Francisco, California and works as VP of Technology
200
200
  at [Moovweb](http://www.moovweb.com/).
201
201
 
202
- [Natalie Weizenbaum](https://twitter.com/nex3) is the primary developer and architect of
203
- Sass. Her hard work has kept the project alive by endlessly answering forum
204
- posts, fixing bugs, refactoring, finding speed improvements, writing
205
- documentation, implementing new features, and getting Hampton coffee (a fitting
206
- task for a girl genius). Natalie lives in Seattle, Washington and works on
207
- [Dart](http://dartlang.org) application libraries at Google.
202
+ [Natalie Weizenbaum](https://twitter.com/nex3) is the primary developer and
203
+ architect of Sass. Her hard work has kept the project alive by endlessly
204
+ answering forum posts, fixing bugs, refactoring, finding speed improvements,
205
+ writing documentation, implementing new features, and designing the language.
206
+ Natalie lives in Seattle, Washington and works on [Dart](http://dartlang.org)
207
+ application libraries at Google.
208
208
 
209
209
  [Chris Eppstein](http://twitter.com/chriseppstein) is a core contributor to
210
210
  Sass and the creator of [Compass](http://compass-style.org/), the first Sass-based framework, and
data/Rakefile CHANGED
@@ -48,8 +48,8 @@ namespace :test do
48
48
  end
49
49
  default_options = {
50
50
  :spec_directory => SassSpec::SPEC_DIR,
51
- :engine_adapter => SassEngineAdapter.new("sass"),
52
- :generate => [],
51
+ :engine_adapter => SassEngineAdapter.new,
52
+ :generate => false,
53
53
  :tap => false,
54
54
  :skip => false,
55
55
  :verbose => false,
@@ -57,14 +57,6 @@ namespace :test do
57
57
  :limit => -1,
58
58
  :unexpected_pass => false,
59
59
  :nuke => false,
60
-
61
- # Constants
62
- :output_styles => ["nested"],
63
- :input_files => ["input.scss", "input.sass"],
64
- :nested_output_file => 'expected_output',
65
- :compressed_output_file => 'expected.compressed',
66
- :expanded_output_file => 'expected.expanded',
67
- :compact_output_file => 'expected.compact'
68
60
  }
69
61
  SassSpec::Runner.new(default_options.merge(sass_spec_options)).run || exit(1)
70
62
  ensure
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.4.22
1
+ 3.4.23
@@ -1 +1 @@
1
- 28 March 2016 23:31:39 UTC
1
+ 19 December 2016 23:15:42 UTC
@@ -0,0 +1,32 @@
1
+ #!/bin/bash -e
2
+ # Copyright 2016 Google Inc. Use of this source code is governed by an MIT-style
3
+ # license that can be found in the LICENSE file or at
4
+ # https://opensource.org/licenses/MIT.
5
+
6
+ # Echoes the sass-spec Git ref that should be checked out for the current Travis
7
+ # run. If we're running specs for a pull request which refers to a sass-spec
8
+ # pull request, we'll run against the latter rather than sass-spec master.
9
+
10
+ default=master
11
+
12
+ if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
13
+ >&2 echo "TRAVIS_PULL_REQUEST: $TRAVIS_PULL_REQUEST."
14
+ >&2 echo "Ref: $default."
15
+ echo "$default"
16
+ exit 0
17
+ fi
18
+
19
+ >&2 echo "Fetching pull request $TRAVIS_PULL_REQUEST..."
20
+
21
+ JSON=$(curl -L -sS https://api.github.com/repos/sass/sass/pulls/$TRAVIS_PULL_REQUEST)
22
+
23
+ RE_SPEC_PR="sass\/sass-spec(#|\/pull\/)([0-9]+)"
24
+
25
+ if [[ $JSON =~ $RE_SPEC_PR ]]; then
26
+ ref="pull/${BASH_REMATCH[2]}/head"
27
+ >&2 echo "Ref: $ref."
28
+ echo "$ref"
29
+ else
30
+ >&2 echo "Ref: $default."
31
+ echo "$default"
32
+ fi
@@ -36,7 +36,7 @@ module Sass
36
36
  def _store(key, version, sha, contents)
37
37
  compiled_filename = path_to(key)
38
38
  FileUtils.mkdir_p(File.dirname(compiled_filename))
39
- Sass::Util.atomic_create_and_write_file(compiled_filename, 0600) do |f|
39
+ Sass::Util.atomic_create_and_write_file(compiled_filename) do |f|
40
40
  f.puts(version)
41
41
  f.puts(sha)
42
42
  f.write(contents)
@@ -23,7 +23,7 @@ module Sass::Exec
23
23
  # at_exit is a bit of a hack, but it allows us to rethrow when --trace
24
24
  # is active and get both the built-in exception formatting and the
25
25
  # correct exit code.
26
- at_exit {exit 65} if e.is_a?(Sass::SyntaxError)
26
+ at_exit {exit Sass::Util.windows? ? 13 : 65} if e.is_a?(Sass::SyntaxError)
27
27
 
28
28
  raise e if @options[:trace] || e.is_a?(SystemExit)
29
29
 
@@ -2,11 +2,16 @@ module Sass::Logger; end
2
2
 
3
3
  require "sass/logger/log_level"
4
4
  require "sass/logger/base"
5
+ require "sass/logger/delayed"
5
6
 
6
7
  module Sass
7
8
  class << self
8
- attr_accessor :logger
9
- end
9
+ def logger=(l)
10
+ Thread.current[:sass_logger] = l
11
+ end
10
12
 
11
- self.logger = Sass::Logger::Base.new
13
+ def logger
14
+ Thread.current[:sass_logger] ||= Sass::Logger::Base.new
15
+ end
16
+ end
12
17
  end
@@ -5,6 +5,7 @@ class Sass::Logger::Base
5
5
 
6
6
  attr_accessor :log_level
7
7
  attr_accessor :disabled
8
+ attr_accessor :io
8
9
 
9
10
  log_level :trace
10
11
  log_level :debug
@@ -12,8 +13,9 @@ class Sass::Logger::Base
12
13
  log_level :warn
13
14
  log_level :error
14
15
 
15
- def initialize(log_level = :debug)
16
+ def initialize(log_level = :debug, io = nil)
16
17
  self.log_level = log_level
18
+ self.io = io
17
19
  end
18
20
 
19
21
  def logging_level?(level)
@@ -25,6 +27,10 @@ class Sass::Logger::Base
25
27
  end
26
28
 
27
29
  def _log(level, message)
28
- Kernel.warn(message)
30
+ if io
31
+ io.puts(message)
32
+ else
33
+ Kernel.warn(message)
34
+ end
29
35
  end
30
36
  end
@@ -0,0 +1,50 @@
1
+ require 'sass/logger/log_level'
2
+
3
+ # A logger that delays messages until they're explicitly flushed to an inner
4
+ # logger.
5
+ #
6
+ # This can be installed around the current logger by calling \{#install!}, and
7
+ # the original logger can be replaced by calling \{#uninstall!}. The log
8
+ # messages can be flushed by calling \{#flush}.
9
+ class Sass::Logger::Delayed < Sass::Logger::Base
10
+ # Installs a new delayed logger as the current Sass logger, wrapping the
11
+ # original logger.
12
+ #
13
+ # This can be undone by calling \{#uninstall!}.
14
+ #
15
+ # @return [Sass::Logger::Delayed] The newly-created logger.
16
+ def self.install!
17
+ logger = Sass::Logger::Delayed.new(Sass.logger)
18
+ Sass.logger = logger
19
+ logger
20
+ end
21
+
22
+ # Creates a delayed logger wrapping `inner`.
23
+ #
24
+ # @param inner [Sass::Logger::Base] The wrapped logger.
25
+ def initialize(inner)
26
+ self.log_level = inner.log_level
27
+ @inner = inner
28
+ @messages = []
29
+ end
30
+
31
+ # Flushes all queued logs to the wrapped logger.
32
+ def flush
33
+ @messages.each {|(l, m)| @inner.log(l, m)}
34
+ end
35
+
36
+ # Uninstalls this logger from \{Sass.logger\}. This should only be called if
37
+ # the logger was installed using \{#install!}
38
+ def uninstall!
39
+ if Sass.logger != self
40
+ throw Exception.new("Can't uninstall a logger that's not currently installed.")
41
+ end
42
+
43
+ @inner.log_level = log_level
44
+ Sass.logger = @inner
45
+ end
46
+
47
+ def _log(level, message)
48
+ @messages << [level, message]
49
+ end
50
+ end
@@ -1305,7 +1305,7 @@ module Sass::Script
1305
1305
  # @param $color1 [Sass::Script::Value::Color]
1306
1306
  # @param $color2 [Sass::Script::Value::Color]
1307
1307
  # @param $weight [Sass::Script::Value::Number] The relative weight of each
1308
- # color. Closer to `0%` gives more weight to `$color1`, closer to `100%`
1308
+ # color. Closer to `100%` gives more weight to `$color1`, closer to `0%`
1309
1309
  # gives more weight to `$color2`
1310
1310
  # @return [Sass::Script::Value::Color]
1311
1311
  # @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
@@ -1546,7 +1546,7 @@ MESSAGE
1546
1546
  # @param $start-at [Sass::Script::Value::Number] The index of the first
1547
1547
  # character of the substring. If this is negative, it counts from the end
1548
1548
  # of `$string`
1549
- # @param $end-before [Sass::Script::Value::Number] The index of the last
1549
+ # @param $end-at [Sass::Script::Value::Number] The index of the last
1550
1550
  # character of the substring. If this is negative, it counts from the end
1551
1551
  # of `$string`. Defaults to -1
1552
1552
  # @return [Sass::Script::Value::String] The substring. This will be quoted
@@ -1565,7 +1565,7 @@ MESSAGE
1565
1565
  s = string.value.length + s if s < 0
1566
1566
  s = 0 if s < 0
1567
1567
  e = string.value.length + e if e < 0
1568
- e = 0 if s < 0
1568
+ return Sass::Script::Value::String.new("", string.type) if e < 0
1569
1569
  extracted = string.value.slice(s..e)
1570
1570
  Sass::Script::Value::String.new(extracted || "", string.type)
1571
1571
  end
@@ -1611,6 +1611,7 @@ MESSAGE
1611
1611
  # type-of(true) => bool
1612
1612
  # type-of(#fff) => color
1613
1613
  # type-of(blue) => color
1614
+ # type-of(null) => null
1614
1615
  # @overload type_of($value)
1615
1616
  # @param $value [Sass::Script::Value::Base] The value to inspect
1616
1617
  # @return [Sass::Script::Value::String] The unquoted string name of the
@@ -2263,6 +2264,7 @@ MESSAGE
2263
2264
  # @example
2264
2265
  # $a-false-value: false;
2265
2266
  # variable-exists(a-false-value) => true
2267
+ # variable-exists(a-null-value) => true
2266
2268
  #
2267
2269
  # variable-exists(nonexistent) => false
2268
2270
  #
@@ -2283,6 +2285,7 @@ MESSAGE
2283
2285
  # @example
2284
2286
  # $a-false-value: false;
2285
2287
  # global-variable-exists(a-false-value) => true
2288
+ # global-variable-exists(a-null-value) => true
2286
2289
  #
2287
2290
  # .foo {
2288
2291
  # $some-var: false;
@@ -471,18 +471,24 @@ RUBY
471
471
  # `expr`).
472
472
  # @return [Boolean]
473
473
  def is_unsafe_before?(expr, char_before)
474
- # If the previous expression is an identifier or number, it's safe
475
- # unless it was wrapped in parentheses.
476
- if expr.is_a?(Script::Tree::Literal) &&
477
- (expr.value.is_a?(Script::Value::Number) ||
478
- (expr.value.is_a?(Script::Value::String) && expr.value.type == :identifier))
479
- return char_before == ')'
480
- end
474
+ return char_before == ')' if is_safe_value?(expr)
481
475
 
482
476
  # Otherwise, it's only safe if it was another interpolation.
483
477
  !expr.is_a?(Script::Tree::Interpolation)
484
478
  end
485
479
 
480
+ # Returns whether `expr` is safe as the value immediately before an
481
+ # interpolation.
482
+ #
483
+ # It's safe as long as the previous expression is an identifier or number,
484
+ # or a list whose last element is also safe.
485
+ def is_safe_value?(expr)
486
+ return is_safe_value?(expr.elements.last) if expr.is_a?(Script::Tree::ListLiteral)
487
+ return false unless expr.is_a?(Script::Tree::Literal)
488
+ expr.value.is_a?(Script::Value::Number) ||
489
+ (expr.value.is_a?(Script::Value::String) && expr.value.type == :identifier)
490
+ end
491
+
486
492
  def space
487
493
  start_pos = source_position
488
494
  e = or_expr
@@ -34,29 +34,31 @@ module Sass::Script::Value
34
34
  attr_accessor :original
35
35
 
36
36
  def self.precision
37
- @precision ||= 5
37
+ Thread.current[:sass_numeric_precision] || Thread.main[:sass_numeric_precision] || 5
38
38
  end
39
39
 
40
40
  # Sets the number of digits of precision
41
41
  # For example, if this is `3`,
42
42
  # `3.1415926` will be printed as `3.142`.
43
+ # The numeric precision is stored as a thread local for thread safety reasons.
44
+ # To set for all threads, be sure to set the precision on the main thread.
43
45
  def self.precision=(digits)
44
- @precision = digits.round
45
- @precision_factor = 10.0**@precision
46
- @epsilon = 1 / (@precision_factor * 10)
46
+ Thread.current[:sass_numeric_precision] = digits.round
47
+ Thread.current[:sass_numeric_precision_factor] = nil
48
+ Thread.current[:sass_numeric_epsilon] = nil
47
49
  end
48
50
 
49
51
  # the precision factor used in numeric output
50
52
  # it is derived from the `precision` method.
51
53
  def self.precision_factor
52
- @precision_factor ||= 10.0**precision
54
+ Thread.current[:sass_numeric_precision_factor] ||= 10.0**precision
53
55
  end
54
56
 
55
57
  # Used in checking equality of floating point numbers. Any
56
58
  # numbers within an `epsilon` of each other are considered functionally equal.
57
59
  # The value for epsilon is one tenth of the current numeric precision.
58
60
  def self.epsilon
59
- @epsilon ||= 1 / (precision_factor * 10)
61
+ Thread.current[:sass_numeric_epsilon] ||= 1 / (precision_factor * 10)
60
62
  end
61
63
 
62
64
  # Used so we don't allocate two new arrays for each new number.
@@ -508,8 +510,8 @@ module Sass::Script::Value
508
510
  },
509
511
  {
510
512
  'dpi' => Rational(1),
511
- 'dpcm' => Rational(1, 2.54),
512
- 'dppx' => Rational(1, 96)
513
+ 'dpcm' => Rational(254, 100),
514
+ 'dppx' => Rational(96)
513
515
  }
514
516
  ]
515
517
 
@@ -560,7 +560,7 @@ module Sass
560
560
  def supports_clause
561
561
  return unless tok(/supports\(/i)
562
562
  ss
563
- supports = supports_condition
563
+ supports = import_supports_condition
564
564
  ss
565
565
  tok!(/\)/)
566
566
  supports
@@ -570,6 +570,10 @@ module Sass
570
570
  supports_negation || supports_operator || supports_interpolation
571
571
  end
572
572
 
573
+ def import_supports_condition
574
+ supports_condition || supports_declaration
575
+ end
576
+
573
577
  def supports_negation
574
578
  return unless tok(/not/i)
575
579
  ss
@@ -589,6 +593,13 @@ module Sass
589
593
  cond
590
594
  end
591
595
 
596
+ def supports_declaration
597
+ name = sass_script(:parse)
598
+ tok!(/:/); ss
599
+ value = sass_script(:parse)
600
+ Sass::Supports::Declaration.new(name, value)
601
+ end
602
+
592
603
  def supports_condition_in_parens
593
604
  interp = supports_interpolation
594
605
  return interp if interp
@@ -597,11 +608,9 @@ module Sass
597
608
  tok!(/\)/); ss
598
609
  cond
599
610
  else
600
- name = sass_script(:parse)
601
- tok!(/:/); ss
602
- value = sass_script(:parse)
611
+ decl = supports_declaration
603
612
  tok!(/\)/); ss
604
- Sass::Supports::Declaration.new(name, value)
613
+ decl
605
614
  end
606
615
  end
607
616
 
@@ -828,6 +837,9 @@ module Sass
828
837
  |
829
838
  (?!url\()
830
839
  [^"'/\#!;\{\}] # "
840
+ |
841
+ # interp_uri will handle most url() calls, but not ones that take strings
842
+ url\(#{W}(?=")
831
843
  |
832
844
  /(?![/*])
833
845
  |
@@ -1143,14 +1155,20 @@ WARNING
1143
1155
  line = @line
1144
1156
  offset = @offset
1145
1157
  expected = @expected
1158
+
1159
+ logger = Sass::Logger::Delayed.install!
1146
1160
  if catch(:_sass_parser_error) {yield; false}
1147
1161
  @scanner.pos = pos
1148
1162
  @line = line
1149
1163
  @offset = offset
1150
1164
  @expected = expected
1151
1165
  {:pos => pos, :line => line, :expected => @expected, :block => block}
1166
+ else
1167
+ logger.flush
1168
+ nil
1152
1169
  end
1153
1170
  ensure
1171
+ logger.uninstall! if logger
1154
1172
  @throw_error = old_throw_error
1155
1173
  end
1156
1174
 
@@ -118,12 +118,14 @@ module Sass::Source
118
118
  @data.each do |m|
119
119
  file, importer = m.input.file, m.input.importer
120
120
 
121
+ next unless importer
122
+
121
123
  if options[:type] == :inline
122
124
  source_uri = file
123
125
  else
124
126
  sourcemap_dir = sourcemap_path && sourcemap_path.dirname.to_s
125
127
  sourcemap_dir = nil if options[:type] == :file
126
- source_uri = importer && importer.public_url(file, sourcemap_dir)
128
+ source_uri = importer.public_url(file, sourcemap_dir)
127
129
  next unless source_uri
128
130
  end
129
131
 
@@ -289,7 +289,9 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
289
289
  child.line + 1 == nxt.line) ||
290
290
  (child.is_a?(Sass::Tree::VariableNode) && nxt.is_a?(Sass::Tree::VariableNode) &&
291
291
  child.line + 1 == nxt.line) ||
292
- (child.is_a?(Sass::Tree::PropNode) && nxt.is_a?(Sass::Tree::PropNode))
292
+ (child.is_a?(Sass::Tree::PropNode) && nxt.is_a?(Sass::Tree::PropNode)) ||
293
+ (child.is_a?(Sass::Tree::MixinNode) && nxt.is_a?(Sass::Tree::MixinNode) &&
294
+ child.line + 1 == nxt.line)
293
295
  ""
294
296
  else
295
297
  "\n"
@@ -1126,6 +1126,23 @@ foo {
1126
1126
  SCSS
1127
1127
  end
1128
1128
 
1129
+ def test_consecutive_mixin_includes
1130
+ assert_renders <<SASS, <<SCSS
1131
+ foo
1132
+ +foo-bar
1133
+ +foo-bar
1134
+
1135
+ a: blip
1136
+ SASS
1137
+ foo {
1138
+ @include foo-bar;
1139
+ @include foo-bar;
1140
+
1141
+ a: blip;
1142
+ }
1143
+ SCSS
1144
+ end
1145
+
1129
1146
  def test_mixin_include_with_hyphen_conversion_keyword_arg
1130
1147
  assert_renders <<SASS, <<SCSS
1131
1148
  foo
@@ -558,9 +558,9 @@ WARNING
558
558
  end
559
559
 
560
560
  def test_resolution_units
561
- assert_equal "2.54", resolve("(1dpi/1dpcm)")
562
- assert_equal "37.79528", resolve("(1dpcm/1dppx)")
563
- assert_equal "0.01042", resolve("(1dppx/1dpi)")
561
+ assert_equal "0.3937", resolve("(1dpi/1dpcm)")
562
+ assert_equal "0.02646", resolve("(1dpcm/1dppx)")
563
+ assert_equal "96", resolve("(1dppx/1dpi)")
564
564
  end
565
565
 
566
566
  def test_operations_have_options
@@ -3649,6 +3649,39 @@ SCSS
3649
3649
 
3650
3650
  # Regression
3651
3651
 
3652
+ # Regression test for #2031.
3653
+ def test_no_interpolation_warning_in_nested_selector
3654
+ assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
3655
+ z a:b(n+1) {
3656
+ x: y; }
3657
+ CSS
3658
+ z {
3659
+ a:b(n+\#{1}) {
3660
+ x: y;
3661
+ }
3662
+ }
3663
+ SCSS
3664
+ end
3665
+
3666
+ # Ensures that the fix for #2031 doesn't hide legitimate warnings.
3667
+ def test_interpolation_warning_in_selector_like_property
3668
+ assert_warning(<<WARNING) {assert_equal(<<CSS, render(<<SCSS))}
3669
+ DEPRECATION WARNING on line 2 of #{filename_for_test :scss}: \#{} interpolation near operators will be simplified
3670
+ in a future version of Sass. To preserve the current behavior, use quotes:
3671
+
3672
+ unquote("n+1")
3673
+
3674
+ You can use the sass-convert command to automatically fix most cases.
3675
+ WARNING
3676
+ z {
3677
+ a: b(n+1); }
3678
+ CSS
3679
+ z {
3680
+ a:b(n+\#{1});
3681
+ }
3682
+ SCSS
3683
+ end
3684
+
3652
3685
  def test_escape_in_selector
3653
3686
  assert_equal(<<CSS, render(".\\!foo {a: b}"))
3654
3687
  .\\!foo {
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.22
4
+ version: 3.4.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natalie Weizenbaum
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-28 00:00:00.000000000 Z
13
+ date: 2016-12-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: yard
@@ -80,6 +80,7 @@ files:
80
80
  - bin/sass
81
81
  - bin/sass-convert
82
82
  - bin/scss
83
+ - extra/sass-spec-ref.sh
83
84
  - extra/update_watch.rb
84
85
  - init.rb
85
86
  - lib/sass.rb
@@ -105,6 +106,7 @@ files:
105
106
  - lib/sass/importers/filesystem.rb
106
107
  - lib/sass/logger.rb
107
108
  - lib/sass/logger/base.rb
109
+ - lib/sass/logger/delayed.rb
108
110
  - lib/sass/logger/log_level.rb
109
111
  - lib/sass/media.rb
110
112
  - lib/sass/plugin.rb
@@ -394,34 +396,34 @@ required_rubygems_version: !ruby/object:Gem::Requirement
394
396
  version: '0'
395
397
  requirements: []
396
398
  rubyforge_project: sass
397
- rubygems_version: 2.5.1
399
+ rubygems_version: 2.4.8
398
400
  signing_key:
399
401
  specification_version: 4
400
402
  summary: A powerful but elegant CSS compiler that makes CSS fun again.
401
403
  test_files:
402
- - test/sass/cache_test.rb
403
- - test/sass/callbacks_test.rb
404
- - test/sass/compiler_test.rb
405
- - test/sass/conversion_test.rb
406
- - test/sass/css2sass_test.rb
407
- - test/sass/css_variable_test.rb
408
- - test/sass/encoding_test.rb
409
- - test/sass/engine_test.rb
410
- - test/sass/exec_test.rb
411
404
  - test/sass/extend_test.rb
412
- - test/sass/functions_test.rb
413
- - test/sass/importer_test.rb
414
- - test/sass/logger_test.rb
405
+ - test/sass/css2sass_test.rb
406
+ - test/sass/util_test.rb
407
+ - test/sass/superselector_test.rb
408
+ - test/sass/value_helpers_test.rb
415
409
  - test/sass/plugin_test.rb
416
- - test/sass/script_conversion_test.rb
410
+ - test/sass/logger_test.rb
411
+ - test/sass/functions_test.rb
412
+ - test/sass/conversion_test.rb
413
+ - test/sass/source_map_test.rb
414
+ - test/sass/cache_test.rb
415
+ - test/sass/encoding_test.rb
417
416
  - test/sass/script_test.rb
417
+ - test/sass/callbacks_test.rb
418
+ - test/sass/script_conversion_test.rb
418
419
  - test/sass/scss/css_test.rb
419
420
  - test/sass/scss/rx_test.rb
420
421
  - test/sass/scss/scss_test.rb
421
- - test/sass/source_map_test.rb
422
- - test/sass/superselector_test.rb
423
- - test/sass/util/multibyte_string_scanner_test.rb
424
- - test/sass/util/normalized_map_test.rb
422
+ - test/sass/exec_test.rb
423
+ - test/sass/importer_test.rb
424
+ - test/sass/engine_test.rb
425
+ - test/sass/css_variable_test.rb
426
+ - test/sass/compiler_test.rb
425
427
  - test/sass/util/subset_map_test.rb
426
- - test/sass/util_test.rb
427
- - test/sass/value_helpers_test.rb
428
+ - test/sass/util/normalized_map_test.rb
429
+ - test/sass/util/multibyte_string_scanner_test.rb