spring 1.0.0 → 1.1.0.beta1
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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +15 -0
- data/README.md +75 -42
- data/lib/spring/application.rb +7 -16
- data/lib/spring/binstub.rb +12 -0
- data/lib/spring/client.rb +8 -5
- data/lib/spring/client/binstub.rb +148 -39
- data/lib/spring/client/help.rb +4 -12
- data/lib/spring/client/rails.rb +1 -3
- data/lib/spring/client/version.rb +11 -0
- data/lib/spring/command_wrapper.rb +83 -0
- data/lib/spring/commands.rb +3 -2
- data/lib/spring/commands/rails.rb +1 -2
- data/lib/spring/commands/rake.rb +0 -4
- data/lib/spring/server.rb +1 -7
- data/lib/spring/version.rb +1 -1
- data/test/acceptance/app_test.rb +163 -347
- data/test/acceptance/helper.rb +312 -0
- data/test/unit/client/version_test.rb +14 -0
- metadata +12 -4
data/lib/spring/client/help.rb
CHANGED
@@ -20,6 +20,8 @@ module Spring
|
|
20
20
|
@spring_commands = spring_commands || Spring::Client::COMMANDS.dup
|
21
21
|
@application_commands = application_commands || Spring.commands.dup
|
22
22
|
|
23
|
+
@spring_commands.delete_if { |k, v| k.start_with?("-") }
|
24
|
+
|
23
25
|
@application_commands["rails"] = @spring_commands.delete("rails")
|
24
26
|
end
|
25
27
|
|
@@ -46,19 +48,9 @@ module Spring
|
|
46
48
|
spring_commands.merge application_commands
|
47
49
|
end
|
48
50
|
|
49
|
-
def description_for_command(command)
|
50
|
-
if command.respond_to?(:description)
|
51
|
-
command.description
|
52
|
-
elsif command.respond_to?(:exec_name)
|
53
|
-
"Runs the #{command.exec_name} command"
|
54
|
-
else
|
55
|
-
"No description given."
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
51
|
def display(name, command)
|
60
|
-
if description
|
61
|
-
" #{name.ljust(max_name_width)} #{description}"
|
52
|
+
if command.description
|
53
|
+
" #{name.ljust(max_name_width)} #{command.description}"
|
62
54
|
end
|
63
55
|
end
|
64
56
|
|
data/lib/spring/client/rails.rb
CHANGED
@@ -24,9 +24,7 @@ module Spring
|
|
24
24
|
else
|
25
25
|
require "spring/configuration"
|
26
26
|
ARGV.shift
|
27
|
-
|
28
|
-
require Spring.application_root_path.join("config/boot")
|
29
|
-
require "rails/commands"
|
27
|
+
load Dir.glob(Spring.application_root_path.join("{bin,script}/rails")).first
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "spring/configuration"
|
2
|
+
|
3
|
+
module Spring
|
4
|
+
class CommandWrapper
|
5
|
+
attr_reader :name, :command
|
6
|
+
|
7
|
+
def initialize(name, command = nil)
|
8
|
+
@name = name
|
9
|
+
@command = command
|
10
|
+
@setup = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
if command.respond_to?(:description)
|
15
|
+
command.description
|
16
|
+
else
|
17
|
+
"Runs the #{name} command"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup?
|
22
|
+
@setup
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup
|
26
|
+
if !setup? && command.respond_to?(:setup)
|
27
|
+
command.setup
|
28
|
+
@setup = true
|
29
|
+
return true
|
30
|
+
else
|
31
|
+
@setup = true
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def call
|
37
|
+
if command.respond_to?(:call)
|
38
|
+
command.call
|
39
|
+
else
|
40
|
+
$0 = exec
|
41
|
+
load exec
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def gem_name
|
46
|
+
if command.respond_to?(:gem_name)
|
47
|
+
command.gem_name
|
48
|
+
else
|
49
|
+
exec_name
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def exec_name
|
54
|
+
if command.respond_to?(:exec_name)
|
55
|
+
command.exec_name
|
56
|
+
else
|
57
|
+
name
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def binstub
|
62
|
+
Spring.application_root_path.join(binstub_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def binstub_name
|
66
|
+
"bin/#{name}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def exec
|
70
|
+
if binstub.exist?
|
71
|
+
binstub.to_s
|
72
|
+
else
|
73
|
+
Gem.bin_path(gem_name, exec_name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def env(args)
|
78
|
+
if command.respond_to?(:env)
|
79
|
+
command.env(args)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/spring/commands.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "spring/watcher"
|
2
|
+
require "spring/command_wrapper"
|
2
3
|
|
3
4
|
module Spring
|
4
5
|
@commands = {}
|
@@ -7,8 +8,8 @@ module Spring
|
|
7
8
|
attr_reader :commands
|
8
9
|
end
|
9
10
|
|
10
|
-
def self.register_command(name,
|
11
|
-
commands[name] =
|
11
|
+
def self.register_command(name, command = nil)
|
12
|
+
commands[name] = CommandWrapper.new(name, command)
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.command?(name)
|
data/lib/spring/commands/rake.rb
CHANGED
data/lib/spring/server.rb
CHANGED
@@ -82,13 +82,7 @@ module Spring
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def rails_env_for(args, default_rails_env)
|
85
|
-
|
86
|
-
|
87
|
-
if command.respond_to?(:env)
|
88
|
-
env = command.env(args.drop(1))
|
89
|
-
end
|
90
|
-
|
91
|
-
env || default_rails_env
|
85
|
+
Spring.command(args.first).env(args.drop(1)) || default_rails_env
|
92
86
|
end
|
93
87
|
|
94
88
|
# Boot the server into the process group of the current session.
|
data/lib/spring/version.rb
CHANGED
data/test/acceptance/app_test.rb
CHANGED
@@ -1,146 +1,30 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
3
|
-
require
|
2
|
+
require "helper"
|
3
|
+
require "acceptance/helper"
|
4
|
+
require "io/wait"
|
4
5
|
require "timeout"
|
5
6
|
require "spring/sid"
|
6
|
-
require "spring/
|
7
|
+
require "spring/client"
|
7
8
|
|
8
9
|
class AppTest < ActiveSupport::TestCase
|
9
10
|
DEFAULT_SPEEDUP = 0.8
|
10
|
-
DEFAULT_TIMEOUT = ENV['CI'] ? 30 : 10
|
11
11
|
|
12
12
|
def rails_version
|
13
13
|
ENV['RAILS_VERSION'] || '~> 4.0.0'
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def generator
|
17
|
+
@@generator ||= Spring::Test::ApplicationGenerator.new(rails_version)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def gem_home
|
25
|
-
app_root.join "vendor/gems/#{RUBY_VERSION}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def user_home
|
29
|
-
app_root.join "user_home"
|
30
|
-
end
|
31
|
-
|
32
|
-
def spring
|
33
|
-
gem_home.join "bin/spring"
|
34
|
-
end
|
35
|
-
|
36
|
-
def spring_env
|
37
|
-
@spring_env ||= Spring::Env.new(app_root)
|
38
|
-
end
|
39
|
-
|
40
|
-
def stdout
|
41
|
-
@stdout ||= IO.pipe
|
42
|
-
end
|
43
|
-
|
44
|
-
def stderr
|
45
|
-
@stderr ||= IO.pipe
|
46
|
-
end
|
47
|
-
|
48
|
-
def log_file
|
49
|
-
@log_file ||= File.open("/tmp/spring.log", "w+")
|
50
|
-
end
|
51
|
-
|
52
|
-
def env
|
53
|
-
@env ||= {
|
54
|
-
"GEM_HOME" => gem_home.to_s,
|
55
|
-
"GEM_PATH" => "",
|
56
|
-
"HOME" => user_home.to_s,
|
57
|
-
"RAILS_ENV" => nil,
|
58
|
-
"RACK_ENV" => nil,
|
59
|
-
"SPRING_LOG" => log_file.path
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
def app_run(command, opts = {})
|
64
|
-
start_time = Time.now
|
65
|
-
|
66
|
-
Bundler.with_clean_env do
|
67
|
-
Process.spawn(
|
68
|
-
env,
|
69
|
-
command.to_s,
|
70
|
-
out: stdout.last,
|
71
|
-
err: stderr.last,
|
72
|
-
in: :close,
|
73
|
-
chdir: app_root.to_s,
|
74
|
-
)
|
75
|
-
end
|
76
|
-
|
77
|
-
_, status = Timeout.timeout(opts.fetch(:timeout, DEFAULT_TIMEOUT)) { Process.wait2 }
|
78
|
-
|
79
|
-
if pid = spring_env.pid
|
80
|
-
@server_pid = pid
|
81
|
-
lines = `ps -A -o ppid= -o pid= | egrep '^\\s*#{@server_pid}'`.lines
|
82
|
-
@application_pids = lines.map { |l| l.split.last.to_i }
|
83
|
-
end
|
84
|
-
|
85
|
-
output = read_streams
|
86
|
-
puts dump_streams(command, output) if ENV["SPRING_DEBUG"]
|
87
|
-
|
88
|
-
@times << (Time.now - start_time) if @times
|
89
|
-
|
90
|
-
output.merge(status: status, command: command)
|
91
|
-
rescue Timeout::Error => e
|
92
|
-
raise e, "Output:\n\n#{dump_streams(command, read_streams)}"
|
93
|
-
end
|
94
|
-
|
95
|
-
def read_streams
|
96
|
-
{
|
97
|
-
stdout: read_stream(stdout.first),
|
98
|
-
stderr: read_stream(stderr.first),
|
99
|
-
log: read_stream(log_file)
|
100
|
-
}
|
101
|
-
end
|
102
|
-
|
103
|
-
def read_stream(stream)
|
104
|
-
output = ""
|
105
|
-
while IO.select([stream], [], [], 0.5) && !stream.eof?
|
106
|
-
output << stream.readpartial(10240)
|
107
|
-
end
|
108
|
-
output
|
109
|
-
end
|
110
|
-
|
111
|
-
def dump_streams(command, streams)
|
112
|
-
output = "$ #{command}\n"
|
113
|
-
|
114
|
-
streams.each do |name, stream|
|
115
|
-
unless stream.chomp.empty?
|
116
|
-
output << "--- #{name} ---\n"
|
117
|
-
output << "#{stream.chomp}\n"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
output << "\n"
|
122
|
-
output
|
123
|
-
end
|
124
|
-
|
125
|
-
def alive?(pid)
|
126
|
-
Process.kill 0, pid
|
127
|
-
true
|
128
|
-
rescue Errno::ESRCH
|
129
|
-
false
|
130
|
-
end
|
131
|
-
|
132
|
-
def await_reload
|
133
|
-
raise "no pid" if @application_pids.nil? || @application_pids.empty?
|
134
|
-
|
135
|
-
Timeout.timeout(DEFAULT_TIMEOUT) do
|
136
|
-
sleep 0.1 while @application_pids.any? { |p| alive?(p) }
|
137
|
-
end
|
20
|
+
def app
|
21
|
+
@app ||= Spring::Test::Application.new("#{TEST_ROOT}/apps/tmp")
|
138
22
|
end
|
139
23
|
|
140
24
|
def debug(artifacts)
|
141
25
|
artifacts = artifacts.dup
|
142
26
|
artifacts.delete :status
|
143
|
-
dump_streams(artifacts.delete(:command), artifacts)
|
27
|
+
app.dump_streams(artifacts.delete(:command), artifacts)
|
144
28
|
end
|
145
29
|
|
146
30
|
def assert_output(artifacts, expected)
|
@@ -151,13 +35,13 @@ class AppTest < ActiveSupport::TestCase
|
|
151
35
|
end
|
152
36
|
|
153
37
|
def assert_success(command, expected_output = nil)
|
154
|
-
artifacts =
|
38
|
+
artifacts = app.run(*Array(command))
|
155
39
|
assert artifacts[:status].success?, "expected successful exit status\n\n#{debug(artifacts)}"
|
156
40
|
assert_output artifacts, expected_output if expected_output
|
157
41
|
end
|
158
42
|
|
159
43
|
def assert_failure(command, expected_output = nil)
|
160
|
-
artifacts =
|
44
|
+
artifacts = app.run(*Array(command))
|
161
45
|
assert !artifacts[:status].success?, "expected unsuccessful exit status\n\n#{debug(artifacts)}"
|
162
46
|
assert_output artifacts, expected_output if expected_output
|
163
47
|
end
|
@@ -166,286 +50,236 @@ class AppTest < ActiveSupport::TestCase
|
|
166
50
|
if ENV['CI']
|
167
51
|
yield
|
168
52
|
else
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
@times = nil
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def spring_test_command
|
177
|
-
"#{spring} #{rails_3? ? 'testunit' : 'rake test'} #{@test}"
|
178
|
-
end
|
179
|
-
|
180
|
-
def generate_app
|
181
|
-
Bundler.with_clean_env do
|
182
|
-
# Sporadic SSL errors keep causing test failures so there are anti-SSL workarounds here
|
183
|
-
|
184
|
-
assert system("(gem list rails --installed --version '#{rails_version}' || " \
|
185
|
-
"gem install rails --clear-sources --source http://rubygems.org --version '#{rails_version}') > /dev/null")
|
186
|
-
|
187
|
-
# Have to shell out otherwise bundler prevents us finding the gem
|
188
|
-
version = `ruby -e 'puts Gem::Specification.find_by_name("rails", "#{rails_version}").version'`.chomp
|
189
|
-
|
190
|
-
assert system("rails _#{version}_ new #{app_root} --skip-bundle --skip-javascript --skip-sprockets > /dev/null")
|
191
|
-
|
192
|
-
FileUtils.mkdir_p(gem_home)
|
193
|
-
FileUtils.mkdir_p(user_home)
|
194
|
-
FileUtils.rm_rf("#{app_root}/test/performance/")
|
195
|
-
|
196
|
-
if rails_3?
|
197
|
-
File.write(
|
198
|
-
"#{app_root}/Gemfile",
|
199
|
-
File.read("#{app_root}/Gemfile") + "gem 'spring-commands-testunit'\n"
|
200
|
-
)
|
53
|
+
app.with_timing do
|
54
|
+
yield
|
55
|
+
assert app.timing_ratio < ratio, "#{app.last_time} was not less than #{ratio} of #{app.first_time}"
|
201
56
|
end
|
202
|
-
|
203
|
-
File.write(
|
204
|
-
"#{app_root}/Gemfile",
|
205
|
-
File.read("#{app_root}/Gemfile").sub("https://rubygems.org", "http://rubygems.org")
|
206
|
-
)
|
207
57
|
end
|
208
58
|
end
|
209
59
|
|
210
|
-
def
|
211
|
-
|
212
|
-
|
213
|
-
assert system("gem build spring.gemspec 2>/dev/null 1>/dev/null")
|
214
|
-
|
215
|
-
assert_success ["gem install ../../../spring-#{Spring::VERSION}.gem", timeout: nil]
|
216
|
-
assert_success ["(gem list bundler | grep bundler) || gem install bundler", timeout: nil]
|
217
|
-
assert_success ["bundle check || bundle update", timeout: nil]
|
60
|
+
def assert_app_reloaded
|
61
|
+
assert_success app.spring_test_command
|
218
62
|
|
219
|
-
|
220
|
-
|
221
|
-
|
63
|
+
File.write(app.application_config, app.application_config.read + <<-CODE)
|
64
|
+
class Foo
|
65
|
+
def self.omg
|
66
|
+
raise "omg"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
CODE
|
70
|
+
File.write(app.test, app.test.read.sub("get :index", "Foo.omg"))
|
222
71
|
|
223
|
-
|
224
|
-
|
72
|
+
app.await_reload
|
73
|
+
assert_failure app.spring_test_command, stdout: "RuntimeError: omg"
|
225
74
|
end
|
226
75
|
|
227
|
-
@@installed = false
|
228
|
-
|
229
76
|
setup do
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
install unless @@installed
|
234
|
-
|
235
|
-
@test_contents = File.read(@test)
|
236
|
-
@controller_contents = File.read(@controller)
|
77
|
+
generator.generate_if_missing
|
78
|
+
generator.install_spring
|
79
|
+
generator.copy_to(app.root)
|
237
80
|
end
|
238
81
|
|
239
82
|
teardown do
|
240
|
-
|
241
|
-
File.write(@test, @test_contents)
|
242
|
-
File.write(@controller, @controller_contents)
|
243
|
-
FileUtils.rm_f("#{app_root}/config/spring.rb")
|
83
|
+
app.stop_spring
|
244
84
|
end
|
245
85
|
|
246
86
|
test "basic" do
|
247
87
|
assert_speedup do
|
248
|
-
2.times {
|
88
|
+
2.times { app.run app.spring_test_command }
|
249
89
|
end
|
250
90
|
end
|
251
91
|
|
252
92
|
test "help message when called without arguments" do
|
253
|
-
assert_success spring, stdout: 'Usage: spring COMMAND [ARGS]'
|
93
|
+
assert_success "bin/spring", stdout: 'Usage: spring COMMAND [ARGS]'
|
254
94
|
end
|
255
95
|
|
256
96
|
test "test changes are picked up" do
|
257
97
|
assert_speedup do
|
258
|
-
assert_success spring_test_command, stdout: "0 failures"
|
98
|
+
assert_success app.spring_test_command, stdout: "0 failures"
|
259
99
|
|
260
|
-
File.write(
|
261
|
-
assert_failure spring_test_command, stdout: "RuntimeError: omg"
|
100
|
+
File.write(app.test, app.test.read.sub("get :index", "raise 'omg'"))
|
101
|
+
assert_failure app.spring_test_command, stdout: "RuntimeError: omg"
|
262
102
|
end
|
263
103
|
end
|
264
104
|
|
265
105
|
test "code changes are picked up" do
|
266
106
|
assert_speedup do
|
267
|
-
assert_success spring_test_command, stdout: "0 failures"
|
107
|
+
assert_success app.spring_test_command, stdout: "0 failures"
|
268
108
|
|
269
|
-
File.write(
|
270
|
-
assert_failure spring_test_command, stdout: "RuntimeError: omg"
|
109
|
+
File.write(app.controller, app.controller.read.sub("@posts = Post.all", "raise 'omg'"))
|
110
|
+
assert_failure app.spring_test_command, stdout: "RuntimeError: omg"
|
271
111
|
end
|
272
112
|
end
|
273
113
|
|
274
114
|
test "code changes in pre-referenced app files are picked up" do
|
275
|
-
|
276
|
-
initializer = "#{app_root}/config/initializers/load_posts_controller.rb"
|
277
|
-
File.write(initializer, "PostsController\n")
|
115
|
+
File.write(app.path("config/initializers/load_posts_controller.rb"), "PostsController\n")
|
278
116
|
|
279
|
-
|
280
|
-
|
117
|
+
assert_speedup do
|
118
|
+
assert_success app.spring_test_command, stdout: "0 failures"
|
281
119
|
|
282
|
-
|
283
|
-
|
284
|
-
end
|
285
|
-
ensure
|
286
|
-
FileUtils.rm_f(initializer)
|
120
|
+
File.write(app.controller, app.controller.read.sub("@posts = Post.all", "raise 'omg'"))
|
121
|
+
assert_failure app.spring_test_command, stdout: "RuntimeError: omg"
|
287
122
|
end
|
288
123
|
end
|
289
124
|
|
290
|
-
def assert_app_reloaded
|
291
|
-
application = "#{app_root}/config/application.rb"
|
292
|
-
application_contents = File.read(application)
|
293
|
-
|
294
|
-
assert_success spring_test_command
|
295
|
-
|
296
|
-
File.write(application, application_contents + <<-CODE)
|
297
|
-
class Foo
|
298
|
-
def self.omg
|
299
|
-
raise "omg"
|
300
|
-
end
|
301
|
-
end
|
302
|
-
CODE
|
303
|
-
File.write(@test, @test_contents.sub("get :index", "Foo.omg"))
|
304
|
-
|
305
|
-
await_reload
|
306
|
-
assert_failure spring_test_command, stdout: "RuntimeError: omg"
|
307
|
-
ensure
|
308
|
-
File.write(application, application_contents)
|
309
|
-
end
|
310
|
-
|
311
125
|
test "app gets reloaded when preloaded files change (polling watcher)" do
|
312
|
-
env["RAILS_ENV"] = "test"
|
313
|
-
assert_success "
|
126
|
+
app.env["RAILS_ENV"] = "test"
|
127
|
+
assert_success "bin/rails runner 'puts Spring.watcher.class'", stdout: "Polling"
|
314
128
|
assert_app_reloaded
|
315
129
|
end
|
316
130
|
|
317
131
|
test "app gets reloaded when preloaded files change (listen watcher)" do
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
File.write(gemfile, gemfile_contents + "\ngem 'listen', '~> 1.0'")
|
322
|
-
|
323
|
-
File.write("#{app_root}/config/spring.rb", "Spring.watch_method = :listen")
|
324
|
-
|
325
|
-
assert_success ["bundle install", timeout: nil]
|
132
|
+
File.write(app.gemfile, "#{app.gemfile.read}gem 'listen', '~> 1.0'")
|
133
|
+
File.write(app.spring_config, "Spring.watch_method = :listen")
|
134
|
+
app.bundle
|
326
135
|
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
assert_app_reloaded
|
331
|
-
ensure
|
332
|
-
File.write(gemfile, gemfile_contents)
|
333
|
-
assert_success "bundle check"
|
334
|
-
end
|
136
|
+
app.env["RAILS_ENV"] = "test"
|
137
|
+
assert_success "bin/rails runner 'puts Spring.watcher.class'", stdout: "Listen"
|
138
|
+
assert_app_reloaded
|
335
139
|
end
|
336
140
|
|
337
141
|
test "app recovers when a boot-level error is introduced" do
|
338
|
-
|
339
|
-
application = "#{app_root}/config/application.rb"
|
340
|
-
application_contents = File.read(application)
|
142
|
+
config = app.application_config.read
|
341
143
|
|
342
|
-
|
144
|
+
assert_success app.spring_test_command
|
343
145
|
|
344
|
-
|
345
|
-
|
146
|
+
File.write(app.application_config, "#{config}\nomg")
|
147
|
+
app.await_reload
|
346
148
|
|
347
|
-
|
149
|
+
assert_failure app.spring_test_command
|
348
150
|
|
349
|
-
|
350
|
-
|
351
|
-
ensure
|
352
|
-
File.write(application, application_contents)
|
353
|
-
end
|
151
|
+
File.write(app.application_config, config)
|
152
|
+
assert_success app.spring_test_command
|
354
153
|
end
|
355
154
|
|
356
155
|
test "stop command kills server" do
|
357
|
-
|
358
|
-
assert spring_env.server_running?, "The server should be running but it isn't"
|
156
|
+
app.run app.spring_test_command
|
157
|
+
assert app.spring_env.server_running?, "The server should be running but it isn't"
|
359
158
|
|
360
|
-
assert_success "
|
361
|
-
assert !spring_env.server_running?, "The server should not be running but it is"
|
159
|
+
assert_success "bin/spring stop"
|
160
|
+
assert !app.spring_env.server_running?, "The server should not be running but it is"
|
362
161
|
end
|
363
162
|
|
364
163
|
test "custom commands" do
|
365
|
-
File.write(
|
164
|
+
File.write(app.spring_config, <<-CODE)
|
366
165
|
class CustomCommand
|
367
166
|
def call
|
368
167
|
puts "omg"
|
369
168
|
end
|
169
|
+
|
170
|
+
def exec_name
|
171
|
+
"rake"
|
172
|
+
end
|
370
173
|
end
|
371
174
|
|
372
175
|
Spring.register_command "custom", CustomCommand.new
|
373
176
|
CODE
|
374
177
|
|
375
|
-
assert_success "
|
178
|
+
assert_success "bin/spring custom", stdout: "omg"
|
179
|
+
|
180
|
+
assert_success "bin/spring binstub custom"
|
181
|
+
assert_success "bin/custom", stdout: "omg"
|
182
|
+
|
183
|
+
app.env["DISABLE_SPRING"] = "1"
|
184
|
+
assert_success %{bin/custom -e 'puts "foo"'}, stdout: "foo"
|
376
185
|
end
|
377
186
|
|
378
|
-
test "
|
379
|
-
|
380
|
-
FileUtils.mv "#{app_root}/bin", "#{app_root}/bin~" if File.exist?("#{app_root}/bin")
|
187
|
+
test "binstub" do
|
188
|
+
assert_success "bin/rails server --help", stdout: "Usage: rails server" # rails command fallback
|
381
189
|
|
382
|
-
|
383
|
-
assert_success "bin/rake -T", stdout: "rake db:migrate"
|
190
|
+
assert_success "#{app.spring} binstub rake", stdout: "bin/rake: spring already present"
|
384
191
|
|
385
|
-
|
386
|
-
|
387
|
-
|
192
|
+
assert_success "#{app.spring} binstub --remove rake", stdout: "bin/rake: spring removed"
|
193
|
+
assert !app.path("bin/rake").read.include?(Spring::Client::Binstub::LOADER)
|
194
|
+
assert_success "bin/rake -T", stdout: "rake db:migrate"
|
195
|
+
end
|
388
196
|
|
389
|
-
|
197
|
+
test "binstub when spring is uninstalled" do
|
198
|
+
app.run! "gem uninstall --ignore-dependencies spring"
|
199
|
+
File.write(app.gemfile, app.gemfile.read.sub("gem 'spring-commands-testunit'\n", ""))
|
200
|
+
assert_success "bin/rake -T", stdout: "rake db:migrate"
|
201
|
+
end
|
390
202
|
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
203
|
+
test "binstub upgrade" do
|
204
|
+
File.write(app.path("bin/rake"), <<CODE)
|
205
|
+
#!/usr/bin/env ruby
|
206
|
+
|
207
|
+
if !Process.respond_to?(:fork) || Gem::Specification.find_all_by_name("spring").empty?
|
208
|
+
exec "bundle", "exec", "rake", *ARGV
|
209
|
+
else
|
210
|
+
ARGV.unshift "rake"
|
211
|
+
load Gem.bin_path("spring", "spring")
|
212
|
+
end
|
213
|
+
CODE
|
214
|
+
|
215
|
+
File.write(app.path("bin/rails"), <<CODE)
|
216
|
+
#!/usr/bin/env ruby
|
217
|
+
|
218
|
+
if !Process.respond_to?(:fork) || Gem::Specification.find_all_by_name("spring").empty?
|
219
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
220
|
+
require_relative '../config/boot'
|
221
|
+
require 'rails/commands'
|
222
|
+
else
|
223
|
+
ARGV.unshift "rails"
|
224
|
+
load Gem.bin_path("spring", "spring")
|
225
|
+
end
|
226
|
+
CODE
|
227
|
+
|
228
|
+
assert_success "bin/spring binstub --all", stdout: "upgraded"
|
229
|
+
|
230
|
+
assert_equal app.path("bin/rake").read, <<CODE
|
231
|
+
#!/usr/bin/env ruby
|
232
|
+
#{Spring::Client::Binstub::LOADER.strip}
|
233
|
+
require 'bundler/setup'
|
234
|
+
load Gem.bin_path('rake', 'rake')
|
235
|
+
CODE
|
236
|
+
|
237
|
+
assert_equal app.path("bin/rails").read, <<CODE
|
238
|
+
#!/usr/bin/env ruby
|
239
|
+
#{Spring::Client::Binstub::LOADER.strip}
|
240
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
241
|
+
require_relative '../config/boot'
|
242
|
+
require 'rails/commands'
|
243
|
+
CODE
|
400
244
|
end
|
401
245
|
|
402
246
|
test "after fork callback" do
|
403
|
-
File.write(
|
404
|
-
assert_success "
|
247
|
+
File.write(app.spring_config, "Spring.after_fork { puts '!callback!' }")
|
248
|
+
assert_success "bin/rails runner 'puts 2'", stdout: "!callback!\n2"
|
405
249
|
end
|
406
250
|
|
407
251
|
test "global config file evaluated" do
|
408
|
-
|
409
|
-
|
410
|
-
assert_success "#{spring} rails runner 'puts 2'", stdout: "!callback!\n2"
|
411
|
-
ensure
|
412
|
-
FileUtils.rm_r("#{user_home}/.spring.rb")
|
413
|
-
end
|
252
|
+
File.write("#{app.user_home}/.spring.rb", "Spring.after_fork { puts '!callback!' }")
|
253
|
+
assert_success "bin/rails runner 'puts 2'", stdout: "!callback!\n2"
|
414
254
|
end
|
415
255
|
|
416
256
|
test "missing config/application.rb" do
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
assert_failure "#{spring} rake -T", stderr: "unable to find your config/application.rb"
|
421
|
-
ensure
|
422
|
-
FileUtils.mv app_root.join("config/application.rb.bak"), app_root.join("config/application.rb")
|
423
|
-
end
|
257
|
+
app.application_config.delete
|
258
|
+
assert_failure "bin/rake -T", stderr: "unable to find your config/application.rb"
|
424
259
|
end
|
425
260
|
|
426
261
|
test "piping" do
|
427
|
-
assert_success "
|
262
|
+
assert_success "bin/rake -T | grep db", stdout: "rake db:migrate"
|
428
263
|
end
|
429
264
|
|
430
265
|
test "status" do
|
431
|
-
assert_success "
|
432
|
-
|
433
|
-
assert_success "
|
266
|
+
assert_success "bin/spring status", stdout: "Spring is not running"
|
267
|
+
assert_success "bin/rails runner ''"
|
268
|
+
assert_success "bin/spring status", stdout: "Spring is running"
|
434
269
|
end
|
435
270
|
|
436
271
|
test "runner command sets Rails environment from command-line options" do
|
437
|
-
assert_success "
|
438
|
-
assert_success "
|
272
|
+
assert_success "bin/rails runner -e production 'puts Rails.env'", stdout: "production"
|
273
|
+
assert_success "bin/rails runner --environment=production 'puts Rails.env'", stdout: "production"
|
439
274
|
end
|
440
275
|
|
441
276
|
test "forcing rails env via environment variable" do
|
442
|
-
env['RAILS_ENV'] = 'production'
|
443
|
-
assert_success "
|
277
|
+
app.env['RAILS_ENV'] = 'production'
|
278
|
+
assert_success "bin/rake -p 'Rails.env'", stdout: "production"
|
444
279
|
end
|
445
280
|
|
446
281
|
test "setting env vars with rake" do
|
447
|
-
|
448
|
-
File.write("#{app_root}/lib/tasks/env.rake", <<-'CODE')
|
282
|
+
File.write(app.path("lib/tasks/env.rake"), <<-'CODE')
|
449
283
|
task :print_rails_env => :environment do
|
450
284
|
puts Rails.env
|
451
285
|
end
|
@@ -455,57 +289,39 @@ class AppTest < ActiveSupport::TestCase
|
|
455
289
|
end
|
456
290
|
|
457
291
|
task(:default).clear.enhance [:print_rails_env]
|
458
|
-
|
292
|
+
CODE
|
459
293
|
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
ensure
|
464
|
-
FileUtils.rm_f("#{app_root}/lib/tasks/env.rake")
|
465
|
-
end
|
294
|
+
assert_success "bin/rake RAILS_ENV=test print_rails_env", stdout: "test"
|
295
|
+
assert_success "bin/rake FOO=bar print_env", stdout: "FOO=bar"
|
296
|
+
assert_success "bin/rake", stdout: "test"
|
466
297
|
end
|
467
298
|
|
468
299
|
test "changing the Gemfile restarts the server" do
|
469
|
-
|
470
|
-
gemfile = app_root.join("Gemfile")
|
471
|
-
gemfile_contents = gemfile.read
|
472
|
-
|
473
|
-
assert_success %(#{spring} rails runner 'require "sqlite3"')
|
300
|
+
assert_success %(bin/rails runner 'require "sqlite3"')
|
474
301
|
|
475
|
-
|
476
|
-
|
302
|
+
File.write(app.gemfile, app.gemfile.read.sub(%{gem 'sqlite3'}, %{# gem 'sqlite3'}))
|
303
|
+
app.bundle
|
477
304
|
|
478
|
-
|
479
|
-
|
480
|
-
ensure
|
481
|
-
File.write(gemfile, gemfile_contents)
|
482
|
-
assert_success "bundle check"
|
483
|
-
end
|
305
|
+
app.await_reload
|
306
|
+
assert_failure %(bin/rails runner 'require "sqlite3"'), stderr: "sqlite3"
|
484
307
|
end
|
485
308
|
|
486
309
|
test "changing the environment between runs" do
|
487
|
-
|
488
|
-
application = "#{app_root}/config/application.rb"
|
489
|
-
application_contents = File.read(application)
|
490
|
-
|
491
|
-
File.write(application, "#{application_contents}\nENV['BAR'] = 'bar'")
|
310
|
+
File.write(app.application_config, "#{app.application_config.read}\nENV['BAR'] = 'bar'")
|
492
311
|
|
493
|
-
|
494
|
-
|
495
|
-
|
312
|
+
app.env["OMG"] = "1"
|
313
|
+
app.env["FOO"] = "1"
|
314
|
+
app.env["RUBYOPT"] = "-rubygems"
|
496
315
|
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
316
|
+
assert_success %(bin/rails runner 'p ENV["OMG"]'), stdout: "1"
|
317
|
+
assert_success %(bin/rails runner 'p ENV["BAR"]'), stdout: "bar"
|
318
|
+
assert_success %(bin/rails runner 'p ENV.key?("BUNDLE_GEMFILE")'), stdout: "true"
|
319
|
+
assert_success %(bin/rails runner 'p ENV["RUBYOPT"]'), stdout: "bundler"
|
501
320
|
|
502
|
-
|
503
|
-
|
321
|
+
app.env["OMG"] = "2"
|
322
|
+
app.env.delete "FOO"
|
504
323
|
|
505
|
-
|
506
|
-
|
507
|
-
ensure
|
508
|
-
File.write(application, application_contents)
|
509
|
-
end
|
324
|
+
assert_success %(bin/rails runner 'p ENV["OMG"]'), stdout: "2"
|
325
|
+
assert_success %(bin/rails runner 'p ENV.key?("FOO")'), stdout: "false"
|
510
326
|
end
|
511
327
|
end
|