sass 3.4.25 → 3.5.0

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +2 -117
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/filesystem.rb +1 -1
  8. data/lib/sass/css.rb +1 -2
  9. data/lib/sass/engine.rb +38 -20
  10. data/lib/sass/environment.rb +26 -5
  11. data/lib/sass/error.rb +2 -2
  12. data/lib/sass/exec/base.rb +2 -11
  13. data/lib/sass/features.rb +1 -0
  14. data/lib/sass/importers/filesystem.rb +2 -2
  15. data/lib/sass/plugin/compiler.rb +20 -50
  16. data/lib/sass/plugin/configuration.rb +2 -2
  17. data/lib/sass/railtie.rb +1 -1
  18. data/lib/sass/script/functions.rb +235 -43
  19. data/lib/sass/script/lexer.rb +13 -2
  20. data/lib/sass/script/parser.rb +69 -67
  21. data/lib/sass/script/tree/funcall.rb +35 -30
  22. data/lib/sass/script/tree/list_literal.rb +23 -8
  23. data/lib/sass/script/tree/map_literal.rb +2 -2
  24. data/lib/sass/script/tree/node.rb +0 -8
  25. data/lib/sass/script/tree/operation.rb +0 -7
  26. data/lib/sass/script/value/arg_list.rb +1 -1
  27. data/lib/sass/script/value/base.rb +17 -0
  28. data/lib/sass/script/value/callable.rb +25 -0
  29. data/lib/sass/script/value/color.rb +5 -0
  30. data/lib/sass/script/value/function.rb +19 -0
  31. data/lib/sass/script/value/helpers.rb +29 -9
  32. data/lib/sass/script/value/list.rb +35 -14
  33. data/lib/sass/script/value/map.rb +2 -2
  34. data/lib/sass/script/value/number.rb +1 -1
  35. data/lib/sass/script/value.rb +2 -0
  36. data/lib/sass/scss/parser.rb +99 -40
  37. data/lib/sass/scss/rx.rb +4 -10
  38. data/lib/sass/scss/static_parser.rb +5 -24
  39. data/lib/sass/selector/abstract_sequence.rb +7 -6
  40. data/lib/sass/selector/comma_sequence.rb +7 -4
  41. data/lib/sass/selector/pseudo.rb +19 -2
  42. data/lib/sass/selector/sequence.rb +35 -6
  43. data/lib/sass/selector/simple.rb +9 -2
  44. data/lib/sass/selector/simple_sequence.rb +8 -4
  45. data/lib/sass/selector.rb +4 -0
  46. data/lib/sass/source/map.rb +2 -2
  47. data/lib/sass/stack.rb +21 -1
  48. data/lib/sass/tree/charset_node.rb +1 -1
  49. data/lib/sass/tree/prop_node.rb +45 -53
  50. data/lib/sass/tree/rule_node.rb +3 -2
  51. data/lib/sass/tree/visitors/check_nesting.rb +1 -1
  52. data/lib/sass/tree/visitors/convert.rb +2 -3
  53. data/lib/sass/tree/visitors/cssize.rb +4 -15
  54. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  55. data/lib/sass/tree/visitors/extend.rb +2 -8
  56. data/lib/sass/tree/visitors/perform.rb +21 -9
  57. data/lib/sass/tree/visitors/set_options.rb +1 -1
  58. data/lib/sass/tree/visitors/to_css.rb +47 -13
  59. data/lib/sass/util/multibyte_string_scanner.rb +127 -131
  60. data/lib/sass/util/normalized_map.rb +1 -8
  61. data/lib/sass/util.rb +12 -290
  62. data/lib/sass/version.rb +0 -2
  63. data/lib/sass.rb +0 -7
  64. data/test/sass/cache_test.rb +0 -1
  65. data/test/sass/callbacks_test.rb +0 -1
  66. data/test/sass/compiler_test.rb +4 -15
  67. data/test/sass/conversion_test.rb +113 -163
  68. data/test/sass/css2sass_test.rb +16 -19
  69. data/test/sass/css_variable_test.rb +176 -71
  70. data/test/sass/encoding_test.rb +2 -33
  71. data/test/sass/engine_test.rb +71 -19
  72. data/test/sass/exec_test.rb +0 -1
  73. data/test/sass/extend_test.rb +37 -92
  74. data/test/sass/functions_test.rb +58 -14
  75. data/test/sass/importer_test.rb +2 -3
  76. data/test/sass/logger_test.rb +0 -1
  77. data/test/sass/plugin_test.rb +6 -10
  78. data/test/sass/results/script.css +1 -1
  79. data/test/sass/results/units.css +2 -2
  80. data/test/sass/script_conversion_test.rb +10 -2
  81. data/test/sass/script_test.rb +22 -24
  82. data/test/sass/scss/css_test.rb +3 -18
  83. data/test/sass/scss/rx_test.rb +0 -1
  84. data/test/sass/scss/scss_test.rb +49 -16
  85. data/test/sass/source_map_test.rb +13 -16
  86. data/test/sass/superselector_test.rb +0 -1
  87. data/test/sass/util/multibyte_string_scanner_test.rb +121 -124
  88. data/test/sass/util/normalized_map_test.rb +0 -1
  89. data/test/sass/util/subset_map_test.rb +0 -1
  90. data/test/sass/util_test.rb +4 -39
  91. data/test/sass/value_helpers_test.rb +0 -1
  92. data/test/sass-spec.yml +1 -1
  93. data/test/test_helper.rb +39 -0
  94. metadata +19 -44
  95. data/lib/sass/script/css_variable_warning.rb +0 -52
  96. data/lib/sass/util/cross_platform_random.rb +0 -19
  97. data/lib/sass/util/ordered_hash.rb +0 -192
  98. data/test/sass/results/import_charset_1_8.css +0 -5
  99. data/test/sass/templates/import_charset_1_8.sass +0 -6
  100. data/vendor/listen/CHANGELOG.md +0 -1
  101. data/vendor/listen/CONTRIBUTING.md +0 -38
  102. data/vendor/listen/Gemfile +0 -20
  103. data/vendor/listen/Guardfile +0 -8
  104. data/vendor/listen/LICENSE +0 -20
  105. data/vendor/listen/README.md +0 -349
  106. data/vendor/listen/Rakefile +0 -5
  107. data/vendor/listen/Vagrantfile +0 -96
  108. data/vendor/listen/lib/listen/adapter.rb +0 -327
  109. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -75
  110. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -48
  111. data/vendor/listen/lib/listen/adapters/linux.rb +0 -81
  112. data/vendor/listen/lib/listen/adapters/polling.rb +0 -58
  113. data/vendor/listen/lib/listen/adapters/windows.rb +0 -91
  114. data/vendor/listen/lib/listen/directory_record.rb +0 -406
  115. data/vendor/listen/lib/listen/listener.rb +0 -323
  116. data/vendor/listen/lib/listen/turnstile.rb +0 -32
  117. data/vendor/listen/lib/listen/version.rb +0 -3
  118. data/vendor/listen/lib/listen.rb +0 -54
  119. data/vendor/listen/listen.gemspec +0 -28
  120. data/vendor/listen/spec/listen/adapter_spec.rb +0 -149
  121. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  122. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  123. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  124. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  125. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  126. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1250
  127. data/vendor/listen/spec/listen/listener_spec.rb +0 -258
  128. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  129. data/vendor/listen/spec/listen_spec.rb +0 -67
  130. data/vendor/listen/spec/spec_helper.rb +0 -25
  131. data/vendor/listen/spec/support/adapter_helper.rb +0 -666
  132. data/vendor/listen/spec/support/directory_record_helper.rb +0 -57
  133. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  134. data/vendor/listen/spec/support/listeners_helper.rb +0 -179
  135. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -1,155 +1,151 @@
1
1
  require 'strscan'
2
2
 
3
- if Sass::Util.ruby1_8?
4
- Sass::Util::MultibyteStringScanner = StringScanner
5
- else
6
- if Sass::Util.rbx?
7
- # Rubinius's StringScanner class implements some of its methods in terms of
8
- # others, which causes us to double-count bytes in some cases if we do
9
- # straightforward inheritance. To work around this, we use a delegate class.
10
- require 'delegate'
11
- class Sass::Util::MultibyteStringScanner < DelegateClass(StringScanner)
12
- def initialize(str)
13
- super(StringScanner.new(str))
14
- @mb_pos = 0
15
- @mb_matched_size = nil
16
- @mb_last_pos = nil
17
- end
18
-
19
- def is_a?(klass)
20
- __getobj__.is_a?(klass) || super
21
- end
3
+ if Sass::Util.rbx?
4
+ # Rubinius's StringScanner class implements some of its methods in terms of
5
+ # others, which causes us to double-count bytes in some cases if we do
6
+ # straightforward inheritance. To work around this, we use a delegate class.
7
+ require 'delegate'
8
+ class Sass::Util::MultibyteStringScanner < DelegateClass(StringScanner)
9
+ def initialize(str)
10
+ super(StringScanner.new(str))
11
+ @mb_pos = 0
12
+ @mb_matched_size = nil
13
+ @mb_last_pos = nil
22
14
  end
23
- else
24
- class Sass::Util::MultibyteStringScanner < StringScanner
25
- def initialize(str)
26
- super
27
- @mb_pos = 0
28
- @mb_matched_size = nil
29
- @mb_last_pos = nil
30
- end
15
+
16
+ def is_a?(klass)
17
+ __getobj__.is_a?(klass) || super
31
18
  end
