rack-unreloader 1.2.1 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 075553f6aa8699bd65671b7bcd249d59fa4e9bd3
4
- data.tar.gz: c5a602b7b83f51f1cb1478a4b064297a5e7c44a6
3
+ metadata.gz: 1c8f1734dc2b5c882473017b36c57ebd8ec83ce9
4
+ data.tar.gz: 77139686abfd0970924657fd236717be42b70da5
5
5
  SHA512:
6
- metadata.gz: 9cc298cb22d214f56ab5e2526df44a0504c52ecf13288ce6d472eb13fba07620ffdcfbcd1e7465cdc8034a0738d5d47a744319fa73a5983bfe66aa774796148c
7
- data.tar.gz: 32239e90a7da77adcdfca3378e3e5c03091c58d1ad845871249f4dcc20791bc72dd9452b64a04373cf11a53f282d7c38edacde35ec708c8296273706d7db8640
6
+ metadata.gz: 15eb8fac861e37af6c853b115ab64c38d0ec270273fb13a09f0aa72fc94fe5007b884541f6c5732de1146564342a8b69d05435f22fd076c2fdd842564ebf22b7
7
+ data.tar.gz: b43aad4ee73d6218cad149d523aaa1e1f086bb7020719b78ec7b14e028e4f8530fb4c8e90429a3463344737f4dc4d6332431eecbd6e13d4cbec911f836a00c8c
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ = 1.3.0 (2015-04-06)
2
+
3
+ * Log when specified constant exists before loading file or does not exist after loading (jeremyevans)
4
+
5
+ * Improve logging, making it explicit when files are unloaded and reloaded (jeremyevans)
6
+
7
+ * Allow returning :ObjectSpace for require block to signal that ObjectSpace should be used to determine constants (jeremyevans)
8
+
1
9
  = 1.2.1 (2015-01-27)
2
10
 
3
11
  * Fix homepage in gemspec (jeremyevans)
@@ -224,6 +224,11 @@ your models just use a capitalized version of the filename:
224
224
 
225
225
  Unreloader.require('models'){|f| File.basename(f).sub(/\.rb\z/, '').capitalize}
226
226
 
227
+ In some cases, you may want to pass a block to require, but inside the block
228
+ decide that instead of specifying the constants, ObjectSpace should be used to
229
+ automatically determine the constants loaded. You can specify this by having the
230
+ block return the :ObjectSpace symbol.
231
+
227
232
  == Usage Outside Rack
228
233
 
229
234
  While <tt>Rack::Unreloader</tt> is usually in the development of rack applications,
@@ -234,10 +239,9 @@ reload the application.
234
239
 
235
240
  == History
236
241
 
237
- Rack::Unreloader was derived from Padrino's reloader. It is significantly smaller
238
- as it cuts out a lot of Padrino-specific code, and it forces the user to manually
239
- specify what files to monitor. It has additional features, improvements, and bug
240
- fixes.
242
+ Rack::Unreloader was derived from Padrino's reloader. The Padrino-specific parts
243
+ were removed, and it now requires the user manually specify which files to monitor.
244
+ It has additional features, improvements, and bug fixes.
241
245
 
242
246
  == Caveats
243
247
 
@@ -248,7 +252,8 @@ will not handle correctly. If it isn't doing what you expect, add a logger:
248
252
 
249
253
  Unloading constants causes issues whenever references to the constant are
250
254
  cached anywhere instead of looking up the constant by name. This is fairly
251
- common, and using this library can cause a memory leak in such a case.
255
+ common, and using this library can cause a memory leak or unexpected
256
+ behavior in such a case.
252
257
 
253
258
  Approaches that load a fresh environment for every request (or a fresh
254
259
  environment anytime there are any changes) are going to be more robust than
data/Rakefile CHANGED
@@ -12,15 +12,16 @@ end
12
12
 
13
13
  begin
14
14
  begin
