spring 1.2.0 → 4.7.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 +5 -5
- data/LICENSE.txt +3 -2
- data/README.md +148 -42
- data/bin/spring +2 -1
- data/lib/spring/application/boot.rb +11 -4
- data/lib/spring/application.rb +178 -50
- data/lib/spring/application_manager.rb +17 -9
- data/lib/spring/boot.rb +2 -0
- data/lib/spring/client/binstub.rb +44 -45
- data/lib/spring/client/help.rb +1 -1
- data/lib/spring/client/rails.rb +6 -5
- data/lib/spring/client/run.rb +187 -41
- data/lib/spring/client/server.rb +18 -0
- data/lib/spring/client/status.rb +2 -2
- data/lib/spring/client/stop.rb +7 -22
- data/lib/spring/client.rb +11 -1
- data/lib/spring/command_wrapper.rb +0 -4
- data/lib/spring/commands/rails.rb +21 -0
- data/lib/spring/commands.rb +11 -4
- data/lib/spring/configuration.rb +49 -2
- data/lib/spring/env.rb +43 -12
- data/lib/spring/errors.rb +1 -1
- data/lib/spring/failsafe_thread.rb +14 -0
- data/lib/spring/json.rb +30 -33
- data/lib/spring/process_title_updater.rb +2 -2
- data/lib/spring/server.rb +45 -13
- data/lib/spring/version.rb +1 -1
- data/lib/spring/watcher/abstract.rb +44 -13
- data/lib/spring/watcher/polling.rb +48 -11
- data/lib/spring/watcher.rb +1 -1
- metadata +14 -71
- data/.gitignore +0 -19
- data/.travis.yml +0 -11
- data/CHANGELOG.md +0 -188
- data/CONTRIBUTING.md +0 -52
- data/Gemfile +0 -4
- data/Rakefile +0 -21
- data/lib/spring/sid.rb +0 -42
- data/lib/spring/test/acceptance_test.rb +0 -333
- data/lib/spring/test/application.rb +0 -217
- data/lib/spring/test/application_generator.rb +0 -121
- data/lib/spring/test/rails_version.rb +0 -40
- data/lib/spring/test/watcher_test.rb +0 -167
- data/lib/spring/test.rb +0 -15
- data/spring.gemspec +0 -23
- data/test/acceptance_test.rb +0 -4
- data/test/apps/.gitignore +0 -3
- data/test/helper.rb +0 -7
- data/test/unit/client/help_test.rb +0 -60
- data/test/unit/client/version_test.rb +0 -14
- data/test/unit/commands_test.rb +0 -59
- data/test/unit/process_title_updater_test.rb +0 -24
- data/test/unit/watcher_test.rb +0 -9
data/lib/spring/json.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# ### WHY SPRING VENDORS A JSON LIBRARY ###
|
|
4
4
|
#
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
module Spring
|
|
14
14
|
module JSON
|
|
15
15
|
def self.load(string)
|
|
16
|
-
string.force_encoding("utf-8")
|
|
16
|
+
string = string.dup.force_encoding("utf-8") unless string.encoding == Encoding::UTF_8
|
|
17
17
|
OkJson.decode(string)
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -46,11 +46,9 @@ end
|
|
|
46
46
|
|
|
47
47
|
# See https://github.com/kr/okjson for updates.
|
|
48
48
|
|
|
49
|
-
require 'stringio'
|
|
50
|
-
|
|
51
49
|
# Some parts adapted from
|
|
52
|
-
#
|
|
53
|
-
#
|
|
50
|
+
# https://golang.org/src/pkg/json/decode.go and
|
|
51
|
+
# https://golang.org/src/pkg/utf8/utf8.go
|
|
54
52
|
module Spring
|
|
55
53
|
module OkJson
|
|
56
54
|
Upstream = '43'
|
|
@@ -366,7 +364,7 @@ private
|
|
|
366
364
|
end
|
|
367
365
|
end
|
|
368
366
|
if rubydoesenc?
|
|
369
|
-
a[w] = '' << uchar
|
|
367
|
+
a[w] = +'' << uchar
|
|
370
368
|
w += 1
|
|
371
369
|
else
|
|
372
370
|
w += ucharenc(a, w, uchar)
|
|
@@ -468,19 +466,18 @@ private
|
|
|
468
466
|
|
|
469
467
|
|
|
470
468
|
def strenc(s)
|
|
471
|
-
t =
|
|
472
|
-
t.putc(?")
|
|
469
|
+
t = '"'.b
|
|
473
470
|
r = 0
|
|
474
471
|
|
|
475
472
|
while r < s.length
|
|
476
473
|
case s[r]
|
|
477
|
-
when ?" then t
|
|
478
|
-
when ?\\ then t
|
|
479
|
-
when ?\b then t
|
|
480
|
-
when ?\f then t
|
|
481
|
-
when ?\n then t
|
|
482
|
-
when ?\r then t
|
|
483
|
-
when ?\t then t
|
|
474
|
+
when ?" then t << '\\"'
|
|
475
|
+
when ?\\ then t << '\\\\'
|
|
476
|
+
when ?\b then t << '\\b'
|
|
477
|
+
when ?\f then t << '\\f'
|
|
478
|
+
when ?\n then t << '\\n'
|
|
479
|
+
when ?\r then t << '\\r'
|
|
480
|
+
when ?\t then t << '\\t'
|
|
484
481
|
else
|
|
485
482
|
c = s[r]
|
|
486
483
|
# In ruby >= 1.9, s[r] is a codepoint, not a byte.
|
|
@@ -490,14 +487,14 @@ private
|
|
|
490
487
|
if c.ord < Spc.ord
|
|
491
488
|
c = "\\u%04x" % [c.ord]
|
|
492
489
|
end
|
|
493
|
-
t
|
|
490
|
+
t << c
|
|
494
491
|
rescue
|
|
495
|
-
t
|
|
492
|
+
t << Ustrerr
|
|
496
493
|
end
|
|
497
494
|
elsif c < Spc
|
|
498
|
-
t
|
|
495
|
+
t << "\\u%04x" % c
|
|
499
496
|
elsif Spc <= c && c <= ?~
|
|
500
|
-
t
|
|
497
|
+
t << c
|
|
501
498
|
else
|
|
502
499
|
n = ucharcopy(t, s, r) # ensure valid UTF-8 output
|
|
503
500
|
r += n - 1 # r is incremented below
|
|
@@ -505,8 +502,8 @@ private
|
|
|
505
502
|
end
|
|
506
503
|
r += 1
|
|
507
504
|
end
|
|
508
|
-
t
|
|
509
|
-
t
|
|
505
|
+
t << '"'
|
|
506
|
+
t
|
|
510
507
|
end
|
|
511
508
|
|
|
512
509
|
|
|
@@ -531,7 +528,7 @@ private
|
|
|
531
528
|
|
|
532
529
|
# 1-byte, 7-bit sequence?
|
|
533
530
|
if c0 < Utagx
|
|
534
|
-
t
|
|
531
|
+
t << c0
|
|
535
532
|
return 1
|
|
536
533
|
end
|
|
537
534
|
|
|
@@ -544,8 +541,8 @@ private
|
|
|
544
541
|
# 2-byte, 11-bit sequence?
|
|
545
542
|
if c0 < Utag3
|
|
546
543
|
raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
|
|
547
|
-
t
|
|
548
|
-
t
|
|
544
|
+
t << c0
|
|
545
|
+
t << c1
|
|
549
546
|
return 2
|
|
550
547
|
end
|
|
551
548
|
|
|
@@ -559,9 +556,9 @@ private
|
|
|
559
556
|
if c0 < Utag4
|
|
560
557
|
u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
|
|
561
558
|
raise Utf8Error if u <= Uchar2max
|
|
562
|
-
t
|
|
563
|
-
t
|
|
564
|
-
t
|
|
559
|
+
t << c0
|
|
560
|
+
t << c1
|
|
561
|
+
t << c2
|
|
565
562
|
return 3
|
|
566
563
|
end
|
|
567
564
|
|
|
@@ -574,16 +571,16 @@ private
|
|
|
574
571
|
if c0 < Utag5
|
|
575
572
|
u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
|
|
576
573
|
raise Utf8Error if u <= Uchar3max
|
|
577
|
-
t
|
|
578
|
-
t
|
|
579
|
-
t
|
|
580
|
-
t
|
|
574
|
+
t << c0
|
|
575
|
+
t << c1
|
|
576
|
+
t << c2
|
|
577
|
+
t << c3
|
|
581
578
|
return 4
|
|
582
579
|
end
|
|
583
580
|
|
|
584
581
|
raise Utf8Error
|
|
585
582
|
rescue Utf8Error
|
|
586
|
-
t
|
|
583
|
+
t << Ustrerr
|
|
587
584
|
return 1
|
|
588
585
|
end
|
|
589
586
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Spring
|
|
2
2
|
# Yes, I know this reimplements a bunch of stuff in Active Support, but
|
|
3
|
-
# I don't want the
|
|
3
|
+
# I don't want the Spring client to depend on AS, in order to keep its
|
|
4
4
|
# load time down.
|
|
5
5
|
class ProcessTitleUpdater
|
|
6
6
|
SECOND = 1
|
|
@@ -10,7 +10,7 @@ module Spring
|
|
|
10
10
|
def self.run(&block)
|
|
11
11
|
updater = new(&block)
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Spring.failsafe_thread {
|
|
14
14
|
$0 = updater.value
|
|
15
15
|
loop { $0 = updater.next }
|
|
16
16
|
}
|
data/lib/spring/server.rb
CHANGED
|
@@ -10,19 +10,26 @@ 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(
|
|
20
|
-
@
|
|
21
|
-
@
|
|
19
|
+
def initialize(options = {})
|
|
20
|
+
@foreground = options.fetch(:foreground, false)
|
|
21
|
+
@env = options[:env] || default_env
|
|
22
|
+
@applications = Hash.new do |hash, key|
|
|
23
|
+
hash[key] = ApplicationManager.new(*key, env)
|
|
24
|
+
end
|
|
22
25
|
@pidfile = env.pidfile_path.open('a')
|
|
23
26
|
@mutex = Mutex.new
|
|
24
27
|
end
|
|
25
28
|
|
|
29
|
+
def foreground?
|
|
30
|
+
@foreground
|
|
31
|
+
end
|
|
32
|
+
|
|
26
33
|
def log(message)
|
|
27
34
|
env.log "[server] #{message}"
|
|
28
35
|
end
|
|
@@ -31,8 +38,8 @@ module Spring
|
|
|
31
38
|
Spring.verify_environment
|
|
32
39
|
|
|
33
40
|
write_pidfile
|
|
34
|
-
set_pgid
|
|
35
|
-
ignore_signals
|
|
41
|
+
set_pgid unless foreground?
|
|
42
|
+
ignore_signals unless foreground?
|
|
36
43
|
set_exit_hook
|
|
37
44
|
set_process_title
|
|
38
45
|
start_server
|
|
@@ -42,6 +49,7 @@ module Spring
|
|
|
42
49
|
server = UNIXServer.open(env.socket_name)
|
|
43
50
|
log "started on #{env.socket_name}"
|
|
44
51
|
loop { serve server.accept }
|
|
52
|
+
rescue Interrupt
|
|
45
53
|
end
|
|
46
54
|
|
|
47
55
|
def serve(client)
|
|
@@ -51,31 +59,37 @@ module Spring
|
|
|
51
59
|
app_client = client.recv_io
|
|
52
60
|
command = JSON.load(client.read(client.gets.to_i))
|
|
53
61
|
|
|
54
|
-
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')
|
|
55
63
|
|
|
56
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
|
+
|
|
57
68
|
log "running command #{args.first}"
|
|
58
69
|
client.puts
|
|
59
|
-
client.puts
|
|
70
|
+
client.puts application.run(app_client)
|
|
60
71
|
else
|
|
61
72
|
log "command not found #{args.first}"
|
|
62
73
|
client.close
|
|
63
74
|
end
|
|
64
75
|
rescue SocketError => e
|
|
65
76
|
raise e unless client.eof?
|
|
77
|
+
rescue Errno::EPIPE => e
|
|
78
|
+
log "client disconnected with error #{e.message}, ignoring command"
|
|
66
79
|
ensure
|
|
67
80
|
redirect_output
|
|
68
81
|
end
|
|
69
82
|
|
|
70
|
-
def rails_env_for(args, default_rails_env)
|
|
71
|
-
Spring.command(args.first).env(args.drop(1)) || default_rails_env
|
|
83
|
+
def rails_env_for(args, default_rails_env, spawn_env)
|
|
84
|
+
[Spring.command(args.first).env(args.drop(1)) || default_rails_env, spawn_env]
|
|
72
85
|
end
|
|
73
86
|
|
|
74
87
|
# Boot the server into the process group of the current session.
|
|
75
88
|
# This will cause it to be automatically killed once the session
|
|
76
89
|
# ends (i.e. when the user closes their terminal).
|
|
77
90
|
def set_pgid
|
|
78
|
-
Process.
|
|
91
|
+
pgid = Process.getpgid(Process.getsid)
|
|
92
|
+
Process.setpgid(0, pgid)
|
|
79
93
|
end
|
|
80
94
|
|
|
81
95
|
# Ignore SIGINT and SIGQUIT otherwise the user typing ^C or ^\ on the command line
|
|
@@ -100,7 +114,7 @@ module Spring
|
|
|
100
114
|
end
|
|
101
115
|
end
|
|
102
116
|
|
|
103
|
-
@applications.values.map { |a|
|
|
117
|
+
@applications.values.map { |a| Spring.failsafe_thread { a.stop } }.map(&:join)
|
|
104
118
|
end
|
|
105
119
|
|
|
106
120
|
def write_pidfile
|
|
@@ -126,5 +140,23 @@ module Spring
|
|
|
126
140
|
"spring server | #{env.app_name} | started #{distance} ago"
|
|
127
141
|
}
|
|
128
142
|
end
|
|
143
|
+
|
|
144
|
+
private
|
|
145
|
+
|
|
146
|
+
def reset_if_env_changed(application, reset_env)
|
|
147
|
+
application.stop if ENV.slice(*reset_env.keys) != reset_env
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def default_env
|
|
151
|
+
Env.new(log_file: default_log_file)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def default_log_file
|
|
155
|
+
if foreground? && !ENV["SPRING_LOG"]
|
|
156
|
+
$stdout
|
|
157
|
+
else
|
|
158
|
+
nil
|
|
159
|
+
end
|
|
160
|
+
end
|
|
129
161
|
end
|
|
130
162
|
end
|
data/lib/spring/version.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
require "set"
|
|
2
1
|
require "pathname"
|
|
3
|
-
require "mutex_m"
|
|
4
2
|
|
|
5
3
|
module Spring
|
|
6
4
|
module Watcher
|
|
@@ -10,22 +8,36 @@ module Spring
|
|
|
10
8
|
# IO.select([watcher]) # watcher is running in background
|
|
11
9
|
# watcher.stale? # => true
|
|
12
10
|
class Abstract
|
|
13
|
-
include Mutex_m
|
|
14
|
-
|
|
15
11
|
attr_reader :files, :directories, :root, :latency
|
|
16
12
|
|
|
17
13
|
def initialize(root, latency)
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
@mutex = Mutex.new
|
|
20
15
|
@root = File.realpath(root)
|
|
21
16
|
@latency = latency
|
|
22
|
-
@files =
|
|
23
|
-
@directories =
|
|
17
|
+
@files = {}
|
|
18
|
+
@directories = {}
|
|
24
19
|
@stale = false
|
|
25
20
|
@listeners = []
|
|
21
|
+
|
|
22
|
+
@on_debug = nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def synchronize(&block)
|
|
26
|
+
# Used by some gems.
|
|
27
|
+
@mutex.synchronize(&block)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def on_debug(&block)
|
|
31
|
+
@on_debug = block
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def debug
|
|
35
|
+
@on_debug.call(yield) if @on_debug
|
|
26
36
|
end
|
|
27
37
|
|
|
28
38
|
def add(*items)
|
|
39
|
+
debug { "watcher: add: #{items.inspect}" }
|
|
40
|
+
|
|
29
41
|
items = items.flatten.map do |item|
|
|
30
42
|
item = Pathname.new(item)
|
|
31
43
|
|
|
@@ -36,19 +48,35 @@ module Spring
|
|
|
36
48
|
end
|
|
37
49
|
end
|
|
38
50
|
|
|
39
|
-
items = items.select
|
|
51
|
+
items = items.select do |item|
|
|
52
|
+
if item.symlink?
|
|
53
|
+
item.readlink.exist?.tap do |exists|
|
|
54
|
+
if !exists
|
|
55
|
+
debug { "add: ignoring dangling symlink: #{item.inspect} -> #{item.readlink.inspect}" }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
else
|
|
59
|
+
item.exist?
|
|
60
|
+
end
|
|
61
|
+
end
|
|
40
62
|
|
|
41
|
-
synchronize
|
|
63
|
+
@mutex.synchronize do
|
|
42
64
|
items.each do |item|
|
|
43
65
|
if item.directory?
|
|
44
|
-
directories
|
|
66
|
+
directories[item.realpath.to_s] = true
|
|
45
67
|
else
|
|
46
|
-
|
|
68
|
+
begin
|
|
69
|
+
files[item.realpath.to_s] = true
|
|
70
|
+
rescue Errno::ENOENT
|
|
71
|
+
# Race condition. Ignore symlinks whose target was removed
|
|
72
|
+
# since the check above, or are deeply chained.
|
|
73
|
+
debug { "add: ignoring now-dangling symlink: #{item.inspect} -> #{item.readlink.inspect}" }
|
|
74
|
+
end
|
|
47
75
|
end
|
|
48
76
|
end
|
|
49
77
|
|
|
50
78
|
subjects_changed
|
|
51
|
-
|
|
79
|
+
end
|
|
52
80
|
end
|
|
53
81
|
|
|
54
82
|
def stale?
|
|
@@ -56,16 +84,19 @@ module Spring
|
|
|
56
84
|
end
|
|
57
85
|
|
|
58
86
|
def on_stale(&block)
|
|
87
|
+
debug { "added listener: #{block.inspect}" }
|
|
59
88
|
@listeners << block
|
|
60
89
|
end
|
|
61
90
|
|
|
62
91
|
def mark_stale
|
|
63
92
|
return if stale?
|
|
64
93
|
@stale = true
|
|
94
|
+
debug { "marked stale, calling listeners: listeners=#{@listeners.inspect}" }
|
|
65
95
|
@listeners.each(&:call)
|
|
66
96
|
end
|
|
67
97
|
|
|
68
98
|
def restart
|
|
99
|
+
debug { "restarting" }
|
|
69
100
|
stop
|
|
70
101
|
start
|
|
71
102
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require "spring/watcher"
|
|
1
|
+
require "spring/watcher/abstract"
|
|
2
2
|
|
|
3
3
|
module Spring
|
|
4
4
|
module Watcher
|
|
@@ -12,7 +12,13 @@ module Spring
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def check_stale
|
|
15
|
-
synchronize
|
|
15
|
+
@mutex.synchronize do
|
|
16
|
+
computed = compute_mtime
|
|
17
|
+
if mtime < computed
|
|
18
|
+
debug { "check_stale: mtime=#{mtime.inspect} < computed=#{computed.inspect}" }
|
|
19
|
+
mark_stale
|
|
20
|
+
end
|
|
21
|
+
end
|
|
16
22
|
end
|
|
17
23
|
|
|
18
24
|
def add(*)
|
|
@@ -21,40 +27,71 @@ module Spring
|
|
|
21
27
|
end
|
|
22
28
|
|
|
23
29
|
def start
|
|
30
|
+
debug { "start: poller=#{@poller.inspect}" }
|
|
24
31
|
unless @poller
|
|
25
32
|
@poller = Thread.new {
|
|
26
33
|
Thread.current.abort_on_exception = true
|
|
27
34
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
begin
|
|
36
|
+
until stale?
|
|
37
|
+
Kernel.sleep latency
|
|
38
|
+
check_stale
|
|
39
|
+
end
|
|
40
|
+
rescue Exception => e
|
|
41
|
+
debug do
|
|
42
|
+
"poller: aborted: #{e.class}: #{e}\n #{e.backtrace.join("\n ")}"
|
|
43
|
+
end
|
|
44
|
+
raise
|
|
45
|
+
ensure
|
|
46
|
+
@poller = nil
|
|
31
47
|
end
|
|
32
48
|
}
|
|
33
49
|
end
|
|
34
50
|
end
|
|
35
51
|
|
|
36
52
|
def stop
|
|
53
|
+
debug { "stopping poller: #{@poller.inspect}" }
|
|
37
54
|
if @poller
|
|
38
55
|
@poller.kill
|
|
39
56
|
@poller = nil
|
|
40
57
|
end
|
|
41
58
|
end
|
|
42
59
|
|
|
60
|
+
def running?
|
|
61
|
+
@poller && @poller.alive?
|
|
62
|
+
end
|
|
63
|
+
|
|
43
64
|
def subjects_changed
|
|
44
|
-
|
|
65
|
+
computed = compute_mtime
|
|
66
|
+
debug { "subjects_changed: mtime #{@mtime} -> #{computed}" }
|
|
67
|
+
@mtime = computed
|
|
45
68
|
end
|
|
46
69
|
|
|
47
70
|
private
|
|
48
71
|
|
|
49
72
|
def compute_mtime
|
|
50
|
-
expanded_files.map
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
73
|
+
expanded_files.map do |f|
|
|
74
|
+
# Get the mtime of symlink targets. Ignore dangling symlinks.
|
|
75
|
+
if File.symlink?(f)
|
|
76
|
+
begin
|
|
77
|
+
File.mtime(f)
|
|
78
|
+
rescue Errno::ENOENT
|
|
79
|
+
0
|
|
80
|
+
end
|
|
81
|
+
# If a file no longer exists, treat it as changed.
|
|
82
|
+
else
|
|
83
|
+
begin
|
|
84
|
+
File.mtime(f)
|
|
85
|
+
rescue Errno::ENOENT
|
|
86
|
+
debug { "compute_mtime: no longer exists: #{f}" }
|
|
87
|
+
Float::MAX
|
|
88
|
+
end
|
|
89
|
+
end.to_f
|
|
90
|
+
end.max || 0
|
|
54
91
|
end
|
|
55
92
|
|
|
56
93
|
def expanded_files
|
|
57
|
-
files + Dir["{#{directories.map { |d| "#{d}/**/*" }.join(",")}}"]
|
|
94
|
+
(files.keys + Dir["{#{directories.keys.map { |d| "#{d}/**/*" }.join(",")}}"]).uniq
|
|
58
95
|
end
|
|
59
96
|
end
|
|
60
97
|
end
|
data/lib/spring/watcher.rb
CHANGED
metadata
CHANGED
|
@@ -1,44 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spring
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 4.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jon Leighton
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
13
|
-
|
|
14
|
-
|
|
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: rake
|
|
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
|
-
description: Rails application preloader
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies: []
|
|
12
|
+
description: Preloads your application so things like console, rake and tests run
|
|
13
|
+
faster
|
|
42
14
|
email:
|
|
43
15
|
- j@jonathanleighton.com
|
|
44
16
|
executables:
|
|
@@ -46,14 +18,8 @@ executables:
|
|
|
46
18
|
extensions: []
|
|
47
19
|
extra_rdoc_files: []
|
|
48
20
|
files:
|
|
49
|
-
- ".gitignore"
|
|
50
|
-
- ".travis.yml"
|
|
51
|
-
- CHANGELOG.md
|
|
52
|
-
- CONTRIBUTING.md
|
|
53
|
-
- Gemfile
|
|
54
21
|
- LICENSE.txt
|
|
55
22
|
- README.md
|
|
56
|
-
- Rakefile
|
|
57
23
|
- bin/spring
|
|
58
24
|
- lib/spring/application.rb
|
|
59
25
|
- lib/spring/application/boot.rb
|
|
@@ -66,6 +32,7 @@ files:
|
|
|
66
32
|
- lib/spring/client/help.rb
|
|
67
33
|
- lib/spring/client/rails.rb
|
|
68
34
|
- lib/spring/client/run.rb
|
|
35
|
+
- lib/spring/client/server.rb
|
|
69
36
|
- lib/spring/client/status.rb
|
|
70
37
|
- lib/spring/client/stop.rb
|
|
71
38
|
- lib/spring/client/version.rb
|
|
@@ -76,34 +43,20 @@ files:
|
|
|
76
43
|
- lib/spring/configuration.rb
|
|
77
44
|
- lib/spring/env.rb
|
|
78
45
|
- lib/spring/errors.rb
|
|
46
|
+
- lib/spring/failsafe_thread.rb
|
|
79
47
|
- lib/spring/json.rb
|
|
80
48
|
- lib/spring/process_title_updater.rb
|
|
81
49
|
- lib/spring/server.rb
|
|
82
|
-
- lib/spring/sid.rb
|
|
83
|
-
- lib/spring/test.rb
|
|
84
|
-
- lib/spring/test/acceptance_test.rb
|
|
85
|
-
- lib/spring/test/application.rb
|
|
86
|
-
- lib/spring/test/application_generator.rb
|
|
87
|
-
- lib/spring/test/rails_version.rb
|
|
88
|
-
- lib/spring/test/watcher_test.rb
|
|
89
50
|
- lib/spring/version.rb
|
|
90
51
|
- lib/spring/watcher.rb
|
|
91
52
|
- lib/spring/watcher/abstract.rb
|
|
92
53
|
- lib/spring/watcher/polling.rb
|
|
93
|
-
|
|
94
|
-
- test/acceptance_test.rb
|
|
95
|
-
- test/apps/.gitignore
|
|
96
|
-
- test/helper.rb
|
|
97
|
-
- test/unit/client/help_test.rb
|
|
98
|
-
- test/unit/client/version_test.rb
|
|
99
|
-
- test/unit/commands_test.rb
|
|
100
|
-
- test/unit/process_title_updater_test.rb
|
|
101
|
-
- test/unit/watcher_test.rb
|
|
102
|
-
homepage: http://github.com/rails/spring
|
|
54
|
+
homepage: https://github.com/rails/spring
|
|
103
55
|
licenses:
|
|
104
56
|
- MIT
|
|
105
|
-
metadata:
|
|
106
|
-
|
|
57
|
+
metadata:
|
|
58
|
+
rubygems_mfa_required: 'true'
|
|
59
|
+
changelog_uri: https://github.com/rails/spring/blob/main/CHANGELOG.md
|
|
107
60
|
rdoc_options: []
|
|
108
61
|
require_paths:
|
|
109
62
|
- lib
|
|
@@ -111,24 +64,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
111
64
|
requirements:
|
|
112
65
|
- - ">="
|
|
113
66
|
- !ruby/object:Gem::Version
|
|
114
|
-
version:
|
|
67
|
+
version: 3.1.0
|
|
115
68
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
69
|
requirements:
|
|
117
70
|
- - ">="
|
|
118
71
|
- !ruby/object:Gem::Version
|
|
119
72
|
version: '0'
|
|
120
73
|
requirements: []
|
|
121
|
-
|
|
122
|
-
rubygems_version: 2.2.2
|
|
123
|
-
signing_key:
|
|
74
|
+
rubygems_version: 3.6.7
|
|
124
75
|
specification_version: 4
|
|
125
76
|
summary: Rails application preloader
|
|
126
|
-
test_files:
|
|
127
|
-
- test/acceptance_test.rb
|
|
128
|
-
- test/apps/.gitignore
|
|
129
|
-
- test/helper.rb
|
|
130
|
-
- test/unit/client/help_test.rb
|
|
131
|
-
- test/unit/client/version_test.rb
|
|
132
|
-
- test/unit/commands_test.rb
|
|
133
|
-
- test/unit/process_title_updater_test.rb
|
|
134
|
-
- test/unit/watcher_test.rb
|
|
77
|
+
test_files: []
|
data/.gitignore
DELETED