sass 3.3.0.alpha.372 → 3.3.0.alpha.375

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.
data/REVISION CHANGED
@@ -1 +1 @@
1
- 91702cc715e601a0bf682c87983f0b8d9ceb0963
1
+ 5339def89cc7f0dbcc9f888a42fb8c571e2c326b
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.0.alpha.372
1
+ 3.3.0.alpha.375
data/VERSION_DATE CHANGED
@@ -1 +1 @@
1
- 10 October 2013 16:29:15 GMT
1
+ 10 October 2013 17:02:25 GMT
@@ -298,10 +298,12 @@ module Sass::Script
298
298
 
299
299
  # A class representing a Sass function signature.
300
300
  #
301
- # @attr args [Array<Symbol>] The names of the arguments to the function.
301
+ # @attr args [Array<String>] The names of the arguments to the function.
302
+ # @attr delayed_args [Array<String>] The names of the arguments whose evaluation should be
303
+ # delayed.
302
304
  # @attr var_args [Boolean] Whether the function takes a variable number of arguments.
303
305
  # @attr var_kwargs [Boolean] Whether the function takes an arbitrary set of keyword arguments.
304
- Signature = Struct.new(:args, :var_args, :var_kwargs)
306
+ Signature = Struct.new(:args, :delayed_args, :var_args, :var_kwargs)
305
307
 
306
308
  # Declare a Sass signature for a Ruby-defined function.
307
309
  # This includes the names of the arguments,
@@ -338,9 +340,23 @@ module Sass::Script
338
340
  # In addition, if this is true and `:var_args` is not,
339
341
  # Sass will ensure that the last argument passed is a hash.
340
342
  def self.declare(method_name, args, options = {})
343
+ delayed_args = []
344
+ args = args.map do |a|
345
+ a = a.to_s
346
+ if a[0] == ?&
347
+ a = a[1..-1]
348
+ delayed_args << a
349
+ end
350
+ a
351
+ end
352
+ # We don't expose this functionality except to certain builtin methods.
353
+ if delayed_args.any? && method_name != :if
354
+ raise ArgumentError.new("Delayed arguments are not allowed for method #{method_name}")
355
+ end
341
356
  @signatures[method_name] ||= []
342
357
  @signatures[method_name] << Signature.new(
343
- args.map {|s| s.to_s},
358
+ args,
359
+ delayed_args,
344
360
  options[:var_args],
345
361
  options[:var_kwargs])
346
362
  end
@@ -478,6 +494,24 @@ module Sass::Script
478
494
  raise ArgumentError.new("Expected #{number} to be an integer")
479
495
  end
480
496
  end
497
+
498
+ # Performs a node that has been delayed for execution.
499
+ #
500
+ # @private
501
+ # @param node [Sass::Script::Tree::Node,
502
+ # Sass::Script::Value::Base] When this is a tree node, it's
503
+ # performed in the caller's environment. When it's a value
504
+ # (which can happen when the value had to be performed already
505
+ # -- like for a splat), it's returned as-is.
506
+ # @param env [Sass::Environment] The environment within which to perform the node.
507
+ # Defaults to the (read-only) environment of the caller.
508
+ def perform(node, env = environment.caller)
509
+ if node.is_a?(Sass::Script::Value::Base)
510
+ node
511
+ else
512
+ node.perform(env)
513
+ end
514
+ end
481
515
  end
482
516
 
483
517
  class << self
@@ -1963,17 +1997,17 @@ module Sass::Script
1963
1997
  # @overload if($condition, $if-true, $if-false)
1964
1998
  # @param $condition [Sass::Script::Value::Base] Whether the `$if-true` or
1965
1999
  # `$if-false` will be returned
1966
- # @param $if-true [Sass::Script::Value::Base]
1967
- # @param $if-false [Sass::Script::Value::Base]
2000
+ # @param $if-true [Sass::Script::Tree::Node]
2001
+ # @param $if-false [Sass::Script::Tree::Node]
1968
2002
  # @return [Sass::Script::Value::Base] `$if-true` or `$if-false`
1969
2003
  def if(condition, if_true, if_false)