15
- # RSpec 1
16
- require "spec/rake/spectask"
17
- spec_class = Spec::Rake::SpecTask
18
- spec_files_meth = :spec_files=
19
- rescue LoadError
15
+ raise LoadError if ENV['RSPEC1']
20
16
  # RSpec 2
21
17
  require "rspec/core/rake_task"
22
18
  spec_class = RSpec::Core::RakeTask
23
19
  spec_files_meth = :pattern=
20
+ rescue LoadError
21
+ # RSpec 1
22
+ require "spec/rake/spectask"
23
+ spec_class = Spec::Rake::SpecTask
24
+ spec_files_meth = :spec_files=
24
25
  end
25
26
 
26
27
  spec = lambda do |name, files, d|
@@ -15,7 +15,7 @@ module Rack
15
15
  # Rack::Unloader.new for details.
16
16
  def initialize(opts={})
17
17
  @logger = opts[:logger]
18
- @classes = opts[:subclasses] ? Array(opts[:subclasses]).map{|s| s.to_s} : %w'Object'
18
+ @classes = opts[:subclasses] ? Array(opts[:subclasses]).map(&:to_s) : %w'Object'
19
19
 
20
20
  # Hash of files being monitored for changes, keyed by absolute path of file name,
21
21
  # with values being the last modified time (or nil if the file has not yet been loaded).
@@ -176,7 +176,7 @@ module Rack
176
176
  if m = VALID_CONSTANT_NAME_REGEXP.match(s)
177
177
  Object.module_eval("::#{m[1]}", __FILE__, __LINE__)
178
178
  else
179
- log("#{s.inspect} is not a valid constant name!")
179
+ log("Invalid constant name: #{s}")
180
180
  end
181
181
  end
182
182
 
@@ -229,8 +229,8 @@ module Rack
229
229
  return unless @monitor_files.has_key?(file)
230
230
  return unless options[:force] || file_changed?(file)
231
231
 
232
- log "#{@monitor_files[file] ? 'Reloading' : 'Loading'} #{file}"
233
232
  prepare(file) # might call #safe_load recursively
233
+ log "Loading #{file}"
234
234
  begin
235
235
  require(file)
236
236
  commit(file)
@@ -257,8 +257,8 @@ module Rack
257
257
  # can be required again.
258
258
  def remove_feature(file)
259
259
  if @monitor_files.has_key?(file)
260
+ log "Unloading #{file}"
260
261
  $LOADED_FEATURES.delete(file)
261
- log "Removed feature #{file}"
262
262
  end
263
263
  end
264
264
 
@@ -266,24 +266,24 @@ module Rack
266
266
  # by the file.
267
267
  def remove(name)
268
268
  file = @files[name] || return
269
- remove_constants(name){file[:constants]}
269
+ remove_feature(name) if $LOADED_FEATURES.include?(name)
270
270
  file[:features].each{|feature| remove_feature(feature)}
271
+ remove_constants(name){file[:constants]}
271
272
  @files.delete(name)
272
- remove_feature(name) if $LOADED_FEATURES.include?(name)
273
273
  end
274
274
 
275
275
  # Remove constants defined in file. Uses the stored block if there is
276
276
  # one for the file name, or the given block.
277
277
  def remove_constants(name)
278
- constants = if pr = @constants_defined[name]
279
- Array(pr.call(name))
280
- else
281
- yield
282
- end
278
+ yield.each{|constant| remove_constant(constant)}
279
+ end
283
280
 
284
- if constants
285
- constants.each{|constant| remove_constant(constant)}
286
- end
281
+ # True if the constant is already defined, false if not
282
+ def constant_defined?(const)
283
+ constantize(const)
284
+ true
285
+ rescue
286
+ false
287
287
  end
288
288
 
289
289
  # Store the currently loaded classes and features, so in case of an error
@@ -291,33 +291,60 @@ module Rack
291
291
  def prepare(name)
292
292
  file = remove(name)
