hanami 2.0.0.alpha5 → 2.0.0.alpha7.1
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 +141 -0
- data/README.md +2 -6
- data/hanami.gemspec +5 -4
- data/lib/hanami/application/container/{boot → providers}/inflector.rb +1 -1
- data/lib/hanami/application/container/{boot → providers}/logger.rb +1 -1
- data/lib/hanami/application/container/providers/rack_logger.rb +15 -0
- data/lib/hanami/application/container/{boot → providers}/rack_monitor.rb +2 -2
- data/lib/hanami/application/container/{boot → providers}/routes_helper.rb +1 -1
- data/lib/hanami/application/container/{boot → providers}/settings.rb +1 -1
- data/lib/hanami/application/routing/router.rb +1 -1
- data/lib/hanami/application/slice_registrar.rb +106 -0
- data/lib/hanami/application.rb +75 -142
- data/lib/hanami/cli/application/cli.rb +1 -1
- data/lib/hanami/configuration/actions.rb +90 -0
- data/lib/hanami/configuration.rb +4 -23
- data/lib/hanami/constants.rb +23 -0
- data/lib/hanami/errors.rb +12 -0
- data/lib/hanami/{init.rb → prepare.rb} +1 -1
- data/lib/hanami/slice.rb +192 -128
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +27 -51
- data/lib/hanami.rb +15 -7
- metadata +20 -16
- data/lib/hanami/application/autoloader/inflector_adapter.rb +0 -22
- data/lib/hanami/application/container/boot/rack_logger.rb +0 -19
data/lib/hanami/slice.rb
CHANGED
@@ -1,189 +1,253 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/system/container"
|
4
|
-
require "
|
4
|
+
require "hanami/errors"
|
5
5
|
require "pathname"
|
6
|
+
require_relative "constants"
|
6
7
|
|
7
8
|
module Hanami
|
8
9
|
# Distinct area of concern within an Hanami application
|
9
10
|
#
|
10
11
|
# @since 2.0.0
|
11
12
|
class Slice
|
12
|
-
|
13
|
-
|
14
|
-
def initialize(application, name:, namespace: nil, root: nil, container: nil)
|
15
|
-
@application = application
|
16
|
-
@name = name.to_sym
|
17
|
-
@namespace = namespace
|
18
|
-
@root = root ? Pathname(root) : root
|
19
|
-
@container = container || define_container
|
20
|
-
end
|
13
|
+
def self.inherited(klass)
|
14
|
+
super
|
21
15
|
|
22
|
-
|
23
|
-
application.inflector
|
24
|
-
end
|
16
|
+
klass.extend(ClassMethods)
|
25
17
|
|
26
|
-
|
27
|
-
|
18
|
+
# Eagerly initialize any variables that may be accessed inside the subclass body
|
19
|
+
klass.instance_variable_set(:@application, Hanami.application)
|
20
|
+
klass.instance_variable_set(:@container, Class.new(Dry::System::Container))
|
28
21
|
end
|
29
22
|
|
30
|
-
|
31
|
-
|
23
|
+
# rubocop:disable Metrics/ModuleLength
|
24
|
+
module ClassMethods
|
25
|
+
attr_reader :application, :container
|
32
26
|
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
def slice_name
|
28
|
+
inflector.underscore(name.split(MODULE_DELIMITER)[-2]).to_sym
|
29
|
+
end
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
container.config.env = application.container.config.env
|
31
|
+
def namespace
|
32
|
+
inflector.constantize(name.split(MODULE_DELIMITER)[0..-2].join(MODULE_DELIMITER))
|
40
33
|
end
|
41
34
|
|
42
|
-
|
43
|
-
|
44
|
-
|
35
|
+
def namespace_path
|
36
|
+
inflector.underscore(namespace)
|
37
|
+
end
|
45
38
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
# rubocop:enable Style/DoubleNegation
|
39
|
+
def root
|
40
|
+
application.root.join(SLICES_DIR, slice_name.to_s)
|
41
|
+
end
|
51
42
|
|
52
|
-
|
53
|
-
|
54
|
-
|
43
|
+
def inflector
|
44
|
+
application.inflector
|
45
|
+
end
|
46
|
+
|
47
|
+
def prepare(provider_name = nil)
|
48
|
+
container.prepare(provider_name) and return self if provider_name
|
49
|
+
|
50
|
+
return self if prepared?
|
55
51
|
|
56
|
-
|
57
|
-
|
52
|
+
ensure_slice_name
|
53
|
+
ensure_slice_consts
|
58
54
|
|
59
|
-
|
60
|
-
|
55
|
+
prepare_all
|
56
|
+
|
57
|
+
@prepared = true
|
58
|
+
self
|
61
59
|
end
|
62
|
-
end
|
63
60
|
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
def prepare_container(&block)
|
62
|
+
@prepare_container_block = block
|
63
|
+
end
|
67
64
|
|
68
|
-
|
69
|
-
|
70
|
-
end
|
65
|
+
def boot
|
66
|
+
return self if booted?
|
71
67
|
|
72
|
-
|
73
|
-
container.init(*args)
|
74
|
-
end
|
68
|
+
container.finalize!
|
75
69
|
|
76
|
-
|
77
|
-
container.start(*args)
|
78
|
-
end
|
70
|
+
@booted = true
|
79
71
|
|
80
|
-
|
81
|
-
|
82
|
-
end
|
72
|
+
self
|
73
|
+
end
|
83
74
|
|
84
|
-
|
85
|
-
|
86
|
-
|
75
|
+
def shutdown
|
76
|
+
container.shutdown!
|
77
|
+
self
|
78
|
+
end
|
87
79
|
|
88
|
-
|
89
|
-
|
90
|
-
|
80
|
+
def prepared?
|
81
|
+
!!@prepared
|
82
|
+
end
|
91
83
|
|
92
|
-
|
93
|
-
|
94
|
-
|
84
|
+
def booted?
|
85
|
+
!!@booted
|
86
|
+
end
|
95
87
|
|
96
|
-
|
88
|
+
def register(...)
|
89
|
+
container.register(...)
|
90
|
+
end
|
97
91
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
container.use :env
|
92
|
+
def register_provider(...)
|
93
|
+
container.register_provider(...)
|
94
|
+
end
|
102
95
|
|
103
|
-
|
104
|
-
|
105
|
-
|
96
|
+
def start(...)
|
97
|
+
container.start(...)
|
98
|
+
end
|
106
99
|
|
107
|
-
|
108
|
-
|
100
|
+
def key?(...)
|
101
|
+
container.key?(...)
|
102
|
+
end
|
109
103
|
|
110
|
-
|
111
|
-
|
112
|
-
|
104
|
+
def keys
|
105
|
+
container.keys
|
106
|
+
end
|
113
107
|
|
114
|
-
|
115
|
-
|
116
|
-
|
108
|
+
def [](...)
|
109
|
+
container.[](...)
|
110
|
+
end
|
117
111
|
|
118
|
-
|
112
|
+
def resolve(...)
|
113
|
+
container.resolve(...)
|
114
|
+
end
|
119
115
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
# classes inside the slice's namespace.
|
124
|
-
#
|
125
|
-
# e.g. "lib/foo.rb" should define SliceNamespace::Foo, to be registered as
|
126
|
-
# "foo"
|
127
|
-
component_dir.namespaces.delete_root
|
128
|
-
component_dir.namespaces.add_root(key: nil, const: namespace_path)
|
116
|
+
def export(keys)
|
117
|
+
container.config.exports = keys
|
118
|
+
end
|
129
119
|
|
130
|
-
|
120
|
+
def import(from:, **kwargs)
|
121
|
+
# TODO: This should be handled via dry-system (see dry-rb/dry-system#228)
|
122
|
+
raise "Cannot import after booting" if booted?
|
131
123
|
|
132
|
-
|
133
|
-
else
|
134
|
-
# Expect component files in the root of non-lib/ component dirs to define
|
135
|
-
# classes inside a namespace matching that dir.
|
136
|
-
#
|
137
|
-
# e.g. "actions/foo.rb" should define SliceNamespace::Actions::Foo, to be
|
138
|
-
# registered as "actions.foo"
|
124
|
+
application = self.application
|
139
125
|
|
140
|
-
|
126
|
+
container.after(:configure) do
|
127
|
+
if from.is_a?(Symbol) || from.is_a?(String)
|
128
|
+
slice_name = from
|
129
|
+
from = application.slices[from.to_sym].container
|
130
|
+
end
|
141
131
|
|
142
|
-
|
143
|
-
inflector.constantize(inflector.camelize(dir_namespace_path))
|
144
|
-
rescue NameError
|
145
|
-
namespace.const_set(inflector.camelize(component_dir.path), Module.new)
|
146
|
-
end
|
132
|
+
as = kwargs[:as] || slice_name
|
147
133
|
|
148
|
-
|
149
|
-
|
134
|
+
import(from: from, as: as, **kwargs)
|
135
|
+
end
|
136
|
+
end
|
150
137
|
|
151
|
-
|
138
|
+
private
|
152
139
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
140
|
+
def ensure_slice_name
|
141
|
+
unless name
|
142
|
+
raise SliceLoadError, "Slice must have a class name before it can be prepared"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def ensure_slice_consts
|
147
|
+
if namespace.const_defined?(:Container) || namespace.const_defined?(:Deps)
|
148
|
+
raise(
|
149
|
+
SliceLoadError,
|
150
|
+
"#{namespace}::Container and #{namespace}::Deps constants must not already be defined"
|
151
|
+
)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def prepare_all
|
156
|
+
prepare_container_plugins
|
157
|
+
prepare_container_base_config
|
158
|
+
prepare_container_component_dirs
|
159
|
+
prepare_autoloader
|
160
|
+
prepare_container_imports
|
161
|
+
prepare_container_consts
|
162
|
+
instance_exec(container, &@prepare_container_block) if @prepare_container_block
|
163
|
+
container.configured!
|
164
|
+
end
|
165
|
+
|
166
|
+
def prepare_container_plugins
|
167
|
+
container.use(:env, inferrer: -> { Hanami.env })
|
168
|
+
|
169
|
+
container.use(
|
170
|
+
:zeitwerk,
|
171
|
+
loader: application.autoloader,
|
172
|
+
run_setup: false,
|
173
|
+
eager_load: false
|
174
|
+
)
|
175
|
+
end
|
176
|
+
|
177
|
+
def prepare_container_base_config
|
178
|
+
container.config.name = slice_name
|
179
|
+
container.config.root = root
|
180
|
+
container.config.provider_dirs = [File.join("config", "providers")]
|
181
|
+
|
182
|
+
container.config.env = application.configuration.env
|
183
|
+
container.config.inflector = application.configuration.inflector
|
184
|
+
end
|
185
|
+
|
186
|
+
def prepare_container_component_dirs # rubocop:disable Metrics/AbcSize
|
187
|
+
return unless root&.directory?
|
188
|
+
|
189
|
+
# Add component dirs for each configured component path
|
190
|
+
application.configuration.source_dirs.component_dirs.each do |component_dir|
|
191
|
+
next unless root.join(component_dir.path).directory?
|
192
|
+
|
193
|
+
component_dir = component_dir.dup
|
194
|
+
|
195
|
+
if component_dir.path == LIB_DIR
|
196
|
+
# Expect component files in the root of the lib/ component dir to define
|
197
|
+
# classes inside the slice's namespace.
|
198
|
+
#
|
199
|
+
# e.g. "lib/foo.rb" should define SliceNamespace::Foo, to be registered as
|
200
|
+
# "foo"
|
201
|
+
component_dir.namespaces.delete_root
|
202
|
+
component_dir.namespaces.add_root(key: nil, const: namespace_path)
|
203
|
+
else
|
204
|
+
# Expect component files in the root of non-lib/ component dirs to define
|
205
|
+
# classes inside a namespace matching that dir.
|
206
|
+
#
|
207
|
+
# e.g. "actions/foo.rb" should define SliceNamespace::Actions::Foo, to be
|
208
|
+
# registered as "actions.foo"
|
209
|
+
|
210
|
+
dir_namespace_path = File.join(namespace_path, component_dir.path)
|
211
|
+
|
212
|
+
component_dir.namespaces.delete_root
|
213
|
+
component_dir.namespaces.add_root(const: dir_namespace_path, key: component_dir.path)
|
158
214
|
end
|
159
215
|
|
160
|
-
|
161
|
-
|
162
|
-
|
216
|
+
container.config.component_dirs.add(component_dir)
|
217
|
+
end
|
218
|
+
end
|
163
219
|
|
164
|
-
|
220
|
+
def prepare_autoloader # rubocop:disable Metrics/AbcSize
|
221
|
+
return unless root&.directory?
|
165
222
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
namespace.const_set(inflector.camelize(autoload_path), Module.new)
|
170
|
-
end
|
223
|
+
# Pass configured autoload dirs to the autoloader
|
224
|
+
application.configuration.source_dirs.autoload_paths.each do |autoload_path|
|
225
|
+
next unless root.join(autoload_path).directory?
|
171
226
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
)
|
227
|
+
dir_namespace_path = File.join(namespace_path, autoload_path)
|
228
|
+
|
229
|
+
autoloader_namespace = begin
|
230
|
+
inflector.constantize(inflector.camelize(dir_namespace_path))
|
231
|
+
rescue NameError
|
232
|
+
namespace.const_set(inflector.camelize(autoload_path), Module.new)
|
176
233
|
end
|
234
|
+
|
235
|
+
container.config.autoloader.push_dir(
|
236
|
+
container.root.join(autoload_path),
|
237
|
+
namespace: autoloader_namespace
|
238
|
+
)
|
177
239
|
end
|
178
240
|
end
|
179
241
|
|
180
|
-
|
242
|
+
def prepare_container_imports
|
243
|
+
container.import from: application.container, as: :application
|
244
|
+
end
|
245
|
+
|
246
|
+
def prepare_container_consts
|
181
247
|
namespace.const_set :Container, container
|
182
248
|
namespace.const_set :Deps, container.injector
|
183
249
|
end
|
184
|
-
|
185
|
-
container
|
186
250
|
end
|
187
|
-
# rubocop:enable Metrics/
|
251
|
+
# rubocop:enable Metrics/ModuleLength
|
188
252
|
end
|
189
253
|
end
|
data/lib/hanami/version.rb
CHANGED
@@ -1,19 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "json"
|
4
|
-
require "rack/request"
|
5
|
-
require "hanami/utils/hash"
|
6
|
-
|
7
3
|
module Hanami
|
8
4
|
module Web
|
9
5
|
# Rack logger for Hanami applications
|
10
6
|
class RackLogger
|
11
|
-
|
12
|
-
|
7
|
+
REQUEST_METHOD = "REQUEST_METHOD"
|
8
|
+
private_constant :REQUEST_METHOD
|
9
|
+
|
10
|
+
HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"
|
11
|
+
private_constant :HTTP_X_FORWARDED_FOR
|
12
|
+
|
13
|
+
REMOTE_ADDR = "REMOTE_ADDR"
|
14
|
+
private_constant :REMOTE_ADDR
|
15
|
+
|
16
|
+
SCRIPT_NAME = "SCRIPT_NAME"
|
17
|
+
private_constant :SCRIPT_NAME
|
18
|
+
|
19
|
+
PATH_INFO = "PATH_INFO"
|
20
|
+
private_constant :PATH_INFO
|
21
|
+
|
22
|
+
ROUTER_PARAMS = "router.params"
|
23
|
+
private_constant :ROUTER_PARAMS
|
24
|
+
|
25
|
+
CONTENT_LENGTH = "Content-Length"
|
26
|
+
private_constant :CONTENT_LENGTH
|
13
27
|
|
14
|
-
def initialize(logger
|
28
|
+
def initialize(logger)
|
15
29
|
@logger = logger
|
16
|
-
@filter_params = filter_params
|
17
30
|
end
|
18
31
|
|
19
32
|
def attach(rack_monitor)
|
@@ -26,22 +39,20 @@ module Hanami
|
|
26
39
|
end
|
27
40
|
end
|
28
41
|
|
29
|
-
|
30
|
-
def log_request(env, status, time)
|
42
|
+
def log_request(env, status, elapsed)
|
31
43
|
data = {
|
32
|
-
http: env[HTTP_VERSION],
|
33
44
|
verb: env[REQUEST_METHOD],
|
34
45
|
status: status,
|
46
|
+
elapsed: "#{elapsed}ms",
|
35
47
|
ip: env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR],
|
36
48
|
path: env[SCRIPT_NAME] + env[PATH_INFO].to_s,
|
37
49
|
length: extract_content_length(env),
|
38
|
-
params:
|
39
|
-
|
50
|
+
params: env[ROUTER_PARAMS],
|
51
|
+
time: Time.now,
|
40
52
|
}
|
41
53
|
|
42
|
-
logger.info
|
54
|
+
logger.info(data)
|
43
55
|
end
|
44
|
-
# rubocop:enable Metrics/MethodLength
|
45
56
|
|
46
57
|
def log_exception(exception)
|
47
58
|
logger.error exception.message
|
@@ -50,47 +61,12 @@ module Hanami
|
|
50
61
|
|
51
62
|
private
|
52
63
|
|
53
|
-
|
54
|
-
REQUEST_METHOD = "REQUEST_METHOD"
|
55
|
-
HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"
|
56
|
-
REMOTE_ADDR = "REMOTE_ADDR"
|
57
|
-
SCRIPT_NAME = "SCRIPT_NAME"
|
58
|
-
PATH_INFO = "PATH_INFO"
|
59
|
-
RACK_ERRORS = "rack.errors"
|
60
|
-
QUERY_HASH = "rack.request.query_hash"
|
61
|
-
FORM_HASH = "rack.request.form_hash"
|
62
|
-
ROUTER_PARAMS = "router.params"
|
63
|
-
CONTENT_LENGTH = "Content-Length"
|
64
|
+
attr_reader :logger
|
64
65
|
|
65
66
|
def extract_content_length(env)
|
66
67
|
value = env[CONTENT_LENGTH]
|
67
68
|
!value || value.to_s == "0" ? "-" : value
|
68
69
|
end
|
69
|
-
|
70
|
-
def extract_params(env)
|
71
|
-
result = env.fetch(QUERY_HASH, {})
|
72
|
-
result.merge!(env.fetch(FORM_HASH, {}))
|
73
|
-
result.merge!(Hanami::Utils::Hash.deep_stringify(env.fetch(ROUTER_PARAMS, {})))
|
74
|
-
result
|
75
|
-
end
|
76
|
-
|
77
|
-
FILTERED = "[FILTERED]"
|
78
|
-
|
79
|
-
# rubocop:disable Metrics/MethodLength
|
80
|
-
def filter(params)
|
81
|
-
params.each_with_object({}) do |(k, v), h|
|
82
|
-
if filter_params.include?(k)
|
83
|
-
h.update(k => FILTERED)
|
84
|
-
elsif v.is_a?(Hash)
|
85
|
-
h.update(k => filter(v))
|
86
|
-
elsif v.is_a?(Array)
|
87
|
-
h.update(k => v.map { |m| m.is_a?(Hash) ? filter(m) : m })
|
88
|
-
else
|
89
|
-
h[k] = v
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
# rubocop:enable Metrics/MethodLength
|
94
70
|
end
|
95
71
|
end
|
96
72
|
end
|
data/lib/hanami.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "hanami/application"
|
4
|
+
require_relative "hanami/errors"
|
5
|
+
require_relative "hanami/version"
|
6
|
+
|
7
|
+
|
3
8
|
# A complete web framework for Ruby
|
4
9
|
#
|
5
10
|
# @since 0.1.0
|
6
11
|
#
|
7
12
|
# @see http://hanamirb.org
|
8
13
|
module Hanami
|
9
|
-
require "hanami/version"
|
10
|
-
require "hanami/application"
|
11
|
-
|
12
14
|
@_mutex = Mutex.new
|
13
15
|
|
14
16
|
def self.application
|
15
17
|
@_mutex.synchronize do
|
16
|
-
|
18
|
+
unless defined?(@_application)
|
19
|
+
raise ApplicationLoadError,
|
20
|
+
"Hanami.application is not yet configured. " \
|
21
|
+
"You may need to `require \"hanami/setup\"` to load your config/application.rb file."
|
22
|
+
end
|
17
23
|
|
18
24
|
@_application
|
19
25
|
end
|
@@ -25,7 +31,9 @@ module Hanami
|
|
25
31
|
|
26
32
|
def self.application=(klass)
|
27
33
|
@_mutex.synchronize do
|
28
|
-
|
34
|
+
if defined?(@_application)
|
35
|
+
raise ApplicationLoadError, "Hanami.application is already configured."
|
36
|
+
end
|
29
37
|
|
30
38
|
@_application = klass unless klass.name.nil?
|
31
39
|
end
|
@@ -47,8 +55,8 @@ module Hanami
|
|
47
55
|
application[:logger]
|
48
56
|
end
|
49
57
|
|
50
|
-
def self.
|
51
|
-
application.
|
58
|
+
def self.prepare
|
59
|
+
application.prepare
|
52
60
|
end
|
53
61
|
|
54
62
|
def self.boot
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.alpha7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -104,20 +104,20 @@ dependencies:
|
|
104
104
|
requirements:
|
105
105
|
- - "~>"
|
106
106
|
- !ruby/object:Gem::Version
|
107
|
-
version: '0.
|
107
|
+
version: '0.23'
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: 0.23.0
|
111
111
|
type: :runtime
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0.
|
117
|
+
version: '0.23'
|
118
118
|
- - ">="
|
119
119
|
- !ruby/object:Gem::Version
|
120
|
-
version: 0.
|
120
|
+
version: 0.23.0
|
121
121
|
- !ruby/object:Gem::Dependency
|
122
122
|
name: hanami-cli
|
123
123
|
requirement: !ruby/object:Gem::Requirement
|
@@ -217,13 +217,12 @@ files:
|
|
217
217
|
- hanami.gemspec
|
218
218
|
- lib/hanami.rb
|
219
219
|
- lib/hanami/application.rb
|
220
|
-
- lib/hanami/application/
|
221
|
-
- lib/hanami/application/container/
|
222
|
-
- lib/hanami/application/container/
|
223
|
-
- lib/hanami/application/container/
|
224
|
-
- lib/hanami/application/container/
|
225
|
-
- lib/hanami/application/container/
|
226
|
-
- lib/hanami/application/container/boot/settings.rb
|
220
|
+
- lib/hanami/application/container/providers/inflector.rb
|
221
|
+
- lib/hanami/application/container/providers/logger.rb
|
222
|
+
- lib/hanami/application/container/providers/rack_logger.rb
|
223
|
+
- lib/hanami/application/container/providers/rack_monitor.rb
|
224
|
+
- lib/hanami/application/container/providers/routes_helper.rb
|
225
|
+
- lib/hanami/application/container/providers/settings.rb
|
227
226
|
- lib/hanami/application/router.rb
|
228
227
|
- lib/hanami/application/routes.rb
|
229
228
|
- lib/hanami/application/routes_helper.rb
|
@@ -234,6 +233,7 @@ files:
|
|
234
233
|
- lib/hanami/application/routing/router.rb
|
235
234
|
- lib/hanami/application/settings.rb
|
236
235
|
- lib/hanami/application/settings/dotenv_store.rb
|
236
|
+
- lib/hanami/application/slice_registrar.rb
|
237
237
|
- lib/hanami/assets/application_configuration.rb
|
238
238
|
- lib/hanami/assets/configuration.rb
|
239
239
|
- lib/hanami/boot.rb
|
@@ -247,13 +247,16 @@ files:
|
|
247
247
|
- lib/hanami/cli/commands/command.rb
|
248
248
|
- lib/hanami/cli/commands/server.rb
|
249
249
|
- lib/hanami/configuration.rb
|
250
|
+
- lib/hanami/configuration/actions.rb
|
250
251
|
- lib/hanami/configuration/logger.rb
|
251
252
|
- lib/hanami/configuration/middleware.rb
|
252
253
|
- lib/hanami/configuration/null_configuration.rb
|
253
254
|
- lib/hanami/configuration/router.rb
|
254
255
|
- lib/hanami/configuration/sessions.rb
|
255
256
|
- lib/hanami/configuration/source_dirs.rb
|
256
|
-
- lib/hanami/
|
257
|
+
- lib/hanami/constants.rb
|
258
|
+
- lib/hanami/errors.rb
|
259
|
+
- lib/hanami/prepare.rb
|
257
260
|
- lib/hanami/server.rb
|
258
261
|
- lib/hanami/setup.rb
|
259
262
|
- lib/hanami/slice.rb
|
@@ -263,6 +266,7 @@ homepage: http://hanamirb.org
|
|
263
266
|
licenses:
|
264
267
|
- MIT
|
265
268
|
metadata:
|
269
|
+
rubygems_mfa_required: 'true'
|
266
270
|
allowed_push_host: https://rubygems.org
|
267
271
|
post_install_message:
|
268
272
|
rdoc_options: []
|
@@ -272,14 +276,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
272
276
|
requirements:
|
273
277
|
- - ">="
|
274
278
|
- !ruby/object:Gem::Version
|
275
|
-
version:
|
279
|
+
version: '3.0'
|
276
280
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
277
281
|
requirements:
|
278
282
|
- - ">"
|
279
283
|
- !ruby/object:Gem::Version
|
280
284
|
version: 1.3.1
|
281
285
|
requirements: []
|
282
|
-
rubygems_version: 3.
|
286
|
+
rubygems_version: 3.3.3
|
283
287
|
signing_key:
|
284
288
|
specification_version: 4
|
285
289
|
summary: The web, with simplicity
|