sass 3.4.24 → 3.4.25

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +39 -10
  3. data/VERSION +1 -1
  4. data/VERSION_DATE +1 -1
  5. data/lib/sass.rb +3 -3
  6. data/lib/sass/css.rb +1 -1
  7. data/lib/sass/deprecation.rb +55 -0
  8. data/lib/sass/engine.rb +13 -5
  9. data/lib/sass/environment.rb +1 -1
  10. data/lib/sass/plugin.rb +1 -1
  11. data/lib/sass/plugin/compiler.rb +1 -1
  12. data/lib/sass/plugin/configuration.rb +1 -1
  13. data/lib/sass/plugin/rack.rb +2 -2
  14. data/lib/sass/plugin/staleness_checker.rb +1 -1
  15. data/lib/sass/script.rb +1 -1
  16. data/lib/sass/script/functions.rb +2 -2
  17. data/lib/sass/script/lexer.rb +1 -1
  18. data/lib/sass/script/parser.rb +4 -3
  19. data/lib/sass/script/tree/node.rb +1 -1
  20. data/lib/sass/script/tree/operation.rb +43 -16
  21. data/lib/sass/script/value/base.rb +1 -1
  22. data/lib/sass/script/value/string.rb +5 -12
  23. data/lib/sass/scss/static_parser.rb +7 -0
  24. data/lib/sass/selector/comma_sequence.rb +13 -1
  25. data/lib/sass/selector/simple.rb +1 -0
  26. data/lib/sass/tree/node.rb +2 -2
  27. data/lib/sass/tree/rule_node.rb +13 -4
  28. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  29. data/lib/sass/tree/visitors/perform.rb +3 -2
  30. data/test/sass/conversion_test.rb +3 -3
  31. data/test/sass/css2sass_test.rb +1 -1
  32. data/test/sass/engine_test.rb +56 -50
  33. data/test/sass/extend_test.rb +14 -8
  34. data/test/sass/functions_test.rb +5 -2
  35. data/test/sass/more_templates/more1.sass +10 -10
  36. data/test/sass/more_templates/more_import.sass +2 -2
  37. data/test/sass/plugin_test.rb +3 -3
  38. data/test/sass/script_test.rb +38 -29
  39. data/test/sass/scss/css_test.rb +2 -2
  40. data/test/sass/scss/scss_test.rb +25 -10
  41. data/test/sass/source_map_test.rb +13 -13
  42. data/test/sass/templates/_partial.sass +1 -1
  43. data/test/sass/templates/basic.sass +10 -10
  44. data/test/sass/templates/bork1.sass +1 -1
  45. data/test/sass/templates/bork5.sass +1 -1
  46. data/test/sass/templates/compact.sass +10 -10
  47. data/test/sass/templates/complex.sass +187 -187
  48. data/test/sass/templates/compressed.sass +10 -10
  49. data/test/sass/templates/expanded.sass +10 -10
  50. data/test/sass/templates/import.sass +2 -2
  51. data/test/sass/templates/importee.sass +3 -3
  52. data/test/sass/templates/mixins.sass +22 -22
  53. data/test/sass/templates/multiline.sass +4 -4
  54. data/test/sass/templates/nested.sass +13 -13
  55. data/test/sass/templates/parent_ref.sass +12 -12
  56. data/test/sass/templates/script.sass +70 -70
  57. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  58. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  59. data/test/sass/templates/subdir/subdir.sass +3 -3
  60. data/test/sass/templates/units.sass +10 -10
  61. data/test/sass/util/multibyte_string_scanner_test.rb +10 -2
  62. metadata +25 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 798967a96737a6978563e8b46a97cf3254d1bd54
4
- data.tar.gz: 57ed07a4077a5d81a9b821da7b7f4dcffb939fd2
3
+ metadata.gz: a8b2d6c079c8e8aec59e0dd45294419919f88239
4
+ data.tar.gz: 5e31ebbe100aa0b066d414ee32e3f29d792907f6
5
5
  SHA512:
6
- metadata.gz: a86659601d7713959b8213d53a09ced83a3d3eb09eb64fdcab54fcba0e3f4b05477db9ded2f30c7e77a44f078115ee9b6efed016f868b40e725e40d7bb4a1d3e
7
- data.tar.gz: 42da27fb2cd7325d5df8404ea20bd6e4d57f926ee835f266120dc2fbd2beee43a7dc2e8932d136365c43f26a66fe019457a46afe376578ce11a8abc2316625cc
6
+ metadata.gz: 1782f895c1aaeef19491dfb41434ca10a60d28395f53a3ec19f8a65ec21c97625db3325732007fbc3155821c53adf9bcd00ced70e9fe3c1c935295b34f3dfdaf
7
+ data.tar.gz: 39578a844dd4d6e381cb10ced82d5c6782ddd042c79cc5c4c9cc6a69163badbf1ce368526987447b955d44a3d20470ea5e4eae481ea9359d63eea09cab94ca70
data/Rakefile CHANGED
@@ -12,8 +12,42 @@ task :default => :test
12
12
 
13
13
  require 'rake/testtask'
14
14
 
15
+ LINE_SIZE = 80
16
+ DECORATION_CHAR = '#'
17
+
18
+ def print_header(string)
19
+ length = string.length
20
+ puts DECORATION_CHAR * LINE_SIZE
21
+ puts string.center(length + 2, ' ').center(LINE_SIZE, DECORATION_CHAR)
22
+ puts DECORATION_CHAR * LINE_SIZE
23
+ end
24
+
15
25
  desc "Run all tests"
16
- task :test => ["test:ruby", "test:spec"]
26
+ task :test do
27
+ test_cases = [
28
+ {
29
+ 'env' => {'MATHN' => 'true'},
30
+ 'tasks' => ['test:ruby', 'test:spec', :rubocop]
31
+ },
32
+ {
33
+ 'env' => {'MATHN' => 'false'},
34
+ 'tasks' => ['test:ruby']
35
+ }
36
+ ]
37
+
38
+ test_cases.each do |test_case|
39
+ env = test_case['env']
40
+ tasks = test_case['tasks']
41
+
42
+ env.each do |key, value|
43
+ ENV[key] = value
44
+ end
45
+ tasks.each do |task|
46
+ print_header("Running task: #{task}, env: #{env}")
47
+ Rake::Task[task].execute
48
+ end
49
+ end
50
+ end
17
51
 
18
52
  namespace :test do
19
53
  desc "Run the ruby tests (without sass-spec)"
@@ -76,25 +110,20 @@ def ruby_version_at_least?(version_string)
76
110
  ruby_version >= version
77
111
  end
78
112
 
79
- if ruby_version_at_least?("2.2.0") &&
80
- (ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] == "true" ||
81
- !(ENV.has_key?("RUBOCOP") || ENV.has_key?("TEST")))
113
+ begin
82
114
  require 'rubocop/rake_task'
83
115
  RuboCop = Rubocop unless defined?(RuboCop)
84
116
  RuboCop::RakeTask.new do |t|
85
117
  t.patterns = FileList["lib/**/*"]
86
118
  end
87
- else
119
+ rescue LoadError
88
120
  task :rubocop do
89
- puts "Skipping rubocop style check."
90
- next if ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] != "true"
121
+ puts "Rubocop is disabled."
91
122
  puts "Passing this check is required in order for your patch to be accepted."
92
- puts "Use Ruby 2.2 or greater and then run the style check with: rake rubocop"
123
+ puts "Install Rubocop and then run the style check with: rake rubocop."
93
124
  end
94
125
  end
95
126
 
96
- task :test => :rubocop
97
-
98
127
  # ----- Packaging -----
99
128
 
100
129
  # Don't use Rake::GemPackageTast because we want prerequisites to run
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.4.24
1
+ 3.4.25
@@ -1 +1 @@
1
- 19 May 2017 00:01:41 UTC
1
+ 07 July 2017 22:00:34 UTC
@@ -47,7 +47,7 @@ module Sass
47
47
  #