293
293
  @old_entries[name] = {:features => monitored_features}
294
+ if constants = constants_for(name)
295
+ defs = constants.select{|c| constant_defined?(c)}
296
+ unless defs.empty?
297
+ log "Constants already defined before loading #{name}: #{defs.join(" ")}"
298
+ end
299
+ @old_entries[name][:constants] = constants
300
+ else
301
+ @old_entries[name][:all_classes] = all_classes
302
+ end
303
+ end
294
304
 
295
- unless @constants_defined[name]
296
- @old_entries[name][:constants] = all_classes
305
+ # Returns nil if ObjectSpace should be used to load the constants. Returns an array of
306
+ # constant name symbols loaded by the file if they have been manually specified.
307
+ def constants_for(name)
308
+ if (pr = @constants_defined[name]) && (constants = pr.call(name)) != :ObjectSpace
309
+ Array(constants)
310
+ end
311
+ end
312
+
313
+ # The constants that were loaded by the given file. If ObjectSpace was used to check
314
+ # all classes loaded previously, then check for new classes loaded since. If the constants
315
+ # were explicitly specified, then use them directly
316
+ def constants_loaded_by(name)
317
+ if @old_entries[name][:all_classes]
318
+ new_classes(@old_entries[name][:all_classes])
319
+ else
320
+ @old_entries[name][:constants]
297
321
  end
298
322
  end
299
323
 
300
324
  # Commit the changed state after requiring the the file, recording the new
301
325
  # classes and features added by the file.
302
326
  def commit(name)
303
- entry = {:features => monitored_features - @old_entries[name][:features] - [name]}
304
- unless constants_defined = @constants_defined[name]
305
- entry[:constants] = new_classes(@old_entries[name][:constants])
306
- end
327
+ entry = {:features => monitored_features - @old_entries[name][:features] - [name], :constants=>constants_loaded_by(name)}
307
328
 
308
329
  @files[name] = entry
309
330
  @old_entries.delete(name)
310
331
  @monitor_files[name] = modified_at(name)
311
332
 
312
- unless constants_defined
313
- log("New classes in #{name}: #{entry[:constants].to_a.join(' ')}") unless entry[:constants].empty?
333
+ defs, not_defs = entry[:constants].partition{|c| constant_defined?(c)}
334
+ unless not_defs.empty?
335
+ log "Constants not defined after loading #{name}: #{not_defs.join(' ')}"
336
+ end
337
+ unless defs.empty?
338
+ log("New classes in #{name}: #{defs.join(' ')}")
339
+ end
340
+ unless entry[:features].empty?
341
+ log("New features in #{name}: #{entry[:features].to_a.join(' ')}")
314
342
  end
315
- log("New features in #{name}: #{entry[:features].to_a.join(' ')}") unless entry[:features].empty?
316
343
  end
317
344
 
318
345
  # Rollback the changes made by requiring the file, restoring the previous state.
319
346
  def rollback(name)
320
- remove_constants(name){new_classes(@old_entries[name][:constants])}
347
+ remove_constants(name){constants_loaded_by(name)}
321
348
  @old_entries.delete(name)
322
349
  end
323
350
 
@@ -330,7 +357,7 @@ module Rack
330
357
  def all_classes
331
358
  rs = Set.new
332
359
 
333
- ObjectSpace.each_object(Module).each do |mod|
360
+ ::ObjectSpace.each_object(Module).each do |mod|
334
361
  if !mod.name.to_s.empty? && monitored_module?(mod)
335
362
  rs << mod
336
363
  end
@@ -62,7 +62,7 @@ describe Rack::Unreloader do
62
62
  end
63
63
 
64
64
  def log_match(*logs)
65
- logs.length.should == @logger.length
65
+ @logger.length.should == logs.length
66
66
  logs.zip(@logger).each{|l, log| l.is_a?(String) ? log.should == l : log.should =~ l}
67
67
  end
68
68
 
@@ -102,9 +102,24 @@ describe Rack::Unreloader do
102
102
  ru.call({}).should == [2]
103
103
  log_match %r{\ALoading.*spec/app\.rb\z},
104
104
  %r{\ANew classes in .*spec/app\.rb: App\z},
105
- %r{\AReloading.*spec/app\.rb\z},
105
+ %r{\AUnloading.*spec/app\.rb\z},
106
106
  "Removed constant App",
107
- %r{\ARemoved feature .*/spec/app.rb\z},
107
+ %r{\ALoading.*spec/app\.rb\z},
108
+ %r{\ANew classes in .*spec/app\.rb: App\z}
109
+ end
110
+
111
+ it "should check constants using ObjectSpace if require proc returns :ObjectSpace" do
112
+ base_ru
113
+ update_app(code(1))
114
+ @ru.require(@filename){|f| :ObjectSpace}
115
+ ru.call({}).should == [1]
116
+ update_app(code(2))
117
+ ru.call({}).should == [2]
118
+ log_match %r{\ALoading.*spec/app\.rb\z},
119
+ %r{\ANew classes in .*spec/app\.rb: App\z},
120
+ %r{\AUnloading.*spec/app\.rb\z},
121
+ "Removed constant App",
122
+ %r{\ALoading.*spec/app\.rb\z},
108
123
  %r{\ANew classes in .*spec/app\.rb: App\z}
109
124
  end
110
125
 
@@ -117,16 +132,16 @@ describe Rack::Unreloader do
117
132
  ru.call({}).should == [[2], [4]]
118
133
  log_match %r{\ALoading.*spec/app\.rb\z},
119
134
  %r{\ANew classes in .*spec/app\.rb: App\z},
120
- %r{\AReloading.*spec/app\.rb\z},
135
+ %r{\AUnloading.*spec/app\.rb\z},
121
136
  "Removed constant App",
122
- %r{\ARemoved feature .*/spec/app.rb\z},
137
+ %r{\ALoading.*spec/app\.rb\z},
123
138
  %r{\ALoading.*spec/app2\.rb\z},
124
139
  %r{\ANew classes in .*spec/app2\.rb: App2\z},
125
140
  %r{\ANew classes in .*spec/app\.rb: (App App2|App2 App)\z},
126
141
  %r{\ANew features in .*spec/app\.rb: .*spec/app2\.rb\z},
127
- %r{\AReloading.*spec/app2\.rb\z},
142
+ %r{\AUnloading.*spec/app2\.rb\z},
128
143
  "Removed constant App2",
129
- %r{\ARemoved feature .*/spec/app2.rb\z},
144
+ %r{\ALoading.*spec/app2\.rb\z},
130
145
  %r{\ANew classes in .*spec/app2\.rb: App2\z}
131
146
  end
132
147
 
@@ -139,23 +154,23 @@ describe Rack::Unreloader do
139
154
  ru.call({}).should == [[1, 2], [4]]
140
155
  update_app("RU.require 'spec/app2.rb'; class App; def self.call(env) [@a, App2.call(env)] end; @a ||= []; @a << 2; end")
141
156
  log_match %r{\ALoading.*spec/app\.rb\z},
142
- %r{\AReloading.*spec/app\.rb\z},
143
- %r{\ARemoved feature .*/spec/app.rb\z},
157
+ %r{\AUnloading.*spec/app\.rb\z},
158
+ %r{\ALoading.*spec/app\.rb\z},
144
159
  %r{\ALoading.*spec/app2\.rb\z},
145
160
  %r{\ANew classes in .*spec/app2\.rb: App2\z},
146
161
  %r{\ANew classes in .*spec/app\.rb: App2\z},
147
162
  %r{\ANew features in .*spec/app\.rb: .*spec/app2\.rb\z},
148
- %r{\AReloading.*spec/app2\.rb\z},
163
+ %r{\AUnloading.*spec/app2\.rb\z},
149
164
  "Removed constant App2",
