spring 4.1.3 → 4.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1aaab82742a464eba8cafc32761c1f8509c661d3eae8816c7ce37402b1e454ba
4
- data.tar.gz: dca019edd6550c1ce7d514da586df59a3c3838d1f36d113e9870cdf44052a655
3
+ metadata.gz: 76dbc0667df96e4ee560e9613dba5fbdf1dd1733eb93b4cfa8e9b9abe0ce4b88
4
+ data.tar.gz: 072b98f72493233f29ad64e034070ad4910807cd13d133772d29b1b1588e87ad
5
5
  SHA512:
6
- metadata.gz: 52b2c4a44be6f82f5c4877af16c52aacf98cf28641210dde453439e7e2d9ded480bc7ceb1e58465d30e8992b1bd88a8b591246bcfc66708c722fd5692c7c98a6
7
- data.tar.gz: abb5569bb5d37f570003ba7784f181afd0598249cddc3c1519e2df63368b8db3a540119c8fedccb599c095a2b3c07dee5df0e0a09c09c30f551ccdf7e7f45f7b
6
+ metadata.gz: 631a222c8b71faf7f115576537d857bd5e0d4824a9bdcc09ffcb694ef737af0af6570dfb112178efec1bbde9a1d5582bcfabfb1cd2ef8ea94b1404558580bd6d
7
+ data.tar.gz: c4d7ebbacf5c6b0a00263b96328e13160cfcea8033cb54ef4247d9aca3ee7f7c1f7d17a57865b10c24847c1653e99c61b37d2a8b130b45536aff994257944269
@@ -11,9 +11,15 @@ app = Spring::Application.new(
11
11
 
12
12
  Signal.trap("TERM") { app.terminate }
13
13
 
14
- Spring::ProcessTitleUpdater.run { |distance|
15
- "spring app | #{app.app_name} | started #{distance} ago | #{app.app_env} mode"
16
- }
14
+ Spring::ProcessTitleUpdater.run do |distance|
15
+ attributes = [
16
+ app.app_name,
17
+ "started #{distance} ago",
18
+ "#{app.app_env} mode",
19
+ app.spawn_env,
20
+ ].compact
21
+ "spring app | #{attributes.join(" | ")}"
22
+ end
17
23
 
18
24
  app.eager_preload if ENV.delete("SPRING_PRELOAD") == "1"
19
25
  app.run
@@ -28,6 +28,11 @@ module Spring
28
28
  @interrupt.last.write "."
29
29
  end
30
30
 
31
+ def spawn_env
32
+ env = JSON.load(ENV["SPRING_SPAWN_ENV"].dup).map { |key, value| "#{key}=#{value}" }
33
+ env.join(", ") if env.any?
34
+ end
35
+
31
36
  def app_env
32
37
  ENV['RAILS_ENV']
33
38
  end
@@ -1,9 +1,10 @@
1
1
  module Spring
2
2
  class ApplicationManager
3
- attr_reader :pid, :child, :app_env, :spring_env, :status
3
+ attr_reader :pid, :child, :app_env, :spawn_env, :spring_env, :status
4
4
 
5
- def initialize(app_env, spring_env)
5
+ def initialize(app_env, spawn_env, spring_env)
6
6
  @app_env = app_env
7
+ @spawn_env = spawn_env
7
8
  @spring_env = spring_env
8
9
  @mutex = Mutex.new
9
10
  @state = :running
@@ -100,7 +101,9 @@ module Spring
100
101
  "RAILS_ENV" => app_env,
101
102
  "RACK_ENV" => app_env,
102
103
  "SPRING_ORIGINAL_ENV" => JSON.dump(Spring::ORIGINAL_ENV),
103
- "SPRING_PRELOAD" => preload ? "1" : "0"
104
+ "SPRING_PRELOAD" => preload ? "1" : "0",
105
+ "SPRING_SPAWN_ENV" => JSON.dump(spawn_env),
106
+ **spawn_env,
104
107
  },
105
108
  "ruby",
106
109
  *(bundler_dir != RbConfig::CONFIG["rubylibdir"] ? ["-I", bundler_dir] : []),
@@ -73,7 +73,7 @@ module Spring
73
73
  def boot_server
74
74
  env.socket_path.unlink if env.socket_path.exist?
75
75
 
76
- pid = Process.spawn(gem_env, env.server_command, out: File::NULL)
76
+ pid = Process.spawn(server_process_env, env.server_command, out: File::NULL)
77
77
  timeout = Time.now + BOOT_TIMEOUT
78
78
 
79
79
  @server_booted = true
@@ -107,6 +107,14 @@ module Spring
107
107
  }
108
108
  end
109
109
 
110
+ def reset_env
111
+ ENV.slice(*Spring.reset_on_env)
112
+ end
113
+
114
+ def server_process_env
115
+ reset_env.merge(gem_env)
116
+ end
117
+
110
118
  def stop_server
