sass 3.3.0.alpha.93 → 3.3.0.alpha.101

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/REVISION +1 -1
  2. data/VERSION +1 -1
  3. data/VERSION_DATE +1 -1
  4. data/bin/sass +2 -1
  5. data/bin/sass-convert +2 -1
  6. data/bin/scss +2 -1
  7. data/lib/sass/cache_stores/chain.rb +1 -1
  8. data/lib/sass/cache_stores/filesystem.rb +0 -1
  9. data/lib/sass/engine.rb +7 -1
  10. data/lib/sass/exec.rb +1 -0
  11. data/lib/sass/importers/filesystem.rb +1 -1
  12. data/lib/sass/media.rb +1 -4
  13. data/lib/sass/plugin/compiler.rb +1 -1
  14. data/lib/sass/script/funcall.rb +43 -8
  15. data/lib/sass/script/functions.rb +8 -16
  16. data/lib/sass/script/lexer.rb +0 -2
  17. data/lib/sass/script/parser.rb +26 -25
  18. data/lib/sass/scss/parser.rb +13 -1
  19. data/lib/sass/selector/simple_sequence.rb +1 -1
  20. data/lib/sass/tree/comment_node.rb +2 -2
  21. data/lib/sass/tree/visitors/cssize.rb +10 -1
  22. data/lib/sass/tree/visitors/perform.rb +4 -2
  23. data/lib/sass/util.rb +54 -1
  24. data/lib/sass/util/multibyte_string_scanner.rb +29 -8
  25. data/test/sass/engine_test.rb +20 -4
  26. data/test/sass/extend_test.rb +15 -0
  27. data/test/sass/functions_test.rb +20 -1
  28. data/test/sass/script_test.rb +5 -1
  29. data/vendor/listen/CHANGELOG.md +76 -2
  30. data/vendor/listen/CONTRIBUTING.md +38 -0
  31. data/vendor/listen/Gemfile +8 -1
  32. data/vendor/listen/Guardfile +1 -1
  33. data/vendor/listen/LICENSE +1 -1
  34. data/vendor/listen/README.md +8 -5
  35. data/vendor/listen/lib/listen.rb +7 -5
  36. data/vendor/listen/lib/listen/adapter.rb +76 -29
  37. data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
  38. data/vendor/listen/lib/listen/adapters/darwin.rb +11 -10
  39. data/vendor/listen/lib/listen/adapters/linux.rb +33 -30
  40. data/vendor/listen/lib/listen/adapters/polling.rb +2 -1
  41. data/vendor/listen/lib/listen/adapters/windows.rb +27 -21
  42. data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
  43. data/vendor/listen/lib/listen/directory_record.rb +63 -10
  44. data/vendor/listen/lib/listen/listener.rb +22 -0
  45. data/vendor/listen/lib/listen/multi_listener.rb +22 -0
  46. data/vendor/listen/lib/listen/version.rb +1 -1
  47. data/vendor/listen/listen.gemspec +0 -4
  48. data/vendor/listen/spec/listen/adapter_spec.rb +45 -4
  49. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  50. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +6 -0
  51. data/vendor/listen/spec/listen/adapters/linux_spec.rb +6 -0
  52. data/vendor/listen/spec/listen/adapters/windows_spec.rb +7 -1
  53. data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
  54. data/vendor/listen/spec/listen/directory_record_spec.rb +91 -4
  55. data/vendor/listen/spec/listen/listener_spec.rb +14 -0
  56. data/vendor/listen/spec/listen/multi_listener_spec.rb +19 -1
  57. data/vendor/listen/spec/spec_helper.rb +6 -3
  58. data/vendor/listen/spec/support/adapter_helper.rb +125 -212
  59. data/vendor/listen/spec/support/listeners_helper.rb +13 -1
  60. data/vendor/listen/spec/support/platform_helper.rb +4 -0
  61. metadata +11 -6
@@ -18,7 +18,11 @@ module Listen
18
18
  # Defines the used precision based on the type of mtime returned by the
19
19
  # system (whether its in milliseconds or just seconds)
20
20
  #
21
- HIGH_PRECISION_SUPPORTED = File.mtime(__FILE__).to_f.to_s[-2..-1] != '.0'
21
+ begin
22
+ HIGH_PRECISION_SUPPORTED = File.mtime(__FILE__).to_f.to_s[-2..-1] != '.0'
23
+ rescue
24
+ HIGH_PRECISION_SUPPORTED = false
25
+ end
22
26
 
23
27
  # Data structure used to save meta data about a path
24
28
  #
@@ -88,6 +92,17 @@ module Listen
88
92
  @ignoring_patterns.merge(regexps)
89
93
  end
90
94
 
95
+ # Replaces ignoring patterns in the record.
96
+ #
97
+ # @example Ignore only these paths
98
+ # ignore! %r{^ignored/path/}, /man/
99
+ #
100
+ # @param [Regexp] regexp a pattern for ignoring paths
101
+ #
102
+ def ignore!(*regexps)
103
+ @ignoring_patterns.replace(regexps)
104
+ end
105
+
91
106
  # Adds filtering patterns to the listener.
92
107
  #
93
108
  # @example Filter some files
@@ -99,6 +114,17 @@ module Listen
99
114
  @filtering_patterns.merge(regexps)
100
115
  end
101
116
 
117
+ # Replaces filtering patterns in the listener.
118
+ #
119
+ # @example Filter only these files
120
+ # ignore /\.txt$/, /.*\.zip/
121
+ #
122
+ # @param [Regexp] regexp a pattern for filtering paths
123
+ #
124
+ def filter!(*regexps)
125
+ @filtering_patterns.replace(regexps)
126
+ end
127
+
102
128
  # Returns whether a path should be ignored or not.
103
129
  #
104
130
  # @param [String] path the path to test.
@@ -163,6 +189,7 @@ module Listen
163
189
  #
164
190
  def relative_to_base(path)
165
191
  return nil unless path[@directory]
