spork_tasks 1.0.0 → 1.1.1

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/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