32
19
  end
33
-
34
- # A wrapper of the native StringScanner class that works correctly with
35
- # multibyte character encodings. The native class deals only in bytes, not
36
- # characters, for methods like [#pos] and [#matched_size]. This class deals
37
- # only in characters, instead.
38
- class Sass::Util::MultibyteStringScanner
39
- def self.new(str)
40
- return StringScanner.new(str) if str.ascii_only?
20
+ else
21
+ class Sass::Util::MultibyteStringScanner < StringScanner
22
+ def initialize(str)
41
23
  super
24
+ @mb_pos = 0
25
+ @mb_matched_size = nil
26
+ @mb_last_pos = nil
42
27
  end
28
+ end
29
+ end
43
30
 
44
- alias_method :byte_pos, :pos
45
- alias_method :byte_matched_size, :matched_size
46
-
47
- def check(pattern); _match super; end
48
- def check_until(pattern); _matched super; end
49
- def getch; _forward _match super; end
50
- def match?(pattern); _size check(pattern); end
51
- def matched_size; @mb_matched_size; end
52
- def peek(len); string[@mb_pos, len]; end
53
- alias_method :peep, :peek
54
- def pos; @mb_pos; end
55
- alias_method :pointer, :pos
56
- def rest_size; rest.size; end
57
- def scan(pattern); _forward _match super; end
58
- def scan_until(pattern); _forward _matched super; end
59
- def skip(pattern); _size scan(pattern); end
60
- def skip_until(pattern); _matched _size scan_until(pattern); end
61
-
62
- def get_byte
63
- raise "MultibyteStringScanner doesn't support #get_byte."
64
- end
31
+ # A wrapper of the native StringScanner class that works correctly with
32
+ # multibyte character encodings. The native class deals only in bytes, not
33
+ # characters, for methods like [#pos] and [#matched_size]. This class deals
34
+ # only in characters, instead.
35
+ class Sass::Util::MultibyteStringScanner
36
+ def self.new(str)
37
+ return StringScanner.new(str) if str.ascii_only?
38
+ super
39
+ end
65
40
 
66
- def getbyte
67
- raise "MultibyteStringScanner doesn't support #getbyte."
68
- end
41
+ alias_method :byte_pos, :pos
42
+ alias_method :byte_matched_size, :matched_size
43
+
44
+ def check(pattern); _match super; end
45
+ def check_until(pattern); _matched super; end
46
+ def getch; _forward _match super; end
47
+ def match?(pattern); _size check(pattern); end
48
+ def matched_size; @mb_matched_size; end
49
+ def peek(len); string[@mb_pos, len]; end
50
+ alias_method :peep, :peek
51
+ def pos; @mb_pos; end
52
+ alias_method :pointer, :pos
53
+ def rest_size; rest.size; end
54
+ def scan(pattern); _forward _match super; end
55
+ def scan_until(pattern); _forward _matched super; end
56
+ def skip(pattern); _size scan(pattern); end
57
+ def skip_until(pattern); _matched _size scan_until(pattern); end
58
+
59
+ def get_byte
60
+ raise "MultibyteStringScanner doesn't support #get_byte."
61
+ end
69
62
 
70
- def pos=(n)
71
- @mb_last_pos = nil
63
+ def getbyte
64
+ raise "MultibyteStringScanner doesn't support #getbyte."
65
+ end
72
66
 
73
- # We set position kind of a lot during parsing, so we want it to be as
74
- # efficient as possible. This is complicated by the fact that UTF-8 is a
75
- # variable-length encoding, so it's difficult to find the byte length that
76
- # corresponds to a given character length.
77
- #
78
- # Our heuristic here is to try to count the fewest possible characters. So
79
- # if the new position is close to the current one, just count the
80
- # characters between the two; if the new position is closer to the
81
- # beginning of the string, just count the characters from there.
82
- if @mb_pos - n < @mb_pos / 2
83
- # New position is close to old position
84
- byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize
85
- super(byte_pos + byte_delta)
86
- else
87
- # New position is close to BOS
88
- super(string[0...n].bytesize)
89
- end
90
- @mb_pos = n
91
- end
67
+ def pos=(n)
68
+ @mb_last_pos = nil
69
+
70
+ # We set position kind of a lot during parsing, so we want it to be as
71
+ # efficient as possible. This is complicated by the fact that UTF-8 is a
72
+ # variable-length encoding, so it's difficult to find the byte length that
73
+ # corresponds to a given character length.
74
+ #
75
+ # Our heuristic here is to try to count the fewest possible characters. So
76
+ # if the new position is close to the current one, just count the
77
+ # characters between the two; if the new position is closer to the
78
+ # beginning of the string, just count the characters from there.
79
+ if @mb_pos - n < @mb_pos / 2
80
+ # New position is close to old position
81
+ byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize
82
+ super(byte_pos + byte_delta)
83
+ else
84
+ # New position is close to BOS
85
+ super(string[0...n].bytesize)
86
+ end
87
+ @mb_pos = n
88
+ end
92
89
 
