sass 3.7.4 → 4.0.0.alpha.1

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 (257) hide show
  1. checksums.yaml +13 -5
  2. data/.yardopts +1 -1
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/CONTRIBUTING.md +1 -146
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +25 -39
  7. data/Rakefile +274 -0
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/lib/sass.rb +3 -3
  11. data/lib/sass/cache_stores/filesystem.rb +2 -2
  12. data/lib/sass/cache_stores/memory.rb +5 -4
  13. data/lib/sass/callbacks.rb +2 -2
  14. data/lib/sass/css.rb +12 -12
  15. data/lib/sass/engine.rb +44 -62
  16. data/lib/sass/environment.rb +7 -35
  17. data/lib/sass/error.rb +14 -14
  18. data/lib/sass/exec/base.rb +14 -3
  19. data/lib/sass/exec/sass_convert.rb +6 -20
  20. data/lib/sass/exec/sass_scss.rb +29 -5
  21. data/lib/sass/features.rb +2 -3
  22. data/lib/sass/importers/filesystem.rb +6 -11
  23. data/lib/sass/logger.rb +3 -8
  24. data/lib/sass/logger/base.rb +2 -19
  25. data/lib/sass/plugin.rb +2 -3
  26. data/lib/sass/plugin/compiler.rb +67 -48
  27. data/lib/sass/plugin/configuration.rb +3 -3
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/rack.rb +3 -3
  30. data/lib/sass/plugin/staleness_checker.rb +3 -3
  31. data/lib/sass/railtie.rb +1 -1
  32. data/lib/sass/script.rb +3 -3
  33. data/lib/sass/script/css_parser.rb +15 -5
  34. data/lib/sass/script/functions.rb +121 -337
  35. data/lib/sass/script/lexer.rb +36 -102
  36. data/lib/sass/script/parser.rb +153 -529
  37. data/lib/sass/script/tree/funcall.rb +34 -42
  38. data/lib/sass/script/tree/interpolation.rb +26 -171
  39. data/lib/sass/script/tree/list_literal.rb +8 -23
  40. data/lib/sass/script/tree/map_literal.rb +2 -2
  41. data/lib/sass/script/tree/node.rb +3 -3
  42. data/lib/sass/script/tree/operation.rb +16 -43
  43. data/lib/sass/script/tree/string_interpolation.rb +43 -64
  44. data/lib/sass/script/tree/variable.rb +1 -1
  45. data/lib/sass/script/value.rb +0 -2
  46. data/lib/sass/script/value/arg_list.rb +1 -1
  47. data/lib/sass/script/value/base.rb +9 -27
  48. data/lib/sass/script/value/color.rb +18 -26
  49. data/lib/sass/script/value/helpers.rb +18 -44
  50. data/lib/sass/script/value/list.rb +14 -35
  51. data/lib/sass/script/value/map.rb +2 -2
  52. data/lib/sass/script/value/number.rb +16 -26
  53. data/lib/sass/script/value/string.rb +1 -30
  54. data/lib/sass/scss.rb +2 -0
  55. data/lib/sass/scss/css_parser.rb +3 -7
  56. data/lib/sass/scss/parser.rb +78 -196
  57. data/lib/sass/scss/rx.rb +14 -7
  58. data/lib/sass/scss/script_lexer.rb +15 -0
  59. data/lib/sass/scss/script_parser.rb +25 -0
  60. data/lib/sass/scss/static_parser.rb +55 -38
  61. data/lib/sass/selector.rb +10 -7
  62. data/lib/sass/selector/abstract_sequence.rb +12 -15
  63. data/lib/sass/selector/comma_sequence.rb +6 -24
  64. data/lib/sass/selector/pseudo.rb +6 -19
  65. data/lib/sass/selector/sequence.rb +16 -14
  66. data/lib/sass/selector/simple.rb +7 -9
  67. data/lib/sass/selector/simple_sequence.rb +12 -16
  68. data/lib/sass/shared.rb +1 -1
  69. data/lib/sass/source/map.rb +9 -7
  70. data/lib/sass/source/position.rb +4 -4
  71. data/lib/sass/stack.rb +3 -23
  72. data/lib/sass/tree/charset_node.rb +1 -1
  73. data/lib/sass/tree/comment_node.rb +1 -1
  74. data/lib/sass/tree/function_node.rb +3 -2
  75. data/lib/sass/tree/node.rb +3 -5
  76. data/lib/sass/tree/prop_node.rb +58 -49
  77. data/lib/sass/tree/rule_node.rb +8 -15
  78. data/lib/sass/tree/visitors/check_nesting.rb +23 -19
  79. data/lib/sass/tree/visitors/convert.rb +13 -15
  80. data/lib/sass/tree/visitors/cssize.rb +15 -4
  81. data/lib/sass/tree/visitors/deep_copy.rb +2 -2
  82. data/lib/sass/tree/visitors/extend.rb +14 -10
  83. data/lib/sass/tree/visitors/perform.rb +18 -29
  84. data/lib/sass/tree/visitors/set_options.rb +2 -2
  85. data/lib/sass/tree/visitors/to_css.rb +47 -77
  86. data/lib/sass/util.rb +311 -98
  87. data/lib/sass/util/cross_platform_random.rb +19 -0
  88. data/lib/sass/util/multibyte_string_scanner.rb +133 -127
  89. data/lib/sass/util/normalized_map.rb +8 -1
  90. data/lib/sass/util/ordered_hash.rb +192 -0
  91. data/lib/sass/version.rb +6 -2
  92. data/test/sass/cache_test.rb +131 -0
  93. data/test/sass/callbacks_test.rb +61 -0
  94. data/test/sass/compiler_test.rb +236 -0
  95. data/test/sass/conversion_test.rb +2171 -0
  96. data/test/sass/css2sass_test.rb +526 -0
  97. data/test/sass/data/hsl-rgb.txt +319 -0
  98. data/test/sass/encoding_test.rb +219 -0
  99. data/test/sass/engine_test.rb +3400 -0
  100. data/test/sass/exec_test.rb +86 -0
  101. data/test/sass/extend_test.rb +1719 -0
  102. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  103. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  104. data/test/sass/functions_test.rb +1984 -0
  105. data/test/sass/importer_test.rb +421 -0
  106. data/test/sass/logger_test.rb +58 -0
  107. data/test/sass/mock_importer.rb +49 -0
  108. data/test/sass/more_results/more1.css +9 -0
  109. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  110. data/test/sass/more_results/more_import.css +29 -0
  111. data/test/sass/more_templates/_more_partial.sass +2 -0
  112. data/test/sass/more_templates/more1.sass +23 -0
  113. data/test/sass/more_templates/more_import.sass +11 -0
  114. data/test/sass/plugin_test.rb +556 -0
  115. data/test/sass/results/alt.css +4 -0
  116. data/test/sass/results/basic.css +9 -0
  117. data/test/sass/results/cached_import_option.css +3 -0
  118. data/test/sass/results/compact.css +5 -0
  119. data/test/sass/results/complex.css +86 -0
  120. data/test/sass/results/compressed.css +1 -0
  121. data/test/sass/results/expanded.css +19 -0
  122. data/test/sass/results/filename_fn.css +3 -0
  123. data/test/sass/results/if.css +3 -0
  124. data/test/sass/results/import.css +31 -0
  125. data/test/sass/results/import_charset.css +5 -0
  126. data/test/sass/results/import_charset_1_8.css +5 -0
  127. data/test/sass/results/import_charset_ibm866.css +5 -0
  128. data/test/sass/results/import_content.css +1 -0
  129. data/test/sass/results/line_numbers.css +49 -0
  130. data/test/sass/results/mixins.css +95 -0
  131. data/test/sass/results/multiline.css +24 -0
  132. data/test/sass/results/nested.css +22 -0
  133. data/test/sass/results/options.css +1 -0
  134. data/test/sass/results/parent_ref.css +13 -0
  135. data/test/sass/results/script.css +16 -0
  136. data/test/sass/results/scss_import.css +31 -0
  137. data/test/sass/results/scss_importee.css +2 -0
  138. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  139. data/test/sass/results/subdir/subdir.css +3 -0
  140. data/test/sass/results/units.css +11 -0
  141. data/test/sass/results/warn.css +0 -0
  142. data/test/sass/results/warn_imported.css +0 -0
  143. data/test/sass/script_conversion_test.rb +306 -0
  144. data/test/sass/script_test.rb +1206 -0
  145. data/test/sass/scss/css_test.rb +1281 -0
  146. data/test/sass/scss/rx_test.rb +160 -0
  147. data/test/sass/scss/scss_test.rb +4147 -0
  148. data/test/sass/scss/test_helper.rb +37 -0
  149. data/test/sass/source_map_test.rb +1055 -0
  150. data/test/sass/superselector_test.rb +210 -0
  151. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  152. data/test/sass/templates/_double_import_loop2.sass +1 -0
  153. data/test/sass/templates/_filename_fn_import.scss +11 -0
  154. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  155. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  156. data/test/sass/templates/_imported_content.sass +3 -0
  157. data/test/sass/templates/_partial.sass +2 -0
  158. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  159. data/test/sass/templates/alt.sass +16 -0
  160. data/test/sass/templates/basic.sass +23 -0
  161. data/test/sass/templates/bork1.sass +2 -0
  162. data/test/sass/templates/bork2.sass +2 -0
  163. data/test/sass/templates/bork3.sass +2 -0
  164. data/test/sass/templates/bork4.sass +2 -0
  165. data/test/sass/templates/bork5.sass +3 -0
  166. data/test/sass/templates/cached_import_option.scss +3 -0
  167. data/test/sass/templates/compact.sass +17 -0
  168. data/test/sass/templates/complex.sass +305 -0
  169. data/test/sass/templates/compressed.sass +15 -0
  170. data/test/sass/templates/double_import_loop1.sass +1 -0
  171. data/test/sass/templates/expanded.sass +17 -0
  172. data/test/sass/templates/filename_fn.scss +18 -0
  173. data/test/sass/templates/if.sass +11 -0
  174. data/test/sass/templates/import.sass +12 -0
  175. data/test/sass/templates/import_charset.sass +9 -0
  176. data/test/sass/templates/import_charset_1_8.sass +6 -0
  177. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  178. data/test/sass/templates/import_content.sass +4 -0
  179. data/test/sass/templates/importee.less +2 -0
  180. data/test/sass/templates/importee.sass +19 -0
  181. data/test/sass/templates/line_numbers.sass +13 -0
  182. data/test/sass/templates/mixin_bork.sass +5 -0
  183. data/test/sass/templates/mixins.sass +76 -0
  184. data/test/sass/templates/multiline.sass +20 -0
  185. data/test/sass/templates/nested.sass +25 -0
  186. data/test/sass/templates/nested_bork1.sass +2 -0
  187. data/test/sass/templates/nested_bork2.sass +2 -0
  188. data/test/sass/templates/nested_bork3.sass +2 -0
  189. data/test/sass/templates/nested_bork4.sass +2 -0
  190. data/test/sass/templates/nested_import.sass +2 -0
  191. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  192. data/test/sass/templates/options.sass +2 -0
  193. data/test/sass/templates/parent_ref.sass +25 -0
  194. data/test/sass/templates/same_name_different_ext.sass +2 -0
  195. data/test/sass/templates/same_name_different_ext.scss +1 -0
  196. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  197. data/test/sass/templates/script.sass +101 -0
  198. data/test/sass/templates/scss_import.scss +12 -0
  199. data/test/sass/templates/scss_importee.scss +1 -0
  200. data/test/sass/templates/single_import_loop.sass +1 -0
  201. data/test/sass/templates/subdir/import_up1.scss +1 -0
  202. data/test/sass/templates/subdir/import_up2.scss +1 -0
  203. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  204. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  205. data/test/sass/templates/subdir/subdir.sass +6 -0
  206. data/test/sass/templates/units.sass +11 -0
  207. data/test/sass/templates/warn.sass +3 -0
  208. data/test/sass/templates/warn_imported.sass +4 -0
  209. data/test/sass/test_helper.rb +8 -0
  210. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  211. data/test/sass/util/normalized_map_test.rb +51 -0
  212. data/test/sass/util/subset_map_test.rb +91 -0
  213. data/test/sass/util_test.rb +438 -0
  214. data/test/sass/value_helpers_test.rb +179 -0
  215. data/test/test_helper.rb +110 -0
  216. data/vendor/listen/CHANGELOG.md +1 -0
  217. data/vendor/listen/CONTRIBUTING.md +38 -0
  218. data/vendor/listen/Gemfile +20 -0
  219. data/vendor/listen/Guardfile +8 -0
  220. data/vendor/listen/LICENSE +20 -0
  221. data/vendor/listen/README.md +349 -0
  222. data/vendor/listen/Rakefile +5 -0
  223. data/vendor/listen/Vagrantfile +96 -0
  224. data/vendor/listen/lib/listen.rb +54 -0
  225. data/vendor/listen/lib/listen/adapter.rb +327 -0
  226. data/vendor/listen/lib/listen/adapters/bsd.rb +75 -0
  227. data/vendor/listen/lib/listen/adapters/darwin.rb +48 -0
  228. data/vendor/listen/lib/listen/adapters/linux.rb +81 -0
  229. data/vendor/listen/lib/listen/adapters/polling.rb +58 -0
  230. data/vendor/listen/lib/listen/adapters/windows.rb +91 -0
  231. data/vendor/listen/lib/listen/directory_record.rb +406 -0
  232. data/vendor/listen/lib/listen/listener.rb +323 -0
  233. data/vendor/listen/lib/listen/turnstile.rb +32 -0
  234. data/vendor/listen/lib/listen/version.rb +3 -0
  235. data/vendor/listen/listen.gemspec +28 -0
  236. data/vendor/listen/spec/listen/adapter_spec.rb +149 -0
  237. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  238. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  239. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  240. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  241. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  242. data/vendor/listen/spec/listen/directory_record_spec.rb +1250 -0
  243. data/vendor/listen/spec/listen/listener_spec.rb +258 -0
  244. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  245. data/vendor/listen/spec/listen_spec.rb +67 -0
  246. data/vendor/listen/spec/spec_helper.rb +25 -0
  247. data/vendor/listen/spec/support/adapter_helper.rb +666 -0
  248. data/vendor/listen/spec/support/directory_record_helper.rb +57 -0
  249. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  250. data/vendor/listen/spec/support/listeners_helper.rb +179 -0
  251. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  252. metadata +217 -76
  253. data/extra/sass-spec-ref.sh +0 -40
  254. data/lib/sass/deprecation.rb +0 -55
  255. data/lib/sass/logger/delayed.rb +0 -50
  256. data/lib/sass/script/value/callable.rb +0 -25
  257. data/lib/sass/script/value/function.rb +0 -19