192
+ path = path.force_encoding("BINARY") if path.respond_to?(:force_encoding)
166
193
  path.sub(%r{^#{Regexp.quote(@directory)}#{File::SEPARATOR}?}, '')
167
194
  end
168
195
 
@@ -198,8 +225,11 @@ module Listen
198
225
 
199
226
  # First check if we are in the same second (to update checksums)
200
227
  # before checking the time difference
201
- if (meta_data.mtime.to_i == new_mtime.to_i && content_modified?(path)) || meta_data.mtime < new_mtime
202
- # Update the meta data of the files
228
+ if (meta_data.mtime.to_i == new_mtime.to_i && content_modified?(path)) || meta_data.mtime < new_mtime
229
+ # Update the sha1 checksum of the file
230
+ insert_sha1_checksum(path)
231
+
232
+ # Update the meta data of the file
203
233
  meta_data.mtime = new_mtime
204
234
  @paths[directory][basename] = meta_data
205
235
 
@@ -247,17 +277,40 @@ module Listen
247
277
 
248
278
  # Returns whether or not a file's content has been modified by
249
279
  # comparing the SHA1-checksum to a stored one.
280
+ # Ensure that the SHA1-checksum is inserted to the sha1_checksums
281
+ # array for later comparaison if false.
250
282
  #
251
283
  # @param [String] path the file path
252
284
  #
253
285
  def content_modified?(path)
254
- sha1_checksum = Digest::SHA1.file(path).to_s
255
- return false if @sha1_checksums[path] == sha1_checksum
256
- @sha1_checksums.key?(path)
257
- rescue Errno::EACCES, Errno::ENOENT
258
- false
259
- ensure
260
- @sha1_checksums[path] = sha1_checksum if sha1_checksum
286
+ @sha1_checksum = sha1_checksum(path)
287
+ if @sha1_checksums[path] == @sha1_checksum || !@sha1_checksums.key?(path)
288
+ insert_sha1_checksum(path)
289
+ false
290
+ else
291
+ true
292
+ end
293
+ end
294
+
295
+ # Inserts a SHA1-checksum path in @SHA1-checksums hash.
296
+ #
297
+ # @param [String] path the SHA1-checksum path to insert in @sha1_checksums.
298
+ #
299
+ def insert_sha1_checksum(path)
300
+ if @sha1_checksum ||= sha1_checksum(path)
301
+ @sha1_checksums[path] = @sha1_checksum
302
+ @sha1_checksum = nil
303
+ end
304
+ end
305
+
306
+ # Returns the SHA1-checksum for the file path.
307
+ #
308
+ # @param [String] path the file path
309
+ #
310
+ def sha1_checksum(path)
311
+ Digest::SHA1.file(path).to_s
312
+ rescue Errno::EACCES, Errno::ENOENT, Errno::ENXIO, Errno::EOPNOTSUPP
313
+ nil
261
314
  end
262
315
 
263
316
  # Traverses the base directory looking for paths that should
@@ -93,6 +93,17 @@ module Listen
93
93
  self
94
94
  end
95
95
 
96
+ # Replaces ignoring patterns in the listener.
97
+ #
98
+ # @param (see Listen::DirectoryRecord#ignore!)
99
+ #
100
+ # @return [Listen::Listener] the listener
101
+ #
102
+ def ignore!(*regexps)
103
+ @directory_record.ignore!(*regexps)
104
+ self
105
+ end
106
+
96
107
  # Adds filtering patterns to the listener.
97
108
  #
98
109
  # @param (see Listen::DirectoryRecord#filter)
@@ -104,6 +115,17 @@ module Listen
104
115
  self
105
116
  end
106
117
 
118
+ # Replacing filtering patterns in the listener.
119
+ #
120
+ # @param (see Listen::DirectoryRecord#filter!)
121
+ #
122
+ # @return [Listen::Listener] the listener
123
+ #
124
+ def filter!(*regexps)
125
+ @directory_record.filter!(*regexps)
126
+ self
127
+ end
128
+
107
129
  # Sets the latency for the adapter. This is a helper method
108
130
  # to simplify changing the latency directly from the listener.
109
131
  #
@@ -65,6 +65,17 @@ module Listen
65
65
  self
66
66
  end
67
67
 
68
+ # Replaces ignored paths in the listener.
69
+ #
70
+ # @param (see Listen::DirectoryRecord#ignore!)
71
+ #
72
+ # @return [Listen::Listener] the listener
73
+ #
74
+ def ignore!(*paths)
75
+ @directories_records.each { |r| r.ignore!(*paths) }
76
+ self
77
+ end
78
+
68
79
  # Adds file filters to the listener.
69
80
  #
70
81
  # @param (see Listen::DirectoryRecord#filter)
@@ -76,6 +87,17 @@ module Listen
76
87
  self
77
88
  end
78
89
 
90
+ # Replaces file filters in the listener.
91
+ #
92
+ # @param (see Listen::DirectoryRecord#filter!)
93
+ #
94
+ # @return [Listen::Listener] the listener
95
+ #
96
+ def filter!(*regexps)
97
+ @directories_records.each { |r| r.filter!(*regexps) }
98
+ self
99
+ end
100
+
79
101
  # Runs the callback passing it the changes if there are any.
80
102
  #
81
103
  # @param (see Listen::DirectoryRecord#fetch_changes)
@@ -1,3 +1,3 @@
1
1
  module Listen
2
- VERSION = '0.4.7'
2
+ VERSION = '0.7.2'
3
3
  end
@@ -15,10 +15,6 @@ Gem::Specification.new do |s|
15
15
  s.required_rubygems_version = '>= 1.3.6'
16
16
  s.rubyforge_project = 'listen'
17
17
 
18
- s.add_dependency 'rb-fsevent', '~> 0.9.1'
19
- s.add_dependency 'rb-inotify', '~> 0.8.8'
20
- s.add_dependency 'rb-fchange', '~> 0.0.5'
21
-
22
18
  s.add_development_dependency 'bundler'
23
19
 
24
20
  s.files = Dir.glob('{lib}/**/*') + %w[CHANGELOG.md LICENSE README.md]
@@ -21,6 +21,7 @@ describe Listen::Adapter do
21
21
  before do
22
22
  Listen::Adapters::Darwin.stub(:usable_and_works?) { false }
23
23
  Listen::Adapters::Linux.stub(:usable_and_works?) { false }
24
+ Listen::Adapters::BSD.stub(:usable_and_works?) { false }
24
25
  Listen::Adapters::Windows.stub(:usable_and_works?) { false }
25
26
  end
26
27
 
@@ -31,14 +32,28 @@ describe Listen::Adapter do
31
32
  described_class.select_and_initialize('dir')
32
33
  end
33
34
 
34
- it "warns with the default polling fallback message" do
35
- Kernel.should_receive(:warn).with(Listen::Adapter::POLLING_FALLBACK_MESSAGE)
35
+ it 'warns with the default polling fallback message' do
36
+ Kernel.should_receive(:warn).with(/#{Listen::Adapter::POLLING_FALLBACK_MESSAGE}/)
36
37
  described_class.select_and_initialize('dir')
37
38
  end
38
39
 
40
+ context 'when the dependencies of an adapter are not satisfied' do
41
+ before do
42
+ Listen::Adapters::Darwin.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
43
+ Listen::Adapters::Linux.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
44
+ Listen::Adapters::BSD.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
45
+ Listen::Adapters::Windows.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
46
+ end
47
+
48
+ it 'invites the user to satisfy the dependencies of the adapter in the warning' do
49
+ Kernel.should_receive(:warn).with(/#{Listen::Adapter::MISSING_DEPENDENCY_MESSAGE}/)
50
+ described_class.select_and_initialize('dir')
51
+ end
52
+ end
53
+
39
54
  context "with custom polling_fallback_message option" do
40
55
  it "warns with the custom polling fallback message" do
41
- Kernel.should_receive(:warn).with('custom')
56
+ Kernel.should_receive(:warn).with(/custom/)
42
57
  described_class.select_and_initialize('dir', :polling_fallback_message => 'custom')
43
58
  end
44
59
  end
@@ -83,6 +98,22 @@ describe Listen::Adapter do
83
98
  end
84
99
  end
85
100
 
101
+ context "on BSD" do
102
+ before { Listen::Adapters::BSD.stub(:usable_and_works?) { true } }
103
+
104
+ it "uses Listen::Adapters::BSD" do
105
+ Listen::Adapters::BSD.should_receive(:new).with('dir', {})
106
+ described_class.select_and_initialize('dir')
107
+ end
108
+
109
+ context 'when the use of the polling adapter is forced' do
110
+ it 'uses Listen::Adapters::Polling' do
111
+ Listen::Adapters::Polling.should_receive(:new).with('dir', {})
112
+ described_class.select_and_initialize('dir', :force_polling => true)
113
+ end
114
+ end
115
+ end
116
+
86
117
  context "on Windows" do
87
118
  before { Listen::Adapters::Windows.stub(:usable_and_works?) { true } }
88
119
 
@@ -100,8 +131,18 @@ describe Listen::Adapter do
100
131
  end
101
132
  end
102
133
 
103
- [Listen::Adapters::Darwin, Listen::Adapters::Linux, Listen::Adapters::Windows].each do |adapter_class|
134
+ [Listen::Adapters::Darwin, Listen::Adapters::Linux,
135
+ Listen::Adapters::BSD, Listen::Adapters::Windows].each do
136
+ |adapter_class|
104
137
  if adapter_class.usable?
138
+ describe '.usable?' do
139
+ it 'checks the dependencies' do
140
+ adapter_class.should_receive(:load_depenencies)
141
+ adapter_class.should_receive(:dependencies_loaded?)
142
+ adapter_class.usable?
143
+ end
144
+ end
145
+
105
146
  describe '.usable_and_works?' do
106
147
  it 'checks if the adapter is usable' do
107
148
  adapter_class.stub(:works?)
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Listen::Adapters::BSD do
4
+ if bsd?
5
+ if Listen::Adapters::BSD.usable?
6
+ it "is usable on BSD" do
7
+ described_class.should be_usable
8
+ end
9
+
10
+ it_should_behave_like 'a filesystem adapter'
11
+ it_should_behave_like 'an adapter that call properly listener#on_change'
12
+ else
13
+ it "isn't usable on BSD with #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}" do
14
+ described_class.should_not be_usable
15
+ end
16
+ end
17
+ end
18
+
19
+ if linux?
20
+ it "isn't usable on Linux" do
21
+ described_class.should_not be_usable
22
+ end
23
+ end
24
+
25
+ if mac?
26
+ it "isn't usable on Mac OS X" do
27
+ described_class.should_not be_usable
28
+ end
29
+ end
30
+
31
+ if windows?
32
+ it "isn't usable on Windows" do
33
+ described_class.should_not be_usable
34
+ end
35
+ end
36
+ end
@@ -28,4 +28,10 @@ describe Listen::Adapters::Darwin do
28
28
  described_class.should_not be_usable
29
29
  end
30
30
  end
31
+
32
+ if bsd?
33
+ it "isn't usable on BSD" do
34
+ described_class.should_not be_usable
35
+ end
36
+ end
31
37
  end
@@ -27,6 +27,12 @@ describe Listen::Adapters::Linux do
27
27
  end
28
28
  end
29
29
 
30
+ if bsd?
31
+ it "isn't usable on BSD" do
32
+ described_class.should_not be_usable
33
+ end
34
+ end
35
+
30
36
  if mac?
31
37
  it "isn't usable on Mac OS X" do
32
38
  described_class.should_not be_usable
@@ -7,7 +7,7 @@ describe Listen::Adapters::Windows do
7
7
  end
8
8
 
9
9
  it_should_behave_like 'a filesystem adapter'
10
- it_should_behave_like 'an adapter that call properly listener#on_change', :recursive => true, :adapter => :windows
10
+ it_should_behave_like 'an adapter that call properly listener#on_change'
11
11
  end
12
12
 
13
13
  if mac?
@@ -16,6 +16,12 @@ describe Listen::Adapters::Windows do
16
16
  end
17
17
  end
18
18
 
19
+ if bsd?
20
+ it "isn't usable on BSD" do
21
+ described_class.should_not be_usable
22
+ end
23
+ end
24
+
19
25
  if linux?
20
26
  it "isn't usable on Linux" do
21
27
  described_class.should_not be_usable
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe Listen::DependencyManager do
4
+ let(:dependency) { Listen::DependencyManager::Dependency.new('listen', '~> 0.0.1') }
5
+
6
+ subject { Class.new { extend Listen::DependencyManager } }
7
+
8
+ before { described_class.clear_loaded }
9
+
10
+ describe '.add_loaded' do
11
+ it 'adds a dependency to the list of loaded dependencies' do
12
+ described_class.add_loaded dependency
13
+ described_class.already_loaded?(dependency).should be_true
14
+ end
15
+ end
16
+
17
+ describe '.already_loaded?' do
18
+ it 'returns false when a dependency is not in the list of loaded dependencies' do
19
+ described_class.already_loaded?(dependency).should be_false
20
+ end
21
+
22
+ it 'returns true when a dependency is in the list of loaded dependencies' do
23
+ described_class.add_loaded dependency
24
+ described_class.already_loaded?(dependency).should be_true
25
+ end
26
+ end
27
+
28
+ describe '.clear_loaded' do
29
+ it 'clears the whole list of loaded dependencies' do
30
+ described_class.add_loaded dependency
31
+ described_class.already_loaded?(dependency).should be_true
32
+ described_class.clear_loaded
33
+ described_class.already_loaded?(dependency).should be_false
34
+ end
35
+ end
36
+
37
+ describe '#dependency' do
38
+ it 'registers a new dependency for the managed class' do
39
+ subject.dependency 'listen', '~> 0.0.1'
40
+ subject.dependencies_loaded?.should be_false
41
+ end
42
+ end
43
+
44
+ describe '#load_depenencies' do
45
+ before { subject.dependency 'listen', '~> 0.0.1' }
46
+
47
+ context 'when dependencies can be loaded' do
48
+ before { subject.stub(:gem, :require) }
49
+
50
+ it 'loads all the registerd dependencies' do
51
+ subject.load_depenencies
52
+ subject.dependencies_loaded?.should be_true
53
+ end
54
+ end
55
+
56
+ context 'when dependencies can not be loaded' do
57
+ it 'raises an error' do
58
+ expect {
59
+ subject.load_depenencies
60
+ }.to raise_error(described_class::Error)
61
+ end
62
+
63
+ context 'when running under bundler' do
64
+ before { subject.should_receive(:running_under_bundler?).and_return(true) }
65
+
66
+ it 'includes the Gemfile declaration to satisfy the dependency' do
67
+ begin
68
+ subject.load_depenencies
69
+ rescue described_class::Error => e
70
+ e.message.should include("gem 'listen', '~> 0.0.1'")
71
+ end
72
+ end
73
+ end
74
+
75
+ context 'when not running under bundler' do
76
+ before { subject.should_receive(:running_under_bundler?).and_return(false) }
77
+
78
+ it 'includes the command to install the dependency' do
79
+ begin
80
+ subject.load_depenencies
81
+ rescue described_class::Error => e
82
+ e.message.should include("gem install --version '~> 0.0.1' listen")
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '#dependencies_loaded?' do
90
+ it 'return false when dependencies are not loaded' do
91
+ subject.dependency 'listen', '~> 0.0.1'
92
+ subject.dependencies_loaded?.should be_false
93
+ end
94
+
95
+ it 'return true when dependencies are loaded' do
96
+ subject.stub(:gem, :require)
97
+
98
+ subject.dependency 'listen', '~> 0.0.1'
99
+ subject.load_depenencies
100
+ subject.dependencies_loaded?.should be_true
101
+ end
102
+
103
+ it 'return true when there are no dependencies to load' do
104
+ subject.dependencies_loaded?.should be_true
105
+ end
106
+ end
107
+ end