sass 3.3.0 → 3.4.0
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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +58 -50
- data/Rakefile +1 -4
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/lib/sass/cache_stores/filesystem.rb +6 -2
- data/lib/sass/css.rb +1 -3
- data/lib/sass/engine.rb +37 -46
- data/lib/sass/environment.rb +13 -17
- data/lib/sass/error.rb +6 -9
- data/lib/sass/exec/base.rb +187 -0
- data/lib/sass/exec/sass_convert.rb +264 -0
- data/lib/sass/exec/sass_scss.rb +424 -0
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/features.rb +7 -0
- data/lib/sass/importers/base.rb +7 -2
- data/lib/sass/importers/filesystem.rb +9 -25
- data/lib/sass/importers.rb +0 -1
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +200 -83
- data/lib/sass/plugin/staleness_checker.rb +1 -1
- data/lib/sass/plugin.rb +3 -3
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/functions.rb +622 -268
- data/lib/sass/script/lexer.rb +99 -34
- data/lib/sass/script/parser.rb +24 -23
- data/lib/sass/script/tree/funcall.rb +1 -1
- data/lib/sass/script/tree/interpolation.rb +20 -2
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +1 -1
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/value/base.rb +7 -5
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +39 -21
- data/lib/sass/script/value/helpers.rb +107 -0
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +62 -14
- data/lib/sass/script/value/string.rb +59 -11
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/scss/css_parser.rb +8 -2
- data/lib/sass/scss/parser.rb +190 -328
- data/lib/sass/scss/rx.rb +15 -6
- data/lib/sass/scss/static_parser.rb +298 -1
- data/lib/sass/selector/abstract_sequence.rb +28 -13
- data/lib/sass/selector/comma_sequence.rb +92 -13
- data/lib/sass/selector/pseudo.rb +256 -0
- data/lib/sass/selector/sequence.rb +94 -24
- data/lib/sass/selector/simple.rb +14 -25
- data/lib/sass/selector/simple_sequence.rb +97 -33
- data/lib/sass/selector.rb +57 -194
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +26 -12
- data/lib/sass/stack.rb +0 -6
- data/lib/sass/supports.rb +2 -3
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/directive_node.rb +8 -2
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +4 -0
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/prop_node.rb +1 -1
- data/lib/sass/tree/rule_node.rb +12 -7
- data/lib/sass/tree/visitors/check_nesting.rb +38 -10
- data/lib/sass/tree/visitors/convert.rb +16 -18
- data/lib/sass/tree/visitors/cssize.rb +29 -29
- data/lib/sass/tree/visitors/deep_copy.rb +5 -0
- data/lib/sass/tree/visitors/perform.rb +45 -33
- data/lib/sass/tree/visitors/set_options.rb +14 -0
- data/lib/sass/tree/visitors/to_css.rb +15 -14
- data/lib/sass/util/subset_map.rb +1 -1
- data/lib/sass/util.rb +222 -99
- data/lib/sass/version.rb +5 -5
- data/lib/sass.rb +0 -5
- data/test/sass/cache_test.rb +62 -20
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +19 -10
- data/test/sass/conversion_test.rb +58 -1
- data/test/sass/css2sass_test.rb +23 -4
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +136 -199
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +236 -19
- data/test/sass/functions_test.rb +295 -253
- data/test/sass/importer_test.rb +31 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +14 -13
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +10 -7
- data/test/sass/script_test.rb +288 -74
- data/test/sass/scss/css_test.rb +141 -24
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +457 -18
- data/test/sass/source_map_test.rb +115 -25
- data/test/sass/superselector_test.rb +191 -0
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/normalized_map_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +31 -1
- data/test/sass/value_helpers_test.rb +5 -7
- data/test/test_helper.rb +2 -2
- data/vendor/listen/CHANGELOG.md +1 -228
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen/adapter.rb +195 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +25 -22
- data/ext/mkrf_conf.rb +0 -27
- data/lib/sass/importers/deprecated_path.rb +0 -51
- data/lib/sass/script/value/deprecated_false.rb +0 -55
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -1,143 +0,0 @@
|
|
1
|
-
module Listen
|
2
|
-
class MultiListener < Listener
|
3
|
-
attr_reader :directories, :directories_records, :adapter
|
4
|
-
|
5
|
-
# Initializes the multiple directories listener.
|
6
|
-
#
|
7
|
-
# @param [String] directories the directories to listen to
|
8
|
-
# @param [Hash] options the listen options
|
9
|
-
# @option options [Regexp] ignore a pattern for ignoring paths
|
10
|
-
# @option options [Regexp] filter a pattern for filtering paths
|
11
|
-
# @option options [Float] latency the delay between checking for changes in seconds
|
12
|
-
# @option options [Boolean] force_polling whether to force the polling adapter or not
|
13
|
-
# @option options [String, Boolean] polling_fallback_message to change polling fallback message or remove it
|
14
|
-
#
|
15
|
-
# @yield [modified, added, removed] the changed files
|
16
|
-
# @yieldparam [Array<String>] modified the list of modified files
|
17
|
-
# @yieldparam [Array<String>] added the list of added files
|
18
|
-
# @yieldparam [Array<String>] removed the list of removed files
|
19
|
-
#
|
20
|
-
def initialize(*args, &block)
|
21
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
22
|
-
directories = args
|
23
|
-
|
24
|
-
@block = block
|
25
|
-
@directories = directories.map { |d| Pathname.new(d).realpath.to_s }
|
26
|
-
@directories_records = @directories.map { |d| DirectoryRecord.new(d) }
|
27
|
-
|
28
|
-
ignore(*options.delete(:ignore)) if options[:ignore]
|
29
|
-
filter(*options.delete(:filter)) if options[:filter]
|
30
|
-
|
31
|
-
@adapter_options = options
|
32
|
-
end
|
33
|
-
|
34
|
-
# Starts the listener by initializing the adapter and building
|
35
|
-
# the directory record concurrently, then it starts the adapter to watch
|
36
|
-
# for changes.
|
37
|
-
#
|
38
|
-
# @param [Boolean] blocking whether or not to block the current thread after starting
|
39
|
-
#
|
40
|
-
def start(blocking = true)
|
41
|
-
t = Thread.new { @directories_records.each { |r| r.build } }
|
42
|
-
@adapter = initialize_adapter
|
43
|
-
t.join
|
44
|
-
@adapter.start(blocking)
|
45
|
-
end
|
46
|
-
|
47
|
-
# Unpauses the listener.
|
48
|
-
#
|
49
|
-
# @return [Listen::Listener] the listener
|
50
|
-
#
|
51
|
-
def unpause
|
52
|
-
@directories_records.each { |r| r.build }
|
53
|
-
@adapter.paused = false
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
# Adds ignored paths to the listener.
|
58
|
-
#
|
59
|
-
# @param (see Listen::DirectoryRecord#ignore)
|
60
|
-
#
|
61
|
-
# @return [Listen::Listener] the listener
|
62
|
-
#
|
63
|
-
def ignore(*paths)
|
64
|
-
@directories_records.each { |r| r.ignore(*paths) }
|
65
|
-
self
|
66
|
-
end
|
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
|
-
|
79
|
-
# Adds file filters to the listener.
|
80
|
-
#
|
81
|
-
# @param (see Listen::DirectoryRecord#filter)
|
82
|
-
#
|
83
|
-
# @return [Listen::Listener] the listener
|
84
|
-
#
|
85
|
-
def filter(*regexps)
|
86
|
-
@directories_records.each { |r| r.filter(*regexps) }
|
87
|
-
self
|
88
|
-
end
|
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
|
-
|
101
|
-
# Runs the callback passing it the changes if there are any.
|
102
|
-
#
|
103
|
-
# @param (see Listen::DirectoryRecord#fetch_changes)
|
104
|
-
#
|
105
|
-
def on_change(directories_to_search, options = {})
|
106
|
-
changes = fetch_records_changes(directories_to_search, options)
|
107
|
-
unless changes.values.all? { |paths| paths.empty? }
|
108
|
-
@block.call(changes[:modified],changes[:added],changes[:removed])
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
# Initializes an adapter passing it the callback and adapters' options.
|
115
|
-
#
|
116
|
-
def initialize_adapter
|
117
|
-
callback = lambda { |changed_dirs, options| self.on_change(changed_dirs, options) }
|
118
|
-
Adapter.select_and_initialize(@directories, @adapter_options, &callback)
|
119
|
-
end
|
120
|
-
|
121
|
-
# Returns the sum of all the changes to the directories records
|
122
|
-
#
|
123
|
-
# @param (see Listen::DirectoryRecord#fetch_changes)
|
124
|
-
#
|
125
|
-
# @return [Hash] the changes
|
126
|
-
#
|
127
|
-
def fetch_records_changes(directories_to_search, options)
|
128
|
-
@directories_records.inject({}) do |h, r|
|
129
|
-
# directory records skips paths outside their range, so passing the
|
130
|
-
# whole `directories` array is not a problem.
|
131
|
-
record_changes = r.fetch_changes(directories_to_search, options.merge(:relative_paths => DEFAULT_TO_RELATIVE_PATHS))
|
132
|
-
|
133
|
-
if h.empty?
|
134
|
-
h.merge!(record_changes)
|
135
|
-
else
|
136
|
-
h.each { |k, v| h[k] += record_changes[k] }
|
137
|
-
end
|
138
|
-
|
139
|
-
h
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
@@ -1,107 +0,0 @@
|
|
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
|
@@ -1,174 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Listen::MultiListener do
|
4
|
-
let(:adapter) { mock(Listen::Adapter, :start => true).as_null_object }
|
5
|
-
let(:watched_directories) { [File.dirname(__FILE__), File.expand_path('../..', __FILE__)] }
|
6
|
-
|
7
|
-
subject { described_class.new(*watched_directories) }
|
8
|
-
|
9
|
-
before do
|
10
|
-
Listen::Adapter.stub(:select_and_initialize) { adapter }
|
11
|
-
# Don't build a record of the files inside the base directory.
|
12
|
-
Listen::DirectoryRecord.any_instance.stub(:build)
|
13
|
-
end
|
14
|
-
|
15
|
-
it_should_behave_like 'a listener to changes on a file-system'
|
16
|
-
|
17
|
-
describe '#initialize' do
|
18
|
-
context 'with no options' do
|
19
|
-
it 'sets the directories' do
|
20
|
-
subject.directories.should =~ watched_directories
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'converts the passed paths into absolute paths - #21' do
|
24
|
-
paths = watched_directories.map { |d| File.join(d, '..') }
|
25
|
-
described_class.new(*paths).directories.should =~ watched_directories.map{ |d| File.expand_path('..', d) }
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with custom options' do
|
30
|
-
subject do
|
31
|
-
args = watched_directories << {:ignore => /\.ssh/, :filter => [/.*\.rb/,/.*\.md/], :latency => 0.5, :force_polling => true}
|
32
|
-
described_class.new(*args)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'passes the custom ignored paths to each directory record' do
|
36
|
-
subject.directories_records.each do |r|
|
37
|
-
r.ignoring_patterns.should include /\.ssh/
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'passes the custom filters to each directory record' do
|
42
|
-
subject.directories_records.each do |r|
|
43
|
-
r.filtering_patterns.should =~ [/.*\.rb/,/.*\.md/]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'sets adapter_options' do
|
48
|
-
subject.instance_variable_get(:@adapter_options).should eq(:latency => 0.5, :force_polling => true)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe '#start' do
|
54
|
-
it 'selects and initializes an adapter' do
|
55
|
-
Listen::Adapter.should_receive(:select_and_initialize).with(watched_directories, {}) { adapter }
|
56
|
-
subject.start
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'builds all directories records' do
|
60
|
-
subject.directories_records.each do |r|
|
61
|
-
r.should_receive(:build)
|
62
|
-
end
|
63
|
-
subject.start
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with a started listener' do
|
68
|
-
before do
|
69
|
-
subject.stub(:initialize_adapter) { adapter }
|
70
|
-
subject.start
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '#unpause' do
|
74
|
-
it 'rebuilds all directories records' do
|
75
|
-
subject.directories_records.each do |r|
|
76
|
-
r.should_receive(:build)
|
77
|
-
end
|
78
|
-
subject.unpause
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe '#ignore' do
|
84
|
-
it 'delegates the work to each directory record' do
|
85
|
-
subject.directories_records.each do |r|
|
86
|
-
r.should_receive(:ignore).with 'some_directory'
|
87
|
-
end
|
88
|
-
subject.ignore 'some_directory'
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe '#ignore!' do
|
93
|
-
it 'delegates the work to each directory record' do
|
94
|
-
subject.directories_records.each do |r|
|
95
|
-
r.should_receive(:ignore!).with 'some_directory'
|
96
|
-
end
|
97
|
-
subject.ignore! 'some_directory'
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe '#filter' do
|
102
|
-
it 'delegates the work to each directory record' do
|
103
|
-
subject.directories_records.each do |r|
|
104
|
-
r.should_receive(:filter).with /\.txt$/
|
105
|
-
end
|
106
|
-
subject.filter /\.txt$/
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe '#filter!' do
|
111
|
-
it 'delegates the work to each directory record' do
|
112
|
-
subject.directories_records.each do |r|
|
113
|
-
r.should_receive(:filter!).with /\.txt$/
|
114
|
-
end
|
115
|
-
subject.filter! /\.txt$/
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe '#on_change' do
|
120
|
-
let(:directories) { %w{dir1 dir2 dir3} }
|
121
|
-
let(:changes) { {:modified => [], :added => [], :removed => []} }
|
122
|
-
let(:callback) { Proc.new { @called = true } }
|
123
|
-
|
124
|
-
before do
|
125
|
-
@called = false
|
126
|
-
subject.stub(:fetch_records_changes => changes)
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'fetches the changes of all directories records' do
|
130
|
-
subject.unstub(:fetch_records_changes)
|
131
|
-
|
132
|
-
subject.directories_records.each do |record|
|
133
|
-
record.should_receive(:fetch_changes).with(
|
134
|
-
directories, hash_including(:relative_paths => described_class::DEFAULT_TO_RELATIVE_PATHS)
|
135
|
-
).and_return(changes)
|
136
|
-
end
|
137
|
-
subject.on_change(directories)
|
138
|
-
end
|
139
|
-
|
140
|
-
context 'with no changes to report' do
|
141
|
-
if RUBY_VERSION[/^1.8/]
|
142
|
-
it 'does not run the callback' do
|
143
|
-
subject.change(&callback)
|
144
|
-
subject.on_change(directories)
|
145
|
-
@called.should be_false
|
146
|
-
end
|
147
|
-
else
|
148
|
-
it 'does not run the callback' do
|
149
|
-
callback.should_not_receive(:call)
|
150
|
-
subject.change(&callback)
|
151
|
-
subject.on_change(directories)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
context 'with changes to report' do
|
157
|
-
let(:changes) { {:modified => %w{path1}, :added => [], :removed => %w{path2}} }
|
158
|
-
|
159
|
-
if RUBY_VERSION[/^1.8/]
|
160
|
-
it 'runs the callback passing it the changes' do
|
161
|
-
subject.change(&callback)
|
162
|
-
subject.on_change(directories)
|
163
|
-
@called.should be_true
|
164
|
-
end
|
165
|
-
else
|
166
|
-
it 'runs the callback passing it the changes' do
|
167
|
-
callback.should_receive(:call).with(changes[:modified], changes[:added], changes[:removed])
|
168
|
-
subject.change(&callback)
|
169
|
-
subject.on_change(directories)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|