150
- %r{\ARemoved feature .*/spec/app2.rb\z},
165
+ %r{\ALoading.*spec/app2\.rb\z},
151
166
  %r{\ANew classes in .*spec/app2\.rb: App2\z}
152
167
  end
153
168
 
154
169
  it "should log invalid constant names in :subclasses options" do
155
170
  ru(:subclasses=>%w'1 Object').call({}).should == [1]
156
171
  logger.uniq!
157
- log_match %r{\ALoading.*spec/app\.rb\z},
158
- '"1" is not a valid constant name!',
172
+ log_match 'Invalid constant name: 1',
173
+ %r{\ALoading.*spec/app\.rb\z},
159
174
  %r{\ANew classes in .*spec/app\.rb: App\z}
160
175
  end
161
176
 
@@ -165,9 +180,9 @@ describe Rack::Unreloader do
165
180
  ru.call({}).should == [2]
166
181
  log_match %r{\ALoading.*spec/app\.rb\z},
167
182
  %r{\ANew classes in .*spec/app\.rb: App\z},
168
- %r{\AReloading.*spec/app\.rb\z},
183
+ %r{\AUnloading.*spec/app\.rb\z},
169
184
  "Removed constant App",
170
- %r{\ARemoved feature .*/spec/app.rb\z},
185
+ %r{\ALoading.*spec/app\.rb\z},
171
186
  %r{\ANew classes in .*spec/app\.rb: App\z}
172
187
  end
173
188
 
@@ -177,9 +192,9 @@ describe Rack::Unreloader do
177
192
  ru.call({}).should == [2]
178
193
  log_match %r{\ALoading.*spec/app\.rb\z},
179
194
  %r{\ANew classes in .*spec/app\.rb: App\z},
180
- %r{\AReloading.*spec/app\.rb\z},
195
+ %r{\AUnloading.*spec/app\.rb\z},
181
196
  "Removed constant App",
182
- %r{\ARemoved feature .*/spec/app.rb\z},
197
+ %r{\ALoading.*spec/app\.rb\z},
183
198
  %r{\ANew classes in .*spec/app\.rb: App\z}
184
199
  end
185
200
 
@@ -188,8 +203,8 @@ describe Rack::Unreloader do
188
203
  update_app("module App; def self.call(env) @a end; @a ||= []; @a << 2; end")
189
204
  ru.call({}).should == [1, 2]
190
205
  log_match %r{\ALoading.*spec/app\.rb\z},
191
- %r{\AReloading.*spec/app\.rb\z},
192
- %r{\ARemoved feature .*/spec/app.rb\z}
206
+ %r{\AUnloading.*spec/app\.rb\z},
207
+ %r{\ALoading.*spec/app\.rb\z}
193
208
  end
194
209
 
195
210
  it "should unload partially loaded modules if loading fails, and allow future loading" do
@@ -201,12 +216,12 @@ describe Rack::Unreloader do
201
216
  ru.call({}).should == [2]
202
217
  log_match %r{\ALoading.*spec/app\.rb\z},
203
218
  %r{\ANew classes in .*spec/app\.rb: App\z},
204
- %r{\AReloading.*spec/app\.rb\z},
219
+ %r{\AUnloading.*spec/app\.rb\z},
205
220
  "Removed constant App",
206
- %r{\ARemoved feature .*/spec/app.rb\z},
221
+ %r{\ALoading.*spec/app\.rb\z},
207
222
  %r{\AFailed to load .*spec/app\.rb; removing partially defined constants\z},
208
223
  "Removed constant App",
209
- %r{\AReloading.*spec/app\.rb\z},
224
+ %r{\ALoading.*spec/app\.rb\z},
210
225
  %r{\ANew classes in .*spec/app\.rb: App\z}
211
226
  end
212
227
 
