sass 3.4.22 → 3.4.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/CONTRIBUTING.md +23 -0
  4. data/README.md +8 -8
  5. data/Rakefile +2 -10
  6. data/VERSION +1 -1
  7. data/VERSION_DATE +1 -1
  8. data/extra/sass-spec-ref.sh +32 -0
  9. data/lib/sass/cache_stores/filesystem.rb +1 -1
  10. data/lib/sass/engine.rb +3 -3
  11. data/lib/sass/error.rb +3 -3
  12. data/lib/sass/exec/base.rb +1 -1
  13. data/lib/sass/logger/base.rb +8 -2
  14. data/lib/sass/logger/delayed.rb +50 -0
  15. data/lib/sass/logger.rb +8 -3
  16. data/lib/sass/plugin/rack.rb +1 -1
  17. data/lib/sass/plugin/staleness_checker.rb +2 -2
  18. data/lib/sass/script/functions.rb +10 -7
  19. data/lib/sass/script/lexer.rb +5 -5
  20. data/lib/sass/script/parser.rb +17 -11
  21. data/lib/sass/script/tree/node.rb +1 -1
  22. data/lib/sass/script/value/base.rb +2 -2
  23. data/lib/sass/script/value/color.rb +10 -10
  24. data/lib/sass/script/value/number.rb +11 -9
  25. data/lib/sass/script.rb +2 -2
  26. data/lib/sass/scss/parser.rb +26 -8
  27. data/lib/sass/scss/rx.rb +1 -1
  28. data/lib/sass/selector/abstract_sequence.rb +5 -5
  29. data/lib/sass/selector/sequence.rb +2 -2
  30. data/lib/sass/selector/simple.rb +4 -4
  31. data/lib/sass/shared.rb +1 -1
  32. data/lib/sass/source/map.rb +5 -3
  33. data/lib/sass/source/position.rb +4 -4
  34. data/lib/sass/tree/comment_node.rb +1 -1
  35. data/lib/sass/tree/node.rb +1 -1
  36. data/lib/sass/tree/prop_node.rb +1 -1
  37. data/lib/sass/tree/rule_node.rb +1 -1
  38. data/lib/sass/tree/visitors/convert.rb +3 -1
  39. data/lib/sass/tree/visitors/to_css.rb +1 -1
  40. data/lib/sass/util.rb +33 -8
  41. data/lib/sass/version.rb +2 -2
  42. data/test/sass/conversion_test.rb +17 -0
  43. data/test/sass/extend_test.rb +38 -18
  44. data/test/sass/script_test.rb +3 -3
  45. data/test/sass/scss/scss_test.rb +33 -0
  46. metadata +28 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 414603b66564f231de620f9baff16563174a4b72
4
- data.tar.gz: 4f09c7d1af56afa99f42b2c5922144774befd481
3
+ metadata.gz: 798967a96737a6978563e8b46a97cf3254d1bd54
4
+ data.tar.gz: 57ed07a4077a5d81a9b821da7b7f4dcffb939fd2
5
5
  SHA512:
6
- metadata.gz: 40de104dabb794e5fd4fb20bdfcf0c2d57444d4b2f283312d4698482c3117fc5093b7e65daaacbae1b4ccd93989d0e6c3a3c0f3548a3c5710de74563d9ee6b96
7
- data.tar.gz: 738319bc6f7d3b10e4ec16e0e5c5b9ed7b7c21f6c09d7bc244cbd5d0fab785778ccf4b2270ba86eb68597a8b1eb4836ef4f7460c7063381a7cfa2c9017b73c15
6
+ metadata.gz: a86659601d7713959b8213d53a09ced83a3d3eb09eb64fdcab54fcba0e3f4b05477db9ded2f30c7e77a44f078115ee9b6efed016f868b40e725e40d7bb4a1d3e
7
+ data.tar.gz: 42da27fb2cd7325d5df8404ea20bd6e4d57f926ee835f266120dc2fbd2beee43a7dc2e8932d136365c43f26a66fe019457a46afe376578ce11a8abc2316625cc
data/.yardopts CHANGED
@@ -1,6 +1,6 @@
1
1
  --readme README.md
2
2
  --markup markdown
3
- --markup-provider maruku
3
+ --markup-provider redcarpet
4
4
  --default-return ""
5
5
  --title "Sass Documentation"