@@ -2,8 +2,6 @@ module Sass
2
2
  module Selector
3
3
  # A comma-separated sequence of selectors.
4
4
  class CommaSequence < AbstractSequence
5
- @@compound_extend_deprecation = Sass::Deprecation.new
6
-
7
5
  # The comma-separated selector sequences
8
6
  # represented by this class.
9
7
  #
@@ -98,11 +96,8 @@ module Sass
98
96
  # The node that caused this extension.
99
97
  # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
100
98
  # The parent directives containing `extend_node`.
101
- # @param allow_compound_target [Boolean]
102
- # Whether `extendee` is allowed to contain compound selectors.
103
99
  # @raise [Sass::SyntaxError] if this extension is invalid.
104
- def populate_extends(extends, extendee, extend_node = nil, parent_directives = [],
105
- allow_compound_target = false)
100
+ def populate_extends(extends, extendee, extend_node = nil, parent_directives = [])
106
101
  extendee.members.each do |seq|
107
102
  if seq.members.size > 1
108
103
  raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend nested selectors")
@@ -116,21 +111,13 @@ module Sass
116
111
  end
117
112
 
118
113
  sel = sseq.members
119
- if !allow_compound_target && sel.length > 1
120
- @@compound_extend_deprecation.warn(sseq.filename, sseq.line, <<WARNING)
121
- Extending a compound selector, #{sseq}, is deprecated and will not be supported in a future release.
122
- Consider "@extend #{sseq.members.join(', ')}" instead.
123
- See http://bit.ly/ExtendCompound for details.
124
- WARNING
125
- end
126
-
127
114
  members.each do |member|