48
48
  # @param contents [String] The contents of the Sass file.
49
49
  # @param options [{Symbol => Object}] An options hash;
50
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
50
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
51
51
  # @raise [Sass::SyntaxError] if there's an error in the document
52
52
  # @raise [Encoding::UndefinedConversionError] if the source encoding
53
53
  # cannot be converted to UTF-8
@@ -69,7 +69,7 @@ module Sass
69
69
  #
70
70
  # @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
71
71
  # @param options [{Symbol => Object}] An options hash;
72
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
72
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
73
73
  # @return [String] The compiled CSS.
74
74
  #
75
75
  # @overload compile_file(filename, css_filename, options = {})
@@ -77,7 +77,7 @@ module Sass
77
77
  #
78
78
  # @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
79
79
  # @param options [{Symbol => Object}] An options hash;
80
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
80
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
81
81
  # @param css_filename [String] The location to which to write the compiled CSS.
82
82
  def self.compile_file(filename, *args)
83
83
  options = args.last.is_a?(Hash) ? args.pop : {}
@@ -18,7 +18,7 @@ module Sass
18
18
  # that can be converted to Unicode.
19
19
  # If the stylesheet contains an `@charset` declaration,
20
20
  # that overrides the Ruby encoding
21
- # (see {file:SASS_REFERENCE.md#encodings the encoding documentation})
21
+ # (see {file:SASS_REFERENCE.md#Encodings the encoding documentation})
22
22
  # @option options :old [Boolean] (false)
23
23
  # Whether or not to output old property syntax
24
24
  # (`:color blue` as opposed to `color: blue`).
@@ -0,0 +1,55 @@
1
+ module Sass
2
+ # A deprecation warning that should only be printed once for a given line in a
3
+ # given file.
4
+ #
5
+ # A global Deprecation instance should be created for each type of deprecation
6
+ # warning, and `warn` should be called each time a warning is needed.
7
+ class Deprecation
8
+ @@allow_double_warnings = false
9
+
10
+ # Runs a block in which double deprecation warnings for the same location
11
+ # are allowed.
12
+ def self.allow_double_warnings
13
+ old_allow_double_warnings = @@allow_double_warnings
14
+ @@allow_double_warnings = true
15
+ yield
16
+ ensure
17
+ @@allow_double_warnings = old_allow_double_warnings
18
+ end
19
+
20
+ def initialize
21
+ # A set of filename, line pairs for which warnings have been emitted.
22
+ @seen = Set.new
23
+ end
24
+
25
+ # Prints `message` as a deprecation warning associated with `filename`,
26
+ # `line`, and optionally `column`.
27
+ #
28
+ # This ensures that only one message will be printed for each line of a
29
+ # given file.
30
+ #
31
+ # @overload warn(filename, line, message)
32
+ # @param filename [String, nil]
33
+ # @param line [Number]
34
+ # @param message [String]
35
+ # @overload warn(filename, line, column, message)
36
+ # @param filename [String, nil]
37
+ # @param line [Number]
38
+ # @param column [Number]
39
+ # @param message [String]
40
+ def warn(filename, line, column_or_message, message = nil)
41
+ return if !@@allow_double_warnings && @seen.add?([filename, line]).nil?
42
+ if message
43
+ column = column_or_message
44
+ else
45
+ message = column_or_message
46
+ end
47
+
48
+ location = "line #{line}"
49
+ location << ", column #{column}" if column
50
+ location << " of #{filename}" if filename
51
+
52
+ Sass::Util.sass_warn("DEPRECATION WARNING on #{location}:\n#{message}")
53
+ end
54
+ end
55
+ end
@@ -1,6 +1,7 @@
1
1
  require 'set'
2
2
  require 'digest/sha1'
3
3
  require 'sass/cache_stores'
4
+ require 'sass/deprecation'
4
5
  require 'sass/source/position'
5
6
  require 'sass/source/range'
