spin 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/spin +65 -8
- metadata +5 -5
data/bin/spin
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
3
2
|
# Spin will speed up your autotest(ish) workflow for Rails.
|
4
3
|
|
5
4
|
# Spin preloads your Rails environment for testing, so you don't load the same code over and over and over... Spin works best with an autotest(ish) workflow.
|
@@ -28,8 +27,25 @@ def socket_file
|
|
28
27
|
[Dir.tmpdir, key].join('/')
|
29
28
|
end
|
30
29
|
|
30
|
+
def determine_test_framework(force_rspec, force_testunit)
|
31
|
+
if force_rspec
|
32
|
+
:rspec
|
33
|
+
elsif force_testunit
|
34
|
+
:testunit
|
35
|
+
elsif defined?(RSpec)
|
36
|
+
:rspec
|
37
|
+
else
|
38
|
+
:testunit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def disconnect(connection)
|
43
|
+
connection.print "\0"
|
44
|
+
connection.close
|
45
|
+
end
|
46
|
+
|
31
47
|
# ## spin serve
|
32
|
-
def serve(force_rspec
|
48
|
+
def serve(force_rspec, force_testunit, time, push_results)
|
33
49
|
file = socket_file
|
34
50
|
# We delete the tmp file for the Unix socket if it already exists. The file
|
35
51
|
# is scoped to the `pwd`, so if it already exists then it must be from an
|
@@ -60,6 +76,8 @@ def serve(force_rspec = false, time = false)
|
|
60
76
|
warn "Could not find config/application.rb. Are you running this from the root of a Rails project?"
|
61
77
|
end
|
62
78
|
|
79
|
+
puts "Pushing test results back to push processes" if push_results
|
80
|
+
|
63
81
|
loop do
|
64
82
|
# Since `spin push` reconnects each time it has new files for us we just
|
65
83
|
# need to accept(2) connections from it.
|
@@ -71,18 +89,34 @@ def serve(force_rspec = false, time = false)
|
|
71
89
|
# If spin is started with the time flag we will track total execution so
|
72
90
|
# you can easily compare it with time rspec spec for example
|
73
91
|
start = Time.now if time
|
92
|
+
|
93
|
+
# If we're not sending results back to the push process, we can disconnect
|
94
|
+
# it immediately.
|
95
|
+
disconnect(conn) unless push_results
|
74
96
|
|
75
97
|
# We fork(2) before loading the file so that our pristine preloaded
|
76
98
|
# environment is untouched. The child process will load whatever code it
|
77
99
|
# needs to, then it exits and we're back to the baseline preloaded app.
|
78
100
|
fork do
|
101
|
+
# To push the test results to the push process instead of having them
|
102
|
+
# displayed by the server, we reopen $stdout/$stderr to the open
|
103
|
+
# connection.
|
104
|
+
if push_results
|
105
|
+
$stdout.reopen(conn)
|
106
|
+
$stderr.reopen(conn)
|
107
|
+
end
|
108
|
+
|
79
109
|
puts
|
80
110
|
puts "Loading #{files.inspect}"
|
81
111
|
|
112
|
+
# Determine the test framework to use using the passed-in 'force' options
|
113
|
+
# or else default to checking for defined constants.
|
114
|
+
test_framework = determine_test_framework(force_rspec, force_testunit)
|
115
|
+
|
82
116
|
# Unfortunately rspec's interface isn't as simple as just requiring the
|
83
117
|
# test file that you want to run (suddenly test/unit seems like the less
|
84
118
|
# crazy one!).
|
85
|
-
if
|
119
|
+
if test_framework == :rspec
|
86
120
|
# We pretend the filepath came in as an argument and duplicate the
|
87
121
|
# behaviour of the `rspec` binary.
|
88
122
|
ARGV.push files
|
@@ -102,6 +136,14 @@ def serve(force_rspec = false, time = false)
|
|
102
136
|
# If we are tracking time we will output it here after everything has
|
103
137
|
# finished running
|
104
138
|
puts "Total execution time was #{Time.now - start} seconds" if start
|
139
|
+
|
140
|
+
# Tests have now run. If we were pushing results to a push process, we can
|
141
|
+
# now disconnect it.
|
142
|
+
begin
|
143
|
+
disconnect(conn) if push_results
|
144
|
+
rescue Errno::EPIPE
|
145
|
+
# Don't abort if the client already disconnected
|
146
|
+
end
|
105
147
|
end
|
106
148
|
end
|
107
149
|
|
@@ -116,7 +158,7 @@ def push
|
|
116
158
|
# bit will just be ignored.
|
117
159
|
#
|
118
160
|
# We build a string like `file1.rb:file2.rb` and pass it up to the server.
|
119
|
-
f = files_to_load.select { |f| File.exist?(f) }.join(File::PATH_SEPARATOR)
|
161
|
+
f = files_to_load.select { |f| File.exist?(f) }.uniq.join(File::PATH_SEPARATOR)
|
120
162
|
abort if f.empty?
|
121
163
|
puts "Spinning up #{f}"
|
122
164
|
|
@@ -125,16 +167,23 @@ def push
|
|
125
167
|
socket = UNIXSocket.open(socket_file)
|
126
168
|
# We put the filenames on the socket for the server to read and then load.
|
127
169
|
socket.puts f
|
170
|
+
|
171
|
+
while line = socket.gets
|
172
|
+
break if line == "\0"
|
173
|
+
print line
|
174
|
+
end
|
128
175
|
rescue Errno::ECONNREFUSED
|
129
176
|
abort "Connection was refused. Have you started up `spin serve` yet?"
|
130
177
|
end
|
131
178
|
|
132
179
|
force_rspec = false
|
180
|
+
force_testunit = false
|
133
181
|
time = false
|
182
|
+
push_results = false
|
134
183
|
options = OptionParser.new do |opts|
|
135
184
|
opts.banner = usage
|
136
185
|
opts.separator ""
|
137
|
-
opts.separator "Options:"
|
186
|
+
opts.separator "Server Options:"
|
138
187
|
|
139
188
|
opts.on("-I", "--load-path=DIR#{File::PATH_SEPARATOR}DIR", "Appends directory to $LOAD_PATH") do |dirs|
|
140
189
|
$LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
|
@@ -144,12 +193,20 @@ options = OptionParser.new do |opts|
|
|
144
193
|
force_rspec = v
|
145
194
|
end
|
146
195
|
|
147
|
-
opts.on('-
|
196
|
+
opts.on('--test-unit', 'Force the selected test framework to Test::Unit') do |v|
|
197
|
+
force_testunit = v
|
198
|
+
end
|
148
199
|
|
149
|
-
opts.on('-t', '--time') do |v|
|
200
|
+
opts.on('-t', '--time', 'See total execution time for each test run') do |v|
|
150
201
|
time = true
|
151
202
|
end
|
152
203
|
|
204
|
+
opts.on('--push-results', 'Push test results to the push process') do |v|
|
205
|
+
push_results = v
|
206
|
+
end
|
207
|
+
|
208
|
+
opts.separator "General Options:"
|
209
|
+
opts.on('-e', 'Stub to keep kicker happy')
|
153
210
|
opts.on('-h', '--help') do
|
154
211
|
$stderr.puts opts
|
155
212
|
exit 1
|
@@ -159,7 +216,7 @@ options.parse!
|
|
159
216
|
|
160
217
|
subcommand = ARGV.shift
|
161
218
|
case subcommand
|
162
|
-
when 'serve' then serve(force_rspec, time)
|
219
|
+
when 'serve' then serve(force_rspec, force_testunit, time, push_results)
|
163
220
|
when 'push' then push
|
164
221
|
else
|
165
222
|
$stderr.puts options
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jesse Storimer
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-19 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|