guard-puma 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rbx/
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - rbx-19mode
5
+ - rbx-18mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in guard-puma.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', version: 2, cli: '--colour', focus: true, all_on_start: false, all_after_pass: false, keep_failed: false do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Jesse Cooke
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Guard::Puma
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
+
5
+ Restart Puma when some files change
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'guard-puma'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install guard-puma
20
+
21
+ ## Usage
22
+
23
+ `guard init puma` or add the following manually to your `Guardfile`
24
+
25
+ ```ruby
26
+ guard 'puma', :port => 4000 do
27
+ watch('Gemfile.lock')
28
+ watch(%r{^config|lib|app/.*})
29
+ end
30
+ ```
31
+
32
+ ## Options
33
+
34
+ * `:port` is the port number to run on (default `4000`)
35
+ * `:environment` is the environment to use (default `development`)
36
+ * `:start_on_start` will start the server when starting Guard (default `true`)
37
+ * `:force_run` kills any process that's holding open the listen port before attempting to (re)start Puma (default `false`).
38
+ * `:daemon` runs the server as a daemon, without any output to the terminal that ran `guard` (default `false`).
39
+ * `:debugger` runs the server with the debugger enabled (default `false`). Required ruby-debug gem.
40
+ * `:timeout` waits this number of seconds when restarting the Puma server before reporting there's a problem (default `20`).
41
+
42
+ ## Contributing
43
+
44
+ 1. Fork it
45
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
46
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
47
+ 4. Push to the branch (`git push origin my-new-feature`)
48
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ desc "Run all RSpec specs"
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ task :default => :spec
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/guard/puma/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Jesse Cooke"]
6
+ gem.email = ["jesse@jc00ke.com"]
7
+ gem.summary = %q{Restart puma when files change }
8
+ gem.homepage = "https://github.com/jc00ke/guard-puma"
9
+
10
+ gem.files = `git ls-files`.split($\)
11
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
+ gem.name = "guard-puma"
14
+ gem.require_paths = ["lib"]
15
+ gem.version = Guard::PumaVersion::VERSION
16
+ gem.add_dependency "guard", ">= 1.0.1"
17
+ gem.add_dependency "rb-inotify"
18
+ gem.add_dependency "libnotify"
19
+ gem.add_dependency "puma"
20
+ gem.add_development_dependency "rake", "~> 0.9.2.2"
21
+ gem.add_development_dependency "rspec", "~> 2.9.0"
22
+ gem.add_development_dependency "guard-rspec", "~> 0.6.0"
23
+ gem.add_development_dependency "bundler", "~> 1.1.0"
24
+ gem.add_development_dependency "fakefs"
25
+ gem.add_development_dependency "mocha"
26
+ end
data/lib/guard/puma.rb ADDED
@@ -0,0 +1,51 @@
1
+ require "guard"
2
+ require "guard/guard"
3
+ require "guard/puma/runner"
4
+ require "rbconfig"
5
+ require "guard/puma/version"
6
+
7
+ module Guard
8
+ class Puma < Guard
9
+ attr_reader :options, :runner
10
+ DEFAULT_OPTIONS = {
11
+ :port => 4000,
12
+ :environment => 'development',
13
+ :start_on_start => true,
14
+ :force_run => false,
15
+ :timeout => 20,
16
+ :debugger => false
17
+ }
18
+
19
+ def initialize(watchers = [], options = {})
20
+ super
21
+ @options = DEFAULT_OPTIONS.merge(options)
22
+ @runner = ::Guard::PumaRunner.new(@options)
23
+ end
24
+ def start
25
+ server = options[:server] ? "#{options[:server]} and " : ""
26
+ UI.info "Guard::Puma will now restart your app on port #{options[:port]} using #{server}#{options[:environment]} environment."
27
+ reload if options[:start_on_start]
28
+ end
29
+
30
+ def reload
31
+ UI.info "Restarting Puma..."
32
+ Notifier.notify("Puma restarting on port #{options[:port]} in #{options[:environment]} environment...", :title => "Restarting Puma...", :image => :pending)
33
+ if runner.restart
34
+ UI.info "Puma restarted, pid #{runner.pid}"
35
+ Notifier.notify("Puma restarted on port #{options[:port]}.", :title => "Puma restarted!", :image => :success)
36
+ else
37
+ UI.info "Puma NOT restarted, check your log files."
38
+ Notifier.notify("Puma NOT restarted, check your log files.", :title => "Puma NOT restarted!", :image => :failed)
39
+ end
40
+ end
41
+
42
+ def stop
43
+ Notifier.notify("Until next time...", :title => "Puma shutting down.", :image => :pending)
44
+ runner.stop
45
+ end
46
+
47
+ def run_on_change(paths)
48
+ reload
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,107 @@
1
+ require 'fileutils'
2
+
3
+ module Guard
4
+ class PumaRunner
5
+
6
+ MAX_WAIT_COUNT = 20
7
+
8
+ attr_reader :options
9
+
10
+ def initialize(options)
11
+ @options = options
12
+ end
13
+
14
+ def start
15
+ kill_unmanaged_pid! if options[:force_run]
16
+ run_rack_command!
17
+ wait_for_pid
18
+ end
19
+
20
+ def stop
21
+ if File.file?(pid_file)
22
+ system %{kill -KILL #{File.read(pid_file).strip}}
23
+ wait_for_no_pid if $?.exitstatus == 0
24
+ FileUtils.rm pid_file
25
+ end
26
+ end
27
+
28
+ def restart
29
+ stop
30
+ start
31
+ end
32
+
33
+ def build_rack_command
34
+ rack_options = [
35
+ '--port', options[:port],
36
+ '--pid', pid_file,
37
+ '-s', 'puma'
38
+ ]
39
+
40
+ %{sh -c 'cd #{Dir.pwd} && rackup #{rack_options.join(' ')} &'}
41
+ end
42
+
43
+ def pid_file
44
+ File.expand_path(".guard-puma-#{options[:environment]}.pid")
45
+ end
46
+
47
+ def pid
48
+ File.file?(pid_file) ? File.read(pid_file).to_i : nil
49
+ end
50
+
51
+ def sleep_time
52
+ options[:timeout].to_f / MAX_WAIT_COUNT.to_f
53
+ end
54
+
55
+ private
56
+
57
+ def run_rack_command!
58
+ system build_rack_command
59
+ end
60
+
61
+ def has_pid?
62
+ File.file?(pid_file)
63
+ end
64
+
65
+ def wait_for_pid_action
66
+ sleep sleep_time
67
+ end
68
+
69
+ def kill_unmanaged_pid!
70
+ if pid = unmanaged_pid
71
+ system %{kill -KILL #{pid}}
72
+ FileUtils.rm pid_file
73
+ wait_for_no_pid
74
+ end
75
+ end
76
+
77
+ def unmanaged_pid
78
+ %x{lsof -n -i TCP:#{options[:port]}}.each_line { |line|
79
+ if line["*:#{options[:port]} "]
80
+ return line.split("\s")[1]
81
+ end
82
+ }
83
+ nil
84
+ end
85
+
86
+ private
87
+
88
+ def wait_for_pid
89
+ wait_for_pid_loop
90
+ end
91
+
92
+ def wait_for_no_pid
93
+ wait_for_pid_loop(false)
94
+ end
95
+
96
+ def wait_for_pid_loop(check_for_existence = true)
97
+ count = 0
98
+ while !(check_for_existence ? has_pid? : !has_pid?) && count < MAX_WAIT_COUNT
99
+ wait_for_pid_action
100
+ count += 1
101
+ end
102
+ !(count == MAX_WAIT_COUNT)
103
+ end
104
+
105
+ end
106
+ end
107
+
@@ -0,0 +1,4 @@
1
+ guard 'puma' do
2
+ watch('Gemfile.lock')
3
+ watch(%r{^config|lib|app/.*})
4
+ end
@@ -0,0 +1,5 @@
1
+ module Guard
2
+ module PumaVersion
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+ require 'guard/puma/runner'
3
+ require 'fakefs/spec_helpers'
4
+
5
+ describe Guard::PumaRunner do
6
+ let(:runner) { Guard::PumaRunner.new(options) }
7
+ let(:environment) { 'development' }
8
+ let(:port) { 3000 }
9
+
10
+ let(:default_options) { { :environment => environment, :port => port } }
11
+ let(:options) { default_options }
12
+
13
+ describe '#pid' do
14
+ include FakeFS::SpecHelpers
15
+
16
+ context 'pid file exists' do
17
+ let(:pid) { 12345 }
18
+
19
+ before do
20
+ FileUtils.mkdir_p File.split(runner.pid_file).first
21
+ File.open(runner.pid_file, 'w') { |fh| fh.print pid }
22
+ end
23
+
24
+ it "reads the pid" do
25
+ runner.pid.should == pid
26
+ end
27
+ end
28
+
29
+ context 'pid file does not exist' do
30
+ it "returns nil" do
31
+ if defined?(Rubinius)
32
+ runner.pid.should == nil
33
+ else
34
+ runner.pid.should be_nil
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#start' do
41
+ let(:kill_expectation) { runner.expects(:kill_unmanaged_pid!) }
42
+ let(:pid_stub) { runner.stubs(:has_pid?) }
43
+
44
+ before do
45
+ runner.expects(:run_rack_command!).once
46
+ end
47
+
48
+ context 'do not force run' do
49
+ before do
50
+ pid_stub.returns(true)
51
+ kill_expectation.never
52
+ runner.expects(:wait_for_pid_action).never
53
+ end
54
+
55
+ it "acts properly" do
56
+ runner.start.should be_true
57
+ end
58
+ end
59
+
60
+ context 'force run' do
61
+ let(:options) { default_options.merge(:force_run => true) }
62
+
63
+ before do
64
+ pid_stub.returns(true)
65
+ kill_expectation.once
66
+ runner.expects(:wait_for_pid_action).never
67
+ end
68
+
69
+ it "acts properly" do
70
+ runner.start.should be_true
71
+ end
72
+ end
73
+
74
+ context "don't write the pid" do
75
+ before do
76
+ pid_stub.returns(false)
77
+ kill_expectation.never
78
+ runner.expects(:wait_for_pid_action).times(Guard::PumaRunner::MAX_WAIT_COUNT)
79
+ end
80
+
81
+ it "acts properly" do
82
+ runner.start.should be_false
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#sleep_time' do
88
+ let(:timeout) { 30 }
89
+ let(:options) { default_options.merge(:timeout => timeout) }
90
+
91
+ it "adjusts the sleep time as necessary" do
92
+ runner.sleep_time.should == (timeout.to_f / Guard::PumaRunner::MAX_WAIT_COUNT.to_f)
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+ require 'guard/puma'
3
+
4
+ describe Guard::Puma do
5
+ let(:guard) { Guard::Puma.new(watchers, options) }
6
+ let(:watchers) { [] }
7
+ let(:options) { {} }
8
+
9
+ describe '#initialize' do
10
+ it "initializes with options" do
11
+ guard
12
+
13
+ guard.runner.options[:port].should == 4000
14
+ end
15
+ end
16
+
17
+ describe '#start' do
18
+ let(:ui_expectation) { Guard::UI.expects(:info).with(regexp_matches(/#{Guard::Puma::DEFAULT_OPTIONS[:port]}/)) }
19
+
20
+ context 'start on start' do
21
+ it "shows the right message and run startup" do
22
+ guard.expects(:reload).once
23
+ ui_expectation
24
+ guard.start
25
+ end
26
+ end
27
+
28
+ context 'no start on start' do
29
+ let(:options) { { :start_on_start => false } }
30
+
31
+ it "shows the right message and not run startup" do
32
+ guard.expects(:reload).never
33
+ ui_expectation
34
+ guard.start
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#reload' do
40
+ let(:pid) { '12345' }
41
+
42
+ before do
43
+ Guard::UI.expects(:info).with('Restarting Puma...')
44
+ Guard::Notifier.expects(:notify).with(regexp_matches(/Puma restarting/), has_entry(:image => :pending))
45
+ Guard::PumaRunner.any_instance.stubs(:pid).returns(pid)
46
+ end
47
+
48
+ let(:runner_stub) { Guard::PumaRunner.any_instance.stubs(:restart) }
49
+
50
+ context 'with pid file' do
51
+ before do
52
+ runner_stub.returns(true)
53
+ end
54
+
55
+ it "restarts and show the pid file" do
56
+ Guard::UI.expects(:info).with(regexp_matches(/#{pid}/))
57
+ Guard::Notifier.expects(:notify).with(regexp_matches(/Puma restarted/), has_entry(:image => :success))
58
+
59
+ guard.reload
60
+ end
61
+ end
62
+
63
+ context 'no pid file' do
64
+ before do
65
+ runner_stub.returns(false)
66
+ end
67
+
68
+ it "restarts and show the pid file" do
69
+ Guard::UI.expects(:info).with(regexp_matches(/#{pid}/)).never
70
+ Guard::UI.expects(:info).with(regexp_matches(/Puma NOT restarted/))
71
+ Guard::Notifier.expects(:notify).with(regexp_matches(/Puma NOT restarted/), has_entry(:image => :failed))
72
+
73
+ guard.reload
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#stop' do
79
+ it "stops correctly" do
80
+ Guard::Notifier.expects(:notify).with('Until next time...', anything)
81
+ guard.stop
82
+ end
83
+ end
84
+
85
+ describe '#run_on_change' do
86
+ it "reloads on change" do
87
+ guard.expects(:reload).once
88
+ guard.run_on_change([])
89
+ end
90
+ end
91
+ end
92
+
@@ -0,0 +1,16 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ ENV["GUARD_ENV"] = 'test'
8
+ require 'rspec'
9
+ require 'mocha'
10
+
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+ config.mock_with :mocha
16
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-puma
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jesse Cooke
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ type: :runtime
16
+ requirement: &5800 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.1
22
+ version_requirements: *5800
23
+ name: guard
24
+ prerelease: false
25
+ - !ruby/object:Gem::Dependency
26
+ type: :runtime
27
+ requirement: &5856 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ version_requirements: *5856
34
+ name: rb-inotify
35
+ prerelease: false
36
+ - !ruby/object:Gem::Dependency
37
+ type: :runtime
38
+ requirement: &5900 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ version_requirements: *5900
45
+ name: libnotify
46
+ prerelease: false
47
+ - !ruby/object:Gem::Dependency
48
+ type: :runtime
49
+ requirement: &5944 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ version_requirements: *5944
56
+ name: puma
57
+ prerelease: false
58
+ - !ruby/object:Gem::Dependency
59
+ type: :development
60
+ requirement: &5988 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 0.9.2.2
66
+ version_requirements: *5988
67
+ name: rake
68
+ prerelease: false
69
+ - !ruby/object:Gem::Dependency
70
+ type: :development
71
+ requirement: &6032 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 2.9.0
77
+ version_requirements: *6032
78
+ name: rspec
79
+ prerelease: false
80
+ - !ruby/object:Gem::Dependency
81
+ type: :development
82
+ requirement: &6076 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.6.0
88
+ version_requirements: *6076
89
+ name: guard-rspec
90
+ prerelease: false
91
+ - !ruby/object:Gem::Dependency
92
+ type: :development
93
+ requirement: &6120 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 1.1.0
99
+ version_requirements: *6120
100
+ name: bundler
101
+ prerelease: false
102
+ - !ruby/object:Gem::Dependency
103
+ type: :development
104
+ requirement: &6164 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ version_requirements: *6164
111
+ name: fakefs
112
+ prerelease: false
113
+ - !ruby/object:Gem::Dependency
114
+ type: :development
115
+ requirement: &6208 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ version_requirements: *6208
122
+ name: mocha
123
+ prerelease: false
124
+ description:
125
+ email:
126
+ - jesse@jc00ke.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - .gitignore
132
+ - .travis.yml
133
+ - Gemfile
134
+ - Guardfile
135
+ - LICENSE
136
+ - README.md
137
+ - Rakefile
138
+ - guard-puma.gemspec
139
+ - lib/guard/puma.rb
140
+ - lib/guard/puma/runner.rb
141
+ - lib/guard/puma/templates/Guardfile
142
+ - lib/guard/puma/version.rb
143
+ - spec/lib/guard/puma/runner_spec.rb
144
+ - spec/lib/guard/puma_spec.rb
145
+ - spec/spec_helper.rb
146
+ homepage: https://github.com/jc00ke/guard-puma
147
+ licenses: []
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ! '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 1.8.12
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: Restart puma when files change
170
+ test_files:
171
+ - spec/lib/guard/puma/runner_spec.rb
172
+ - spec/lib/guard/puma_spec.rb
173
+ - spec/spec_helper.rb