sass 3.3.0.alpha.184 → 3.3.0.alpha.195

Sign up to get free protection for your applications and to get access to all the features.
data/REVISION CHANGED
@@ -1 +1 @@
1
- 9c8ae2980333f2715678c6737448ef738e0bb0cb
1
+ a1dbbf37b919e9b45043a2ade97e7d355609f9de
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.0.alpha.184
1
+ 3.3.0.alpha.195
data/VERSION_DATE CHANGED
@@ -1 +1 @@
1
- 11 June 2013 21:31:46 GMT
1
+ 19 June 2013 23:49:23 GMT
data/lib/sass.rb CHANGED
@@ -93,3 +93,4 @@ require 'sass/util'
93
93
  require 'sass/engine'
94
94
  require 'sass/plugin' if defined?(Merb::Plugins)
95
95
  require 'sass/railtie'
96
+ require 'sass/features'
@@ -0,0 +1,44 @@
1
+ require 'set'
2
+
3
+ # Provides `Sass.has_feature?` which allows for simple feature detection
4
+ # by providing a feature name.
5
+ module Sass
6
+ module Features
7
+
8
+ # This is the set of features that can be detected.
9
+ KNOWN_FEATURES = Set[*%w{
10
+ }]
11
+
12
+ # Check if a feature exists by name. This is used to implement
13
+ # the Sass function `feature-exists($feature)`
14
+ #
15
+ # @param feature_name [String] The case sensitive name of the feature to
16
+ # check if it exists in this version of Sass.
17
+ # @return [Boolean] whether the feature of that name exists.
18
+ def has_feature?(feature_name)
19
+ KNOWN_FEATURES.include?(feature_name)
20
+ end
21
+
22
+ # Add a feature to Sass. Plugins can use this to easily expose their
23
+ # availability to end users. Plugins must prefix their feature
24
+ # names with a dash to distinguish them from official features.
25
+ #
26
+ # @example
27
+ # Sass.add_feature("-import-globbing")
28
+ # Sass.add_feature("-math-cos")
29
+ #
30
+ #
31
+ # @param feature_name [String] The case sensitive name of the feature to
32
+ # to add to Sass. Must begin with a dash.
33
+ def add_feature(feature_name)
34
+ unless feature_name[0] == ?-
35
+ raise ArgumentError.new("Plugin feature names must begin with a dash")
36
+ end
37
+ KNOWN_FEATURES << feature_name
38
+ end
39
+ end
40
+
41
+ extend Features
42
+ end
43
+
44
+
@@ -176,6 +176,9 @@ module Sass::Script
176
176
  #
177
177
  # ## Introspection Functions
178
178
  #
179
+ # \{#feature_exists feature-exists($feature)}
180
+ # : Returns whether the named feature exists in the current sass runtime.
181
+ #
179
182
  # \{#type_of type-of($value)}
180
183
  # : Returns the type of a value.
181
184
  #
@@ -1318,6 +1321,20 @@ module Sass::Script
1318
1321
  end
1319
1322
  declare :type_of, [:value]
1320
1323
 
1324
+ # Returns true if the feature name specified exists in the current Sass runtime.
1325
+ #
1326
+ # @example
1327
+ # feature-exists(some-feature-that-exists) => true
1328
+ # feature-exists(what-is-this-i-dont-know) => false
1329
+ #
1330
+ # @param feature [Sass::Script::Value::String] The name of the feature to check
1331
+ # @return [Sass::Script::Value::Bool] Whether the feature is supported in this version of Sass.
1332
+ def feature_exists(feature)
1333
+ Sass::Script::Value::Bool.new(Sass.has_feature?(feature.value))
1334
+ end
1335
+ declare :feature_exists, [:feature]
1336
+
1337
+
1321
1338
  # Inspects the unit of the number, returning it as a quoted string.
1322
1339
  # Complex units are sorted in alphabetical order by numerator and denominator.
1323
1340
  #
@@ -1481,28 +1498,30 @@ module Sass::Script
1481
1498
  # Gets the nth item in a list.