128
115
  unless member.members.last.is_a?(Sass::Selector::SimpleSequence)
129
116
  raise Sass::SyntaxError.new("#{member} can't extend: invalid selector")
130
117
  end
131
118
 
132
119
  extends[sel] = Sass::Tree::Visitors::Cssize::Extend.new(
133
- member, sel, extend_node, parent_directives, false)
120
+ member, sel, extend_node, parent_directives, :not_found)
134
121
  end
135
122
  end
136
123
  end
@@ -159,8 +146,8 @@ WARNING
159
146
  Sass::Script::Value::List.new(seq.members.map do |component|
160
147
  next if component == "\n"
161
148
  Sass::Script::Value::String.new(component.to_s)
162
- end.compact, separator: :space)
163
- end, separator: :comma)
149
+ end.compact, :space)
150
+ end, :comma)
164
151
  end
165
152
 
166
153
  # Returns a string representation of the sequence.
@@ -172,13 +159,8 @@ WARNING
172
159
  end
173
160
 
174
161
  # @see AbstractSequence#to_s
175
- def to_s(opts = {})
176
- @members.map do |m|
177
- next if opts[:placeholder] == false && m.invisible?
178
- m.to_s(opts)
179
- end.compact.
180
- join(opts[:style] == :compressed ? "," : ", ").
181
- gsub(", \n", ",\n")
162
+ def to_s
163
+ @members.join(", ").gsub(", \n", ",\n")
182
164
  end
183
165
 
184
166
  private
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  module Sass
3
2
  module Selector
4
3
  # A pseudoclass (e.g. `:visited`) or pseudoelement (e.g. `::first-line`)
@@ -10,7 +9,7 @@ module Sass
10
9
  # selectors.
11
10
  #
12
11
  # @return [Set<String>]
13
- ACTUALLY_ELEMENTS = %w(after before first-line first-letter).to_set
12
+ ACTUALLY_ELEMENTS = %w[after before first-line first-letter].to_set
14
13
 
15
14
  # Like \{#type}, but returns the type of selector this looks like, rather
16
15
  # than the type it is semantically. This only differs from type for
@@ -53,14 +52,6 @@ module Sass
53
52
  type == :class && normalized_name == 'root'
54
53
  end
55
54
 
56
- # Whether or not this selector should be hidden due to containing a
57
- # placeholder.
58
- def invisible?
59
- # :not() is a special case—if you eliminate all the placeholders from
60
- # it, it should match anything.
61
- name != 'not' && @selector && @selector.members.all? {|s| s.invisible?}
62
- end
63
-
64
55
  # Returns a copy of this with \{#selector} set to \{#new\_selector}.
65
56
  #
66
57
  # @param new_selector [CommaSequence]
@@ -90,7 +81,7 @@ module Sass
90
81
  # more complex cases that likely aren't worth the pain.
