sass 3.1.20 → 3.1.21

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -24,7 +24,7 @@ end
24
24
  # Don't use Rake::GemPackageTast because we want prerequisites to run
25
25
  # before we load the gemspec.
26
26
  desc "Build all the packages."
27
- task :package => [:revision_file, :submodules, :permissions] do
27
+ task :package => [:revision_file, :date_file, :submodules, :permissions] do
28
28
  version = get_version
29
29
  File.open(scope('VERSION'), 'w') {|f| f.puts(version)}
30
30
  load scope('sass.gemspec')
@@ -63,8 +63,17 @@ task :revision_file do
63
63
  end
64
64
  end
65
65
 
66
+ task :date_file do
67
+ File.open(scope('VERSION_DATE'), 'w') do |f|
68
+ f.puts Time.now.utc.strftime('%d %B %Y %T %Z')
69
+ end
70
+ end
71
+
66
72
  # We also need to get rid of this file after packaging.
67
- at_exit { File.delete(scope('REVISION')) rescue nil }
73
+ at_exit do
74
+ File.delete(scope('REVISION')) rescue nil
75
+ File.delete(scope('VERSION_DATE')) rescue nil
76
+ end
68
77
 
69
78
  desc "Install Sass as a gem. Use SUDO=1 to install with sudo."
70
79
  task :install => [:package] do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.20
1
+ 3.1.21
@@ -0,0 +1 @@
1
+ 11 August 2012 00:38:15 UTC
@@ -947,23 +947,22 @@ module Sass::Script
947
947
 
948
948
  Sass::Util.check_range("Weight", 0..100, weight, '%')
949
949
 
950
- # This algorithm factors in both the user-provided weight
951
- # and the difference between the alpha values of the two colors
952
- # to decide how to perform the weighted average of the two RGB values.
950
+ # This algorithm factors in both the user-provided weight (w) and the
951
+ # difference between the alpha values of the two colors (a) to decide how
952
+ # to perform the weighted average of the two RGB values.
953
953
  #
954
954
  # It works by first normalizing both parameters to be within [-1, 1],
955
- # where 1 indicates "only use color1", -1 indicates "only use color 0",
956
- # and all values in between indicated a proportionately weighted average.
955
+ # where 1 indicates "only use color1", -1 indicates "only use color2", and
956
+ # all values in between indicated a proportionately weighted average.
957
957
  #
958
- # Once we have the normalized variables w and a,
959
- # we apply the formula (w + a)/(1 + w*a)
960
- # to get the combined weight (in [-1, 1]) of color1.
958
+ # Once we have the normalized variables w and a, we apply the formula
959
+ # (w + a)/(1 + w*a) to get the combined weight (in [-1, 1]) of color1.
961
960
  # This formula has two especially nice properties:
962
961
  #
963
962
  # * When either w or a are -1 or 1, the combined weight is also that number
964
963
  # (cases where w * a == -1 are undefined, and handled as a special case).
965
964
  #
966
- # * When a is 0, the combined weight is w, and vice versa
965
+ # * When a is 0, the combined weight is w, and vice versa.
967
966
  #
968
967
  # Finally, the weight of color1 is renormalized to be within [0, 1]
969
968
  # and the weight of color2 is given by 1 minus the weight of color1.
@@ -422,12 +422,13 @@ module Sass::Script
422
422
  end
423
423
 
424
424
  # A hash of unit names to their index in the conversion table
425
- CONVERTABLE_UNITS = {"in" => 0, "cm" => 1, "pc" => 2, "mm" => 3, "pt" => 4}
426
- CONVERSION_TABLE = [[ 1, 2.54, 6, 25.4, 72 ], # in
427
- [ nil, 1, 2.36220473, 10, 28.3464567], # cm
428
- [ nil, nil, 1, 4.23333333, 12 ], # pc
429
- [ nil, nil, nil, 1, 2.83464567], # mm
430
- [ nil, nil, nil, nil, 1 ]] # pt
425
+ CONVERTABLE_UNITS = {"in" => 0, "cm" => 1, "pc" => 2, "mm" => 3, "pt" => 4, "px" => 5 }
426
+ CONVERSION_TABLE = [[ 1, 2.54, 6, 25.4, 72 , 96 ], # in
427
+ [ nil, 1, 2.36220473, 10, 28.3464567, 37.795275591], # cm
428
+ [ nil, nil, 1, 4.23333333, 12 , 16 ], # pc
429
+ [ nil, nil, nil, 1, 2.83464567, 3.7795275591], # mm
430
+ [ nil, nil, nil, nil, 1 , 1.3333333333], # pt
431
+ [ nil, nil, nil, nil, nil , 1 ]] # px
431
432
 