111
119
  server.close
112
120
  @server = nil
@@ -114,7 +122,16 @@ module Spring
114
122
  end
115
123
 
116
124
  def verify_server_version
117
- server_version = server.gets.chomp
125
+ unless IO.select([server], [], [], CONNECT_TIMEOUT)
126
+ raise "Error connecting to Spring server"
127
+ end
128
+
129
+ line = server.gets
130
+ unless line
131
+ raise "Error connecting to Spring server"
132
+ end
133
+
134
+ server_version = line.chomp
118
135
  if server_version != env.version
119
136
  $stderr.puts "There is a version mismatch between the Spring client " \
120
137
  "(#{env.version}) and the server (#{server_version})."
@@ -132,7 +149,7 @@ module Spring
132
149
 
133
150
  def connect_to_application(client)
134
151
  server.send_io client
135
- send_json server, "args" => args, "default_rails_env" => default_rails_env
152
+ send_json server, "args" => args, "default_rails_env" => default_rails_env, "spawn_env" => spawn_env, "reset_env" => reset_env
136
153
 
137
154
  if IO.select([server], [], [], CONNECT_TIMEOUT)
138
155
  server.gets or raise CommandNotFound
@@ -232,6 +249,10 @@ module Spring
232
249
  def default_rails_env
233
250
  ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
234
251
  end
252
+
253
+ def spawn_env
254
+ ENV.slice(*Spring.spawn_on_env)
255
+ end
235
256
  end
236
257
  end
237
258
  end
@@ -32,6 +32,14 @@ module Spring
32
32
  after_fork_callbacks << block
33
33
  end
34
34
 
35
+ def spawn_on_env
36
+ @spawn_on_env ||= []
37
+ end
38
+
39
+ def reset_on_env
40
+ @reset_on_env ||= []
41
+ end
42
+
35
43
  def verify_environment
36
44
  application_root_path
37
45
  end
data/lib/spring/server.rb CHANGED
@@ -19,7 +19,9 @@ module Spring
19
19
  def initialize(options = {})
20
20
  @foreground = options.fetch(:foreground, false)
21
21
  @env = options[:env] || default_env
22
- @applications = Hash.new { |h, k| h[k] = ApplicationManager.new(k, env) }
22
+ @applications = Hash.new do |hash, key|
23
+ hash[key] = ApplicationManager.new(*key, env)
24
+ end
23
25
  @pidfile = env.pidfile_path.open('a')
24
26
  @mutex = Mutex.new
25
27
  end
@@ -57,12 +59,15 @@ module Spring
57
59
  app_client = client.recv_io
58
60
  command = JSON.load(client.read(client.gets.to_i))
59
61
 
60
- args, default_rails_env = command.values_at('args', 'default_rails_env')
62
+ args, default_rails_env, spawn_env, reset_env = command.values_at('args', 'default_rails_env', 'spawn_env', 'reset_env')
61
63
 
62
64
  if Spring.command?(args.first)
65
+ application = @applications[rails_env_for(args, default_rails_env, spawn_env)]
66
+ reset_if_env_changed(application, reset_env)
67
+
63
68
  log "running command #{args.first}"
64
69
  client.puts
65
- client.puts @applications[rails_env_for(args, default_rails_env)].run(app_client)
70
+ client.puts application.run(app_client)
66
71
  else
67
72
  log "command not found #{args.first}"
68
73
  client.close
@@ -73,8 +78,8 @@ module Spring
73
78
  redirect_output
74
79
  end
75
80
 
76
- def rails_env_for(args, default_rails_env)
77
- Spring.command(args.first).env(args.drop(1)) || default_rails_env
81
+ def rails_env_for(args, default_rails_env, spawn_env)
82
+ [Spring.command(args.first).env(args.drop(1)) || default_rails_env, spawn_env]
78
83
  end
79
84
 
80
85
  # Boot the server into the process group of the current session.
@@ -136,6 +141,10 @@ module Spring
136
141
 
137
142
  private
138
143
 
144
+ def reset_if_env_changed(application, reset_env)
145
+ application.stop if ENV.slice(*reset_env.keys) != reset_env
146
+ end
147
+
139
148
  def default_env
140
149
  Env.new(log_file: default_log_file)
141
150
  end
@@ -1,3 +1,3 @@
1
1
  module Spring
2
- VERSION = "4.1.3"
2
+ VERSION = "4.2.0"
3
3
  end
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spring
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.3
4
+ version: 4.2.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: 2023-11-22 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bump
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: activesupport
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
11
+ date: 2024-04-09 00:00:00.000000000 Z
12
+ dependencies: []
55
13
  description: Preloads your application so things like console, rake and tests run
56
14
  faster
57
15
  email: