spring 1.6.4 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7188079e7e8285351c6d8a0604cc9198a2052bfd
4
- data.tar.gz: 2a0d6caceb3960e1ecd88ed86ec7f786b94aa388
3
+ metadata.gz: d14dc08475fd37c9118d173aea5ec37900657430
4
+ data.tar.gz: d6fbda6c06dfe77c7bdaa27f6a5cc45019ca5266
5
5
  SHA512:
6
- metadata.gz: 294d493fe0500ef7e1265fabc0586ecc77be34f95b56504e9c972468eb3378ec8fad63c4793bfcad330274e269aad000463b8d161a3054bede5bbf3514f3a881
7
- data.tar.gz: fe2b858e97d0553e7bcb0b3b1a960587e29a090d584878a7b5cde6622bda0d9bb3920f2610dfb1a767db755ae4f5bf661de212b4405e68e63efb766a8b0ba70e
6
+ metadata.gz: bb7c61300a47f81d7ca46c5bf6bb50f679c665bb076b7d05fcacf923d8dc06a8b03b85313ea3f1f465e83fedb4f9ff38641270f9185439156261b03232a58201
7
+ data.tar.gz: e5bf9351f6bd9af0150cd0cdba8a04b556445a5cf485e69d89d2b6c3007cd91800a9f19c45732cae1e315805153cbab18911f6191d3c7508efc74c516170ad55
data/README.md CHANGED
@@ -290,6 +290,13 @@ false
290
290
  So to avoid this problem, don't save off references to application
291
291
  constants in your initialization code.
292
292
 
