hanami 1.3.5 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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