1970
2004
  if condition.to_bool
1971
- if_true
2005
+ perform(if_true)
1972
2006
  else
1973
- if_false
2007
+ perform(if_false)
1974
2008
  end
1975
2009
  end
1976
- declare :if, [:condition, :if_true, :if_false]
2010
+ declare :if, [:condition, :"&if_true", :"&if_false"]
1977
2011
 
1978
2012
  # Returns a unique CSS identifier. The identifier is returned as an unquoted
1979
2013
  # string. The identifier returned is only guaranteed to be unique within the
@@ -119,9 +119,12 @@ module Sass::Script::Tree
119
119
  # @return [Sass::Script::Value] The SassScript object that is the value of the function call
120
120
  # @raise [Sass::SyntaxError] if the function call raises an ArgumentError
121
121
  def _perform(environment)
122
- args = @args.map {|a| a.perform(environment)}
122
+ args = Sass::Util.enum_with_index(@args).
123
+ map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
123
124
  splat = Sass::Tree::Visitors::Perform.perform_splat(@splat, @kwarg_splat, environment)
124
- keywords = Sass::Util.map_hash(@keywords) {|k, v| [k, v.perform(environment)]}
125
+ keywords = Sass::Util.map_hash(@keywords) do |k, v|
126
+ [k, perform_arg(v, environment, k.tr('-', '_'))]
127
+ end
125
128
  if (fn = environment.function(@name))
126
129
  return perform_sass_fn(fn, args, keywords, splat, environment)
127
130
  end
@@ -203,6 +206,15 @@ module Sass::Script::Tree
203
206
 
204
207
  private
205
208
 
209
+ def perform_arg(argument, environment, name)
210
+ return argument if signature && signature.delayed_args.include?(name)
211
+ argument.perform(environment)
212
+ end
213
+
214
+ def signature
215
+ @signature ||= Sass::Script::Functions.signature(name.to_sym, @args.size, @keywords.size)
216
+ end
217
+
206
218
  def construct_ruby_args(name, args, keywords, splat, environment)
207
219
  args += splat.to_a if splat
208
220
 
@@ -1202,6 +1202,28 @@ MSG
1202
1202
  assert_equal("1px", evaluate("if(true, 1px, 2px)"))
1203
1203
  assert_equal("2px", evaluate("if(false, 1px, 2px)"))
1204
1204
  assert_equal("2px", evaluate("if(null, 1px, 2px)"))
1205
+ assert_equal("1px", evaluate("if(true, 1px, $broken)"))
1206
+ assert_equal("1px", evaluate("if(false, $broken, 1px)"))
1207
+ assert_equal("1px", evaluate("if(false, $if-true: $broken, $if-false: 1px)"))
1208
+ assert_equal("1px", evaluate("if(true, $if-true: 1px, $if-false: $broken)"))
1209
+ assert_equal(<<CSS, render(<<SCSS))
1210
+ .if {
1211
+ result: yay; }
1212
+ CSS
1213
+ .if {
1214
+ $something: yay;
1215
+ result: if(true, $if-true: $something, $if-false: $broken);
1216
+ }
1217
+ SCSS
1218
+ assert_equal(<<CSS, render(<<SCSS))
1219
+ .if {
1220
+ result: 1px; }
1221
+ CSS
1222
+ .if {
1223
+ $splat: 1px, 2px;
1224
+ result: if(true, $splat...);
1225
+ }
1226
+ SCSS
1205
1227
  end
1206
1228
 
1207
1229
  def test_counter
@@ -1582,5 +1604,4 @@ SCSS
1582
1604
  rescue Sass::SyntaxError => e
1583
1605
  assert_equal(message, e.message)
1584
1606
  end
1585
-
1586
1607
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- hash: 592302565
4
+ hash: 592302563
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 3
9
9
  - 0
10
10
  - alpha
11
- - 372
12
- version: 3.3.0.alpha.372
11
+ - 375
12
+ version: 3.3.0.alpha.375
13
13
  platform: ruby
14
14
  authors:
15
15
  - Nathan Weizenbaum