6
7
  require 'sass/source/map'
@@ -89,6 +90,8 @@ module Sass
89
90
  # output = sass_engine.render
90
91
  # puts output
91
92
  class Engine
93
+ @@old_property_deprecation = Deprecation.new
94
+
92
95
  # A line of Sass code.
93
96
  #
94
97
  # `text`: `String`
@@ -168,7 +171,7 @@ module Sass
168
171
  # default values and resolving aliases.
169
172
  #
170
173
  # @param options [{Symbol => Object}] The options hash;
171
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
174
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
172
175
  # @return [{Symbol => Object}] The normalized options hash.
173
176
  # @private
174
177
  def self.normalize_options(options)
@@ -222,7 +225,7 @@ module Sass
222
225
  #
223
226
  # @param filename [String] The path to the Sass or SCSS file
224
227
  # @param options [{Symbol => Object}] The options hash;
225
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
228
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
226
229
  # @return [Sass::Engine] The Engine for the given Sass or SCSS file.
227
230
  # @raise [Sass::SyntaxError] if there's an error in the document.
228
231
  def self.for_file(filename, options)
@@ -240,7 +243,7 @@ module Sass
240
243
  end
241
244
 
242
245
  # The options for the Sass engine.
243
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
246
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
244
247
  #
245
248
  # @return [{Symbol => Object}]
246
249
  attr_reader :options
@@ -257,9 +260,9 @@ module Sass
257
260
  # that can be converted to Unicode.
258
261
  # If the template contains an `@charset` declaration,
259
262
  # that overrides the Ruby encoding
260
- # (see {file:SASS_REFERENCE.md#encodings the encoding documentation})
263
+ # (see {file:SASS_REFERENCE.md#Encodings the encoding documentation})
261
264
  # @param options [{Symbol => Object}] An options hash.
262
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
265
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
263
266
  # @see {Sass::Engine.for_file}
264
267
  # @see {Sass::Plugin}
265
268
  def initialize(template, options = {})
@@ -625,6 +628,11 @@ WARNING
625
628
  raise SyntaxError.new("Invalid property: \"#{line.text}\".",
626
629
  :line => @line) if name.nil? || value.nil?
627
630
 
631
+ @@old_property_deprecation.warn(@options[:filename], @line, <<WARNING)
632
+ Old-style properties like "#{line.text}" are deprecated and will be an error in future versions of Sass.
633
+ Use "#{name}: #{value}" instead.
634
+ WARNING
635
+
628
636
  value_start_offset = name_end_offset = name_start_offset + name.length
629
637
  unless value.empty?
630
638
  # +1 and -1 both compensate for the leading ':', which is part of line.text
@@ -81,7 +81,7 @@ module Sass
81
81
  inherited_hash_reader :function
82
82
 
83
83
  # @param options [{Symbol => Object}] The options hash. See
84
- # {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
84
+ # {file:SASS_REFERENCE.md#Options the Sass options documentation}.
85
85
  # @param parent [Environment] See \{#parent}
86
86
  def initialize(parent = nil, options = nil)
87
87
  @parent = parent
@@ -12,7 +12,7 @@ module Sass
12
12
  # when it's used as a plugin for various frameworks.
13
13
  # All Rack-enabled frameworks are supported out of the box.
14
14
  # The plugin is
15
- # {file:SASS_REFERENCE.md#rails_merb_plugin automatically activated for Rails and Merb}.
15
+ # {file:SASS_REFERENCE.md#Rack_Rails_Merb_Plugin automatically activated for Rails and Merb}.
16
16
  # Other frameworks must enable it explicitly; see {Sass::Plugin::Rack}.
17
17
  #
18
18
  # This module has a large set of callbacks available
@@ -31,7 +31,7 @@ module Sass::Plugin
31
31
  # Creates a new compiler.
32
32
  #
33
33
  # @param opts [{Symbol => Object}]
34
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
34
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
35
35
  def initialize(opts = {})
36
36
  @watched_files = Set.new
