watchr 0.5.7 → 0.5.8

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/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg/
3
3
  bk/
4
4
  .wiki
5
5
  .yardoc
6
+ *.gem
data/Manifest CHANGED
@@ -24,4 +24,4 @@ test/test_controller.rb
24
24
  test/test_helper.rb
25
25
  test/test_script.rb
26
26
  test/test_watchr.rb
27
- watchr.gemspec
27
+ watchr.gemspec
data/Rakefile CHANGED
@@ -1,40 +1,19 @@
1
- require 'rake/rdoctask'
2
- begin
3
- require 'yard'
4
- rescue LoadError, RuntimeError
5
- end
6
-
7
- desc "Generate rdoc documentation."
8
- Rake::RDocTask.new(:rdoc => 'rdoc', :clobber_rdoc => 'rdoc:clean', :rerdoc => 'rdoc:force') { |rdoc|
9
- rdoc.rdoc_dir = 'doc/rdoc'
10
- rdoc.title = "Watchr"
11
- rdoc.options << '--line-numbers' << '--inline-source'
12
- rdoc.options << '--charset' << 'utf-8'
13
- rdoc.main = 'README.rdoc'
14
- rdoc.rdoc_files.include('README.rdoc')
15
- rdoc.rdoc_files.include('TODO.txt')
16
- rdoc.rdoc_files.include('LICENSE')
17
- rdoc.rdoc_files.include('lib/**/*.rb')
18
- }
19
-
20
- if defined? YARD
21
- YARD::Rake::YardocTask.new do |t|
22
- t.files = %w( lib/**/*.rb )
23
- t.options = %w( -o doc/yard --readme README.rdoc --files LICENSE,TODO.txt )
24
- end
25
- end
1
+ # --------------------------------------------------
2
+ # Tests
3
+ # --------------------------------------------------
4
+ task(:default => "test:all")
26
5
 
27
6
  namespace(:test) do
28
7
 
29
8
  desc "Run all tests"
30
9
  task(:all) do
31
10
  tests = Dir['test/**/test_*.rb'] - ['test/test_helper.rb']
32
- cmd = "ruby -rubygems -Ilib -e'%w( #{tests.join(' ')} ).each {|file| require file }'"
11
+ cmd = "ruby -rubygems -I.:lib -e'%w( #{tests.join(' ')} ).each {|file| require file }'"
33
12
  puts cmd if ENV['VERBOSE']
34
13
  system cmd
35
14
  end
36
15
 
37
- desc "Run all tests on multiple ruby versions (requires rvm with 1.8.6 and 1.8.7)"
16
+ desc "Run all tests on multiple ruby versions (requires rvm)"
38
17
  task(:portability) do
39
18
  versions = %w( 1.8.6 1.8.7 )
40
19
  versions.each do |version|
@@ -47,3 +26,29 @@ namespace(:test) do
47
26
  end
48
27
  end
49
28
  end
29
+
30
+ # --------------------------------------------------
31
+ # Docs
32
+ # --------------------------------------------------
33
+ require 'rake/rdoctask'
34
+ desc "Generate rdoc documentation."
35
+ Rake::RDocTask.new(:rdoc => 'rdoc', :clobber_rdoc => 'rdoc:clean', :rerdoc => 'rdoc:force') do |rdoc|
36
+ rdoc.rdoc_dir = 'doc/rdoc'
37
+ rdoc.title = "Watchr"
38
+ rdoc.options << '--line-numbers' << '--inline-source'
39
+ rdoc.options << '--charset' << 'utf-8'
40
+ rdoc.main = 'README.rdoc'
41
+ rdoc.rdoc_files.include('README.rdoc')
42
+ rdoc.rdoc_files.include('TODO.txt')
43
+ rdoc.rdoc_files.include('LICENSE')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
46
+
47
+ desc "Generate YARD Documentation"
48
+ task(:yardoc) do
49
+ require 'yard'
50
+ files = %w( lib/**/*.rb )
51
+ options = %w( -o doc/yard --readme README.rdoc --files LICENSE )
52
+ YARD::CLI::Yardoc.run *(options + files)
53
+ end
54
+
data/bin/watchr CHANGED
@@ -26,30 +26,12 @@ module Watchr
26
26
  # ===== Returns
27
27
  # <Pathname>::
28
28
  # absolute path of first occurence of partial path in load path, or nil if not found
29
- #
29
+ #--
30
+ # Adds '.' for ruby1.9.2
30
31
  def find_in_load_path(path)
31
- dir = potentially_with_gem( path.basename('.watchr') ) do
32
- $LOAD_PATH.detect {|p| Pathname(p).join(path).exist? }
33
- end
32
+ dir = (['.'] + $LOAD_PATH).uniq.detect {|p| Pathname(p).join(path).exist? }
34
33
  dir ? path.expand_path(dir) : nil
35
34
  end
36
-
37
- private
38
-
39
- # If the block returns nil, requires gem <tt>name</tt> and tries running the
40
- # block again. If all fails, returns nil
41
- #
42
- # ===== Params
43
- # name<Pathname,String>:: name of gem to require
44
- #
45
- # ===== Returns
46
- # block's value or nil if gem <tt>name</tt> doesn't exist
47
- #
48
- def potentially_with_gem(name)
49
- yield || (require(name) && yield)
50
- rescue LoadError
51
- nil
52
- end
53
35
  end
54
36
  end
55
37
 
@@ -13,7 +13,7 @@ require 'rbconfig'
13
13
  # See README for more details
14
14
  #
15
15
  module Watchr
16
- VERSION = '0.5.7'
16
+ VERSION = '0.5.8'
17
17
 
18
18
  begin
19
19
  require 'rev'
@@ -21,10 +21,12 @@ module Watchr
21
21
  #
22
22
  # ===== Parameters
23
23
  # script<Script>:: The script object
24
+ # handler<EventHanlder::Base>:: The filesystem event handler
24
25
  #
25
26
  def initialize(script, handler)
26
27
  @script = script
27
28
  @handler = handler
29
+
28
30
  @handler.add_observer(self)
29
31
 
30
32
  Watchr.debug "using %s handler" % handler.class.name
@@ -35,18 +37,20 @@ module Watchr
35
37
  # Will block control flow until application is explicitly stopped/killed.
36
38
  #
37
39
  def run
40
+ @script.parse!
38
41
  @handler.listen(monitored_paths)
42
+ rescue Interrupt
39
43
  end
40
44
 
41
45
  # Callback for file events.
42
46
  #
43
- # Called while control flow in in listening loop. It will execute the
47
+ # Called while control flow is in listening loop. It will execute the
44
48
  # file's corresponding action as defined in the script. If the file is the
45
49
  # script itself, it will refresh its state to account for potential changes.
46
50
  #
47
51
  # ===== Parameters
48
52
  # path<Pathname, String>:: path that triggered event
49
- # event<Symbol>:: event type (ignored for now)
53
+ # event_type<Symbol>:: event type
50
54
  #
51
55
  def update(path, event_type = nil)
52
56
  path = Pathname(path).expand_path
@@ -3,11 +3,8 @@ module Watchr
3
3
  class Portable
4
4
  include Base
5
5
 
6
- attr_accessor :monitored_paths
7
- attr_accessor :reference_mtime
8
-
9
6
  def initialize
10
- @reference_mtime = Time.now
7
+ @reference_mtime = @reference_atime = @reference_ctime = Time.now
11
8
  end
12
9
 
13
10
  # Enters listening loop.
@@ -40,15 +37,24 @@ module Watchr
40
37
  # ===== Returns
41
38
  # path and type of event if event occured, nil otherwise
42
39
  #
40
+ #--
41
+ # OPTIMIZE, REFACTOR
42
+ # TODO fix/figure out ENOENT error
43
43
  def detect_event
44
- path = @monitored_paths.max {|a,b| a.mtime <=> b.mtime }
45
-
46
- if path.mtime > @reference_mtime
47
- @reference_mtime = path.mtime
48
- [path, :modified]
49
- else
50
- nil
44
+ @monitored_paths.each do |path|
45
+ return [path, :deleted] unless path.exist?
51
46
  end
47
+
48
+ mtime_path = @monitored_paths.max {|a,b| a.mtime <=> b.mtime }
49
+ atime_path = @monitored_paths.max {|a,b| a.atime <=> b.atime }
50
+ ctime_path = @monitored_paths.max {|a,b| a.ctime <=> b.ctime }
51
+
52
+ if mtime_path.mtime > @reference_mtime then @reference_mtime = mtime_path.mtime; [mtime_path, :modified]
53
+ elsif atime_path.atime > @reference_atime then @reference_atime = atime_path.atime; [atime_path, :accessed]
54
+ elsif ctime_path.ctime > @reference_ctime then @reference_ctime = ctime_path.ctime; [ctime_path, :changed ]
55
+ else; nil; end
56
+ rescue Errno::ENOENT
57
+ retry
52
58
  end
