guard-puma 0.4.1 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ba3c0c0435df8f3c4ebc9383ae9afbd92bd2f41d
4
- data.tar.gz: c89ab9b1313f04b420a8ac8be2dc6a2b685f9440
2
+ SHA256:
3
+ metadata.gz: c4882d80d8bb73e013141fc821e88c95a5cf8cf2c2cb1597de1d266951dda350
4
+ data.tar.gz: db041e9db3a6612ad08c77d10c40245675e41b4022366e36ac2a23b6390cc4a5
5
5
  SHA512:
6
- metadata.gz: f3bf2e82c1da9bdfc4ae1d78244455642b5a07f242f0af7f4998b121492214b5322d5094b9f21b538575d04d2599a93c813055d7a07e614e98f07bce176aa60a
7
- data.tar.gz: 073f9b90a53e4aed7fd27c282d63b50ff82f54e57fec7d6579a5446d24dd539648630d0a66f99bc16f88f47ad61f27ec6c35c9a96f431bc676b00aaa8e2ec9f9
6
+ metadata.gz: 742d39e52c73797a1bfae1d5744a3744a0ee13672ca5c950aa610739614f6647db02153935e72b264c53719aac2a0d1b3992dc5bad5545c48b802c4c0868d94f
7
+ data.tar.gz: f4e46ba7c2cfdbfb9726bcbf23099456efe4a22cc30b7424f27edaf21dc86a08bd7647e9a463ed99b9dfb302f341914054be89c0800f5c804cb487c42e522d73
data/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
data/.travis.yml CHANGED
@@ -1,10 +1,15 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.2.5
5
- - 2.3.1
4
+ - 2.5.5
5
+ - 2.6.3
6
+ - 2.7.0-preview1
6
7
  - rbx
7
- - jruby-9.1.5.0
8
+ - jruby-9.2.2.0
9
+ env:
10
+ - PUMA_VERSION="~> 5.0"
11
+ - PUMA_VERSION="~> 4.0"
8
12
  matrix:
9
13
  allow_failures:
10
14
  - rvm: rbx
15
+ - rvm: 2.7.0-preview1
data/CHANGES.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changes
2
2
 
