guard-puma 0.4.1 → 0.5.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 +4 -4
- data/CHANGES.md +10 -0
- data/README.md +5 -1
- data/guard-puma.gemspec +3 -4
- data/lib/guard/puma.rb +33 -15
- data/lib/guard/puma/runner.rb +62 -31
- data/lib/guard/puma/version.rb +1 -1
- data/spec/lib/guard/puma/runner_spec.rb +134 -31
- data/spec/lib/guard/puma_spec.rb +87 -34
- data/spec/spec_helper.rb +1 -0
- metadata +9 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0763889538f31e4bf352571ab6ec93bf6257eb74'
|
4
|
+
data.tar.gz: 2af890d006a069d855410ec87d30bd9dade720cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e2ebcb761bdc9dfe8dbddd56b7e29fa7486960e2c8790ce859f71404545c92fc23005df5df733882d17cb3a2481efc85a6f2af4df6fdbead649f40b45a82b04
|
7
|
+
data.tar.gz: 6411ac22464398ac4eba2b98308ace1398d265ce88ffe0b6c6eb35fb918d767591568814d7145dd837ea02a2694fdc72d79b6ecb14cd55e0f305a46c20d7a04b
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 0.5.0
|
4
|
+
|
5
|
+
* Add `:pumactl` option
|
6
|
+
* Add `:restart_timeout` option
|
7
|
+
* Don't stop Puma if it was not started by Guard
|
8
|
+
* Don't notify about start when no start
|
9
|
+
* Improve `guard-compat` using (https://github.com/guard/guard-compat#migrating-your-api-calls)
|
10
|
+
* Remove unused `pry` dependency
|
11
|
+
* Update versions of dependencies
|
12
|
+
|
3
13
|
## 0.4.1
|
4
14
|
|
5
15
|
* Improve notifications. Via #30
|
data/README.md
CHANGED
@@ -33,17 +33,21 @@ end
|
|
33
33
|
|
34
34
|
* `:port` is the port number to run on (default `4000`)
|
35
35
|
* `:environment` is the environment to use (default `development`)
|
36
|
-
* `:start_on_start` will start the server when starting Guard (default `true`)
|
36
|
+
* `:start_on_start` will start the server when starting Guard and stop the server when reloading/stopping Guard (default `true`)
|
37
37
|
* `:force_run` kills any process that's holding open the listen port before attempting to (re)start Puma (default `false`).
|
38
38
|
* `:daemon` runs the server as a daemon, without any output to the terminal that ran `guard` (default `false`).
|
39
39
|
* `:quiet` runs the server in quiet mode, suppressing output (default `true`).
|
40
40
|
* `:debugger` runs the server with the debugger enabled (default `false`). Required ruby-debug gem.
|
41
41
|
* `:timeout` waits this number of seconds when restarting the Puma server before reporting there's a problem (default `20`).
|
42
|
+
* `:restart_timeout` waits this number of seconds before the next restarting the Puma server (default `1`).
|
42
43
|
* `:config` is the path to the Puma config file (optional)
|
43
44
|
* `:bind` is URI to bind to (tcp:// and unix:// only) (optional)
|
44
45
|
* `:control_token` is the token to use as authentication for the control server(optional)
|
45
46
|
* `:control_port` is the port to use for the control server(optional)
|
46
47
|
* `:threads` is the min:max number of threads to use. Defaults to 0:16 (optional)
|
48
|
+
* `:pumactl` manages the server via `pumactl` executable instead of `puma` (default `false`)
|
49
|
+
* Incompatible with options such as `port`, `environment`, `daemon`, `bind`, `threads`
|
50
|
+
* Use with `config` option is preferred.
|
47
51
|
* `:notifications` is the list of notification types that will be sent. Defaults to `[:restarting, :restarted, :not_restarted, :stopped]` (optional)
|
48
52
|
|
49
53
|
## Contributing
|
data/guard-puma.gemspec
CHANGED
@@ -16,8 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.add_dependency "guard", "~> 2.14"
|
17
17
|
gem.add_dependency "guard-compat", "~> 1.2"
|
18
18
|
gem.add_dependency "puma", "~> 3.6"
|
19
|
-
gem.add_development_dependency "rake", "~>
|
20
|
-
gem.add_development_dependency "rspec", "~> 3.
|
21
|
-
gem.add_development_dependency "guard-rspec", "~> 4.7
|
22
|
-
gem.add_development_dependency "pry"
|
19
|
+
gem.add_development_dependency "rake", "~> 12"
|
20
|
+
gem.add_development_dependency "rspec", "~> 3.7"
|
21
|
+
gem.add_development_dependency "guard-rspec", "~> 4.7"
|
23
22
|
end
|
data/lib/guard/puma.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
|
4
|
-
require "rbconfig"
|
5
|
-
require "guard/puma/version"
|
6
|
-
require "guard/compat/plugin"
|
1
|
+
require 'guard/compat/plugin'
|
2
|
+
require_relative 'puma/runner'
|
3
|
+
require_relative 'puma/version'
|
7
4
|
|
8
5
|
module Guard
|
9
6
|
class Puma < Plugin
|
@@ -14,11 +11,13 @@ module Guard
|
|
14
11
|
end
|
15
12
|
|
16
13
|
DEFAULT_OPTIONS = {
|
14
|
+
:pumactl => false,
|
17
15
|
:port => 4000,
|
18
16
|
:environment => default_env,
|
19
17
|
:start_on_start => true,
|
20
18
|
:force_run => false,
|
21
19
|
:timeout => 20,
|
20
|
+
:restart_timeout => 1,
|
22
21
|
:debugger => false,
|
23
22
|
:notifications => %i[restarting restarted not_restarted stopped]
|
24
23
|
}
|
@@ -28,35 +27,54 @@ module Guard
|
|
28
27
|
@options = DEFAULT_OPTIONS.merge(options)
|
29
28
|
@options[:port] = nil if @options.key?(:config)
|
30
29
|
@runner = ::Guard::PumaRunner.new(@options)
|
30
|
+
@last_restarted = Time.now
|
31
31
|
end
|
32
32
|
|
33
33
|
def start
|
34
|
+
return unless options[:start_on_start]
|
34
35
|
server = options[:server] ? "#{options[:server]} and " : ""
|
35
|
-
UI.info
|
36
|
-
|
36
|
+
Compat::UI.info(
|
37
|
+
"Puma starting#{port_text} in #{server}#{options[:environment]} environment."
|
38
|
+
)
|
39
|
+
runner.start
|
37
40
|
end
|
38
41
|
|
39
42
|
def reload
|
40
|
-
|
43
|
+
return if (Time.now - @last_restarted) < options[:restart_timeout]
|
44
|
+
@last_restarted = Time.now
|
45
|
+
Compat::UI.info "Restarting Puma..."
|
41
46
|
if options[:notifications].include?(:restarting)
|
42
|
-
|
47
|
+
Compat::UI.notify(
|
48
|
+
"Puma restarting#{port_text} in #{options[:environment]} environment...",
|
49
|
+
title: "Restarting Puma...", image: :pending
|
50
|
+
)
|
43
51
|
end
|
44
52
|
if runner.restart
|
45
|
-
UI.info "Puma restarted"
|
53
|
+
Compat::UI.info "Puma restarted"
|
46
54
|
if options[:notifications].include?(:restarted)
|
47
|
-
|
55
|
+
Compat::UI.notify(
|
56
|
+
"Puma restarted#{port_text}.",
|
57
|
+
title: "Puma restarted!", image: :success
|
58
|
+
)
|
48
59
|
end
|
49
60
|
else
|
50
|
-
UI.info "Puma NOT restarted, check your log files."
|
61
|
+
Compat::UI.info "Puma NOT restarted, check your log files."
|
51
62
|
if options[:notifications].include?(:not_restarted)
|
52
|
-
|
63
|
+
Compat::UI.notify(
|
64
|
+
"Puma NOT restarted, check your log files.",
|
65
|
+
title: "Puma NOT restarted!", image: :failed
|
66
|
+
)
|
53
67
|
end
|
54
68
|
end
|
55
69
|
end
|
56
70
|
|
57
71
|
def stop
|
72
|
+
return unless options[:start_on_start]
|
58
73
|
if options[:notifications].include?(:stopped)
|
59
|
-
|
74
|
+
Compat::UI.notify(
|
75
|
+
"Until next time...",
|
76
|
+
title: "Puma shutting down.", image: :pending
|
77
|
+
)
|
60
78
|
end
|
61
79
|
runner.halt
|
62
80
|
end
|
data/lib/guard/puma/runner.rb
CHANGED
@@ -6,49 +6,48 @@ module Guard
|
|
6
6
|
|
7
7
|
MAX_WAIT_COUNT = 20
|
8
8
|
|
9
|
-
attr_reader :options, :control_url, :control_token, :cmd_opts
|
9
|
+
attr_reader :options, :control_url, :control_token, :cmd_opts, :pumactl
|
10
10
|
|
11
11
|
def initialize(options)
|
12
12
|
@control_token = options.delete(:control_token) { |_| ::Puma::Configuration.random_token }
|
13
|
-
@control = "localhost"
|
14
13
|
@control_port = (options.delete(:control_port) || '9293')
|
15
|
-
@control_url = "
|
14
|
+
@control_url = "localhost:#{@control_port}"
|
16
15
|
@quiet = options.delete(:quiet) { true }
|
16
|
+
@pumactl = options.delete(:pumactl) { false }
|
17
17
|
@options = options
|
18
18
|
|
19
|
-
puma_options =
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
puma_options = {
|
20
|
+
puma_options_key(:config) => options[:config],
|
21
|
+
puma_options_key(:control_token) => @control_token,
|
22
|
+
puma_options_key(:control_url) => "tcp://#{@control_url}"
|
23
|
+
}
|
24
|
+
if options[:config]
|
25
|
+
puma_options['--config'] = options[:config]
|
26
26
|
else
|
27
|
-
|
28
|
-
'--port' => options[:port],
|
29
|
-
'--control-token' => @control_token,
|
30
|
-
'--control' => "tcp://#{@control_url}",
|
31
|
-
'--environment' => options[:environment]
|
32
|
-
}
|
33
|
-
end
|
34
|
-
[:bind, :threads].each do |opt|
|
35
|
-
puma_options["--#{opt}"] = options[opt] if options[opt]
|
27
|
+
puma_options['--port'] = options[:port]
|
36
28
|
end
|
29
|
+
%i[bind threads environment]
|
30
|
+
.select { |opt| options[opt] }
|
31
|
+
.each do |opt|
|
32
|
+
if pumactl
|
33
|
+
Compat::UI.warning(
|
34
|
+
"`#{opt}` option is not compatible with `pumactl` option"
|
35
|
+
)
|
36
|
+
else
|
37
|
+
puma_options["--#{opt}"] = options[opt]
|
38
|
+
end
|
39
|
+
end
|
37
40
|
puma_options = puma_options.to_a.flatten
|
38
|
-
puma_options << '
|
41
|
+
puma_options << '--quiet' if @quiet
|
39
42
|
@cmd_opts = puma_options.join ' '
|
40
43
|
end
|
41
44
|
|
42
45
|
def start
|
43
|
-
|
44
|
-
Kernel.system windows_start_cmd
|
45
|
-
else
|
46
|
-
Kernel.system nix_start_cmd
|
47
|
-
end
|
46
|
+
Kernel.system build_command('start')
|
48
47
|
end
|
49
48
|
|
50
49
|
def halt
|
51
|
-
|
50
|
+
run_puma_command!('halt')
|
52
51
|
# server may not have been stopped correctly, but we are halting so who cares.
|
53
52
|
return true
|
54
53
|
end
|
@@ -68,8 +67,30 @@ module Guard
|
|
68
67
|
|
69
68
|
private
|
70
69
|
|
70
|
+
PUMA_OPTIONS_KEYS_BY_PUMACTL = {
|
71
|
+
true => {
|
72
|
+
config: '--config-file',
|
73
|
+
control_url: '--control-url'
|
74
|
+
}.freeze,
|
75
|
+
false => {
|
76
|
+
config: '--config',
|
77
|
+
control_url: '--control'
|
78
|
+
}.freeze
|
79
|
+
}.freeze
|
80
|
+
|
81
|
+
private_constant :PUMA_OPTIONS_KEYS_BY_PUMACTL
|
82
|
+
|
83
|
+
def puma_options_key(key)
|
84
|
+
keys = PUMA_OPTIONS_KEYS_BY_PUMACTL[@pumactl]
|
85
|
+
keys.fetch(key) { |k| "--#{k.to_s.tr('_', '-')}" }
|
86
|
+
end
|
87
|
+
|
71
88
|
def run_puma_command!(cmd)
|
72
|
-
|
89
|
+
if pumactl
|
90
|
+
Kernel.system build_command(cmd)
|
91
|
+
else
|
92
|
+
Net::HTTP.get build_uri(cmd)
|
93
|
+
end
|
73
94
|
return true
|
74
95
|
rescue Errno::ECONNREFUSED => e
|
75
96
|
# server may not have been started correctly.
|
@@ -80,12 +101,22 @@ module Guard
|
|
80
101
|
URI "http://#{control_url}/#{cmd}?token=#{control_token}"
|
81
102
|
end
|
82
103
|
|
83
|
-
def
|
84
|
-
|
104
|
+
def build_command(cmd)
|
105
|
+
puma_cmd = "#{pumactl ? 'pumactl' : 'puma'} #{cmd_opts} #{cmd if pumactl}"
|
106
|
+
background = cmd == 'start'
|
107
|
+
if in_windows_cmd?
|
108
|
+
windows_cmd(puma_cmd, background)
|
109
|
+
else
|
110
|
+
nix_cmd(puma_cmd, background)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def nix_cmd(puma_cmd, background = false)
|
115
|
+
%(sh -c 'cd #{Dir.pwd} && #{puma_cmd} #{'&' if background}')
|
85
116
|
end
|
86
117
|
|
87
|
-
def
|
88
|
-
%
|
118
|
+
def windows_cmd(puma_cmd, background = false)
|
119
|
+
%(cd "#{Dir.pwd}" && #{'start "" /B' if background} cmd /C "#{puma_cmd}")
|
89
120
|
end
|
90
121
|
|
91
122
|
def in_windows_cmd?
|
data/lib/guard/puma/version.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'guard/puma/runner'
|
3
|
-
require 'pry'
|
4
3
|
|
5
4
|
describe Guard::PumaRunner do
|
6
5
|
let(:runner) { Guard::PumaRunner.new(options) }
|
7
6
|
let(:environment) { 'development' }
|
8
7
|
let(:port) { 4000 }
|
9
8
|
|
10
|
-
let(:default_options) { { :
|
9
|
+
let(:default_options) { { environment: environment, port: port } }
|
11
10
|
let(:options) { default_options }
|
12
11
|
|
13
12
|
describe "#initialize" do
|
@@ -16,39 +15,61 @@ describe Guard::PumaRunner do
|
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
%w
|
18
|
+
%w[halt restart].each do |cmd|
|
20
19
|
describe cmd do
|
21
|
-
|
22
|
-
|
20
|
+
context "without pumactl" do
|
21
|
+
let(:options) { { pumactl: false } }
|
22
|
+
|
23
|
+
let(:uri) {
|
24
|
+
URI(
|
25
|
+
"http://#{runner.control_url}/#{cmd}?token=#{runner.control_token}"
|
26
|
+
)
|
27
|
+
}
|
28
|
+
|
29
|
+
it "#{cmd}s" do
|
30
|
+
expect(Net::HTTP).to receive(:get).with(uri).once
|
31
|
+
runner.public_send(cmd)
|
32
|
+
end
|
23
33
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
34
|
+
|
35
|
+
context "with pumactl" do
|
36
|
+
let(:options) { { pumactl: true } }
|
37
|
+
|
38
|
+
before do
|
39
|
+
allow(runner).to receive(:in_windows_cmd?).and_return(false)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:command) {
|
43
|
+
%(sh -c 'cd #{Dir.pwd} && pumactl #{runner.cmd_opts} #{cmd} ')
|
44
|
+
}
|
45
|
+
|
46
|
+
it "#{cmd}s" do
|
47
|
+
expect(Kernel).to receive(:system).with(command).once
|
48
|
+
runner.public_send(cmd)
|
49
|
+
end
|
28
50
|
end
|
29
51
|
end
|
30
52
|
end
|
31
53
|
|
32
|
-
describe
|
54
|
+
describe "#start" do
|
33
55
|
context "when on Windows" do
|
34
56
|
before do
|
35
57
|
allow(runner).to receive(:in_windows_cmd?).and_return(true)
|
36
|
-
allow(runner).to receive(:windows_start_cmd).and_return("echo 'windows'")
|
37
58
|
end
|
38
59
|
|
39
60
|
it "runs the Windows command" do
|
40
|
-
expect(Kernel).to receive(:system).with(
|
61
|
+
expect(Kernel).to receive(:system).with(%r{cmd /C ".+"})
|
41
62
|
runner.start
|
42
63
|
end
|
43
64
|
end
|
44
65
|
|
45
66
|
context "when on *nix" do
|
46
67
|
before do
|
47
|
-
allow(runner).to receive(:
|
68
|
+
allow(runner).to receive(:in_windows_cmd?).and_return(false)
|
48
69
|
end
|
49
70
|
|
50
71
|
it "runs the *nix command" do
|
51
|
-
expect(Kernel).to receive(:system).with(
|
72
|
+
expect(Kernel).to receive(:system).with(/sh -c '.+'/)
|
52
73
|
runner.start
|
53
74
|
end
|
54
75
|
end
|
@@ -69,45 +90,127 @@ describe Guard::PumaRunner do
|
|
69
90
|
let(:command) { runner.start }
|
70
91
|
|
71
92
|
context "with config" do
|
72
|
-
let(:options) {{ :config => path }}
|
73
93
|
let(:path) { "/tmp/elephants" }
|
74
94
|
let(:environment) { "special_dev" }
|
75
|
-
it "adds path to command" do
|
76
|
-
expect(runner.cmd_opts).to match("--config #{path}")
|
77
|
-
end
|
78
95
|
|
79
|
-
context "
|
80
|
-
let(:options) {{ :
|
81
|
-
|
96
|
+
context "without pumactl" do
|
97
|
+
let(:options) { { config: path, pumactl: false } }
|
98
|
+
|
99
|
+
it "adds path to command" do
|
82
100
|
expect(runner.cmd_opts).to match("--config #{path}")
|
83
|
-
|
84
|
-
|
85
|
-
|
101
|
+
end
|
102
|
+
|
103
|
+
context "and additional options" do
|
104
|
+
let(:options) {
|
105
|
+
{
|
106
|
+
config: path, port: "4000",
|
107
|
+
quiet: false, environment: environment
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
it "assumes options are set in config" do
|
112
|
+
expect(runner.cmd_opts).to match("--config #{path}")
|
113
|
+
expect(runner.cmd_opts).to match(/--control-token [0-9a-f]{10,}/)
|
114
|
+
expect(runner.cmd_opts).to match("--control tcp")
|
115
|
+
expect(runner.cmd_opts).to match("--environment #{environment}")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "with pumactl" do
|
121
|
+
let(:options) { { config: path, pumactl: true } }
|
122
|
+
|
123
|
+
it "adds path to command" do
|
124
|
+
expect(runner.cmd_opts).to match("--config-file #{path}")
|
125
|
+
end
|
126
|
+
|
127
|
+
context "and additional options" do
|
128
|
+
let(:options) {
|
129
|
+
{
|
130
|
+
pumactl: true,
|
131
|
+
config: path, port: "4000",
|
132
|
+
quiet: false
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
it "assumes options are set in config" do
|
137
|
+
expect(runner.cmd_opts).to match("--config-file #{path}")
|
138
|
+
expect(runner.cmd_opts).to match(/--control-token [0-9a-f]{10,}/)
|
139
|
+
expect(runner.cmd_opts).to match("--control-url tcp")
|
140
|
+
end
|
86
141
|
end
|
87
142
|
end
|
88
143
|
end
|
89
144
|
|
90
145
|
context "with bind" do
|
91
|
-
let(:options) {{ :bind => uri }}
|
92
146
|
let(:uri) { "tcp://foo" }
|
93
|
-
|
94
|
-
|
147
|
+
|
148
|
+
context "without pumactl" do
|
149
|
+
let(:options) { { pumactl: false, bind: uri } }
|
150
|
+
|
151
|
+
it "adds uri option to command" do
|
152
|
+
expect(runner.cmd_opts).to match("--bind #{uri}")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context "with pumactl" do
|
157
|
+
let(:options) { { pumactl: true, bind: uri } }
|
158
|
+
|
159
|
+
it "raises ArgumentError about incompatible options" do
|
160
|
+
expect(Guard::Compat::UI).to receive(:warning).with(/bind.+pumactl/)
|
161
|
+
runner.cmd_opts
|
162
|
+
end
|
95
163
|
end
|
96
164
|
end
|
97
165
|
|
98
166
|
context "with control_token" do
|
99
|
-
let(:options) {{ :control_token => token }}
|
100
167
|
let(:token) { "imma-token" }
|
168
|
+
let(:options) { { control_token: token } }
|
169
|
+
|
101
170
|
it "adds token to command" do
|
102
171
|
expect(runner.cmd_opts).to match(/--control-token #{token}/)
|
103
172
|
end
|
104
173
|
end
|
105
174
|
|
106
175
|
context "with threads" do
|
107
|
-
let(:options) {{ :threads => threads }}
|
108
176
|
let(:threads) { "13:42" }
|
109
|
-
|
110
|
-
|
177
|
+
|
178
|
+
context "without pumactl" do
|
179
|
+
let(:options) { { pumactl: false, threads: threads } }
|
180
|
+
|
181
|
+
it "adds threads option to command" do
|
182
|
+
expect(runner.cmd_opts).to match("--threads #{threads}")
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "with pumactl" do
|
187
|
+
let(:options) { { pumactl: true, threads: threads } }
|
188
|
+
|
189
|
+
it "raises ArgumentError about incompatible options" do
|
190
|
+
expect(Guard::Compat::UI).to receive(:warning).with(/threads.+pumactl/)
|
191
|
+
runner.cmd_opts
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context "with environment" do
|
197
|
+
let(:environment) { "development" }
|
198
|
+
|
199
|
+
context "without pumactl" do
|
200
|
+
let(:options) { { pumactl: false, environment: environment } }
|
201
|
+
|
202
|
+
it "adds environment option to command" do
|
203
|
+
expect(runner.cmd_opts).to match("--environment #{environment}")
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
context "with pumactl" do
|
208
|
+
let(:options) { { pumactl: true, environment: environment } }
|
209
|
+
|
210
|
+
it "warns about incompatible options" do
|
211
|
+
expect(Guard::Compat::UI).to receive(:warning).with(/environment.+pumactl/)
|
212
|
+
runner.cmd_opts
|
213
|
+
end
|
111
214
|
end
|
112
215
|
end
|
113
216
|
end
|
data/spec/lib/guard/puma_spec.rb
CHANGED
@@ -57,19 +57,20 @@ describe Guard::Puma do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
describe '#start' do
|
60
|
-
|
61
|
-
context 'start on start' do
|
60
|
+
context "start on start" do
|
62
61
|
it "runs startup" do
|
63
|
-
expect(guard).to receive(:start).once
|
62
|
+
expect(guard.runner).to receive(:start).once
|
63
|
+
expect(Guard::Compat::UI).to receive(:info).with(/Puma starting/)
|
64
64
|
guard.start
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
context
|
69
|
-
let(:options) { { :
|
68
|
+
context "no start on start" do
|
69
|
+
let(:options) { { start_on_start: false } }
|
70
70
|
|
71
|
-
it "
|
72
|
-
expect(guard.runner).
|
71
|
+
it "doesn't show the message and not run startup" do
|
72
|
+
expect(guard.runner).not_to receive(:start)
|
73
|
+
expect(Guard::Compat::UI).not_to receive(:info).with(/Puma starting/)
|
73
74
|
guard.start
|
74
75
|
end
|
75
76
|
end
|
@@ -81,42 +82,45 @@ describe Guard::Puma do
|
|
81
82
|
|
82
83
|
context "when no config option set" do
|
83
84
|
it "contains port" do
|
84
|
-
expect(Guard::UI).to receive(:info)
|
85
|
+
expect(Guard::Compat::UI).to receive(:info)
|
86
|
+
.with(/starting on port 4000/)
|
85
87
|
guard.start
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
89
91
|
context "when config option set" do
|
90
|
-
let(:options) { { :
|
92
|
+
let(:options) { { config: 'config.rb' } }
|
91
93
|
|
92
94
|
it "doesn't contain port" do
|
93
|
-
expect(Guard::UI).to receive(:info).with(/starting/)
|
95
|
+
expect(Guard::Compat::UI).to receive(:info).with(/starting/)
|
94
96
|
guard.start
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
98
100
|
end
|
99
101
|
|
100
|
-
describe
|
102
|
+
describe "#reload" do
|
103
|
+
let(:zero_restart_timeout) { { restart_timeout: 0 } }
|
104
|
+
let(:options) { zero_restart_timeout }
|
101
105
|
|
102
106
|
before do
|
103
|
-
expect(Guard::UI).to receive(:info).with('Restarting Puma...')
|
104
|
-
expect(Guard::UI).to receive(:info).with('Puma restarted')
|
105
107
|
allow(guard.runner).to receive(:restart).and_return(true)
|
108
|
+
allow_any_instance_of(Guard::PumaRunner).to receive(:halt)
|
106
109
|
end
|
107
110
|
|
108
|
-
let(:runner_stub) { allow_any_instance_of(Guard::PumaRunner).to receive(:halt) }
|
109
|
-
|
110
111
|
context "with default options" do
|
111
112
|
it "restarts and show the message" do
|
112
|
-
expect(Guard::
|
113
|
+
expect(Guard::Compat::UI).to receive(:info).with('Restarting Puma...')
|
114
|
+
expect(Guard::Compat::UI).to receive(:info).with('Puma restarted')
|
115
|
+
|
116
|
+
expect(Guard::Compat::UI).to receive(:notify).with(
|
113
117
|
/restarting on port 4000/,
|
114
|
-
hash_including(:
|
118
|
+
hash_including(title: "Restarting Puma...", image: :pending)
|
115
119
|
)
|
116
120
|
|
117
|
-
expect(Guard::
|
121
|
+
expect(Guard::Compat::UI).to receive(:notify).with(
|
118
122
|
"Puma restarted on port 4000.",
|
119
|
-
hash_including(:
|
123
|
+
hash_including(title: "Puma restarted!", image: :success)
|
120
124
|
)
|
121
125
|
|
122
126
|
guard.reload
|
@@ -124,17 +128,20 @@ describe Guard::Puma do
|
|
124
128
|
end
|
125
129
|
|
126
130
|
context "with config option set" do
|
127
|
-
let(:options) { { :
|
131
|
+
let(:options) { { config: "config.rb" }.merge!(zero_restart_timeout) }
|
128
132
|
|
129
133
|
it "restarts and show the message" do
|
130
|
-
expect(Guard::
|
134
|
+
expect(Guard::Compat::UI).to receive(:info).with('Restarting Puma...')
|
135
|
+
expect(Guard::Compat::UI).to receive(:info).with('Puma restarted')
|
136
|
+
|
137
|
+
expect(Guard::Compat::UI).to receive(:notify).with(
|
131
138
|
/restarting/,
|
132
|
-
hash_including(:
|
139
|
+
hash_including(title: "Restarting Puma...", image: :pending)
|
133
140
|
)
|
134
141
|
|
135
|
-
expect(Guard::
|
142
|
+
expect(Guard::Compat::UI).to receive(:notify).with(
|
136
143
|
"Puma restarted.",
|
137
|
-
hash_including(:
|
144
|
+
hash_including(title: "Puma restarted!", image: :success)
|
138
145
|
)
|
139
146
|
|
140
147
|
guard.reload
|
@@ -142,49 +149,95 @@ describe Guard::Puma do
|
|
142
149
|
end
|
143
150
|
|
144
151
|
context "with custom :notifications option" do
|
145
|
-
let(:options) {
|
152
|
+
let(:options) {
|
153
|
+
{ notifications: [:restarted] }.merge!(zero_restart_timeout)
|
154
|
+
}
|
146
155
|
|
147
156
|
it "restarts and show the message only about restarted" do
|
148
|
-
|
149
|
-
|
157
|
+
allow(Guard::Compat::UI).to receive(:info)
|
158
|
+
|
159
|
+
expect(Guard::Compat::UI).not_to receive(:notify).with(/restarting/)
|
160
|
+
expect(Guard::Compat::UI).to receive(:notify)
|
161
|
+
.with(/restarted/, kind_of(Hash))
|
150
162
|
|
151
163
|
guard.reload
|
152
164
|
end
|
153
165
|
end
|
154
166
|
|
155
167
|
context "with empty :notifications option" do
|
156
|
-
let(:options) { { :
|
168
|
+
let(:options) { { notifications: [] }.merge!(zero_restart_timeout) }
|
157
169
|
|
158
170
|
it "restarts and doesn't show the message" do
|
159
|
-
|
171
|
+
allow(Guard::Compat::UI).to receive(:info)
|
172
|
+
|
173
|
+
expect(Guard::Compat::UI).not_to receive(:notify)
|
160
174
|
|
161
175
|
guard.reload
|
162
176
|
end
|
163
177
|
end
|
164
178
|
|
179
|
+
context "with :restart_timeout option" do
|
180
|
+
let(:restart_timeout) { 1.0 }
|
181
|
+
let(:options) { { restart_timeout: restart_timeout } }
|
182
|
+
|
183
|
+
before { sleep restart_timeout }
|
184
|
+
|
185
|
+
it "doesn't restarts during restart timeout" do
|
186
|
+
allow(Guard::Compat::UI).to receive(:info)
|
187
|
+
allow(Guard::Compat::UI).to receive(:notify)
|
188
|
+
|
189
|
+
expect(guard.runner).to receive(:restart).twice
|
190
|
+
|
191
|
+
guard.reload
|
192
|
+
sleep restart_timeout / 2
|
193
|
+
guard.reload
|
194
|
+
sleep restart_timeout
|
195
|
+
guard.reload
|
196
|
+
end
|
197
|
+
end
|
165
198
|
end
|
166
199
|
|
167
|
-
describe
|
200
|
+
describe "#stop" do
|
168
201
|
context "with default options" do
|
169
202
|
it "stops correctly with notification" do
|
170
|
-
expect(Guard::
|
203
|
+
expect(Guard::Compat::UI).to receive(:notify)
|
204
|
+
.with('Until next time...', anything)
|
171
205
|
expect(guard.runner).to receive(:halt).once
|
172
206
|
guard.stop
|
173
207
|
end
|
174
208
|
end
|
175
209
|
|
176
210
|
context "with custom :notifications option" do
|
177
|
-
let(:options) { { :
|
211
|
+
let(:options) { { notifications: [] } }
|
178
212
|
|
179
213
|
it "stops correctly without notification" do
|
180
|
-
expect(Guard::
|
214
|
+
expect(Guard::Compat::UI).not_to receive(:notify)
|
181
215
|
expect(guard.runner).to receive(:halt).once
|
182
216
|
guard.stop
|
183
217
|
end
|
184
218
|
end
|
219
|
+
|
220
|
+
context "start on start" do
|
221
|
+
it "stops correctly with notification" do
|
222
|
+
expect(guard.runner).to receive(:halt).once
|
223
|
+
expect(Guard::Compat::UI).to receive(:notify)
|
224
|
+
.with('Until next time...', anything)
|
225
|
+
guard.stop
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
context "no start on start" do
|
230
|
+
let(:options) { { start_on_start: false } }
|
231
|
+
|
232
|
+
it "doesn't show the message and doesn't halt" do
|
233
|
+
expect(guard.runner).not_to receive(:halt)
|
234
|
+
expect(Guard::Compat::UI).not_to receive(:notify)
|
235
|
+
guard.stop
|
236
|
+
end
|
237
|
+
end
|
185
238
|
end
|
186
239
|
|
187
|
-
describe
|
240
|
+
describe "#run_on_changes" do
|
188
241
|
it "reloads on change" do
|
189
242
|
expect(guard).to receive(:reload).once
|
190
243
|
guard.run_on_changes([])
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guard-puma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Cooke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: guard
|
@@ -58,56 +58,42 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '12'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '12'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.
|
75
|
+
version: '3.7'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.
|
82
|
+
version: '3.7'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: guard-rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 4.7
|
89
|
+
version: '4.7'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 4.7
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
96
|
+
version: '4.7'
|
111
97
|
description:
|
112
98
|
email:
|
113
99
|
- jesse@jc00ke.com
|
@@ -150,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
136
|
version: '0'
|
151
137
|
requirements: []
|
152
138
|
rubyforge_project:
|
153
|
-
rubygems_version: 2.6.
|
139
|
+
rubygems_version: 2.6.14
|
154
140
|
signing_key:
|
155
141
|
specification_version: 4
|
156
142
|
summary: Restart puma when files change
|