spring 1.2.0 → 1.3.0
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 -2
- data/CHANGELOG.md +17 -0
- data/README.md +3 -4
- data/lib/spring/application.rb +2 -1
- data/lib/spring/client/binstub.rb +1 -1
- data/lib/spring/client/run.rb +42 -9
- data/lib/spring/client/status.rb +2 -2
- data/lib/spring/client/stop.rb +6 -21
- data/lib/spring/command_wrapper.rb +0 -4
- data/lib/spring/env.rb +25 -0
- data/lib/spring/test.rb +3 -0
- data/lib/spring/test/acceptance_test.rb +14 -1
- data/lib/spring/test/application_generator.rb +1 -1
- data/lib/spring/version.rb +1 -1
- data/spring.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf0643d72425f9cc14e93423dd4f131aa42b143a
|
4
|
+
data.tar.gz: 224eb7729ea0b874659a2951fea96fbdc3bb4c8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f31525f82a8f8daa814e08ab0fb0ca65047fe25652037421899e7e4da566f7bbefb8b95bd4920fe40827d275b000e5f9dce5f1ea031c64bd807ebbe1912503e8
|
7
|
+
data.tar.gz: 07594958b366487e7b5f88d96edb3efa1b5f1378de5b68b37ef711d149084116cfd421562061e985c7d12a90d22a72caa8f96480362ca95eba40ed6916a3fa42
|
data/.travis.yml
CHANGED
@@ -2,10 +2,11 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
4
|
- 2.0.0
|
5
|
-
- 2.1.
|
5
|
+
- 2.1.5
|
6
|
+
- 2.2.0
|
6
7
|
env:
|
7
|
-
- RAILS_VERSION="~> 3.2.0"
|
8
8
|
- RAILS_VERSION="~> 4.0.0"
|
9
9
|
- RAILS_VERSION="~> 4.1.0"
|
10
|
+
- RAILS_VERSION="~> 4.2.0"
|
10
11
|
before_script:
|
11
12
|
- travis_retry gem install rails --version "$RAILS_VERSION"
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 1.3.0
|
2
|
+
|
3
|
+
* Automatically restart spring after new commands are added. This means
|
4
|
+
that you can add spring-commands-rspec to your Gemfile and then
|
5
|
+
immediately start using it, without having to run `spring stop`.
|
6
|
+
(Spring will effectively run `spring stop` for you.)
|
7
|
+
* Make app reloading work in apps which spew out lots of output on
|
8
|
+
startup (previously a buffer would fill up and cause the process to
|
9
|
+
hang). Issue #332.
|
10
|
+
* Make sure running `bin/spring` does not add an empty string to `Gem.path`.
|
11
|
+
Issues #297, #310.
|
12
|
+
* Fixed problem with `$0` including the command line args, which could
|
13
|
+
confuse commands which try to parse `$0`. This caused the
|
14
|
+
spring-commands-rspec to not work properly in some cases. Issue #369.
|
15
|
+
* Add OpenBSD compatibility for `spring status`. Issue #299.
|
16
|
+
* Rails 3.2 no longer officially supported (but it may continue to work)
|
17
|
+
|
1
18
|
## 1.2.0
|
2
19
|
|
3
20
|
* Accept -e and --environment options for `rails console`.
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Spring
|
2
2
|
|
3
|
-
[](https://travis-ci.org/rails/spring)
|
4
|
+
[](http://badge.fury.io/rb/spring)
|
5
5
|
|
6
6
|
Spring is a Rails application preloader. It speeds up development by
|
7
7
|
keeping your application running in the background so you don't need to
|
@@ -218,8 +218,7 @@ speed-up).
|
|
218
218
|
|
219
219
|
### Additional commands
|
220
220
|
|
221
|
-
You can add these to your Gemfile for additional commands
|
222
|
-
to pick up the changes):
|
221
|
+
You can add these to your Gemfile for additional commands:
|
223
222
|
|
224
223
|
* [spring-commands-rspec](https://github.com/jonleighton/spring-commands-rspec)
|
225
224
|
* [spring-commands-cucumber](https://github.com/jonleighton/spring-commands-cucumber)
|
data/lib/spring/application.rb
CHANGED
@@ -158,7 +158,7 @@ module Spring
|
|
158
158
|
trap("TERM", "DEFAULT")
|
159
159
|
|
160
160
|
ARGV.replace(args)
|
161
|
-
$0 = command.
|
161
|
+
$0 = command.exec_name
|
162
162
|
|
163
163
|
# Delete all env vars which are unchanged from before spring started
|
164
164
|
original_env.each { |k, v| ENV.delete k if ENV[k] == v }
|
@@ -283,6 +283,7 @@ module Spring
|
|
283
283
|
def with_pty
|
284
284
|
PTY.open do |master, slave|
|
285
285
|
[STDOUT, STDERR, STDIN].each { |s| s.reopen slave }
|
286
|
+
Thread.new { master.read }
|
286
287
|
yield
|
287
288
|
reset_streams
|
288
289
|
end
|
@@ -38,7 +38,7 @@ unless defined?(Spring)
|
|
38
38
|
|
39
39
|
if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)
|
40
40
|
ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
|
41
|
-
ENV["GEM_HOME"] =
|
41
|
+
ENV["GEM_HOME"] = nil
|
42
42
|
Gem.paths = ENV
|
43
43
|
|
44
44
|
gem "spring", match[1]
|
data/lib/spring/client/run.rb
CHANGED
@@ -21,7 +21,37 @@ module Spring
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def call
|
24
|
-
|
24
|
+
if env.server_running?
|
25
|
+
warm_run
|
26
|
+
else
|
27
|
+
cold_run
|
28
|
+
end
|
29
|
+
rescue Errno::ECONNRESET
|
30
|
+
exit 1
|
31
|
+
ensure
|
32
|
+
server.close if @server
|
33
|
+
end
|
34
|
+
|
35
|
+
def warm_run
|
36
|
+
run
|
37
|
+
rescue CommandNotFound
|
38
|
+
require "spring/commands"
|
39
|
+
|
40
|
+
if Spring.command?(args.first)
|
41
|
+
# Command installed since spring started
|
42
|
+
stop_server
|
43
|
+
cold_run
|
44
|
+
else
|
45
|
+
raise
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def cold_run
|
50
|
+
boot_server
|
51
|
+
run
|
52
|
+
end
|
53
|
+
|
54
|
+
def run
|
25
55
|
verify_server_version
|
26
56
|
|
27
57
|
application, client = UNIXSocket.pair
|
@@ -29,19 +59,16 @@ module Spring
|
|
29
59
|
queue_signals
|
30
60
|
connect_to_application(client)
|
31
61
|
run_command(client, application)
|
32
|
-
rescue Errno::ECONNRESET
|
33
|
-
exit 1
|
34
|
-
ensure
|
35
|
-
server.close if @server
|
36
62
|
end
|
37
63
|
|
38
64
|
def boot_server
|
39
65
|
env.socket_path.unlink if env.socket_path.exist?
|
40
66
|
|
41
|
-
pid =
|
42
|
-
|
43
|
-
|
44
|
-
|
67
|
+
pid = Process.spawn(
|
68
|
+
"ruby",
|
69
|
+
"-r", "spring/server",
|
70
|
+
"-e", "Spring::Server.boot"
|
71
|
+
)
|
45
72
|
|
46
73
|
until env.socket_path.exist?
|
47
74
|
_, status = Process.waitpid2(pid, Process::WNOHANG)
|
@@ -50,6 +77,12 @@ module Spring
|
|
50
77
|
end
|
51
78
|
end
|
52
79
|
|
80
|
+
def stop_server
|
81
|
+
server.close
|
82
|
+
@server = nil
|
83
|
+
env.stop
|
84
|
+
end
|
85
|
+
|
53
86
|
def verify_server_version
|
54
87
|
server_version = server.gets.chomp
|
55
88
|
if server_version != env.version
|
data/lib/spring/client/status.rb
CHANGED
@@ -17,11 +17,11 @@ module Spring
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def print_process(pid)
|
20
|
-
puts `ps -p #{pid} -o pid= -o
|
20
|
+
puts `ps -p #{pid} -o pid= -o command=`
|
21
21
|
end
|
22
22
|
|
23
23
|
def application_pids
|
24
|
-
candidates = `ps -
|
24
|
+
candidates = `ps -ax -o ppid= -o pid=`.lines
|
25
25
|
candidates.select { |l| l =~ /^(\s+)?#{env.pid} / }
|
26
26
|
.map { |l| l.split(" ").last }
|
27
27
|
end
|
data/lib/spring/client/stop.rb
CHANGED
@@ -3,35 +3,20 @@ require "spring/version"
|
|
3
3
|
module Spring
|
4
4
|
module Client
|
5
5
|
class Stop < Command
|
6
|
-
TIMEOUT = 2 # seconds
|
7
|
-
|
8
6
|
def self.description
|
9
7
|
"Stop all spring processes for this project."
|
10
8
|
end
|
11
9
|
|
12
10
|
def call
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
$stderr.puts "Spring did not stop; killing forcibly."
|
20
|
-
kill 'KILL'
|
21
|
-
else
|
22
|
-
puts "Spring stopped."
|
23
|
-
end
|
24
|
-
else
|
11
|
+
case env.stop
|
12
|
+
when :stopped
|
13
|
+
puts "Spring stopped."
|
14
|
+
when :killed
|
15
|
+
$stderr.puts "Spring did not stop; killing forcibly."
|
16
|
+
when :not_running
|
25
17
|
puts "Spring is not running"
|
26
18
|
end
|
27
19
|
end
|
28
|
-
|
29
|
-
def kill(sig)
|
30
|
-
pid = env.pid
|
31
|
-
Process.kill(sig, pid) if pid
|
32
|
-
rescue Errno::ESRCH
|
33
|
-
# already dead
|
34
|
-
end
|
35
20
|
end
|
36
21
|
end
|
37
22
|
end
|
data/lib/spring/env.rb
CHANGED
@@ -9,6 +9,7 @@ require "spring/configuration"
|
|
9
9
|
|
10
10
|
module Spring
|
11
11
|
IGNORE_SIGNALS = %w(INT QUIT)
|
12
|
+
STOP_TIMEOUT = 2 # seconds
|
12
13
|
|
13
14
|
class Env
|
14
15
|
attr_reader :log_file
|
@@ -80,5 +81,29 @@ module Spring
|
|
80
81
|
log_file.puts "[#{Time.now}] [#{Process.pid}] #{message}"
|
81
82
|
log_file.flush
|
82
83
|
end
|
84
|
+
|
85
|
+
def stop
|
86
|
+
if server_running?
|
87
|
+
timeout = Time.now + STOP_TIMEOUT
|
88
|
+
kill 'TERM'
|
89
|
+
sleep 0.1 until !server_running? || Time.now >= timeout
|
90
|
+
|
91
|
+
if server_running?
|
92
|
+
kill 'KILL'
|
93
|
+
:killed
|
94
|
+
else
|
95
|
+
:stopped
|
96
|
+
end
|
97
|
+
else
|
98
|
+
:not_running
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def kill(sig)
|
103
|
+
pid = self.pid
|
104
|
+
Process.kill(sig, pid) if pid
|
105
|
+
rescue Errno::ESRCH
|
106
|
+
# already dead
|
107
|
+
end
|
83
108
|
end
|
84
109
|
end
|
data/lib/spring/test.rb
CHANGED
@@ -13,7 +13,7 @@ module Spring
|
|
13
13
|
DEFAULT_SPEEDUP = 0.8
|
14
14
|
|
15
15
|
def rails_version
|
16
|
-
ENV['RAILS_VERSION'] || '~> 4.
|
16
|
+
ENV['RAILS_VERSION'] || '~> 4.2.0'
|
17
17
|
end
|
18
18
|
|
19
19
|
# Extension point for spring-watchers-listen
|
@@ -124,6 +124,16 @@ module Spring
|
|
124
124
|
assert_failure app.spring_test_command, stdout: "RuntimeError: omg"
|
125
125
|
end
|
126
126
|
|
127
|
+
test "app gets reloaded even with a ton of boot output" do
|
128
|
+
limit = UNIXSocket.pair.first.getsockopt(:SOCKET, :SNDBUF).int
|
129
|
+
|
130
|
+
assert_success app.spring_test_command
|
131
|
+
File.write(app.path("config/initializers/verbose.rb"), "#{limit}.times { puts 'x' }")
|
132
|
+
|
133
|
+
app.await_reload
|
134
|
+
assert_success app.spring_test_command
|
135
|
+
end
|
136
|
+
|
127
137
|
test "app recovers when a boot-level error is introduced" do
|
128
138
|
config = app.application_config.read
|
129
139
|
|
@@ -147,6 +157,9 @@ module Spring
|
|
147
157
|
end
|
148
158
|
|
149
159
|
test "custom commands" do
|
160
|
+
# Start spring before setting up the command, to test that it gracefully upgrades itself
|
161
|
+
assert_success "bin/rails runner ''"
|
162
|
+
|
150
163
|
File.write(app.spring_config, <<-CODE)
|
151
164
|
class CustomCommand
|
152
165
|
def call
|
@@ -37,7 +37,7 @@ module Spring
|
|
37
37
|
|
38
38
|
# Sporadic SSL errors keep causing test failures so there are anti-SSL workarounds here
|
39
39
|
def generate_files
|
40
|
-
system("gem list rails --installed --version '#{version_constraint}' || " \
|
40
|
+
system("gem list '^rails$' --installed --version '#{version_constraint}' || " \
|
41
41
|
"gem install rails --clear-sources --source http://rubygems.org --version '#{version_constraint}'")
|
42
42
|
|
43
43
|
@version = RailsVersion.new(`ruby -e 'puts Gem::Specification.find_by_name("rails", "#{version_constraint}").version'`.chomp)
|
data/lib/spring/version.rb
CHANGED
data/spring.gemspec
CHANGED
@@ -18,6 +18,6 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_development_dependency 'activesupport'
|
21
|
+
gem.add_development_dependency 'activesupport', '~> 4.2.0'
|
22
22
|
gem.add_development_dependency 'rake'
|
23
23
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spring
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Leighton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.2.0
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 4.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
121
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.4.5
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: Rails application preloader
|