37
37
  options.merge!(opts)
@@ -27,7 +27,7 @@ module Sass
27
27
  end
28
28
 
29
29
  # An options hash.
30
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
30
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
31
31
  #
32
32
  # @return [{Symbol => Object}]
33
33
  def options
@@ -14,14 +14,14 @@ module Sass
14
14
  # :never_update => environment != :production,
15
15
  # :full_exception => environment != :production)
16
16
  #
17
- # {file:SASS_REFERENCE.md#options See the Reference for more options}.
17
+ # {file:SASS_REFERENCE.md#Options See the Reference for more options}.
18
18
  #
19
19
  # ## Use
20
20
  #
21
21
  # Put your Sass files in `public/stylesheets/sass`.
22
22
  # Your CSS will be generated in `public/stylesheets`,
23
23
  # and regenerated every request if necessary.
24
- # The locations and frequency {file:SASS_REFERENCE.md#options can be customized}.
24
+ # The locations and frequency {file:SASS_REFERENCE.md#Options can be customized}.
25
25
  # That's all there is to it!
26
26
  class Rack
27
27
  # The delay, in seconds, between update checks.
@@ -39,7 +39,7 @@ module Sass
39
39
  # for checking the staleness of several stylesheets at once.
40
40
  #
41
41
  # @param options [{Symbol => Object}]
42
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
42
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
43
43
  def initialize(options)
44
44
  # URIs that are being actively checked for staleness. Protects against
45
45
  # import loops.
@@ -21,7 +21,7 @@ module Sass
21
21
  # @param offset [Integer] The number of characters in on `line` that the SassScript started.
22
22
  # Used for error reporting
23
23
  # @param options [{Symbol => Object}] An options hash;
24
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
24
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
25
25
  # @return [Script::Tree::Node] The root node of the parse tree
26
26
  def self.parse(value, line, offset, options = {})
27
27
  Parser.parse(value, line, offset, options)
@@ -2510,7 +2510,7 @@ MESSAGE
2510
2510
 
2511
2511
  extends = Sass::Util::SubsetMap.new
2512
2512
  begin
2513
- extender.populate_extends(extends, extendee)
2513
+ extender.populate_extends(extends, extendee, nil, [], true)
2514
2514
  selector.do_extend(extends).to_sass_script
2515
2515
  rescue Sass::SyntaxError => e
2516
2516
  raise ArgumentError.new(e.to_s)
@@ -2553,7 +2553,7 @@ MESSAGE
2553
2553
 
2554
2554
  extends = Sass::Util::SubsetMap.new
2555
2555
  begin
2556
- replacement.populate_extends(extends, original)
2556
+ replacement.populate_extends(extends, original, nil, [], true)
2557
2557
  selector.do_extend(extends, [], true).to_sass_script
2558
2558
  rescue Sass::SyntaxError => e
2559
2559
  raise ArgumentError.new(e.to_s)
@@ -147,7 +147,7 @@ module Sass
147
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
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
150
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
151
151
  def initialize(str, line, offset, options)
152
152
  @scanner = str.is_a?(StringScanner) ? str : Sass::Util::MultibyteStringScanner.new(str)
153
153
  @line = line
@@ -26,7 +26,7 @@ module Sass
26
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
- # {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
29
+ # {file:SASS_REFERENCE.md#Options the Sass options documentation}.
30
30
  # This supports an additional `:allow_extra_text` option that controls
31
31
  # whether the parser throws an error when extra text is encountered
32
32
  # after the parsed construct.
@@ -818,8 +818,9 @@ RUBY
818
818
  location = "on line #{interpolation.line}"
819
819
  location << " of #{interpolation.filename}" if interpolation.filename
820
820
  Sass::Util.sass_warn <<WARNING
821
- DEPRECATION WARNING #{location}: \#{} interpolation near operators will be simplified
822
- in a future version of Sass. To preserve the current behavior, use quotes:
821
+ DEPRECATION WARNING #{location}:
822
+ \#{} interpolation near operators will be simplified in a future version of Sass.
823
+ To preserve the current behavior, use quotes:
823
824
 
