rack-unreloader 1.6.0 → 1.7.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 +5 -5
- data/CHANGELOG +4 -0
- data/README.rdoc +5 -0
- data/lib/rack/unreloader.rb +9 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/unreloader_spec.rb +22 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 513c06d3763473095bfcfb9b22a55d5bff7e5ede857a957934923062dd72473f
|
4
|
+
data.tar.gz: 03bc800248c21507ac209104593019e3fc69a398f32a02b7e4e3371d4824d162
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83c6ad5ee6aa7650bf5de240949a20c54b4560c1ef943f3ebc8599a22788cd88c96214ee0f26d540f17eb16f26fe282357f52c1cd4b415980250bc18281675d7
|
7
|
+
data.tar.gz: 96a012e44fc868f4a3a2aa1395c5710156ef9302f36e23a3718af364e03e4f5bd411959c8fa2cf590eede2201208117ab4a47a36def1c6e95a5bb87c0c045978
|
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -62,6 +62,11 @@ When the +:subclasses+ option is given, only subclasses of the given classes
|
|
62
62
|
will be unloaded before reloading the file. It is recommended that
|
63
63
|
you use a +:subclasses+ option when using <tt>Rack::Unreloader</tt>.
|
64
64
|
|
65
|
+
When the +:handle_reload_errors+ option is given, most exceptions raised during
|
66
|
+
reloading will cause the backtrace to be returned, instead of raising the error
|
67
|
+
externally. This can be useful if no middleware that wrap the Unreloader are
|
68
|
+
rescuing exceptions.
|
69
|
+
|
65
70
|
== Dependency Handling
|
66
71
|
|
67
72
|
If your +app.rb+ requires a +models.rb+ file that you also want to get reloaded:
|
data/lib/rack/unreloader.rb
CHANGED
@@ -58,12 +58,13 @@ module Rack
|
|
58
58
|
@app_block = block
|
59
59
|
if opts.fetch(:reload, true)
|
60
60
|
@cooldown = opts.fetch(:cooldown, 1)
|
61
|
+
@handle_reload_errors = opts[:handle_reload_errors]
|
61
62
|
@last = Time.at(0)
|
62
63
|
Kernel.require 'rack/unreloader/reloader'
|
63
64
|
@reloader = Reloader.new(opts)
|
64
65
|
reload!
|
65
66
|
else
|
66
|
-
@reloader = @cooldown = false
|
67
|
+
@reloader = @cooldown = @handle_reload_errors = false
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
@@ -71,7 +72,13 @@ module Rack
|
|
71
72
|
# Call the app with the environment.
|
72
73
|
def call(env)
|
73
74
|
if @cooldown && Time.now > @last + @cooldown
|
74
|
-
|
75
|
+
begin
|
76
|
+
MUTEX.synchronize{reload!}
|
77
|
+
rescue StandardError, ScriptError => e
|
78
|
+
raise unless @handle_reload_errors
|
79
|
+
content = "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
|
80
|
+
return [500, {'Content-Type' => 'text/plain', 'Content-Length' => content.bytesize.to_s}, [content]]
|
81
|
+
end
|
75
82
|
@last = Time.now
|
76
83
|
end
|
77
84
|
@app_block.call.call(env)
|
data/spec/spec_helper.rb
CHANGED
data/spec/unreloader_spec.rb
CHANGED
@@ -157,6 +157,28 @@ describe Rack::Unreloader do
|
|
157
157
|
%r{\ANew classes in .*spec/app\.rb: App\z}
|
158
158
|
end
|
159
159
|
|
160
|
+
it "should support :handle_reload_errors option to return backtrace if there is an error reloading" do
|
161
|
+
ru(:handle_reload_errors=>true).call({}).must_equal [1]
|
162
|
+
update_app("module App; def self.call(env) @a end; @a ||= []; raise 'foo'; end")
|
163
|
+
rack_response = ru.call({})
|
164
|
+
rack_response[0].must_equal 500
|
165
|
+
rack_response[1]['Content-Type'].must_equal 'text/plain'
|
166
|
+
rack_response[1]['Content-Length'].must_match(rack_response[2][0].bytesize.to_s)
|
167
|
+
rack_response[2][0].must_match(/\/spec\/app\.rb:1/)
|
168
|
+
defined?(::App).must_be_nil
|
169
|
+
update_app(code(2))
|
170
|
+
ru.call({}).must_equal [2]
|
171
|
+
log_match %r{\ALoading.*spec/app\.rb\z},
|
172
|
+
%r{\ANew classes in .*spec/app\.rb: App\z},
|
173
|
+
%r{\AUnloading.*spec/app\.rb\z},
|
174
|
+
"Removed constant App",
|
175
|
+
%r{\ALoading.*spec/app\.rb\z},
|
176
|
+
%r{\AFailed to load .*spec/app\.rb; removing partially defined constants\z},
|
177
|
+
"Removed constant App",
|
178
|
+
%r{\ALoading.*spec/app\.rb\z},
|
179
|
+
%r{\ANew classes in .*spec/app\.rb: App\z}
|
180
|
+
end
|
181
|
+
|
160
182
|
it "should unload classes in namespaces" do
|
161
183
|
ru(:code=>"class Array::App; def self.call(env) @a end; @a ||= []; @a << 1; end", :block=>proc{Array::App}).call({}).must_equal [1]
|
162
184
|
update_app("class Array::App; def self.call(env) @a end; @a ||= []; @a << 2; 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.
|
4
|
+
version: 1.7.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:
|
11
|
+
date: 2019-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -84,8 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: '0'
|
86
86
|
requirements: []
|
87
|
-
|
88
|
-
rubygems_version: 2.6.8
|
87
|
+
rubygems_version: 3.0.3
|
89
88
|
signing_key:
|
90
89
|
specification_version: 4
|
91
90
|
summary: Reload application when files change, unloading constants first
|