3
+ ## 0.7.0
4
+
5
+ * Add MIT license identifier in gemspec. Via #45
6
+ * Remove support for MRI 2.2|3 and bump other versions
7
+
8
+ ## 0.6.0
9
+
10
+ * Bump puma to 4.0
11
+
12
+ ## 0.5.2
13
+
14
+ * Default config to `-` instead of `nil`. Fixes #38
15
+
16
+ ## 0.5.1
17
+
18
+ * Detect and use `config/puma.rb` if present
19
+
20
+ ## 0.5.0
21
+
22
+ * Add `:pumactl` option
23
+ * Add `:restart_timeout` option
24
+ * Don't stop Puma if it was not started by Guard
25
+ * Don't notify about start when no start
26
+ * Improve `guard-compat` using (https://github.com/guard/guard-compat#migrating-your-api-calls)
27
+ * Remove unused `pry` dependency
28
+ * Update versions of dependencies
29
+
3
30
  ## 0.4.1
4
31
 
5
32
  * Improve notifications. Via #30
data/README.md CHANGED
@@ -1,6 +1,5 @@
1
1
  # Guard::Puma
2
2
  [![Build Status](https://secure.travis-ci.org/jc00ke/guard-puma.png)](http://travis-ci.org/jc00ke/guard-puma)
3
- [![Dependency Status](https://gemnasium.com/jc00ke/guard-puma.png?travis)](https://gemnasium.com/jc00ke/guard-puma)
4
3
 
5
4
  Restart Puma when some files change
6
5
 
@@ -33,17 +32,21 @@ end
33
32
 
34
33
  * `:port` is the port number to run on (default `4000`)
35
34
  * `:environment` is the environment to use (default `development`)
36
- * `:start_on_start` will start the server when starting Guard (default `true`)
35
+ * `:start_on_start` will start the server when starting Guard and stop the server when reloading/stopping Guard (default `true`)
37
36
  * `:force_run` kills any process that's holding open the listen port before attempting to (re)start Puma (default `false`).
38
37
  * `:daemon` runs the server as a daemon, without any output to the terminal that ran `guard` (default `false`).
39
38
  * `:quiet` runs the server in quiet mode, suppressing output (default `true`).
40
39
  * `:debugger` runs the server with the debugger enabled (default `false`). Required ruby-debug gem.
41
40
  * `:timeout` waits this number of seconds when restarting the Puma server before reporting there's a problem (default `20`).
41
+ * `:restart_timeout` waits this number of seconds before the next restarting the Puma server (default `1`).
42
42
  * `:config` is the path to the Puma config file (optional)
43
43
  * `:bind` is URI to bind to (tcp:// and unix:// only) (optional)
44
44
  * `:control_token` is the token to use as authentication for the control server(optional)
45
45
  * `:control_port` is the port to use for the control server(optional)
46
46
  * `:threads` is the min:max number of threads to use. Defaults to 0:16 (optional)
47
+ * `:pumactl` manages the server via `pumactl` executable instead of `puma` (default `false`)
48
+ * Incompatible with options such as `port`, `environment`, `daemon`, `bind`, `threads`
49
+ * Use with `config` option is preferred.
47
50
  * `:notifications` is the list of notification types that will be sent. Defaults to `[:restarting, :restarted, :not_restarted, :stopped]` (optional)
48
51
 
49
52
  ## Contributing
data/guard-puma.gemspec CHANGED
@@ -6,6 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["jesse@jc00ke.com"]
7
7
  gem.summary = %q{Restart puma when files change }
8
8
  gem.homepage = "https://github.com/jc00ke/guard-puma"
9
+ gem.license = "MIT"
9
10
 
10
11
  gem.files = `git ls-files`.split($\)
11
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -15,9 +16,8 @@ Gem::Specification.new do |gem|
15
16
  gem.version = Guard::PumaVersion::VERSION
16
17
  gem.add_dependency "guard", "~> 2.14"
17
18
  gem.add_dependency "guard-compat", "~> 1.2"
18
- gem.add_dependency "puma", "~> 3.6"
19
- gem.add_development_dependency "rake", "~> 10.4"
20
- gem.add_development_dependency "rspec", "~> 3.5.0"
21
- gem.add_development_dependency "guard-rspec", "~> 4.7.0"
22
- gem.add_development_dependency "pry"
19
+ gem.add_dependency "puma", ENV["PUMA_VERSION"] || [">= 4.0", "< 6"]
20
+ gem.add_development_dependency "rake", "~> 12"
21
+ gem.add_development_dependency "rspec", "~> 3.7"
22
+ gem.add_development_dependency "guard-rspec", "~> 4.7"
23
23
  end
data/lib/guard/puma.rb CHANGED
@@ -1,9 +1,6 @@
1
- require "guard"
2
- require "guard/plugin"
3
- require "guard/puma/runner"
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 "Puma starting#{port_text} in #{server}#{options[:environment]} environment."
36
- runner.start if options[:start_on_start]
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
- UI.info "Restarting Puma..."
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
- Notifier.notify("Puma restarting#{port_text} in #{options[:environment]} environment...", :title => "Restarting Puma...", :image => :pending)
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
- Notifier.notify("Puma restarted#{port_text}.", :title => "Puma restarted!", :image => :success)
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
- Notifier.notify("Puma NOT restarted, check your log files.", :title => "Puma NOT restarted!", :image => :failed)
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
- Notifier.notify("Until next time...", :title => "Puma shutting down.", :image => :pending)
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
@@ -6,49 +6,50 @@ 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 = "#{@control}:#{@control_port}"
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 = if options[:config]
20
- {
21
- '--config' => options[:config],
22
- '--control-token' => @control_token,
23
- '--control' => "tcp://#{@control_url}",
24
- '--environment' => options[:environment]
25
- }
19
+ puma_options = {
20
+ puma_options_key(:config) => options.fetch(: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
+ elsif default_config_file_exists?
27
+ puma_options['--config'] = DEFAULT_CONFIG_FILE_PATH
26
28
  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]
29
+ puma_options['--port'] = options[:port]
36
30
  end
31
+ %i[bind threads environment]
32
+ .select { |opt| options[opt] }
33
+ .each do |opt|
34
+ if pumactl
35
+ Compat::UI.warning(
36
+ "`#{opt}` option is not compatible with `pumactl` option"
37
+ )
38
+ else
39
+ puma_options["--#{opt}"] = options[opt]
40
+ end
41
+ end
37
42
  puma_options = puma_options.to_a.flatten
38
- puma_options << '-q' if @quiet
43
+ puma_options << '--quiet' if @quiet
39
44
  @cmd_opts = puma_options.join ' '
40
45
  end
41
46
 
42
47
  def start
43
- if in_windows_cmd?
44
- Kernel.system windows_start_cmd
45
- else
46
- Kernel.system nix_start_cmd
47
- end
48
+ Kernel.system build_command('start')
48
49
  end
49
50
 
50
51
  def halt
51
- Net::HTTP.get build_uri('halt')
52
+ run_puma_command!('halt')
52
53
  # server may not have been stopped correctly, but we are halting so who cares.
53
54
  return true
54
55
  end
@@ -68,8 +69,36 @@ module Guard
68
69
 
69
70
  private
70
71
 
72
+ DEFAULT_CONFIG_FILE_PATH = "config/puma.rb".freeze
73
+
74
+ PUMA_OPTIONS_KEYS_BY_PUMACTL = {
75
+ true => {
76
+ config: '--config-file',
77
+ control_url: '--control-url'
78
+ }.freeze,
79
+ false => {
80
+ config: '--config',
81
+ control_url: '--control-url',
82
+ }.freeze
83
+ }.freeze
84
+
85
+ private_constant :PUMA_OPTIONS_KEYS_BY_PUMACTL
86
+
87
+ def default_config_file_exists?
88
+ File.exist?(DEFAULT_CONFIG_FILE_PATH)
89
+ end
90
+
91
+ def puma_options_key(key)
92
+ keys = PUMA_OPTIONS_KEYS_BY_PUMACTL[@pumactl]
93
+ keys.fetch(key) { |k| "--#{k.to_s.tr('_', '-')}" }
94
+ end
95
+
71
96
  def run_puma_command!(cmd)
72
- Net::HTTP.get build_uri(cmd)
97
+ if pumactl
98
+ Kernel.system build_command(cmd)
99
+ else
100
+ Net::HTTP.get build_uri(cmd)
101
+ end
73
102
  return true
74
103
  rescue Errno::ECONNREFUSED => e
75
104
  # server may not have been started correctly.
@@ -80,12 +109,22 @@ module Guard
80
109
  URI "http://#{control_url}/#{cmd}?token=#{control_token}"
81
110
  end
82
111
 
83
- def nix_start_cmd
84
- %{sh -c 'cd #{Dir.pwd} && puma #{cmd_opts} &'}
112
+ def build_command(cmd)
113
+ puma_cmd = "#{pumactl ? 'pumactl' : 'puma'} #{cmd_opts} #{cmd if pumactl}"
114
+ background = cmd == 'start'
115
+ if in_windows_cmd?
116
+ windows_cmd(puma_cmd, background)
117
+ else
118
+ nix_cmd(puma_cmd, background)
119
+ end
120
+ end
121
+
122
+ def nix_cmd(puma_cmd, background = false)
123
+ %(sh -c 'cd #{Dir.pwd} && #{puma_cmd} #{'&' if background}')
85
124
  end
86
125
 
87
- def windows_start_cmd
88
- %{cd "#{Dir.pwd}" && start "" /B cmd /C "puma #{cmd_opts}"}
126
+ def windows_cmd(puma_cmd, background = false)
127
+ %(cd "#{Dir.pwd}" && #{'start "" /B' if background} cmd /C "#{puma_cmd}")
89
128
  end
90
129
 
91
130
  def in_windows_cmd?
@@ -1,5 +1,5 @@
1
1
  module Guard
2
2
  module PumaVersion
3
- VERSION = "0.4.1"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
@@ -1,54 +1,85 @@
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) { { :environment => environment, :port => port } }
9
+ let(:default_options) { { environment: environment, port: port } }
11
10
  let(:options) { default_options }
12
11
 
13
12
  describe "#initialize" do
14
13
  it "sets options" do
15
14
  expect(runner.options).to eq(options)
16
15
  end
16
+
17
+ it "sets the command options" do
18
+ runner = described_class.new(options.merge(control_token: "abc"))
19
+ expect(runner.cmd_opts).to include("--config - ")
20
+ expect(runner.cmd_opts).to include("--control-token abc")
21
+ expect(runner.cmd_opts).to include("--control-url tcp://localhost:9293")
22
+ expect(runner.cmd_opts).to include("--port 4000")
23
+ expect(runner.cmd_opts).to include("--environment development")
24
+ expect(runner.cmd_opts).to include("--quiet")
25
+ end
17
26
  end
18
27
 
19
- %w(halt restart).each do |cmd|
28
+ %w[halt restart].each do |cmd|
20
29
  describe cmd do
21
- before do
22
- allow(runner).to receive(:build_uri).with(cmd).and_return(uri)
30
+ context "without pumactl" do
31
+ let(:options) { { pumactl: false } }
32
+
33
+ let(:uri) {
34
+ URI(
35
+ "http://#{runner.control_url}/#{cmd}?token=#{runner.control_token}"
36
+ )
37
+ }
38
+
39
+ it "#{cmd}s" do
40
+ expect(Net::HTTP).to receive(:get).with(uri).once
41
+ runner.public_send(cmd)
42
+ end
23
43
  end
24
- let(:uri) { URI("http://#{runner.control_url}/#{cmd}?token=#{runner.control_token}") }
25
- it "#{cmd}s" do
26
- expect(Net::HTTP).to receive(:get).with(uri).once
27
- runner.send(cmd.intern)
44
+
45
+ context "with pumactl" do
46
+ let(:options) { { pumactl: true } }
47
+
48
+ before do
49
+ allow(runner).to receive(:in_windows_cmd?).and_return(false)
50
+ end
51
+
52
+ let(:command) {
53
+ %(sh -c 'cd #{Dir.pwd} && pumactl #{runner.cmd_opts} #{cmd} ')
54
+ }
55
+
56
+ it "#{cmd}s" do
57
+ expect(Kernel).to receive(:system).with(command).once
58
+ runner.public_send(cmd)
59
+ end
28
60
  end
29
61
  end
30
62
  end
31
63
 
32
- describe '#start' do
64
+ describe "#start" do
33
65
  context "when on Windows" do
34
66
  before do
35
67
  allow(runner).to receive(:in_windows_cmd?).and_return(true)
36
- allow(runner).to receive(:windows_start_cmd).and_return("echo 'windows'")
37
68
  end
38
69
 
39
70
  it "runs the Windows command" do
40
- expect(Kernel).to receive(:system).with("echo 'windows'")
71
+ expect(Kernel).to receive(:system).with(%r{cmd /C ".+"})
41
72
  runner.start
42
73
  end
43
74
  end
44
75
 
45
76
  context "when on *nix" do
46
77
  before do
47
- allow(runner).to receive(:nix_start_cmd).and_return("echo 'nix'")
78
+ allow(runner).to receive(:in_windows_cmd?).and_return(false)
48
79
  end
49
80
 
50
81
  it "runs the *nix command" do
51
- expect(Kernel).to receive(:system).with("echo 'nix'")
82
+ expect(Kernel).to receive(:system).with(/sh -c '.+'/)
52
83
  runner.start
53
84
  end
54
85
  end
@@ -69,45 +100,138 @@ describe Guard::PumaRunner do
69
100
  let(:command) { runner.start }
70
101
 
71
102
  context "with config" do
72
- let(:options) {{ :config => path }}
73
103
  let(:path) { "/tmp/elephants" }
74
104
  let(:environment) { "special_dev" }
75
- it "adds path to command" do
76
- expect(runner.cmd_opts).to match("--config #{path}")
77
- end
78
105
 
79
- context "and additional options" do
80
- let(:options) {{ :config => path, :port => "4000", quiet: false, :environment => environment }}
106
+ context "without pumactl but with a default config file" do
107
+ let(:options) { { pumactl: false } }
108
+
81
109
  it "assumes options are set in config" do
110
+ allow_any_instance_of(Guard::PumaRunner).
111
+ to receive(:default_config_file_exists?).
112
+ and_return(true)
113
+ expect(runner.cmd_opts).to match("--config config/puma.rb")
114
+ end
115
+ end
116
+
117
+ context "without pumactl" do
118
+ let(:options) { { config: path, pumactl: false } }
119
+
120
+ it "adds path to command" do
82
121
  expect(runner.cmd_opts).to match("--config #{path}")
83
- expect(runner.cmd_opts).to match(/--control-token [0-9a-f]{10,}/)
84
- expect(runner.cmd_opts).to match("--control tcp")
85
- expect(runner.cmd_opts).to match("--environment #{environment}")
122
+ end
123
+
124
+ context "and additional options" do
125
+ let(:options) {
126
+ {
127
+ config: path, port: "4000",
128
+ quiet: false, environment: environment
129
+ }
130
+ }
131
+
132
+ it "assumes options are set in config" do
133
+ expect(runner.cmd_opts).to match("--config #{path}")
134
+ expect(runner.cmd_opts).to match(/--control-token [0-9a-f]{10,}/)
135
+ expect(runner.cmd_opts).to match("--control-url tcp")
136
+ expect(runner.cmd_opts).to match("--environment #{environment}")
137
+ end
138
+ end
139
+ end
140
+
141
+ context "with pumactl" do
142
+ let(:options) { { config: path, pumactl: true } }
143
+
144
+ it "adds path to command" do
145
+ expect(runner.cmd_opts).to match("--config-file #{path}")
146
+ end
147
+
148
+ context "and additional options" do
149
+ let(:options) {
150
+ {
151
+ pumactl: true,
152
+ config: path, port: "4000",
153
+ quiet: false
154
+ }
155
+ }
156
+
157
+ it "assumes options are set in config" do
158
+ expect(runner.cmd_opts).to match("--config-file #{path}")
159
+ expect(runner.cmd_opts).to match(/--control-token [0-9a-f]{10,}/)
160
+ expect(runner.cmd_opts).to match("--control-url tcp")
161
+ end
86
162
  end
87
163
  end
88
164
  end
89
165
 
90
166
  context "with bind" do
91
- let(:options) {{ :bind => uri }}
92
167
  let(:uri) { "tcp://foo" }
93
- it "adds uri option to command" do
94
- expect(runner.cmd_opts).to match("--bind #{uri}")
168
+
169
+ context "without pumactl" do
170
+ let(:options) { { pumactl: false, bind: uri } }
171
+
172
+ it "adds uri option to command" do
173
+ expect(runner.cmd_opts).to match("--bind #{uri}")
174
+ end
175
+ end
176
+
177
+ context "with pumactl" do
178
+ let(:options) { { pumactl: true, bind: uri } }
179
+
180
+ it "raises ArgumentError about incompatible options" do
181
+ expect(Guard::Compat::UI).to receive(:warning).with(/bind.+pumactl/)
182
+ runner.cmd_opts
183
+ end
95
184
  end
96
185
  end
97
186
 
98
187
  context "with control_token" do
99
- let(:options) {{ :control_token => token }}
100
188
  let(:token) { "imma-token" }
189
+ let(:options) { { control_token: token } }
190
+
101
191
  it "adds token to command" do
102
192
  expect(runner.cmd_opts).to match(/--control-token #{token}/)
103
193
  end
104
194
  end
105
195
 
106
196
  context "with threads" do
107
- let(:options) {{ :threads => threads }}
108
197
  let(:threads) { "13:42" }
109
- it "adds path to command" do
110
- expect(runner.cmd_opts).to match("--threads #{threads}")
198
+
199
+ context "without pumactl" do
200
+ let(:options) { { pumactl: false, threads: threads } }
201
+
202
+ it "adds threads option to command" do
203
+ expect(runner.cmd_opts).to match("--threads #{threads}")
204
+ end
205
+ end
206
+
207
+ context "with pumactl" do
208
+ let(:options) { { pumactl: true, threads: threads } }
209
+
210
+ it "raises ArgumentError about incompatible options" do
211
+ expect(Guard::Compat::UI).to receive(:warning).with(/threads.+pumactl/)
212
+ runner.cmd_opts
213
+ end
214
+ end
215
+ end
216
+
217
+ context "with environment" do
218
+ let(:environment) { "development" }
219
+
220
+ context "without pumactl" do
221
+ let(:options) { { pumactl: false, environment: environment } }
222
+
223
+ it "adds environment option to command" do
224
+ expect(runner.cmd_opts).to match("--environment #{environment}")
225
+ end
226
+ end
227
+
228
+ context "with pumactl" do
229
+ let(:options) { { pumactl: true, environment: environment } }
230
+
231
+ it "warns about incompatible options" do
232
+ expect(Guard::Compat::UI).to receive(:warning).with(/environment.+pumactl/)
233
+ runner.cmd_opts
234
+ end
111
235
  end
112
236
  end
113
237
  end
@@ -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 'no start on start' do
69
- let(:options) { { :start_on_start => false } }
68
+ context "no start on start" do
69
+ let(:options) { { start_on_start: false } }
70
70
 
71
- it "shows the right message and not run startup" do
72
- expect(guard.runner).to receive(:start).never
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).with(/starting on port 4000/)
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) { { :config => 'config.rb' } }
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 '#reload' do
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::Notifier).to receive(:notify).with(
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(:title => "Restarting Puma...", :image => :pending)
118
+ hash_including(title: "Restarting Puma...", image: :pending)
115
119
  )
116
120
 
117
- expect(Guard::Notifier).to receive(:notify).with(
121
+ expect(Guard::Compat::UI).to receive(:notify).with(
118
122
  "Puma restarted on port 4000.",
119
- hash_including(:title => "Puma restarted!", :image => :success)
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) { { :config => "config.rb" } }
131
+ let(:options) { { config: "config.rb" }.merge!(zero_restart_timeout) }
128
132
 
129
133
  it "restarts and show the message" do
130
- expect(Guard::Notifier).to receive(:notify).with(
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(:title => "Restarting Puma...", :image => :pending)
139
+ hash_including(title: "Restarting Puma...", image: :pending)
133
140
  )
134
141
 
135
- expect(Guard::Notifier).to receive(:notify).with(
142
+ expect(Guard::Compat::UI).to receive(:notify).with(
136
143
  "Puma restarted.",
137
- hash_including(:title => "Puma restarted!", :image => :success)
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) { { :notifications => [:restarted] } }
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
- expect(Guard::Notifier).not_to receive(:notify).with(/restarting/)
149
- expect(Guard::Notifier).to receive(:notify).with(/restarted/, kind_of(Hash))
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) { { :notifications => [] } }
168
+ let(:options) { { notifications: [] }.merge!(zero_restart_timeout) }
157
169
 
158
170
  it "restarts and doesn't show the message" do
159
- expect(Guard::Notifier).not_to receive(:notify)
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 '#stop' do
200
+ describe "#stop" do
168
201
  context "with default options" do
169
202
  it "stops correctly with notification" do
170
- expect(Guard::Notifier).to receive(:notify).with('Until next time...', anything)
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) { { :notifications => [] } }
211
+ let(:options) { { notifications: [] } }
178
212
 
179
213
  it "stops correctly without notification" do
180
- expect(Guard::Notifier).not_to receive(:notify)
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 '#run_on_changes' do
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
@@ -11,4 +11,5 @@ RSpec.configure do |config|
11
11
  config.run_all_when_everything_filtered = true
12
12
  config.filter_run :focus
13
13
  config.mock_with :rspec
14
+ config.color = true
14
15
  end
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.1
4
+ version: 0.7.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-01-13 00:00:00.000000000 Z
11
+ date: 2021-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: guard
@@ -42,72 +42,64 @@ dependencies:
42
42
  name: puma
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ - - "<"
46
49
  - !ruby/object:Gem::Version
47
- version: '3.6'
50
+ version: '6'
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">="
53
56
  - !ruby/object:Gem::Version
54
- version: '3.6'
57
+ version: '4.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '6'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: rake
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '10.4'
67
+ version: '12'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '10.4'
74
+ version: '12'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: rspec
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 3.5.0
81
+ version: '3.7'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: 3.5.0
88
+ version: '3.7'
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: guard-rspec
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: 4.7.0
95
+ version: '4.7'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: 4.7.0
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'
102
+ version: '4.7'
111
103
  description:
112
104
  email:
113
105
  - jesse@jc00ke.com
@@ -115,6 +107,7 @@ executables: []
115
107
  extensions: []
116
108
  extra_rdoc_files: []
117
109
  files:
110
+ - ".editorconfig"
118
111
  - ".gitignore"
119
112
  - ".travis.yml"
120
113
  - CHANGES.md
@@ -132,7 +125,8 @@ files:
132
125
  - spec/lib/guard/puma_spec.rb
133
126
  - spec/spec_helper.rb
134
127
  homepage: https://github.com/jc00ke/guard-puma
135
- licenses: []
128
+ licenses:
129
+ - MIT
136
130
  metadata: {}
137
131
  post_install_message:
138
132
  rdoc_options: []
@@ -149,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
143
  - !ruby/object:Gem::Version
150
144
  version: '0'
151
145
  requirements: []
152
- rubyforge_project:
153
- rubygems_version: 2.6.11
146
+ rubygems_version: 3.1.2
154
147
  signing_key:
155
148
  specification_version: 4
156
149
  summary: Restart puma when files change