432
433
  def conversion_factor(from_unit, to_unit)
433
434
  res = CONVERSION_TABLE[CONVERTABLE_UNITS[from_unit]][CONVERTABLE_UNITS[to_unit]]
@@ -47,15 +47,15 @@ module Sass
47
47
  # @return [Sequence] This selector, with parent references resolved
48
48
  # @raise [Sass::SyntaxError] If a parent selector is invalid
49
49
  def resolve_parent_refs(super_seq)
50
- members = @members
50
+ members = @members.dup
51
51
  nl = (members.first == "\n" && members.shift)
52
52
  unless members.any? do |seq_or_op|
53
53
  seq_or_op.is_a?(SimpleSequence) && seq_or_op.members.first.is_a?(Parent)
54
54
  end
55
- members = []
55
+ old_members, members = members, []
56
56
  members << nl if nl
57
57
  members << SimpleSequence.new([Parent.new])
58
- members += @members
58
+ members += old_members
59
59
  end
60
60
 
61
61
  Sequence.new(
@@ -59,9 +59,8 @@ class Sass::Tree::Visitors::ToCss < Sass::Tree::Visitors::Base
59
59
  return if node.invisible?
60
60
  spaces = (' ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
61
61
 
62
- content = node.resolved_value.gsub(/^/, spaces).gsub(%r{^(\s*)//(.*)$}) do |md|
63
- "#{$1}/*#{$2} */"
64
- end
62
+ content = node.resolved_value.gsub(/^/, spaces)
63
+ content.gsub!(%r{^(\s*)//(.*)$}) {|md| "#{$1}/*#{$2} */"} if node.silent
65
64
  content.gsub!(/\n +(\* *(?!\/))?/, ' ') if (node.style == :compact || node.style == :compressed) && !node.loud
66
65
  content
67
66
  end
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  # This is necessary for loading Sass when Haml is required in Rails 3.
2
4
  # Once the split is complete, we can remove it.
3
5
  require File.dirname(__FILE__) + '/../sass'
@@ -16,6 +18,7 @@ module Sass
16
18
  # The `:name` key has the name of the version.
17
19
  # The `:string` key contains a human-readable string representation of the version.
18
20
  # The `:number` key is the major, minor, and teeny keys separated by periods.
21
+ # The `:date` key, which is not guaranteed to be defined, is the [DateTime] at which this release was cut.
19
22
  # If Sass is checked out from Git, the `:rev` key will have the revision hash.
20
23
  # For example:
21
24
  #
@@ -23,6 +26,7 @@ module Sass
23
26
  # :string => "2.1.0.9616393",
24
27
  # :rev => "9616393b8924ef36639c7e82aa88a51a24d16949",
25
28
  # :number => "2.1.0",
29
+ # :date => DateTime.parse("Apr 30 13:52:01 2009 -0700"),
26
30
  # :major => 2, :minor => 1, :teeny => 0
27
31
  # }
28
32
  #
@@ -36,6 +40,7 @@ module Sass
36
40
  # {
37
41
  # :string => "3.0.beta.1",
38
42
  # :number => "3.0.beta.1",
43
+ # :date => DateTime.parse("Mar 31 00:38:04 2010 -0700"),
39
44
  # :major => 3, :minor => 0, :teeny => -1,
40
45
  # :prerelease => "beta",
41
46
  # :prerelease_number => 1
@@ -55,6 +60,10 @@ module Sass
55
60
  :name => name
56
61
  }
57
62
 
63
+ if date = version_date
64
+ @@version[:date] = date
65
+ end
66
+
58
67
  if numbers[3].is_a?(String)
59
68
  @@version[:teeny] = -1
60
69
  @@version[:prerelease] = numbers[3]
@@ -101,6 +110,11 @@ module Sass
101
110
  end
102
111
  return nil
103
112
  end
113
+
114
+ def version_date
115
+ return unless File.exists?(scope('VERSION_DATE'))
116
+ return DateTime.parse(File.read(scope('VERSION_DATE')).strip)
117
+ end
104
118
  end
105
119
 
106
120
  extend Sass::Version
@@ -865,7 +865,8 @@ MSG
865
865
  assert_equal(%Q{"px"}, evaluate("unit(100px)"))
866
866
  assert_equal(%Q{"em*px"}, evaluate("unit(10px * 5em)"))
867
867
  assert_equal(%Q{"em*px"}, evaluate("unit(5em * 10px)"))
868
- assert_equal(%Q{"em*px/cm*rem"}, evaluate("unit(10px * 5em / 30cm / 1rem)"))
868
+ assert_equal(%Q{"em/rem"}, evaluate("unit(10px * 5em / 30cm / 1rem)"))
869
+ assert_equal(%Q{"em*vh/cm*rem"}, evaluate("unit(10vh * 5em / 30cm / 1rem)"))
869
870
  assert_equal(%Q{"px"}, evaluate("unit($number: 100px)"))
870
871
  assert_error_message("#ff0000 is not a number for `unit'", "unit(#f00)")
871
872
  end
@@ -8,4 +8,4 @@ b {
8
8
  pt: -72pt;
9
9
  inches: 2in;
10
10
  more-inches: 3.5in;
11
- mixed: 6px; }
11
+ mixed: 2.042in; }
@@ -359,6 +359,7 @@ SASS
359
359
 
360
360
  def test_operator_unit_conversion
361
361
  assert_equal "1.1cm", resolve("1cm + 1mm")
362
+ assert_equal "2in", resolve("1in + 96px")
362
363
  assert_equal "true", resolve("2mm < 1cm")
363
364
  assert_equal "true", resolve("10mm == 1cm")
364
365
  assert_equal "true", resolve("1 == 1cm")
@@ -962,6 +962,21 @@ bar {baz: bang}
962
962
  SCSS
963
963
  end
964
964
 
965
+ def test_single_line_comment_within_multiline_comment
966
+ assert_equal(<<CSS, render(<<SCSS))
967
+ body {
968
+ /*
969
+ //comment here
970
+ */ }
971
+ CSS
972
+ body {
973
+ /*
974
+ //comment here
975
+ */
976
+ }
977
+ SCSS
978
+ end
979
+
965
980
  private
966
981
 
967
982
  def assert_selector_parses(selector)
@@ -1105,6 +1105,27 @@ SCSS
1105
1105
 
1106
1106
  # Regression
1107
1107
 
1108
+ def test_newline_selector_rendered_multiple_times
1109
+ assert_equal <<CSS, render(<<SCSS)
1110
+ form input,
1111
+ form select {
1112
+ color: white; }
1113
+
1114
+ form input,
1115
+ form select {
1116
+ color: white; }
1117
+ CSS
1118
+ @for $i from 1 through 2 {
1119
+ form {
1120
+ input,
1121
+ select {
1122
+ color: white;
1123
+ }
1124
+ }
1125
+ }
1126
+ SCSS
1127
+ end
1128
+
1108
1129
  def test_prop_name_interpolation_after_hyphen
1109
1130
  assert_equal <<CSS, render(<<SCSS)
1110
1131
  a {
@@ -7,6 +7,7 @@ require 'sass'
7
7
  require 'mathn' if ENV['MATHN'] == 'true'
8
8
 
9
9
  Sass::RAILS_LOADED = true unless defined?(Sass::RAILS_LOADED)
10
+ Encoding.default_external = 'UTF-8' if defined?(Encoding)
10
11
 
11
12
  module Sass::Script::Functions
12
13
  def option(name)
@@ -1,23 +1,63 @@
1
+ ## 0.4.7 - June 27, 2012
2
+
3
+ ### Bug fixes
4
+
5
+ - Increase latency to 0.25, to avoid useless polling fallback. (fixed by [@thibaudgg][])
6
+ - Change watched inotify events, to avoid duplication callback. (fixed by [@thibaudgg][])
7
+ - [#41](https://github.com/guard/listen/issues/41) Use lstat instead of stat when calculating mtime. (fixed by [@ebroder][])
8
+
9
+ ## 0.4.6 - June 20, 2012
10
+
11
+ ### Bug fix
12
+
13
+ - [#39](https://github.com/guard/listen/issues/39) Fix digest race condition. (fixed by [@dkubb][])
14
+
15
+ ## 0.4.5 - June 13, 2012
16
+
17
+ ### Bug fix
18
+
19
+ - [#39](https://github.com/guard/listen/issues/39) Rescue Errno::ENOENT when path inserted doesn't exist. (reported by [@textgoeshere][], fixed by [@thibaudgg][] and [@rymai][])
20
+
21
+ ## 0.4.4 - June 8, 2012
22
+
23
+ ### Bug fixes
24
+
25
+ - ~~[#39](https://github.com/guard/listen/issues/39) Non-existing path insertion bug. (reported by [@textgoeshere][], fixed by [@thibaudgg][])~~
26
+ - Fix relative path for directories containing special characters. (reported by [@napcs][], fixed by [@netzpirat][])
27
+
28
+ ## 0.4.3 - June 6, 2012
29
+
30
+ ### Bug fixes
31
+
32
+ - [#24](https://github.com/guard/listen/issues/24) Fail gracefully when the inotify limit is not enough for Listen to function. (reported by [@daemonza][], fixed by [@Maher4Ever][])
33
+ - [#32](https://github.com/guard/listen/issues/32) Fix a crash when trying to calculate the checksum of unreadable files. (reported by [@nex3][], fixed by [@Maher4Ever][])
34
+
35
+ ### Improvements
36
+
37
+ - Add `#relative_paths` method to listeners. ([@Maher4Ever][])
38
+ - Add `#started?` query-method to adapters. ([@Maher4Ever][])
39
+ - Dynamically detect the mtime precision used on a system. ([@Maher4Ever][] with help from [@nex3][])
40
+
1
41
  ## 0.4.2 - May 1, 2012
2
42
 
3
43
  ### Bug fixes
4
44
 
5
- - [#21](https://github.com/guard/listen/issues/21): Issues when listening to changes in relative paths. (reported by [@akerbos][], fixed by [@Maher4Ever][])
6
- - [#27](https://github.com/guard/listen/issues/27): Wrong reports for files modifications. (reported by [@cobychapple][], fixed by [@Maher4Ever][])
45
+ - [#21](https://github.com/guard/listen/issues/21) Issues when listening to changes in relative paths. (reported by [@akerbos][], fixed by [@Maher4Ever][])
46
+ - [#27](https://github.com/guard/listen/issues/27) Wrong reports for files modifications. (reported by [@cobychapple][], fixed by [@Maher4Ever][])
7
47
  - Fix segmentation fault when profiling on Windows. ([@Maher4Ever][])
8
48
  - Fix redundant watchers on Windows. ([@Maher4Ever][])
9
49
 
10
50
  ### Improvements
11
51
 
12
- - [#17](https://github.com/guard/listen/issues/17): Use regexp-patterns with the `ignore` method instead of supplying paths. (reported by [@fny][], added by [@Maher4Ever][])
52
+ - [#17](https://github.com/guard/listen/issues/17) Use regexp-patterns with the `ignore` method instead of supplying paths. (reported by [@fny][], added by [@Maher4Ever][])
13
53
  - Speed improvement when listening to changes in directories with ignored paths. ([@Maher4Ever][])
14
54
  - Added `.rbx` and `.svn` to ignored directories. ([@Maher4Ever][])
15
55
 
16
56
  ## 0.4.1 - April 15, 2012
17
57
 
18
- ### Bug fixes
58
+ ### Bug fix
19
59
 
20
- - [#18]((https://github.com/guard/listen/issues/18): Listener crashes when removing directories with nested paths. (reported by [@daemonza][], fixed by [@Maher4Ever][])
60
+ - [#18](https://github.com/guard/listen/issues/18) Listener crashes when removing directories with nested paths. (reported by [@daemonza][], fixed by [@Maher4Ever][])
21
61
 
22
62
  ## 0.4.0 - April 9, 2012
23
63
 
@@ -37,19 +77,19 @@
37
77
  - Encapsulate thread spawning in the windows-adapter. ([@Maher4Ever][])
38
78
  - Fix linux-adapter bug where Listen would report file-modification events on the parent-directory. ([@Maher4Ever][])
39
79
 
40
- ### Removals
80
+ ### Change
41
81
 
42
82
  - Remove `wait_until_listening` as adapters doesn't need to run inside threads anymore ([@Maher4Ever][])
43
83
 
44
84
  ## 0.3.3 - March 6, 2012
45
85
 
46
- ### Improvements
86
+ ### Improvement
47
87
 
48
88
  - Improve pause/unpause. ([@thibaudgg][])
49
89
 
50
90
  ## 0.3.2 - March 4, 2012
51
91
 
52
- ### New features
92
+ ### New feature
53
93
 
54
94
  - Add pause/unpause listener's methods. ([@thibaudgg][])
55
95
 
@@ -57,7 +97,7 @@
57
97
 
58
98
  ### Bug fix
59
99
 
60
- - [#9](https://github.com/guard/listen/issues/9): Ignore doesn't seem to work. (reported by [@markiz][], fixed by [@thibaudgg][])
100
+ - [#9](https://github.com/guard/listen/issues/9) Ignore doesn't seem to work. (reported by [@markiz][], fixed by [@thibaudgg][])
61
101
 
62
102
  ## 0.3.0 - February 21, 2012
63
103
 
@@ -81,10 +121,27 @@
81
121
 
82
122
  - First version with only a polling adapter and basic features set (ignore & filter). ([@thibaudgg][])
83
123
 
84
- [@markiz]: https://github.com/markiz
85
- [@thibaudgg]: https://github.com/thibaudgg
124
+ <!--- The following link definition list is generated by PimpMyChangelog --->
125
+ [#9]: https://github.com/guard/listen/issues/9
126
+ [#17]: https://github.com/guard/listen/issues/17
127
+ [#18]: https://github.com/guard/listen/issues/18
128
+ [#21]: https://github.com/guard/listen/issues/21
129
+ [#24]: https://github.com/guard/listen/issues/24
130
+ [#27]: https://github.com/guard/listen/issues/27
131
+ [#32]: https://github.com/guard/listen/issues/32
132
+ [#39]: https://github.com/guard/listen/issues/39
86
133
  [@Maher4Ever]: https://github.com/Maher4Ever
87
- [@daemonza]: https://github.com/daemonza
134
+ [@dkubb]: https://github.com/dkubb
135
+ [@ebroder]: https://github.com/ebroder
88
136
  [@akerbos]: https://github.com/akerbos
89
- [@fny]: https://github.com/fny
90
137
  [@cobychapple]: https://github.com/cobychapple
138
+ [@daemonza]: https://github.com/daemonza
139
+ [@fny]: https://github.com/fny
140
+ [@markiz]: https://github.com/markiz
141
+ [@napcs]: https://github.com/napcs
142
+ [@netzpirat]: https://github.com/netzpirat
143
+ [@nex3]: https://github.com/nex3
144
+ [@rymai]: https://github.com/rymai
145
+ [@scottdavis]: https://github.com/scottdavis
146
+ [@textgoeshere]: https://github.com/textgoeshere
147
+ [@thibaudgg]: https://github.com/thibaudgg
@@ -6,23 +6,11 @@ gem 'rake'
6
6
 
7
7
  group :development do
8
8
  platform :ruby do
9
- gem 'rb-readline'
9
+ gem 'coolline'
10
10
  end
11
11
 
12
- require 'rbconfig'
13
- case RbConfig::CONFIG['target_os']
14
- when /darwin/i
15
- # gem 'ruby_gntp', '~> 0.3.4', :require => false
16
- gem 'growl', :require => false
17
- when /linux/i
18
- gem 'libnotify', '~> 0.7.1', :require => false
19
- when /mswin|mingw/i
20
- gem 'win32console', :require => false
21
- gem 'rb-notifu', '>= 0.0.4', :require => false
22
- end
23
-
24
- gem 'guard', '~> 1.0.0'
25
- gem 'guard-rspec', '~> 0.7.0'
12
+ gem 'guard'
13
+ gem 'guard-rspec'
26
14
  gem 'yard'
27
15
  gem 'redcarpet'
28
16
  gem 'pry'
@@ -31,5 +19,5 @@ group :development do
31
19
  end
32
20
 
33
21
  group :test do
34
- gem 'rspec', '~> 2.9.0'
22
+ gem 'rspec'
35
23
  end
@@ -32,12 +32,12 @@ Feel free to give your feeback via [Listen issues](https://github.com/guard/list
32
32
 
33
33
  ``` ruby
34
34
  # Listen to a single directory.
35
- Listen.to('dir/path/to/listen', filter: /\.rb$/, ignore: %r{ignored/path/}) do |modified, added, removed|
35
+ Listen.to('dir/path/to/listen', :filter => /\.rb$/, :ignore => %r{ignored/path/}) do |modified, added, removed|
36
36
  # ...
37
37
  end
38
38
 
39
39
  # Listen to multiple directories.
40
- Listen.to('dir/to/awesome_app', 'dir/to/other_app', filter: /\.rb$/, latency: 0.1) do |modified, added, removed|
40
+ Listen.to('dir/to/awesome_app', 'dir/to/other_app', :filter => /\.rb$/, :latency => 0.1) do |modified, added, removed|
41
41
  # ...
42
42
  end
43
43
  ```
@@ -191,7 +191,7 @@ These options can be set through `Listen.to` params or via methods (see the "Obj
191
191
  # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::DirectoryRecord
192
192
 
193
193
  :latency => 0.5 # Set the delay (**in seconds**) between checking for changes
194
- # default: 0.1 sec (1.0 sec for polling)
194
+ # default: 0.25 sec (1.0 sec for polling)
195
195
 
196
196
  :relative_paths => true # Enable the use of relative paths in the callback.
197
197
  # default: false
@@ -8,7 +8,7 @@ module Listen
8
8
  attr_accessor :directories, :latency, :paused
9
9
 
10
10
  # The default delay between checking for changes.
11
- DEFAULT_LATENCY = 0.1
11
+ DEFAULT_LATENCY = 0.25
12
12
 
13
13
  # The default warning message when falling back to polling adapter.
14
14
  POLLING_FALLBACK_MESSAGE = "WARNING: Listen has fallen back to polling, learn more at https://github.com/guard/listen#fallback."
@@ -10,7 +10,7 @@ module Listen
10
10
  # @see http://www.tin.org/bin/man.cgi?section=7&topic=inotify
11
11
  # @see https://github.com/nex3/rb-inotify/blob/master/lib/rb-inotify/notifier.rb#L99-L177
12
12
  #
13
- EVENTS = %w[recursive attrib close modify move create delete delete_self move_self]
13
+ EVENTS = %w[recursive attrib create delete move close_write]
14
14
 
15
15
  # The message to show when the limit of inotify watchers is not enough
16
16
  #
@@ -163,7 +163,7 @@ module Listen
163
163
  #
164
164
  def relative_to_base(path)
165
165
  return nil unless path[@directory]
166
- path.sub(%r{^#{@directory}#{File::SEPARATOR}?}, '')
166
+ path.sub(%r{^#{Regexp.quote(@directory)}#{File::SEPARATOR}?}, '')
167
167
  end
168
168
 
169
169
  private
@@ -239,8 +239,8 @@ module Listen
239
239
  elsif !ignored?(path) && filtered?(path) && !existing_path?(path)
240
240
  if File.file?(path)
241
241
  @changes[:added] << (options[:relative_paths] ? relative_to_base(path) : path)
242
+ insert_path(path)
242
243
  end
243
- insert_path(path)
244
244
  end
245
245
  end
246
246
  end
@@ -253,11 +253,11 @@ module Listen
253
253
  def content_modified?(path)
254
254
  sha1_checksum = Digest::SHA1.file(path).to_s
255
255
  return false if @sha1_checksums[path] == sha1_checksum
256
-
257
- had_no_checksum = @sha1_checksums[path].nil?
258
- @sha1_checksums[path] = sha1_checksum
259
-
260
- had_no_checksum ? false : true
256
+ @sha1_checksums.key?(path)
257
+ rescue Errno::EACCES, Errno::ENOENT
258
+ false
259
+ ensure
260
+ @sha1_checksums[path] = sha1_checksum if sha1_checksum
261
261
  end
262
262
 
263
263
  # Traverses the base directory looking for paths that should
@@ -292,6 +292,7 @@ module Listen
292
292
  meta_data.type = File.directory?(path) ? 'Dir' : 'File'
293
293
  meta_data.mtime = mtime_of(path) unless meta_data.type == 'Dir' # mtimes of dirs are not used yet
294
294
  @paths[File.dirname(path)][File.basename(path)] = meta_data
295
+ rescue Errno::ENOENT
295
296
  end
296
297
 
297
298
  # Returns whether or not a path exists in the paths hash.
@@ -311,7 +312,7 @@ module Listen
311
312
  # @return [Fixnum, Float] the mtime of the file
312
313
  #
313
314
  def mtime_of(file)
314
- File.mtime(file).send(HIGH_PRECISION_SUPPORTED ? :to_f : :to_i)
315
+ File.lstat(file).mtime.send(HIGH_PRECISION_SUPPORTED ? :to_f : :to_i)
315
316
  end
316
317
  end
317
318
  end
@@ -1,3 +1,3 @@
1
1
  module Listen
2
- VERSION = '0.4.2'
2
+ VERSION = '0.4.7'
3
3
  end
@@ -193,6 +193,25 @@ describe Listen::DirectoryRecord do
193
193
  it 'returns nil when the passed path is not inside the base-directory' do
194
194
  subject.relative_to_base('/tmp/some_random_path').should be_nil
195
195
  end
196
+
197
+ context 'when containing regexp characters in the base directory' do
198
+ before do
199
+ fixtures do |path|
200
+ mkdir 'a_directory$'
201
+ @dir = described_class.new(path + '/a_directory$')
202
+ @dir.build
203
+ end
204
+ end
205
+
206
+ it 'removes the path of the base-directory from the passed path' do
207
+ path = 'dir/to/app/file.rb'
208
+ @dir.relative_to_base(File.join(@dir.directory, path)).should eq path
209
+ end
210
+
211
+ it 'returns nil when the passed path is not inside the base-directory' do
212
+ @dir.relative_to_base('/tmp/some_random_path').should be_nil
213
+ end
214
+ end
196
215
  end
197
216
 
198
217
  describe '#fetch_changes' do
@@ -385,7 +404,7 @@ describe Listen::DirectoryRecord do
385
404
  end
386
405
  end
387
406
 
388
- context '#27 - when a file is created and then checked for modifications at the same second' do
407
+ context 'when a file is created and then checked for modifications at the same second - #27' do
389
408
  # This issue was the result of checking a file for content changes when
390
409
  # the mtime and the checking time are the same. In this case there
391
410
  # is no checksum saved, so the file was reported as being changed.
@@ -1030,5 +1049,90 @@ describe Listen::DirectoryRecord do
1030
1049
  end
1031
1050
  end
1032
1051
  end
1052
+
1053
+ context 'within a directory containing unreadble paths - #32' do
1054
+ it 'detects changes more than a second apart' do
1055
+ fixtures do |path|
1056
+ touch 'unreadable_file.txt'
1057
+ chmod 000, 'unreadable_file.txt'
1058
+
1059
+ modified, added, removed = changes(path) do
1060
+ sleep 1.1
1061
+ touch 'unreadable_file.txt'
1062
+ end
1063
+
1064
+ added.should be_empty
1065
+ modified.should =~ %w(unreadable_file.txt)
1066
+ removed.should be_empty
1067
+ end
1068
+ end
1069
+
1070
+ context 'with multiple changes within the same second' do
1071
+ before { ensure_same_second }
1072
+
1073
+ it 'does not detect changes even if content changes', :unless => described_class::HIGH_PRECISION_SUPPORTED do
1074
+ fixtures do |path|
1075
+ touch 'unreadable_file.txt'
1076
+
1077
+ modified, added, removed = changes(path) do
1078
+ open('unreadable_file.txt', 'w') { |f| f.write('foo') }
1079
+ chmod 000, 'unreadable_file.txt'
1080
+ end
1081
+
1082
+ added.should be_empty
1083
+ modified.should be_empty
1084
+ removed.should be_empty
1085
+ end
1086
+ end
1087
+ end
1088
+ end
1089
+
1090
+ context 'within a directory containing a removed file - #39' do
1091
+ it 'does not raise an exception when hashing a removed file' do
1092
+
1093
+ # simulate a race condition where the file is removed after the
1094
+ # change event is tracked, but before the hash is calculated
1095
+ Digest::SHA1.should_receive(:file).and_raise(Errno::ENOENT)
1096
+
1097
+ lambda {
1098
+ fixtures do |path|
1099
+ file = 'removed_file.txt'
1100
+ touch file
1101
+ changes(path) { touch file }
1102
+ end
1103
+ }.should_not raise_error(Errno::ENOENT)
1104
+ end
1105
+ end
1106
+
1107
+ context 'with symlinks' do
1108
+ it 'looks at symlinks not their targets' do
1109
+ fixtures do |path|
1110
+ touch 'target'
1111
+ symlink 'target', 'symlink'
1112
+
1113
+ record = described_class.new(path)
1114
+ record.build
1115
+
1116
+ sleep 1
1117
+ touch 'target'
1118
+
1119
+ record.fetch_changes([path], :relative_paths => true)[:modified].should == ['target']
1120
+ end
1121
+ end
1122
+
1123
+ it 'handles broken symlinks' do
1124
+ fixtures do |path|
1125
+ symlink 'target', 'symlink'
1126
+
1127
+ record = described_class.new(path)
1128
+ record.build
1129
+
1130
+ sleep 1
1131
+ rm 'symlink'
1132
+ symlink 'new-target', 'symlink'
1133
+ record.fetch_changes([path], :relative_paths => true)
1134
+ end
1135
+ end
1136
+ end
1033
1137
  end
1034
1138
  end
@@ -1,14 +1,16 @@
1
1
  require 'listen'
2
2
 
3
- ENV["TEST_LATENCY"] ||= "0.1"
3
+ ENV["TEST_LATENCY"] ||= "0.25"
4
4
 
5
5
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
6
6
 
7
7
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
8
8
  RSpec.configure do |config|
9
+ config.color_enabled = true
10
+ config.order = :random
11
+ config.filter_run :focus => true
9
12
  config.treat_symbols_as_metadata_keys_with_true_values = true
10
13
  config.run_all_when_everything_filtered = true
11
- config.filter_run :focus
12
14
  end
13
15
 
14
16
  def test_latency
metadata CHANGED
@@ -1,68 +1,62 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sass
3
- version: !ruby/object:Gem::Version
4
- hash: 43
5
- prerelease: false
6
- segments:
7
- - 3
8
- - 1
9
- - 20
10
- version: 3.1.20
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.1.21
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Nathan Weizenbaum
14
9
  - Chris Eppstein
15
10
  - Hampton Catlin
16
11
  autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
-
20
- date: 2012-06-29 00:00:00 -07:00
21
- default_executable:
22
- dependencies:
23
- - !ruby/object:Gem::Dependency
14
+ date: 2012-08-11 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
24
17
  name: yard
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
27
19
  none: false
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- hash: 13
32
- segments:
33
- - 0
34
- - 5
35
- - 3
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
36
23
  version: 0.5.3
37
24
  type: :development
38
- version_requirements: *id001
39
- - !ruby/object:Gem::Dependency
40
- name: maruku
41
25
  prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: !ruby/object:Gem::Requirement
43
27
  none: false
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- hash: 25
48
- segments:
49
- - 0
50
- - 5
51
- - 9
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: 0.5.3
32
+ - !ruby/object:Gem::Dependency
33
+ name: maruku
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
52
39
  version: 0.5.9
53
40
  type: :development
54
- version_requirements: *id002
55
- description: " Sass makes CSS fun again. Sass is an extension of CSS3, adding\n nested rules, variables, mixins, selector inheritance, and more.\n It's translated to well-formatted, standard CSS using the\n command line tool or a web-framework plugin.\n"
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.5.9
48
+ description: ! " Sass makes CSS fun again. Sass is an extension of CSS3, adding\n
49
+ \ nested rules, variables, mixins, selector inheritance, and more.\n It's
50
+ translated to well-formatted, standard CSS using the\n command line tool or
51
+ a web-framework plugin.\n"
56
52
  email: sass-lang@googlegroups.com
57
- executables:
53
+ executables:
58
54
  - sass
59
55
  - sass-convert
60
56
  - scss
61
57
  extensions: []
62
-
63
58
  extra_rdoc_files: []
64
-
65
- files:
59
+ files:
66
60
  - rails/init.rb
67
61
  - lib/sass.rb
68
62
  - lib/sass/cache_stores.rb
@@ -313,47 +307,36 @@ files:
313
307
  - .yardopts
314
308
  - README.md
315
309
  - VERSION_NAME
310
+ - VERSION_DATE
316
311
  - REVISION
317
312
  - MIT-LICENSE
318
313
  - VERSION
319
314
  - CONTRIBUTING
320
- has_rdoc: false
321
315
  homepage: http://sass-lang.com/
322
316
  licenses: []
323
-
324
317
  post_install_message:
325
318
  rdoc_options: []
326
-
327
- require_paths:
319
+ require_paths:
328
320
  - lib
329
- required_ruby_version: !ruby/object:Gem::Requirement
321
+ required_ruby_version: !ruby/object:Gem::Requirement
330
322
  none: false
331
- requirements:
332
- - - ">="
333
- - !ruby/object:Gem::Version
334
- hash: 57
335
- segments:
336
- - 1
337
- - 8
338
- - 7
323
+ requirements:
324
+ - - ! '>='
325
+ - !ruby/object:Gem::Version
339
326
  version: 1.8.7
340
- required_rubygems_version: !ruby/object:Gem::Requirement
327
+ required_rubygems_version: !ruby/object:Gem::Requirement
341
328
  none: false
342
- requirements:
343
- - - ">="
344
- - !ruby/object:Gem::Version
345
- hash: 3
346
- segments:
347
- - 0
348
- version: "0"
329
+ requirements:
330
+ - - ! '>='
331
+ - !ruby/object:Gem::Version
332
+ version: '0'
349
333
  requirements: []
350
-
351
334
  rubyforge_project: sass
352
- rubygems_version: 1.3.7
335
+ rubygems_version: 1.8.24
353
336
  signing_key:
354
337
  specification_version: 3
355
338
  summary: A powerful but elegant CSS compiler that makes CSS fun again.
356
- test_files:
339
+ test_files:
357
340
  - test/sass/engine_test.rb
358
341
  - test/sass/functions_test.rb
359
342
  - test/sass/extend_test.rb