guard-puma 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/.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