sass 3.2.10 → 3.2.11

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Sass
1
+ # Sass [![Gem Version](https://badge.fury.io/rb/sass.png)](http://badge.fury.io/rb/sass)
2
2
 
3
3
  **Sass makes CSS fun again**. Sass is an extension of CSS3,
4
4
  adding nested rules, variables, mixins, selector inheritance, and more.
@@ -56,7 +56,7 @@ to `config.ru`.
56
56
  Then any Sass files in `public/stylesheets/sass`
57
57
  will be compiled into CSS files in `public/stylesheets` on every request.
58
58
 
59
- To use Sass programatically,
59
+ To use Sass programmatically,
60
60
  check out the [YARD documentation](http://sass-lang.com/docs/yardoc/).
61
61
 
62
62
  ## Formatting
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.10
1
+ 3.2.11
@@ -1 +1 @@
1
- 27 July 2013 01:11:34 UTC
1
+ 28 September 2013 01:15:19 UTC
@@ -36,7 +36,7 @@ module Sass
36
36
  # return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
37
37
  # return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
38
38
  FileUtils.mkdir_p(File.dirname(compiled_filename))
39
- File.open(compiled_filename, "wb") do |f|
39
+ Sass::Util.atomic_create_and_write_file(compiled_filename) do |f|
40
40
  f.puts(version)
41
41
  f.puts(sha)
42
42
  f.write(contents)
@@ -293,8 +293,16 @@ END
293
293
  @options[:for_engine][:cache] = false
294
294
  end
295
295
 
296
- unless ::Sass::Util.ruby1_8?
297
- opts.on('-E encoding', 'Specify the default encoding for Sass files.') do |encoding|
296
+ encoding_desc = if ::Sass::Util.ruby1_8?
297
+ 'Does not work in ruby 1.8.'
298
+ else
299
+ 'Specify the default encoding for Sass files.'
300
+ end
301
+ opts.on('-E encoding', encoding_desc) do |encoding|
302
+ if ::Sass::Util.ruby1_8?
303
+ $stderr.puts "Specifying the encoding is not supported in ruby 1.8."
304
+ exit 1
305
+ else
298
306
  Encoding.default_external = encoding
299
307
  end
300
308
  end
@@ -612,7 +620,6 @@ END
612
620
  end
613
621
  @options[:output] ||= @options[:input]
614
622
 
615
- from = @options[:from]
616
623
  if @options[:to] == @options[:from] && !@options[:in_place]
617
624
  fmt = @options[:from]
618
625
  raise "Error: converting from #{fmt} to #{fmt} without --in-place"
@@ -24,11 +24,13 @@ module Sass
24
24
  # as its instance-level caches are never explicitly expired.
25
25
  class StalenessChecker
26
26
  @dependencies_cache = {}
27
+ @dependency_cache_mutex = Mutex.new
27
28
 
28
29
  class << self
29
30
  # TODO: attach this to a compiler instance.
30
31
  # @private
31
32
  attr_accessor :dependencies_cache
33
+ attr_reader :dependency_cache_mutex
32
34
  end
33
35
 
34
36
  # Creates a new StalenessChecker
@@ -37,8 +39,6 @@ module Sass
37
39
  # @param options [{Symbol => Object}]
38
40
  # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
39
41
  def initialize(options)
40
- @dependencies = self.class.dependencies_cache
41
-
42
42
  # URIs that are being actively checked for staleness. Protects against
43
43
  # import loops.
44
44
  @actively_checking = Set.new
@@ -131,7 +131,7 @@ module Sass
131
131
  begin
132
132
  mtime = importer.mtime(uri, @options)
133
133
  if mtime.nil?
134
- @dependencies.delete([uri, importer])
134
+ with_dependency_cache {|cache| cache.delete([uri, importer])}
135
135
  nil
136
136
  else
137
137
  mtime
@@ -140,11 +140,14 @@ module Sass
140
140
  end
141
141
 
142
142
  def dependencies(uri, importer)
143
- stored_mtime, dependencies = Sass::Util.destructure(@dependencies[[uri, importer]])
143
+ stored_mtime, dependencies =
144
+ with_dependency_cache {|cache| Sass::Util.destructure(cache[[uri, importer]])}
144
145
 
145
146
  if !stored_mtime || stored_mtime < mtime(uri, importer)
146
147
  dependencies = compute_dependencies(uri, importer)
147
- @dependencies[[uri, importer]] = [mtime(uri, importer), dependencies]
148
+ with_dependency_cache do |cache|
149
+ cache[[uri, importer]] = [mtime(uri, importer), dependencies]
150
+ end
148
151
  end
149
152
 
150
153
  dependencies
@@ -178,6 +181,17 @@ module Sass
178
181
  def tree(uri, importer)
179
182
  @parse_trees[[uri, importer]] ||= importer.find(uri, @options).to_tree
180
183
  end
184
+
185
+ # Get access to the global dependency cache in a threadsafe manner.
186
+ # Inside the block, no other thread can access the dependency cache.
187
+ #
188
+ # @yieldparam cache [Hash] The hash that is the global dependency cache
189
+ # @return The value returned by the block to which this method yields
190
+ def with_dependency_cache
191
+ StalenessChecker.dependency_cache_mutex.synchronize do
192
+ yield StalenessChecker.dependencies_cache
193
+ end
194
+ end
181
195
  end
182
196
  end
183
197
  end
@@ -36,7 +36,7 @@ module Sass::Script
36
36
  # : Creates a {Color} from hue, saturation, and lightness values.
37
37
  #
38
38
  # \{#hsla hsla($hue, $saturation, $lightness, $alpha)}
39
- # : Creates a {Color} from hue, saturation, lightness, lightness, and alpha
39
+ # : Creates a {Color} from hue, saturation, lightness, and alpha
40
40
  # values.
41
41
  #
42
42
  # \{#hue hue($color)}
@@ -461,7 +461,7 @@ module Sass::Script
461
461
  end
462
462
  declare :hsl, [:hue, :saturation, :lightness]
463
463
 
464
- # Creates a {Color} from hue, saturation, lightness, lightness, and alpha
464
+ # Creates a {Color} from hue, saturation, lightness, and alpha
465
465
  # values. Uses the algorithm from the [CSS3 spec][].
466
466
  #
467
467
  # [CSS3 spec]: http://www.w3.org/TR/css3-color/#hsl-color
@@ -1488,7 +1488,7 @@ module Sass::Script
1488
1488
  end
1489
1489
  declare :if, [:condition, :if_true, :if_false]
1490
1490
 
1491
- # This function only exists as a workaround for IE7's [`content:counter`
1491
+ # This function only exists as a workaround for IE7's [`content: counter`
1492
1492
  # bug][bug]. It works identically to any other plain-CSS function, except it
1493
1493
  # avoids adding spaces between the argument commas.
1494
1494
  #
@@ -1503,6 +1503,21 @@ module Sass::Script
1503
1503
  end
1504
1504
  declare :counter, [], :var_args => true
1505
1505
 
1506
+ # This function only exists as a workaround for IE7's [`content: counters`
1507
+ # bug][bug]. It works identically to any other plain-CSS function, except it
1508
+ # avoids adding spaces between the argument commas.
1509
+ #
1510
+ # [bug]: http://jes.st/2013/ie7s-css-breaking-content-counter-bug/
1511
+ #
1512
+ # @example
1513
+ # counters(item, ".") => counters(item,".")
1514
+ # @overload counters($args...)
1515
+ # @return [String]
1516
+ def counters(*args)
1517
+ Sass::Script::String.new("counters(#{args.map {|a| a.to_s(options)}.join(',')})")
1518
+ end
1519
+ declare :counters, [], :var_args => true
1520
+
1506
1521
  private
1507
1522
 
1508
1523
  # This method implements the pattern of transforming a numeric value into
@@ -49,7 +49,8 @@ module Sass::Script
49
49
  return "()" if value.empty?
50
50
  precedence = Sass::Script::Parser.precedence_of(separator)
51
51
  value.reject {|e| e.is_a?(Null)}.map do |v|
52
- if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence
52
+ if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence ||
53
+ separator == :space && v.is_a?(UnaryOperation) && (v.operator == :minus || v.operator == :plus)
53
54
  "(#{v.to_sass(opts)})"
54
55
  else
55
56
  v.to_sass(opts)
@@ -35,7 +35,6 @@ module Sass::Script
35
35
 
36
36
  # @see Node#to_sass
37
37
  def to_sass(opts = {})
38
- pred = Sass::Script::Parser.precedence_of(@operator)
39
38
  o1 = operand_to_sass @operand1, :left, opts
40
39
  o2 = operand_to_sass @operand2, :right, opts
41
40
  sep =
@@ -4,9 +4,14 @@ module Sass::Script
4
4
  #
5
5
  # Currently only `-`, `/`, and `not` are unary operators.
6
6
  class UnaryOperation < Node
7
- # @param operand [Script::Node] The parse-tree node
8
- # for the object of the operator
9
- # @param operator [Symbol] The operator to perform
7
+ # @return [Symbol] The operation to perform
8
+ attr_reader :operator
9
+
10
+ # @return [Script::Node] The parse-tree node for the object of the operator
11
+ attr_reader :operand
12
+
13
+ # @param operand [Script::Node] See \{#operand}
14
+ # @param operator [Symbol] See \{#operator}
10
15
  def initialize(operand, operator)
11
16
  @operand = operand
12
17
  @operator = operator
@@ -1045,6 +1045,7 @@ MESSAGE
1045
1045
  :qualified_name => "identifier",
1046
1046
  :expr => "expression (e.g. 1px, bold)",
1047
1047
  :_selector => "selector",
1048
+ :selector_comma_sequence => "selector",
1048
1049
  :simple_selector_sequence => "selector",
1049
1050
  :import_arg => "file to import (string or url())",
1050
1051
  :moz_document_function => "matching function (e.g. url-prefix(), domain())",
@@ -346,19 +346,19 @@ module Sass
346
346
  # A pseudoclass (e.g. `:visited`) or pseudoelement (e.g. `::first-line`) selector.
347
347
  # It can have arguments (e.g. `:nth-child(2n+1)`).
348
348
  class Pseudo < Simple
349
- # The type of the selector.
350
- # `:class` if this is a pseudoclass selector,
351
- # `:element` if it's a pseudoelement.
349
+ # Some psuedo-class-syntax selectors are actually considered
350
+ # pseudo-elements and must be treated differently. This is a list of such
351
+ # selectors
352
352
  #
353
- # @return [Symbol]
354
- attr_reader :type
353
+ # @return [Array<String>]
354
+ ACTUALLY_ELEMENTS = %w[after before first-line first-letter]
355
355
 
356
- # Some psuedo-class-syntax selectors (`:after` and `:before)
357
- # are actually considered pseudo-elements
358
- # and must be at the end of the selector to function properly.
356
+ # Like \{#type}, but returns the type of selector this looks like, rather
357
+ # than the type it is semantically. This only differs from type for
358
+ # selectors in \{ACTUALLY\_ELEMENTS}.
359
359
  #
360
- # @return [Array<String>]
361
- FINAL_SELECTORS = %w[after before]
360
+ # @return [Symbol]
361
+ attr_reader :syntactic_type
362
362
 
363
363
  # The name of the selector.
364
364
  #
@@ -380,18 +380,22 @@ module Sass
380
380
  # @param arg [nil, Array<String, Sass::Script::Node>] The argument to the selector,
381
381
  # or nil if no argument was given
382
382
  def initialize(type, name, arg)
383
- @type = type
383
+ @syntactic_type = type
384
384
  @name = name
385
385
  @arg = arg
386
386
  end
387
387
 
388
- def final?
389
- type == :class && FINAL_SELECTORS.include?(name.first)
388
+ # The type of the selector. `:class` if this is a pseudoclass selector,
389
+ # `:element` if it's a pseudoelement.
390
+ #
391
+ # @return [Symbol]
392
+ def type
393
+ ACTUALLY_ELEMENTS.include?(name.first) ? :element : syntactic_type
390
394
  end
391
395
 
392
396
  # @see Selector#to_a
393
397
  def to_a
394
- res = [@type == :class ? ":" : "::"] + @name
398
+ res = [syntactic_type == :class ? ":" : "::"] + @name
395
399
  (res << "(").concat(Sass::Util.strip_string_array(@arg)) << ")" if @arg
396
400
  res
397
401
  end
@@ -405,7 +409,6 @@ module Sass
405
409
  sel.is_a?(Pseudo) && sel.type == :element &&
406
410
  (sel.name != self.name || sel.arg != self.arg)
407
411
  end
408
- return sels + [self] if final?
409
412
  super
410
413
  end
411
414
 
@@ -255,7 +255,7 @@ module Sass
255
255
  # is a supersequence of the other, use that, otherwise give up.
256
256
  lcs = Sass::Util.lcs(ops1, ops2)
257
257
  return unless lcs == ops1 || lcs == ops2
258
- res.unshift *(ops1.size > ops2.size ? ops1 : ops2).reverse
258
+ res.unshift(*(ops1.size > ops2.size ? ops1 : ops2).reverse)
259
259
  return res
260
260
  end
261
261
 
@@ -85,7 +85,7 @@ module Sass
85
85
  sels_with_ix = Sass::Util.enum_with_index(sels)
86
86
  _, i =
87
87
  if self.is_a?(Pseudo) || self.is_a?(SelectorPseudoClass)
88
- sels_with_ix.find {|sel, _| sel.is_a?(Pseudo) && (sels.last.final? || sels.last.type == :element)}
88
+ sels_with_ix.find {|sel, _| sel.is_a?(Pseudo) && (sels.last.type == :element)}
89
89
  else
90
90
  sels_with_ix.find {|sel, _| sel.is_a?(Pseudo) || sel.is_a?(SelectorPseudoClass)}
91
91
  end
@@ -37,11 +37,16 @@ module Sass
37
37
  @base ||= (members.first if members.first.is_a?(Element) || members.first.is_a?(Universal))
38
38
  end
39
39
 
40
- # Returns the non-base selectors in this sequence.
40
+ def pseudo_elements
41
+ @pseudo_elements ||= (members - [base]).
42
+ select {|sel| sel.is_a?(Pseudo) && sel.type == :element}
43
+ end
44
+
45
+ # Returns the non-base, non-pseudo-class selectors in this sequence.
41
46
  #
42
47
  # @return [Set<Simple>]
43
48
  def rest
44
- @rest ||= Set.new(base ? members[1..-1] : members)
49
+ @rest ||= Set.new(members - [base] - pseudo_elements)
45
50
  end
46
51
 
47
52
  # Whether or not this compound selector is the subject of the parent
@@ -129,9 +134,9 @@ module Sass
129
134
  # by the time extension and unification happen,
130
135
  # this exception will only ever be raised as a result of programmer error
131
136
  def unify(sels, other_subject)
132
- return unless sseq = members.inject(sels) do |sseq, sel|
133
- return unless sseq
134
- sel.unify(sseq)
137
+ return unless sseq = members.inject(sels) do |member, sel|
138
+ return unless member
139
+ sel.unify(member)
135
140
  end
136
141
  SimpleSequence.new(sseq, other_subject || subject?)
137
142
  end
@@ -145,7 +150,9 @@ module Sass
145
150
  # @param sseq [SimpleSequence]
146
151
  # @return [Boolean]
147
152
  def superselector?(sseq)
148
- (base.nil? || base.eql?(sseq.base)) && rest.subset?(sseq.rest)
153
+ (base.nil? || base.eql?(sseq.base)) &&
154
+ pseudo_elements.eql?(sseq.pseudo_elements) &&
155
+ rest.subset?(sseq.rest)
149
156
  end
150
157
 
151
158
  # @see Simple#to_a
@@ -197,8 +204,8 @@ WARNING
197
204
  end
198
205
 
199
206
  def _eql?(other)
200
- other.base.eql?(self.base) && Sass::Util.set_eql?(other.rest, self.rest) &&
201
- other.subject? == self.subject?
207
+ other.base.eql?(self.base) && other.pseudo_elements == pseudo_elements &&
208
+ Sass::Util.set_eql?(other.rest, self.rest) && other.subject? == self.subject?
202
209
  end
203
210
  end
204
211
  end
@@ -124,12 +124,12 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
124
124
  end
125
125
 
126
126
  sel = sseq.members
127
- parent.resolved_rules.members.each do |seq|
128
- if !seq.members.last.is_a?(Sass::Selector::SimpleSequence)
129
- raise Sass::SyntaxError.new("#{seq} can't extend: invalid selector")
127
+ parent.resolved_rules.members.each do |member|
128
+ if !member.members.last.is_a?(Sass::Selector::SimpleSequence)
129
+ raise Sass::SyntaxError.new("#{member} can't extend: invalid selector")
130
130
  end
131
131
 
132
- @extends[sel] = Extend.new(seq, sel, node, @parent_directives.dup, :not_found)
132
+ @extends[sel] = Extend.new(member, sel, node, @parent_directives.dup, :not_found)
133
133
  end
134
134
  end
135
135
 
@@ -160,7 +160,6 @@ class Sass::Tree::Visitors::ToCss < Sass::Tree::Visitors::Base
160
160
 
161
161
  to_return = ''
162
162
  old_spaces = ' ' * @tabs
163
- spaces = ' ' * (@tabs + 1)
164
163
  if node.style != :compressed
165
164
  if node.options[:debug_info] && !@in_directive
166
165
  to_return << visit(debug_info_rule(node.debug_info, node.options)) << "\n"
@@ -868,6 +868,29 @@ MSG
868
868
  end
869
869
  end
870
870
 
871
+ # This creates a temp file and yields it for writing. When the
872
+ # write is complete, the file is moved into the desired location.
873
+ # The atomicity of this operation is provided by the filesystem's
874
+ # rename operation.
875
+ #
876
+ # @param filename [String] The file to write to.
877
+ # @yieldparam tmpfile [Tempfile] The temp file that can be written to.
878
+ # @return The value returned by the block.
879
+ def atomic_create_and_write_file(filename)
880
+ require 'tempfile'
881
+ tmpfile = Tempfile.new(File.basename(filename), File.dirname(filename))
882
+ tmp_path = tmpfile.path
883
+ tmpfile.binmode if tmpfile.respond_to?(:binmode)
884
+ result = yield tmpfile
885
+ File.rename tmpfile.path, filename
886
+ result
887
+ ensure
888
+ # close and remove the tempfile if it still exists,
889
+ # presumably due to an error during write
890
+ tmpfile.close if tmpfile
891
+ tmpfile.unlink if tmpfile
892
+ end
893
+
871
894
  private
872
895
 
873
896
  # Calculates the memoization table for the Least Common Subsequence algorithm.
@@ -1692,6 +1692,23 @@ foo {
1692
1692
  SCSS
1693
1693
  end
1694
1694
 
1695
+ def test_ambiguous_negation
1696
+ assert_renders(<<SASS, <<SCSS, :indent => ' ')
1697
+ foo
1698
+ ok: -$foo
1699
+ comma: 10px, -$foo
1700
+ needs-parens: 10px (-$foo)
1701
+ no-parens: a 50px + 60px b
1702
+ SASS
1703
+ foo {
1704
+ ok: -$foo;
1705
+ comma: 10px, -$foo;
1706
+ needs-parens: 10px (-$foo);
1707
+ no-parens: a 50px + 60px b;
1708
+ }
1709
+ SCSS
1710
+ end
1711
+
1695
1712
  private
1696
1713
 
1697
1714
  def assert_sass_to_sass(sass, options = {})
@@ -1172,6 +1172,41 @@ SCSS
1172
1172
 
1173
1173
  # Regression Tests
1174
1174
 
1175
+ def test_pseudo_element_superselector
1176
+ # Pseudo-elements shouldn't be removed in superselector calculations.
1177
+ assert_equal <<CSS, render(<<SCSS)
1178
+ a#bar, a#bar::fblthp {
1179
+ a: b; }
1180
+ CSS
1181
+ %x#bar {a: b} // Add an id to make the results have high specificity
1182
+ %y, %y::fblthp {@extend %x}
1183
+ a {@extend %y}
1184
+ SCSS
1185
+
1186
+ # Pseudo-classes can be removed when the second law allows.
1187
+ assert_equal <<CSS, render(<<SCSS)
1188
+ a#bar {
1189
+ a: b; }
1190
+ CSS
1191
+ %x#bar {a: b}
1192
+ %y, %y:fblthp {@extend %x}
1193
+ a {@extend %y}
1194
+ SCSS
1195
+
1196
+ # A few pseudo-elements can be written as pseudo-elements for historical
1197
+ # reasons. See http://www.w3.org/TR/selectors4/#pseudo-elements.
1198
+ %w[first-line first-letter before after].each do |pseudo|
1199
+ assert_equal <<CSS, render(<<SCSS)
1200
+ a#bar, a#bar:#{pseudo} {
1201
+ a: b; }
1202
+ CSS
1203
+ %x#bar {a: b}
1204
+ %y, %y:#{pseudo} {@extend %x}
1205
+ a {@extend %y}
1206
+ SCSS
1207
+ end
1208
+ end
1209
+
1175
1210
  def test_nested_sibling_extend
