spin 0.3.0 → 0.4.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/bin/spin +47 -31
- metadata +26 -44
data/bin/spin
CHANGED
@@ -14,6 +14,8 @@ require 'digest/md5'
|
|
14
14
|
require 'benchmark'
|
15
15
|
require 'optparse'
|
16
16
|
|
17
|
+
SEPARATOR = '|'
|
18
|
+
|
17
19
|
def usage
|
18
20
|
<<-USAGE
|
19
21
|
Usage: spin serve
|
@@ -94,12 +96,20 @@ def serve(force_rspec, force_testunit, time, push_results)
|
|
94
96
|
puts "Pushing test results back to push processes" if push_results
|
95
97
|
|
96
98
|
loop do
|
99
|
+
|
100
|
+
# Trap SIGQUIT (Ctrl+\) and re-run the last files that were pushed.
|
101
|
+
trap('QUIT') do
|
102
|
+
fork_and_run(@last_files_ran, push_results, test_framework)
|
103
|
+
# See WAIT below
|
104
|
+
Process.wait
|
105
|
+
end
|
106
|
+
|
97
107
|
# Since `spin push` reconnects each time it has new files for us we just
|
98
108
|
# need to accept(2) connections from it.
|
99
109
|
conn = socket.accept
|
100
110
|
# This should be a list of relative paths to files.
|
101
111
|
files = conn.gets.chomp
|
102
|
-
files = files.split(
|
112
|
+
files = files.split(SEPARATOR)
|
103
113
|
|
104
114
|
# If spin is started with the time flag we will track total execution so
|
105
115
|
# you can easily compare it with time rspec spec for example
|
@@ -109,35 +119,9 @@ def serve(force_rspec, force_testunit, time, push_results)
|
|
109
119
|
# it immediately.
|
110
120
|
disconnect(conn) unless push_results
|
111
121
|
|
112
|
-
|
113
|
-
# environment is untouched. The child process will load whatever code it
|
114
|
-
# needs to, then it exits and we're back to the baseline preloaded app.
|
115
|
-
fork do
|
116
|
-
# To push the test results to the push process instead of having them
|
117
|
-
# displayed by the server, we reopen $stdout/$stderr to the open
|
118
|
-
# connection.
|
119
|
-
if push_results
|
120
|
-
$stdout.reopen(conn)
|
121
|
-
$stderr.reopen(conn)
|
122
|
-
end
|
123
|
-
|
124
|
-
puts
|
125
|
-
puts "Loading #{files.inspect}"
|
126
|
-
|
127
|
-
# Unfortunately rspec's interface isn't as simple as just requiring the
|
128
|
-
# test file that you want to run (suddenly test/unit seems like the less
|
129
|
-
# crazy one!).
|
130
|
-
if test_framework == :rspec
|
131
|
-
# We pretend the filepath came in as an argument and duplicate the
|
132
|
-
# behaviour of the `rspec` binary.
|
133
|
-
ARGV.push files
|
134
|
-
else
|
135
|
-
# We require the full path of the file here in the child process.
|
136
|
-
files.each { |f| require File.expand_path f }
|
137
|
-
end
|
138
|
-
end
|
122
|
+
fork_and_run(files, push_results, test_framework)
|
139
123
|
|
140
|
-
# We don't want the parent process handling multiple test runs at the same
|
124
|
+
# WAIT: We don't want the parent process handling multiple test runs at the same
|
141
125
|
# time because then we'd need to deal with multiple test databases, and
|
142
126
|
# that destroys the idea of being simple to use. So we wait(2) until the
|
143
127
|
# child process has finished running the test.
|
@@ -157,6 +141,38 @@ def serve(force_rspec, force_testunit, time, push_results)
|
|
157
141
|
end
|
158
142
|
end
|
159
143
|
|
144
|
+
def fork_and_run(files, push_results, test_framework)
|
145
|
+
# We fork(2) before loading the file so that our pristine preloaded
|
146
|
+
# environment is untouched. The child process will load whatever code it
|
147
|
+
# needs to, then it exits and we're back to the baseline preloaded app.
|
148
|
+
fork do
|
149
|
+
# To push the test results to the push process instead of having them
|
150
|
+
# displayed by the server, we reopen $stdout/$stderr to the open
|
151
|
+
# connection.
|
152
|
+
if push_results
|
153
|
+
$stdout.reopen(conn)
|
154
|
+
$stderr.reopen(conn)
|
155
|
+
end
|
156
|
+
|
157
|
+
puts
|
158
|
+
puts "Loading #{files.inspect}"
|
159
|
+
|
160
|
+
# Unfortunately rspec's interface isn't as simple as just requiring the
|
161
|
+
# test file that you want to run (suddenly test/unit seems like the less
|
162
|
+
# crazy one!).
|
163
|
+
if test_framework == :rspec
|
164
|
+
# We pretend the filepath came in as an argument and duplicate the
|
165
|
+
# behaviour of the `rspec` binary.
|
166
|
+
ARGV.push files
|
167
|
+
else
|
168
|
+
# We require the full path of the file here in the child process.
|
169
|
+
files.each { |f| require File.expand_path f }
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
@last_files_ran = files
|
174
|
+
end
|
175
|
+
|
160
176
|
# ## spin push
|
161
177
|
def push
|
162
178
|
# The filenames that we will spin up to `spin serve` are passed in as
|
@@ -167,8 +183,8 @@ def push
|
|
167
183
|
# care of scripts that specify files like `spin push -r file.rb`. The `-r`
|
168
184
|
# bit will just be ignored.
|
169
185
|
#
|
170
|
-
# We build a string like `file1.rb
|
171
|
-
f = files_to_load.select { |f| File.exist?(f) }.uniq.join(
|
186
|
+
# We build a string like `file1.rb|file2.rb` and pass it up to the server.
|
187
|
+
f = files_to_load.select { |f| File.exist?(f.split(':')[0].to_s) }.uniq.join(SEPARATOR)
|
172
188
|
abort if f.empty?
|
173
189
|
puts "Spinning up #{f}"
|
174
190
|
|
metadata
CHANGED
@@ -1,71 +1,53 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: spin
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 0
|
10
|
-
version: 0.3.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Jesse Storimer
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-12-04 00:00:00 -05:00
|
19
|
-
default_executable:
|
12
|
+
date: 2011-12-13 00:00:00.000000000 Z
|
20
13
|
dependencies: []
|
14
|
+
description: ! 'Spin preloads your Rails environment to speed up your autotest(ish)
|
15
|
+
workflow.
|
16
|
+
|
21
17
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
By preloading your Rails environment for testing you don't load the same code over and over and over... Spin works best for an autotest(ish) workflow.
|
26
|
-
email:
|
18
|
+
By preloading your Rails environment for testing you don''t load the same code over
|
19
|
+
and over and over... Spin works best for an autotest(ish) workflow.'
|
20
|
+
email:
|
27
21
|
- jstorimer@gmail.com
|
28
|
-
executables:
|
22
|
+
executables:
|
29
23
|
- spin
|
30
24
|
extensions: []
|
31
|
-
|
32
25
|
extra_rdoc_files: []
|
33
|
-
|
34
|
-
files:
|
26
|
+
files:
|
35
27
|
- bin/spin
|
36
|
-
has_rdoc: true
|
37
28
|
homepage: http://jstorimer.github.com/spin
|
38
29
|
licenses: []
|
39
|
-
|
40
30
|
post_install_message:
|
41
31
|
rdoc_options: []
|
42
|
-
|
43
|
-
require_paths:
|
32
|
+
require_paths:
|
44
33
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
35
|
none: false
|
47
|
-
requirements:
|
48
|
-
- -
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
|
51
|
-
|
52
|
-
- 0
|
53
|
-
version: "0"
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
63
46
|
requirements: []
|
64
|
-
|
65
47
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.
|
48
|
+
rubygems_version: 1.8.11
|
67
49
|
signing_key:
|
68
50
|
specification_version: 3
|
69
51
|
summary: Spin preloads your Rails environment to speed up your autotest(ish) workflow.
|
70
52
|
test_files: []
|
71
|
-
|
53
|
+
has_rdoc:
|