6
6
  --query 'object.type != :classvariable'
data/CONTRIBUTING.md CHANGED
@@ -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.24
data/VERSION_DATE CHANGED
@@ -1 +1 @@
1
- 28 March 2016 23:31:39 UTC
1
+ 19 May 2017 00:01:41 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)
data/lib/sass/engine.rb CHANGED
@@ -94,13 +94,13 @@ module Sass
94
94
  # `text`: `String`
95
95
  # : The text in the line, without any whitespace at the beginning or end.
96
96
  #
97
- # `tabs`: `Fixnum`
97
+ # `tabs`: `Integer`
98
98
  # : The level of indentation of the line.
99
99
  #
100
- # `index`: `Fixnum`
100
+ # `index`: `Integer`
101
101
  # : The line number in the original document.
102
102
  #
103
- # `offset`: `Fixnum`
103
+ # `offset`: `Integer`
104
104
  # : The number of bytes in on the line that the text begins.
105
105
  # This ends up being the number of bytes of leading whitespace.
106
106
  #
data/lib/sass/error.rb CHANGED
@@ -69,14 +69,14 @@ module Sass
69
69
  # The name of the mixin in which the error occurred.
70
70
  # This could be `nil` if the error occurred outside a mixin.
71
71
  #
72
- # @return [Fixnum]
72
+ # @return [String]
73
73
  def sass_mixin
74
74
  sass_backtrace.first[:mixin]
75
75
  end
76
76
 
77
77
  # The line of the Sass template on which the error occurred.
78
78
  #
79
- # @return [Fixnum]
79
+ # @return [Integer]
80
80
  def sass_line
81
81
  sass_backtrace.first[:line]
82
82
  end
@@ -153,7 +153,7 @@ module Sass
153
153
  # Returns an error report for an exception in CSS format.
154
154
  #
155
155
  # @param e [Exception]
156
- # @param line_offset [Fixnum] The number of the first line of the Sass template.
156
+ # @param line_offset [Integer] The number of the first line of the Sass template.
157
157
  # @return [String] The error report
158
158
  # @raise [Exception] `e`, if the
159
159
  # {file:SASS_REFERENCE.md#full_exception-option `:full_exception`} option
@@ -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
 
@@ -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
data/lib/sass/logger.rb CHANGED
@@ -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
@@ -9,7 +9,7 @@ module Sass
9
9
  #
10
10
  # ## Customize
11
11
  #
12
- # Sass::Plugin.options.merge(
12
+ # Sass::Plugin.options.merge!(
13
13
  # :cache_location => './tmp/sass-cache',
14
14
  # :never_update => environment != :production,
15
15
  # :full_exception => environment != :production)
@@ -72,7 +72,7 @@ module Sass
72
72
  # Returns whether a Sass or SCSS stylesheet has been modified since a given time.
73
73
  #
74
74
  # @param template_file [String] The location of the Sass or SCSS template.
75
- # @param mtime [Fixnum] The modification time to check against.
75
+ # @param mtime [Time] The modification time to check against.
76
76
  # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
77
77
  # Defaults to the filesystem importer.
78
78
  # @return [Boolean] Whether the stylesheet has been modified.
@@ -103,7 +103,7 @@ module Sass
103
103
  # so it's better to use when checking multiple stylesheets at once.
104
104
  #
105
105
  # @param template_file [String] The location of the Sass or SCSS template.
106
- # @param mtime [Fixnum] The modification time to check against.
106
+ # @param mtime [Time] The modification time to check against.
107
107
  # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
108
108
  # Defaults to the filesystem importer.
109
109
  # @return [Boolean] Whether the stylesheet has been modified.
@@ -431,8 +431,8 @@ module Sass::Script
431
431
  # If no signatures match, the first signature is returned for error messaging.
432
432
  #
433
433
  # @param method_name [Symbol] The name of the Ruby function to be called.
434
- # @param arg_arity [Fixnum] The number of unnamed arguments the function was passed.
435
- # @param kwarg_arity [Fixnum] The number of keyword arguments the function was passed.
434
+ # @param arg_arity [Integer] The number of unnamed arguments the function was passed.
435
+ # @param kwarg_arity [Integer] The number of keyword arguments the function was passed.
436
436
  #
437
437
  # @return [{Symbol => Object}, nil]
438
438
  # The signature options for the matching signature,
@@ -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
@@ -1583,7 +1583,7 @@ MESSAGE
1583
1583
  # @raise [ArgumentError] if `$string` isn't a string
1584
1584
  def to_upper_case(string)
1585
1585
  assert_type string, :String, :string
1586
- Sass::Script::Value::String.new(string.value.upcase, string.type)
1586
+ Sass::Script::Value::String.new(Sass::Util.upcase(string.value), string.type)
1587
1587
  end
1588
1588
  declare :to_upper_case, [:string]
1589
1589
 
@@ -1598,7 +1598,7 @@ MESSAGE
1598
1598
  # @raise [ArgumentError] if `$string` isn't a string
1599
1599
  def to_lower_case(string)
1600
1600
  assert_type string, :String, :string
1601
- Sass::Script::Value::String.new(string.value.downcase, string.type)
1601
+ Sass::Script::Value::String.new(Sass::Util.downcase(string.value), string.type)
1602
1602
  end
1603
1603
  declare :to_lower_case, [:string]
1604
1604
 
@@ -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;
@@ -19,13 +19,13 @@ module Sass
19
19
  # `source_range`: \[`Sass::Source::Range`\]
20
20
  # : The range in the source file in which the token appeared.
21
21
  #
22
- # `pos`: \[`Fixnum`\]
22
+ # `pos`: \[`Integer`\]
23
23
  # : The scanner position at which the SassScript token appeared.
24
24
  Token = Struct.new(:type, :value, :source_range, :pos)
25
25
 
26
26
  # The line number of the lexer's current position.
27
27
  #
28
- # @return [Fixnum]
28
+ # @return [Integer]
29
29
  def line
30
30
  return @line unless @tok
31
31
  @tok.source_range.start_pos.line
@@ -34,7 +34,7 @@ module Sass
34
34
  # The number of bytes into the current line
35
35
  # of the lexer's current position (1-based).
36
36
  #
37
- # @return [Fixnum]
37
+ # @return [Integer]
38
38
  def offset
39
39
  return @offset unless @tok
40
40
  @tok.source_range.start_pos.offset
@@ -142,9 +142,9 @@ module Sass
142
142
  }
143
143
 
144
144
  # @param str [String, StringScanner] The source text to lex
145
- # @param line [Fixnum] The 1-based line on which the SassScript appears.
145
+ # @param line [Integer] The 1-based line on which the SassScript appears.
146
146
  # Used for error reporting and sourcemap building
147
- # @param offset [Fixnum] The 1-based character (not byte) offset in the line in the source.
147
+ # @param offset [Integer] The 1-based character (not byte) offset in the line in the source.
148
148
  # Used for error reporting and sourcemap building
149
149
  # @param options [{Symbol => Object}] An options hash;
150
150
  # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
@@ -8,22 +8,22 @@ module Sass
8
8
  class Parser
9
9
  # The line number of the parser's current position.
10
10
  #
11
- # @return [Fixnum]
11
+ # @return [Integer]
12
12
  def line
13
13
  @lexer.line
14
14
  end
15
15
 
16
16
  # The column number of the parser's current position.
17
17
  #
18
- # @return [Fixnum]
18
+ # @return [Integer]
19
19
  def offset
20
20
  @lexer.offset
21
21
  end
22
22
 
23
23
  # @param str [String, StringScanner] The source text to parse
24
- # @param line [Fixnum] The line on which the SassScript appears.
24
+ # @param line [Integer] The line on which the SassScript appears.
25
25
  # Used for error reporting and sourcemap building
26
- # @param offset [Fixnum] The character (not byte) offset where the script starts in the line.
26
+ # @param offset [Integer] The character (not byte) offset where the script starts in the line.
27
27
  # Used for error reporting and sourcemap building
28
28
  # @param options [{Symbol => Object}] An options hash; see
29
29
  # {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
@@ -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
@@ -10,7 +10,7 @@ module Sass::Script::Tree
10
10
 
11
11
  # The line of the document on which this node appeared.
12
12
  #
13
- # @return [Fixnum]
13
+ # @return [Integer]
14
14
  attr_accessor :line
15
15
 
16
16
  # The source range in the document on which this node appeared.
@@ -149,7 +149,7 @@ MSG
149
149
  # Returns the hash code of this value. Two objects' hash codes should be
150
150
  # equal if the objects are equal.