1482
1499
  #
1483
1500
  # Note that unlike some languages, the first item in a Sass list is number 1,
1484
- # the second number 2, and so forth.
1501
+ # the second number 2, and so forth. You can also use negative numbers to
1502
+ # count from the end of the list. So -1 is the last item, -2 is the
1503
+ # second-to-last item, etc.
1485
1504
  #
1486
1505
  # @example
1487
1506
  # nth(10px 20px 30px, 1) => 10px
1488
1507
  # nth((Helvetica, Arial, sans-serif), 3) => sans-serif
1508
+ # nth((red, green, blue), -2) => green
1489
1509
  # @param list [Value] The list
1490
1510
  # @param n [Sass::Script::Value::Number] The index into the list
1491
1511
  # @return [Sass::Script::Value::Base] The nth item in the list
1492
- # @raise [ArgumentError] If `n` isn't an integer between 1 and the list's length.
1512
+ # @raise [ArgumentError] If `n` isn't an integer whose absolute value is between 1 and the list's length.
1493
1513
  def nth(list, n)
1494
1514
  assert_type n, :Number
1495
- if !n.int?
1496
- raise ArgumentError.new("List index #{n} must be an integer")
1497
- elsif n.to_i < 1
1498
- raise ArgumentError.new("List index #{n} must be greater than or equal to 1")
1515
+ if !n.int? || n.to_i == 0
1516
+ raise ArgumentError.new("List index #{n} must be a non-zero integer")
1499
1517
  elsif list.to_a.size == 0
1500
1518
  raise ArgumentError.new("List index is #{n} but list has no items")