1176
1211
  assert_equal <<CSS, render(<<SCSS)
1177
1212
  .parent .bar, .parent .foo {
@@ -1046,6 +1046,12 @@ MSG
1046
1046
  assert_equal('counter(item,".")', evaluate('counter(item,".")'))
1047
1047
  end
1048
1048
 
1049
+ def test_counters
1050
+ assert_equal("counters(foo)", evaluate("counters(foo)"))
1051
+ assert_equal('counters(item,".")', evaluate('counters(item, ".")'))
1052
+ assert_equal('counters(item,".")', evaluate('counters(item,".")'))
1053
+ end
1054
+
1049
1055
  def test_keyword_args_rgb
1050
1056
  assert_equal(%Q{white}, evaluate("rgb($red: 255, $green: 255, $blue: 255)"))
1051
1057
  end
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.dirname(__FILE__) + '/../test_helper'
3
3
  require 'pathname'
4
+ require 'tmpdir'
4
5
 
5
6
  class UtilTest < Test::Unit::TestCase
6
7
  include Sass::Util
@@ -310,4 +311,51 @@ class UtilTest < Test::Unit::TestCase
310
311
  "UtilTest::FooBar must implement #foo") {FooBar.new.foo}
311
312
  end
312
313
 
314
+ def test_atomic_writes
315
+ # when using normal writes, this test fails about 90% of the time.
316
+ filename = File.join(Dir.tmpdir, "test_atomic")
317
+ 5.times do
318
+ writes_to_perform = %w(1 2 3 4 5 6 7 8 9).map {|i| "#{i}\n" * 100_000}
319
+ threads = writes_to_perform.map do |to_write|
320
+ Thread.new do
321
+ # To see this test fail with a normal write,
322
+ # change to the standard file open mechanism:
323
+ # open(filename, "w") do |f|
324
+ atomic_create_and_write_file(filename) do |f|
325
+ f.write(to_write)
326
+ end
327
+ end
328
+ end
329
+ loop do
330
+ contents = File.exist?(filename) ? File.read(filename) : nil
331
+ next if contents.nil? || contents.size == 0
332
+ unless writes_to_perform.include?(contents)
333
+ if contents.size != writes_to_perform.first.size
334
+ fail "Incomplete write detected: was #{contents.size} characters, " +
335
+ "should have been #{writes_to_perform.first.size}"
336
+ else
337
+ fail "Corrupted read/write detected"
338
+ end
339
+ end
340
+ break if threads.all? {|t| !t.alive?}
341
+ end
342
+ threads.each {|t| t.join}
343
+ end
344
+ end
345
+
346
+ class FakeError < RuntimeError; end
347
+
348
+ def test_atomic_writes_handles_exceptions
349
+ filename = File.join(Dir.tmpdir, "test_atomic_exception")
350
+ FileUtils.rm_f(filename)
351
+ tmp_filename = nil
352
+ assert_raises FakeError do
353
+ atomic_create_and_write_file(filename) do |f|
354
+ tmp_filename = f.path
355
+ raise FakeError.new "Borken"
356
+ end
357
+ end
358
+ assert !File.exist?(filename)
359
+ assert !File.exist?(tmp_filename)
360
+ end
313
361
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.10
4
+ version: 3.2.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-07-27 00:00:00.000000000 Z
14
+ date: 2013-09-28 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: yard