91
82
  next [] unless sel.name == name && sel.arg == arg
92
83
  sel.selector.members
93
- when 'has', 'host', 'host-context', 'slotted'
84
+ when 'has', 'host', 'host-context'
94
85
  # We can't expand nested selectors here, because each layer adds an
95
86
  # additional layer of semantics. For example, `:has(:has(img))`
96
87
  # doesn't match `<div><img></div>` but `:has(img)` does.
@@ -126,17 +117,13 @@ module Sass
126
117
  end
127
118
 
128
119
  # @see Selector#to_s
129
- def to_s(opts = {})
130
- # :not() is a special case, because :not(<nothing>) should match
131
- # everything.
132
- return '' if name == 'not' && @selector && @selector.members.all? {|m| m.invisible?}
133
-
120
+ def to_s
134
121
  res = (syntactic_type == :class ? ":" : "::") + @name
135
122
  if @arg || @selector
136
123
  res << "("
137
- res << Sass::Util.strip_except_escapes(@arg) if @arg
124
+ res << @arg.strip if @arg
138
125
  res << " " if @arg && @selector
139
- res << @selector.to_s(opts) if @selector
126
+ res << @selector.to_s if @selector
140
127
  res << ")"
141
128
  end
142
129
  res
@@ -178,7 +165,7 @@ module Sass
178
165
  their_seq = Sequence.new(parents + [their_sseq])
179
166
  our_seq.superselector?(their_seq)
180
167
  end
181
- when 'has', 'host', 'host-context', 'slotted'
168
+ when 'has', 'host', 'host-context'
182
169
  # Like :matches, :has (et al) can be a superselector of another
183
170
  # selector if its constituent selectors are a superset of those of
184
171
  # another :has in the other selector. However, the :matches other case
@@ -6,8 +6,8 @@ module Sass
6
6
  # Sets the line of the Sass template on which this selector was declared.
7
7
  # This also sets the line for all child selectors.
8
8
  #
9
- # @param line [Integer]
10
- # @return [Integer]
9
+ # @param line [Fixnum]
10
+ # @return [Fixnum]
11
11
  def line=(line)
12
12
  members.each {|m| m.line = line if m.is_a?(SimpleSequence)}
13
13
  @line = line
@@ -66,14 +66,10 @@ module Sass
66
66
  next [sseq_or_op] unless sseq_or_op.is_a?(SimpleSequence)
67
67
  sseq_or_op.resolve_parent_refs(super_cseq).members
68
68
  end).map do |path|
69
- path_members = path.map do |seq_or_op|
69
+ Sequence.new(path.map do |seq_or_op|
70
70
  next seq_or_op unless seq_or_op.is_a?(Sequence)
71
71
  seq_or_op.members
72
- end
73
- if path_members.length == 2 && path_members[1][0] == "\n"
74
- path_members[0].unshift path_members[1].shift
75
- end
76
- Sequence.new(path_members.flatten)
72
+ end.flatten)
77
73
  end)
78
74
  end
79
75
 
@@ -119,7 +115,7 @@ module Sass
119
115
  # specificity greater than or equal to that of the original selector.
120
116
  # In order to ensure that, we record the original selector's
121
117
  # (`extended.first`) original specificity.
122
- extended.first.add_sources!([self]) if original && !invisible?
118
+ extended.first.add_sources!([self]) if original && !has_placeholder?
123
119
 
124
120
  extended.map {|seq| seq.members}
125
121
  end
@@ -161,8 +157,8 @@ module Sass
161
157
  end
162
158
 
163
159
  # @see AbstractSequence#to_s