1501
- elsif n.to_i > (size = list.to_a.size)
1519
+ elsif n.to_i.abs > (size = list.to_a.size)
1502
1520
  raise ArgumentError.new("List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
1503
1521
  end
1504
1522
 
1505
- list.to_a[n.to_i - 1]
1523
+ index = n.to_i > 0 ? n.to_i - 1 : n.to_i
1524
+ list.to_a[index]
1506
1525
  end
1507
1526
  declare :nth, [:list, :n]
1508
1527
 
@@ -1617,7 +1636,7 @@ module Sass::Script
1617
1636
  if index
1618
1637
  Sass::Script::Value::Number.new(index + 1)
1619
1638
  else
1620
- Sass::Script::Value::Bool.new(false)
1639
+ Sass::Script::Value::Bool::FALSE
1621
1640
  end
1622
1641
  end
1623
1642
  declare :index, [:list, :value]
@@ -1,6 +1,26 @@
1
1
  module Sass::Script::Value
2
2
  # A SassScript object representing a boolean (true or false) value.
3
3
  class Bool < Base
4
+
5
+ # The true value in SassScript.
6
+ #
7
+ # This is assigned before new is overridden below so that we use the default implementation.
8
+ TRUE = new(true)
9
+
10
+ # The false value in SassScript.
11
+ #
12
+ # This is assigned before new is overridden below so that we use the default implementation.
13
+ FALSE = new(false)
14
+
15
+ # We override object creation so that users of the core API
16
+ # will not need to know that booleans are specific constants.
17
+ #
18
+ # @param value A ruby value that will be tested for truthiness.
19
+ # @return [Bool] TRUE if value is truthy, FALSE if value is falsey
20
+ def self.new(value)
21
+ value ? TRUE : FALSE
22
+ end
23
+
4
24
  # The Ruby value of the boolean.
5
25
  #
6
26
  # @return [Boolean]
@@ -192,7 +192,7 @@ module Sass::Script::Value
192
192
  # @param other [Value] The right-hand side of the operator
193
193
  # @return [Boolean] Whether this number is equal to the other object
194
194
  def eq(other)
195
- return Sass::Script::Value::Bool.new(false) unless other.is_a?(Sass::Script::Value::Number)
195
+ return Bool::FALSE unless other.is_a?(Sass::Script::Value::Number)
196
196
  this = self
197
197
  begin
198
198
  if unitless?
@@ -201,10 +201,9 @@ module Sass::Script::Value
201
201
  other = other.coerce(@numerator_units, @denominator_units)
202
202
  end
203
203
  rescue Sass::UnitConversionError
204
- return Sass::Script::Value::Bool.new(false)
204
+ return Bool::FALSE
205
205
  end
206
-
207
- Sass::Script::Value::Bool.new(this.value == other.value)
206
+ Bool.new(this.value == other.value)
208
207
  end
209
208
 
210
209
  # The SassScript `>` operation.
@@ -977,6 +977,18 @@ MSG
977
977
  assert_equal("null", evaluate("type-of(null)"))
978
978
  end
979
979
 
980
+ def test_feature_exists
981
+ assert_raises ArgumentError do
982
+ Sass.add_feature("my-test-feature")
983
+ end
984
+ Sass.add_feature("-my-test-feature")
985
+ assert_equal("true", evaluate("feature-exists(-my-test-feature)"))
986
+ assert_equal("false", evaluate("feature-exists(whatisthisidontevenknow)"))
987
+ assert_equal("true", evaluate("feature-exists($feature: -my-test-feature)"))
988
+ ensure
989
+ Sass::Features::KNOWN_FEATURES.delete("-my-test-feature")
990
+ end
991
+
980
992
  def test_unit
981
993
  assert_equal(%Q{""}, evaluate("unit(100)"))
982
994
  assert_equal(%Q{"px"}, evaluate("unit(100px)"))
@@ -1017,12 +1029,14 @@ MSG
1017
1029
  def test_nth
1018
1030
  assert_equal("1", evaluate("nth(1 2 3, 1)"))
1019
1031
  assert_equal("2", evaluate("nth(1 2 3, 2)"))
1032
+ assert_equal("3", evaluate("nth(1 2 3, -1)"))
1033
+ assert_equal("1", evaluate("nth(1 2 3, -3)"))
1020
1034
  assert_equal("3", evaluate("nth((1, 2, 3), 3)"))
1021
1035
  assert_equal("foo", evaluate("nth(foo, 1)"))
1022
1036
  assert_equal("bar baz", evaluate("nth(foo (bar baz) bang, 2)"))
1023
- assert_error_message("List index 0 must be greater than or equal to 1 for `nth'", "nth(foo, 0)")
1024
- assert_error_message("List index -10 must be greater than or equal to 1 for `nth'", "nth(foo, -10)")
1025
- assert_error_message("List index 1.5 must be an integer for `nth'", "nth(foo, 1.5)")
1037
+ assert_error_message("List index 0 must be a non-zero integer for `nth'", "nth(foo, 0)")
1038
+ assert_error_message("List index is -10 but list is only 1 item long for `nth'", "nth(foo, -10)")
1039
+ assert_error_message("List index 1.5 must be a non-zero integer for `nth'", "nth(foo, 1.5)")
1026
1040
  assert_error_message("List index is 5 but list is only 4 items long for `nth'", "nth(1 2 3 4, 5)")
1027
1041
  assert_error_message("List index is 2 but list is only 1 item long for `nth'", "nth(foo, 2)")
1028
1042
  assert_error_message("List index is 1 but list has no items for `nth'", "nth((), 1)")
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: 592302717
4
+ hash: 592302731
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 3
9
9
  - 0
10
10
  - alpha
11
- - 184
12
- version: 3.3.0.alpha.184
11
+ - 195
12
+ version: 3.3.0.alpha.195
13
13
  platform: ruby
14
14
  authors:
15
15
  - Nathan Weizenbaum
@@ -19,7 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2013-06-11 00:00:00 -04:00
22
+ date: 2013-06-19 00:00:00 -04:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
@@ -193,6 +193,7 @@ files:
193
193
  - lib/sass/util/multibyte_string_scanner.rb
194
194
  - lib/sass/util/subset_map.rb
195
195
  - lib/sass/version.rb
196
+ - lib/sass/features.rb
196
197
  - bin/sass
197
198
  - bin/sass-convert
198
199
  - bin/scss