haml 3.1.8 → 3.2.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of haml might be problematic. Click here for more details.
- data/CONTRIBUTING +1 -1
- data/README.md +2 -2
- data/REVISION +1 -1
- data/Rakefile +16 -41
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/lib/haml/buffer.rb +1 -5
- data/lib/haml/compiler.rb +7 -8
- data/lib/haml/exec.rb +1 -1
- data/lib/haml/helpers.rb +3 -5
- data/lib/haml/helpers/action_view_mods.rb +5 -21
- data/lib/haml/parser.rb +1 -1
- data/lib/haml/template.rb +1 -3
- data/lib/haml/util.rb +1 -1
- data/test/haml/engine_test.rb +12 -51
- data/test/haml/helper_test.rb +8 -25
- data/test/haml/html2haml_test.rb +1 -1
- data/test/haml/results/whitespace_handling.xhtml +50 -46
- data/test/haml/template_test.rb +2 -28
- data/test/haml/templates/partial_layout.haml +1 -4
- data/test/linked_rails.rb +4 -4
- data/vendor/sass/VERSION +1 -1
- data/vendor/sass/doc-src/SASS_CHANGELOG.md +2 -115
- data/vendor/sass/doc-src/SASS_REFERENCE.md +4 -12
- data/vendor/sass/lib/sass.rb +0 -1
- data/vendor/sass/lib/sass/cache_stores/base.rb +1 -3
- data/vendor/sass/lib/sass/cache_stores/filesystem.rb +0 -2
- data/vendor/sass/lib/sass/css.rb +1 -2
- data/vendor/sass/lib/sass/engine.rb +23 -39
- data/vendor/sass/lib/sass/environment.rb +0 -11
- data/vendor/sass/lib/sass/exec.rb +1 -14
- data/vendor/sass/lib/sass/importers/base.rb +1 -2
- data/vendor/sass/lib/sass/importers/filesystem.rb +13 -18
- data/vendor/sass/lib/sass/less.rb +2 -2
- data/vendor/sass/lib/sass/plugin.rb +8 -4
- data/vendor/sass/lib/sass/plugin/compiler.rb +17 -42
- data/vendor/sass/lib/sass/plugin/configuration.rb +2 -0
- data/vendor/sass/lib/sass/railtie.rb +1 -1
- data/vendor/sass/lib/sass/script/funcall.rb +1 -14
- data/vendor/sass/lib/sass/script/functions.rb +1 -44
- data/vendor/sass/lib/sass/script/interpolation.rb +0 -9
- data/vendor/sass/lib/sass/script/lexer.rb +1 -6
- data/vendor/sass/lib/sass/script/list.rb +0 -7
- data/vendor/sass/lib/sass/script/literal.rb +0 -5
- data/vendor/sass/lib/sass/script/node.rb +0 -8
- data/vendor/sass/lib/sass/script/number.rb +5 -28
- data/vendor/sass/lib/sass/script/operation.rb +0 -8
- data/vendor/sass/lib/sass/script/parser.rb +5 -12
- data/vendor/sass/lib/sass/script/string_interpolation.rb +0 -9
- data/vendor/sass/lib/sass/script/unary_operation.rb +0 -7
- data/vendor/sass/lib/sass/script/variable.rb +0 -5
- data/vendor/sass/lib/sass/scss/parser.rb +38 -78
- data/vendor/sass/lib/sass/scss/rx.rb +1 -2
- data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
- data/vendor/sass/lib/sass/shared.rb +1 -1
- data/vendor/sass/lib/sass/tree/comment_node.rb +11 -24
- data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/if_node.rb +14 -1
- data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/node.rb +5 -2
- data/vendor/sass/lib/sass/tree/prop_node.rb +9 -2
- data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/rule_node.rb +2 -9
- data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +18 -17
- data/vendor/sass/lib/sass/tree/visitors/convert.rb +5 -10
- data/vendor/sass/lib/sass/tree/visitors/perform.rb +19 -50
- data/vendor/sass/lib/sass/tree/visitors/to_css.rb +15 -9
- data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
- data/vendor/sass/lib/sass/util.rb +6 -58
- data/vendor/sass/sass.gemspec +1 -2
- data/vendor/sass/test/sass/cache_test.rb +0 -15
- data/vendor/sass/test/sass/conversion_test.rb +6 -2
- data/vendor/sass/test/sass/css2sass_test.rb +0 -9
- data/vendor/sass/test/sass/engine_test.rb +26 -124
- data/vendor/sass/test/sass/functions_test.rb +0 -13
- data/vendor/sass/test/sass/importer_test.rb +0 -110
- data/vendor/sass/test/sass/plugin_test.rb +13 -16
- data/vendor/sass/test/sass/script_conversion_test.rb +0 -2
- data/vendor/sass/test/sass/script_test.rb +0 -18
- data/vendor/sass/test/sass/scss/css_test.rb +1 -7
- data/vendor/sass/test/sass/scss/scss_test.rb +13 -37
- data/vendor/sass/test/sass/test_helper.rb +1 -1
- data/vendor/sass/test/sass/util_test.rb +0 -12
- data/vendor/sass/vendor/fssm/LICENSE +1 -1
- data/vendor/sass/vendor/fssm/README.markdown +27 -55
- data/vendor/sass/vendor/fssm/Rakefile +54 -6
- data/vendor/sass/vendor/fssm/VERSION.yml +5 -0
- data/vendor/sass/vendor/fssm/example.rb +3 -6
- data/vendor/sass/vendor/fssm/fssm.gemspec +70 -17
- data/vendor/sass/vendor/fssm/lib/fssm.rb +3 -7
- data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +9 -19
- data/vendor/sass/vendor/fssm/lib/fssm/path.rb +21 -24
- data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +479 -13
- data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +11 -29
- data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/support.rb +12 -41
- data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/sass/vendor/fssm/spec/path_spec.rb +15 -36
- data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +78 -125
- data/lib/haml/helpers/rails_323_textarea_fix.rb +0 -41
- data/test/gemfiles/Gemfile.rails-2.0.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.0.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.1.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.1.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.2.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.2.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.3.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.3.x.lock +0 -40
- data/test/gemfiles/Gemfile.rails-3.0.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.0.x.lock +0 -85
- data/test/gemfiles/Gemfile.rails-3.1.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.1.x.lock +0 -97
- data/test/gemfiles/Gemfile.rails-3.2.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.2.x.lock +0 -95
- data/test/gemfiles/Gemfile.rails-xss-2.3.x +0 -9
- data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +0 -42
- data/vendor/sass/lib/sass/logger.rb +0 -15
- data/vendor/sass/lib/sass/logger/base.rb +0 -32
- data/vendor/sass/lib/sass/logger/log_level.rb +0 -49
- data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +0 -87
- data/vendor/sass/lib/sass/tree/visitors/set_options.rb +0 -97
- data/vendor/sass/test/Gemfile +0 -4
- data/vendor/sass/test/Gemfile.lock +0 -19
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
- data/vendor/sass/test/sass/logger_test.rb +0 -58
- data/vendor/sass/test/sass/templates/bork5.sass +0 -3
- data/vendor/sass/test/sass/templates/nested_bork5.sass +0 -2
- data/vendor/sass/vendor/fssm/Gemfile +0 -3
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
- data/vendor/sass/vendor/fssm/lib/fssm/version.rb +0 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
- data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +0 -151
- data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +0 -202
@@ -1 +0,0 @@
|
|
1
|
-
.pear { color: green; }
|
@@ -1 +0,0 @@
|
|
1
|
-
@import "apple";
|
@@ -1,58 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
-
require 'pathname'
|
4
|
-
|
5
|
-
class LoggerTest < Test::Unit::TestCase
|
6
|
-
|
7
|
-
class InterceptedLogger < Sass::Logger::Base
|
8
|
-
|
9
|
-
attr_accessor :messages
|
10
|
-
|
11
|
-
def initialize(*args)
|
12
|
-
super
|
13
|
-
self.messages = []
|
14
|
-
end
|
15
|
-
|
16
|
-
def reset!
|
17
|
-
self.messages = []
|
18
|
-
end
|
19
|
-
|
20
|
-
def _log(*args)
|
21
|
-
messages << [args]
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_global_sass_logger_instance_exists
|
27
|
-
assert Sass.logger.respond_to?(:warn)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_log_level_orders
|
31
|
-
logged_levels = {
|
32
|
-
:trace => [ [], [:trace, :debug, :info, :warn, :error]],
|
33
|
-
:debug => [ [:trace], [:debug, :info, :warn, :error]],
|
34
|
-
:info => [ [:trace, :debug], [:info, :warn, :error]],
|
35
|
-
:warn => [ [:trace, :debug, :info], [:warn, :error]],
|
36
|
-
:error => [ [:trace, :debug, :info, :warn], [:error]]
|
37
|
-
}
|
38
|
-
logged_levels.each do |level, (should_not_be_logged, should_be_logged)|
|
39
|
-
logger = Sass::Logger::Base.new(level)
|
40
|
-
should_not_be_logged.each do |should_level|
|
41
|
-
assert !logger.logging_level?(should_level)
|
42
|
-
end
|
43
|
-
should_be_logged.each do |should_level|
|
44
|
-
assert logger.logging_level?(should_level)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_logging_can_be_disabled
|
50
|
-
logger = InterceptedLogger.new
|
51
|
-
logger.error("message #1")
|
52
|
-
assert_equal 1, logger.messages.size
|
53
|
-
logger.reset!
|
54
|
-
logger.disabled = true
|
55
|
-
logger.error("message #2")
|
56
|
-
assert_equal 0, logger.messages.size
|
57
|
-
end
|
58
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module FSSM::Backends
|
2
|
-
class RBFSEvent
|
3
|
-
def initialize
|
4
|
-
@handlers = []
|
5
|
-
end
|
6
|
-
|
7
|
-
def add_handler(handler, preload=true)
|
8
|
-
@handlers << handler
|
9
|
-
handler.refresh(nil, true) if preload
|
10
|
-
end
|
11
|
-
|
12
|
-
def run
|
13
|
-
begin
|
14
|
-
@fsevent = FSEvent.new
|
15
|
-
@fsevent.watch(temporary_multipath_hack) do |paths|
|
16
|
-
paths.each do |path|
|
17
|
-
temporary_multipath_handler(path)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
@fsevent.run
|
21
|
-
rescue Interrupt
|
22
|
-
@fsevent.stop
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def temporary_multipath_handler(path)
|
27
|
-
@handlers.each do |handler|
|
28
|
-
handler_path = File.join(handler.path.to_s, "")
|
29
|
-
if path.start_with?(handler_path)
|
30
|
-
handler.refresh(path)
|
31
|
-
break
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def temporary_multipath_hack
|
37
|
-
@handlers = @handlers.sort {|x,y| y.path.to_pathname.segments.length <=> x.path.to_pathname.segments.length}
|
38
|
-
return @handlers.map {|handler| handler.path.to_s}
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
|
3
|
-
require 'pathname'
|
4
|
-
|
5
|
-
$test_path = "#{Pathname.new('..').expand_path}"
|
6
|
-
$iterations = 900000
|
7
|
-
|
8
|
-
if ARGV.first == 'native'
|
9
|
-
puts "Using native Pathname"
|
10
|
-
|
11
|
-
class Pathname
|
12
|
-
# original segments implementation I was using with
|
13
|
-
# the plain ruby Pathname library.
|
14
|
-
def segments
|
15
|
-
prefix, names = split_names(@path)
|
16
|
-
names.unshift(prefix) unless prefix.empty?
|
17
|
-
names.shift if names[0] == '.'
|
18
|
-
names
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
$iterations.times do |num|
|
23
|
-
p = ::Pathname.new($test_path)
|
24
|
-
segments = p.segments
|
25
|
-
end
|
26
|
-
else
|
27
|
-
puts "Using FSSM::Pathname"
|
28
|
-
|
29
|
-
require 'fssm'
|
30
|
-
|
31
|
-
$iterations.times do |num|
|
32
|
-
p = FSSM::Pathname.new($test_path)
|
33
|
-
segments = p.segments
|
34
|
-
end
|
35
|
-
end
|
@@ -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
|