151
151
  #
152
- # @return [Fixnum] The hash code.
152
+ # @return [Integer for Ruby 2.4.0+, Fixnum for earlier Ruby versions] The hash code.
153
153
  def hash
154
154
  value.hash
155
155
  end
@@ -176,7 +176,7 @@ MSG
176
176
  eq(other).to_bool
177
177
  end
178
178
 
179
- # @return [Fixnum] The integer value of this value
179
+ # @return [Integer] The integer value of this value
180
180
  # @raise [Sass::SyntaxError] if this value isn't an integer
181
181
  def to_i
182
182
  raise Sass::SyntaxError.new("#{inspect} is not an integer.")
@@ -17,8 +17,8 @@ module Sass::Script::Value
17
17
  # @private
18
18
  #
19
19
  # Convert a ruby integer to a rgba components
20
- # @param color [Fixnum]
21
- # @return [Array<Fixnum>] Array of 4 numbers representing r,g,b and alpha
20
+ # @param color [Integer]
21
+ # @return [Array<Integer>] Array of 4 numbers representing r,g,b and alpha
22
22
  def self.int_to_rgba(color)
23
23
  rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
24
24
  rgba[-1] = rgba[-1] / 255.0
@@ -293,7 +293,7 @@ module Sass::Script::Value
293
293
 
294
294
  # The red component of the color.
295
295
  #
296
- # @return [Fixnum]
296
+ # @return [Integer]
297
297
  def red
298
298
  hsl_to_rgb!
299
299
  @attrs[:red]
@@ -301,7 +301,7 @@ module Sass::Script::Value
301
301
 
302
302
  # The green component of the color.
303
303
  #
304
- # @return [Fixnum]
304
+ # @return [Integer]
305
305
  def green
306
306
  hsl_to_rgb!
307
307
  @attrs[:green]
@@ -309,7 +309,7 @@ module Sass::Script::Value
309
309
 
310
310
  # The blue component of the color.
311
311
  #
312
- # @return [Fixnum]
312
+ # @return [Integer]
313
313
  def blue
314
314
  hsl_to_rgb!
315
315
  @attrs[:blue]
@@ -342,7 +342,7 @@ module Sass::Script::Value
342
342
  # The alpha channel (opacity) of the color.
343
343
  # This is 1 unless otherwise defined.
344
344
  #
345
- # @return [Fixnum]
345
+ # @return [Integer]
346
346
  def alpha
347
347
  @attrs[:alpha].to_f
348
348
  end
@@ -357,7 +357,7 @@ module Sass::Script::Value
357
357
 
358
358
  # Returns the red, green, and blue components of the color.
359
359
  #
360
- # @return [Array<Fixnum>] A frozen three-element array of the red, green, and blue
360
+ # @return [Array<Integer>] A frozen three-element array of the red, green, and blue
361
361
  # values (respectively) of the color
362
362
  def rgb
363
363
  [red, green, blue].freeze
@@ -365,7 +365,7 @@ module Sass::Script::Value
365
365
 
366
366
  # Returns the red, green, blue, and alpha components of the color.
367
367
  #
368
- # @return [Array<Fixnum>] A frozen four-element array of the red, green,
368
+ # @return [Array<Integer>] A frozen four-element array of the red, green,
369
369
  # blue, and alpha values (respectively) of the color
370
370
  def rgba
371
371
  [red, green, blue, alpha].freeze
@@ -373,7 +373,7 @@ module Sass::Script::Value
373
373
 
374
374
  # Returns the hue, saturation, and lightness components of the color.
375
375
  #
376
- # @return [Array<Fixnum>] A frozen three-element array of the
376
+ # @return [Array<Integer>] A frozen three-element array of the
377
377
  # hue, saturation, and lightness values (respectively) of the color
378
378
  def hsl
379
379
  [hue, saturation, lightness].freeze
@@ -381,7 +381,7 @@ module Sass::Script::Value
381
381
 
382
382
  # Returns the hue, saturation, lightness, and alpha components of the color.
383
383
  #
384
- # @return [Array<Fixnum>] A frozen four-element array of the hue,
384
+ # @return [Array<Integer>] A frozen four-element array of the hue,
385
385
  # saturation, lightness, and alpha values (respectively) of the color
386
386
  def hsla
387
387
  [hue, saturation, lightness, alpha].freeze