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 ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
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
- Spork is kind of annoying to deal with. I just want it to run in the background and have an easy way to restart, start, and stop it. So here are my tasks for doing that.
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
- gem install spork_tasks
11
-
12
- # If you're using Bundler:
13
- gem 'spork_tasks', '~> 1.0.0'
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
@@ -0,0 +1,2 @@
1
+ require 'spork/task_helper'
2
+ Spork::TaskHelper.new.install
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'spork_tasks'
4
+
5
+
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.0.0"
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.0.0
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: 2011-09-28 00:00:00.000000000Z
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/rails/generators/spork_tasks/spork.rake
24
- - lib/rails/generators/spork_tasks/spork_tasks_generator.rb
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.10
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
@@ -1,10 +0,0 @@
1
- class SporkTasksGenerator < Rails::Generators::Base
2
- source_root File.expand_path("../.", __FILE__)
3
-
4
- def copy_rake_tasks
5
- puts "="*45
6
- puts "Copying spork.rake into lib/tasks/"
7
- puts "="*45
8
- copy_file "spork.rake", "lib/tasks/spork.rake"
9
- end
10
- end