spork_tasks 1.0.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +28 -0
- data/README.md +9 -13
- data/lib/spork/task_helper.rb +148 -0
- data/lib/spork/tasks.rb +2 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/task_spec.rb +21 -0
- data/spork_tasks.gemspec +6 -1
- metadata +64 -6
- data/lib/rails/generators/spork_tasks/spork.rake +0 -108
- data/lib/rails/generators/spork_tasks/spork_tasks_generator.rb +0 -10
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
spork_tasks (1.1.1)
|
5
|
+
rake
|
6
|
+
spork
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.2.5)
|
12
|
+
rake (10.1.1)
|
13
|
+
rspec (2.14.1)
|
14
|
+
rspec-core (~> 2.14.0)
|
15
|
+
rspec-expectations (~> 2.14.0)
|
16
|
+
rspec-mocks (~> 2.14.0)
|
17
|
+
rspec-core (2.14.7)
|
18
|
+
rspec-expectations (2.14.5)
|
19
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
20
|
+
rspec-mocks (2.14.5)
|
21
|
+
spork (0.9.2)
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
rspec
|
28
|
+
spork_tasks!
|
data/README.md
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
Spork Tasks
|
2
2
|
===========
|
3
|
-
|
4
|
-
|
5
|
-
You can copy the rake tasks wherever you like, but I've packaged them as a rails generator
|
3
|
+
Run spork in the background! Provides rake tasks for an easy way to start, stop, restart spork.
|
6
4
|
|
7
5
|
Installing
|
8
6
|
----------
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
rails generate spork_tasks
|
16
|
-
# Copies the rake file for you.
|
8
|
+
# In your Gemfile:
|
9
|
+
gem 'spork_tasks', '~> 1.1.0'
|
10
|
+
|
11
|
+
# Add the following line to your Rakefile
|
12
|
+
require 'spork/tasks'
|
17
13
|
|
18
14
|
Tasks
|
19
15
|
-----
|
20
16
|
rake spork:start
|
21
17
|
# Starts the server
|
18
|
+
|
19
|
+
rake spork:start[5678]
|
20
|
+
# Starts spork on port 5768
|
22
21
|
|
23
22
|
rake spork:stop
|
24
23
|
# Stops the server
|
@@ -26,6 +25,3 @@ Tasks
|
|
26
25
|
rake spork:restart
|
27
26
|
# Restarts spork
|
28
27
|
|
29
|
-
TODO
|
30
|
-
----
|
31
|
-
Better process management. Instead of guessing how long to wait (and sleep) for Rails to start, actually wait for it to start before handing the command line back.
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'spork'
|
2
|
+
require 'spork/runner'
|
3
|
+
require 'rake'
|
4
|
+
require 'socket'
|
5
|
+
require 'timeout'
|
6
|
+
|
7
|
+
# Let's fork spork and put in the background and forget about it.
|
8
|
+
# You can start|stop|restart spork using this rake task
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
#
|
12
|
+
# rake spork:start
|
13
|
+
# # => starts spork and detaches the process
|
14
|
+
#
|
15
|
+
# rake spork:stop
|
16
|
+
# # => kills the spork process based on the pid stored in tmp/spork.pid
|
17
|
+
#
|
18
|
+
# rake spork:restart
|
19
|
+
# # => stops then starts spork
|
20
|
+
#
|
21
|
+
|
22
|
+
module Spork
|
23
|
+
class TaskHelper
|
24
|
+
|
25
|
+
include Rake::DSL if defined? Rake::DSL
|
26
|
+
|
27
|
+
def install
|
28
|
+
namespace :spork do
|
29
|
+
desc "Start spork server"
|
30
|
+
task :start, :port do |_, args|
|
31
|
+
port = args[:port]
|
32
|
+
start_spork(port)
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Stop spork server"
|
36
|
+
task :stop do
|
37
|
+
stop_spork
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Restart spork server"
|
41
|
+
task :restart => [:stop, :start]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def start_spork(port = nil)
|
46
|
+
options = []
|
47
|
+
options << "-p#{port}" if port
|
48
|
+
runner = Spork::Runner.new(options, $stderr, $stderr)
|
49
|
+
port = port || runner.find_test_framework.default_port
|
50
|
+
|
51
|
+
if port_bound?(port) || process_running?
|
52
|
+
puts "\033[33m[Spork already running on port #{port}]\033[0m"
|
53
|
+
return
|
54
|
+
end
|
55
|
+
|
56
|
+
begin
|
57
|
+
pid = fork do
|
58
|
+
$stdout = File.new('/dev/null', 'w')
|
59
|
+
begin
|
60
|
+
runner.run
|
61
|
+
rescue => e
|
62
|
+
$stderr.puts
|
63
|
+
$stderr.puts "#{e.class} => #{e.message}"
|
64
|
+
$stderr.puts e.backtrace.join("\n")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Detach the pid, keep track of the pid, and wait for Rails to start.
|
69
|
+
Process.detach(pid)
|
70
|
+
File.open(pid_file, "w"){|f| f.write pid}
|
71
|
+
|
72
|
+
print "Starting spork..."
|
73
|
+
timeout = 20
|
74
|
+
seconds = 0
|
75
|
+
until port_bound?(port)
|
76
|
+
print '.'; $stdout.flush
|
77
|
+
seconds += 1
|
78
|
+
break if seconds > timeout
|
79
|
+
sleep 1
|
80
|
+
end
|
81
|
+
|
82
|
+
# See if the process actually started
|
83
|
+
if process_running?
|
84
|
+
puts "\033[32m[Spork running in background with pid #{pid}]\033[0m\n"
|
85
|
+
else
|
86
|
+
puts "\033[31m[Spork failed to start]\033[0m\n"
|
87
|
+
end
|
88
|
+
rescue StandardError => e
|
89
|
+
puts e.inspect
|
90
|
+
puts "\033[31m[Spork failed to start]\033[0m\n"
|
91
|
+
stop_spork
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def stop_spork
|
96
|
+
print "Stopping spork..."
|
97
|
+
if pid_to_kill = pid
|
98
|
+
begin
|
99
|
+
Process.kill("INT", pid_to_kill)
|
100
|
+
print "\033[32m[OK]\033[0m\n"
|
101
|
+
sleep 1
|
102
|
+
rescue Errno::ESRCH => e
|
103
|
+
print "\033[33m[not running]\033[0m\n"
|
104
|
+
rescue StandardError => e
|
105
|
+
print "\033[31m[FAILED]\033[0m\n"
|
106
|
+
puts e.inspect
|
107
|
+
end
|
108
|
+
else
|
109
|
+
print "\033[33m[not running]\033[0m\n"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def pid_file
|
114
|
+
dir = File.join(Rails.root, 'tmp')
|
115
|
+
File.join(dir, 'spork.pid')
|
116
|
+
end
|
117
|
+
|
118
|
+
def pid
|
119
|
+
return unless File.exist?(pid_file)
|
120
|
+
File.read(pid_file).to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
def process_running?
|
124
|
+
begin
|
125
|
+
Process.kill(0, pid)
|
126
|
+
return true
|
127
|
+
rescue Errno::ESRCH => e
|
128
|
+
return false
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def port_bound?(port)
|
133
|
+
begin
|
134
|
+
Timeout::timeout(1) do
|
135
|
+
begin
|
136
|
+
s = TCPSocket.new('localhost', port)
|
137
|
+
s.close
|
138
|
+
return true
|
139
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
140
|
+
return false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
rescue Timeout::Error
|
144
|
+
return false
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
data/lib/spork/tasks.rb
ADDED
data/spec/spec_helper.rb
ADDED
data/spec/task_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SporkTasks do
|
4
|
+
describe 'install_tasks' do
|
5
|
+
|
6
|
+
it "defines Rake tasks" do
|
7
|
+
names = %w[spork:start spork:stop spork:restart]
|
8
|
+
|
9
|
+
names.each { |name|
|
10
|
+
expect { Rake.application[name] }.to raise_error(/Don't know how to build task/)
|
11
|
+
}
|
12
|
+
|
13
|
+
SporkTasks.new.install
|
14
|
+
|
15
|
+
names.each { |name|
|
16
|
+
expect { Rake.application[name] }.not_to raise_error
|
17
|
+
expect(Rake.application[name]).to be_instance_of Rake::Task
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spork_tasks.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "spork_tasks"
|
4
|
-
s.version = "1.
|
4
|
+
s.version = "1.1.1"
|
5
5
|
s.authors = ["Tyler Montgomery"]
|
6
6
|
s.email = ["tyler.a.montgomery@gmail.com"]
|
7
7
|
s.homepage = ""
|
@@ -12,4 +12,9 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.files = `git ls-files`.split("\n")
|
14
14
|
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
s.add_dependency 'rake'
|
17
|
+
s.add_dependency 'spork'
|
18
|
+
|
19
|
+
s.add_development_dependency 'rspec'
|
15
20
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spork_tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
12
|
+
date: 2014-02-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: spork
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
14
62
|
description: start|stop|restart tasks to manage the Spork drb server
|
15
63
|
email:
|
16
64
|
- tyler.a.montgomery@gmail.com
|
@@ -18,10 +66,14 @@ executables: []
|
|
18
66
|
extensions: []
|
19
67
|
extra_rdoc_files: []
|
20
68
|
files:
|
69
|
+
- Gemfile
|
70
|
+
- Gemfile.lock
|
21
71
|
- README.md
|
22
72
|
- Rakefile
|
23
|
-
- lib/
|
24
|
-
- lib/
|
73
|
+
- lib/spork/task_helper.rb
|
74
|
+
- lib/spork/tasks.rb
|
75
|
+
- spec/spec_helper.rb
|
76
|
+
- spec/task_spec.rb
|
25
77
|
- spork_tasks.gemspec
|
26
78
|
homepage: ''
|
27
79
|
licenses: []
|
@@ -35,15 +87,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
35
87
|
- - ! '>='
|
36
88
|
- !ruby/object:Gem::Version
|
37
89
|
version: '0'
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
hash: 3397655467472293831
|
38
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
94
|
none: false
|
40
95
|
requirements:
|
41
96
|
- - ! '>='
|
42
97
|
- !ruby/object:Gem::Version
|
43
98
|
version: '0'
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
hash: 3397655467472293831
|
44
102
|
requirements: []
|
45
103
|
rubyforge_project: spork_tasks
|
46
|
-
rubygems_version: 1.8.
|
104
|
+
rubygems_version: 1.8.23
|
47
105
|
signing_key:
|
48
106
|
specification_version: 3
|
49
107
|
summary: Rake tasks for managing Spork
|
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'spork'
|
2
|
-
require 'spork/runner'
|
3
|
-
# Let's fork spork and put in the background and forget about it.
|
4
|
-
# You can start|stop|restart spork using this rake task
|
5
|
-
#
|
6
|
-
# Examples
|
7
|
-
#
|
8
|
-
# rake spork:start
|
9
|
-
# # => starts spork and detaches the process
|
10
|
-
#
|
11
|
-
# rake spork:stop
|
12
|
-
# # => kills the spork process based on the pid stored in tmp/spork.pid
|
13
|
-
#
|
14
|
-
# rake spork:restart
|
15
|
-
# # => stops then starts spork
|
16
|
-
#
|
17
|
-
namespace :spork do
|
18
|
-
desc "Starts spork server"
|
19
|
-
task :start do
|
20
|
-
begin
|
21
|
-
print "Starting spork..."
|
22
|
-
|
23
|
-
pid = fork do
|
24
|
-
# Swallows spork's notifications. I don't want it spewing all over my terminal from the background.
|
25
|
-
$stdout = File.new('/dev/null', 'w')
|
26
|
-
# If you want to change the default config you can
|
27
|
-
# specify the command line options here
|
28
|
-
# For example to change the port:
|
29
|
-
# options = ["--port", "7443"]
|
30
|
-
options = []
|
31
|
-
begin
|
32
|
-
Spork::Runner.run(options, $stderr, $stderr)
|
33
|
-
rescue => e
|
34
|
-
$stderr.puts
|
35
|
-
$stderr.puts "#{e.class} => #{e.message}"
|
36
|
-
$stderr.puts e.backtrace.join("\n")
|
37
|
-
end
|
38
|
-
# TODO maybe swallow stderr now... will that work?
|
39
|
-
# It should b/c its in the same process... or does spork hijack it?
|
40
|
-
# $stderr = File.new('/dev/null', 'w')
|
41
|
-
end
|
42
|
-
|
43
|
-
# Detach the pid, keep track of the pid, and wait for Rails to start.
|
44
|
-
|
45
|
-
Process.detach(pid)
|
46
|
-
File.open("#{tmp_dir}/spork.pid", "w"){|f| f.write pid}
|
47
|
-
|
48
|
-
seconds = 15
|
49
|
-
|
50
|
-
puts "\033[35m[Giving Rails #{seconds} seconds to start]\033[0m\n"
|
51
|
-
puts "\033[36mYou can change the wait time in lib/tasks/spork.rake \nif Rails is taking longer than #{seconds} seconds to load\033[0m\n"
|
52
|
-
|
53
|
-
sleep seconds
|
54
|
-
|
55
|
-
# See if the process actually started
|
56
|
-
if process_running?(pid)
|
57
|
-
puts "\033[32m[Sporkified!]\033[0m\n"
|
58
|
-
else
|
59
|
-
puts "\033[31m[Spork failed to start]\033[0m\n"
|
60
|
-
end
|
61
|
-
rescue StandardError => e
|
62
|
-
puts e.inspect
|
63
|
-
puts "\033[31m[Spork failed to start]\033[0m\n"
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
desc "Stops the spork server"
|
69
|
-
task :stop do
|
70
|
-
print "Stopping spork..."
|
71
|
-
if File.exist?("#{tmp_dir}/spork.pid")
|
72
|
-
pid = File.read("#{tmp_dir}/spork.pid").to_i
|
73
|
-
begin
|
74
|
-
Process.kill("INT", pid)
|
75
|
-
print "\033[32m[OK]\033[0m\n"
|
76
|
-
sleep 1
|
77
|
-
rescue Errno::ESRCH => e
|
78
|
-
print "\033[33m[not running]\033[0m\n"
|
79
|
-
rescue StandardError => e
|
80
|
-
print "\033[31m[FAILED]\033[0m\n"
|
81
|
-
puts e.inspect
|
82
|
-
end
|
83
|
-
else
|
84
|
-
print "\033[33m[not running]\033[0m\n"
|
85
|
-
end
|
86
|
-
print "\033[30mis it a spoon? is it a fork?\033[0m\n"
|
87
|
-
end
|
88
|
-
|
89
|
-
desc "Restart the spork server"
|
90
|
-
task :restart => [:stop, :start]
|
91
|
-
|
92
|
-
def tmp_dir
|
93
|
-
File.expand_path('../../../tmp', __FILE__)
|
94
|
-
end
|
95
|
-
|
96
|
-
def process_running?(pid=nil)
|
97
|
-
unless pid
|
98
|
-
return unless File.exist?("#{tmp_dir}/spork.pid")
|
99
|
-
pid = File.read("#{tmp_dir}/spork.pid").to_i
|
100
|
-
end
|
101
|
-
begin
|
102
|
-
Process.kill(0, pid)
|
103
|
-
rescue Errno::ESRCH => e
|
104
|
-
return false
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|