directory_watcher 1.4.1 → 1.5.1

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.
@@ -0,0 +1,79 @@
1
+
2
+ require File.expand_path('../../lib/directory_watcher', __FILE__)
3
+
4
+ require 'logging'
5
+ require 'rspec/logging_helper'
6
+ require 'rspec/autorun'
7
+ require 'scanner_scenarios'
8
+ require 'utility_classes'
9
+
10
+ include Logging.globally
11
+
12
+ #Thread.abort_on_exception = true
13
+
14
+ module DirectoryWatcherSpecs::Helpers
15
+ def scratch_path( *parts )
16
+ File.join( @scratch_dir, *parts )
17
+ end
18
+
19
+ # NOTE : touch will only work on *nix/BSD style systems
20
+ # Touch the file with the given timestamp
21
+ def touch( fname, time = Time.now )
22
+ stamp = time.strftime("%Y%m%d%H%M.%S")
23
+ %x[ touch -m -t #{stamp} #{fname} ]
24
+ end
25
+
26
+ def append_to( fname, count = 1 )
27
+ File.open( fname, "a" ) { |f| count.times { f.puts Time.now }}
28
+ end
29
+
30
+ # create a unique list of numbers with size 'count' and from the range
31
+ # 0..range
32
+ def unique_integer_list( count, range )
33
+ random = (0..range).to_a.sort_by { rand }
34
+ return random[0,count]
35
+ end
36
+ end
37
+
38
+ RSpec.configure do |config|
39
+ config.before(:each) do
40
+ @spec_dir = DirectoryWatcher.sub_path( "spec" )
41
+ @scratch_dir = File.join(@spec_dir, "scratch")
42
+ FileUtils.rm_rf @scratch_dir if File.directory?( @scratch_dir )
43
+ FileUtils.mkdir @scratch_dir unless File.directory?( @scratch_dir )
44
+ end
45
+
46
+ config.after(:each) do
47
+ FileUtils.rm_rf @scratch_dir if File.directory?(@scratch_dir)
48
+ end
49
+
50
+ config.include DirectoryWatcherSpecs::Helpers
51
+
52
+ include RSpec::LoggingHelper
53
+ config.capture_log_messages
54
+ end
55
+
56
+ RSpec::Matchers.define :be_events_like do |expected|
57
+ match do |actual|
58
+ a = actual.kind_of?( Array ) ?
59
+ actual.map {|e| [ e.type, File.basename( e.path ) ]} :
60
+ [ actual.type, File.basename( actual.path ) ]
61
+ a == expected
62
+ end
63
+
64
+ failure_message_for_should do |actual|
65
+ s = StringIO.new
66
+ s.puts [ "Actual".ljust(20), "Expected".ljust(20), "Same?".ljust(20) ].join(" ")
67
+ s.puts [ "-"*20, "-"*20, "-"*20 ].join(" ")
68
+ [ actual.size, expected.size ].max.times do |x|
69
+ a = actual[x]
70
+ a = a.kind_of?( Array ) ?
71
+ a.map {|e| [ e.type, File.basename( e.path ) ]} :
72
+ [ a.type, File.basename( a.path ) ]
73
+ e = expected[x]
74
+ r = (a == e) ? "OK" : "Differ"
75
+ s.puts [ a.inspect.ljust(20), e.inspect.ljust(20), r ].join(" ")
76
+ end
77
+ s.string
78
+ end
79
+ end
@@ -0,0 +1,117 @@
1
+ module DirectoryWatcherSpecs
2
+ # EventObserver just hangs out and collects all the events that are sent to it
3
+ # It is used by the Scenario
4
+ class EventObserver
5
+ attr_reader :events
6
+ attr_reader :logger
7
+
8
+ def initialize( logger )
9
+ @logger = logger
10
+ @events = []
11
+ end
12
+
13
+ def update( *event_list )
14
+ logger.debug "got event #{event_list}"
15
+ @events.concat event_list
16
+ end
17
+ end
18
+
19
+ # Scenario is a utility to wrap up how to run a directory watcher scenario.
20
+ # You would use it as such:
21
+ #
22
+ # dws = Scenario.new( watcher )
23
+ # dws.do_after_events(2) do |scenario|
24
+ # # do something
25
+ # end.until_events(1)
26
+ #
27
+ # This will create a scenario, run the block after 2 events have been
28
+ # collected, and then return again after 1 more event has been collected.
29
+ #
30
+ # You can then check the events with the custom matcher
31
+ #
32
+ # dws.events.should be_events_like( ... )
33
+ #
34
+ class Scenario
35
+ include DirectoryWatcher::Logable
36
+
37
+ attr_reader :watcher
38
+ def initialize( watcher )
39
+ @watcher = watcher
40
+ @config = watcher.config
41
+ @observer = EventObserver.new( logger )
42
+ @watcher.add_observer( @observer )
43
+ reset
44
+ end
45
+
46
+ def run_and_wait_for_event_count(count, &block )
47
+ before_count = @observer.events.size
48
+ @watcher.resume
49
+ logger.debug "Before yielding event_count = #{before_count}"
50
+ logger.debug @observer.events.inspect
51
+ yield self
52
+ wait_for_events( before_count + count )
53
+ return self
54
+ end
55
+
56
+ def run_and_wait_for_scan_count(count, &block)
57
+ @watcher.resume
58
+ yield self
59
+ wait_for_scan_count( count )
60
+ return self
61
+ end
62
+
63
+ def events
64
+ @observer.events
65
+ end
66
+
67
+ def stop
68
+ @watcher.stop
69
+ end
70
+
71
+ def pause
72
+ @watcher.pause
73
+ end
74
+
75
+ def resume
76
+ @watcher.resume
77
+ end
78
+
79
+ def reset
80
+ @observer.events.clear
81
+ @watcher.start
82
+ @watcher.pause
83
+ logger.debug "Scenario#reset with pause"
84
+ end
85
+
86
+ def run_once_and_wait_for_event_count( count, &block )
87
+ @watcher.resume
88
+ @watcher.stop
89
+ before_count = @observer.events.size
90
+ yield self
91
+ @watcher.run_once
92
+ wait_for_events( before_count + count )
93
+ return self
94
+ end
95
+
96
+ private
97
+
98
+ def wait_for_events( limit )
99
+ #Thread.pass until @observer.events.size >= limit
100
+ until @observer.events.size >= limit do
101
+ Thread.pass
102
+ sleep(0.01)
103
+ logger.debug "Waiting for #{limit} events, I have #{@observer.events.size}"
104
+ end
105
+ end
106
+
107
+ def wait_for_scan_count( limit )
108
+ @watcher.maximum_iterations = limit
109
+ #Thread.pass until @watcher.finished_scans?
110
+ until @watcher.finished_scans?
111
+ sleep(0.01)
112
+ logger.debug "Waiting for scan count #{limit} got #{@watcher.scans} #{@watcher.maximum_iterations}"
113
+ end
114
+ end
115
+
116
+ end
117
+ end
@@ -1 +1 @@
1
- 1.4.1
1
+ 1.5.1
metadata CHANGED
@@ -1,60 +1,145 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directory_watcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Tim Pease
9
+ - Jeremy Hinegardner
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2011-08-30 00:00:00.000000000Z
13
+ date: 2013-03-20 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
- name: bones-git
16
- requirement: &2154666820 !ruby/object:Gem::Requirement
16
+ name: rev
17
+ requirement: !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ! '>='
20
21
  - !ruby/object:Gem::Version
21
- version: 1.2.4
22
+ version: 0.3.2
22
23
  type: :development
23
24
  prerelease: false
24
- version_requirements: *2154666820
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.3.2
25
31
  - !ruby/object:Gem::Dependency
26
- name: rev
27
- requirement: &2154666220 !ruby/object:Gem::Requirement
32
+ name: eventmachine
33
+ requirement: !ruby/object:Gem::Requirement
28
34
  none: false
29
35
  requirements:
30
36
  - - ! '>='
31
37
  - !ruby/object:Gem::Version
32
- version: '0'
38
+ version: 1.0.3
33
39
  type: :development
34
40
  prerelease: false
35
- version_requirements: *2154666220
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.3
36
47
  - !ruby/object:Gem::Dependency
37
- name: eventmachine
38
- requirement: &2154665460 !ruby/object:Gem::Requirement
48
+ name: cool.io
49
+ requirement: !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
42
53
  - !ruby/object:Gem::Version
43
- version: 0.12.10
54
+ version: 1.1.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2154665460
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.1.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: bones-git
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 1.2.4
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 1.2.4
79
+ - !ruby/object:Gem::Dependency
80
+ name: bones-rspec
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: 2.0.1
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 2.0.1
95
+ - !ruby/object:Gem::Dependency
96
+ name: rspec
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: 2.7.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 2.7.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: logging
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: 1.6.1
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: 1.6.1
47
127
  - !ruby/object:Gem::Dependency
48
128
  name: bones
49
- requirement: &2154664820 !ruby/object:Gem::Requirement
129
+ requirement: !ruby/object:Gem::Requirement
50
130
  none: false
51
131
  requirements:
52
132
  - - ! '>='
53
133
  - !ruby/object:Gem::Version
54
- version: 3.7.0
134
+ version: 3.8.0
55
135
  type: :development
56
136
  prerelease: false
57
- version_requirements: *2154664820
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: 3.8.0
58
143
  description: ! 'The directory watcher operates by scanning a directory at some interval
59
144
  and
60
145
 
@@ -66,25 +151,40 @@ description: ! 'The directory watcher operates by scanning a directory at some i
66
151
 
67
152
  added, modified, and removed.'
68
153
  email: tim.pease@gmail.com
69
- executables:
70
- - dw
154
+ executables: []
71
155
  extensions: []
72
156
  extra_rdoc_files:
73
157
  - History.txt
74
158
  - README.txt
75
- - bin/dw
76
159
  files:
160
+ - .gitignore
77
161
  - History.txt
78
162
  - README.txt
79
163
  - Rakefile
80
- - bin/dw
81
164
  - lib/directory_watcher.rb
165
+ - lib/directory_watcher/collector.rb
166
+ - lib/directory_watcher/configuration.rb
82
167
  - lib/directory_watcher/coolio_scanner.rb
83
168
  - lib/directory_watcher/em_scanner.rb
169
+ - lib/directory_watcher/event.rb
170
+ - lib/directory_watcher/eventable_scanner.rb
171
+ - lib/directory_watcher/file_stat.rb
172
+ - lib/directory_watcher/logable.rb
173
+ - lib/directory_watcher/notifier.rb
174
+ - lib/directory_watcher/paths.rb
84
175
  - lib/directory_watcher/rev_scanner.rb
176
+ - lib/directory_watcher/scan.rb
177
+ - lib/directory_watcher/scan_and_queue.rb
85
178
  - lib/directory_watcher/scanner.rb
179
+ - lib/directory_watcher/threaded.rb
180
+ - lib/directory_watcher/version.rb
181
+ - spec/directory_watcher_spec.rb
182
+ - spec/paths_spec.rb
183
+ - spec/scanner_scenarios.rb
184
+ - spec/spec_helper.rb
185
+ - spec/utility_classes.rb
86
186
  - version.txt
87
- homepage: http://gemcutter.org/gems/directory_watcher
187
+ homepage: http://rubygems.org/gems/directory_watcher
88
188
  licenses: []
89
189
  post_install_message:
90
190
  rdoc_options:
@@ -106,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
206
  version: '0'
107
207
  requirements: []
108
208
  rubyforge_project: directory_watcher
109
- rubygems_version: 1.8.6
209
+ rubygems_version: 1.8.23
110
210
  signing_key:
111
211
  specification_version: 3
112
212
  summary: A class for watching files within a directory and generating events when
data/bin/dw DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env ruby
2
-