hanami 1.3.5 → 2.0.0.alpha1
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 +51 -41
- data/FEATURES.md +2 -12
- data/LICENSE.md +1 -1
- data/README.md +5 -8
- data/bin/hanami +6 -4
- data/hanami.gemspec +24 -28
- data/lib/hanami/application.rb +44 -176
- data/lib/hanami/boot.rb +6 -0
- data/lib/hanami/cli/commands/command.rb +21 -29
- data/lib/hanami/cli/commands/server.rb +63 -14
- data/lib/hanami/cli/commands.rb +5 -42
- data/lib/hanami/configuration/cookies.rb +24 -0
- data/lib/hanami/configuration/middleware.rb +8 -28
- data/lib/hanami/configuration/security.rb +141 -0
- data/lib/hanami/configuration/sessions.rb +50 -0
- data/lib/hanami/configuration.rb +181 -191
- data/lib/hanami/container.rb +107 -0
- data/lib/hanami/frameworks.rb +24 -18
- data/lib/hanami/routes.rb +17 -205
- data/lib/hanami/server.rb +5 -69
- data/lib/hanami/version.rb +3 -1
- data/lib/hanami.rb +39 -243
- metadata +36 -233
- data/lib/hanami/action/csrf_protection.rb +0 -211
- data/lib/hanami/action/routing_helpers.rb +0 -40
- data/lib/hanami/app.rb +0 -96
- data/lib/hanami/application_configuration.rb +0 -1495
- data/lib/hanami/application_name.rb +0 -108
- data/lib/hanami/application_namespace.rb +0 -14
- data/lib/hanami/assets/asset.rb +0 -72
- data/lib/hanami/assets/static.rb +0 -102
- data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
- data/lib/hanami/cli/commands/assets.rb +0 -16
- data/lib/hanami/cli/commands/console.rb +0 -95
- data/lib/hanami/cli/commands/db/apply.rb +0 -32
- data/lib/hanami/cli/commands/db/console.rb +0 -44
- data/lib/hanami/cli/commands/db/create.rb +0 -32
- data/lib/hanami/cli/commands/db/drop.rb +0 -32
- data/lib/hanami/cli/commands/db/migrate.rb +0 -39
- data/lib/hanami/cli/commands/db/prepare.rb +0 -32
- data/lib/hanami/cli/commands/db/rollback.rb +0 -59
- data/lib/hanami/cli/commands/db/version.rb +0 -32
- data/lib/hanami/cli/commands/db.rb +0 -32
- data/lib/hanami/cli/commands/destroy/action.rb +0 -137
- data/lib/hanami/cli/commands/destroy/app.rb +0 -159
- data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
- data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
- data/lib/hanami/cli/commands/destroy/model.rb +0 -84
- data/lib/hanami/cli/commands/destroy.rb +0 -26
- data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
- data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
- data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
- data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/action.rb +0 -321
- data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
- data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
- data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
- data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
- data/lib/hanami/cli/commands/generate/app.rb +0 -243
- data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
- data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
- data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
- data/lib/hanami/cli/commands/generate/migration.rb +0 -41
- data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
- data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
- data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model.rb +0 -125
- data/lib/hanami/cli/commands/generate/secret.rb +0 -48
- data/lib/hanami/cli/commands/generate.rb +0 -28
- data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
- data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
- data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
- data/lib/hanami/cli/commands/new/README.md.erb +0 -33
- data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
- data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
- data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
- data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
- data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
- data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
- data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
- data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
- data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
- data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
- data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
- data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
- data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
- data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
- data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
- data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
- data/lib/hanami/cli/commands/new.rb +0 -578
- data/lib/hanami/cli/commands/project.rb +0 -421
- data/lib/hanami/cli/commands/routes.rb +0 -21
- data/lib/hanami/cli/commands/templates.rb +0 -31
- data/lib/hanami/cli/commands/version.rb +0 -19
- data/lib/hanami/common_logger.rb +0 -109
- data/lib/hanami/components/app/assets.rb +0 -59
- data/lib/hanami/components/app/controller.rb +0 -74
- data/lib/hanami/components/app/routes.rb +0 -59
- data/lib/hanami/components/app/view.rb +0 -44
- data/lib/hanami/components/component.rb +0 -182
- data/lib/hanami/components/components.rb +0 -479
- data/lib/hanami/components/routes_inspector.rb +0 -72
- data/lib/hanami/components.rb +0 -156
- data/lib/hanami/config/cookies.rb +0 -69
- data/lib/hanami/config/framework_configuration.rb +0 -43
- data/lib/hanami/config/load_paths.rb +0 -46
- data/lib/hanami/config/mapper.rb +0 -47
- data/lib/hanami/config/routes.rb +0 -20
- data/lib/hanami/config/security.rb +0 -110
- data/lib/hanami/config/sessions.rb +0 -119
- data/lib/hanami/configuration/app.rb +0 -21
- data/lib/hanami/early_hints.rb +0 -129
- data/lib/hanami/env.rb +0 -69
- data/lib/hanami/environment.rb +0 -541
- data/lib/hanami/environment_application_configurations.rb +0 -37
- data/lib/hanami/hanamirc.rb +0 -169
- data/lib/hanami/mailer/glue.rb +0 -27
- data/lib/hanami/middleware_stack.rb +0 -172
- data/lib/hanami/rake_helper.rb +0 -78
- data/lib/hanami/rake_tasks.rb +0 -3
- data/lib/hanami/rendering_policy.rb +0 -94
- data/lib/hanami/routing/default.rb +0 -32
- data/lib/hanami/setup.rb +0 -3
- data/lib/hanami/static.rb +0 -63
- data/lib/hanami/templates/default.html.erb +0 -30
- data/lib/hanami/templates/welcome.html.erb +0 -52
- data/lib/hanami/views/default.rb +0 -37
- data/lib/hanami/views/default_template_finder.rb +0 -22
- data/lib/hanami/views/null_view.rb +0 -15
- data/lib/hanami/welcome.rb +0 -41
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
require 'hanami/utils'
|
|
2
|
-
|
|
3
|
-
module Hanami
|
|
4
|
-
# Registered components
|
|
5
|
-
#
|
|
6
|
-
# @since 0.9.0
|
|
7
|
-
# @api private
|
|
8
|
-
#
|
|
9
|
-
# @see Hanami::Components
|
|
10
|
-
module Components # rubocop:disable Metrics/ModuleLength
|
|
11
|
-
# Require the entire project
|
|
12
|
-
#
|
|
13
|
-
# @since 0.9.0
|
|
14
|
-
# @api private
|
|
15
|
-
register 'all' do
|
|
16
|
-
requires 'logger', 'code', 'mailer', 'model', 'apps', 'finalizers'
|
|
17
|
-
|
|
18
|
-
resolve { true }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Setup project's logger
|
|
22
|
-
#
|
|
23
|
-
# @since 1.0.0
|
|
24
|
-
# @api private
|
|
25
|
-
register 'logger' do
|
|
26
|
-
prepare do
|
|
27
|
-
require 'hanami/logger'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
resolve do |configuration|
|
|
31
|
-
if configuration.logger.is_a?(Array)
|
|
32
|
-
if logger_interface?(configuration.logger.first)
|
|
33
|
-
configuration.logger.first
|
|
34
|
-
else
|
|
35
|
-
Hanami::Logger.new(Hanami.environment.project_name, *configuration.logger)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# Check if code reloading is enabled
|
|
42
|
-
#
|
|
43
|
-
# @since 0.9.0
|
|
44
|
-
# @api private
|
|
45
|
-
register 'code_reloading' do
|
|
46
|
-
prepare do
|
|
47
|
-
begin
|
|
48
|
-
require 'shotgun'
|
|
49
|
-
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
resolve do
|
|
54
|
-
!!(defined?(Shotgun) && # rubocop:disable Style/DoubleNegation
|
|
55
|
-
Components['environment'].code_reloading?)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# @api private
|
|
60
|
-
register 'code' do
|
|
61
|
-
run do
|
|
62
|
-
directory = Hanami.root.join('lib')
|
|
63
|
-
|
|
64
|
-
if Hanami.code_reloading?
|
|
65
|
-
Utils.reload!(directory)
|
|
66
|
-
else
|
|
67
|
-
Utils.require!(directory)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Tries to load hanami-model, if available for the project
|
|
73
|
-
#
|
|
74
|
-
# @since 0.9.0
|
|
75
|
-
# @api private
|
|
76
|
-
#
|
|
77
|
-
# @example With hanami-model
|
|
78
|
-
# Hanami::Components.resolve('model')
|
|
79
|
-
# Hanami::Components['model'] # => true
|
|
80
|
-
#
|
|
81
|
-
# @example Without hanami-model
|
|
82
|
-
# Hanami::Components.resolve('model')
|
|
83
|
-
# Hanami::Components['model'] # => nil
|
|
84
|
-
register 'model' do
|
|
85
|
-
requires 'logger', 'model.configuration', 'model.sql'
|
|
86
|
-
|
|
87
|
-
resolve do
|
|
88
|
-
if Components['model.configuration']
|
|
89
|
-
Hanami::Model.load!
|
|
90
|
-
Hanami::Model.configuration.logger = Components['logger']
|
|
91
|
-
true
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Tries to evaluate hanami-model configuration, if available for the project
|
|
97
|
-
#
|
|
98
|
-
# @since 0.9.0
|
|
99
|
-
# @api private
|
|
100
|
-
#
|
|
101
|
-
# @example With hanami-model
|
|
102
|
-
# Hanami::Components.resolve('model.configuration')
|
|
103
|
-
# Hanami::Components['model.configuration'].class # => Hanami::Model::Configuration
|
|
104
|
-
#
|
|
105
|
-
# @example Without hanami-model
|
|
106
|
-
# Hanami::Components.resolve('model.configuration')
|
|
107
|
-
# Hanami::Components['model.configuration'].class # => NilClass
|
|
108
|
-
register 'model.configuration' do
|
|
109
|
-
requires 'model.bundled'
|
|
110
|
-
|
|
111
|
-
resolve do |configuration|
|
|
112
|
-
if Components['model.bundled']
|
|
113
|
-
Hanami::Model.instance_variable_set(:@configuration, nil) if Hanami.code_reloading?
|
|
114
|
-
Hanami::Model.configure(&configuration.model)
|
|
115
|
-
Hanami::Model.configuration
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Tries to evaluate hanami-model configuration, if available for the project
|
|
121
|
-
# and it doesn't activate migrations logger
|
|
122
|
-
#
|
|
123
|
-
# @since 1.1.0
|
|
124
|
-
# @api private
|
|
125
|
-
#
|
|
126
|
-
# @example With hanami-model
|
|
127
|
-
# Hanami::Components.resolve('model.configuration.no_logger')
|
|
128
|
-
# Hanami::Components['model.configuration.no_logger'].class # => Hanami::Model::Configuration
|
|
129
|
-
#
|
|
130
|
-
# @example Without hanami-model
|
|
131
|
-
# Hanami::Components.resolve('model.configuration.no_logger')
|
|
132
|
-
# Hanami::Components['model.configuration.no_logger'].class # => NilClass
|
|
133
|
-
register 'model.configuration.no_logger' do
|
|
134
|
-
requires 'model.bundled'
|
|
135
|
-
|
|
136
|
-
prepare do
|
|
137
|
-
require 'stringio'
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
resolve do |configuration|
|
|
141
|
-
if Components['model.bundled']
|
|
142
|
-
Hanami::Model.configure(&configuration.model)
|
|
143
|
-
Hanami::Model.config.migrations_logger(StringIO.new)
|
|
144
|
-
Hanami::Model.configuration
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Tries to load SQL support for hanami, if available for the project
|
|
150
|
-
#
|
|
151
|
-
# @since 0.9.0
|
|
152
|
-
# @api private
|
|
153
|
-
#
|
|
154
|
-
# @example With hanami-model
|
|
155
|
-
# Hanami::Components.resolve('model.sql')
|
|
156
|
-
# Hanami::Components['model.sql'] # => true
|
|
157
|
-
#
|
|
158
|
-
# @example Without hanami-model
|
|
159
|
-
# Hanami::Components.resolve('model.sql')
|
|
160
|
-
# Hanami::Components['model.sql'] # => nil
|
|
161
|
-
register 'model.sql' do
|
|
162
|
-
requires 'model.configuration'
|
|
163
|
-
|
|
164
|
-
prepare do
|
|
165
|
-
begin
|
|
166
|
-
require 'hanami/model/sql'
|
|
167
|
-
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
resolve do
|
|
172
|
-
true if defined?(Hanami::Model::Sql)
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
# Check if hanami-model is bundled
|
|
177
|
-
#
|
|
178
|
-
# @since 0.9.0
|
|
179
|
-
# @api private
|
|
180
|
-
#
|
|
181
|
-
# @example With hanami-model
|
|
182
|
-
# Hanami::Components.resolve('model.bundled')
|
|
183
|
-
# Hanami::Components['model.bundled'] # => true
|
|
184
|
-
#
|
|
185
|
-
# @example Without hanami-model
|
|
186
|
-
# Hanami::Components.resolve('model.bundled')
|
|
187
|
-
# Hanami::Components['model.bundled'] # => nil
|
|
188
|
-
register 'model.bundled' do
|
|
189
|
-
prepare do
|
|
190
|
-
begin
|
|
191
|
-
require 'hanami/model'
|
|
192
|
-
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
resolve do
|
|
197
|
-
true if defined?(Hanami::Model)
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# Tries to evaluate hanami-mailer configuration
|
|
202
|
-
#
|
|
203
|
-
# @since 1.0.0
|
|
204
|
-
# @api private
|
|
205
|
-
#
|
|
206
|
-
# @example With hanami-mailer
|
|
207
|
-
# Hanami::Components.resolve('mailer.configuration')
|
|
208
|
-
# Hanami::Components['mailer.configuration'].class # => Hanami::Mailer::Configuration
|
|
209
|
-
register 'mailer.configuration' do
|
|
210
|
-
prepare do
|
|
211
|
-
require 'hanami/mailer'
|
|
212
|
-
require 'hanami/mailer/glue'
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
resolve do |configuration|
|
|
216
|
-
unless configuration.mailer_settings.empty?
|
|
217
|
-
if Hanami.code_reloading? && !Hanami::Mailer.configuration.nil?
|
|
218
|
-
Hanami::Mailer.configuration = Hanami::Mailer.configuration.dup
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
configuration.mailer_settings.each do |settings|
|
|
222
|
-
Hanami::Mailer.configure(&settings)
|
|
223
|
-
Hanami::Mailer.configuration.mailers.each do |mailer|
|
|
224
|
-
mailer.configuration = Hanami::Mailer.configuration.duplicate
|
|
225
|
-
Hanami::Mailer.configuration.copy!(mailer)
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
Hanami::Mailer.configuration
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
# Tries to load hanami-mailer
|
|
235
|
-
#
|
|
236
|
-
# @since 1.0.0
|
|
237
|
-
# @api private
|
|
238
|
-
#
|
|
239
|
-
# @example
|
|
240
|
-
# Hanami::Components.resolve('mailer')
|
|
241
|
-
# Hanami::Components['mailer'] # => true
|
|
242
|
-
register 'mailer' do
|
|
243
|
-
requires 'mailer.configuration'
|
|
244
|
-
|
|
245
|
-
resolve do
|
|
246
|
-
if Components['mailer.configuration']
|
|
247
|
-
Hanami::Mailer.load!
|
|
248
|
-
true
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
# Loads the routes for all the mounted Hanami/Rack applications
|
|
254
|
-
#
|
|
255
|
-
# This is used only by `hanami routes` command.
|
|
256
|
-
#
|
|
257
|
-
# @since 0.9.0
|
|
258
|
-
# @api private
|
|
259
|
-
register 'routes.inspector' do
|
|
260
|
-
requires 'apps.configurations'
|
|
261
|
-
|
|
262
|
-
prepare do
|
|
263
|
-
require 'hanami/components/routes_inspector'
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
resolve do |configuration|
|
|
267
|
-
RoutesInspector.new(configuration)
|
|
268
|
-
end
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
# Loads all the Hanami applications in the project
|
|
272
|
-
#
|
|
273
|
-
# @since 0.9.0
|
|
274
|
-
# @api private
|
|
275
|
-
register 'apps' do
|
|
276
|
-
resolve do |configuration|
|
|
277
|
-
configuration.apps do |app|
|
|
278
|
-
component('app').call(app)
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
true
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
# Evaluates all the Hanami applications' configurations in the project
|
|
286
|
-
#
|
|
287
|
-
# @since 0.9.0
|
|
288
|
-
# @api private
|
|
289
|
-
register 'apps.configurations' do
|
|
290
|
-
resolve do |configuration|
|
|
291
|
-
configuration.apps do |app|
|
|
292
|
-
component('app.configuration').call(app)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
true
|
|
296
|
-
end
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
# Evaluates all the Hanami assets configurations for each application in the project
|
|
300
|
-
#
|
|
301
|
-
# This is used only by `hanami assets precompile` command.
|
|
302
|
-
#
|
|
303
|
-
# @since 0.9.0
|
|
304
|
-
# @api private
|
|
305
|
-
register 'apps.assets.configurations' do
|
|
306
|
-
requires 'apps.configurations'
|
|
307
|
-
|
|
308
|
-
prepare do
|
|
309
|
-
require 'hanami/components/app/assets'
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
resolve do |configuration|
|
|
313
|
-
[].tap do |result|
|
|
314
|
-
configuration.apps do |app|
|
|
315
|
-
result << Components::App::Assets.resolve(app)
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
# Finalizers for the project
|
|
322
|
-
#
|
|
323
|
-
# @since 0.9.0
|
|
324
|
-
# @api private
|
|
325
|
-
register 'finalizers' do
|
|
326
|
-
requires 'plugins', 'finalizers.initializers'
|
|
327
|
-
|
|
328
|
-
resolve { true }
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
# Load project initializers
|
|
332
|
-
#
|
|
333
|
-
# @since 0.9.0
|
|
334
|
-
# @api private
|
|
335
|
-
register 'finalizers.initializers' do
|
|
336
|
-
run do
|
|
337
|
-
Hanami::Utils.require!(
|
|
338
|
-
Hanami.root.join('config', 'initializers')
|
|
339
|
-
)
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
# Load plugins
|
|
344
|
-
#
|
|
345
|
-
# @since 1.2.0
|
|
346
|
-
# @api private
|
|
347
|
-
register 'plugins' do
|
|
348
|
-
resolve do |configuration|
|
|
349
|
-
Hanami.plugins.each do |plugin_configuration|
|
|
350
|
-
configuration.instance_eval(&plugin_configuration)
|
|
351
|
-
end
|
|
352
|
-
end
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
# Configure, load and finalize a Hanami application in the project
|
|
356
|
-
#
|
|
357
|
-
# @since 0.9.0
|
|
358
|
-
# @api private
|
|
359
|
-
register 'app' do
|
|
360
|
-
run do |app|
|
|
361
|
-
['app.configuration', 'app.frameworks', 'app.code', 'app.routes', 'app.finalizer'].each do |c|
|
|
362
|
-
component(c).call(app)
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
resolved(app.app_name, true)
|
|
366
|
-
end
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
# Evaluate the configuration of a single Hanami application in the project
|
|
370
|
-
#
|
|
371
|
-
# @since 0.9.0
|
|
372
|
-
# @api private
|
|
373
|
-
register 'app.configuration' do
|
|
374
|
-
run do |app|
|
|
375
|
-
resolved("#{app.app_name}.configuration") do
|
|
376
|
-
ApplicationConfiguration.new(app.namespace, app.configurations, app.path_prefix).tap do |config|
|
|
377
|
-
app.configuration = config
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
# Evaluate Hanami frameworks configurations of a single Hanami application in the project
|
|
384
|
-
#
|
|
385
|
-
# @since 0.9.0
|
|
386
|
-
# @api private
|
|
387
|
-
register 'app.frameworks' do
|
|
388
|
-
run do |app|
|
|
389
|
-
['app.controller', 'app.view', 'app.assets'].each do |c|
|
|
390
|
-
component(c).call(app)
|
|
391
|
-
end
|
|
392
|
-
end
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
# Evaluate hanami-controller configuration of a single Hanami application in the project
|
|
396
|
-
#
|
|
397
|
-
# @since 0.9.0
|
|
398
|
-
# @api private
|
|
399
|
-
register 'app.controller' do
|
|
400
|
-
prepare do
|
|
401
|
-
require 'hanami/components/app/controller'
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
run do |app|
|
|
405
|
-
Components::App::Controller.resolve(app)
|
|
406
|
-
end
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
# Evaluate hanami-view configuration of a single Hanami application in the project
|
|
410
|
-
#
|
|
411
|
-
# @since 0.9.0
|
|
412
|
-
# @api private
|
|
413
|
-
register 'app.view' do
|
|
414
|
-
prepare do
|
|
415
|
-
require 'hanami/components/app/view'
|
|
416
|
-
end
|
|
417
|
-
|
|
418
|
-
run do |app|
|
|
419
|
-
Components::App::View.resolve(app)
|
|
420
|
-
end
|
|
421
|
-
end
|
|
422
|
-
|
|
423
|
-
# Evaluate hanami-assets configuration of a single Hanami application in the project
|
|
424
|
-
#
|
|
425
|
-
# @since 0.9.0
|
|
426
|
-
# @api private
|
|
427
|
-
register 'app.assets' do
|
|
428
|
-
prepare do
|
|
429
|
-
require 'hanami/components/app/assets'
|
|
430
|
-
end
|
|
431
|
-
|
|
432
|
-
run do |app|
|
|
433
|
-
Components::App::Assets.resolve(app)
|
|
434
|
-
end
|
|
435
|
-
end
|
|
436
|
-
|
|
437
|
-
# Load the code for a single Hanami application in the project
|
|
438
|
-
#
|
|
439
|
-
# @since 0.9.0
|
|
440
|
-
# @api private
|
|
441
|
-
register 'app.code' do
|
|
442
|
-
run do |app|
|
|
443
|
-
config = app.configuration
|
|
444
|
-
config.load_paths.load!
|
|
445
|
-
end
|
|
446
|
-
end
|
|
447
|
-
|
|
448
|
-
# Load the routes for a single Hanami application in the project
|
|
449
|
-
#
|
|
450
|
-
# @since 0.9.0
|
|
451
|
-
# @api private
|
|
452
|
-
register 'app.routes' do
|
|
453
|
-
prepare do
|
|
454
|
-
require 'hanami/components/app/routes'
|
|
455
|
-
end
|
|
456
|
-
|
|
457
|
-
run do |app|
|
|
458
|
-
Components::App::Routes.resolve(app)
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
# Finalize a single Hanami application in the project
|
|
463
|
-
#
|
|
464
|
-
# @since 0.9.0
|
|
465
|
-
# @api private
|
|
466
|
-
register 'app.finalizer' do
|
|
467
|
-
run do |app|
|
|
468
|
-
config = app.configuration
|
|
469
|
-
namespace = app.namespace
|
|
470
|
-
|
|
471
|
-
config.middleware.load!
|
|
472
|
-
|
|
473
|
-
namespace.module_eval %(#{namespace}::Controller.load!)
|
|
474
|
-
namespace.module_eval %(#{namespace}::View.load!)
|
|
475
|
-
namespace.module_eval %(#{namespace}::Assets.load!)
|
|
476
|
-
end
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
end
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
require 'hanami/routing/default'
|
|
2
|
-
require_relative './app/routes'
|
|
3
|
-
|
|
4
|
-
module Hanami
|
|
5
|
-
# @since 0.9.0
|
|
6
|
-
# @api private
|
|
7
|
-
module Components
|
|
8
|
-
# Project's routes inspector
|
|
9
|
-
#
|
|
10
|
-
# @since 0.9.0
|
|
11
|
-
# @api private
|
|
12
|
-
class RoutesInspector
|
|
13
|
-
# @param configuration [Hanami::Configuration]
|
|
14
|
-
#
|
|
15
|
-
# @since 0.9.0
|
|
16
|
-
# @api private
|
|
17
|
-
def initialize(configuration)
|
|
18
|
-
@configuration = configuration
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Returns a printable version of the project routes
|
|
22
|
-
#
|
|
23
|
-
# @return [String] printable routes
|
|
24
|
-
#
|
|
25
|
-
# @since 0.9.0
|
|
26
|
-
# @api private
|
|
27
|
-
def inspect
|
|
28
|
-
routes.map do |r|
|
|
29
|
-
r.inspector.to_s
|
|
30
|
-
end.join("\n")
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
# @since 0.9.0
|
|
36
|
-
# @api private
|
|
37
|
-
attr_reader :configuration
|
|
38
|
-
|
|
39
|
-
# @since 0.9.0
|
|
40
|
-
# @api private
|
|
41
|
-
def routes
|
|
42
|
-
configuration.mounted.each_with_object([]) do |(klass, app), result|
|
|
43
|
-
result << if hanami_app?(klass)
|
|
44
|
-
resolve_hanami_app_router(app)
|
|
45
|
-
else
|
|
46
|
-
resolve_rack_app_router(app)
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @since 0.9.0
|
|
52
|
-
# @api private
|
|
53
|
-
def hanami_app?(klass)
|
|
54
|
-
klass <= Hanami::Application
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @since 0.9.0
|
|
58
|
-
# @api private
|
|
59
|
-
def resolve_hanami_app_router(app)
|
|
60
|
-
App::Routes.application_routes(app)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# @since 0.9.0
|
|
64
|
-
# @api private
|
|
65
|
-
def resolve_rack_app_router(app)
|
|
66
|
-
Hanami::Router.new do
|
|
67
|
-
mount app.name, at: app.path_prefix
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
data/lib/hanami/components.rb
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
require 'concurrent'
|
|
2
|
-
|
|
3
|
-
module Hanami
|
|
4
|
-
# Components API
|
|
5
|
-
#
|
|
6
|
-
# Components are an internal Hanami that provides precise loading mechanism
|
|
7
|
-
# for a project. It is responsible to load frameworks, configurations, code, etc..
|
|
8
|
-
#
|
|
9
|
-
# The implementation is thread-safe
|
|
10
|
-
#
|
|
11
|
-
# @example
|
|
12
|
-
# Hanami::Components.resolved('repo') { UserRepository.new }
|
|
13
|
-
# Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
|
|
14
|
-
#
|
|
15
|
-
# Also you can use Hanami::Components with dry-auto_inject
|
|
16
|
-
#
|
|
17
|
-
# @example
|
|
18
|
-
# Hanami::Components.resolved('repo') { UserRepository.new }
|
|
19
|
-
# Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
|
|
20
|
-
#
|
|
21
|
-
# HanamiImport = Dry::AutoInject(Hanami::Components)
|
|
22
|
-
#
|
|
23
|
-
# class CreateUser
|
|
24
|
-
# include HanamiImport['repository.users']
|
|
25
|
-
#
|
|
26
|
-
# def call(payload)
|
|
27
|
-
# users.create(payload)
|
|
28
|
-
# end
|
|
29
|
-
# end
|
|
30
|
-
#
|
|
31
|
-
# CreateUser.new.call # => #<User:...>
|
|
32
|
-
# CreateUser.new(users: MockRepository.new).call # => #<MockUser:...>
|
|
33
|
-
#
|
|
34
|
-
# @since 0.9.0
|
|
35
|
-
# @api private
|
|
36
|
-
module Components
|
|
37
|
-
# Available components
|
|
38
|
-
#
|
|
39
|
-
# @since 0.9.0
|
|
40
|
-
# @api private
|
|
41
|
-
@_components = Concurrent::Hash.new
|
|
42
|
-
|
|
43
|
-
# Resolved components
|
|
44
|
-
#
|
|
45
|
-
# @since 0.9.0
|
|
46
|
-
# @api private
|
|
47
|
-
@_resolved = Concurrent::Map.new
|
|
48
|
-
|
|
49
|
-
# Register a component
|
|
50
|
-
#
|
|
51
|
-
# @param name [String] the unique component name
|
|
52
|
-
# @param blk [Proc] the logic of the component
|
|
53
|
-
#
|
|
54
|
-
# @since 0.9.0
|
|
55
|
-
# @api private
|
|
56
|
-
#
|
|
57
|
-
# @see Hanami::Components::Component
|
|
58
|
-
def self.register(name, &blk)
|
|
59
|
-
@_components[name] = Component.new(name, &blk)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Return a registered component
|
|
63
|
-
#
|
|
64
|
-
# @param name [String] the name of the component
|
|
65
|
-
#
|
|
66
|
-
# @raise [ArgumentError] if the component is unknown
|
|
67
|
-
#
|
|
68
|
-
# @since 0.9.0
|
|
69
|
-
# @api private
|
|
70
|
-
def self.component(name)
|
|
71
|
-
@_components.fetch(name) do
|
|
72
|
-
raise ArgumentError.new("Component not found: `#{name}'.\nAvailable components are: #{@_components.keys.join(', ')}")
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Mark a component as resolved by providing a value or a block.
|
|
77
|
-
# In the latter case, the returning value of the block is associated with
|
|
78
|
-
# the component.
|
|
79
|
-
#
|
|
80
|
-
# @param name [String] the name of the component to mark as resolved
|
|
81
|
-
# @param value [Object] the optional value of the component
|
|
82
|
-
# @param blk [Proc] the optional block which returning value is associated with the component.
|
|
83
|
-
#
|
|
84
|
-
# @since 0.9.0
|
|
85
|
-
# @api private
|
|
86
|
-
def self.resolved(name, value = nil, &blk)
|
|
87
|
-
if block_given?
|
|
88
|
-
@_resolved.fetch_or_store(name, &blk)
|
|
89
|
-
else
|
|
90
|
-
@_resolved.compute_if_absent(name) { value }
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Ask to resolve a component.
|
|
95
|
-
#
|
|
96
|
-
# This is used as dependency mechanism.
|
|
97
|
-
# For instance `model` component depends on `model.configuration`. Before to
|
|
98
|
-
# resolve `model`, `Components` uses this method to resolve that dependency first.
|
|
99
|
-
#
|
|
100
|
-
# @param names [String,Array<String>] one or more components to be resolved
|
|
101
|
-
#
|
|
102
|
-
# @since 0.9.0
|
|
103
|
-
# @api private
|
|
104
|
-
def self.resolve(*names)
|
|
105
|
-
Array(names).flatten.each do |name|
|
|
106
|
-
@_resolved.fetch_or_store(name) do
|
|
107
|
-
component = @_components.fetch(name)
|
|
108
|
-
component.call(Hanami.configuration)
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Return the value of an already resolved component. Or raise error for not resolved component.
|
|
114
|
-
#
|
|
115
|
-
# @example
|
|
116
|
-
# Hanami::Components.resolved('repository.users') { UserRepository.new }
|
|
117
|
-
#
|
|
118
|
-
# Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
|
|
119
|
-
# Hanami::Components['repository.other'] # => error
|
|
120
|
-
#
|
|
121
|
-
# @param name [String] the component name
|
|
122
|
-
#
|
|
123
|
-
# @raise [ArgumentError] if the component is unknown or not resolved yet.
|
|
124
|
-
#
|
|
125
|
-
# @since 0.9.0
|
|
126
|
-
# @api private
|
|
127
|
-
def self.[](name)
|
|
128
|
-
@_resolved.fetch(name) do
|
|
129
|
-
raise ArgumentError.new("Component not resolved: `#{name}'.\nResolved components are: #{@_resolved.keys.join(', ')}")
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Release all the resolved components.
|
|
134
|
-
# This is used for code reloading.
|
|
135
|
-
#
|
|
136
|
-
# NOTE: this MUST NOT be used unless you know what you're doing.
|
|
137
|
-
#
|
|
138
|
-
# @example
|
|
139
|
-
# Hanami::Components.resolved('repository.users') { UserRepository.new }
|
|
140
|
-
# Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
|
|
141
|
-
#
|
|
142
|
-
# Hanami::Components.release
|
|
143
|
-
# Hanami::Components['repository.users']
|
|
144
|
-
# # => ArgumentError: Component not resolved: `repo'.
|
|
145
|
-
# # => Resolved components are: ...
|
|
146
|
-
#
|
|
147
|
-
# @since 1.0.0
|
|
148
|
-
# @api private
|
|
149
|
-
def self.release
|
|
150
|
-
@_resolved.clear
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
require 'hanami/components/component'
|
|
154
|
-
require 'hanami/components/components'
|
|
155
|
-
end
|
|
156
|
-
end
|