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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -41
  3. data/FEATURES.md +2 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -8
  6. data/bin/hanami +6 -4
  7. data/hanami.gemspec +24 -28
  8. data/lib/hanami/application.rb +44 -176
  9. data/lib/hanami/boot.rb +6 -0
  10. data/lib/hanami/cli/commands/command.rb +21 -29
  11. data/lib/hanami/cli/commands/server.rb +63 -14
  12. data/lib/hanami/cli/commands.rb +5 -42
  13. data/lib/hanami/configuration/cookies.rb +24 -0
  14. data/lib/hanami/configuration/middleware.rb +8 -28
  15. data/lib/hanami/configuration/security.rb +141 -0
  16. data/lib/hanami/configuration/sessions.rb +50 -0
  17. data/lib/hanami/configuration.rb +181 -191
  18. data/lib/hanami/container.rb +107 -0
  19. data/lib/hanami/frameworks.rb +24 -18
  20. data/lib/hanami/routes.rb +17 -205
  21. data/lib/hanami/server.rb +5 -69
  22. data/lib/hanami/version.rb +3 -1
  23. data/lib/hanami.rb +39 -243
  24. metadata +36 -233
  25. data/lib/hanami/action/csrf_protection.rb +0 -211
  26. data/lib/hanami/action/routing_helpers.rb +0 -40
  27. data/lib/hanami/app.rb +0 -96
  28. data/lib/hanami/application_configuration.rb +0 -1495
  29. data/lib/hanami/application_name.rb +0 -108
  30. data/lib/hanami/application_namespace.rb +0 -14
  31. data/lib/hanami/assets/asset.rb +0 -72
  32. data/lib/hanami/assets/static.rb +0 -102
  33. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  34. data/lib/hanami/cli/commands/assets.rb +0 -16
  35. data/lib/hanami/cli/commands/console.rb +0 -95
  36. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  37. data/lib/hanami/cli/commands/db/console.rb +0 -44
  38. data/lib/hanami/cli/commands/db/create.rb +0 -32
  39. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  40. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  41. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  42. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  43. data/lib/hanami/cli/commands/db/version.rb +0 -32
  44. data/lib/hanami/cli/commands/db.rb +0 -32
  45. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  46. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  47. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  48. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  49. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  50. data/lib/hanami/cli/commands/destroy.rb +0 -26
  51. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  52. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  53. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  54. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  55. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  56. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  57. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  58. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  59. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  60. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  61. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  62. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  63. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  64. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  65. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  66. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  67. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  68. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  69. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  70. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  71. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  72. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  73. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  74. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  75. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  76. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  77. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  78. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  79. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  80. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  81. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  82. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  83. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  84. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  85. data/lib/hanami/cli/commands/generate.rb +0 -28
  86. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  87. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  88. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  89. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  90. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  91. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  92. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  93. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  94. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  95. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  96. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  97. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  98. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  99. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  100. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  101. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  102. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  103. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  104. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  105. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  106. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  107. data/lib/hanami/cli/commands/new.rb +0 -578
  108. data/lib/hanami/cli/commands/project.rb +0 -421
  109. data/lib/hanami/cli/commands/routes.rb +0 -21
  110. data/lib/hanami/cli/commands/templates.rb +0 -31
  111. data/lib/hanami/cli/commands/version.rb +0 -19
  112. data/lib/hanami/common_logger.rb +0 -109
  113. data/lib/hanami/components/app/assets.rb +0 -59
  114. data/lib/hanami/components/app/controller.rb +0 -74
  115. data/lib/hanami/components/app/routes.rb +0 -59
  116. data/lib/hanami/components/app/view.rb +0 -44
  117. data/lib/hanami/components/component.rb +0 -182
  118. data/lib/hanami/components/components.rb +0 -479
  119. data/lib/hanami/components/routes_inspector.rb +0 -72
  120. data/lib/hanami/components.rb +0 -156
  121. data/lib/hanami/config/cookies.rb +0 -69
  122. data/lib/hanami/config/framework_configuration.rb +0 -43
  123. data/lib/hanami/config/load_paths.rb +0 -46
  124. data/lib/hanami/config/mapper.rb +0 -47
  125. data/lib/hanami/config/routes.rb +0 -20
  126. data/lib/hanami/config/security.rb +0 -110
  127. data/lib/hanami/config/sessions.rb +0 -119
  128. data/lib/hanami/configuration/app.rb +0 -21
  129. data/lib/hanami/early_hints.rb +0 -129
  130. data/lib/hanami/env.rb +0 -69
  131. data/lib/hanami/environment.rb +0 -541
  132. data/lib/hanami/environment_application_configurations.rb +0 -37
  133. data/lib/hanami/hanamirc.rb +0 -169
  134. data/lib/hanami/mailer/glue.rb +0 -27
  135. data/lib/hanami/middleware_stack.rb +0 -172
  136. data/lib/hanami/rake_helper.rb +0 -78
  137. data/lib/hanami/rake_tasks.rb +0 -3
  138. data/lib/hanami/rendering_policy.rb +0 -94
  139. data/lib/hanami/routing/default.rb +0 -32
  140. data/lib/hanami/setup.rb +0 -3
  141. data/lib/hanami/static.rb +0 -63
  142. data/lib/hanami/templates/default.html.erb +0 -30
  143. data/lib/hanami/templates/welcome.html.erb +0 -52
  144. data/lib/hanami/views/default.rb +0 -37
  145. data/lib/hanami/views/default_template_finder.rb +0 -22
  146. data/lib/hanami/views/null_view.rb +0 -15
  147. 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
@@ -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