pakyow-core 1.0.2 → 1.0.3
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/CHANGELOG.md +28 -1
- data/lib/pakyow/application/behavior/restarting.rb +7 -3
- data/lib/pakyow/behavior/restarting.rb +6 -4
- data/lib/pakyow/behavior/running.rb +6 -5
- data/lib/pakyow/environment.rb +37 -46
- data/lib/pakyow/process_manager.rb +14 -9
- data/lib/pakyow/validator.rb +2 -2
- data/lib/pakyow/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4c1c5f27fb6ffae904ba62198bb53ce289f6c1f31336dd822fca00b126d95c8
|
4
|
+
data.tar.gz: de38ff2a793f66cebad1a1170c02e6b3978e07b38c8d973ac661efeb049e93ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6961b873b166f4d74ce23d7b9b86cd66f958e78b8371a3359c7044fdaa5b835a398356714663858ce897726cbd427104e6663bbf12a09b163dff815fc47316ef
|
7
|
+
data.tar.gz: 645210420f9bb6a5cc63ba794893d697642842f9de561fe5e00d9b93ee1831230bdcf860024630574e728992b40f40512ae2bc619648c9012480002f5a6d45f7
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,31 @@
|
|
1
|
-
# v1.0.
|
1
|
+
# v1.0.3 (unreleased)
|
2
|
+
|
3
|
+
* `fix` **Resolve several issues with respawns, restarts.**
|
4
|
+
|
5
|
+
*Related links:*
|
6
|
+
- [Pull Request #342][pr-342]
|
7
|
+
|
8
|
+
* `fix` **Ensure a logger and output is always available in the environment.**
|
9
|
+
|
10
|
+
*Related links:*
|
11
|
+
- [Pull Request #331][pr-331]
|
12
|
+
|
13
|
+
* `fix` **Start multiple processes when the process count specifies more than one.**
|
14
|
+
|
15
|
+
*Related links:*
|
16
|
+
- [Pull Request #329][pr-329]
|
17
|
+
|
18
|
+
* `fix` **Prevent failed processes from restarting indefinitely.**
|
19
|
+
|
20
|
+
*Related links:*
|
21
|
+
- [Pull Request #328][pr-328]
|
22
|
+
|
23
|
+
[pr-342]: https://github.com/pakyow/pakyow/pull/342
|
24
|
+
[pr-331]: https://github.com/pakyow/pakyow/pull/331
|
25
|
+
[pr-329]: https://github.com/pakyow/pakyow/pull/329
|
26
|
+
[pr-328]: https://github.com/pakyow/pakyow/pull/328
|
27
|
+
|
28
|
+
# v1.0.2
|
2
29
|
|
3
30
|
* `fix` **Relocate `version.rb` from the meta gem into `pakyow/core`.**
|
4
31
|
- Makes it possible to use `pakyow/core` and other gems without needing the meta gem.
|
@@ -44,6 +44,11 @@ module Pakyow
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def touch_restart
|
48
|
+
FileUtils.mkdir_p(File.join(config.root, "tmp"))
|
49
|
+
FileUtils.touch(File.join(config.root, "tmp/restart.txt"))
|
50
|
+
end
|
51
|
+
|
47
52
|
private
|
48
53
|
|
49
54
|
def setup_for_restarting
|
@@ -53,15 +58,14 @@ module Pakyow
|
|
53
58
|
|
54
59
|
# FIXME: this doesn't need to be hardcoded, but instead determined
|
55
60
|
# from the source location when registered with the environment
|
56
|
-
config.process.watched_paths << "
|
61
|
+
config.process.watched_paths << File.join(config.root, "config/application.rb")
|
57
62
|
|
58
63
|
Thread.new do
|
59
64
|
Filewatcher.new(
|
60
65
|
config.process.watched_paths,
|
61
66
|
exclude: config.process.excluded_paths
|
62
67
|
).watch do |_path, _event|
|
63
|
-
|
64
|
-
FileUtils.touch "./tmp/restart.txt"
|
68
|
+
touch_restart
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|
@@ -13,13 +13,13 @@ module Pakyow
|
|
13
13
|
|
14
14
|
# Other processes (e.g. apps) can touch this file to restart the server.
|
15
15
|
#
|
16
|
-
watch "
|
16
|
+
watch File.join(config.root, "tmp/restart.txt") do
|
17
17
|
restart
|
18
18
|
end
|
19
19
|
|
20
20
|
# Automatically bundle.
|
21
21
|
#
|
22
|
-
watch "
|
22
|
+
watch File.join(config.root, "Gemfile") do
|
23
23
|
Bundler.with_clean_env do
|
24
24
|
Support::CLI::Runner.new(message: "Bundling").run("bundle install")
|
25
25
|
end
|
@@ -27,7 +27,7 @@ module Pakyow
|
|
27
27
|
|
28
28
|
# Respawn when the bundle changes.
|
29
29
|
#
|
30
|
-
watch "
|
30
|
+
watch File.join(config.root, "Gemfile.lock") do
|
31
31
|
respawn
|
32
32
|
end
|
33
33
|
|
@@ -44,7 +44,9 @@ module Pakyow
|
|
44
44
|
# Set the respawn flag and stop the process manager.
|
45
45
|
# Pakyow will check the flag and respawn from the main thread.
|
46
46
|
#
|
47
|
-
@respawn = true
|
47
|
+
@respawn = true
|
48
|
+
@bound_endpoint.close
|
49
|
+
@process_manager.stop
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -16,7 +16,7 @@ module Pakyow
|
|
16
16
|
extend Support::Extension
|
17
17
|
|
18
18
|
apply_extension do
|
19
|
-
unfreezable :process_manager
|
19
|
+
unfreezable :process_manager, :bound_endpoint
|
20
20
|
|
21
21
|
class_state :processes, default: []
|
22
22
|
|
@@ -42,7 +42,7 @@ module Pakyow
|
|
42
42
|
"http://#{config.server.host}:#{port}"
|
43
43
|
)
|
44
44
|
|
45
|
-
bound_endpoint = Async::Reactor.run {
|
45
|
+
@bound_endpoint = Async::Reactor.run {
|
46
46
|
Async::IO::SharedEndpoint.bound(endpoint)
|
47
47
|
}.wait
|
48
48
|
|
@@ -52,7 +52,7 @@ module Pakyow
|
|
52
52
|
Processes::Server.new(
|
53
53
|
protocol: endpoint.protocol,
|
54
54
|
scheme: endpoint.scheme,
|
55
|
-
endpoint: bound_endpoint
|
55
|
+
endpoint: @bound_endpoint
|
56
56
|
).run
|
57
57
|
end
|
58
58
|
|
@@ -69,7 +69,7 @@ module Pakyow
|
|
69
69
|
@processes << {
|
70
70
|
name: name,
|
71
71
|
block: block,
|
72
|
-
count: count,
|
72
|
+
count: count.to_i,
|
73
73
|
restartable: restartable
|
74
74
|
}
|
75
75
|
end
|
@@ -100,7 +100,7 @@ module Pakyow
|
|
100
100
|
#
|
101
101
|
exec "PW_RESPAWN=true #{$0} #{ARGV.join(" ")}"
|
102
102
|
end
|
103
|
-
rescue SignalException
|
103
|
+
rescue SignalException, Interrupt
|
104
104
|
exit
|
105
105
|
end
|
106
106
|
|
@@ -114,6 +114,7 @@ module Pakyow
|
|
114
114
|
Pakyow.logger << "Goodbye"
|
115
115
|
|
116
116
|
performing :shutdown do
|
117
|
+
@bound_endpoint.close
|
117
118
|
@process_manager.stop
|
118
119
|
end
|
119
120
|
end
|
data/lib/pakyow/environment.rb
CHANGED
@@ -33,6 +33,7 @@ require "pakyow/actions/normalizer"
|
|
33
33
|
|
34
34
|
require "pakyow/application"
|
35
35
|
|
36
|
+
require "pakyow/logger"
|
36
37
|
require "pakyow/logger/destination"
|
37
38
|
require "pakyow/logger/multiplexed"
|
38
39
|
require "pakyow/logger/thread_local"
|
@@ -135,17 +136,32 @@ module Pakyow
|
|
135
136
|
#
|
136
137
|
attr_reader :env
|
137
138
|
|
138
|
-
#
|
139
|
+
# Any error encountered during the boot process
|
139
140
|
#
|
140
|
-
attr_reader :
|
141
|
+
attr_reader :error
|
141
142
|
|
142
|
-
# Global
|
143
|
+
# Global log output.
|
144
|
+
#
|
145
|
+
# Builds and returns a default global output that's replaced in `setup`.
|
143
146
|
#
|
144
|
-
|
147
|
+
def global_logger
|
148
|
+
unless defined?(@global_logger)
|
149
|
+
require "pakyow/logger/formatters/human"
|
150
|
+
@global_logger = Logger::Formatters::Human.new(
|
151
|
+
Logger::Destination.new(:stdout, $stdout)
|
152
|
+
)
|
153
|
+
end
|
145
154
|
|
146
|
-
|
155
|
+
@global_logger
|
156
|
+
end
|
157
|
+
|
158
|
+
# Logger instance for the environment.
|
147
159
|
#
|
148
|
-
|
160
|
+
# Builds and returns a default logger that's replaced in `setup`.
|
161
|
+
#
|
162
|
+
def logger
|
163
|
+
@logger ||= Logger.new("dflt", output: global_logger, level: :all)
|
164
|
+
end
|
149
165
|
|
150
166
|
# Mounts an app at a path.
|
151
167
|
#
|
@@ -200,20 +216,24 @@ module Pakyow
|
|
200
216
|
end
|
201
217
|
|
202
218
|
performing :setup do
|
203
|
-
|
219
|
+
destinations = Logger::Multiplexed.new(
|
220
|
+
*config.logger.destinations.map { |destination, io|
|
221
|
+
io.sync = config.logger.sync
|
222
|
+
Logger::Destination.new(destination, io)
|
223
|
+
}
|
224
|
+
)
|
225
|
+
|
226
|
+
@global_logger = config.logger.formatter.new(destinations)
|
227
|
+
|
228
|
+
@logger = Logger::ThreadLocal.new(
|
229
|
+
Logger.new("pkyw", output: @global_logger, level: config.logger.level)
|
230
|
+
)
|
231
|
+
|
232
|
+
Console.logger = Logger.new("asnc", output: @global_logger, level: :warn)
|
204
233
|
end
|
205
234
|
|
206
235
|
self
|
207
236
|
rescue => error
|
208
|
-
begin
|
209
|
-
# Try again to initialize the logger, since we may have failed before that point.
|
210
|
-
#
|
211
|
-
unless Pakyow.logger
|
212
|
-
init_global_logger
|
213
|
-
end
|
214
|
-
rescue
|
215
|
-
end
|
216
|
-
|
217
237
|
@setup_error = error; self
|
218
238
|
end
|
219
239
|
|
@@ -344,23 +364,6 @@ module Pakyow
|
|
344
364
|
|
345
365
|
private
|
346
366
|
|
347
|
-
def init_global_logger
|
348
|
-
destinations = Logger::Multiplexed.new(
|
349
|
-
*config.logger.destinations.map { |destination, io|
|
350
|
-
io.sync = config.logger.sync
|
351
|
-
Logger::Destination.new(destination, io)
|
352
|
-
}
|
353
|
-
)
|
354
|
-
|
355
|
-
@global_logger = config.logger.formatter.new(destinations)
|
356
|
-
|
357
|
-
@logger = Logger::ThreadLocal.new(
|
358
|
-
Logger.new("pkyw", output: @global_logger, level: config.logger.level)
|
359
|
-
)
|
360
|
-
|
361
|
-
Console.logger = Logger.new("asnc", output: @global_logger, level: :warn)
|
362
|
-
end
|
363
|
-
|
364
367
|
def ensure_setup_succeeded
|
365
368
|
if @setup_error
|
366
369
|
handle_boot_failure(@setup_error)
|
@@ -370,23 +373,11 @@ module Pakyow
|
|
370
373
|
def handle_boot_failure(error)
|
371
374
|
@error = error
|
372
375
|
|
373
|
-
|
374
|
-
if logger.respond_to?(:houston)
|
375
|
-
logger.houston(error)
|
376
|
-
else
|
377
|
-
logger.error(error)
|
378
|
-
end
|
379
|
-
end
|
376
|
+
logger.houston(error)
|
380
377
|
|
381
378
|
if config.exit_on_boot_failure
|
382
379
|
exit(false)
|
383
380
|
end
|
384
381
|
end
|
385
|
-
|
386
|
-
require "logger"
|
387
|
-
|
388
|
-
def safe_logger
|
389
|
-
yield logger || ::Logger.new($stdout)
|
390
|
-
end
|
391
382
|
end
|
392
383
|
end
|
@@ -36,18 +36,23 @@ module Pakyow
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def run_process(process)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
Async
|
39
|
+
process[:count].times do
|
40
|
+
Fiber.new {
|
41
|
+
until @stopped
|
42
|
+
status = @group.fork(process) do
|
43
|
+
Async do
|
44
|
+
process[:block].call
|
45
|
+
rescue => error
|
46
|
+
Pakyow.logger.houston(error)
|
47
|
+
exit 1
|
48
|
+
end
|
44
49
|
rescue Interrupt
|
45
50
|
end
|
46
|
-
}
|
47
51
|
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
break unless status.success?
|
53
|
+
end
|
54
|
+
}.resume
|
55
|
+
end
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|
data/lib/pakyow/validator.rb
CHANGED
@@ -62,9 +62,9 @@ module Pakyow
|
|
62
62
|
@validations.any?
|
63
63
|
end
|
64
64
|
|
65
|
-
def validate(validation_name = nil, **options)
|
65
|
+
def validate(validation_name = nil, **options, &block)
|
66
66
|
validation_object = if block_given?
|
67
|
-
Validations::Inline.new(validation_name,
|
67
|
+
Validations::Inline.new(validation_name, block)
|
68
68
|
else
|
69
69
|
self.class.validation_object_for(validation_name)
|
70
70
|
end
|
data/lib/pakyow/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pakyow-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: commands
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pakyow-support
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.
|
19
|
+
version: 1.0.3
|
20
20
|
type: :runtime
|
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: 1.0.
|
26
|
+
version: 1.0.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: async
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|