sass 3.2.0.alpha.102 → 3.2.0.alpha.103
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/REVISION +1 -1
- data/VERSION +1 -1
- metadata +5 -41
- data/vendor/fssm/Gemfile +0 -3
- data/vendor/fssm/LICENSE +0 -20
- data/vendor/fssm/README.markdown +0 -83
- data/vendor/fssm/Rakefile +0 -11
- data/vendor/fssm/example.rb +0 -12
- data/vendor/fssm/ext/rakefile.rb +0 -14
- data/vendor/fssm/fssm.gemspec +0 -27
- data/vendor/fssm/lib/fssm.rb +0 -74
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
- data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
- data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
- data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
- data/vendor/fssm/lib/fssm/monitor.rb +0 -36
- data/vendor/fssm/lib/fssm/path.rb +0 -94
- data/vendor/fssm/lib/fssm/pathname.rb +0 -36
- data/vendor/fssm/lib/fssm/state/directory.rb +0 -75
- data/vendor/fssm/lib/fssm/state/file.rb +0 -24
- data/vendor/fssm/lib/fssm/support.rb +0 -87
- data/vendor/fssm/lib/fssm/tree.rb +0 -176
- data/vendor/fssm/lib/fssm/version.rb +0 -3
- data/vendor/fssm/profile/prof-cache.rb +0 -40
- data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
- data/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
- data/vendor/fssm/profile/prof-pathname.rb +0 -68
- data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
- data/vendor/fssm/profile/prof.html +0 -2379
- data/vendor/fssm/spec/count_down_latch.rb +0 -151
- data/vendor/fssm/spec/monitor_spec.rb +0 -202
- data/vendor/fssm/spec/path_spec.rb +0 -96
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -1,151 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
require 'thread'
|
5
|
-
|
6
|
-
class CountDownLatch
|
7
|
-
attr_reader :count
|
8
|
-
|
9
|
-
def initialize(to)
|
10
|
-
@count = to.to_i
|
11
|
-
raise ArgumentError, "cannot count down from negative integer" unless @count >= 0
|
12
|
-
@lock = Mutex.new
|
13
|
-
@condition = ConditionVariable.new
|
14
|
-
end
|
15
|
-
|
16
|
-
def count_down
|
17
|
-
@lock.synchronize do
|
18
|
-
@count -= 1 if @count > 0
|
19
|
-
@condition.broadcast if @count == 0
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def wait
|
24
|
-
@lock.synchronize do
|
25
|
-
@condition.wait(@lock) while @count > 0
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
if $0 == __FILE__
|
31
|
-
require 'test/unit'
|
32
|
-
|
33
|
-
class CountDownLatchTest < Test::Unit::TestCase
|
34
|
-
def test_requires_positive_count
|
35
|
-
assert_raise(ArgumentError) { CountDownLatch.new(-1) }
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_basic_latch_usage
|
39
|
-
latch = CountDownLatch.new(1)
|
40
|
-
name = "foo"
|
41
|
-
Thread.new do
|
42
|
-
name = "bar"
|
43
|
-
latch.count_down
|
44
|
-
end
|
45
|
-
latch.wait
|
46
|
-
assert_equal(0, latch.count)
|
47
|
-
assert_equal("bar", name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_basic_latch_usage_inverted
|
51
|
-
latch = CountDownLatch.new(1)
|
52
|
-
name = "foo"
|
53
|
-
Thread.new do
|
54
|
-
latch.wait
|
55
|
-
assert_equal(0, latch.count)
|
56
|
-
assert_equal("bar", name)
|
57
|
-
end
|
58
|
-
name = "bar"
|
59
|
-
latch.count_down
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_count_down_from_zero_skips_wait
|
63
|
-
latch = CountDownLatch.new(0)
|
64
|
-
latch.wait
|
65
|
-
assert_equal(0, latch.count)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_count_down_twice_with_thread
|
69
|
-
latch = CountDownLatch.new(2)
|
70
|
-
name = "foo"
|
71
|
-
Thread.new do
|
72
|
-
latch.count_down
|
73
|
-
name = "bar"
|
74
|
-
latch.count_down
|
75
|
-
end
|
76
|
-
latch.wait
|
77
|
-
assert_equal(0, latch.count)
|
78
|
-
assert_equal("bar", name)
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_count_down_twice_with_two_parallel_threads
|
82
|
-
latch = CountDownLatch.new(2)
|
83
|
-
name = "foo"
|
84
|
-
Thread.new { latch.count_down }
|
85
|
-
Thread.new do
|
86
|
-
name = "bar"
|
87
|
-
latch.count_down
|
88
|
-
end
|
89
|
-
latch.wait
|
90
|
-
assert_equal(0, latch.count)
|
91
|
-
assert_equal("bar", name)
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_count_down_twice_with_two_chained_threads
|
95
|
-
latch = CountDownLatch.new(2)
|
96
|
-
name = "foo"
|
97
|
-
Thread.new do
|
98
|
-
latch.count_down
|
99
|
-
Thread.new do
|
100
|
-
name = "bar"
|
101
|
-
latch.count_down
|
102
|
-
end
|
103
|
-
end
|
104
|
-
latch.wait
|
105
|
-
assert_equal(0, latch.count)
|
106
|
-
assert_equal("bar", name)
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_count_down_with_multiple_waiters
|
110
|
-
proceed_latch = CountDownLatch.new(2)
|
111
|
-
check_latch = CountDownLatch.new(2)
|
112
|
-
results = {}
|
113
|
-
Thread.new do
|
114
|
-
proceed_latch.wait
|
115
|
-
results[:first] = 1
|
116
|
-
check_latch.count_down
|
117
|
-
end
|
118
|
-
Thread.new do
|
119
|
-
proceed_latch.wait
|
120
|
-
results[:second] = 2
|
121
|
-
check_latch.count_down
|
122
|
-
end
|
123
|
-
assert_equal({}, results)
|
124
|
-
proceed_latch.count_down
|
125
|
-
proceed_latch.count_down
|
126
|
-
check_latch.wait
|
127
|
-
assert_equal(0, proceed_latch.count)
|
128
|
-
assert_equal(0, check_latch.count)
|
129
|
-
assert_equal({:first => 1, :second => 2}, results)
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_interleaved_latches
|
133
|
-
change_1_latch = CountDownLatch.new(1)
|
134
|
-
check_latch = CountDownLatch.new(1)
|
135
|
-
change_2_latch = CountDownLatch.new(1)
|
136
|
-
name = "foo"
|
137
|
-
Thread.new do
|
138
|
-
name = "bar"
|
139
|
-
change_1_latch.count_down
|
140
|
-
check_latch.wait
|
141
|
-
name = "man"
|
142
|
-
change_2_latch.count_down
|
143
|
-
end
|
144
|
-
change_1_latch.wait
|
145
|
-
assert_equal("bar", name)
|
146
|
-
check_latch.count_down
|
147
|
-
change_2_latch.wait
|
148
|
-
assert_equal("man", name)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
@@ -1,202 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'count_down_latch'
|
4
|
-
require 'fileutils'
|
5
|
-
require 'tempfile'
|
6
|
-
|
7
|
-
module FSSM::MonitorSpecHelpers
|
8
|
-
def create_tmp_dir
|
9
|
-
@tmp_dir = FSSM::Pathname.for(Dir.mktmpdir).realpath.to_s
|
10
|
-
FileUtils.cp_r File.join(File.dirname(__FILE__), 'root'), @tmp_dir
|
11
|
-
# Because git does not track empty directories, create one ourselves.
|
12
|
-
FileUtils.mkdir_p @tmp_dir + '/root/yawn'
|
13
|
-
@tmp_dir
|
14
|
-
end
|
15
|
-
|
16
|
-
def remove_tmp_dir
|
17
|
-
FileUtils.remove_entry @tmp_dir
|
18
|
-
end
|
19
|
-
|
20
|
-
def create_handler(type, latch)
|
21
|
-
lambda do |*args|
|
22
|
-
@handler_results[type] << args
|
23
|
-
latch.count_down
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def run_monitor(num_events_to_expect=0, options={})
|
28
|
-
event_latch = CountDownLatch.new(num_events_to_expect)
|
29
|
-
@handler_results = Hash.new { |hash, key| hash[key] = [] }
|
30
|
-
thread = Thread.new do
|
31
|
-
monitor = FSSM::Monitor.new(options)
|
32
|
-
monitor.path(@tmp_dir) do |p|
|
33
|
-
p.create(&create_handler(:create, event_latch))
|
34
|
-
p.update(&create_handler(:update, event_latch))
|
35
|
-
p.delete(&create_handler(:delete, event_latch))
|
36
|
-
end
|
37
|
-
monitor.run
|
38
|
-
end
|
39
|
-
sleep 1 # give time for monitor to start up
|
40
|
-
yield if block_given?
|
41
|
-
event_latch.wait
|
42
|
-
thread.kill
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "The File System State Monitor" do
|
47
|
-
describe "monitor" do
|
48
|
-
include FSSM::MonitorSpecHelpers
|
49
|
-
|
50
|
-
before do
|
51
|
-
create_tmp_dir
|
52
|
-
end
|
53
|
-
|
54
|
-
after do
|
55
|
-
remove_tmp_dir
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "with default options" do
|
59
|
-
it "should call create callback upon file creation" do
|
60
|
-
run_monitor(1) do
|
61
|
-
file = @tmp_dir + "/newfile.rb"
|
62
|
-
File.exists?(file).should be_false
|
63
|
-
FileUtils.touch file
|
64
|
-
end
|
65
|
-
@handler_results[:create].should == [[@tmp_dir, 'newfile.rb']]
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should call update callback upon file modification" do
|
69
|
-
run_monitor(1) do
|
70
|
-
FileUtils.touch @tmp_dir + '/root/file.rb'
|
71
|
-
end
|
72
|
-
@handler_results[:update].should == [[@tmp_dir, 'root/file.rb']]
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should call delete callback upon file deletion" do
|
76
|
-
run_monitor(1) do
|
77
|
-
FileUtils.rm @tmp_dir + "/root/file.rb"
|
78
|
-
end
|
79
|
-
@handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should call create and delete callbacks upon file renaming in the same directory" do
|
83
|
-
run_monitor(2) do
|
84
|
-
FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/root/old_file.rb"
|
85
|
-
end
|
86
|
-
@handler_results[:create].should == [[@tmp_dir, 'root/old_file.rb']]
|
87
|
-
@handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
|
88
|
-
@handler_results[:update].should == []
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should call create and delete callbacks upon file moving to another directory" do
|
92
|
-
run_monitor(2) do
|
93
|
-
FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/old_file.rb"
|
94
|
-
end
|
95
|
-
@handler_results[:create].should == [[@tmp_dir, 'old_file.rb']]
|
96
|
-
@handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
|
97
|
-
@handler_results[:update].should == []
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should not call callbacks upon directory operations" do
|
101
|
-
run_monitor do
|
102
|
-
FileUtils.mkdir @tmp_dir + "/another_yawn"
|
103
|
-
FileUtils.rmdir @tmp_dir + "/root/yawn"
|
104
|
-
end
|
105
|
-
@handler_results[:create].should == []
|
106
|
-
@handler_results[:delete].should == []
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "when configured to consider files and directories" do
|
111
|
-
it "should call create callback upon directory creation" do
|
112
|
-
run_monitor(1, :directories => true) do
|
113
|
-
FileUtils.mkdir @tmp_dir + "/another_yawn"
|
114
|
-
end
|
115
|
-
@handler_results[:create].should include([@tmp_dir, 'another_yawn', :directory])
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should call delete callback upon directory deletion" do
|
119
|
-
run_monitor(1, :directories => true) do
|
120
|
-
FileUtils.rmdir @tmp_dir + "/root/yawn"
|
121
|
-
end
|
122
|
-
@handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
|
123
|
-
end
|
124
|
-
|
125
|
-
it "should call create, update, and delete callbacks upon directory renaming in the same directory" do
|
126
|
-
run_monitor(3, :directories => true) do
|
127
|
-
FileUtils.mv @tmp_dir + "/root/yawn", @tmp_dir + "/root/old_yawn"
|
128
|
-
end
|
129
|
-
@handler_results[:create].should include([@tmp_dir, 'root/old_yawn', :directory])
|
130
|
-
@handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
|
131
|
-
@handler_results[:update].should include([@tmp_dir, 'root', :directory])
|
132
|
-
end
|
133
|
-
|
134
|
-
it "should call create, update, and delete callbacks upon directory moving to another directory" do
|
135
|
-
run_monitor(3, :directories => true) do
|
136
|
-
FileUtils.mv @tmp_dir + "/root/yawn", @tmp_dir + "/old_yawn"
|
137
|
-
end
|
138
|
-
@handler_results[:create].should include([@tmp_dir, 'old_yawn', :directory])
|
139
|
-
@handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
|
140
|
-
@handler_results[:update].should include([@tmp_dir, 'root', :directory])
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should call create, update, and delete callbacks upon file renaming in the same directory" do
|
144
|
-
run_monitor(3, :directories => true) do
|
145
|
-
FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/root/old_file.rb"
|
146
|
-
end
|
147
|
-
@handler_results[:create].should include([@tmp_dir, 'root/old_file.rb', :file])
|
148
|
-
@handler_results[:delete].should include([@tmp_dir, 'root/file.rb', :file])
|
149
|
-
@handler_results[:update].should include([@tmp_dir, 'root', :directory])
|
150
|
-
end
|
151
|
-
|
152
|
-
it "should call create, update, and delete callbacks upon file moving to another directory" do
|
153
|
-
run_monitor(3, :directories => true) do
|
154
|
-
FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/old_file.rb"
|
155
|
-
end
|
156
|
-
@handler_results[:create].should include([@tmp_dir, 'old_file.rb', :file])
|
157
|
-
@handler_results[:delete].should include([@tmp_dir, 'root/file.rb', :file])
|
158
|
-
@handler_results[:update].should include([@tmp_dir, 'root', :directory])
|
159
|
-
end
|
160
|
-
|
161
|
-
it "should call delete callbacks upon directory structure deletion, in reverse order" do
|
162
|
-
expected_delete_events = [
|
163
|
-
['root/yawn', :directory],
|
164
|
-
['root/moo/cow.txt', :file],
|
165
|
-
['root/moo', :directory],
|
166
|
-
['root/file.yml', :file],
|
167
|
-
['root/file.rb', :file],
|
168
|
-
['root/file.css', :file],
|
169
|
-
['root/duck/quack.txt', :file],
|
170
|
-
['root/duck', :directory],
|
171
|
-
['root', :directory]
|
172
|
-
]
|
173
|
-
run_monitor(expected_delete_events.size, :directories => true) do
|
174
|
-
FileUtils.rm_rf @tmp_dir + '/.'
|
175
|
-
end
|
176
|
-
@handler_results[:create].should == []
|
177
|
-
@handler_results[:delete].should == expected_delete_events.map { |(file, type)| [@tmp_dir, file, type] }
|
178
|
-
@handler_results[:update].should == []
|
179
|
-
end
|
180
|
-
|
181
|
-
it "should call create callbacks upon directory structure creation, in order" do
|
182
|
-
expected_create_events = [
|
183
|
-
['new_root', :directory],
|
184
|
-
['new_root/duck', :directory],
|
185
|
-
['new_root/duck/quack.txt', :file],
|
186
|
-
['new_root/file.css', :file],
|
187
|
-
['new_root/file.rb', :file],
|
188
|
-
['new_root/file.yml', :file],
|
189
|
-
['new_root/moo', :directory],
|
190
|
-
['new_root/moo/cow.txt', :file],
|
191
|
-
['new_root/yawn', :directory]
|
192
|
-
]
|
193
|
-
run_monitor(expected_create_events.size, :directories => true) do
|
194
|
-
FileUtils.cp_r @tmp_dir + '/root/.', @tmp_dir + '/new_root'
|
195
|
-
end
|
196
|
-
@handler_results[:create].should == expected_create_events.map { |(file, type)| [@tmp_dir, file, type] }
|
197
|
-
@handler_results[:delete].should == []
|
198
|
-
@handler_results[:update].should == []
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "The File System State Monitor" do
|
4
|
-
describe "paths" do
|
5
|
-
it "should accept a valid filesystem directory" do
|
6
|
-
lambda { FSSM::Path.new("#{@watch_root}") }.should_not raise_error
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should not accept an invalid filesystem directory" do
|
10
|
-
lambda { FSSM::Path.new('/does/not/exist/kthxbye') }.should raise_error
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should default the path to the current directory" do
|
14
|
-
path = FSSM::Path.new
|
15
|
-
here = Pathname.new('.').realpath
|
16
|
-
|
17
|
-
"#{here}".should == "#{path}"
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should accept an optional glob array parameter" do
|
21
|
-
path = FSSM::Path.new('.', ['**/*.yml'])
|
22
|
-
path.glob.should == ['**/*.yml']
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should accept an optional glob string parameter" do
|
26
|
-
path = FSSM::Path.new('.', '**/*.yml')
|
27
|
-
path.glob.should == ['**/*.yml']
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should accept an optional option parameter" do
|
31
|
-
lambda { FSSM::Path.new('.', '**/*.yml', :foo => :bar) }.should_not raise_error
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should default the glob to ['**/*']" do
|
35
|
-
path = FSSM::Path.new
|
36
|
-
path.glob.should == ['**/*']
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should accept a callback for update events" do
|
40
|
-
path = FSSM::Path.new
|
41
|
-
callback = lambda { |base, relative| return true }
|
42
|
-
path.update(&callback)
|
43
|
-
(path.update).should == callback
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should accept a callback for delete events" do
|
47
|
-
path = FSSM::Path.new
|
48
|
-
callback = lambda { |base, relative| return true }
|
49
|
-
path.delete(&callback)
|
50
|
-
(path.delete).should == callback
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should accept a callback for create events" do
|
54
|
-
path = FSSM::Path.new
|
55
|
-
callback = lambda { |base, relative| return true }
|
56
|
-
path.create(&callback)
|
57
|
-
(path.create).should == callback
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should accept a configuration block" do
|
61
|
-
path = FSSM::Path.new "#{@watch_root}" do
|
62
|
-
glob '**/*.yml'
|
63
|
-
update { |base, relative| 'success' }
|
64
|
-
delete { |base, relative| 'success' }
|
65
|
-
create { |base, relative| 'success' }
|
66
|
-
end
|
67
|
-
|
68
|
-
"#{path}".should == "#{@watch_root}"
|
69
|
-
path.glob.should == ['**/*.yml']
|
70
|
-
path.update.should be_a_kind_of(Proc)
|
71
|
-
path.delete.should be_a_kind_of(Proc)
|
72
|
-
path.create.should be_a_kind_of(Proc)
|
73
|
-
path.update.call('', '').should == 'success'
|
74
|
-
path.delete.call('', '').should == 'success'
|
75
|
-
path.create.call('', '').should == 'success'
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should pass file type to callbacks as the third argument if :directories option is used" do
|
79
|
-
path = FSSM::Path.new "#{@watch_root}", nil, :directories => true do
|
80
|
-
glob '**/*.yml'
|
81
|
-
update { |base, relative, type| [base, relative, type] }
|
82
|
-
delete { |base, relative, type| [base, relative, type] }
|
83
|
-
create { |base, relative, type| [base, relative, type] }
|
84
|
-
end
|
85
|
-
|
86
|
-
"#{path}".should == "#{@watch_root}"
|
87
|
-
path.glob.should == ['**/*.yml']
|
88
|
-
path.update.should be_a_kind_of(Proc)
|
89
|
-
path.delete.should be_a_kind_of(Proc)
|
90
|
-
path.create.should be_a_kind_of(Proc)
|
91
|
-
path.update.call('b', 'r', 't').should == ['b', 'r', 't']
|
92
|
-
path.delete.call('b', 'r', 't').should == ['b', 'r', 't']
|
93
|
-
path.create.call('b', 'r', 't').should == ['b', 'r', 't']
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|