164
- def to_s(opts = {})
165
- @members.map {|m| m.is_a?(String) ? m : m.to_s(opts)}.join(" ").gsub(/ ?\n ?/, "\n")
160
+ def to_s
161
+ @members.join(" ").gsub(/ ?\n ?/, "\n")
166
162
  end
167
163
 
168
164
  # Returns a string representation of the sequence.
@@ -344,6 +340,8 @@ module Sass
344
340
  # be nil. Otherwise, this will contained the merged selector. Array
345
341
  # elements are [Sass::Util#paths]-style options; conceptually, an "or"
346
342
  # of multiple selectors.
343
+ # @comment
344
+ # rubocop:disable MethodLength
347
345
  def merge_final_ops(seq1, seq2, res = [])
348
346
  ops1, ops2 = [], []
349
347
  ops1 << seq1.pop while seq1.last.is_a?(String)
@@ -400,10 +398,10 @@ module Sass
400
398
  ([merged, '+'] if merged)
401
399
  ].compact
402
400
  end
403
- elsif op1 == '>' && %w(~ +).include?(op2)
401
+ elsif op1 == '>' && %w[~ +].include?(op2)
404
402
  res.unshift sel2, op2
405
403
  seq1.push sel1, op1
406
- elsif op2 == '>' && %w(~ +).include?(op1)
404
+ elsif op2 == '>' && %w[~ +].include?(op1)
407
405
  res.unshift sel1, op1
408
406
  seq2.push sel2, op2
409
407
  elsif op1 == op2
@@ -425,6 +423,8 @@ module Sass
425
423
  return merge_final_ops(seq1, seq2, res)
426
424
  end
427
425
  end
426
+ # @comment
427
+ # rubocop:enable MethodLength
428
428
 
429
429
  # Takes initial subsequences of `seq1` and `seq2` and returns all
430
430
  # orderings of those subsequences. The initial subsequences are determined
@@ -497,7 +497,7 @@ module Sass
497
497
  return if seq1.size > seq2.size
498
498
  return seq1.first.superselector?(seq2.last, seq2[0...-1]) if seq1.size == 1
499
499
 
500
- _, si = seq2.each_with_index.find do |e, i|
500
+ _, si = Sass::Util.enum_with_index(seq2).find do |e, i|
501
501
  return if i == seq2.size - 1
502
502
  next if e.is_a?(String)
503
503
  seq1.first.superselector?(e, seq2[0...i])
@@ -624,6 +624,8 @@ module Sass
624
624
  other.members.reject {|m| m == "\n"}.eql?(members.reject {|m| m == "\n"})
625
625
  end
626
626
 
627
+ private
628
+
627
629
  def path_has_two_subjects?(path)
628
630
  subject = false
629
631
  path.each do |sseq_or_op|
@@ -5,7 +5,7 @@ module Sass
5
5
  class Simple
6
6
  # The line of the Sass template on which this selector was declared.
7
7
  #
8
- # @return [Integer]
8
+ # @return [Fixnum]
9
9
  attr_accessor :line
10
10
 
11
11
  # The name of the file in which this selector was declared,
@@ -31,10 +31,8 @@ module Sass
31
31
 
32
32
  # Returns the selector string.
33
33
  #
34
- # @param opts [Hash] rendering options.
35
- # @option opts [Symbol] :style The css rendering style.
36
34
  # @return [String]
37
- def to_s(opts = {})
35
+ def to_s
38
36
  Sass::Util.abstract(self)
39
37
  end
40
38
 
@@ -44,7 +42,7 @@ module Sass
44
42
  # so if that contains information irrelevant to the identity of the selector,
45
43
  # this should be overridden.
46
44
  #
47
- # @return [Integer]
45
+ # @return [Fixnum]
48
46
  def hash
49
47
  @_hash ||= equality_key.hash
50
48
  end
@@ -80,10 +78,10 @@ module Sass
80
78
  # by the time extension and unification happen,
81
79
  # this exception will only ever be raised as a result of programmer error
82
80
  def unify(sels)
83
- return sels.first.unify([self]) if sels.length == 1 && sels.first.is_a?(Universal)
84
81
  return sels if sels.any? {|sel2| eql?(sel2)}
82
+ sels_with_ix = Sass::Util.enum_with_index(sels)
85
83
  if !is_a?(Pseudo) || (sels.last.is_a?(Pseudo) && sels.last.type == :element)
86
- _, i = sels.each_with_index.find {|sel, _| sel.is_a?(Pseudo)}
84
+ _, i = sels_with_ix.find {|sel, _| sel.is_a?(Pseudo)}
87
85
  end
88
86
  return sels + [self] unless i
89
87
  sels[0...i] + [self] + sels[i..-1]