53
59
  end
54
60
  end
@@ -31,10 +31,14 @@ module Watchr
31
31
 
32
32
  private
33
33
 
34
+ #--
35
+ # TODO fix/figure out ENOENT error
34
36
  def update_reference_times
35
37
  @reference_atime = pathname.atime
36
38
  @reference_mtime = pathname.mtime
37
39
  @reference_ctime = pathname.ctime
40
+ rescue Errno::ENOENT
41
+ retry
38
42
  end
39
43
 
40
44
  # Type of latest event.
@@ -20,23 +20,65 @@ module Watchr
20
20
  #
21
21
  Rule = Struct.new(:pattern, :event_type, :action)
22
22
 
23
- # TODO eval context
24
- class API #:nodoc:
23
+ # Script file evaluation context
24
+ #
25
+ # Script files are evaluated in the context of an instance of this class so
26
+ # that they get a clearly defined set of methods to work with. In other
27
+ # words, it is the user script's API.
28
+ #
29
+ class EvalContext #:nodoc:
30
+
31
+ def initialize(script)
32
+ @__script = script
33
+ end
34
+
35
+ # Delegated to Script
36
+ def default_action(&action)
37
+ @__script.default_action(&action)
38
+ end
39
+
40
+ # Delegated to Script
41
+ def watch(*args, &block)
42
+ @__script.watch(*args, &block)
43
+ end
44
+
45
+ def reload
46
+ @__script.parse!
47
+ end
25
48
  end
26
49
 
27
- # Creates a script object for <tt>path</tt>.
50
+ # EvalContext instance
51
+ #
52
+ # ===== Examples
53
+ # script.ec.watch('pattern') { }
54
+ # script.ec.rules
55
+ #
56
+ attr_reader :ec
57
+
58
+ # Defined rules
59
+ #
60
+ # ===== Returns
61
+ # Array[Rule]:: rules defined with #watch calls
62
+ #
63
+ attr_reader :rules
64
+
65
+ # Default action
28
66
  #
29
- # Will also immediatly parse the script so it is ready to be passed to a
30
- # controller.
67
+ # ===== Returns
68
+ # Proc:: action defined with #default_action call
69
+ #
70
+ attr_reader :default_action
71
+
72
+ # Create a script object for <tt>path</tt>.
31
73
  #
32
74
  # ===== Parameters
33
75
  # path<Pathname>:: the path to the script
34
76
  #
35
- def initialize(path)
36
- @path = path
77
+ def initialize(path = nil)
78
+ @path = path
37
79
  @rules = []
38
80
  @default_action = lambda {}
39
- parse!
81
+ @ec = EvalContext.new(self)
40
82
  end
41
83
 
42
84
  # Main script API method. Builds a new rule, binding a pattern to an action.
@@ -106,24 +148,32 @@ module Watchr
106
148
  # watch( 'TODO.txt' ) { system('rake --silent rdoc') }
107
149
  # watch( 'LICENSE' ) { system('rake --silent rdoc') }
108
150
  #
151
+ # ===== Returns
152
+ # Proc:: default action
153
+ #
109
154
  def default_action(&action)
110
- @default_action = action
155
+ @default_action = action if action
156
+ @default_action
157
+ end
158
+
159
+ # Reset script state
160
+ def reset
161
+ @rules = []
162
+ @default_action = lambda {}
111
163
  end
112
164
 
113
165
  # Eval content of script file.
114
166
  #--
115
- # TODO fix script file not found error
167
+ # TODO fix/figure out ENOENT error
116
168
  def parse!
117
- Watchr.debug('loading script file %s' % @path.to_s.inspect)
118
-
169
+ return unless @path
119
170
  reset
120
- instance_eval(@path.read)
121
-
171
+ @ec.instance_eval(@path.read, @path.to_s)
122
172
  rescue Errno::ENOENT
123
- # TODO figure out why this is happening. still can't reproduce
124
- Watchr.debug('script file "not found". wth')
125
173
  sleep(0.3) #enough?
126
- instance_eval(@path.read)
174
+ retry
175
+ ensure
176
+ Watchr.debug('loaded script file %s' % @path.to_s.inspect)
127
177
  end
128
178
 
129
179
  # Find an action corresponding to a path and event type. The returned
@@ -131,7 +181,7 @@ module Watchr
131
181
  # match_data prepopulated.
132
182
  #
133
183
  # ===== Params
134
- # path<Pathnane,String>:: Find action that correspond to this path.
184
+ # path<Pathnane,String>:: Find action that corresponds to this path.
135
185
  # event_type<Symbol>:: Find action only if rule's event if of this type.
136
186
  #
137
187
  # ===== Examples
@@ -163,10 +213,10 @@ module Watchr
163
213
  # Path to the script file
164
214
  #
165
215
  # ===== Returns
166
- # path<Pathname>:: path to script file
216
+ # path<Pathname>:: absolute path to script file
167
217
  #
168
218
  def path
169
- Pathname(@path.respond_to?(:to_path) ? @path.to_path : @path.to_s).expand_path
219
+ @path && Pathname(@path.respond_to?(:to_path) ? @path.to_path : @path.to_s).expand_path
170
220
  end
171
221
 
172
222
  private
@@ -195,11 +245,5 @@ module Watchr
195
245
  def rel_path(path)
196
246
  Pathname(path).expand_path.relative_path_from(Pathname(Dir.pwd))
197
247
  end
198
-
199
- # Reset script state
200
- def reset
201
- @default_action = lambda {}
202
- @rules.clear
203
- end
204
248
  end
205
249
  end
@@ -3,7 +3,7 @@
3
3
  # $ watchr specs.watchr
4
4
 
5
5
  # --------------------------------------------------
6
- # Convenience Methods
6
+ # Helpers
7
7
  # --------------------------------------------------
8
8
  def run(cmd)
9
9
  puts(cmd)
@@ -18,10 +18,10 @@ end
18
18
  # --------------------------------------------------
19
19
  # Watchr Rules
20
20
  # --------------------------------------------------
21
- watch( '^test.*/test_.*\.rb' ) { |m| run( "ruby -rubygems %s" % m[0] ) }
22
- watch( '^lib/(.*)\.rb' ) { |m| run( "ruby -rubygems test/test_%s.rb" % m[1] ) }
23
- watch( '^lib/watchr/(.*)\.rb' ) { |m| run( "ruby -rubygems test/test_%s.rb" % m[1] ) }
24
- watch( '^lib/watchr/event_handlers/(.*)\.rb' ) { |m| run( "ruby -rubygems test/event_handlers/test_%s.rb" % m[1] ) }
21
+ watch( '^test.*/test_.*\.rb' ) { |m| run( "ruby -rubygems -I.:lib %s" % m[0] ) }
22
+ watch( '^lib/(.*)\.rb' ) { |m| run( "ruby -rubygems -I.:lib test/test_%s.rb" % m[1] ) }
23
+ watch( '^lib/watchr/(.*)\.rb' ) { |m| run( "ruby -rubygems -I.:lib test/test_%s.rb" % m[1] ) }
24
+ watch( '^lib/watchr/event_handlers/(.*)\.rb' ) { |m| run( "ruby -rubygems -I.:lib test/event_handlers/test_%s.rb" % m[1] ) }
25
25
  watch( '^test/test_helper\.rb' ) { run_all_tests }
26
26
 
27
27
  # --------------------------------------------------
@@ -1,5 +1,9 @@
1
1
  require 'test/test_helper'
2
2
 
3
+ class Watchr::EventHandler::Portable
4
+ attr_accessor :monitored_paths
5
+ end
6
+
3
7
  class PortableEventHandlerTest < Test::Unit::TestCase
4
8
  include Watchr
5
9
 
@@ -12,10 +16,13 @@ class PortableEventHandlerTest < Test::Unit::TestCase
12
16
  @baz = Pathname('baz').expand_path
13
17
  @bax = Pathname('bax').expand_path
14
18
 
15
- @foo.stubs(:mtime).returns(Time.now - 100)
16
- @bar.stubs(:mtime).returns(Time.now - 100)
17
- @baz.stubs(:mtime).returns(Time.now - 100)
18
- @bax.stubs(:mtime).returns(Time.now - 100)
19
+ @now = Time.now
20
+ [@foo, @bar, @baz, @bax].each do |path|
21
+ path.stubs(:mtime ).returns(@now - 100)
22
+ path.stubs(:atime ).returns(@now - 100)
23
+ path.stubs(:ctime ).returns(@now - 100)
24
+ path.stubs(:exist?).returns(true)
25
+ end
19
26
  end
20
27
 
21
28
  test "triggers listening state" do
@@ -31,15 +38,80 @@ class PortableEventHandlerTest < Test::Unit::TestCase
31
38
  @handler.monitored_paths.should include(@bar)
32
39
  end
33
40
 
34
- test "notifies observers on file event" do
35
- @foo.stubs(:mtime).returns(Time.now + 100) # fake event
41
+ test "doesn't trigger on start" do
42
+ end
43
+
44
+ ## event types
45
+
46
+ test "deleted file event" do
47
+ @foo.stubs(:exist?).returns(false)
48
+
49
+ @handler.listen [ @foo, @bar ]
50
+ @handler.expects(:notify).with(@foo, :deleted)
51
+ @handler.trigger
52
+ end
53
+
54
+ test "modified file event" do
55
+ @foo.stubs(:mtime).returns(@now + 100)
36
56
 
37
57
  @handler.listen [ @foo, @bar ]
38
58
  @handler.expects(:notify).with(@foo, :modified)
39
59
  @handler.trigger
40
60
  end
41
61
 
42
- test "doesn't trigger on start" do
62
+ test "accessed file event" do
63
+ @foo.stubs(:atime).returns(@now + 100)
64
+
65
+ @handler.listen [ @foo, @bar ]
66
+ @handler.expects(:notify).with(@foo, :accessed)
67
+ @handler.trigger
68
+ end
69
+
70
+ test "changed file event" do
71
+ @foo.stubs(:ctime).returns(@now + 100)
72
+
73
+ @handler.listen [ @foo, @bar ]
74
+ @handler.expects(:notify).with(@foo, :changed)
75
+ @handler.trigger
76
+ end
77
+
78
+ ## event type priorities
79
+
80
+ test "mtime > atime" do
81
+ @foo.stubs(:mtime).returns(@now + 100)
82
+ @foo.stubs(:atime).returns(@now + 100)
83
+ @foo.stubs(:ctime).returns(@now + 100)
84
+
85
+ @handler.listen [ @foo, @bar ]
86
+ @handler.expects(:notify).with(@foo, :modified)
87
+ @handler.trigger
88
+ end
89
+
90
+ test "mtime > ctime" do
91
+ @foo.stubs(:mtime).returns(@now + 100)
92
+ @foo.stubs(:ctime).returns(@now + 100)
93
+
94
+ @handler.listen [ @foo, @bar ]
95
+ @handler.expects(:notify).with(@foo, :modified)
96
+ @handler.trigger
97
+ end
98
+
99
+ test "atime > ctime" do
100
+ @foo.stubs(:atime).returns(@now + 100)
101
+ @foo.stubs(:ctime).returns(@now + 100)
102
+
103
+ @handler.listen [ @foo, @bar ]
104
+ @handler.expects(:notify).with(@foo, :accessed)
105
+ @handler.trigger
106
+ end
107
+
108
+ test "deleted > mtime" do
109
+ @foo.stubs(:exist?).returns(false)
110
+ @foo.stubs(:mtime ).returns(@now + 100)
111
+
112
+ @handler.listen [ @foo, @bar ]
113
+ @handler.expects(:notify).with(@foo, :deleted)
114
+ @handler.trigger
43
115
  end
44
116
 
45
117
  ## on the fly updates of monitored files list
@@ -55,4 +127,16 @@ class PortableEventHandlerTest < Test::Unit::TestCase
55
127
  @handler.monitored_paths.should exclude(@foo)
56
128
  @handler.monitored_paths.should exclude(@bar)
57
129
  end
130
+
131
+ test "retries on ENOENT errors" do
132
+ @oops = Pathname('oops').expand_path
133
+ @oops.stubs(:exist?).returns(true)
134
+ @oops.stubs(:mtime).raises(Errno::ENOENT).
135
+ then.returns(Time.now + 100)
136
+
137
+ @handler.listen [ @oops ]
138
+
139
+ @handler.expects(:notify).with(@oops, :modified)
140
+ @handler.trigger
141
+ end
58
142
  end
@@ -27,6 +27,11 @@ class TestController < Test::Unit::TestCase
27
27
  @controller.run
28
28
  end
29
29
 
30
+ test "parses the script on #run" do
31
+ @script.expects(:parse!)
32
+ @controller.run
33
+ end
34
+
30
35
  test "adds itself as handler observer" do
