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.
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