293
+ ## Using Spring with a containerized development environment
294
+
295
+ As of Spring 1.7, there is some support for doing this. See [this
296
+ example
297
+ repository](https://github.com/jonleighton/spring-docker-example) for
298
+ information about how to do it with [Docker](https://www.docker.com/).
299
+
293
300
  ## Configuration
294
301
 
295
302
  Spring will read `~/.spring.rb` and `config/spring.rb` for custom
@@ -365,13 +372,42 @@ a command runs:
365
372
  Spring.quiet = true
366
373
  ```
367
374
 
375
+ ### Environment variables
376
+
377
+ The following environment variables are used by Spring:
378
+
379
+ * `DISABLE_SPRING` - If set, Spring will be bypassed and your
380
+ application will boot in a foreground process
381
+ * `SPRING_LOG` - The path to a file which Spring will write log messages
382
+ to.
383
+ * `SPRING_TMP_PATH` - The directory where Spring should write its temporary
384
+ files (a pidfile and a socket). By default we use the
385
+ `XDG_RUNTIME_DIR` environment variable, or else `Dir.tmpdir`, and then
386
+ create a directory in that named `spring-$UID`. We don't use your
387
+ Rails application's `tmp/` directory because that may be on a
388
+ filesystem which doesn't support UNIX sockets.
389
+ * `SPRING_APPLICATION_ID` - Used to identify distinct Rails
390
+ applications. By default it is an MD5 hash of the current
391
+ `RUBY_VERSION`, and the path to your Rails project root.
392
+ * `SPRING_SOCKET` - The path which should be used for the UNIX socket
393
+ which Spring uses to communicate with the long-running Spring server
394
+ process. By default this is `SPRING_TMP_PATH/SPRING_APPLICATION_ID`.
395
+ * `SPRING_PIDFILE` - The path which should be used to store the pid of
396
+ the long-running Spring server process. By default this is related to
397
+ the socket path; if the socket path is `/foo/bar/spring.sock` the
398
+ pidfile will be `/foo/bar/spring.pid`.
399
+ * `SPRING_SERVER_COMMAND` - The command to run to start up the spring
400
+ server when it is not already running. Defaults to `spring _[version]_
401
+ server --background`.
402
+
368
403
  ## Troubleshooting
369
404
 
370
405
  If you want to get more information about what spring is doing, you can
371
- specify a log file with the `SPRING_LOG` environment variable:
406
+ run spring explicitly in a separate terminal:
372
407
 
373
408
  ```
374
- spring stop # if spring is already running
375
- export SPRING_LOG=/tmp/spring.log
376
- spring rake -T
409
+ $ spring server
377
410
  ```
411
+
412
+ Logging output will be printed to stdout. You can also send log output
413
+ to a file with the `SPRING_LOG` environment variable.
@@ -6,10 +6,10 @@ module Spring
6
6
  class Application
7
7
  attr_reader :manager, :watcher, :spring_env, :original_env
8
8
 
9
- def initialize(manager, original_env)
9
+ def initialize(manager, original_env, spring_env = Env.new)
10
10
  @manager = manager
11
11
  @original_env = original_env
12
- @spring_env = Env.new
12
+ @spring_env = spring_env
13
13
  @mutex = Mutex.new
14
14
  @waiting = Set.new
15
15
  @preloaded = false
@@ -149,11 +149,17 @@ module Spring
149
149
  setup command
150
150
 
151
151
  if Rails.application.reloaders.any?(&:updated?)
152
- ActionDispatch::Reloader.cleanup!
153
- ActionDispatch::Reloader.prepare!
152
+ # Rails 5.1 forward-compat. AD::R is deprecated to AS::R in Rails 5.
153
+ if defined? ActiveSupport::Reloader
154
+ Rails.application.reloader.reload!
155
+ else
156
+ ActionDispatch::Reloader.cleanup!
157
+ ActionDispatch::Reloader.prepare!
158
+ end
154
159
  end
155
160
 
156
161
  pid = fork {
162
+ Process.setsid
157
163
  IGNORE_SIGNALS.each { |sig| trap(sig, "DEFAULT") }
158
164
  trap("TERM", "DEFAULT")
159
165
 
@@ -313,6 +319,17 @@ module Spring
313
319
  exit_if_finished
314
320
  end
315
321
  }
322
+
323
+ Thread.new {
324
+ while signal = client.gets.chomp
325
+ begin
326
+ Process.kill(signal, -Process.getpgid(pid))
327
+ client.puts(0)
328
+ rescue Errno::ESRCH
329
+ client.puts(1)
330
+ end
331
+ end
332
+ }
316
333
  end
317
334
 
318
335
  private
@@ -5,7 +5,8 @@ require "spring/application"
5
5
 
6
6
  app = Spring::Application.new(
7
7
  UNIXSocket.for_fd(3),
8
- Spring::JSON.load(ENV.delete("SPRING_ORIGINAL_ENV").dup)
8
+ Spring::JSON.load(ENV.delete("SPRING_ORIGINAL_ENV").dup),
9
+ Spring::Env.new(log_file: IO.for_fd(4))
9
10
  )
10
11
 
11
12
  Signal.trap("TERM") { app.terminate }
@@ -2,9 +2,9 @@ module Spring
2
2
  class ApplicationManager
3
3
  attr_reader :pid, :child, :app_env, :spring_env, :status
4
4
 
5
- def initialize(app_env)
5
+ def initialize(app_env, spring_env)
6
6
  @app_env = app_env
7
- @spring_env = Env.new
7
+ @spring_env = spring_env
8
8
  @mutex = Mutex.new
9
9
  @state = :running
10
10
  end
@@ -104,7 +104,8 @@ module Spring
104
104
  "-I", File.expand_path("../..", $LOADED_FEATURES.grep(/bundler\/setup\.rb$/).first),
105
105
  "-I", File.expand_path("../..", __FILE__),
106
106
  "-e", "require 'spring/application/boot'",
107
- 3 => child_socket
107
+ 3 => child_socket,
108
+ 4 => spring_env.log_file,
108
109
  )
109
110
  end
110
111
 
@@ -9,6 +9,7 @@ require "spring/client/stop"
9
9
  require "spring/client/status"
10
10
  require "spring/client/rails"
11
11
  require "spring/client/version"
12
+ require "spring/client/server"
12
13
 
13
14
  module Spring
14
15
  module Client
@@ -22,6 +23,7 @@ module Spring
22
23
  "rails" => Client::Rails,
23
24
  "-v" => Client::Version,
24
25
  "--version" => Client::Version,
26
+ "server" => Client::Server,
25
27
  }
26
28
 
27
29
  def self.run(args)
@@ -6,31 +6,36 @@ module Spring
6
6
  module Client
7
7
  class Run < Command
8
8
  FORWARDED_SIGNALS = %w(INT QUIT USR1 USR2 INFO WINCH) & Signal.list.keys
9
- TIMEOUT = 1
9
+ CONNECT_TIMEOUT = 1
10
+ BOOT_TIMEOUT = 10
11
+
12
+ attr_reader :server
10
13
 
11
14
  def initialize(args)
12
15
  super
13
- @signal_queue = []
16
+
17
+ @signal_queue = []
18
+ @server_booted = false
14
19
  end
15
20
 
16
21
  def log(message)
17
22
  env.log "[client] #{message}"
18
23
  end
19
24
 
20
- def server
21
- @server ||= UNIXSocket.open(env.socket_name)
25
+ def connect
26
+ @server = UNIXSocket.open(env.socket_name)
22
27
  end
23
28
 
24
29
  def call
25
- if env.server_running?
26
- warm_run
27
- else
30
+ begin
31
+ connect
32
+ rescue Errno::ENOENT, Errno::ECONNRESET, Errno::ECONNREFUSED
28
33
  cold_run
34
+ else
35
+ warm_run
29
36
  end
30
- rescue Errno::ECONNRESET
31
- exit 1
32
37
  ensure
33
- server.close if @server
38
+ server.close if server
34
39
  end
35
40
 
36
41
  def warm_run
@@ -49,6 +54,7 @@ module Spring
49
54
 
50
55
  def cold_run
51
56
  boot_server
57
+ connect
52
58
  run
53
59
  end
54
60
 
@@ -60,24 +66,37 @@ module Spring
60
66
  queue_signals
61
67
  connect_to_application(client)
62
68
  run_command(client, application)
69
+ rescue Errno::ECONNRESET
70
+ exit 1
63
71
  end
64
72
 
65
73
  def boot_server
66
74
  env.socket_path.unlink if env.socket_path.exist?
67
75
 
68
- pid = Process.spawn(
69
- gem_env,
70
- "ruby",
71
- "-e", "gem 'spring', '#{Spring::VERSION}'; require 'spring/server'; Spring::Server.boot"
72
- )
76
+ pid = Process.spawn(gem_env, env.server_command, out: File::NULL)
77
+ timeout = Time.now + BOOT_TIMEOUT
78
+
79
+ @server_booted = true
73
80
 
74
81
  until env.socket_path.exist?
75
82
  _, status = Process.waitpid2(pid, Process::WNOHANG)
76
- exit status.exitstatus if status
83
+
84
+ if status
85
+ exit status.exitstatus
86
+ elsif Time.now > timeout
87
+ $stderr.puts "Starting Spring server with `#{env.server_command}` " \
88
+ "timed out after #{BOOT_TIMEOUT} seconds"
89
+ exit 1
90
+ end
91
+
77
92
  sleep 0.1
78
93
  end
79
94
  end
80
95
 
96
+ def server_booted?
97
+ @server_booted
98
+ end
99
+
81
100
  def gem_env
82
101
  bundle = Bundler.bundle_path.to_s
83
102
  paths = Gem.path + ENV["GEM_PATH"].to_s.split(File::PATH_SEPARATOR)
@@ -97,13 +116,17 @@ module Spring
97
116
  def verify_server_version
98
117
  server_version = server.gets.chomp
99
118
  if server_version != env.version
100
- $stderr.puts <<-ERROR
101
- There is a version mismatch between the spring client and the server.
102
- You should restart the server and make sure to use the same version.
103
-
104
- CLIENT: #{env.version}, SERVER: #{server_version}
105
- ERROR
106
- exit 1
119
+ $stderr.puts "There is a version mismatch between the spring client " \
120
+ "(#{env.version}) and the server (#{server_version})."
121
+
122
+ if server_booted?
123
+ $stderr.puts "We already tried to reboot the server, but the mismatch is still present."
124
+ exit 1
125
+ else
126
+ $stderr.puts "Restarting to resolve."
127
+ stop_server
128
+ cold_run
129
+ end
107
130
  end
108
131
  end
109
132
 
@@ -111,7 +134,7 @@ ERROR
111
134
  server.send_io client
112
135
  send_json server, "args" => args, "default_rails_env" => default_rails_env
113
136
 
114
- if IO.select([server], [], [], TIMEOUT)
137
+ if IO.select([server], [], [], CONNECT_TIMEOUT)
115
138
  server.gets or raise CommandNotFound
116
139
  else
117
140
  raise "Error connecting to Spring server"
@@ -138,7 +161,7 @@ ERROR
138
161
  if pid && !pid.empty?
139
162
  log "got pid: #{pid}"
140
163
 
141
- forward_signals(pid.to_i)
164
+ forward_signals(application)
142
165
  status = application.read.to_i
143
166
 
144
167
  log "got exit status #{status}"
@@ -158,26 +181,26 @@ ERROR
158
181
  end
159
182
  end
160
183
 
161
- def forward_signals(pid)
162
- @signal_queue.each { |sig| kill sig, pid }
184
+ def forward_signals(application)
185
+ @signal_queue.each { |sig| kill sig, application }
163
186
 
164
187
  FORWARDED_SIGNALS.each do |sig|
165
- trap(sig) { forward_signal sig, pid }
188
+ trap(sig) { forward_signal sig, application }
166
189
  end
167
- rescue Errno::ESRCH
168
190
  end
169
191
 
170
- def forward_signal(sig, pid)
171
- kill(sig, pid)
172
- rescue Errno::ESRCH
173
- # If the application process is gone, then don't block the
174
- # signal on this process.
175
- trap(sig, 'DEFAULT')
176
- Process.kill(sig, Process.pid)
192
+ def forward_signal(sig, application)
193
+ if kill(sig, application) != 0
194
+ # If the application process is gone, then don't block the
195
+ # signal on this process.
196
+ trap(sig, 'DEFAULT')
197
+ Process.kill(sig, Process.pid)
198
+ end
177
199
  end
178
200
 
179
- def kill(sig, pid)
180
- Process.kill(sig, -Process.getpgid(pid))
201
+ def kill(sig, application)
202
+ application.puts(sig)
203
+ application.gets.to_i
181
204
  end
182
205
 
183
206
  def send_json(socket, data)
@@ -0,0 +1,18 @@
1
+ module Spring
2
+ module Client
3
+ class Server < Command
4
+ def self.description
5
+ "Explicitly start a Spring server in the foreground"
6
+ end
7
+
8
+ def call
9
+ require "spring/server"
10
+ Spring::Server.boot(foreground: foreground?)
11
+ end
12
+
13
+ def foreground?
14
+ !args.include?("--background")
15
+ end
16
+ end
17
+ end
18
+ end
@@ -14,10 +14,10 @@ module Spring
14
14
  class Env
15
15
  attr_reader :log_file
16
16
 
17
- def initialize(root = nil)
18
- @root = root
19
- @project_root = root
20
- @log_file = File.open(ENV["SPRING_LOG"] || File::NULL, "a")
17
+ def initialize(options = {})
18
+ @root = options[:root]
19
+ @project_root = options[:root]
20
+ @log_file = options[:log_file] || File.open(ENV["SPRING_LOG"] || File::NULL, "a")
21
21
  end
22
22
 
23
23
  def root
@@ -33,17 +33,20 @@ module Spring
33
33
  end
34
34
 
35
35
  def tmp_path
36
- path = Pathname.new(File.join(ENV['XDG_RUNTIME_DIR'] || Dir.tmpdir, "spring-#{Process.uid}"))
36
+ path = Pathname.new(
37
+ ENV["SPRING_TMP_PATH"] ||
38
+ File.join(ENV['XDG_RUNTIME_DIR'] || Dir.tmpdir, "spring-#{Process.uid}")
39
+ )
37
40
  FileUtils.mkdir_p(path) unless path.exist?
38
41
  path
39
42
  end
40
43
 
41
44
  def application_id
42
- Digest::MD5.hexdigest(RUBY_VERSION + project_root.to_s)
45
+ ENV["SPRING_APPLICATION_ID"] || Digest::MD5.hexdigest(RUBY_VERSION + project_root.to_s)
43
46
  end
44
47
 
45
48
  def socket_path
46
- tmp_path.join(application_id)
49
+ Pathname.new(ENV["SPRING_SOCKET"] || tmp_path.join(application_id))
47
50
  end
48
51
 
49
52
  def socket_name
@@ -51,7 +54,7 @@ module Spring
51
54
  end
52
55
 
53
56
  def pidfile_path
54
- tmp_path.join("#{application_id}.pid")
57
+ Pathname.new(ENV["SPRING_PIDFILE"] || socket_path.dirname.join("#{socket_path.basename(".*")}.pid"))
55
58
  end
56
59
 
57
60
  def pid
@@ -105,5 +108,9 @@ module Spring
105
108
  rescue Errno::ESRCH
106
109
  # already dead
107
110
  end
111
+
112
+ def server_command
113
+ ENV["SPRING_SERVER_COMMAND"] || "#{File.expand_path("../../../bin/spring", __FILE__)} server --background"
114
+ end
108
115
  end
109
116
  end
@@ -10,19 +10,24 @@ require "spring/commands"
10
10
 
11
11
  module Spring
12
12
  class Server
13
- def self.boot
14
- new.boot
13
+ def self.boot(options = {})
14
+ new(options).boot
15
15
  end
16
16
 
17
17
  attr_reader :env
18
18
 
19
- def initialize(env = Env.new)
20
- @env = env
21
- @applications = Hash.new { |h, k| h[k] = ApplicationManager.new(k) }
19
+ def initialize(options = {})
20
+ @foreground = options.fetch(:foreground, false)
21
+ @env = options[:env] || default_env
22
+ @applications = Hash.new { |h, k| h[k] = ApplicationManager.new(k, env) }
22
23
  @pidfile = env.pidfile_path.open('a')
23
24
  @mutex = Mutex.new
24
25
  end
25
26
 
27
+ def foreground?
28
+ @foreground
29
+ end
30
+
26
31
  def log(message)
27
32
  env.log "[server] #{message}"
28
33
  end
@@ -31,8 +36,8 @@ module Spring
31
36
  Spring.verify_environment
32
37
 
33
38
  write_pidfile
34
- set_pgid
35
- ignore_signals
39
+ set_pgid unless foreground?
40
+ ignore_signals unless foreground?
36
41
  set_exit_hook
37
42
  set_process_title
38
43
  start_server
@@ -42,6 +47,7 @@ module Spring
42
47
  server = UNIXServer.open(env.socket_name)
43
48
  log "started on #{env.socket_name}"
44
49
  loop { serve server.accept }
50
+ rescue Interrupt
45
51
  end
46
52
 
47
53
  def serve(client)
@@ -126,5 +132,19 @@ module Spring
126
132
  "spring server | #{env.app_name} | started #{distance} ago"
127
133
  }
128
134
  end
135
+
136
+ private
137
+
138
+ def default_env
139
+ Env.new(log_file: default_log_file)
140
+ end
141
+
142
+ def default_log_file
143
+ if foreground? && !ENV["SPRING_LOG"]
144
+ $stdout
145
+ else
146
+ nil
147
+ end
148
+ end
129
149
  end
130
150
  end
@@ -28,6 +28,10 @@ module Spring
28
28
  @app ||= Spring::Test::Application.new("#{Spring::Test.root}/apps/tmp")
29
29
  end
30
30
 
31
+ def spring_env
32
+ app.spring_env
33
+ end
34
+
31
35
  def assert_output(artifacts, expected)
32
36
  expected.each do |stream, output|
33
37
  assert artifacts[stream].include?(output),
@@ -92,14 +96,14 @@ module Spring
92
96
 
93
97
  test "help message when called without arguments" do
94
98
  assert_success "bin/spring", stdout: 'Usage: spring COMMAND [ARGS]'
95
- assert app.spring_env.server_running?
99
+ assert spring_env.server_running?
96
100
  end
97
101
 
98
102
  test "shows help" do
99
103
  assert_success "bin/spring help", stdout: 'Usage: spring COMMAND [ARGS]'
100
104
  assert_success "bin/spring -h", stdout: 'Usage: spring COMMAND [ARGS]'
101
105
  assert_success "bin/spring --help", stdout: 'Usage: spring COMMAND [ARGS]'
102
- refute app.spring_env.server_running?
106
+ refute spring_env.server_running?
103
107
  end
104
108
 
105
109
  test "tells the user that spring is being used when used automatically via binstubs" do
@@ -184,10 +188,10 @@ module Spring
184
188
 
185
189
  test "stop command kills server" do
186
190
  app.run app.spring_test_command
187
- assert app.spring_env.server_running?, "The server should be running but it isn't"
191
+ assert spring_env.server_running?, "The server should be running but it isn't"
188
192
 
189
193
  assert_success "bin/spring stop"
190
- assert !app.spring_env.server_running?, "The server should not be running but it is"
194
+ assert !spring_env.server_running?, "The server should not be running but it is"
191
195
  end
192
196
 
193
197
  test "custom commands" do
@@ -400,7 +404,7 @@ module Spring
400
404
  end
401
405
 
402
406
  test "can define client tasks" do
403
- File.write("#{app.spring_config.sub('.rb', '_client.rb')}", <<-RUBY)
407
+ File.write("#{app.spring_client_config}", <<-RUBY)
404
408
  Spring::Client::COMMANDS["foo"] = lambda { |args| puts "bar -- \#{args.inspect}" }
405
409
  RUBY
406
410
  assert_success "bin/spring foo --baz", stdout: "bar -- [\"foo\", \"--baz\"]\n"
@@ -508,6 +512,28 @@ module Spring
508
512
  2.times { assert_success "bundle exec rails runner ''" }
509
513
  end
510
514
  end
515
+
516
+ test "booting a foreground server" do
517
+ FileUtils.cd(app.root) do
518
+ assert !spring_env.server_running?
519
+ app.run "spring server &"
520
+
521
+ Timeout.timeout(1) do
522
+ sleep 0.1 until spring_env.server_running?
523
+ end
524
+
525
+ assert_success app.spring_test_command
526
+ end
527
+ end
528
+
529
+ test "server boot timeout" do
530
+ app.env["SPRING_SERVER_COMMAND"] = "sleep 1"
531
+ File.write("#{app.spring_client_config}", %(
532
+ Spring::Client::Run.const_set(:BOOT_TIMEOUT, 0.1)
533
+ ))
534
+
535
+ assert_failure "bin/rails runner ''", stderr: "timed out"
536
+ end
511
537
  end
512
538
  end
513
539
  end
@@ -9,7 +9,7 @@ module Spring
9
9
 
10
10
  def initialize(root)
11
11
  @root = Pathname.new(root)
12
- @spring_env = Spring::Env.new(root)
12
+ @spring_env = Spring::Env.new(root: root)
13
13
  end
14
14
 
15
15
  def exists?
@@ -88,6 +88,10 @@ module Spring
88
88
  path "config/spring.rb"
89
89
  end
90
90
 
91
+ def spring_client_config
92
+ path "config/spring_client.rb"
93
+ end
94
+
91
95
  def run(command, opts = {})
92
96
  start_time = Time.now
93
97
 
@@ -117,7 +121,7 @@ module Spring
117
121
 
118
122
  output.merge(status: status, command: command)
119
123
  rescue Timeout::Error => e
120
- raise e, "Output:\n\n#{dump_streams(command, read_streams)}"
124
+ raise Timeout::Error, "While running command:\n\n#{dump_streams(command, read_streams)}"
121
125
  end
122
126
 
123
127
  def with_timing
@@ -58,6 +58,10 @@ module Spring
58
58
  append_to_file(application.gemfile, "gem 'spring-commands-testunit'")
59
59
  end
60
60
 
61
+ if RUBY_VERSION == "1.9.3"
62
+ append_to_file(application.gemfile, "gem 'mime-types', '~> 2'")
63
+ end
64
+
61
65
  rewrite_file(application.gemfile) do |c|
62
66
  c.sub!("https://rubygems.org", "http://rubygems.org")
63
67
  c.gsub!(/(gem '(byebug|web-console|sdoc|jbuilder)')/, "# \\1")
@@ -1,3 +1,3 @@
1
1
  module Spring
2
- VERSION = "1.6.4"
2
+ VERSION = "1.7.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spring
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.4
4
+ version: 1.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Leighton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-26 00:00:00.000000000 Z
11
+ date: 2016-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -75,6 +75,7 @@ files:
75
75
  - lib/spring/client/help.rb
76
76
  - lib/spring/client/rails.rb
77
77
  - lib/spring/client/run.rb
78
+ - lib/spring/client/server.rb
78
79
  - lib/spring/client/status.rb
79
80
  - lib/spring/client/stop.rb
80
81
  - lib/spring/client/version.rb