824
825
  #{interpolation.to_quoted_equivalent.to_sass}
825
826
 
@@ -33,7 +33,7 @@ module Sass::Script::Tree
33
33
 
34
34
  # Sets the options hash for this node,
35
35
  # as well as for all child nodes.
36
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
36
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
37
37
  #
38
38
  # @param options [{Symbol => Object}] The options
39
39
  def options=(options)
@@ -2,6 +2,9 @@ module Sass::Script::Tree
2
2
  # A SassScript parse node representing a binary operation,
3
3
  # such as `$a + $b` or `"foo" + 1`.
4
4
  class Operation < Node
5
+ @@color_arithmetic_deprecation = Sass::Deprecation.new
6
+ @@unitless_equals_deprecation = Sass::Deprecation.new
7
+
5
8
  attr_reader :operand1
6
9
  attr_reader :operand2
7
10
  attr_reader :operator
@@ -92,28 +95,52 @@ module Sass::Script::Tree
92
95
  raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".")
93
96
  end
94
97
 
95
- if (@operator == :eq || @operator == :neq) && value1.is_a?(Sass::Script::Value::Number) &&
96
- value2.is_a?(Sass::Script::Value::Number) && value1.unitless? != value2.unitless? &&
97
- result == (if @operator == :eq
98
- Sass::Script::Value::Bool::TRUE
99
- else
100
- Sass::Script::Value::Bool::FALSE
101
- end)
102
-
103
- operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
104
- future_value = @operator == :neq
105
- Sass::Util.sass_warn <<WARNING
106
- DEPRECATION WARNING on line #{line}#{" of #{filename}" if filename}:
107
- The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
108
- Unitless numbers will no longer be equal to the same numbers with units.
109
- WARNING
110
- end
98
+ warn_for_color_arithmetic(value1, value2)
99
+ warn_for_unitless_equals(value1, value2, result)
111
100
 
112
101
  result
113
102
  end
114
103
 
115
104
  private
116
105
 
106
+ def warn_for_color_arithmetic(value1, value2)
107
+ return unless @operator == :plus || @operator == :times || @operator == :minus ||
108
+ @operator == :div || @operator == :mod
109
+
110
+ if value1.is_a?(Sass::Script::Value::Number)
111
+ return unless value2.is_a?(Sass::Script::Value::Color)
112
+ elsif value1.is_a?(Sass::Script::Value::Color)
113
+ return unless value2.is_a?(Sass::Script::Value::Color) || value2.is_a?(Sass::Script::Value::Number)
114
+ else
115
+ return
116
+ end
117
+
118
+ @@color_arithmetic_deprecation.warn(filename, line, <<WARNING)
119
+ The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions.
120
+ Consider using Sass's color functions instead.
121
+ http://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
122
+ WARNING
123
+ end
124
+
125
+ def warn_for_unitless_equals(value1, value2, result)
126
+ return unless @operator == :eq || @operator == :neq
127
+ return unless value1.is_a?(Sass::Script::Value::Number)
128
+ return unless value2.is_a?(Sass::Script::Value::Number)
129
+ return unless value1.unitless? != value2.unitless?
130
+ return unless result == (if @operator == :eq
131
+ Sass::Script::Value::Bool::TRUE
132
+ else
133
+ Sass::Script::Value::Bool::FALSE
134
+ end)
135
+
136
+ operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
137
+ future_value = @operator == :neq
138
+ @@unitless_equals_deprecation.warn(filename, line, <<WARNING)
139
+ The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
140
+ Unitless numbers will no longer be equal to the same numbers with units.
141
+ WARNING
142
+ end
143
+
117
144
  def operand_to_sass(op, side, opts)
118
145
  return "(#{op.to_sass(opts)})" if op.is_a?(Sass::Script::Tree::ListLiteral)
119
146
  return op.to_sass(opts) unless op.is_a?(Operation)