pakyow-core 0.11.3 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +0 -0
  3. data/LICENSE +4 -0
  4. data/{pakyow-core/README.md → README.md} +3 -4
  5. data/commands/pakyow +13 -0
  6. data/lib/pakyow/app/connection/behavior/session.rb +33 -0
  7. data/lib/pakyow/app/connection/behavior/values.rb +42 -0
  8. data/lib/pakyow/app/connection/behavior/verifier.rb +34 -0
  9. data/lib/pakyow/app/connection/session/abstract.rb +24 -0
  10. data/lib/pakyow/app/connection/session/cookie.rb +56 -0
  11. data/lib/pakyow/app/connection.rb +57 -0
  12. data/lib/pakyow/app.rb +219 -0
  13. data/lib/pakyow/behavior/aspects.rb +45 -0
  14. data/lib/pakyow/behavior/config.rb +72 -0
  15. data/lib/pakyow/behavior/endpoints.rb +41 -0
  16. data/lib/pakyow/behavior/frameworks.rb +45 -0
  17. data/lib/pakyow/behavior/helpers.rb +107 -0
  18. data/lib/pakyow/behavior/initializers.rb +19 -0
  19. data/lib/pakyow/behavior/isolating.rb +69 -0
  20. data/lib/pakyow/behavior/operations.rb +46 -0
  21. data/lib/pakyow/behavior/pipeline.rb +58 -0
  22. data/lib/pakyow/behavior/plugins.rb +148 -0
  23. data/lib/pakyow/behavior/rescuing.rb +51 -0
  24. data/lib/pakyow/behavior/restarting.rb +68 -0
  25. data/lib/pakyow/behavior/sessions.rb +34 -0
  26. data/lib/pakyow/behavior/verification.rb +47 -0
  27. data/lib/pakyow/cli.rb +199 -0
  28. data/lib/pakyow/connection/multipart_input.rb +24 -0
  29. data/lib/pakyow/connection/multipart_parser.rb +112 -0
  30. data/lib/pakyow/connection/params.rb +29 -0
  31. data/lib/pakyow/connection/query_parser.rb +174 -0
  32. data/lib/pakyow/connection/statuses.rb +119 -0
  33. data/lib/pakyow/connection.rb +568 -0
  34. data/lib/pakyow/endpoints.rb +94 -0
  35. data/lib/pakyow/environment/actions/dispatch.rb +37 -0
  36. data/lib/pakyow/environment/actions/input_parser.rb +21 -0
  37. data/lib/pakyow/environment/actions/logger.rb +33 -0
  38. data/lib/pakyow/environment/actions/normalizer.rb +73 -0
  39. data/lib/pakyow/environment/behavior/config.rb +166 -0
  40. data/lib/pakyow/environment/behavior/initializers.rb +21 -0
  41. data/lib/pakyow/environment/behavior/input_parsing.rb +54 -0
  42. data/lib/pakyow/environment/behavior/plugins.rb +23 -0
  43. data/lib/pakyow/environment/behavior/restarting.rb +54 -0
  44. data/lib/pakyow/environment/behavior/running.rb +129 -0
  45. data/lib/pakyow/environment/behavior/silencing.rb +23 -0
  46. data/lib/pakyow/environment/behavior/timezone.rb +21 -0
  47. data/lib/pakyow/environment/behavior/watching.rb +75 -0
  48. data/lib/pakyow/environment.rb +381 -0
  49. data/lib/pakyow/error.rb +273 -0
  50. data/lib/pakyow/errors.rb +97 -0
  51. data/lib/pakyow/framework.rb +39 -0
  52. data/lib/pakyow/generator.rb +138 -0
  53. data/lib/pakyow/generators/project/default/%dot%env.erb +1 -0
  54. data/lib/pakyow/generators/project/default/%dot%gitignore +11 -0
  55. data/lib/pakyow/generators/project/default/%dot%ruby-version.erb +1 -0
  56. data/lib/pakyow/generators/project/default/Gemfile.erb +28 -0
  57. data/lib/pakyow/generators/project/default/README.md +14 -0
  58. data/lib/pakyow/generators/project/default/config/application.rb.erb +17 -0
  59. data/lib/pakyow/generators/project/default/config/environment.rb +11 -0
  60. data/lib/pakyow/generators/project/default/config/initializers/application/keep +0 -0
  61. data/lib/pakyow/generators/project/default/config/initializers/environment/keep +0 -0
  62. data/lib/pakyow/generators/project/default/database/keep +0 -0
  63. data/lib/pakyow/generators/project/default/frontend/assets/images/keep +0 -0
  64. data/lib/pakyow/generators/project/default/frontend/assets/packs/keep +0 -0
  65. data/lib/pakyow/generators/project/default/frontend/assets/styles/keep +0 -0
  66. data/lib/pakyow/generators/project/default/frontend/includes/keep +0 -0
  67. data/lib/pakyow/generators/project/default/frontend/layouts/default.html.erb +19 -0
  68. data/lib/pakyow/generators/project/default/frontend/pages/keep +0 -0
  69. data/lib/pakyow/generators/project/default/public/favicon.ico +0 -0
  70. data/lib/pakyow/generators/project/default/public/robots.txt +1 -0
  71. data/lib/pakyow/generators/project.rb +29 -0
  72. data/lib/pakyow/helpers/app.rb +28 -0
  73. data/lib/pakyow/helpers/connection.rb +45 -0
  74. data/lib/pakyow/info.rb +26 -0
  75. data/lib/pakyow/integrations/bootsnap.rb +18 -0
  76. data/lib/pakyow/integrations/bundler/require.rb +7 -0
  77. data/lib/pakyow/integrations/bundler/setup.rb +7 -0
  78. data/lib/pakyow/integrations/dotenv.rb +9 -0
  79. data/lib/pakyow/loader.rb +31 -0
  80. data/lib/pakyow/logger/colorizer.rb +38 -0
  81. data/lib/pakyow/logger/destination.rb +17 -0
  82. data/lib/pakyow/logger/formatter.rb +22 -0
  83. data/lib/pakyow/logger/formatters/human.rb +101 -0
  84. data/lib/pakyow/logger/formatters/json.rb +99 -0
  85. data/lib/pakyow/logger/formatters/logfmt.rb +50 -0
  86. data/lib/pakyow/logger/multiplexed.rb +19 -0
  87. data/lib/pakyow/logger/thread_local.rb +29 -0
  88. data/lib/pakyow/logger/timekeeper.rb +64 -0
  89. data/lib/pakyow/logger.rb +125 -0
  90. data/lib/pakyow/operation.rb +71 -0
  91. data/lib/pakyow/plugin/helper_caller.rb +20 -0
  92. data/lib/pakyow/plugin/lookup.rb +33 -0
  93. data/lib/pakyow/plugin/state.rb +68 -0
  94. data/lib/pakyow/plugin.rb +367 -0
  95. data/lib/pakyow/process_manager.rb +53 -0
  96. data/lib/pakyow/processes/proxy.rb +67 -0
  97. data/lib/pakyow/processes/server.rb +32 -0
  98. data/lib/pakyow/rack/compatibility.rb +68 -0
  99. data/lib/pakyow/task.rb +315 -0
  100. data/lib/pakyow/tasks/boot.rake +21 -0
  101. data/lib/pakyow/tasks/create.rake +32 -0
  102. data/lib/pakyow/tasks/help.rake +17 -0
  103. data/lib/pakyow/tasks/info/endpoints.rake +72 -0
  104. data/lib/pakyow/tasks/info.rake +31 -0
  105. data/lib/pakyow/tasks/irb.rake +11 -0
  106. data/lib/pakyow/tasks/prelaunch.rake +37 -0
  107. data/lib/pakyow/types.rb +32 -0
  108. data/lib/pakyow/validations/acceptance.rb +37 -0
  109. data/lib/pakyow/validations/email.rb +28 -0
  110. data/lib/pakyow/validations/inline.rb +32 -0
  111. data/lib/pakyow/validations/length.rb +44 -0
  112. data/lib/pakyow/validations/presence.rb +41 -0
  113. data/lib/pakyow/validations.rb +8 -0
  114. data/lib/pakyow/validator.rb +81 -0
  115. data/lib/pakyow/verifier.rb +177 -0
  116. data/lib/pakyow.rb +5 -0
  117. metadata +267 -65
  118. data/pakyow-core/CHANGELOG.md +0 -128
  119. data/pakyow-core/LICENSE +0 -20
  120. data/pakyow-core/lib/pakyow/core/app.rb +0 -82
  121. data/pakyow-core/lib/pakyow/core/app_context.rb +0 -10
  122. data/pakyow-core/lib/pakyow/core/base.rb +0 -61
  123. data/pakyow-core/lib/pakyow/core/call_context.rb +0 -171
  124. data/pakyow-core/lib/pakyow/core/config/app.rb +0 -49
  125. data/pakyow-core/lib/pakyow/core/config/cookies.rb +0 -4
  126. data/pakyow-core/lib/pakyow/core/config/logger.rb +0 -34
  127. data/pakyow-core/lib/pakyow/core/config/reloader.rb +0 -10
  128. data/pakyow-core/lib/pakyow/core/config/server.rb +0 -10
  129. data/pakyow-core/lib/pakyow/core/config/session.rb +0 -41
  130. data/pakyow-core/lib/pakyow/core/config.rb +0 -95
  131. data/pakyow-core/lib/pakyow/core/errors.rb +0 -16
  132. data/pakyow-core/lib/pakyow/core/helpers/configuring.rb +0 -142
  133. data/pakyow-core/lib/pakyow/core/helpers/hooks.rb +0 -106
  134. data/pakyow-core/lib/pakyow/core/helpers/running.rb +0 -124
  135. data/pakyow-core/lib/pakyow/core/helpers.rb +0 -61
  136. data/pakyow-core/lib/pakyow/core/loader.rb +0 -32
  137. data/pakyow-core/lib/pakyow/core/middleware/logger.rb +0 -146
  138. data/pakyow-core/lib/pakyow/core/middleware/override.rb +0 -3
  139. data/pakyow-core/lib/pakyow/core/middleware/reloader.rb +0 -23
  140. data/pakyow-core/lib/pakyow/core/middleware/req_path_normalizer.rb +0 -49
  141. data/pakyow-core/lib/pakyow/core/middleware/session.rb +0 -5
  142. data/pakyow-core/lib/pakyow/core/middleware/static.rb +0 -76
  143. data/pakyow-core/lib/pakyow/core/multilog.rb +0 -19
  144. data/pakyow-core/lib/pakyow/core/request.rb +0 -119
  145. data/pakyow-core/lib/pakyow/core/response.rb +0 -135
  146. data/pakyow-core/lib/pakyow/core/route_eval.rb +0 -254
  147. data/pakyow-core/lib/pakyow/core/route_expansion_eval.rb +0 -115
  148. data/pakyow-core/lib/pakyow/core/route_lookup.rb +0 -41
  149. data/pakyow-core/lib/pakyow/core/route_merger.rb +0 -76
  150. data/pakyow-core/lib/pakyow/core/route_module.rb +0 -21
  151. data/pakyow-core/lib/pakyow/core/route_set.rb +0 -74
  152. data/pakyow-core/lib/pakyow/core/route_template_defaults.rb +0 -43
  153. data/pakyow-core/lib/pakyow/core/route_template_eval.rb +0 -72
  154. data/pakyow-core/lib/pakyow/core/router.rb +0 -181
  155. data/pakyow-core/lib/pakyow/core.rb +0 -8
  156. data/pakyow-core/lib/pakyow-core.rb +0 -1
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require "pakyow/error"
6
+
7
+ module Pakyow
8
+ class InvalidData < Error
9
+ class_state :messages, default: {
10
+ verification: "Provided data didn't pass verification"
11
+ }.freeze
12
+
13
+ # Failed verifier result.
14
+ #
15
+ def result
16
+ @context[:result]
17
+ end
18
+
19
+ # Object that failed verification.
20
+ #
21
+ def object
22
+ @context[:object]
23
+ end
24
+
25
+ def contextual_message
26
+ <<~MESSAGE
27
+ Here's the data:
28
+
29
+ #{indent_as_code(JSON.pretty_generate(object))}
30
+
31
+ And here are the failures:
32
+
33
+ #{indent_as_code(JSON.pretty_generate(result.messages))}
34
+ MESSAGE
35
+ end
36
+ end
37
+
38
+ class UnknownCommand < Error
39
+ class_state :messages, default: {
40
+ default: "`{command}' is not a known command"
41
+ }.freeze
42
+ end
43
+
44
+ class UnknownFramework < Error
45
+ class_state :messages, default: {
46
+ default: "`{framework}' is not a known framework"
47
+ }.freeze
48
+ end
49
+
50
+ class UnknownHelperContext < Error
51
+ class_state :messages, default: {
52
+ default: "`{context}' is not a known helper context"
53
+ }.freeze
54
+ end
55
+
56
+ class UnknownType < Error
57
+ class_state :messages, default: {
58
+ default: "`{type}' is not a known type"
59
+ }.freeze
60
+
61
+ def contextual_message
62
+ known_types = @context[:types].each_with_object(String.new) { |known_type, known_types_message|
63
+ known_types_message << " - #{known_type.inspect}\n"
64
+ }
65
+
66
+ <<~MESSAGE
67
+ Try using one of these known types:
68
+
69
+ #{known_types}
70
+ MESSAGE
71
+ end
72
+ end
73
+
74
+ class UnknownPlugin < Error
75
+ class_state :messages, default: {
76
+ default: "`{plugin}' is not a known plugin"
77
+ }.freeze
78
+
79
+ def contextual_message
80
+ available_plugins = Pakyow.plugins.keys.each_with_object(String.new) { |plugin_name, available_plugins_message|
81
+ available_plugins_message << " - #{plugin_name.inspect}\n"
82
+ }
83
+
84
+ <<~MESSAGE
85
+ Try using one of these available plugins:
86
+
87
+ #{available_plugins}
88
+ MESSAGE
89
+ end
90
+ end
91
+
92
+ class UnknownValidationError < Error
93
+ class_state :messages, default: {
94
+ default: "`{validation}' is not a known validation"
95
+ }.freeze
96
+ end
97
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pakyow/environment"
4
+
5
+ module Pakyow
6
+ # Base framework class.
7
+ #
8
+ class Framework
9
+ class << self
10
+ # rubocop:disable Naming/MethodName
11
+ def Framework(name)
12
+ Class.new(self) do
13
+ @framework_name = name
14
+ end
15
+ end
16
+ # rubocop:enabled Naming/MethodName
17
+
18
+ def inherited(framework_class)
19
+ super
20
+
21
+ return unless instance_variable_defined?(:@framework_name)
22
+ Pakyow.register_framework(@framework_name, framework_class)
23
+ end
24
+ end
25
+
26
+ context = self
27
+ Pakyow.singleton_class.class_eval do
28
+ define_method :Framework do |name|
29
+ context.Framework(name)
30
+ end
31
+ end
32
+
33
+ attr_reader :object
34
+
35
+ def initialize(object)
36
+ @object = object
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "erb"
4
+ require "fileutils"
5
+ require "pathname"
6
+
7
+ require "pakyow/support/cli/runner"
8
+ require "pakyow/support/class_state"
9
+ require "pakyow/support/extension"
10
+ require "pakyow/support/hookable"
11
+
12
+ require "pakyow/support/pipeline"
13
+ require "pakyow/support/pipeline/object"
14
+
15
+ module Pakyow
16
+ # Base class for generators.
17
+ #
18
+ class Generator
19
+ module Common
20
+ def dot
21
+ "."
22
+ end
23
+ end
24
+
25
+ include Common
26
+
27
+ include Support::Hookable
28
+ events :generate
29
+
30
+ attr_reader :files
31
+
32
+ def initialize(source_path)
33
+ @files = Dir.glob(::File.join(source_path, "**/*")).reject { |path|
34
+ ::File.directory?(path)
35
+ }.map { |path|
36
+ File.new(path, source_path, context: self)
37
+ }
38
+ end
39
+
40
+ def generate(destination_path, options)
41
+ @destination_path = destination_path
42
+
43
+ performing :generate do
44
+ FileUtils.mkdir_p(destination_path)
45
+
46
+ @files.each do |file|
47
+ file.generate(destination_path, options)
48
+ end
49
+ end
50
+ end
51
+
52
+ def run(command, message:)
53
+ Support::CLI::Runner.new(message: message).run(
54
+ "cd #{@destination_path} && #{command}"
55
+ )
56
+ end
57
+
58
+ class File
59
+ include Common
60
+
61
+ include Support::Pipeline::Object
62
+
63
+ attr_accessor :path, :logical_path, :content, :context
64
+
65
+ def initialize(path, source_path, context: self)
66
+ @path, @context = path, context
67
+
68
+ @logical_path = Pathname.new(path).relative_path_from(
69
+ Pathname.new(source_path)
70
+ ).to_s
71
+
72
+ @content = ::File.read(@path)
73
+ end
74
+
75
+ def generate(destination_path, options)
76
+ options.each do |key, value|
77
+ @context.instance_variable_set(:"@#{key}", value)
78
+ end
79
+
80
+ # Process the file.
81
+ #
82
+ Processor.new.call(self)
83
+
84
+ # Build the generated file path.
85
+ #
86
+ destination_path_for_file = ::File.join(destination_path, @logical_path)
87
+
88
+ # Make sure the directory exists.
89
+ #
90
+ FileUtils.mkdir_p(::File.dirname(destination_path_for_file))
91
+
92
+ # Skip keep files.
93
+ #
94
+ unless ::File.basename(@logical_path) == "keep"
95
+ # Write the file.
96
+ #
97
+ ::File.open(destination_path_for_file, "w+") do |file|
98
+ file.write(@content)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ class Processor
105
+ include Support::Pipeline
106
+
107
+ action :process_erb
108
+ action :populate_path
109
+
110
+ def process_erb(file)
111
+ if ::File.extname(file.logical_path) == ".erb"
112
+ file.logical_path = ::File.join(
113
+ ::File.dirname(file.logical_path),
114
+ ::File.basename(file.logical_path, ".erb")
115
+ )
116
+
117
+ erb = if RUBY_VERSION.start_with?("2.5")
118
+ ERB.new(file.content, nil, "%<>-")
119
+ else
120
+ ERB.new(file.content, trim_mode: "%-")
121
+ end
122
+
123
+ file.content = erb.result(
124
+ file.context.instance_eval { binding }
125
+ )
126
+ end
127
+ end
128
+
129
+ PATH_VAR_REGEX = /%([^}]*)%/
130
+
131
+ def populate_path(file)
132
+ file.logical_path.scan(PATH_VAR_REGEX).each do |match|
133
+ file.logical_path.gsub!("%#{match[0]}%", file.context.send(match[0].to_sym))
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1 @@
1
+ SECRET=<%= generate_secret %>
@@ -0,0 +1,11 @@
1
+ # Ignore bundler config.
2
+ #
3
+ .bundle
4
+
5
+ # Ignore specific environment files.
6
+ #
7
+ .env.*
8
+
9
+ # Ignore local databases.
10
+ #
11
+ database/*.db*
@@ -0,0 +1 @@
1
+ <%= RUBY_VERSION %>
@@ -0,0 +1,28 @@
1
+ source "https://rubygems.org"
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ruby "<%= RUBY_VERSION %>"
5
+
6
+ <%- if generating_locally? -%>
7
+ gem "pakyow", github: "pakyow/pakyow", require: "pakyow/all"
8
+ <%- else -%>
9
+ gem "pakyow", "~> <%= Pakyow::VERSION %>", require: "pakyow/all"
10
+ <%- end -%>
11
+
12
+ # Use the puma application server.
13
+ #
14
+ gem "puma"
15
+
16
+ # Easily manage environment variables.
17
+ #
18
+ gem "dotenv"
19
+
20
+ group :development do
21
+ # Speed up project boot time.
22
+ #
23
+ gem "bootsnap", require: false
24
+
25
+ # Use SQLite3 as the default data source in development.
26
+ #
27
+ gem "sqlite3"
28
+ end
@@ -0,0 +1,14 @@
1
+ # Hello, Web
2
+
3
+ Start your project:
4
+
5
+ * From a command prompt, run `pakyow boot`
6
+
7
+ You can access your project at [`localhost:3000`](http://localhost:3000) from your web browser.
8
+
9
+ ## Learn more
10
+
11
+ * Website: https://pakyow.com
12
+ * Community: https://pakyow.com/talk
13
+ * Documentation: https://pakyow.com/docs/hello
14
+ * View Source: https://github.com/pakyow/pakyow
@@ -0,0 +1,17 @@
1
+ Pakyow.app :<%= @project_name %> do
2
+ # Learn more about configuring an application:
3
+ #
4
+ # * https://pakyow.com/docs/configuration
5
+ #
6
+ configure do
7
+ # Application config for all environments.
8
+ end
9
+
10
+ configure :development do
11
+ # Application config for the development environment.
12
+ end
13
+
14
+ configure :production do
15
+ # Application config for the production environment.
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ Pakyow.configure do
2
+ # Global environment configuration.
3
+ end
4
+
5
+ Pakyow.configure :development do
6
+ config.data.connections.sql[:default] = "sqlite://database/development.db"
7
+ end
8
+
9
+ Pakyow.configure :production do
10
+ config.data.connections.sql[:default] = ENV["DATABASE_URL"]
11
+ end
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>
5
+ <%= @human_project_name %>
6
+ </title>
7
+
8
+ <meta charset="utf-8">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
+
11
+ <link rel="shortcut icon" href="/favicon.ico">
12
+ </head>
13
+
14
+ <body>
15
+ <main>
16
+ <!-- @container -->
17
+ </main>
18
+ </body>
19
+ </html>
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler"
4
+ require "securerandom"
5
+
6
+ require "pakyow/generator"
7
+ require "pakyow/version"
8
+
9
+ module Pakyow
10
+ # @api private
11
+ module Generators
12
+ class Project < Generator
13
+ after "generate" do
14
+ Bundler.with_clean_env do
15
+ run "bundle install --binstubs", message: "Bundling dependencies"
16
+ end
17
+ end
18
+
19
+ def generating_locally?
20
+ local_pakyow = Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name).detect { |k, _| k == "pakyow" }
21
+ !local_pakyow || local_pakyow.last.last.version < Gem::Version.new(Pakyow::VERSION)
22
+ end
23
+
24
+ def generate_secret
25
+ SecureRandom.hex(64)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
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
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Pakyow
6
+ module Helpers
7
+ # Convenience methods for interacting with the connection object.
8
+ #
9
+ module Connection
10
+ extend Forwardable
11
+
12
+ attr_reader :connection
13
+
14
+ # @!method app
15
+ # Returns the current app.
16
+ #
17
+ # @see App
18
+ # @!method logger
19
+ # Returns the logger.
20
+ #
21
+ # @see Request#logger
22
+ #
23
+ # @!method params
24
+ # Returns the request params.
25
+ #
26
+ # @see Request#params
27
+ #
28
+ # @!method session
29
+ # Returns the session.
30
+ #
31
+ # @see Request#session
32
+ #
33
+ # @!method :cookies
34
+ # Returns cookies.
35
+ #
36
+ # @see Request#:cookies
37
+ def_delegators :connection, :app, :logger, :params, :session, :cookies
38
+
39
+ # @!method operations
40
+ # Returns the operations lookup.
41
+ #
42
+ def_delegators :app, :operations
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pakyow/version"
4
+
5
+ module Pakyow
6
+ # Returns information about the environment.
7
+ #
8
+ def self.info
9
+ {
10
+ versions: {
11
+ ruby: "v#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})",
12
+ pakyow: "v#{VERSION}"
13
+ },
14
+
15
+ apps: Pakyow.mounts.map { |mount|
16
+ {
17
+ mount_path: mount[:path],
18
+ class: mount[:app].to_s,
19
+ reference: mount[:app].config.name.inspect,
20
+ frameworks: mount[:app].config.loaded_frameworks,
21
+ app_root: File.expand_path(mount[:app].config.root)
22
+ }
23
+ }
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configures bootsnap.
4
+ #
5
+ begin
6
+ require "bootsnap"
7
+
8
+ Bootsnap.setup(
9
+ cache_dir: File.join(Pakyow.config.root, "tmp/cache"),
10
+ development_mode: Pakyow.env?(:development),
11
+ load_path_cache: true,
12
+ autoload_paths_cache: false,
13
+ disable_trace: false,
14
+ compile_cache_iseq: true,
15
+ compile_cache_yaml: true
16
+ )
17
+ rescue LoadError
18
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Requires the bundle.
4
+ #
5
+ if defined?(Bundler)
6
+ Bundler.require :default, Pakyow.env
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Requires bundle/setup.
4
+ #
5
+ if defined?(Bundler)
6
+ require "bundler/setup"
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Loads environment variables.
4
+ #
5
+ if defined?(Dotenv)
6
+ env_path = ".env.#{Pakyow.env}"
7
+ Dotenv.load env_path if File.exist?(env_path)
8
+ Dotenv.load
9
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pakyow/support/inflector"
4
+ require "pakyow/support/makeable"
5
+
6
+ module Pakyow
7
+ # Loads files that define an app aspect and names the objects appropriately.
8
+ #
9
+ class Loader
10
+ def initialize(path)
11
+ @path = path
12
+ end
13
+
14
+ def call(target)
15
+ code = String.new
16
+ target.__object_name.namespace.parts.each do |part|
17
+ code << "module #{Support.inflector.camelize(part)}\n"
18
+ end
19
+
20
+ code << "class #{Support.inflector.camelize(target.__object_name.name)}\n"
21
+ code << File.read(@path)
22
+ code << "end\n"
23
+
24
+ target.__object_name.namespace.parts.count.times do
25
+ code << "end\n"
26
+ end
27
+
28
+ eval(code, TOPLEVEL_BINDING, @path, 1 - target.__object_name.namespace.parts.count - 1)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pakyow/support/cli/style"
4
+
5
+ require "pakyow/logger"
6
+
7
+ module Pakyow
8
+ class Logger
9
+ # Helpers for colorizing log messages.
10
+ #
11
+ module Colorizer
12
+ # Colorizes message based on level.
13
+ #
14
+ def self.colorize(message, level)
15
+ if color = color(level)
16
+ Support::CLI.style.public_send(color, message)
17
+ else
18
+ message
19
+ end
20
+ end
21
+
22
+ LEVEL_COLORS = {
23
+ internal: :magenta,
24
+ debug: :cyan,
25
+ info: :green,
26
+ warn: :yellow,
27
+ error: :red,
28
+ fatal: :red
29
+ }.freeze
30
+
31
+ # Returns a color for a level.
32
+ #
33
+ def self.color(level)
34
+ LEVEL_COLORS[level]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pakyow
4
+ class Logger
5
+ class Destination
6
+ attr_reader :name, :io
7
+
8
+ def initialize(name, io)
9
+ @name, @io = name, io
10
+ end
11
+
12
+ def call(entry)
13
+ @io.write(entry)
14
+ end
15
+ end
16
+ end
17
+ end