hanami 2.0.0.beta4 → 2.0.0.rc1
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 +19 -0
- data/hanami.gemspec +8 -7
- data/lib/hanami/app.rb +47 -36
- data/lib/hanami/assets/app_config.rb +7 -15
- data/lib/hanami/assets/config.rb +5 -6
- data/lib/hanami/config/actions/content_security_policy.rb +1 -1
- data/lib/hanami/config/actions/cookies.rb +27 -0
- data/lib/hanami/config/actions/sessions.rb +42 -5
- data/lib/hanami/config/actions.rb +81 -17
- data/lib/hanami/config/logger.rb +112 -23
- data/lib/hanami/config/router.rb +0 -1
- data/lib/hanami/config/views.rb +6 -10
- data/lib/hanami/config.rb +235 -73
- data/lib/hanami/constants.rb +4 -0
- data/lib/hanami/errors.rb +17 -0
- data/lib/hanami/extensions/action/slice_configured_action.rb +9 -5
- data/lib/hanami/extensions/action.rb +59 -7
- data/lib/hanami/extensions/view/context.rb +3 -4
- data/lib/hanami/extensions/view/slice_configured_view.rb +4 -4
- data/lib/hanami/extensions/view.rb +7 -5
- data/lib/hanami/providers/inflector.rb +6 -0
- data/lib/hanami/providers/logger.rb +8 -0
- data/lib/hanami/providers/rack.rb +12 -0
- data/lib/hanami/providers/routes.rb +14 -4
- data/lib/hanami/routes.rb +36 -1
- data/lib/hanami/settings/env_store.rb +1 -1
- data/lib/hanami/settings.rb +102 -36
- data/lib/hanami/slice/router.rb +38 -16
- data/lib/hanami/slice/routing/middleware/stack.rb +66 -42
- data/lib/hanami/slice/routing/resolver.rb +10 -17
- data/lib/hanami/slice/view_name_inferrer.rb +1 -1
- data/lib/hanami/slice.rb +553 -14
- data/lib/hanami/slice_registrar.rb +20 -15
- data/lib/hanami/version.rb +2 -3
- data/lib/hanami/web/rack_logger.rb +14 -4
- data/lib/hanami.rb +122 -23
- data/spec/integration/action/csrf_protection_spec.rb +1 -1
- data/spec/integration/container/application_routes_helper_spec.rb +3 -1
- data/spec/integration/container/provider_lifecycle_spec.rb +61 -0
- data/spec/integration/container/standard_providers/rack_provider_spec.rb +44 -0
- data/spec/integration/container/{standard_bootable_components_spec.rb → standard_providers_spec.rb} +3 -3
- data/spec/integration/rack_app/body_parser_spec.rb +3 -0
- data/spec/integration/rack_app/middleware_spec.rb +427 -3
- data/spec/integration/rack_app/non_booted_rack_app_spec.rb +2 -1
- data/spec/integration/rack_app/rack_app_spec.rb +39 -11
- data/spec/integration/setup_spec.rb +4 -4
- data/spec/integration/slices/external_slice_spec.rb +2 -1
- data/spec/integration/slices/slice_configuration_spec.rb +3 -1
- data/spec/integration/slices/slice_loading_spec.rb +4 -4
- data/spec/integration/slices/slice_routing_spec.rb +4 -3
- data/spec/integration/slices_spec.rb +100 -0
- data/spec/isolation/hanami/boot/success_spec.rb +1 -1
- data/spec/support/app_integration.rb +2 -10
- data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +7 -7
- data/spec/unit/hanami/config/actions/default_values_spec.rb +1 -1
- data/spec/unit/hanami/config/actions/sessions_spec.rb +1 -3
- data/spec/unit/hanami/config/actions_spec.rb +1 -12
- data/spec/unit/hanami/config/logger_spec.rb +38 -55
- data/spec/unit/hanami/config/router_spec.rb +1 -1
- data/spec/unit/hanami/config/views_spec.rb +3 -13
- data/spec/unit/hanami/settings_spec.rb +1 -1
- data/spec/unit/hanami/slice_configurable_spec.rb +5 -5
- data/spec/unit/hanami/slice_spec.rb +32 -0
- data/spec/unit/hanami/version_spec.rb +1 -1
- data/spec/unit/hanami/web/rack_logger_spec.rb +13 -2
- metadata +54 -45
- data/lib/hanami/config/sessions.rb +0 -50
- data/spec/unit/hanami/config_spec.rb +0 -43
data/lib/hanami/config/logger.rb
CHANGED
@@ -1,34 +1,116 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/configurable"
|
4
|
-
require "
|
4
|
+
require "dry/logger"
|
5
5
|
|
6
6
|
module Hanami
|
7
7
|
class Config
|
8
8
|
# Hanami logger config
|
9
9
|
#
|
10
|
+
# @api public
|
10
11
|
# @since 2.0.0
|
11
12
|
class Logger
|
12
13
|
include Dry::Configurable
|
13
14
|
|
15
|
+
# @return [Hanami::SliceName]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
# @since 2.0.o
|
14
19
|
attr_reader :app_name
|
15
20
|
|
16
|
-
|
17
|
-
|
21
|
+
# @!attribute [rw] level
|
22
|
+
# Sets or returns the logger level.
|
23
|
+
#
|
24
|
+
# Defaults to `:info` for the production environment and `:debug` for all others.
|
25
|
+
#
|
26
|
+
# @return [Symbol]
|
27
|
+
#
|
28
|
+
# @api public
|
29
|
+
# @since 2.0.0
|
18
30
|
setting :level
|
19
31
|
|
32
|
+
# @!attribute [rw] stream
|
33
|
+
# Sets or returns the logger's stream.
|
34
|
+
#
|
35
|
+
# This can be a file path or an `IO`-like object for the logger to write to.
|
36
|
+
#
|
37
|
+
# Defaults to `"log/test.log"` for the test environment and `$stdout` for all others.
|
38
|
+
#
|
39
|
+
# @return [String, #write]
|
40
|
+
#
|
41
|
+
# @api public
|
42
|
+
# @since 2.0.0
|
20
43
|
setting :stream
|
21
44
|
|
45
|
+
# @!attribute [rw] formatter
|
46
|
+
# Sets or returns the logger's formatter.
|
47
|
+
#
|
48
|
+
# This may be a name that matches a formatter registered with `Dry::Logger`, which includes
|
49
|
+
# `:string`, `:rack` and `:json`.
|
50
|
+
#
|
51
|
+
# This may also be an instance of Ruby's built-in `::Logger::Formatter` or any compatible
|
52
|
+
# object.
|
53
|
+
#
|
54
|
+
# Defaults to `:json` for the production environment, and `:rack` for all others.
|
55
|
+
#
|
56
|
+
# @return [Symbol, ::Logger::Formatter]
|
57
|
+
#
|
58
|
+
# @api public
|
59
|
+
# @since 2.0.0
|
22
60
|
setting :formatter
|
23
61
|
|
24
|
-
|
25
|
-
|
62
|
+
# @!attribute [rw] template
|
63
|
+
# Sets or returns log entry string template
|
64
|
+
#
|
65
|
+
# Defaults to `false`.
|
66
|
+
#
|
67
|
+
# @return [Boolean]
|
68
|
+
#
|
69
|
+
# @api public
|
70
|
+
# @since 2.0.0
|
71
|
+
setting :template, default: "[%<progname>s] [%<severity>s] [%<time>s] %<message>s"
|
72
|
+
|
73
|
+
# @!attribute [rw] filters
|
74
|
+
# Sets or returns an array of attribute names to filter from logs.
|
75
|
+
#
|
76
|
+
# Defaults to `["_csrf", "password", "password_confirmation"]`. If you want to preserve
|
77
|
+
# these defaults, append to this array rather than reassigning it.
|
78
|
+
#
|
79
|
+
# @return [Array<String>]
|
80
|
+
#
|
81
|
+
# @api public
|
82
|
+
# @since 2.0.0
|
26
83
|
setting :filters, default: %w[_csrf password password_confirmation].freeze
|
27
84
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
85
|
+
# @!attribute [rw] logger_constructor
|
86
|
+
# Sets or returns the constructor proc to use for the logger instantiation.
|
87
|
+
#
|
88
|
+
# Defaults to `Dry.method(:Logger)`.
|
89
|
+
#
|
90
|
+
# @api public
|
91
|
+
# @since 2.0.0
|
92
|
+
setting :logger_constructor, default: Dry.method(:Logger)
|
93
|
+
|
94
|
+
# @!attribute [rw] options
|
95
|
+
# Sets or returns a hash of options to pass to the {logger_constructor} when initializing
|
96
|
+
# the logger.
|
97
|
+
#
|
98
|
+
# Defaults to `[]`
|
99
|
+
#
|
100
|
+
# @return [Hash]
|
101
|
+
#
|
102
|
+
# @api public
|
103
|
+
# @since 2.0.0
|
104
|
+
setting :options, default: {}
|
105
|
+
|
106
|
+
# Returns a new `Logger` config.
|
107
|
+
#
|
108
|
+
# You should not need to initialize this directly, instead use {Hanami::Config#logger}.
|
109
|
+
#
|
110
|
+
# @param env [Symbol] the Hanami env
|
111
|
+
# @param app_name [Hanami::SliceName]
|
112
|
+
#
|
113
|
+
# @api private
|
32
114
|
def initialize(env:, app_name:)
|
33
115
|
@app_name = app_name
|
34
116
|
|
@@ -49,28 +131,34 @@ module Hanami
|
|
49
131
|
config.formatter = case env
|
50
132
|
when :production
|
51
133
|
:json
|
134
|
+
else
|
135
|
+
:rack
|
52
136
|
end
|
53
|
-
|
54
|
-
config.colors = case env
|
55
|
-
when :production, :test
|
56
|
-
false
|
57
|
-
end
|
58
137
|
end
|
59
138
|
|
139
|
+
# Returns a new instance of the logger.
|
140
|
+
#
|
141
|
+
# @return [logger_class]
|
142
|
+
#
|
143
|
+
# @api public
|
144
|
+
# @since 2.0.0
|
60
145
|
def instance
|
61
|
-
|
62
|
-
app_name.name,
|
63
|
-
*options,
|
64
|
-
stream: stream,
|
65
|
-
level: level,
|
66
|
-
formatter: formatter,
|
67
|
-
filter: filters,
|
68
|
-
colorizer: colors
|
69
|
-
)
|
146
|
+
logger_constructor.call(app_name.name, **logger_constructor_opts)
|
70
147
|
end
|
71
148
|
|
72
149
|
private
|
73
150
|
|
151
|
+
# @api private
|
152
|
+
def logger_constructor_opts
|
153
|
+
{stream: stream,
|
154
|
+
level: level,
|
155
|
+
formatter: formatter,
|
156
|
+
filters: filters,
|
157
|
+
template: template,
|
158
|
+
**options}
|
159
|
+
end
|
160
|
+
|
161
|
+
# @api private
|
74
162
|
def method_missing(name, *args, &block)
|
75
163
|
if config.respond_to?(name)
|
76
164
|
config.public_send(name, *args, &block)
|
@@ -79,6 +167,7 @@ module Hanami
|
|
79
167
|
end
|
80
168
|
end
|
81
169
|
|
170
|
+
# @api private
|
82
171
|
def respond_to_missing?(name, _incude_all = false)
|
83
172
|
config.respond_to?(name) || super
|
84
173
|
end
|
data/lib/hanami/config/router.rb
CHANGED
data/lib/hanami/config/views.rb
CHANGED
@@ -7,7 +7,9 @@ module Hanami
|
|
7
7
|
class Config
|
8
8
|
# Hanami views config
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# This is NOT RELEASED as of 2.0.0.
|
11
|
+
#
|
12
|
+
# @api private
|
11
13
|
class Views
|
12
14
|
include Dry::Configurable
|
13
15
|
|
@@ -16,6 +18,7 @@ module Hanami
|
|
16
18
|
attr_reader :base_config
|
17
19
|
protected :base_config
|
18
20
|
|
21
|
+
# @api private
|
19
22
|
def initialize(*)
|
20
23
|
super
|
21
24
|
|
@@ -24,21 +27,14 @@ module Hanami
|
|
24
27
|
configure_defaults
|
25
28
|
end
|
26
29
|
|
30
|
+
# @api private
|
27
31
|
def initialize_copy(source)
|
28
32
|
super
|
29
33
|
@base_config = source.base_config.dup
|
30
34
|
end
|
35
|
+
private :initialize_copy
|
31
36
|
|
32
|
-
# Returns the list of available settings
|
33
|
-
#
|
34
|
-
# @return [Set]
|
35
|
-
#
|
36
|
-
# @since 2.0.0
|
37
37
|
# @api private
|
38
|
-
def settings
|
39
|
-
self.class.settings + View.settings - NON_FORWARDABLE_METHODS
|
40
|
-
end
|
41
|
-
|
42
38
|
def finalize!
|
43
39
|
return self if frozen?
|
44
40
|
|
data/lib/hanami/config.rb
CHANGED
@@ -1,33 +1,97 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "uri"
|
4
|
-
require "
|
5
|
-
require "concurrent/array"
|
4
|
+
require "pathname"
|
6
5
|
require "dry/configurable"
|
7
6
|
require "dry/inflector"
|
8
|
-
require "pathname"
|
9
7
|
|
10
8
|
require_relative "constants"
|
11
|
-
require_relative "config/logger"
|
12
|
-
require_relative "config/sessions"
|
13
|
-
require_relative "settings/env_store"
|
14
|
-
require_relative "slice/routing/middleware/stack"
|
15
9
|
|
16
10
|
module Hanami
|
17
|
-
# Hanami app
|
11
|
+
# Hanami app config
|
18
12
|
#
|
19
13
|
# @since 2.0.0
|
20
14
|
class Config
|
21
15
|
include Dry::Configurable
|
22
16
|
|
17
|
+
# @!attribute [rw] root
|
18
|
+
# Sets the root for the app or slice.
|
19
|
+
#
|
20
|
+
# For the app, this defaults to `Dir.pwd`. For slices detected in `slices/` `config/slices/`,
|
21
|
+
# this defaults to `slices/[slice_name]/`.
|
22
|
+
#
|
23
|
+
# Accepts a string path and will return a `Pathname`.
|
24
|
+
#
|
25
|
+
# @return [Pathname]
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
# @since 2.0.0
|
23
29
|
setting :root, constructor: ->(path) { Pathname(path) if path }
|
24
30
|
|
25
|
-
|
26
|
-
|
31
|
+
# @!attribute [rw] inflector
|
32
|
+
# Sets the app's inflector.
|
33
|
+
#
|
34
|
+
# This expects a `Dry::Inflector` (or compatible) inflector instance.
|
35
|
+
#
|
36
|
+
# To configure custom inflection rules without having to assign a whole inflector, see
|
37
|
+
# {#inflections}.
|
38
|
+
#
|
39
|
+
# @return [Dry::Inflector]
|
40
|
+
#
|
41
|
+
# @see #inflections
|
42
|
+
#
|
43
|
+
# @api public
|
44
|
+
# @since 2.0.0
|
27
45
|
setting :inflector, default: Dry::Inflector.new
|
28
46
|
|
47
|
+
# @!attribute [rw] settings_store
|
48
|
+
# Sets the store used to retrieve {Hanami::Settings} values.
|
49
|
+
#
|
50
|
+
# Defaults to an instance of {Hanami::Settings::EnvStore}.
|
51
|
+
#
|
52
|
+
# @return [#fetch]
|
53
|
+
#
|
54
|
+
# @see Hanami::Settings
|
55
|
+
# @see Hanami::Settings::EnvStore#fetch
|
56
|
+
#
|
57
|
+
# @api public
|
58
|
+
# @since 2.0.0
|
29
59
|
setting :settings_store, default: Hanami::Settings::EnvStore.new
|
30
60
|
|
61
|
+
# @!attribute [rw] slices
|
62
|
+
# Sets the slices to load when the app is preared or booted.
|
63
|
+
#
|
64
|
+
# Defaults to `nil`, which will load all slices. Set this to an array of slice names to load
|
65
|
+
# only those slices.
|
66
|
+
#
|
67
|
+
# This attribute is also populated from the `HANAMI_SLICES` environment variable.
|
68
|
+
#
|
69
|
+
# @example
|
70
|
+
# config.slices = ["admin", "search"]
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# ENV["HANAMI_SLICES"] # => "admin,search"
|
74
|
+
# config.slices # => ["admin", "search"]
|
75
|
+
#
|
76
|
+
# @return [Array<String>, nil]
|
77
|
+
#
|
78
|
+
# @api public
|
79
|
+
# @since 2.0.0
|
80
|
+
setting :slices
|
81
|
+
|
82
|
+
# @!attribute [rw] shared_app_component_keys
|
83
|
+
# Sets the keys for the components to be imported from the app into all other slices.
|
84
|
+
#
|
85
|
+
# You should append items to this array, since the default shared components are essential for
|
86
|
+
# slices to operate within the app.
|
87
|
+
#
|
88
|
+
# @example
|
89
|
+
# config.shared_app_component_keys += ["shared_component_a", "shared_component_b"]
|
90
|
+
#
|
91
|
+
# @return [Array<String>]
|
92
|
+
#
|
93
|
+
# @api public
|
94
|
+
# @since 2.0.0
|
31
95
|
setting :shared_app_component_keys, default: %w[
|
32
96
|
inflector
|
33
97
|
logger
|
@@ -37,73 +101,125 @@ module Hanami
|
|
37
101
|
settings
|
38
102
|
]
|
39
103
|
|
40
|
-
|
104
|
+
# @!attribute [rw] no_auto_register_paths
|
105
|
+
# Sets the paths to skip from container auto-registration.
|
106
|
+
#
|
107
|
+
# Defaults to `["entities"]`.
|
108
|
+
#
|
109
|
+
# @return [Array<String>] array of relative paths
|
110
|
+
#
|
111
|
+
# @api public
|
112
|
+
# @since 2.0.0
|
113
|
+
setting :no_auto_register_paths, default: %w[entities]
|
41
114
|
|
115
|
+
# @!attribute [rw] base_url
|
116
|
+
# Sets the base URL for app's web server.
|
117
|
+
#
|
118
|
+
# This is passed to the {Slice::ClassMethods#router router} and used for generating links.
|
119
|
+
#
|
120
|
+
# Defaults to `"http://0.0.0.0:2300"`. String values passed are turned into `URI` instances.
|
121
|
+
#
|
122
|
+
# @return [URI]
|
123
|
+
#
|
124
|
+
# @see Slice::ClassMethods#router
|
125
|
+
#
|
126
|
+
# @api public
|
127
|
+
# @since 2.0.0
|
42
128
|
setting :base_url, default: "http://0.0.0.0:2300", constructor: ->(url) { URI(url) }
|
43
129
|
|
44
|
-
|
45
|
-
|
46
|
-
setting :logger, cloneable: true
|
47
|
-
|
48
|
-
DEFAULT_ENVIRONMENTS = Concurrent::Hash.new { |h, k| h[k] = Concurrent::Array.new }
|
49
|
-
private_constant :DEFAULT_ENVIRONMENTS
|
50
|
-
|
51
|
-
# @return [Symbol] The name of the application
|
130
|
+
# Returns the app or slice's {Hanami::SliceName slice_name}.
|
52
131
|
#
|
53
|
-
#
|
132
|
+
# This is useful for default config values that depend on this name.
|
133
|
+
#
|
134
|
+
# @return [Hanami::SliceName]
|
135
|
+
#
|
136
|
+
# @api private
|
137
|
+
# @since 2.0.0
|
54
138
|
attr_reader :app_name
|
55
139
|
|
56
|
-
#
|
140
|
+
# Returns the app's environment.
|
57
141
|
#
|
58
|
-
# @
|
142
|
+
# @example
|
143
|
+
# config.env # => :development
|
144
|
+
#
|
145
|
+
# @return [Symbol]
|
146
|
+
#
|
147
|
+
# @see #environment
|
148
|
+
#
|
149
|
+
# @api private
|
150
|
+
# @since 2.0.0
|
59
151
|
attr_reader :env
|
60
152
|
|
61
|
-
#
|
153
|
+
# Returns the app's actions config, or a null config if hanami-controller is not bundled.
|
154
|
+
#
|
155
|
+
# @example When hanami-controller is bundled
|
156
|
+
# config.actions.default_request_format # => :html
|
157
|
+
#
|
158
|
+
# @example When hanami-controller is not bundled
|
159
|
+
# config.actions.default_request_format # => NoMethodError
|
160
|
+
#
|
161
|
+
# @return [Hanami::Config::Actions, Hanami::Config::NullConfig]
|
62
162
|
#
|
63
163
|
# @api public
|
164
|
+
# @since 2.0.0
|
64
165
|
attr_reader :actions
|
65
166
|
|
66
|
-
#
|
167
|
+
# Returns the app's middleware stack, or nil if hanami-router is not bundled.
|
168
|
+
#
|
169
|
+
# Use this to configure middleware that should apply to all routes.
|
170
|
+
#
|
171
|
+
# @example
|
172
|
+
# config.middleware.use :body_parser, :json
|
173
|
+
# config.middleware.use MyCustomMiddleware
|
174
|
+
#
|
175
|
+
# @return [Hanami::Slice::Routing::Middleware::Stack, nil]
|
67
176
|
#
|
68
177
|
# @api public
|
178
|
+
# @since 2.0.0
|
69
179
|
attr_reader :middleware
|
70
180
|
|
71
181
|
# @api private
|
182
|
+
# @since 2.0.0
|
72
183
|
alias_method :middleware_stack, :middleware
|
73
184
|
|
74
|
-
#
|
185
|
+
# Returns the app's router config, or a null config if hanami-router is not bundled.
|
186
|
+
#
|
187
|
+
# @example When hanami-router is bundled
|
188
|
+
# config.router.resolver # => Hanami::Slice::Routing::Resolver
|
189
|
+
#
|
190
|
+
# @example When hanami-router is not bundled
|
191
|
+
# config.router.resolver # => NoMethodError
|
192
|
+
#
|
193
|
+
# @return [Hanami::Config::Router, Hanami::Config::NullConfig]
|
75
194
|
#
|
76
195
|
# @api public
|
196
|
+
# @since 2.0.0
|
77
197
|
attr_reader :router
|
78
198
|
|
79
|
-
#
|
199
|
+
# Returns the app's views config, or a null config if hanami-view is not bundled.
|
80
200
|
#
|
81
|
-
#
|
201
|
+
# This is NOT RELEASED as of 2.0.0.
|
202
|
+
#
|
203
|
+
# @api private
|
82
204
|
attr_reader :views
|
83
205
|
|
84
|
-
#
|
206
|
+
# Returns the app's assets config.
|
85
207
|
#
|
86
|
-
#
|
87
|
-
attr_reader :assets
|
88
|
-
|
89
|
-
# @return [Concurrent::Hash] A hash of default environments
|
208
|
+
# This is NOT RELEASED as of 2.0.0.
|
90
209
|
#
|
91
210
|
# @api private
|
92
|
-
attr_reader :
|
93
|
-
private :environments
|
211
|
+
attr_reader :assets
|
94
212
|
|
95
213
|
# @api private
|
96
214
|
def initialize(app_name:, env:)
|
97
215
|
@app_name = app_name
|
98
|
-
|
99
|
-
@environments = DEFAULT_ENVIRONMENTS.clone
|
100
216
|
@env = env
|
101
217
|
|
102
218
|
# Apply default values that are only knowable at initialize-time (vs require-time)
|
103
219
|
self.root = Dir.pwd
|
104
220
|
load_from_env
|
105
221
|
|
106
|
-
|
222
|
+
@logger = Config::Logger.new(env: env, app_name: app_name)
|
107
223
|
|
108
224
|
# TODO: Make assets config dependent
|
109
225
|
require "hanami/assets/app_config"
|
@@ -128,37 +244,11 @@ module Hanami
|
|
128
244
|
yield self if block_given?
|
129
245
|
end
|
130
246
|
|
131
|
-
# Apply config for the given environment
|
132
|
-
#
|
133
|
-
# @param env [String] the environment name
|
134
|
-
#
|
135
|
-
# @return [Hanami::Config]
|
136
|
-
#
|
137
|
-
# @api public
|
138
|
-
def environment(env_name, &block)
|
139
|
-
environments[env_name] << block
|
140
|
-
apply_env_config
|
141
|
-
|
142
|
-
self
|
143
|
-
end
|
144
|
-
|
145
|
-
# Configure application's inflections
|
146
|
-
#
|
147
|
-
# @see https://dry-rb.org/gems/dry-inflector
|
148
|
-
#
|
149
|
-
# @return [Dry::Inflector]
|
150
|
-
#
|
151
|
-
# @api public
|
152
|
-
def inflections(&block)
|
153
|
-
self.inflector = Dry::Inflector.new(&block)
|
154
|
-
end
|
155
|
-
|
156
247
|
# @api private
|
157
248
|
def initialize_copy(source)
|
158
249
|
super
|
159
250
|
|
160
251
|
@app_name = app_name.dup
|
161
|
-
@environments = environments.dup
|
162
252
|
|
163
253
|
@assets = source.assets.dup
|
164
254
|
@actions = source.actions.dup
|
@@ -168,11 +258,15 @@ module Hanami
|
|
168
258
|
end
|
169
259
|
@views = source.views.dup
|
170
260
|
end
|
261
|
+
private :initialize_copy
|
171
262
|
|
263
|
+
# Finalizes the config.
|
264
|
+
#
|
265
|
+
# This is called when the app or slice is prepared. After this, no further changes to config can
|
266
|
+
# be made.
|
267
|
+
#
|
172
268
|
# @api private
|
173
269
|
def finalize!
|
174
|
-
apply_env_config
|
175
|
-
|
176
270
|
# Finalize nested configs
|
177
271
|
assets.finalize!
|
178
272
|
actions.finalize!
|
@@ -183,16 +277,90 @@ module Hanami
|
|
183
277
|
super
|
184
278
|
end
|
185
279
|
|
186
|
-
#
|
280
|
+
# Configures the app's custom inflections.
|
281
|
+
#
|
282
|
+
# You should call this one time only. Subsequent calls will override previously configured
|
283
|
+
# inflections.
|
284
|
+
#
|
285
|
+
# @example
|
286
|
+
# config.inflections do |inflections|
|
287
|
+
# inflections.acronym "WNBA"
|
288
|
+
# end
|
289
|
+
#
|
290
|
+
# @see https://dry-rb.org/gems/dry-inflector
|
291
|
+
#
|
292
|
+
# @return [Dry::Inflector] the configured inflector
|
293
|
+
#
|
294
|
+
# @api public
|
295
|
+
# @since 2.0.0
|
296
|
+
def inflections(&block)
|
297
|
+
self.inflector = Dry::Inflector.new(&block)
|
298
|
+
end
|
299
|
+
|
300
|
+
# Disabling this to permit distinct documentation for `#logger` vs `#logger=`
|
301
|
+
#
|
302
|
+
# rubocop:disable Style/TrivialAccessors
|
303
|
+
|
304
|
+
# Returns the logger config.
|
305
|
+
#
|
306
|
+
# Use this to configure various options for the default `Dry::Logger::Dispatcher` logger instance.
|
307
|
+
#
|
308
|
+
# @example
|
309
|
+
# config.logger.level = :debug
|
310
|
+
#
|
311
|
+
# @return [Hanami::Config::Logger]
|
312
|
+
#
|
313
|
+
# @see Hanami::Config::Logger
|
314
|
+
#
|
315
|
+
# @api public
|
316
|
+
# @since 2.0.0
|
317
|
+
def logger
|
318
|
+
@logger
|
319
|
+
end
|
320
|
+
|
321
|
+
# Sets the app's logger instance.
|
322
|
+
#
|
323
|
+
# This entirely replaces the default `Dry::Logger::Dispatcher` instance that would have been
|
324
|
+
#
|
325
|
+
# @see #logger_instance
|
187
326
|
#
|
188
327
|
# @api public
|
328
|
+
# @since 2.0.0
|
189
329
|
def logger=(logger_instance)
|
190
330
|
@logger_instance = logger_instance
|
191
331
|
end
|
192
332
|
|
193
|
-
#
|
333
|
+
# rubocop:enable Style/TrivialAccessors
|
334
|
+
|
335
|
+
# Returns the configured logger instance.
|
336
|
+
#
|
337
|
+
# Unless you've replaced the logger with {#logger=}, this returns a `Dry::Logger::Dispatcher` configured
|
338
|
+
# with the options configured through {#logger}.
|
339
|
+
#
|
340
|
+
# This configured logger is registered in all app and slice containers as `"logger"`. For
|
341
|
+
# typical usage, you should access the logger via this component, not directly from config.
|
342
|
+
#
|
343
|
+
# @example Accessing the logger component
|
344
|
+
# Hanami.app["logger"] # => #<Dry::Logger::Dispatcher>
|
345
|
+
#
|
346
|
+
# @example Injecting the logger as a dependency
|
347
|
+
# module MyApp
|
348
|
+
# class MyClass
|
349
|
+
# include Deps["logger"]
|
350
|
+
#
|
351
|
+
# def my_method
|
352
|
+
# logger.info("hello")
|
353
|
+
# end
|
354
|
+
# end
|
355
|
+
# end
|
356
|
+
#
|
357
|
+
# @return [Dry::Logger::Dispatcher]
|
358
|
+
#
|
359
|
+
# @see #logger
|
360
|
+
# @see Hanami::Config::Logger
|
194
361
|
#
|
195
362
|
# @api public
|
363
|
+
# @since 2.0.0
|
196
364
|
def logger_instance
|
197
365
|
@logger_instance || logger.instance
|
198
366
|
end
|
@@ -203,12 +371,6 @@ module Hanami
|
|
203
371
|
self.slices = ENV["HANAMI_SLICES"]&.split(",")&.map(&:strip)
|
204
372
|
end
|
205
373
|
|
206
|
-
def apply_env_config(env = self.env)
|
207
|
-
environments[env].each do |block|
|
208
|
-
instance_eval(&block)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
374
|
# @api private
|
213
375
|
def load_dependent_config(gem_name)
|
214
376
|
if Hanami.bundled?(gem_name)
|
data/lib/hanami/constants.rb
CHANGED
data/lib/hanami/errors.rb
CHANGED
@@ -1,18 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Hanami
|
4
|
+
# Base class for all Hanami errors.
|
5
|
+
#
|
6
|
+
# @api public
|
4
7
|
# @since 2.0.0
|
5
8
|
Error = Class.new(StandardError)
|
6
9
|
|
10
|
+
# Error raised when {Hanami::App} fails to load.
|
11
|
+
#
|
12
|
+
# @api public
|
7
13
|
# @since 2.0.0
|
8
14
|
AppLoadError = Class.new(Error)
|
9
15
|
|
16
|
+
# Error raised when an {Hanami::Slice} fails to load.
|
17
|
+
#
|
18
|
+
# @api public
|
10
19
|
# @since 2.0.0
|
11
20
|
SliceLoadError = Class.new(Error)
|
12
21
|
|
22
|
+
# Error raised when an individual component fails to load.
|
23
|
+
#
|
24
|
+
# @api public
|
13
25
|
# @since 2.0.0
|
14
26
|
ComponentLoadError = Class.new(Error)
|
15
27
|
|
28
|
+
# Error raised when unsupported middleware configuration is given.
|
29
|
+
#
|
30
|
+
# @see Hanami::Slice::Routing::Middleware::Stack#use
|
31
|
+
#
|
32
|
+
# @api public
|
16
33
|
# @since 2.0.0
|
17
34
|
UnsupportedMiddlewareSpecError = Class.new(Error)
|
18
35
|
end
|