@@ -216,9 +231,9 @@ describe Rack::Unreloader do
216
231
  ru.call({}).should == [2]
217
232
  log_match %r{\ALoading.*spec/app\.rb\z},
218
233
  %r{\ANew classes in .*spec/app\.rb: Array::App\z},
219
- %r{\AReloading.*spec/app\.rb\z},
234
+ %r{\AUnloading.*spec/app\.rb\z},
220
235
  "Removed constant Array::App",
221
- %r{\ARemoved feature .*/spec/app.rb\z},
236
+ %r{\ALoading.*spec/app\.rb\z},
222
237
  %r{\ANew classes in .*spec/app\.rb: Array::App\z}
223
238
  end
224
239
 
@@ -236,12 +251,12 @@ describe Rack::Unreloader do
236
251
  %r{\ALoading.*spec/app2\.rb\z},
237
252
  %r{\ANew classes in .*spec/app\.rb: App\z},
238
253
  %r{\ANew features in .*spec/app\.rb: .*spec/app2\.rb\z},
239
- %r{\AReloading.*spec/app2\.rb\z},
240
- %r{\ARemoved feature .*/spec/app2.rb\z},
241
- %r{\AReloading.*spec/app\.rb\z},
254
+ %r{\AUnloading.*spec/app2\.rb\z},
255
+ %r{\ALoading.*spec/app2\.rb\z},
256
+ %r{\AUnloading.*spec/app\.rb\z},
257
+ %r{\AUnloading.*spec/app2\.rb\z},
242
258
  "Removed constant App",
243
- %r{\ARemoved feature .*/spec/app2.rb\z},
244
- %r{\ARemoved feature .*/spec/app.rb\z},
259
+ %r{\ALoading.*spec/app\.rb\z},
245
260
  %r{\ALoading.*spec/app2\.rb\z},
246
261
  %r{\ANew classes in .*spec/app\.rb: App\z},
247
262
  %r{\ANew features in .*spec/app\.rb: .*spec/app2\.rb\z}
@@ -255,9 +270,11 @@ describe Rack::Unreloader do
255
270
  update_app("class App; def self.call(env) [@a, App2.a] end; @a ||= []; @a << 3; end; class App2; def self.a; @a end; @a ||= []; @a << 4; end")
256
271
  ru.call({}).should == [[3], [2, 4]]
257
272
  log_match %r{\ALoading.*spec/app\.rb\z},
258
- %r{\AReloading.*spec/app\.rb\z},
273
+ %r{\ANew classes in .*spec/app\.rb: App\z},
274
+ %r{\AUnloading.*spec/app\.rb\z},
259
275
  "Removed constant App",
260
- %r{\ARemoved feature .*/spec/app.rb\z}
276
+ %r{\ALoading.*spec/app\.rb\z},
277
+ %r{\ANew classes in .*spec/app\.rb: App\z}
261
278
  end
262
279
 
263
280
  it "should handle anonymous classes" do
@@ -268,8 +285,8 @@ describe Rack::Unreloader do
268
285
  update_app("$app = Class.new do def self.call(env) @a end; @a ||= []; @a << 2; end")
269
286
  ru.call({}).should == [2]
270
287
  log_match %r{\ALoading.*spec/app\.rb\z},
271
- %r{\AReloading.*spec/app\.rb\z},
272
- %r{\ARemoved feature .*/spec/app.rb\z}
288
+ %r{\AUnloading.*spec/app\.rb\z},
289
+ %r{\ALoading.*spec/app\.rb\z}
273
290
  end
274
291
 
275
292
  it "should log when attempting to remove a class that doesn't exist" do
@@ -280,9 +297,22 @@ describe Rack::Unreloader do
280
297
  update_app(code(2))
281
298
  ru.call({}).should == [1, 2]
282
299
  log_match %r{\ALoading.*spec/app\.rb\z},
