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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/lib/pakyow/{environment/actions → actions}/dispatch.rb +0 -0
  4. data/lib/pakyow/{environment/actions → actions}/input_parser.rb +0 -0
  5. data/lib/pakyow/{environment/actions → actions}/logger.rb +0 -0
  6. data/lib/pakyow/{environment/actions → actions}/normalizer.rb +0 -0
  7. data/lib/pakyow/{app.rb → application.rb} +26 -26
  8. data/lib/pakyow/application/behavior/aspects.rb +51 -0
  9. data/lib/pakyow/application/behavior/endpoints.rb +43 -0
  10. data/lib/pakyow/application/behavior/frameworks.rb +47 -0
  11. data/lib/pakyow/application/behavior/helpers.rb +107 -0
  12. data/lib/pakyow/{environment → application}/behavior/initializers.rb +4 -4
  13. data/lib/pakyow/application/behavior/isolating.rb +71 -0
  14. data/lib/pakyow/application/behavior/operations.rb +49 -0
  15. data/lib/pakyow/application/behavior/pipeline.rb +60 -0
  16. data/lib/pakyow/application/behavior/plugins.rb +151 -0
  17. data/lib/pakyow/application/behavior/rescuing.rb +53 -0
  18. data/lib/pakyow/application/behavior/restarting.rb +72 -0
  19. data/lib/pakyow/application/behavior/sessions.rb +38 -0
  20. data/lib/pakyow/{behavior → application}/config.rb +1 -1
  21. data/lib/pakyow/{app → application}/connection.rb +4 -4
  22. data/lib/pakyow/{app → application}/connection/behavior/session.rb +1 -1
  23. data/lib/pakyow/{app → application}/connection/behavior/values.rb +1 -1
  24. data/lib/pakyow/{app → application}/connection/behavior/verifier.rb +1 -1
  25. data/lib/pakyow/{app → application}/connection/session/base.rb +1 -1
  26. data/lib/pakyow/{app → application}/connection/session/cookie.rb +2 -2
  27. data/lib/pakyow/application/helpers/app.rb +30 -0
  28. data/lib/pakyow/application/helpers/connection.rb +47 -0
  29. data/lib/pakyow/behavior/initializers.rb +3 -3
  30. data/lib/pakyow/behavior/input_parsing.rb +55 -0
  31. data/lib/pakyow/behavior/plugins.rb +3 -130
  32. data/lib/pakyow/behavior/restarting.rb +28 -46
  33. data/lib/pakyow/behavior/running.rb +127 -0
  34. data/lib/pakyow/behavior/silencing.rb +21 -0
  35. data/lib/pakyow/behavior/timezone.rb +19 -0
  36. data/lib/pakyow/behavior/verification.rb +1 -1
  37. data/lib/pakyow/behavior/verifier.rb +30 -0
  38. data/lib/pakyow/behavior/watching.rb +73 -0
  39. data/lib/pakyow/config.rb +168 -0
  40. data/lib/pakyow/environment.rb +31 -31
  41. data/lib/pakyow/helper.rb +9 -0
  42. data/lib/pakyow/loader.rb +7 -1
  43. data/lib/pakyow/plugin.rb +22 -21
  44. metadata +42 -42
  45. data/lib/pakyow/behavior/aspects.rb +0 -49
  46. data/lib/pakyow/behavior/endpoints.rb +0 -41
  47. data/lib/pakyow/behavior/frameworks.rb +0 -45
  48. data/lib/pakyow/behavior/helpers.rb +0 -108
  49. data/lib/pakyow/behavior/isolating.rb +0 -69
  50. data/lib/pakyow/behavior/operations.rb +0 -47
  51. data/lib/pakyow/behavior/pipeline.rb +0 -58
  52. data/lib/pakyow/behavior/rescuing.rb +0 -51
  53. data/lib/pakyow/behavior/sessions.rb +0 -36
  54. data/lib/pakyow/environment/behavior/config.rb +0 -172
  55. data/lib/pakyow/environment/behavior/input_parsing.rb +0 -57
  56. data/lib/pakyow/environment/behavior/plugins.rb +0 -23
  57. data/lib/pakyow/environment/behavior/restarting.rb +0 -54
  58. data/lib/pakyow/environment/behavior/running.rb +0 -129
  59. data/lib/pakyow/environment/behavior/silencing.rb +0 -23
  60. data/lib/pakyow/environment/behavior/timezone.rb +0 -21
  61. data/lib/pakyow/environment/behavior/verifier.rb +0 -32
  62. data/lib/pakyow/environment/behavior/watching.rb +0 -75
  63. data/lib/pakyow/helpers/app.rb +0 -28
  64. 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
@@ -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