pakyow-core 1.0.0.rc5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|