31
36
  @handler.count_observers.should be(1)
32
37
  @handler.delete_observer(@controller)
@@ -99,5 +104,10 @@ class TestController < Test::Unit::TestCase
99
104
  @handler.expects(:refresh).with %w( foo bar )
100
105
  @controller.update(path)
101
106
  end
107
+
108
+ test "exits gracefully when Interrupted" do
109
+ @handler.stubs(:listen).raises(Interrupt)
110
+ @controller.run
111
+ end
102
112
  end
103
113
 
@@ -13,10 +13,7 @@ begin
13
13
  rescue LoadError, RuntimeError
14
14
  end
15
15
 
16
- root = Pathname(__FILE__).dirname.parent.expand_path
17
- $:.unshift(root.join('lib').to_s).uniq!
18
-
19
- require 'watchr'
16
+ require 'lib/watchr'
20
17
 
21
18
  class Test::Unit::TestCase
22
19
  class << self
@@ -4,20 +4,33 @@ class TestScript < Test::Unit::TestCase
4
4
  include Watchr
5
5
 
6
6
  def setup
7
- tmpfile = Tempfile.new('foo')
8
- @script = Script.new( Pathname.new( tmpfile.path ) )
7
+ @script = Script.new
9
8
  end
10
9
 
11
10
  ## external api
12
11
 
13
12
  test "watch" do
14
- @script.watch('pattern')
15
- @script.watch('pattern', :event_type)
16
- @script.watch('pattern') { nil }
13
+ @script.ec.watch('pattern')
14
+ @script.ec.watch('pattern', :event_type)
15
+ @script.ec.watch('pattern') { nil }
17
16
  end
18
17
 
19
18
  test "default action" do
20
- @script.default_action { nil }
19
+ @script.ec.default_action { nil }
20
+ end
21
+
22
+ test "reload" do
23
+ @script.ec.reload
24
+ end
25
+
26
+ test "eval context delegates methods to script" do
27
+ @script.ec.watch('pattern')
28
+ @script.ec.watch('pattern', :event_type)
29
+ @script.ec.watch('pattern') { nil }
30
+ @script.ec.default_action { :foo }
31
+
32
+ @script.rules.size.should be(3)
33
+ @script.default_action.call.should be(:foo)
21
34
  end
22
35
 
23
36
  ## functionality
@@ -65,26 +78,48 @@ class TestScript < Test::Unit::TestCase
65
78
  end
66
79
 
67
80
  test "parses script file" do
68
- file = Pathname( Tempfile.open('bar').path )
69
- file.open('w') {|f| f.write <<-STR }
81
+ path = Pathname( Tempfile.open('bar').path )
82
+ path.open('w') {|f| f.write <<-STR }
70
83
  watch( 'abc' ) { :x }
71
84
  STR
72
- script = Script.new(file)
85
+ script = Script.new(path)
86
+ script.parse!
73
87
  script.action_for('abc').call.should be(:x)
74
88
  end
75
89
 
90
+ test "__FILE__ is set properly in script file" do
91
+ path = Pathname( Tempfile.open('bar').path )
92
+ path.open('w') {|f| f.write <<-STR }
93
+ throw __FILE__.to_sym
94
+ STR
95
+ script = Script.new(path)
96
+ lambda { script.parse! }.should throw_symbol(path.to_s.to_sym)
97
+ end
98
+
99
+ test "reloads script file" do
100
+ @script.expects(:parse!)
101
+ @script.ec.reload
102
+ end
103
+
104
+ test "skips parsing on nil script file" do
105
+ script = Script.new
106
+ script.ec.stubs(:instance_eval).raises(Exception) #negative expectation hack
107
+ script.parse!
108
+ end
109
+
76
110
  test "resets state" do
77
111
  @script.default_action { 'x' }
78
112
  @script.watch('foo') { 'bar' }
79
- @script.send(:reset)
80
- @script.instance_variable_get(:@default_action).call.should be(nil)
81
- @script.instance_variable_get(:@rules).should be([])
113
+ @script.reset
114
+ @script.default_action.call.should be(nil)
115
+ @script.rules.should be([])
82
116
  end
83
117
 
84
118
  test "resets state on parse" do
85
- @script.stubs(:instance_eval)
86
- @script.expects(:reset)
87
- @script.parse!
119
+ script = Script.new( Pathname( Tempfile.new('foo').path ) )
120
+ script.stubs(:instance_eval)
121
+ script.expects(:reset)
122
+ script.parse!
88
123
  end