93
- def reset
94
- @mb_pos = 0
95
- @mb_matched_size = nil
96
- @mb_last_pos = nil
97
- super
98
- end
90
+ def reset
91
+ @mb_pos = 0
92
+ @mb_matched_size = nil
93
+ @mb_last_pos = nil
94
+ super
95
+ end
99
96
 
100
- def scan_full(pattern, advance_pointer_p, return_string_p)
101
- res = _match super(pattern, advance_pointer_p, true)
102
- _forward res if advance_pointer_p
103
- return res if return_string_p
104
- end
97
+ def scan_full(pattern, advance_pointer_p, return_string_p)
98
+ res = _match super(pattern, advance_pointer_p, true)
99
+ _forward res if advance_pointer_p
100
+ return res if return_string_p
101
+ end
105
102
 
106
- def search_full(pattern, advance_pointer_p, return_string_p)
107
- res = super(pattern, advance_pointer_p, true)
108
- _forward res if advance_pointer_p
109
- _matched((res if return_string_p))
110
- end
103
+ def search_full(pattern, advance_pointer_p, return_string_p)
104
+ res = super(pattern, advance_pointer_p, true)
105
+ _forward res if advance_pointer_p
106
+ _matched((res if return_string_p))
107
+ end
111
108
 
112
- def string=(str)
113
- @mb_pos = 0
114
- @mb_matched_size = nil
115
- @mb_last_pos = nil
116
- super
117
- end
109
+ def string=(str)
110
+ @mb_pos = 0
111
+ @mb_matched_size = nil
112
+ @mb_last_pos = nil
113
+ super
114
+ end
118
115
 
119
- def terminate
120
- @mb_pos = string.size
121
- @mb_matched_size = nil
122
- @mb_last_pos = nil
123
- super
124
- end
125
- alias_method :clear, :terminate
116
+ def terminate
117
+ @mb_pos = string.size
118
+ @mb_matched_size = nil
119
+ @mb_last_pos = nil
120
+ super
121
+ end
122
+ alias_method :clear, :terminate
126
123
 
127
- def unscan
128
- super
129
- @mb_pos = @mb_last_pos
130
- @mb_last_pos = @mb_matched_size = nil
131
- end
124
+ def unscan
125
+ super
126
+ @mb_pos = @mb_last_pos
127
+ @mb_last_pos = @mb_matched_size = nil
128
+ end
132
129
 
133
- private
130
+ private
134
131
 
135
- def _size(str)
136
- str && str.size
137
- end
132
+ def _size(str)
133
+ str && str.size
134
+ end
138
135
 
139
- def _match(str)
140
- @mb_matched_size = str && str.size
141
- str
142
- end
136
+ def _match(str)
137
+ @mb_matched_size = str && str.size
138
+ str
139
+ end
143
140
 
144
- def _matched(res)
145
- _match matched
146
- res
147
- end
141
+ def _matched(res)
142
+ _match matched
143
+ res
144
+ end
148
145
 
149
- def _forward(str)
150
- @mb_last_pos = @mb_pos
151
- @mb_pos += str.size if str
152
- str
153
- end
146
+ def _forward(str)
147
+ @mb_last_pos = @mb_pos
148
+ @mb_pos += str.size if str
149
+ str
154
150
  end
155
151
  end
@@ -5,12 +5,11 @@ module Sass
5
5
  # A hash that normalizes its string keys while still allowing you to get back
6
6
  # to the original keys that were stored. If several different values normalize
7
7
  # to the same value, whichever is stored last wins.
8
- require 'sass/util/ordered_hash' if ruby1_8?
9
8
  class NormalizedMap
10
9
  # Create a normalized map
11
10
  def initialize(map = nil)
12
11
  @key_strings = {}
13
- @map = Util.ruby1_8? ? OrderedHash.new : {}
12
+ @map = {}
14
13
 
15
14
  map.each {|key, value| self[key] = value} if map
16
15
  end
@@ -115,12 +114,6 @@ module Sass
115
114
  @map.send(method, *args, &block)
116
115
  end
117
116
 
118
- if Sass::Util.ruby1_8?
119
- def respond_to?(method, include_private = false)
120
- super || @map.respond_to?(method, include_private)
121
- end
122
- end
123
-
124
117
  def respond_to_missing?(method, include_private = false)
125
118
  @map.respond_to?(method, include_private)
126
119
  end