guard-goliath 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b853ffd49fc3a78a2d5eb26ae95e65bb1607313
4
+ data.tar.gz: 2b9ae75ebdb750453111a48d83743ad8b12647ef
5
+ SHA512:
6
+ metadata.gz: 2a28d3c145bd67bc9385f69978f3f9aa4c0cc6b890cc90b39938bf23a9dfffb9b6f6001b96ba3260a9efae5fdac43b4bd8608c659d363b1c1a33d00e6b09d28d
7
+ data.tar.gz: e7771dd8becfd877785b39cdb0e8a162824137c1ac11cdc5dfcbf63b5669778e14df521ab469aa06e4240f603bb1672fad11c19b8b70448d7b68fd0097e31691
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
6
+ .redcar
7
+
data/.rubocop.yml ADDED
@@ -0,0 +1,21 @@
1
+ AllCops:
2
+ Excludes:
3
+ - vendor/**
4
+ - bin/**
5
+
6
+ LineLength:
7
+ Enabled: false
8
+
9
+ MethodLength:
10
+ Enabled: false
11
+
12
+ ClassLength:
13
+ Enabled: false
14
+
15
+ Documentation:
16
+ # don't require classes to be documented
17
+ Enabled: false
18
+
19
+ Encoding:
20
+ # no need to always specify encoding
21
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "ffi"
4
+ gem "spoon"
5
+
6
+ group :development, :test do
7
+ gem "rake"
8
+ gem "bundler"
9
+ gem "rack"
10
+ gem 'growl'
11
+ gem 'rb-inotify', require: false
12
+ gem 'rb-fsevent', require: false
13
+ gem 'rb-fchange', require: false
14
+ gem 'rubocop'
15
+ end
data/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2012 Daniel Doubrovkine
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,32 @@
1
+ Guard::Goliath
2
+ ===========
3
+
4
+ Want to restart your Rack development with *rackup* whilst you work? Now you can!
5
+
6
+ guard 'goliath', port: 9000, app_file: 'app.rb' do
7
+ watch('Gemfile.lock')
8
+ watch(%r{*.rb})
9
+ end
10
+
11
+ Options
12
+ -------
13
+
14
+ * `:port` is the port number to run on (default `9000`)
15
+ * `:environment` is the environment to use (default `development`)
16
+ * `:start_on_start` will start the server when starting Guard (default `true`)
17
+ * `:force_run` kills any process that's holding open the listen port before attempting to (re)start Rack (default `false`).
18
+ * `:daemon` runs the server as a daemon, without any output to the terminal that ran `guard` (default `false`).
19
+ * `:timeout` waits this number of seconds when restarting the Rack server before reporting there's a problem (default `20`).
20
+
21
+ Contributing
22
+ ------------
23
+
24
+ Fork the project. Make your feature addition or bug fix with tests. Send a pull request. Bonus points for topic branches.
25
+
26
+ Copyright and License
27
+ ---------------------
28
+
29
+ MIT License, see [LICENSE](http://github.com/dblock/guard-rack/raw/master/LICENSE.md) for details.
30
+
31
+ (c) 2014 [Nikolay Norkin](http://github.com/duderman)
32
+
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'bundler/gem_tasks'
3
+
4
+ require File.expand_path('../lib/guard/rack/version', __FILE__)
5
+
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+
14
+ require 'rake'
15
+
16
+ require 'rainbow/ext/string' unless String.respond_to?(:color)
17
+ require 'rubocop/rake_task'
18
+ Rubocop::RakeTask.new(:rubocop)
19
+
20
+ task default: [:rubocop]
21
+
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../lib/guard/goliath/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ["Nikolay Norkin"]
7
+
8
+ gem.email = ["zduderman@gmail.com"]
9
+ gem.description = "Automatically reloads your Goliath app on file change using Guard."
10
+ gem.homepage = "https://github.com/duderman/guard-goliath"
11
+ gem.summary = gem.description
12
+ gem.license = 'MIT'
13
+
14
+ gem.name = "guard-goliath"
15
+ gem.require_paths = ["lib"]
16
+ gem.files = `git ls-files`.split("\n")
17
+ gem.version = Guard::GoliathVersion::VERSION
18
+
19
+ gem.add_dependency "guard"
20
+ gem.add_dependency "ffi"
21
+ gem.add_dependency "spoon"
22
+ gem.add_dependency "rb-inotify"
23
+ gem.add_dependency "libnotify"
24
+
25
+ gem.add_development_dependency "rake"
26
+ gem.add_development_dependency "bundler"
27
+ gem.add_development_dependency "rack"
28
+ end
@@ -0,0 +1 @@
1
+ require 'guard/goliath'
@@ -0,0 +1,51 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+ require 'guard/goliath/runner'
4
+ require 'rbconfig'
5
+
6
+ module Guard
7
+ class Goliath < ::Guard::Guard
8
+ attr_reader :options, :runner
9
+
10
+ DEFAULT_OPTIONS = {
11
+ port: 9000,
12
+ environment: 'development',
13
+ start_on_start: true,
14
+ force_run: false,
15
+ timeout: 20,
16
+ app_file: 'app.rb'
17
+ }
18
+
19
+ def initialize(watchers = [], options = {})
20
+ super
21
+ @options = DEFAULT_OPTIONS.merge(options)
22
+ @runner = ::Guard::GoliathRunner.new(@options)
23
+ end
24
+
25
+ def start
26
+ UI.info "Guard::Goliath will now restart your app on port #{options[:port]} using #{options[:environment]} environment."
27
+ reload if options[:start_on_start]
28
+ end
29
+
30
+ def reload
31
+ UI.info 'Restarting App...'
32
+ Notifier.notify("App restarting on port #{options[:port]} in #{options[:environment]} environment...", title: 'Restarting App...', image: :pending)
33
+ if runner.restart
34
+ UI.info "App restarted, pid #{runner.pid}"
35
+ Notifier.notify("App restarted on port #{options[:port]}.", title: 'App restarted!', image: :success)
36
+ else
37
+ UI.info 'App NOT restarted, check your log files.'
38
+ Notifier.notify('App NOT restarted, check your log files.', title: 'App NOT restarted!', image: :failed)
39
+ end
40
+ end
41
+
42
+ def stop
43
+ Notifier.notify('Until next time...', title: 'App shutting down.', image: :pending)
44
+ runner.stop
45
+ end
46
+
47
+ def run_on_changes(paths)
48
+ reload
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,96 @@
1
+ require 'fileutils'
2
+ require 'timeout'
3
+ require 'spoon'
4
+
5
+ module Guard
6
+ class GoliathRunner
7
+ attr_reader :options, :pid
8
+
9
+ def initialize(options)
10
+ @options = options
11
+ end
12
+
13
+ def start
14
+ kill_unmanaged_pid! if options[:force_run]
15
+ @pid = run_rack_command!
16
+ true
17
+ end
18
+
19
+ def stop
20
+ # Rely on kill_unmanaged_pid if there's no pid
21
+ return true unless @pid
22
+
23
+ exitstatus = kill(@pid)
24
+ @pid = nil
25
+ if exitstatus && exitstatus != 0
26
+ UI.info "Ruby exited with non-zero exit status (#{exitstatus}) whilst trying to stop."
27
+ return false
28
+ end
29
+
30
+ true
31
+ end
32
+
33
+ def restart
34
+ stop && start
35
+ end
36
+
37
+ private
38
+
39
+ def build_rack_command
40
+ command = %w{ruby}
41
+ command.push(
42
+ options[:app_file],
43
+ '--environment', options[:environment].to_s,
44
+ '--port', options[:port].to_s
45
+ )
46
+ command << '--daemonize' if options[:daemon]
47
+
48
+ command
49
+ end
50
+
51
+ def kill(pid, force = false)
52
+ result = -1
53
+
54
+ UI.debug("Trying to kill app (PID #{pid})...")
55
+ unless force
56
+ Process.kill('INT', pid)
57
+ begin
58
+ Timeout.timeout(options[:timeout]) do
59
+ _, status = Process.wait2(pid)
60
+ result = status.exitstatus
61
+ UI.debug("Killed App (Exit status: #{result})")
62
+ end
63
+ rescue Timeout::Error
64
+ UI.debug("Couldn't kill App with INT, switching to TERM")
65
+ force = true
66
+ end
67
+ end
68
+
69
+ Process.kill('TERM', pid) if force
70
+
71
+ result
72
+ end
73
+
74
+ def run_rack_command!
75
+ command = build_rack_command
76
+ UI.debug("Running App with command: #{command.inspect}")
77
+ spawn(*command)
78
+ end
79
+
80
+ def spawn(* args)
81
+ Spoon.spawnp(* args)
82
+ end
83
+
84
+ def kill_unmanaged_pid!
85
+ pid = unmanaged_pid
86
+ kill(pid, true) if pid
87
+ end
88
+
89
+ def unmanaged_pid
90
+ %x{lsof -n -i TCP:#{options[:port]}}.each_line do |line|
91
+ return line.split("\s")[1].to_i if line["*:#{options[:port]} "]
92
+ end
93
+ nil
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ guard 'goliath' do
2
+ watch('Gemfile.lock')
3
+ watch(%r{*.rb})
4
+ end
5
+
@@ -0,0 +1,5 @@
1
+ module Guard
2
+ module GoliathVersion
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-goliath
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nikolay Norkin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ffi
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: spoon
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rb-inotify
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: libnotify
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
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'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Automatically reloads your Goliath app on file change using Guard.
126
+ email:
127
+ - zduderman@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rubocop.yml"
134
+ - Gemfile
135
+ - LICENSE.md
136
+ - README.md
137
+ - Rakefile
138
+ - guard-goliath.gemspec
139
+ - lib/guard-goliath.rb
140
+ - lib/guard/goliath.rb
141
+ - lib/guard/goliath/runner.rb
142
+ - lib/guard/goliath/templates/Guardfile
143
+ - lib/guard/goliath/version.rb
144
+ homepage: https://github.com/duderman/guard-goliath
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project:
164
+ rubygems_version: 2.2.2
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: Automatically reloads your Goliath app on file change using Guard.
168
+ test_files: []
169
+ has_rdoc: