mr-sparkle 0.0.1 → 0.0.2
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/CHANGES.md +7 -0
- data/Rakefile +7 -0
- data/bin/mr-sparkle +1 -1
- data/lib/mr-sparkle.rb +17 -15
- data/lib/mr-sparkle/version.rb +1 -1
- data/mr-sparkle.gemspec +6 -0
- data/spec/fixtures/full_reload/Gemfile +5 -0
- data/spec/fixtures/full_reload/config.ru +5 -0
- data/spec/fixtures/full_reload/file.notwatched +1 -0
- data/spec/fixtures/full_reload/vendor/full_reload_test_gem/full_reload_test_gem.gemspec +18 -0
- data/spec/fixtures/full_reload/vendor/full_reload_test_gem/lib/full_reload_test_gem.rb +3 -0
- data/spec/fixtures/hello/Gemfile +4 -0
- data/spec/fixtures/hello/config.ru +1 -0
- data/spec/full_reload_spec.rb +41 -0
- data/spec/normal_running_spec.rb +20 -0
- data/spec/spec_helper.rb +126 -0
- metadata +133 -12
data/CHANGES.md
ADDED
data/Rakefile
CHANGED
data/bin/mr-sparkle
CHANGED
data/lib/mr-sparkle.rb
CHANGED
@@ -10,27 +10,22 @@ module Mr
|
|
10
10
|
|
11
11
|
class Daemon
|
12
12
|
|
13
|
-
def initialize(options, unicorn_args)
|
14
|
-
@reload_pattern = options[:pattern] || DEFAULT_RELOAD_PATTERN
|
15
|
-
@full_reload_pattern = options[:full] || DEFAULT_FULL_RELOAD_PATTERN
|
16
|
-
@unicorn_args = unicorn_args
|
17
|
-
end
|
18
|
-
|
19
13
|
def start_unicorn
|
20
|
-
Kernel.spawn('unicorn', '-c',
|
14
|
+
@unicorn_pid = Kernel.spawn('unicorn', '-c',
|
21
15
|
File.expand_path('mr-sparkle/unicorn.conf.rb',File.dirname(__FILE__)),
|
22
16
|
*@unicorn_args)
|
23
17
|
end
|
24
18
|
|
25
|
-
def run()
|
26
|
-
|
27
|
-
|
19
|
+
def run(options, unicorn_args)
|
20
|
+
reload_pattern = options[:pattern] || DEFAULT_RELOAD_PATTERN
|
21
|
+
full_reload_pattern = options[:full] || DEFAULT_FULL_RELOAD_PATTERN
|
22
|
+
@unicorn_args = unicorn_args
|
28
23
|
listener = Listen.to('.', :relative_paths=>true)
|
29
|
-
listener.filter(
|
30
|
-
listener.filter(
|
24
|
+
listener.filter(full_reload_pattern)
|
25
|
+
listener.filter(reload_pattern)
|
31
26
|
listener.change do |modified, added, removed|
|
32
|
-
puts "File change event detected: #{
|
33
|
-
if (modified + added + removed).index {|f| f =~
|
27
|
+
$stderr.puts "File change event detected: #{{modified: modified, added: added, removed: removed}.inspect}"
|
28
|
+
if (modified + added + removed).index {|f| f =~ full_reload_pattern}
|
34
29
|
# Reload everything. Perhaps this could use the "procedure to
|
35
30
|
# replace a running unicorn executable" described at:
|
36
31
|
# http://unicorn.bogomips.org/SIGNALS.html
|
@@ -38,7 +33,7 @@ module Mr
|
|
38
33
|
# and this is just way simpler for now.
|
39
34
|
Process.kill(:QUIT, @unicorn_pid)
|
40
35
|
Process.wait(@unicorn_pid)
|
41
|
-
|
36
|
+
start_unicorn
|
42
37
|
else
|
43
38
|
# Send a HUP to unicorn to tell it to gracefully shut down its
|
44
39
|
# workers
|
@@ -61,6 +56,13 @@ module Mr
|
|
61
56
|
# So we need to start it in the background, then keep this thread
|
62
57
|
# alive just so it can wait to be interrupted.
|
63
58
|
listener.start(false)
|
59
|
+
# Theoretically, we could have problems if a file changed RIGHT AT
|
60
|
+
# THIS POINT, between the time we started the listener and the time
|
61
|
+
# we started the unicorn process. But this is just for development,
|
62
|
+
# so we're just not going to worry about that.
|
63
|
+
start_unicorn
|
64
|
+
|
65
|
+
# And now we just want to keep the thread alive--we're just waiting around to get interrupted at this point.
|
64
66
|
sleep(99999) while true
|
65
67
|
end
|
66
68
|
|
data/lib/mr-sparkle/version.rb
CHANGED
data/mr-sparkle.gemspec
CHANGED
@@ -25,4 +25,10 @@ Gem::Specification.new do |gem|
|
|
25
25
|
# https://github.com/guard/guard#efficient-filesystem-handling
|
26
26
|
gem.add_dependency('rb-inotify', '~>0.8.8')
|
27
27
|
gem.add_dependency('rb-fsevent', '~>0.9.2')
|
28
|
+
|
29
|
+
gem.add_development_dependency('minitest', '~>4.3.3')
|
30
|
+
gem.add_development_dependency('minitest-reporters', '~>0.13.1')
|
31
|
+
gem.add_development_dependency('minitest-around', '~>0.0.1')
|
32
|
+
gem.add_development_dependency('rack', '~>1.4.1')
|
33
|
+
gem.add_development_dependency('rake', '~>10.0.3')
|
28
34
|
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'full_reload_test_gem'
|
3
|
+
# This is loaded just once--subsequent changes to the file won't be reflected...
|
4
|
+
string_from_file = IO.read(File.expand_path("file.notwatched",File.dirname(__FILE__)))
|
5
|
+
run lambda {|env| [200, {'Content-Type' => 'text/plain'}, [string_from_file+FullReloadTestGem::THINGY]] }
|
@@ -0,0 +1 @@
|
|
1
|
+
This file was not watched.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "full_reload_test_gem"
|
7
|
+
gem.version = '0.0.1'
|
8
|
+
gem.authors = ["Micah Chalmer"]
|
9
|
+
gem.email = ["micah@micahchalmer.net"]
|
10
|
+
gem.description = %q{This is only here as part of a test fixture}
|
11
|
+
gem.summary = %q{This is only here as part of a test fixture}
|
12
|
+
gem.homepage = ""
|
13
|
+
|
14
|
+
gem.files = ['lib/full_reload_test_gem.rb']
|
15
|
+
gem.executables = []
|
16
|
+
gem.test_files = []
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
run lambda {|env| [200, {'Content-Type' => 'text/plain'}, ["Hello, world!"]] }
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
VENDOR_GEM_CODE_PATH = 'vendor/full_reload_test_gem/lib/full_reload_test_gem.rb'
|
4
|
+
INITIAL_STRING = "This file was not watched.\nThis string is from a gem."
|
5
|
+
|
6
|
+
describe "App Runner: Full Reloading" do
|
7
|
+
before do
|
8
|
+
self.app_template_path = app_template_fixture("full_reload")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "does not reload when a file that isn't watched is changed" do
|
12
|
+
start_app
|
13
|
+
app_request('/').body.must_equal(INITIAL_STRING)
|
14
|
+
change_file('file.notwatched', /not watched/, 'changed')
|
15
|
+
# The whole point of this is that a change is NOT fired off--so we
|
16
|
+
# can't wait for that. Sleep to give it time to wrongly trigger,
|
17
|
+
# if it were going to.
|
18
|
+
sleep(3)
|
19
|
+
app_request('/').body.must_match(/^This file was not watched/)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "reloads the app when config.ru changes, but not the gem" do
|
23
|
+
start_app
|
24
|
+
app_request('/').body.must_equal(INITIAL_STRING)
|
25
|
+
change_file('file.notwatched', /not watched/, 'changed')
|
26
|
+
change_file(VENDOR_GEM_CODE_PATH, /from a gem/, 'also changed but will not be reflected')
|
27
|
+
change_file('config.ru', /be reflected.../, 'comment changed just to trigger')
|
28
|
+
watch_until_change_detected
|
29
|
+
app_request('/').body.must_equal("This file was changed.\nThis string is from a gem.")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "reloads the entire app, including gems, when Gemfile is changed" do
|
33
|
+
start_app
|
34
|
+
app_request('/').body.must_equal(INITIAL_STRING)
|
35
|
+
change_file('file.notwatched', /not watched/, 'changed')
|
36
|
+
change_file(VENDOR_GEM_CODE_PATH, /from a gem/, 'from a gem and this time it will show changes')
|
37
|
+
change_file('Gemfile', /sample Gemfile/, 'sample changed Gemfile')
|
38
|
+
watch_until_change_detected
|
39
|
+
app_request('/').body.must_equal("This file was changed.\nThis string is from a gem and this time it will show changes.")
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe "App Runner: Normal Operation" do
|
4
|
+
before do
|
5
|
+
self.app_template_path = app_template_fixture('hello')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "runs the application" do
|
9
|
+
start_app
|
10
|
+
app_request('/').body.must_match(/^Hello, world!/)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "reloads the application when a ruby file changes" do
|
14
|
+
start_app
|
15
|
+
app_request('/').body.must_match(/^Hello, world!/)
|
16
|
+
change_file('config.ru', /world/, "Dolly")
|
17
|
+
watch_until_change_detected
|
18
|
+
app_request('/').body.must_match(/^Hello, Dolly!/)
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/reporters'
|
3
|
+
require 'minitest/around'
|
4
|
+
require 'net/http'
|
5
|
+
require 'tmpdir'
|
6
|
+
require 'timeout'
|
7
|
+
require 'bundler'
|
8
|
+
|
9
|
+
MiniTest::Reporters.use! MiniTest::Reporters::SpecReporter.new
|
10
|
+
|
11
|
+
# Max # of seconds to wait before declaring the test failed
|
12
|
+
WAIT_TIMEOUT=10
|
13
|
+
|
14
|
+
class ServerAppTest < MiniTest::Spec
|
15
|
+
|
16
|
+
attr_accessor :app_template_path # Path to the test fixture application to run
|
17
|
+
|
18
|
+
# Use this to get paths for app_template_path
|
19
|
+
def app_template_fixture(name)
|
20
|
+
File.expand_path("fixtures/#{name}",File.dirname(__FILE__))
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :running_app_dir
|
24
|
+
attr_reader :app_pid
|
25
|
+
attr_reader :app_stdout
|
26
|
+
attr_reader :app_stderr
|
27
|
+
|
28
|
+
attr_writer :app_command
|
29
|
+
def app_command
|
30
|
+
@app_command ||= File.expand_path('../bin/mr-sparkle',File.dirname(__FILE__))
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_writer :app_args
|
34
|
+
def app_args
|
35
|
+
# We want unicorn not to listen on non-local ports. We also use a different port
|
36
|
+
# than the usual test server...
|
37
|
+
@app_args || []
|
38
|
+
end
|
39
|
+
|
40
|
+
def start_app
|
41
|
+
stop_app
|
42
|
+
@app_socket_path = File.expand_path("main_unicorn_socket", running_app_dir)
|
43
|
+
Dir.mkdir(File.expand_path('log', running_app_dir))
|
44
|
+
@app_stdout, app_stdout_w = IO.pipe
|
45
|
+
@app_stderr, app_stderr_w = IO.pipe
|
46
|
+
Bundler.with_clean_env do
|
47
|
+
@app_pid = Kernel.spawn(
|
48
|
+
app_command, *app_args, '--', '-l', @app_socket_path,
|
49
|
+
{pgroup: true, chdir: running_app_dir,
|
50
|
+
in: '/dev/null', out: app_stdout_w, err: app_stderr_w, pgroup: true})
|
51
|
+
end
|
52
|
+
|
53
|
+
@old_handler = Signal.trap(:EXIT) do
|
54
|
+
stop_app
|
55
|
+
@old_handler.call if @old_handler
|
56
|
+
end
|
57
|
+
watch_until {|line| File.exists?(@app_socket_path)}
|
58
|
+
end
|
59
|
+
|
60
|
+
def watch_until(stream=@app_stderr, &block)
|
61
|
+
Timeout.timeout(WAIT_TIMEOUT) do
|
62
|
+
stream.each_line do |line|
|
63
|
+
return true if block.call(line)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def app_request(path)
|
69
|
+
# Hat tip to:
|
70
|
+
# http://code.google.com/p/semicomplete/source/browse/codesamples/ruby-supervisorctl.rb?spec=svn3046&r=3046
|
71
|
+
# for how this works
|
72
|
+
sock = Net::BufferedIO.new(UNIXSocket.new(@app_socket_path))
|
73
|
+
req = Net::HTTP::Get.new(path)
|
74
|
+
req.exec(sock, "1.1", path)
|
75
|
+
begin
|
76
|
+
response = Net::HTTPResponse.read_new(sock)
|
77
|
+
end while response.kind_of?(Net::HTTPContinue)
|
78
|
+
response.reading_body(sock, req.response_body_permitted?) { }
|
79
|
+
|
80
|
+
response
|
81
|
+
end
|
82
|
+
|
83
|
+
def stop_app
|
84
|
+
if @app_pid
|
85
|
+
Process.kill(:TERM, -@app_pid) # Negate the pid to kill the whole process group
|
86
|
+
Process.wait(@app_pid)
|
87
|
+
@app_pid = nil
|
88
|
+
end
|
89
|
+
|
90
|
+
Signal.trap(:EXIT, @old_handler) if @old_handler
|
91
|
+
@old_handler = nil
|
92
|
+
end
|
93
|
+
|
94
|
+
def change_file(file_name, pattern, replacement)
|
95
|
+
full_file_name = File.expand_path(file_name,@running_app_dir)
|
96
|
+
contents = IO.read(full_file_name)
|
97
|
+
IO.write(full_file_name, contents.gsub(pattern,replacement))
|
98
|
+
end
|
99
|
+
|
100
|
+
def watch_until_change_detected(&block)
|
101
|
+
watch_until do |line|
|
102
|
+
/^File change event detected/.match(line) && (block.nil? || block.call(line))
|
103
|
+
end
|
104
|
+
# It won't really serve the new version until it starts its new worker process
|
105
|
+
watch_until {|line| /worker=\d+ ready/.match(line)}
|
106
|
+
end
|
107
|
+
|
108
|
+
def around
|
109
|
+
raise "Must set @app_template_path" if @app_template_path.nil?
|
110
|
+
Dir.mktmpdir do |dir|
|
111
|
+
FileUtils.cp_r("#{app_template_path}/.", dir)
|
112
|
+
@running_app_dir = dir
|
113
|
+
begin
|
114
|
+
yield
|
115
|
+
rescue Exception=>e
|
116
|
+
puts e.inspect
|
117
|
+
raise
|
118
|
+
ensure
|
119
|
+
stop_app
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
MiniTest::Spec.register_spec_type(/^App Runner:/, ServerAppTest)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mr-sparkle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: unicorn
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 4.5.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 4.5.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: listen
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 0.6.0
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.6.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rb-inotify
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: 0.8.8
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.8.8
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rb-fsevent
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,7 +69,92 @@ dependencies:
|
|
54
69
|
version: 0.9.2
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.2
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: minitest
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 4.3.3
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 4.3.3
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: minitest-reporters
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.13.1
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.13.1
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: minitest-around
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.0.1
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rack
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 1.4.1
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.4.1
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: rake
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 10.0.3
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 10.0.3
|
58
158
|
description: This gem contains a script to start a Unicorn-based server for your Rack
|
59
159
|
application that reloads your automatically when they are changed, but doesn't incur
|
60
160
|
the penalty of reloading all the gem dependencies. It's based on Jonathan D. Stott's
|
@@ -67,6 +167,7 @@ extensions: []
|
|
67
167
|
extra_rdoc_files: []
|
68
168
|
files:
|
69
169
|
- .gitignore
|
170
|
+
- CHANGES.md
|
70
171
|
- Gemfile
|
71
172
|
- LICENSE.txt
|
72
173
|
- README.md
|
@@ -76,6 +177,16 @@ files:
|
|
76
177
|
- lib/mr-sparkle/unicorn.conf.rb
|
77
178
|
- lib/mr-sparkle/version.rb
|
78
179
|
- mr-sparkle.gemspec
|
180
|
+
- spec/fixtures/full_reload/Gemfile
|
181
|
+
- spec/fixtures/full_reload/config.ru
|
182
|
+
- spec/fixtures/full_reload/file.notwatched
|
183
|
+
- spec/fixtures/full_reload/vendor/full_reload_test_gem/full_reload_test_gem.gemspec
|
184
|
+
- spec/fixtures/full_reload/vendor/full_reload_test_gem/lib/full_reload_test_gem.rb
|
185
|
+
- spec/fixtures/hello/Gemfile
|
186
|
+
- spec/fixtures/hello/config.ru
|
187
|
+
- spec/full_reload_spec.rb
|
188
|
+
- spec/normal_running_spec.rb
|
189
|
+
- spec/spec_helper.rb
|
79
190
|
homepage: http://github.com/MicahChalmer/mr-sparkle
|
80
191
|
licenses: []
|
81
192
|
post_install_message:
|
@@ -96,8 +207,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
207
|
version: '0'
|
97
208
|
requirements: []
|
98
209
|
rubyforge_project:
|
99
|
-
rubygems_version: 1.8.
|
210
|
+
rubygems_version: 1.8.23
|
100
211
|
signing_key:
|
101
212
|
specification_version: 3
|
102
213
|
summary: Runs Unicorn, automatically reloading the application, but not bundled gems.
|
103
|
-
test_files:
|
214
|
+
test_files:
|
215
|
+
- spec/fixtures/full_reload/Gemfile
|
216
|
+
- spec/fixtures/full_reload/config.ru
|
217
|
+
- spec/fixtures/full_reload/file.notwatched
|
218
|
+
- spec/fixtures/full_reload/vendor/full_reload_test_gem/full_reload_test_gem.gemspec
|
219
|
+
- spec/fixtures/full_reload/vendor/full_reload_test_gem/lib/full_reload_test_gem.rb
|
220
|
+
- spec/fixtures/hello/Gemfile
|
221
|
+
- spec/fixtures/hello/config.ru
|
222
|
+
- spec/full_reload_spec.rb
|
223
|
+
- spec/normal_running_spec.rb
|
224
|
+
- spec/spec_helper.rb
|