283
- %r{\AReloading.*spec/app\.rb\z},
300
+ %r{\AConstants not defined after loading .*spec/app\.rb: Foo\z},
301
+ %r{\AUnloading.*spec/app\.rb\z},
284
302
  "Error removing constant: Foo",
285
- %r{\ARemoved feature .*/spec/app.rb\z}
303
+ %r{\ALoading.*spec/app\.rb\z},
304
+ %r{\AConstants not defined after loading .*spec/app\.rb: Foo\z}
305
+ end
306
+
307
+ it "should log when specifying a constant that already exists" do
308
+ base_ru
309
+ update_app(code(1))
310
+ ::App2 = 1
311
+ @ru.require('spec/app.rb'){|f| 'App2'}
312
+ ru.call({}).should == [1]
313
+ log_match %r{\AConstants already defined before loading .*spec/app\.rb: App2\z},
314
+ %r{\ALoading.*spec/app\.rb\z},
315
+ %r{\ANew classes in .*spec/app\.rb: App2\z}
286
316
  end
287
317
 
288
318
  it "should handle recorded dependencies" do
@@ -404,8 +434,8 @@ describe Rack::Unreloader do
404
434
  %r{\ALoading.*spec/dir/a\.rb\z},
405
435
  %r{\ANew classes in .*spec/app\.rb: App\z},
406
436
  %r{\ANew features in .*spec/app\.rb: .*spec/dir/a\.rb\z},
407
- %r{\AReloading .*/spec/dir/a.rb\z},
408
- %r{\ARemoved feature .*/spec/dir/a.rb\z}
437
+ %r{\AUnloading .*/spec/dir/a.rb\z},
438
+ %r{\ALoading .*/spec/dir/a.rb\z}
409
439
  end
410
440
 
411
441
  it "should pick up changes to files in subdirectories" do
@@ -420,8 +450,8 @@ describe Rack::Unreloader do
420
450
  %r{\ALoading.*spec/dir/subdir/a\.rb\z},
421
451
  %r{\ANew classes in .*spec/app\.rb: App\z},
422
452
  %r{\ANew features in .*spec/app\.rb: .*spec/dir/subdir/a\.rb\z},
423
- %r{\AReloading .*/spec/dir/subdir/a.rb\z},
424
- %r{\ARemoved feature .*/spec/dir/subdir/a.rb\z}
453
+ %r{\AUnloading .*/spec/dir/subdir/a.rb\z},
454
+ %r{\ALoading .*/spec/dir/subdir/a.rb\z}
425
455
  end
426
456
 
427
457
  it "should pick up new files added to the directory" do
@@ -461,7 +491,7 @@ describe Rack::Unreloader do
461
491
  %r{\ALoading.*spec/dir/a\.rb\z},
462
492
  %r{\ANew classes in .*spec/app\.rb: App\z},
463
493
  %r{\ANew features in .*spec/app\.rb: .*spec/dir/a\.rb\z},
464
- %r{\ARemoved feature .*/spec/dir/a.rb\z},
494
+ %r{\AUnloading .*/spec/dir/a.rb\z},
465
495
  %r{\ALoading.*spec/dir/b\.rb\z}
466
496
  end
467
497
 
@@ -478,7 +508,7 @@ describe Rack::Unreloader do
478
508
  %r{\ALoading.*spec/dir/subdir/a\.rb\z},
479
509
  %r{\ANew classes in .*spec/app\.rb: App\z},
480
510
  %r{\ANew features in .*spec/app\.rb: .*spec/dir/subdir/a\.rb\z},
481
- %r{\ARemoved feature .*/spec/dir/subdir/a.rb\z},
511
+ %r{\AUnloading .*/spec/dir/subdir/a.rb\z},
482
512
  %r{\ALoading.*spec/dir/subdir/b\.rb\z}
483
513
  end
484
514
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-unreloader
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-27 00:00:00.000000000 Z
11
+ date: 2015-04-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Rack::Unreloader is a rack middleware that reloads application files when it