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

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
- 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