@@ -114,10 +112,10 @@ module Sass
114
112
  # could be found at all.
115
113
  # If the second value is `false`, the first should be ignored.
116
114
  def unify_namespaces(ns1, ns2)
115
+ return nil, false unless ns1 == ns2 || ns1.nil? || ns1 == '*' || ns2.nil? || ns2 == '*'
117
116
  return ns2, true if ns1 == '*'
118
117
  return ns1, true if ns2 == '*'
119
- return nil, false unless ns1 == ns2
120
- [ns1, true]
118
+ [ns1 || ns2, true]
121
119
  end
122
120
  end
123
121
  end
@@ -88,7 +88,7 @@ module Sass
88
88
  def resolve_parent_refs(super_cseq)
89
89
  resolved_members = @members.map do |sel|
90
90
  next sel unless sel.is_a?(Pseudo) && sel.selector
91
- sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, false))
91
+ sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, !:implicit_parent))
92
92
  end.flatten
93
93
 
94
94
  # Parent selector only appears as the first selector in the sequence
@@ -158,12 +158,12 @@ module Sass
158
158
  seen_with_pseudo_selectors = seen.dup
159
159
 
160
160
  modified_original = false
161
- members = self.members.map do |sel|
161
+ members = Sass::Util.enum_with_index(self.members).map do |sel, i|
162
162
  next sel unless sel.is_a?(Pseudo) && sel.selector
163
163
  next sel if seen.include?([sel])
164
- extended = sel.selector.do_extend(extends, parent_directives, replace, seen, false)
164
+ extended = sel.selector.do_extend(extends, parent_directives, replace, seen, !:original)
165
165
  next sel if extended == sel.selector
166
- extended.members.reject! {|seq| seq.invisible?}
166
+ extended.members.reject! {|seq| seq.has_placeholder?}
167
167
 
168
168
  # For `:not()`, we usually want to get rid of any complex
169
169
  # selectors because that will cause the selector to fail to
@@ -184,16 +184,17 @@ module Sass
184
184
  result
185
185
  end.flatten
186
186
 
187
- groups = extends[members.to_set].group_by {|ex| ex.extender}.to_a
187
+ groups = Sass::Util.group_by_to_a(extends[members.to_set]) {|ex| ex.extender}
188
188
  groups.map! do |seq, group|
189
189
  sels = group.map {|e| e.target}.flatten
190
190
  # If A {@extend B} and C {...},
191
191
  # seq is A, sels is B, and self is C
192
192
 
193
193
  self_without_sel = Sass::Util.array_minus(members, sels)
194
- group.each {|e| e.success = true}
194
+ group.each {|e| e.result = :failed_to_unify unless e.result == :succeeded}
195
195
  unified = seq.members.last.unify(SimpleSequence.new(self_without_sel, subject?))
196
196
  next unless unified
197
+ group.each {|e| e.result = :succeeded}
197
198
  group.each {|e| check_directives_match!(e, parent_directives)}
198
199
  new_seq = Sequence.new(seq.members[0...-1] + [unified])
199
200
  new_seq.add_sources!(sources + [seq])
@@ -203,7 +204,7 @@ module Sass
203
204
  groups.map! do |sels, seq|
204
205
  next [] if seen.include?(sels)
205
206
  seq.do_extend(
206
- extends, parent_directives, false, seen_with_pseudo_selectors + [sels], false)
207
+ extends, parent_directives, !:replace, seen_with_pseudo_selectors + [sels], !:original)
207
208
  end
208
209
  groups.flatten!
209
210
 
@@ -259,7 +260,7 @@ module Sass
259
260
 
260
261
  # Some psuedo-selectors can be subselectors of non-pseudo selectors.
261
262
  # Pull those out here so we can efficiently check against them below.
262
- their_subselector_pseudos = %w(matches any nth-child nth-last-child).
263
+ their_subselector_pseudos = %w[matches any nth-child nth-last-child].
263
264
  map {|name| their_spcs[name] || []}.flatten
264
265
 
265
266
  # If `self`'s non-pseudo simple selectors aren't a subset of `their_sseq`'s,
@@ -278,19 +279,14 @@ module Sass
278
279
  end
279
280
  end
280
281
 
281
- our_spcs.all? do |_name, pseudos|
282
+ our_spcs.all? do |name, pseudos|
282
283
  pseudos.all? {|pseudo| pseudo.superselector?(their_sseq, parents)}
283
284
  end
284
285
  end
285
286
 
286
287
  # @see Simple#to_s
287
- def to_s(opts = {})
288
- res = @members.map {|m| m.to_s(opts)}.join
289
-
290
- # :not(%foo) may resolve to the empty string, but it should match every
291
- # selector so we replace it with "*".
292
- res = '*' if res.empty?
293
-
288
+ def to_s
289
+ res = @members.join
294
290
  res << '!' if subject?
295
291
  res
296
292
  end
@@ -31,7 +31,7 @@ module Sass
31
31
  # A `Fixnum` in 1.8, a `String` in 1.9
32
32
  # @param finish [Character] The character closing the balanced pair.
33
33
  # A `Fixnum` in 1.8, a `String` in 1.9
34
- # @param count [Integer] The number of opening characters matched
34
+ # @param count [Fixnum] The number of opening characters matched
35
35
  # before calling this method
36
36
  # @return [(String, String)] The string matched within the balanced pair
37
37
  # and the rest of the string.
@@ -37,7 +37,7 @@ module Sass::Source
37
37
 
38
38
  # Shifts all output source ranges forward one or more lines.
39
39
  #
40
- # @param delta [Integer] The number of lines to shift the ranges forward.
40
+ # @param delta [Fixnum] The number of lines to shift the ranges forward.
41
41
  def shift_output_lines(delta)
42
42
  return if delta == 0
43
43
  @data.each do |m|
@@ -49,7 +49,7 @@ module Sass::Source
49
49
  # Shifts any output source ranges that lie on the first line forward one or
50
50
  # more characters on that line.
51
51
  #
52
- # @param delta [Integer] The number of characters to shift the ranges
52
+ # @param delta [Fixnum] The number of characters to shift the ranges
53
53
  # forward.
54
54
  def shift_output_offsets(delta)
55
55
  return if delta == 0
@@ -84,6 +84,8 @@ module Sass::Source
84
84
  # @return [String] The JSON string.
85
85
  # @raise [ArgumentError] If neither `:css_uri` nor `:css_path` and
86
86
  # `:sourcemap_path` are specified.
87
+ # @comment
88
+ # rubocop:disable MethodLength
87
89
  def to_json(options)
88
90
  css_uri, css_path, sourcemap_path =
89
91
  options[:css_uri], options[:css_path], options[:sourcemap_path]
@@ -91,8 +93,8 @@ module Sass::Source
91
93
  raise ArgumentError.new("Sass::Source::Map#to_json requires either " \
92
94
  "the :css_uri option or both the :css_path and :soucemap_path options.")
93
95
  end
94
- css_path &&= Sass::Util.pathname(File.absolute_path(css_path))
95
- sourcemap_path &&= Sass::Util.pathname(File.absolute_path(sourcemap_path))
96
+ css_path &&= Sass::Util.pathname(Sass::Util.absolute_path(css_path))
97
+ sourcemap_path &&= Sass::Util.pathname(Sass::Util.absolute_path(sourcemap_path))
96
98
  css_uri ||= Sass::Util.file_uri_from_path(
97
99
  Sass::Util.relative_path_from(css_path, sourcemap_path.dirname))
98
100
 
@@ -116,14 +118,12 @@ module Sass::Source
116
118
  @data.each do |m|
117
119
  file, importer = m.input.file, m.input.importer
118
120
 
119
- next unless importer
120
-
121
121
  if options[:type] == :inline
122
122
  source_uri = file
123
123
  else
124
124
  sourcemap_dir = sourcemap_path && sourcemap_path.dirname.to_s
125
125
  sourcemap_dir = nil if options[:type] == :file
126
- source_uri = importer.public_url(file, sourcemap_dir)
126
+ source_uri = importer && importer.public_url(file, sourcemap_dir)
127
127
  next unless source_uri
128
128
  end
129
129
 
@@ -195,6 +195,8 @@ module Sass::Source
195
195
  result << "\n}"
196
196
  result
197
197
  end
198
+ # @comment
199
+ # rubocop:enable MethodLength
198
200
 
199
201
  private
200
202
 
@@ -2,17 +2,17 @@ module Sass::Source
2
2
  class Position
3
3
  # The one-based line of the document associated with the position.
4
4
  #
5
- # @return [Integer]
5
+ # @return [Fixnum]
6
6
  attr_accessor :line
7
7
 
8
8
  # The one-based offset in the line of the document associated with the
9
9
  # position.
10
10
  #
11
- # @return [Integer]
11
+ # @return [Fixnum]
12
12
  attr_accessor :offset
13
13
 
14
- # @param line [Integer] The source line
15
- # @param offset [Integer] The source offset
14
+ # @param line [Fixnum] The source line
15
+ # @param offset [Fixnum] The source offset
16
16
  def initialize(line, offset)
17
17
  @line = line
18
18
  @offset = offset