89
124
 
90
125
  test "actions receive a MatchData object" do
@@ -108,6 +143,11 @@ class TestScript < Test::Unit::TestCase
108
143
  script.path.should be(path)
109
144
  end
110
145
 
146
+ test "nil file path" do
147
+ script = Script.new
148
+ script.path.should be(nil)
149
+ end
150
+
111
151
  test "later rules take precedence" do
112
152
  @script.watch('a/(.*)\.x') { :x }
113
153
  @script.watch('a/b/(.*)\.x') { :y }
@@ -1,56 +1,21 @@
1
+ require 'lib/watchr'
1
2
 
2
3
  Gem::Specification.new do |s|
3
- s.name = 'watchr'
4
- s.version = '0.5.7'
5
- s.summary = "Modern continious testing (flexible alternative to autotest)"
6
- s.description = "Modern continious testing (flexible alternative to autotest)."
7
- s.author = "mynyml"
8
- s.email = 'mynyml@gmail.com'
9
- s.homepage = 'http://mynyml.com/ruby/flexible-continuous-testing'
10
- s.has_rdoc = true
11
- s.rdoc_options = %w( --main README.rdoc )
12
- s.extra_rdoc_files = %w( README.rdoc )
13
- s.require_path = "lib"
14
- s.bindir = "bin"
15
- s.executables = "watchr"
16
- s.files = %w[
17
- .gitignore
18
- History.txt
19
- LICENSE
20
- Manifest
21
- README.rdoc
22
- Rakefile
23
- TODO.txt
24
- bin/watchr
25
- docs.watchr
26
- gem.watchr
27
- lib/watchr.rb
28
- lib/watchr/controller.rb
29
- lib/watchr/event_handlers/base.rb
30
- lib/watchr/event_handlers/portable.rb
31
- lib/watchr/event_handlers/unix.rb
32
- lib/watchr/script.rb
33
- manifest.watchr
34
- specs.watchr
35
- test/README
36
- test/event_handlers/test_base.rb
37
- test/event_handlers/test_portable.rb
38
- test/event_handlers/test_unix.rb
39
- test/test_controller.rb
40
- test/test_helper.rb
41
- test/test_script.rb
42
- test/test_watchr.rb
43
- watchr.gemspec
44
- ]
45
- s.test_files = %w[
46
- test/test_helper.rb
47
- test/test_watchr.rb
48
- test/test_script.rb
49
- test/test_controller.rb
50
- test/event_handlers/test_base.rb
51
- test/event_handlers/test_unix.rb
52
- test/event_handlers/test_portable.rb
53
- ]
4
+ s.name = "watchr"
5
+ s.summary = "Modern continious testing (flexible alternative to autotest)"
6
+ s.description = "Modern continious testing (flexible alternative to autotest)."
7
+ s.author = "mynyml"
8
+ s.email = "mynyml@gmail.com"
9
+ s.homepage = "http://mynyml.com/ruby/flexible-continuous-testing"
10
+ s.rubyforge_project = "watchr"
11
+ s.has_rdoc = true
12
+ s.rdoc_options = %w( --main README.rdoc )
13
+ s.extra_rdoc_files = %w( README.rdoc )
14
+ s.require_path = "lib"
15
+ s.bindir = "bin"
16
+ s.executables = "watchr"
17
+ s.version = Watchr::VERSION
18
+ s.files = File.read("Manifest").strip.split("\n")
54
19
 
55
20
  s.add_development_dependency 'mocha'
56
21
  s.add_development_dependency 'jeremymcanally-matchy'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watchr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - mynyml
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-02 00:00:00 -04:00
12
+ date: 2009-11-12 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -122,16 +122,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
122
  version:
123
123
  requirements: []
124
124
 
125
- rubyforge_project:
125
+ rubyforge_project: watchr
126
126
  rubygems_version: 1.3.5
127
127
  signing_key:
128
128
  specification_version: 3
129
129
  summary: Modern continious testing (flexible alternative to autotest)
130
- test_files:
131
- - test/test_helper.rb
132
- - test/test_watchr.rb
133
- - test/test_script.rb
134
- - test/test_controller.rb
135
- - test/event_handlers/test_base.rb
136
- - test/event_handlers/test_unix.rb
137
- - test/event_handlers/test_portable.rb
130
+ test_files: []
131
+