pakyow-core 1.0.0.rc5 → 1.0.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/CHANGELOG.md +5 -0
- data/lib/pakyow/{environment/actions → actions}/dispatch.rb +0 -0
- data/lib/pakyow/{environment/actions → actions}/input_parser.rb +0 -0
- data/lib/pakyow/{environment/actions → actions}/logger.rb +0 -0
- data/lib/pakyow/{environment/actions → actions}/normalizer.rb +0 -0
- data/lib/pakyow/{app.rb → application.rb} +26 -26
- data/lib/pakyow/application/behavior/aspects.rb +51 -0
- data/lib/pakyow/application/behavior/endpoints.rb +43 -0
- data/lib/pakyow/application/behavior/frameworks.rb +47 -0
- data/lib/pakyow/application/behavior/helpers.rb +107 -0
- data/lib/pakyow/{environment → application}/behavior/initializers.rb +4 -4
- data/lib/pakyow/application/behavior/isolating.rb +71 -0
- data/lib/pakyow/application/behavior/operations.rb +49 -0
- data/lib/pakyow/application/behavior/pipeline.rb +60 -0
- data/lib/pakyow/application/behavior/plugins.rb +151 -0
- data/lib/pakyow/application/behavior/rescuing.rb +53 -0
- data/lib/pakyow/application/behavior/restarting.rb +72 -0
- data/lib/pakyow/application/behavior/sessions.rb +38 -0
- data/lib/pakyow/{behavior → application}/config.rb +1 -1
- data/lib/pakyow/{app → application}/connection.rb +4 -4
- data/lib/pakyow/{app → application}/connection/behavior/session.rb +1 -1
- data/lib/pakyow/{app → application}/connection/behavior/values.rb +1 -1
- data/lib/pakyow/{app → application}/connection/behavior/verifier.rb +1 -1
- data/lib/pakyow/{app → application}/connection/session/base.rb +1 -1
- data/lib/pakyow/{app → application}/connection/session/cookie.rb +2 -2
- data/lib/pakyow/application/helpers/app.rb +30 -0
- data/lib/pakyow/application/helpers/connection.rb +47 -0
- data/lib/pakyow/behavior/initializers.rb +3 -3
- data/lib/pakyow/behavior/input_parsing.rb +55 -0
- data/lib/pakyow/behavior/plugins.rb +3 -130
- data/lib/pakyow/behavior/restarting.rb +28 -46
- data/lib/pakyow/behavior/running.rb +127 -0
- data/lib/pakyow/behavior/silencing.rb +21 -0
- data/lib/pakyow/behavior/timezone.rb +19 -0
- data/lib/pakyow/behavior/verification.rb +1 -1
- data/lib/pakyow/behavior/verifier.rb +30 -0
- data/lib/pakyow/behavior/watching.rb +73 -0
- data/lib/pakyow/config.rb +168 -0
- data/lib/pakyow/environment.rb +31 -31
- data/lib/pakyow/helper.rb +9 -0
- data/lib/pakyow/loader.rb +7 -1
- data/lib/pakyow/plugin.rb +22 -21
- metadata +42 -42
- data/lib/pakyow/behavior/aspects.rb +0 -49
- data/lib/pakyow/behavior/endpoints.rb +0 -41
- data/lib/pakyow/behavior/frameworks.rb +0 -45
- data/lib/pakyow/behavior/helpers.rb +0 -108
- data/lib/pakyow/behavior/isolating.rb +0 -69
- data/lib/pakyow/behavior/operations.rb +0 -47
- data/lib/pakyow/behavior/pipeline.rb +0 -58
- data/lib/pakyow/behavior/rescuing.rb +0 -51
- data/lib/pakyow/behavior/sessions.rb +0 -36
- data/lib/pakyow/environment/behavior/config.rb +0 -172
- data/lib/pakyow/environment/behavior/input_parsing.rb +0 -57
- data/lib/pakyow/environment/behavior/plugins.rb +0 -23
- data/lib/pakyow/environment/behavior/restarting.rb +0 -54
- data/lib/pakyow/environment/behavior/running.rb +0 -129
- data/lib/pakyow/environment/behavior/silencing.rb +0 -23
- data/lib/pakyow/environment/behavior/timezone.rb +0 -21
- data/lib/pakyow/environment/behavior/verifier.rb +0 -32
- data/lib/pakyow/environment/behavior/watching.rb +0 -75
- data/lib/pakyow/helpers/app.rb +0 -28
- data/lib/pakyow/helpers/connection.rb +0 -45
@@ -1,57 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "json"
|
4
|
-
|
5
|
-
require "pakyow/support/extension"
|
6
|
-
require "pakyow/support/indifferentize"
|
7
|
-
|
8
|
-
require "pakyow/connection/query_parser"
|
9
|
-
require "pakyow/connection/multipart_parser"
|
10
|
-
|
11
|
-
module Pakyow
|
12
|
-
module Environment
|
13
|
-
module Behavior
|
14
|
-
module InputParsing
|
15
|
-
extend Support::Extension
|
16
|
-
using Support::Indifferentize
|
17
|
-
|
18
|
-
apply_extension do
|
19
|
-
class_state :input_parsers, default: {}
|
20
|
-
|
21
|
-
on "configure" do
|
22
|
-
Pakyow.parse_input "application/x-www-form-urlencoded" do |input, connection|
|
23
|
-
connection.params.parse(input.read)
|
24
|
-
end
|
25
|
-
|
26
|
-
Pakyow.parse_input "multipart/form-data" do |input, connection|
|
27
|
-
Connection::MultipartParser.new(
|
28
|
-
connection.params, boundary: connection.type_params[:boundary]
|
29
|
-
).parse(input)
|
30
|
-
end
|
31
|
-
|
32
|
-
Pakyow.parse_input "application/json", rewindable: true do |input, connection|
|
33
|
-
values = JSON.parse(input.read)
|
34
|
-
|
35
|
-
if values.is_a?(Hash)
|
36
|
-
values.deep_indifferentize.each do |key, value|
|
37
|
-
connection.params.add(key, value)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
values
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
class_methods do
|
47
|
-
def parse_input(type, rewindable: true, &block)
|
48
|
-
@input_parsers[type] = {
|
49
|
-
block: block,
|
50
|
-
rewindable: rewindable
|
51
|
-
}
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Environment
|
7
|
-
module Behavior
|
8
|
-
module Plugins
|
9
|
-
extend Support::Extension
|
10
|
-
|
11
|
-
apply_extension do
|
12
|
-
class_state :plugins, default: {}
|
13
|
-
end
|
14
|
-
|
15
|
-
class_methods do
|
16
|
-
def register_plugin(plugin_name, plugin_module)
|
17
|
-
@plugins[plugin_name] = plugin_module
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Environment
|
7
|
-
module Behavior
|
8
|
-
module Restarting
|
9
|
-
extend Support::Extension
|
10
|
-
|
11
|
-
apply_extension do
|
12
|
-
on "run" do
|
13
|
-
@respawn = false
|
14
|
-
|
15
|
-
# Other processes (e.g. apps) can touch this file to restart the server.
|
16
|
-
#
|
17
|
-
watch "./tmp/restart.txt" do
|
18
|
-
restart
|
19
|
-
end
|
20
|
-
|
21
|
-
# Automatically bundle.
|
22
|
-
#
|
23
|
-
watch "./Gemfile" do
|
24
|
-
Bundler.with_clean_env do
|
25
|
-
Support::CLI::Runner.new(message: "Bundling").run("bundle install")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Respawn when the bundle changes.
|
30
|
-
#
|
31
|
-
watch "./Gemfile.lock" do
|
32
|
-
respawn
|
33
|
-
end
|
34
|
-
|
35
|
-
# Respawn when something about the environment changes.
|
36
|
-
#
|
37
|
-
watch "#{Pakyow.config.environment_path}.rb" do
|
38
|
-
respawn
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class_methods do
|
44
|
-
def respawn
|
45
|
-
# Set the respawn flag and stop the process manager.
|
46
|
-
# Pakyow will check the flag and respawn from the main thread.
|
47
|
-
#
|
48
|
-
@respawn = true; @process_manager.stop
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,129 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "async/reactor"
|
4
|
-
require "async/io/shared_endpoint"
|
5
|
-
require "async/http/endpoint"
|
6
|
-
|
7
|
-
require "pakyow/support/extension"
|
8
|
-
|
9
|
-
require "pakyow/process_manager"
|
10
|
-
require "pakyow/processes/proxy"
|
11
|
-
require "pakyow/processes/server"
|
12
|
-
|
13
|
-
module Pakyow
|
14
|
-
module Environment
|
15
|
-
module Behavior
|
16
|
-
module Running
|
17
|
-
extend Support::Extension
|
18
|
-
|
19
|
-
apply_extension do
|
20
|
-
unfreezable :process_manager
|
21
|
-
|
22
|
-
class_state :processes, default: []
|
23
|
-
|
24
|
-
on "run" do
|
25
|
-
if config.server.proxy
|
26
|
-
# Find a port to run the environment on, start the proxy on the configured port.
|
27
|
-
#
|
28
|
-
port = Processes::Proxy.find_local_port
|
29
|
-
process :proxy, restartable: false do
|
30
|
-
Processes::Proxy.new(
|
31
|
-
host: config.server.host,
|
32
|
-
port: config.server.port,
|
33
|
-
proxy_port: port
|
34
|
-
).run
|
35
|
-
end
|
36
|
-
else
|
37
|
-
# Run the environment on the configured port.
|
38
|
-
#
|
39
|
-
port = config.server.port
|
40
|
-
end
|
41
|
-
|
42
|
-
endpoint = Async::HTTP::Endpoint.parse(
|
43
|
-
"http://#{config.server.host}:#{port}"
|
44
|
-
)
|
45
|
-
|
46
|
-
bound_endpoint = Async::Reactor.run {
|
47
|
-
Async::IO::SharedEndpoint.bound(endpoint)
|
48
|
-
}.wait
|
49
|
-
|
50
|
-
process :server, count: config.server.count do
|
51
|
-
Pakyow.config.server.port = port
|
52
|
-
|
53
|
-
Processes::Server.new(
|
54
|
-
protocol: endpoint.protocol,
|
55
|
-
scheme: endpoint.scheme,
|
56
|
-
endpoint: bound_endpoint
|
57
|
-
).run
|
58
|
-
end
|
59
|
-
|
60
|
-
unless config.server.proxy || ENV.key?("PW_RESPAWN")
|
61
|
-
Pakyow.logger << Processes::Server.running_text(
|
62
|
-
scheme: endpoint.scheme, host: config.server.host, port: port
|
63
|
-
)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class_methods do
|
69
|
-
def process(name, count: 1, restartable: true, &block)
|
70
|
-
@processes << {
|
71
|
-
name: name,
|
72
|
-
block: block,
|
73
|
-
count: count,
|
74
|
-
restartable: restartable
|
75
|
-
}
|
76
|
-
end
|
77
|
-
|
78
|
-
def run
|
79
|
-
performing :run do
|
80
|
-
@process_manager = @processes.each_with_object(ProcessManager.new) { |process, manager|
|
81
|
-
manager.add(process)
|
82
|
-
}
|
83
|
-
|
84
|
-
root_pid = Process.pid
|
85
|
-
|
86
|
-
at_exit do
|
87
|
-
if Process.pid == root_pid
|
88
|
-
shutdown
|
89
|
-
else
|
90
|
-
@apps.select { |app|
|
91
|
-
app.respond_to?(:shutdown)
|
92
|
-
}.each(&:shutdown)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
@process_manager.wait
|
98
|
-
|
99
|
-
if @respawn
|
100
|
-
# Replace the master process with a copy of itself.
|
101
|
-
#
|
102
|
-
exec "PW_RESPAWN=true #{$0} #{ARGV.join(" ")}"
|
103
|
-
end
|
104
|
-
rescue SignalException
|
105
|
-
exit
|
106
|
-
end
|
107
|
-
|
108
|
-
def shutdown
|
109
|
-
if $stdout.isatty
|
110
|
-
# Don't let ^C mess up our output.
|
111
|
-
#
|
112
|
-
puts
|
113
|
-
end
|
114
|
-
|
115
|
-
Pakyow.logger << "Goodbye"
|
116
|
-
|
117
|
-
performing :shutdown do
|
118
|
-
@process_manager.stop
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def restart
|
123
|
-
@process_manager.restart
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Environment
|
7
|
-
module Behavior
|
8
|
-
module Silencing
|
9
|
-
extend Support::Extension
|
10
|
-
|
11
|
-
apply_extension do
|
12
|
-
class_state :silencers, default: []
|
13
|
-
end
|
14
|
-
|
15
|
-
class_methods do
|
16
|
-
def silence(&block)
|
17
|
-
@silencers << block
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Environment
|
7
|
-
module Behavior
|
8
|
-
# Sets up the timezone for the environment.
|
9
|
-
#
|
10
|
-
module Timezone
|
11
|
-
extend Support::Extension
|
12
|
-
|
13
|
-
apply_extension do
|
14
|
-
after "configure" do
|
15
|
-
ENV["TZ"] = config.timezone.to_s
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
require "pakyow/support/message_verifier"
|
5
|
-
|
6
|
-
module Pakyow
|
7
|
-
module Environment
|
8
|
-
module Behavior
|
9
|
-
module Verifier
|
10
|
-
extend Support::Extension
|
11
|
-
|
12
|
-
class_methods do
|
13
|
-
attr_reader :verifier
|
14
|
-
end
|
15
|
-
|
16
|
-
apply_extension do
|
17
|
-
before :boot do
|
18
|
-
config.secrets.reject! { |secret|
|
19
|
-
secret.nil? || secret.empty?
|
20
|
-
}
|
21
|
-
|
22
|
-
if config.secrets.any?
|
23
|
-
@verifier = Support::MessageVerifier.new(config.secrets[0])
|
24
|
-
else
|
25
|
-
raise "Pakyow will not boot without a secret configured in `Pakyow.config.secrets`"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "filewatcher"
|
4
|
-
|
5
|
-
require "pakyow/support/extension"
|
6
|
-
|
7
|
-
module Pakyow
|
8
|
-
module Environment
|
9
|
-
module Behavior
|
10
|
-
module Watching
|
11
|
-
extend Support::Extension
|
12
|
-
|
13
|
-
apply_extension do
|
14
|
-
class_state :on_change_matchers, default: {}
|
15
|
-
class_state :watched_paths, default: []
|
16
|
-
|
17
|
-
unfreezable :filewatcher, :filewatcher_thread
|
18
|
-
|
19
|
-
after "run" do
|
20
|
-
@filewatcher = Filewatcher.new(
|
21
|
-
@watched_paths.map { |path|
|
22
|
-
File.expand_path(path)
|
23
|
-
}
|
24
|
-
)
|
25
|
-
|
26
|
-
@filewatcher_thread = Thread.new do
|
27
|
-
@filewatcher.watch(&method(:watch_callback))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
on "shutdown" do
|
32
|
-
@filewatcher.stop
|
33
|
-
@filewatcher_thread.join
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class_methods do
|
38
|
-
# Register a callback to be called when a file changes.
|
39
|
-
#
|
40
|
-
def on_change(matcher, &block)
|
41
|
-
(@on_change_matchers[matcher] ||= []) << block
|
42
|
-
end
|
43
|
-
|
44
|
-
# Register one or more path for changes.
|
45
|
-
#
|
46
|
-
def watch(*paths, &block)
|
47
|
-
@watched_paths.concat(paths).uniq!
|
48
|
-
|
49
|
-
if block
|
50
|
-
paths.each do |path|
|
51
|
-
on_change(File.expand_path(path), &block)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# @api private
|
57
|
-
def change_callbacks(path)
|
58
|
-
@on_change_matchers.each_with_object([]) { |(matcher, blocks), matched_blocks|
|
59
|
-
if matcher.match?(path)
|
60
|
-
matched_blocks.concat(blocks)
|
61
|
-
end
|
62
|
-
}
|
63
|
-
end
|
64
|
-
|
65
|
-
# @api private
|
66
|
-
def watch_callback(path, _event)
|
67
|
-
change_callbacks(path).each do |callback|
|
68
|
-
instance_exec(&callback)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/lib/pakyow/helpers/app.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "forwardable"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Helpers
|
7
|
-
# Convenience methods for interacting with the app object.
|
8
|
-
#
|
9
|
-
module App
|
10
|
-
extend Forwardable
|
11
|
-
|
12
|
-
attr_reader :app
|
13
|
-
|
14
|
-
# @!method config
|
15
|
-
# Delegates to {app}.
|
16
|
-
#
|
17
|
-
# @see App#config
|
18
|
-
def_delegators :app, :config
|
19
|
-
|
20
|
-
# @!method path
|
21
|
-
# @return builds the path to a named route (see {Paths#path})
|
22
|
-
#
|
23
|
-
# @!method path_to
|
24
|
-
# @return builds the path to a route, following a trail of names (see {Paths#path_to})
|
25
|
-
def_delegators :"app.endpoints", :path, :path_to
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|