hanami 0.8.0 → 0.9.0

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/FEATURES.md +13 -0
  4. data/README.md +28 -1
  5. data/hanami.gemspec +20 -17
  6. data/lib/hanami.rb +106 -7
  7. data/lib/hanami/action/routing_helpers.rb +2 -2
  8. data/lib/hanami/app.rb +72 -0
  9. data/lib/hanami/application.rb +144 -183
  10. data/lib/hanami/application_configuration.rb +1541 -0
  11. data/lib/hanami/application_name.rb +2 -2
  12. data/lib/hanami/application_namespace.rb +12 -0
  13. data/lib/hanami/assets/asset.rb +3 -1
  14. data/lib/hanami/assets/static.rb +3 -9
  15. data/lib/hanami/cli.rb +10 -7
  16. data/lib/hanami/cli_sub_commands/assets.rb +1 -9
  17. data/lib/hanami/cli_sub_commands/generate.rb +16 -0
  18. data/lib/hanami/commands/apps.rb +4 -0
  19. data/lib/hanami/commands/assets/precompile.rb +6 -19
  20. data/lib/hanami/commands/command.rb +64 -0
  21. data/lib/hanami/commands/console.rb +37 -26
  22. data/lib/hanami/commands/db/apply.rb +4 -2
  23. data/lib/hanami/commands/db/console.rb +11 -27
  24. data/lib/hanami/commands/db/create.rb +4 -2
  25. data/lib/hanami/commands/db/drop.rb +4 -2
  26. data/lib/hanami/commands/db/migrate.rb +11 -5
  27. data/lib/hanami/commands/db/prepare.rb +4 -2
  28. data/lib/hanami/commands/db/version.rb +4 -2
  29. data/lib/hanami/commands/generate/abstract.rb +5 -7
  30. data/lib/hanami/commands/generate/action.rb +18 -6
  31. data/lib/hanami/commands/generate/app.rb +15 -2
  32. data/lib/hanami/commands/generate/migration.rb +3 -2
  33. data/lib/hanami/commands/generate/model.rb +4 -3
  34. data/lib/hanami/commands/generate/secret_token.rb +31 -0
  35. data/lib/hanami/commands/new/abstract.rb +14 -5
  36. data/lib/hanami/commands/new/container.rb +1 -0
  37. data/lib/hanami/commands/routes.rb +5 -22
  38. data/lib/hanami/commands/server.rb +14 -142
  39. data/lib/hanami/components.rb +107 -0
  40. data/lib/hanami/components/app/assets.rb +55 -0
  41. data/lib/hanami/components/app/controller.rb +69 -0
  42. data/lib/hanami/components/app/logger.rb +30 -0
  43. data/lib/hanami/components/app/routes.rb +51 -0
  44. data/lib/hanami/components/app/view.rb +40 -0
  45. data/lib/hanami/components/component.rb +166 -0
  46. data/lib/hanami/components/components.rb +366 -0
  47. data/lib/hanami/components/routes_inspector.rb +70 -0
  48. data/lib/hanami/config/load_paths.rb +7 -6
  49. data/lib/hanami/config/mapper.rb +1 -1
  50. data/lib/hanami/config/security.rb +0 -8
  51. data/lib/hanami/configuration.rb +27 -1697
  52. data/lib/hanami/env.rb +67 -0
  53. data/lib/hanami/environment.rb +31 -21
  54. data/lib/hanami/environment_application_configurations.rb +30 -0
  55. data/lib/hanami/frameworks.rb +1 -0
  56. data/lib/hanami/generators/app/application.rb.tt +2 -2
  57. data/lib/hanami/generators/application/app/Gemfile.tt +3 -1
  58. data/lib/hanami/generators/application/app/config/application.rb.tt +2 -2
  59. data/lib/hanami/generators/application/app/gitignore_with_sqlite.tt +3 -0
  60. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +4 -25
  61. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +1 -1
  62. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +1 -1
  63. data/lib/hanami/generators/application/container/Gemfile.tt +3 -1
  64. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +1 -1
  65. data/lib/hanami/generators/application/container/config.ru.tt +1 -1
  66. data/lib/hanami/generators/application/container/config/environment.rb.tt +35 -1
  67. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +1 -1
  68. data/lib/hanami/generators/application/container/gitignore_with_sqlite.tt +3 -0
  69. data/lib/hanami/generators/application/container/lib/project.rb.tt +1 -57
  70. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +1 -1
  71. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +2 -3
  72. data/lib/hanami/generators/database_config.rb +8 -11
  73. data/lib/hanami/generators/model/entity.rb.tt +1 -2
  74. data/lib/hanami/generators/model/repository.rb.tt +1 -2
  75. data/lib/hanami/generators/template_engine.rb +8 -3
  76. data/lib/hanami/generators/test_framework.rb +4 -3
  77. data/lib/hanami/middleware.rb +41 -21
  78. data/lib/hanami/rake_helper.rb +6 -8
  79. data/lib/hanami/server.rb +43 -33
  80. data/lib/hanami/static.rb +2 -2
  81. data/lib/hanami/version.rb +35 -1
  82. data/lib/hanami/welcome.rb +4 -5
  83. metadata +68 -42
  84. data/lib/hanami/commands/db/abstract.rb +0 -19
  85. data/lib/hanami/config/configure.rb +0 -17
  86. data/lib/hanami/config/mapping.rb +0 -12
  87. data/lib/hanami/container.rb +0 -71
  88. data/lib/hanami/generators/application/container/gitignore_with_db.tt +0 -4
  89. data/lib/hanami/loader.rb +0 -257
  90. data/lib/hanami/repositories/car_repository.rb +0 -3
  91. data/lib/hanami/repositories/name_repository.rb +0 -3
@@ -2,7 +2,7 @@ require 'hanami/utils/kernel'
2
2
 
3
3
  module Hanami
4
4
  module Config
5
- # Define a mapping for Hanami::Model
5
+ # Block or file mapper
6
6
  #
7
7
  # @since 0.1.0
8
8
  # @api private
@@ -6,26 +6,18 @@ module Hanami
6
6
  class Security
7
7
  # @since 0.3.0
8
8
  # @api private
9
- #
10
- # @see Hanami::Loader#_configure_controller_framework!
11
9
  X_FRAME_OPTIONS_HEADER = 'X-Frame-Options'.freeze
12
10
 
13
11
  # @since 0.8.0
14
12
  # @api private
15
- #
16
- # @see Hanami::Loader#_configure_controller_framework!
17
13
  X_CONTENT_TYPE_OPTIONS_HEADER = 'X-Content-Type-Options'.freeze
18
14
 
19
15
  # @since 0.8.0
20
16
  # @api private
21
- #
22
- # @see Hanami::Loader#_configure_controller_framework!
23
17
  X_XSS_PROTECTION_HEADER = 'X-XSS-Protection'.freeze
24
18
 
25
19
  # @since 0.3.0
26
20
  # @api private
27
- #
28
- # @see Hanami::Loader#_configure_controller_framework!
29
21
  CONTENT_SECURITY_POLICY_HEADER = 'Content-Security-Policy'.freeze
30
22
 
31
23
  # @since 0.8.0
@@ -1,1723 +1,53 @@
1
- require 'hanami/utils/kernel'
2
- require 'hanami/utils/deprecation'
3
- require 'hanami/environment'
4
- require 'hanami/config/configure'
5
- require 'hanami/config/cookies'
6
- require 'hanami/config/framework_configuration'
7
- require 'hanami/config/load_paths'
8
- require 'hanami/config/logger'
9
- require 'hanami/config/mapping'
10
- require 'hanami/config/routes'
11
- require 'hanami/config/security'
12
- require 'hanami/config/sessions'
1
+ require 'concurrent'
2
+ require 'delegate'
3
+ require 'hanami/application'
4
+ require 'hanami/utils/class'
5
+ require 'hanami/utils/string'
13
6
 
14
7
  module Hanami
15
- # Configuration for a Hanami application
16
- #
17
- # @since 0.1.0
18
8
  class Configuration
19
- # @since 0.2.0
20
- # @api private
21
- #
22
- # @see Hanami::Configuration#ssl?
23
- SSL_SCHEME = 'https'.freeze
9
+ class App < SimpleDelegator
10
+ attr_reader :path_prefix
24
11
 
25
- # Initialize a new configuration instance
26
- #
27
- # @return [Hanami::Configuration]
28
- #
29
- # @since 0.1.0
30
- # @api private
31
- def initialize
32
- @blk = Proc.new{}
33
- @env = Environment.new
34
- @configurations = Hash.new { |k, v| k[v] = [] }
35
- end
36
-
37
- # Set a block yield when the configuration will be loaded or
38
- # set a path for the specific environment.
39
- #
40
- # @param environment [Symbol,nil] the configuration environment name
41
- # @param blk [Proc] the configuration block
42
- #
43
- # @return [self]
44
- #
45
- # @since 0.1.0
46
- # @api private
47
- def configure(environment = nil, path = nil, &blk)
48
- if environment && path
49
- @configurations[environment.to_s] << Config::Configure.new(root, path, &blk)
50
- elsif environment
51
- @configurations[environment.to_s] << blk
52
- else
53
- @blk = blk
12
+ def initialize(app, path_prefix)
13
+ super(app)
14
+ @path_prefix = path_prefix
54
15
  end
55
-
56
- self
57
16
  end
58
17
 
59
- # Load the configuration
60
- #
61
- # @param namespace [String,nil] the application namespace
62
- #
63
- # @return [self]
64
- #
65
- # @since 0.1.0
66
- # @api private
67
- def load!(namespace = nil)
68
- @namespace = namespace
69
- evaluate_configurations!
70
-
71
- self
18
+ def initialize(&blk)
19
+ @settings = Concurrent::Map.new
20
+ instance_eval(&blk)
72
21
  end
73
22
 
74
- # Returns the security policy
75
- #
76
- # @return [Hanami::Config::Security]
77
- #
78
- # @since 0.3.0
79
- #
80
- # @see Hanami::Config::Security
81
- #
82
- # @example Getting values
83
- # require 'hanami'
84
- #
85
- # module Bookshelf
86
- # class Application < Hanami::Application
87
- # configure do
88
- # security.x_frame_options "ALLOW ALL"
89
- # security.content_security_policy "script-src 'self' https://apis.example.com"
90
- # end
91
- # end
92
- # end
93
- #
94
- # Bookshelf::Application.configuration.security.x_frame_options # => "ALLOW ALL"
95
- # Bookshelf::Application.configuration.security.content_security_policy # => "script-src 'self' https://apis.example.com"
96
- #
97
- # @example Setting values
98
- # require 'hanami'
99
- #
100
- # module Bookshelf
101
- # class Application < Hanami::Application
102
- # configure do
103
- # security.x_frame_options "ALLOW ALL"
104
- # security.content_security_policy "script-src 'self' https://apis.example.com"
105
- # end
106
- # end
107
- # end
108
- def security
109
- @security ||= Config::Security.new
23
+ def mount(app, options)
24
+ mounted[app] = App.new(app, options.fetch(:at))
110
25
  end
111
26
 
112
- # Force ssl redirection if http scheme is set
113
- #
114
- # @return [Boolean]
115
- #
116
- # @since 0.4.0
117
- #
118
- # @see Hanami::Routing::ForceSsl
119
- def force_ssl(value = nil)
120
- if value
121
- @force_ssl = value
27
+ def model(&blk)
28
+ if block_given?
29
+ settings.put_if_absent(:model, blk)
122
30
  else
123
- @force_ssl || false
31
+ settings.fetch(:model)
124
32
  end
125
33
  end
126
34
 
127
- # The root of the application
128
- #
129
- # By default it returns the current directory, for this reason, **all the
130
- # commands must be executed from the top level directory of the project**.
131
- #
132
- # If for some reason, that constraint above cannot be satisfied, please
133
- # configure the root directory, so that commands can be executed from
134
- # everywhere.
135
- #
136
- # This is part of a DSL, for this reason when this method is called with
137
- # an argument, it will set the corresponding instance variable. When
138
- # called without, it will return the already set value, or the default.
139
- #
140
- # @overload root(value)
141
- # Sets the given value
142
- # @param value [String,Pathname,#to_pathname] The root directory of the app
143
- #
144
- # @overload root
145
- # Gets the value
146
- # @return [Pathname]
147
- # @raise [Errno::ENOENT] if the path cannot be found
148
- #
149
- # @since 0.1.0
150
- #
151
- # @see http://www.ruby-doc.org/core-2.1.2/Dir.html#method-c-pwd
152
- #
153
- # @example Getting the value
154
- # require 'hanami'
155
- #
156
- # module Bookshelf
157
- # class Application < Hanami::Application
158
- # end
159
- # end
160
- #
161
- # Bookshelf::Application.configuration.root # => #<Pathname:/path/to/root>
162
- #
163
- # @example Setting the value
164
- # require 'hanami'
165
- #
166
- # module Bookshelf
167
- # class Application < Hanami::Application
168
- # configure do
169
- # root '/path/to/another/root'
170
- # end
171
- # end
172
- # end
173
- def root(value = nil)
174
- if value
175
- @root = value
176
- else
177
- Utils::Kernel.Pathname(@root || Dir.pwd).realpath
178
- end
35
+ def mailer(&blk)
36
+ settings.put_if_absent(:mailer, blk)
179
37
  end
180
38
 
181
- # The application namespace
182
- #
183
- # By default it returns the Ruby namespace of the application. For instance
184
- # for an application `Bookshelf::Application`, it returns `Bookshelf`.
185
- #
186
- # This value isn't set at the init time, but when the configuration is
187
- # loaded with `#load!`.
188
- #
189
- # Hanami applications are namespaced: all the controllers and views live
190
- # under the application module, without polluting the global namespace.
191
- # However, if for some reason, you want top level classes, set this value
192
- # to `Object` (which is the top level namespace for Ruby).
193
- #
194
- # This is part of a DSL, for this reason when this method is called with
195
- # an argument, it will set the corresponding instance variable. When
196
- # called without, it will return the already set value, or the default.
197
- #
198
- # @overload namespace(value)
199
- # Sets the given value
200
- # @param value [Class,Module] A valid Ruby namespace
201
- #
202
- # @overload namespace
203
- # Gets the value
204
- # @return [Class,Module] a Ruby namespace
205
- #
206
- # @since 0.1.0
207
- #
208
- # @example Getting the value
209
- # require 'hanami'
210
- #
211
- # module Bookshelf
212
- # class Application < Hanami::Application
213
- # end
214
- # end
215
- #
216
- # Bookshelf::Application.configuration.namespace # => Bookshelf
217
- #
218
- # # It will lookup namespaced controllers under Bookshelf
219
- # # eg. Bookshelf::Controllers::Dashboard
220
- #
221
- # @example Setting the value
222
- # require 'hanami'
223
- #
224
- # module Bookshelf
225
- # class Application < Hanami::Application
226
- # configure do
227
- # namespace Object
228
- # end
229
- # end
230
- # end
231
- #
232
- # Bookshelf::Application.configuration.namespace # => Object
233
- #
234
- # # It will lookup top level controllers under Object
235
- # # eg. DashboardController
236
- def namespace(value = nil)
237
- if value
238
- @namespace = value
239
- else
240
- @namespace
241
- end
39
+ def mounted
40
+ settings.fetch_or_store(:mounted, {})
242
41
  end
243
42
 
244
- # A Hanami::Layout for this application
245
- #
246
- # By default it's `nil`.
247
- #
248
- # It accepts a Symbol as layout name. When the application is loaded, it
249
- # will lookup for the corresponding class.
250
- #
251
- # All the views will use this layout, unless otherwise specified.
252
- #
253
- # This is part of a DSL, for this reason when this method is called with
254
- # an argument, it will set the corresponding instance variable. When
255
- # called without, it will return the already set value, or the default.
256
- #
257
- # @overload layout(value)
258
- # Sets the given value
259
- # @param value [Symbol] the layout name
260
- #
261
- # @overload layout
262
- # Gets the value
263
- # @return [Symbol,nil] the layout name
264
- #
265
- # @since 0.1.0
266
- #
267
- # @see http://rdoc.info/gems/hanami-view/Hanami/Layout
268
- # @see http://rdoc.info/gems/hanami-view/Hanami/View/Configuration:layout
269
- #
270
- # @example Getting the value
271
- # require 'hanami'
272
- #
273
- # module Bookshelf
274
- # class Application < Hanami::Application
275
- # end
276
- # end
277
- #
278
- # Bookshelf::Application.configuration.layout # => nil
279
- #
280
- # # All the views will render without a layout
281
- #
282
- # @example Setting the value
283
- # require 'hanami'
284
- #
285
- # module Bookshelf
286
- # class Application < Hanami::Application
287
- # configure do
288
- # layout :application
289
- # end
290
- # end
291
- #
292
- # module Views
293
- # module Dashboard
294
- # class Index
295
- # include Bookshelf::Views
296
- # end
297
- #
298
- # class JsonIndex < Index
299
- # layout nil
300
- # end
301
- # end
302
- # end
303
- # end
304
- #
305
- # Bookshelf::Application.configuration.namespace layout => :application
306
- #
307
- # # All the views will use Bookshelf::Views::ApplicationLayout, unless
308
- # # they set a different value.
309
- #
310
- # Bookshelf::Views::Dashboard::Index.layout
311
- # # => Bookshelf::Views::ApplicationLayout
312
- #
313
- # Bookshelf::Views::Dashboard::JsonIndex.layout
314
- # # => Hanami::View::Rendering::NullLayout
315
- def layout(value = nil)
316
- if value
317
- @layout = value
318
- else
319
- @layout
320
- end
321
- end
322
-
323
- # Templates root.
324
- # The application will recursively look for templates under this path.
325
- #
326
- # By default it's equal to the application `root`.
327
- #
328
- # Otherwise, you can specify a different relative path under `root`.
329
- #
330
- # This is part of a DSL, for this reason when this method is called with
331
- # an argument, it will set the corresponding instance variable. When
332
- # called without, it will return the already set value, or the default.
333
- #
334
- # @overload templates(value)
335
- # Sets the given value
336
- # @param value [String] the relative path to the templates root.
337
- #
338
- # @overload templates
339
- # Gets the value
340
- # @return [Pathname] templates root
341
- #
342
- # @since 0.1.0
343
- #
344
- # @see Hanami::Configuration#root
345
- # @see http://rdoc.info/gems/hanami-view/Hanami/View/Configuration:root
346
- #
347
- # @example Getting the value
348
- # require 'hanami'
349
- #
350
- # module Bookshelf
351
- # class Application < Hanami::Application
352
- # end
353
- # end
354
- #
355
- # Bookshelf::Application.configuration.templates
356
- # # => #<Pathname:/root/path>
357
- #
358
- # @example Setting the value
359
- # require 'hanami'
360
- #
361
- # module Bookshelf
362
- # class Application < Hanami::Application
363
- # configure do
364
- # templates 'app/templates'
365
- # end
366
- # end
367
- # end
368
- #
369
- # Bookshelf::Application.configuration.templates
370
- # # => #<Pathname:/root/path/app/templates>
371
- def templates(value = nil)
372
- if value
373
- @templates = value
374
- else
375
- root.join @templates.to_s
376
- end
377
- end
378
-
379
- # The application will serve the static assets under these directories.
380
- #
381
- # By default it's equal to the `public/` directory under the application
382
- # `root`.
383
- #
384
- # Otherwise, you can add different relatives paths under `root`.
385
- #
386
- # @overload assets
387
- # Gets the value
388
- # @return [Hanami::Config::Assets] assets root
389
- #
390
- # @since 0.1.0
391
- #
392
- # @example Getting the value
393
- # require 'hanami'
394
- #
395
- # module Bookshelf
396
- # class Application < Hanami::Application
397
- # end
398
- # end
399
- #
400
- # Bookshelf::Application.configuration.assets
401
- # # => #<Pathname:/root/path/public>
402
- #
403
- # @example Adding new assets paths
404
- # require 'hanami'
405
- #
406
- # module Bookshelf
407
- # class Application < Hanami::Application
408
- # configure do
409
- # assets do
410
- # sources << [
411
- # 'vendor/assets'
412
- # ]
413
- # end
414
- # end
415
- # end
416
- # end
417
- #
418
- # Bookshelf::Application.configuration.assets
419
- # # => #<Hanami::Config::Assets @root=#<Pathname:/root/path/assets>, @paths=["public"]>
420
- def assets(&blk)
421
- if @assets
422
- @assets.__add(&blk)
423
- else
424
- @assets ||= Config::FrameworkConfiguration.new(&blk)
425
- end
426
- end
427
-
428
- # Configure cookies
429
- # Enable cookies (disabled by default).
430
- #
431
- # This is part of a DSL, for this reason when this method is called with
432
- # an argument, it will set the corresponding instance variable. When
433
- # called without, it will return the already set value, or the default.
434
- #
435
- # @overload cookies(options)
436
- # Sets the given value with their options.
437
- # @param options [Hash, TrueClass, FalseClass]
438
- #
439
- # @overload cookies
440
- # Gets the value.
441
- # @return [Hanami::Config::Cookies]
442
- #
443
- # @example Getting the value
444
- # require 'hanami'
445
- #
446
- # module Bookshelf
447
- # class Application < Hanami::Application
448
- # end
449
- # end
450
- #
451
- # Bookshelf::Application.configuration.cookies
452
- # # => #<Hanami::Config::Cookies:0x0000000329f880 @options={}, @default_options={:httponly=>true, :secure=>false}>
453
- #
454
- # @example Setting the value
455
- # require 'hanami'
456
- #
457
- # module Bookshelf
458
- # class Application < Hanami::Application
459
- # configure do
460
- # cookies domain: 'hanamirb.org'
461
- # end
462
- # end
463
- # end
464
- #
465
- # Bookshelf::Application.configuration.cookies
466
- # # => #<Hanami::Config::Cookies:0x0000000329f880 @options={:domain=>'hanamirb.org'}, @default_options={:domain=>'hanamirb.org', :httponly=>true, :secure=>false}>
467
- def cookies(options = nil)
468
- if options.nil?
469
- @cookies ||= Config::Cookies.new(self, options)
470
- else
471
- @cookies = Config::Cookies.new(self, options)
472
- end
473
- end
474
-
475
- # Configure sessions
476
- # Enable sessions (disabled by default).
477
- #
478
- # This is part of a DSL, for this reason when this method is called with
479
- # an argument, it will set the corresponding instance variable. When
480
- # called without, it will return the already set value, or the default.
481
- #
482
- # Given Class as adapter it will be used as sessions middleware.
483
- # Given String as adapter it will be resolved as class name and used as
484
- # sessions middleware.
485
- # Given Symbol as adapter it is assumed it's name of the class under
486
- # Rack::Session namespace that will be used as sessions middleware
487
- # (e.g. :cookie for Rack::Session::Cookie).
488
- #
489
- # By default options include domain inferred from host configuration, and
490
- # secure flag inferred from scheme configuration.
491
- #
492
- # @overload sessions(adapter, options)
493
- # Sets the given value.
494
- # @param adapter [Class, String, Symbol] Rack middleware for sessions management
495
- # @param options [Hash] options to pass to sessions middleware
496
- #
497
- # @overload sessions(false)
498
- # Disables sessions
499
- #
500
- # @overload sessions
501
- # Gets the value.
502
- # @return [Hanami::Config::Sessions] sessions configuration
503
- #
504
- # @since 0.2.0
505
- #
506
- # @see Hanami::Configuration#host
507
- # @see Hanami::Configuration#scheme
508
- #
509
- # @example Getting the value
510
- # require 'hanami'
511
- #
512
- # module Bookshelf
513
- # class Application < Hanami::Application
514
- # end
515
- # end
516
- #
517
- # Bookshelf::Application.configuration.sessions
518
- # # => #<Hanami::Config::Sessions:0x00000001ca0c28 @enabled=false>
519
- #
520
- # @example Setting the value with symbol
521
- # require 'hanami'
522
- #
523
- # module Bookshelf
524
- # class Application < Hanami::Application
525
- # configure do
526
- # sessions :cookie, secret: 'abc123'
527
- # end
528
- # end
529
- # end
530
- #
531
- # Bookshelf::Application.configuration.sessions
532
- # # => #<Hanami::Config::Sessions:0x00000001589458 @enabled=true, @adapter=:cookie, @options={:domain=>"localhost", :secure=>false}>
533
- #
534
- # @example Disabling previously enabled sessions
535
- # require 'hanami'
536
- #
537
- # module Bookshelf
538
- # class Application < Hanami::Application
539
- # configure do
540
- # sessions :cookie
541
- # sessions false
542
- # end
543
- # end
544
- # end
545
- #
546
- # Bookshelf::Application.configuration.sessions
547
- # # => #<Hanami::Config::Sessions:0x00000002460d78 @enabled=false>
548
- #
549
- def sessions(adapter = nil, options = {})
550
- if adapter.nil?
551
- @sessions ||= Config::Sessions.new
552
- else
553
- @sessions = Config::Sessions.new(adapter, options, self)
554
- end
555
- end
556
-
557
- # Application load paths
558
- # The application will recursively load all the Ruby files under these paths.
559
- #
560
- # By default it's empty in order to allow developers to decide their own
561
- # app structure.
562
- #
563
- # @return [Hanami::Config::LoadPaths] a set of load paths
564
- #
565
- # @since 0.1.0
566
- #
567
- # @see Hanami::Configuration#root
568
- #
569
- # @example Getting the value
570
- # require 'hanami'
571
- #
572
- # module Bookshelf
573
- # class Application < Hanami::Application
574
- # end
575
- # end
576
- #
577
- # Bookshelf::Application.configuration.load_paths
578
- # # => #<Hanami::Config::LoadPaths:0x007ff4fa212310 @paths=[]>
579
- #
580
- # @example Setting the value
581
- # require 'hanami'
582
- #
583
- # module Bookshelf
584
- # class Application < Hanami::Application
585
- # configure do
586
- # load_paths << [
587
- # 'app/controllers',
588
- # 'app/views
589
- # ]
590
- # end
591
- # end
592
- # end
593
- #
594
- # Bookshelf::Application.configuration.assets
595
- # # => #<Hanami::Config::LoadPaths:0x007fe3a20b18e0 @paths=[["app/controllers", "app/views"]]>
596
- def load_paths
597
- @load_paths ||= Config::LoadPaths.new
598
- end
599
-
600
- # Application routes.
601
- #
602
- # Specify a set of routes for the application, by passing a block, or a
603
- # relative path where to find the file that describes them.
604
- #
605
- # By default it's `nil`.
606
- #
607
- # This is part of a DSL, for this reason when this method is called with
608
- # an argument, it will set the corresponding instance variable. When
609
- # called without, it will return the already set value, or the default.
610
- #
611
- # @overload routes(blk)
612
- # Specify a set of routes in the given block
613
- # @param blk [Proc] the routes definitions
614
- #
615
- # @overload routes(path)
616
- # Specify a relative path where to find the routes file
617
- # @param path [String] the relative path
618
- #
619
- # @overload routes
620
- # Gets the value
621
- # @return [Hanami::Config::Routes] the set of routes
622
- #
623
- # @since 0.1.0
624
- #
625
- # @see http://rdoc.info/gems/hanami-router/Hanami/Router
626
- #
627
- # @example Getting the value
628
- # require 'hanami'
629
- #
630
- # module Bookshelf
631
- # class Application < Hanami::Application
632
- # end
633
- # end
634
- #
635
- # Bookshelf::Application.configuration.routes
636
- # # => nil
637
- #
638
- # @example Setting the value, by passing a block
639
- # require 'hanami'
640
- #
641
- # module Bookshelf
642
- # class Application < Hanami::Application
643
- # configure do
644
- # routes do
645
- # get '/', to: 'dashboard#index'
646
- # resources :books
647
- # end
648
- # end
649
- # end
650
- # end
651
- #
652
- # Bookshelf::Application.configuration.routes
653
- # # => #<Hanami::Config::Routes:0x007ff50a991388 @blk=#<Proc:0x007ff50a991338@(irb):4>, @path=#<Pathname:.>>
654
- #
655
- # @example Setting the value, by passing a relative path
656
- # require 'hanami'
657
- #
658
- # module Bookshelf
659
- # class Application < Hanami::Application
660
- # configure do
661
- # routes 'config/routes'
662
- # end
663
- # end
664
- # end
665
- #
666
- # Bookshelf::Application.configuration.routes
667
- # # => #<Hanami::Config::Routes:0x007ff50a991388 @blk=nil, @path=#<Pathname:config/routes.rb>>
668
- def routes(path = nil, &blk)
669
- if path or block_given?
670
- @routes = Config::Routes.new(root, path, &blk)
671
- else
672
- @routes
673
- end
674
- end
675
-
676
- # Body parsing configuration.
677
- #
678
- # Specify a set of parsers for specific mime types that your application will use. This method will
679
- # return the application's parsers which you can use to add existing and new custom parsers for your
680
- # application to use.
681
- #
682
- # By default it's an empty `Array`
683
- #
684
- # This is part of a DSL, for this reason when this method is called with
685
- # an argument, it will set the corresponding instance variable. When
686
- # called without, it will return the already set value, or the default.
687
- #
688
- # @overload body_parsers(parsers)
689
- # Specify a set of body parsers.
690
- # @param parsers [Array] the body parser definitions
691
- #
692
- # @overload body_parsers
693
- # Gets the value
694
- # @return [Array] the set of parsers
695
- #
696
- # @since 0.2.0
697
- #
698
- # @example Getting the value
699
- # require 'hanami'
700
- #
701
- # module Bookshelf
702
- # class Application < Hanami::Application
703
- # end
704
- # end
705
- #
706
- # Bookshelf::Application.configuration.body_parsers
707
- # # => []
708
- #
709
- # @example Setting the value
710
- # require 'hanami'
711
- #
712
- # module Bookshelf
713
- # class Application < Hanami::Application
714
- # configure do
715
- # body_parsers :json, XmlParser.new
716
- # end
717
- # end
718
- # end
719
- #
720
- # Bookshelf::Application.configuration.body_parsers
721
- # # => [:json, XmlParser.new]
722
- #
723
- # @example Setting a new value after one is set.
724
- # require 'hanami'
725
- #
726
- # module Bookshelf
727
- # class Application < Hanami::Application
728
- # configure do
729
- # body_parsers :json
730
- # body_parsers XmlParser.new
731
- # end
732
- # end
733
- # end
734
- #
735
- # Bookshelf::Application.configuration.body_parsers
736
- # # => [XmlParser.new]
737
- #
738
- def body_parsers(*parsers)
739
- if parsers.empty?
740
- @body_parsers ||= []
741
- else
742
- @body_parsers = parsers
743
- end
744
- end
745
-
746
- # Application middleware.
747
- #
748
- # Specify middleware that your application will use. This method will return
749
- # the application's underlying Middleware stack which you can use to add new
750
- # middleware for your application to use. By default, the middleware stack
751
- # will contain only `Rack::Static` and `Rack::MethodOverride`. However, if
752
- # `assets false` was specified # in the configuration block, the default
753
- # `Rack::Static` will be removed.
754
- #
755
- # @since 0.2.0
756
- #
757
- # @see http://rdoc.info/gems/rack/Rack/Static
758
- # @see Hanami::Middleware#use
759
- #
760
- # @example
761
- # require 'hanami'
762
- #
763
- # module Bookshelf
764
- # class Application < Hanami::Application
765
- # configure do
766
- # middleware.use Rack::MethodOverride, nil, 'max-age=0, private, must-revalidate'
767
- # middleware.use Rack::ETag
768
- # end
769
- # end
770
- # end
771
- def middleware
772
- @middleware ||= Hanami::Middleware.new(self)
773
- end
774
-
775
- # Application collection mapping.
776
- #
777
- # Specify a set of collections for the application, by passing a block, or a
778
- # relative path where to find the file that describes them.
779
- #
780
- # By default it's `nil`.
781
- #
782
- # This is part of a DSL, for this reason when this method is called with
783
- # an argument, it will set the corresponding instance variable. When
784
- # called without, it will return the already set value, or the default.
785
- #
786
- # @overload mapping(blk)
787
- # Specify a set of mapping in the given block
788
- # @param blk [Proc] the mapping definitions
789
- #
790
- # @overload mapping(path)
791
- # Specify a relative path where to find the mapping file
792
- # @param path [String] the relative path
793
- #
794
- # @overload mapping
795
- # Gets the value
796
- # @return [Hanami::Config::Mapping] the set of mappings
797
- #
798
- # @since 0.2.0
799
- #
800
- # @see http://rdoc.info/gems/hanami-model/Hanami/Mapper
801
- #
802
- # @example Getting the value
803
- # require 'hanami'
804
- #
805
- # module Bookshelf
806
- # class Application < Hanami::Application
807
- # end
808
- # end
809
- #
810
- # Bookshelf::Application.configuration.mapping
811
- # # => nil
812
- #
813
- # @example Setting the value, by passing a block
814
- # require 'hanami'
815
- #
816
- # module Bookshelf
817
- # class Application < Hanami::Application
818
- # configure do
819
- # mapping do
820
- # collection :users do
821
- # entity User
822
- #
823
- # attribute :id, Integer
824
- # attribute :name, String
825
- # end
826
- # end
827
- # end
828
- # end
829
- # end
830
- #
831
- # Bookshelf::Application.configuration.mapping
832
- # # => #<Hanami::Config::Mapping:0x007ff50a991388 @blk=#<Proc:0x007ff123991338@(irb):4>, @path=#<Pathname:.>>
833
- #
834
- # @example Setting the value, by passing a relative path
835
- # require 'hanami'
836
- #
837
- # module Bookshelf
838
- # class Application < Hanami::Application
839
- # configure do
840
- # mapping 'config/mapping'
841
- # end
842
- # end
843
- # end
844
- #
845
- # Bookshelf::Application.configuration.mapping
846
- # # => #<Hanami::Config::Routes:0x007ff50a991388 @blk=nil, @path=#<Pathname:config/mapping.rb>>
847
- def mapping(path = nil, &blk)
848
- if path or block_given?
849
- @mapping = Config::Mapping.new(root, path, &blk)
850
- else
851
- @mapping
852
- end
853
- end
854
-
855
- # Adapter configuration.
856
- # The application will instantiate adapter instance based on this configuration.
857
- #
858
- # The given options must have key pairs :type and :uri
859
- # If it isn't, at the runtime the framework will raise a
860
- # `ArgumentError`.
861
- #
862
- # This is part of a DSL, for this reason when this method is called with
863
- # an argument, it will set the corresponding instance variable. When
864
- # called without, it will return the already set value, or the default.
865
- #
866
- # @overload adapter(options)
867
- # Sets the given type and uri
868
- # @param options [Hash] a set of options for adapter
869
- #
870
- # @overload adapter
871
- # Gets the value
872
- # @return [Hash] adapter options
873
- #
874
- # @since 0.2.0
875
- #
876
- # @see Hanami::Configuration#adapter
877
- # @see http://rdoc.info/gems/hanami-model/Hanami/Model/Configuration:adapter
878
- #
879
- # @example
880
- # require 'hanami'
881
- #
882
- # module Bookshelf
883
- # class Application < Hanami::Application
884
- # configure do
885
- # adapter type: :sql, uri: 'sqlite3://uri'
886
- # end
887
- # end
888
- # end
889
- #
890
- # Bookshelf::Application.configuration.adapter
891
- # # => {type: :sql, uri: 'sqlite3://uri'}
892
- def adapter(options = {})
893
- if !options.empty?
894
- @adapter = options
895
- else
896
- @adapter
897
- end
898
- end
899
-
900
- # Set a format as default fallback for all the requests without a strict
901
- # requirement for the mime type.
902
- #
903
- # The given format must be coercible to a symbol, and be a valid mime type
904
- # alias. If it isn't, at the runtime the framework will raise a
905
- # `Hanami::Controller::UnknownFormatError`.
906
- #
907
- # By default this value is `:html`.
908
- #
909
- # This is part of a DSL, for this reason when this method is called with
910
- # an argument, it will set the corresponding instance variable. When
911
- # called without, it will return the already set value, or the default.
912
- #
913
- # @overload default_request_format(format)
914
- # Sets the given value
915
- # @param format [#to_sym] the symbol format
916
- # @raise [TypeError] if it cannot be coerced to a symbol
917
- #
918
- # @overload default_request_format
919
- # Gets the value
920
- # @return [Symbol]
921
- #
922
- # @since 0.5.0
923
- #
924
- # @see http://rdoc.info/gems/hanami-controller/Hanami/Controller/Configuration#default_request_format
925
- #
926
- # @example Getting the value
927
- # require 'hanami'
928
- #
929
- # module Bookshelf
930
- # class Application < Hanami::Application
931
- # end
932
- # end
933
- #
934
- # Bookshelf::Application.configuration.default_request_format # => :html
935
- #
936
- # @example Setting the value
937
- # require 'hanami'
938
- #
939
- # module Bookshelf
940
- # class Application < Hanami::Application
941
- # configure do
942
- # default_request_format :json
943
- # end
944
- # end
945
- # end
946
- #
947
- # Bookshelf::Application.configuration.default_request_format # => :json
948
- def default_request_format(format = nil)
949
- if format
950
- @default_request_format = Utils::Kernel.Symbol(format)
951
- else
952
- @default_request_format || :html
953
- end
954
- end
955
-
956
- # Set a format to be used for all responses regardless of the request type.
957
- #
958
- # The given format must be coercible to a symbol, and be a valid mime type
959
- # alias. If it isn't, at the runtime the framework will raise a
960
- # `Hanami::Controller::UnknownFormatError`.
961
- #
962
- # By default this value is `:html`.
963
- #
964
- # This is part of a DSL, for this reason when this method is called with
965
- # an argument, it will set the corresponding instance variable. When
966
- # called without, it will return the already set value, or the default.
967
- #
968
- # @overload default_response_format(format)
969
- # Sets the given value
970
- # @param format [#to_sym] the symbol format
971
- # @raise [TypeError] if it cannot be coerced to a symbol
972
- #
973
- # @overload default_response_format
974
- # Gets the value
975
- # @return [Symbol,nil]
976
- #
977
- # @since 0.5.0
978
- #
979
- # @see http://rdoc.info/gems/hanami-controller/Hanami/Controller/Configuration#default_response_format
980
- #
981
- # @example Getting the value
982
- # require 'hanami'
983
- #
984
- # module Bookshelf
985
- # class Application < Hanami::Application
986
- # end
987
- # end
988
- #
989
- # Bookshelf::Application.configuration.default_response_format # => :html
990
- #
991
- # @example Setting the value
992
- # require 'hanami'
993
- #
994
- # module Bookshelf
995
- # class Application < Hanami::Application
996
- # configure do
997
- # default_response_format :json
998
- # end
999
- # end
1000
- # end
1001
- #
1002
- # Bookshelf::Application.configuration.default_response_format # => :json
1003
- def default_response_format(format = nil)
1004
- if format
1005
- @default_response_format = Utils::Kernel.Symbol(format)
1006
- else
1007
- @default_response_format
1008
- end
1009
- end
1010
-
1011
- # Set a format as default fallback for all the requests without a strict
1012
- # requirement for the mime type.
1013
- #
1014
- # @since 0.1.0
1015
- #
1016
- # @deprecated Use {#default_request_format} instead.
1017
- def default_format(format = nil)
1018
- Hanami::Utils::Deprecation.new('default_format is deprecated, please use default_request_format')
1019
- default_request_format(format)
1020
- end
1021
-
1022
- # The URI scheme for this application.
1023
- # This is used by the router helpers to generate absolute URLs.
1024
- #
1025
- # By default this value is `"http"`.
1026
- #
1027
- # This is part of a DSL, for this reason when this method is called with
1028
- # an argument, it will set the corresponding instance variable. When
1029
- # called without, it will return the already set value, or the default.
1030
- #
1031
- # @overload scheme(value)
1032
- # Sets the given value
1033
- # @param value [String] the URI scheme
1034
- #
1035
- # @overload scheme
1036
- # Gets the value
1037
- # @return [String]
1038
- #
1039
- # @since 0.1.0
1040
- #
1041
- # @see http://en.wikipedia.org/wiki/URI_scheme
1042
- #
1043
- # @example Getting the value
1044
- # require 'hanami'
1045
- #
1046
- # module Bookshelf
1047
- # class Application < Hanami::Application
1048
- # end
1049
- # end
1050
- #
1051
- # Bookshelf::Application.configuration.scheme # => "http"
1052
- #
1053
- # @example Setting the value
1054
- # require 'hanami'
1055
- #
1056
- # module Bookshelf
1057
- # class Application < Hanami::Application
1058
- # configure do
1059
- # scheme 'https'
1060
- # end
1061
- # end
1062
- # end
1063
- #
1064
- # Bookshelf::Application.configuration.scheme # => "https"
1065
- def scheme(value = nil)
1066
- if value
1067
- @scheme = value
1068
- else
1069
- @scheme ||= 'http'
1070
- end
1071
- end
1072
-
1073
- # Check if the application uses SSL
1074
- #
1075
- # @return [FalseClass,TrueClass] the result of the check
1076
- #
1077
- # @since 0.2.0
1078
- #
1079
- # @see Hanami::Configuration#scheme
1080
- def ssl?
1081
- scheme == SSL_SCHEME
1082
- end
1083
-
1084
- # The URI host for this application.
1085
- # This is used by the router helpers to generate absolute URLs.
1086
- #
1087
- # By default this value is `"localhost"`.
1088
- #
1089
- # This is part of a DSL, for this reason when this method is called with
1090
- # an argument, it will set the corresponding instance variable. When
1091
- # called without, it will return the already set value, or the default.
1092
- #
1093
- # @overload host(value)
1094
- # Sets the given value
1095
- # @param value [String] the URI host
1096
- #
1097
- # @overload scheme
1098
- # Gets the value
1099
- # @return [String]
1100
- #
1101
- # @since 0.1.0
1102
- #
1103
- # @see http://en.wikipedia.org/wiki/URI_scheme
1104
- #
1105
- # @example Getting the value
1106
- # require 'hanami'
1107
- #
1108
- # module Bookshelf
1109
- # class Application < Hanami::Application
1110
- # end
1111
- # end
1112
- #
1113
- # Bookshelf::Application.configuration.host # => "localhost"
1114
- #
1115
- # @example Setting the value
1116
- # require 'hanami'
1117
- #
1118
- # module Bookshelf
1119
- # class Application < Hanami::Application
1120
- # configure do
1121
- # host 'bookshelf.org'
1122
- # end
1123
- # end
1124
- # end
1125
- #
1126
- # Bookshelf::Application.configuration.host # => "bookshelf.org"
1127
- def host(value = nil)
1128
- if value
1129
- @host = value
1130
- else
1131
- @host ||= @env.host
1132
- end
1133
- end
1134
-
1135
- # The URI port for this application.
1136
- # This is used by the router helpers to generate absolute URLs.
1137
- #
1138
- # By default this value is `2300`.
1139
- #
1140
- # This is part of a DSL, for this reason when this method is called with
1141
- # an argument, it will set the corresponding instance variable. When
1142
- # called without, it will return the already set value, or the default.
1143
- #
1144
- # @overload port(value)
1145
- # Sets the given value
1146
- # @param value [#to_int] the URI port
1147
- # @raise [TypeError] if the given value cannot be coerced to Integer
1148
- #
1149
- # @overload scheme
1150
- # Gets the value
1151
- # @return [String]
1152
- #
1153
- # @since 0.1.0
1154
- #
1155
- # @see http://en.wikipedia.org/wiki/URI_scheme
1156
- #
1157
- # @example Getting the value
1158
- # require 'hanami'
1159
- #
1160
- # module Bookshelf
1161
- # class Application < Hanami::Application
1162
- # end
1163
- # end
1164
- #
1165
- # Bookshelf::Application.configuration.port # => 2300
1166
- #
1167
- # @example Setting the value
1168
- # require 'hanami'
1169
- #
1170
- # module Bookshelf
1171
- # class Application < Hanami::Application
1172
- # configure do
1173
- # port 8080
1174
- # end
1175
- # end
1176
- # end
1177
- #
1178
- # Bookshelf::Application.configuration.port # => 8080
1179
- def port(value = nil)
1180
- if value
1181
- @port = Integer(value)
1182
- else
1183
- @port || @env.port
1184
- end
1185
- end
1186
-
1187
- # Defines a relative pattern to find controllers.
1188
- #
1189
- # Hanami supports multiple architectures (aka application structures), this
1190
- # setting helps to understand the namespace where to find applications'
1191
- # controllers and actions.
1192
- #
1193
- # By default this equals to <tt>"Controllers::%{controller}::%{action}"</tt>
1194
- # That means controllers must be structured like this:
1195
- # <tt>Bookshelf::Controllers::Dashboard::Index</tt>, where <tt>Bookshelf</tt>
1196
- # is the application module, <tt>Controllers</tt> is the first value
1197
- # specified in the pattern, <tt>Dashboard</tt> the controller and
1198
- # <tt>Index</tt> the action.
1199
- #
1200
- # This pattern MUST always contain <tt>"%{controller}"</tt> and <tt>%{action}</tt>.
1201
- # This pattern SHOULD be used accordingly to <tt>#view_pattern</tt> value.
1202
- #
1203
- # This is part of a DSL, for this reason when this method is called with
1204
- # an argument, it will set the corresponding instance variable. When
1205
- # called without, it will return the already set value, or the default.
1206
- #
1207
- # @overload controller_pattern(value)
1208
- # Sets the given value
1209
- # @param value [String] the controller pattern
1210
- #
1211
- # @overload controller_pattern
1212
- # Gets the value
1213
- # @return [String]
1214
- #
1215
- # @since 0.1.0
1216
- #
1217
- # @see Hanami::Configuration#view_pattern
1218
- #
1219
- # @example Getting the value
1220
- # require 'hanami'
1221
- #
1222
- # module Bookshelf
1223
- # class Application < Hanami::Application
1224
- # configure do
1225
- # routes do
1226
- # get '/', to: 'dashboard#index'
1227
- # end
1228
- # end
1229
- # end
1230
- #
1231
- # module Controllers::Dashboard
1232
- # class Index
1233
- # include Bookshelf::Action
1234
- #
1235
- # def call(params)
1236
- # # ...
1237
- # end
1238
- # end
1239
- # end
1240
- # end
1241
- #
1242
- # Bookshelf::Application.configuration.controller_pattern
1243
- # # => "Controllers::%{controller}::%{action}"
1244
- #
1245
- # # All the controllers MUST live under Bookshelf::Controllers
1246
- #
1247
- # # GET '/' # => Bookshelf::Controllers::Dashboard::Index
1248
- #
1249
- # @example Setting the value
1250
- # require 'hanami'
1251
- #
1252
- # module Bookshelf
1253
- # class Application < Hanami::Application
1254
- # configure do
1255
- # controller_pattern "%{controller}Controller::%{action}"
1256
- #
1257
- # routes do
1258
- # get '/', to: 'dashboard#index'
1259
- # end
1260
- # end
1261
- # end
1262
- #
1263
- # module DashboardController
1264
- # class Index
1265
- # include Bookshelf::Action
1266
- #
1267
- # def call(params)
1268
- # end
1269
- # end
1270
- # end
1271
- # end
1272
- #
1273
- # Bookshelf::Application.configuration.controller_pattern
1274
- # # => "%{controller}Controller::%{action}"
1275
- #
1276
- # # All the controllers are directly under the Bookshelf module
1277
- #
1278
- # # GET '/' # => Bookshelf::DashboardController::Index
1279
- #
1280
- # @example Setting the value for a top level name structure
1281
- # require 'hanami'
1282
- #
1283
- # module Bookshelf
1284
- # class Application < Hanami::Application
1285
- # configure do
1286
- # namespace Object
1287
- # controller_pattern "%{controller}Controller::%{action}"
1288
- #
1289
- # routes do
1290
- # get '/', to: 'dashboard#index'
1291
- # end
1292
- # end
1293
- # end
1294
- # end
1295
- #
1296
- # module DashboardController
1297
- # class Index
1298
- # include Bookshelf::Action
1299
- #
1300
- # def call(params)
1301
- # end
1302
- # end
1303
- # end
1304
- #
1305
- # Bookshelf::Application.configuration.controller_pattern
1306
- # # => "%{controller}Controller::%{action}"
1307
- #
1308
- # # All the controllers are at the top level namespace
1309
- #
1310
- # # GET '/' # => DashboardController::Index
1311
- def controller_pattern(value = nil)
1312
- if value
1313
- @controller_pattern = value
1314
- else
1315
- @controller_pattern ||= 'Controllers::%{controller}::%{action}'
1316
- end
1317
- end
1318
-
1319
- # Defines a relative pattern to find views:.
1320
- #
1321
- # Hanami supports multiple architectures (aka application structures), this
1322
- # setting helps to understand the namespace where to find applications'
1323
- # views:.
1324
- #
1325
- # By default this equals to <tt>"Views::%{controller}::%{action}"</tt>
1326
- # That means views must be structured like this:
1327
- # <tt>Bookshelf::Views::Dashboard::Index</tt>, where <tt>Bookshelf</tt> is
1328
- # the application module, <tt>Views</tt> is the first value specified in the
1329
- # pattern, <tt>Dashboard</tt> a module corresponding to the controller name
1330
- # and <tt>Index</tt> the view, corresponding to the action name.
1331
- #
1332
- # This pattern MUST always contain <tt>"%{controller}"</tt> and <tt>%{action}</tt>.
1333
- # This pattern SHOULD be used accordingly to <tt>#controller_pattern</tt> value.
1334
- #
1335
- # This is part of a DSL, for this reason when this method is called with
1336
- # an argument, it will set the corresponding instance variable. When
1337
- # called without, it will return the already set value, or the default.
1338
- #
1339
- # @overload view_pattern(value)
1340
- # Sets the given value
1341
- # @param value [String] the view pattern
1342
- #
1343
- # @overload controller_pattern
1344
- # Gets the value
1345
- # @return [String]
1346
- #
1347
- # @since 0.1.0
1348
- #
1349
- # @see Hanami::Configuration#controller_pattern
1350
- #
1351
- # @example Getting the value
1352
- # require 'hanami'
1353
- #
1354
- # module Bookshelf
1355
- # class Application < Hanami::Application
1356
- # configure do
1357
- # routes do
1358
- # get '/', to: 'dashboard#index'
1359
- # end
1360
- # end
1361
- # end
1362
- #
1363
- # module Views
1364
- # module Dashboard
1365
- # class Index
1366
- # include Bookshelf::View
1367
- # end
1368
- # end
1369
- # end
1370
- # end
1371
- #
1372
- # Bookshelf::Application.configuration.view_pattern
1373
- # # => "Views::%{controller}::%{action}"
1374
- #
1375
- # # All the views MUST live under Bookshelf::Views
1376
- #
1377
- # # GET '/' # => Bookshelf::Views::Dashboard::Index
1378
- #
1379
- # @example Setting the value
1380
- # require 'hanami'
1381
- #
1382
- # module Bookshelf
1383
- # class Application < Hanami::Application
1384
- # configure do
1385
- # view_pattern "%{controller}::%{action}"
1386
- #
1387
- # routes do
1388
- # get '/', to: 'dashboard#index'
1389
- # end
1390
- # end
1391
- # end
1392
- #
1393
- # module Dashboard
1394
- # class Index
1395
- # include Bookshelf::View
1396
- # end
1397
- # end
1398
- # end
1399
- #
1400
- # Bookshelf::Application.configuration.view_pattern
1401
- # # => "%{controller}::%{action}"
1402
- #
1403
- # # All the views are directly under the Bookshelf module
1404
- #
1405
- # # GET '/' # => Bookshelf::Dashboard::Index
1406
- #
1407
- # @example Setting the value for a top level name structure
1408
- # require 'hanami'
1409
- #
1410
- # module Bookshelf
1411
- # class Application < Hanami::Application
1412
- # configure do
1413
- # namespace Object
1414
- # view_pattern "%{controller}::%{action}"
1415
- #
1416
- # routes do
1417
- # get '/', to: 'dashboard#index'
1418
- # end
1419
- # end
1420
- # end
1421
- # end
1422
- #
1423
- # module Dashboard
1424
- # class Index
1425
- # include Bookshelf::View
1426
- # end
1427
- # end
1428
- #
1429
- # Bookshelf::Application.configuration.view_pattern
1430
- # # => "%{controller}::%{action}"
1431
- #
1432
- # # All the views: are at the top level namespace
1433
- #
1434
- # # GET '/' # => Dashboard::Index
1435
- def view_pattern(value = nil)
1436
- if value
1437
- @view_pattern = value
1438
- else
1439
- @view_pattern ||= 'Views::%{controller}::%{action}'
1440
- end
1441
- end
1442
-
1443
- # Decide if handle exceptions with an HTTP status or let them uncaught
1444
- #
1445
- # If this value is set to `true`, the configured exceptions will return
1446
- # the specified HTTP status, the rest of them with `500`.
1447
- #
1448
- # If this value is set to `false`, the exceptions won't be caught.
1449
- #
1450
- # This is part of a DSL, for this reason when this method is called with
1451
- # an argument, it will set the corresponding instance variable. When
1452
- # called without, it will return the already set value, or the default.
1453
- #
1454
- # @overload handle_exceptions(value)
1455
- # Sets the given value
1456
- # @param value [TrueClass, FalseClass] true or false, default to true
1457
- #
1458
- # @overload handle_exceptions
1459
- # Gets the value
1460
- # @return [TrueClass, FalseClass]
1461
- #
1462
- # @since 0.2.0
1463
- #
1464
- # @see http://rdoc.info/gems/hanami-controller/Hanami/Controller/Configuration:handle_exceptions
1465
- # @see http://httpstatus.es/500
1466
- #
1467
- # @example Enabled (default)
1468
- # require 'hanami'
1469
- #
1470
- # module Bookshelf
1471
- # class Application < Hanami::Application
1472
- # configure do
1473
- # routes do
1474
- # get '/error', to: 'error#index'
1475
- # end
1476
- # end
1477
- #
1478
- # load!
1479
- # end
1480
- #
1481
- # module Controllers::Error
1482
- # class Index
1483
- # include Bookshelf::Action
1484
- #
1485
- # def call(params)
1486
- # raise ArgumentError
1487
- # end
1488
- # end
1489
- # end
1490
- # end
1491
- #
1492
- # # GET '/error' # => 500 - Internal Server Error
1493
- #
1494
- # @example Disabled
1495
- # require 'hanami'
1496
- #
1497
- # module Bookshelf
1498
- # class Application < Hanami::Application
1499
- # configure do
1500
- # handle_exceptions false
1501
- #
1502
- # routes do
1503
- # get '/error', to: 'error#index'
1504
- # end
1505
- # end
1506
- #
1507
- # load!
1508
- # end
1509
- #
1510
- # module Controllers::Error
1511
- # class Index
1512
- # include Bookshelf::Action
1513
- #
1514
- # def call(params)
1515
- # raise ArgumentError
1516
- # end
1517
- # end
1518
- # end
1519
- # end
1520
- #
1521
- # # GET '/error' # => raises ArgumentError
1522
- def handle_exceptions(value = nil)
1523
- if value.nil?
1524
- @handle_exceptions
1525
- else
1526
- @handle_exceptions = value
1527
- end
1528
- end
1529
-
1530
- # It lazily collects all the low level settings for Hanami::Model's
1531
- # configuration and applies them when the application is loaded.
1532
- #
1533
- # NOTE: This forwards all the configurations to Hanami::Model, without
1534
- # checking them. Before to use this feature, please have a look at the
1535
- # current Hanami::Model version installed.
1536
- #
1537
- # NOTE: This may override some configurations of your application.
1538
- #
1539
- # @return [Hanami::Config::FrameworkConfiguration] the configuration
1540
- #
1541
- # @since 0.2.0
1542
- #
1543
- # @see http://www.rubydoc.info/gems/hanami-model/Hanami/Model/Configuration
1544
- #
1545
- # @example Define a setting
1546
- # require 'hanami'
1547
- # require 'hanami/model'
1548
- #
1549
- # module Bookshelf
1550
- # class Application < Hanami::Application
1551
- # configure do
1552
- # model.adapter type: :memory, uri: 'memory://localhost/database'
1553
- # end
1554
- # end
1555
- # end
1556
- #
1557
- # @example Override a setting
1558
- # require 'hanami'
1559
- # require 'hanami/model'
1560
- #
1561
- # module Bookshelf
1562
- # class Application < Hanami::Application
1563
- # configure do
1564
- # adapter type: :sql, uri: 'postgres://localhost/database'
1565
- # model.adapter type: :memory, uri: 'memory://localhost/database'
1566
- # end
1567
- # end
1568
- # end
1569
- #
1570
- # # The memory adapter will override the SQL one
1571
- def model
1572
- @model ||= Config::FrameworkConfiguration.new
1573
- end
1574
-
1575
- # It lazily collects all the low level settings for Hanami::Controller's
1576
- # configuration and applies them when the application is loaded.
1577
- #
1578
- # NOTE: This forwards all the configurations to Hanami::Controller, without
1579
- # checking them. Before to use this feature, please have a look at the
1580
- # current Hanami::Controller version installed.
1581
- #
1582
- # NOTE: This may override some configurations of your application.
1583
- #
1584
- # @return [Hanami::Config::FrameworkConfiguration] the configuration
1585
- #
1586
- # @since 0.2.0
1587
- #
1588
- # @see http://www.rubydoc.info/gems/hanami-controller/Hanami/Controller/Configuration
1589
- #
1590
- # @example Define a setting
1591
- # require 'hanami'
1592
- #
1593
- # module Bookshelf
1594
- # class Application < Hanami::Application
1595
- # configure do
1596
- # controller.default_request_format :json
1597
- # end
1598
- # end
1599
- # end
1600
- #
1601
- # @example Override a setting
1602
- # require 'hanami'
1603
- #
1604
- # module Bookshelf
1605
- # class Application < Hanami::Application
1606
- # configure do
1607
- # handle_exceptions false
1608
- # controller.handle_exceptions true
1609
- # end
1610
- # end
1611
- # end
1612
- #
1613
- # # Exceptions will be handled
1614
- def controller
1615
- @controller ||= Config::FrameworkConfiguration.new
1616
- end
1617
-
1618
- # It lazily collects all the low level settings for Hanami::View's
1619
- # configuration and applies them when the application is loaded.
1620
- #
1621
- # NOTE: This forwards all the configurations to Hanami::View, without
1622
- # checking them. Before to use this feature, please have a look at the
1623
- # current Hanami::View version installed.
1624
- #
1625
- # NOTE: This may override some configurations of your application.
1626
- #
1627
- # @return [Hanami::Config::FrameworkConfiguration] the configuration
1628
- #
1629
- # @since 0.2.0
1630
- #
1631
- # @see http://www.rubydoc.info/gems/hanami-view/Hanami/View/Configuration
1632
- #
1633
- # @example Define a setting
1634
- # require 'hanami'
1635
- #
1636
- # module Bookshelf
1637
- # class Application < Hanami::Application
1638
- # configure do
1639
- # view.layout :application
1640
- # end
1641
- # end
1642
- # end
1643
- #
1644
- # @example Override a setting
1645
- # require 'hanami'
1646
- #
1647
- # module Bookshelf
1648
- # class Application < Hanami::Application
1649
- # configure do
1650
- # layout :application
1651
- # view.layout :backend
1652
- # end
1653
- # end
1654
- # end
1655
- #
1656
- # # It will use `:backend` layout
1657
- def view
1658
- @view ||= Config::FrameworkConfiguration.new
1659
- end
1660
-
1661
- # Defines a Config::Logger instance to the logger configuration.
1662
- #
1663
- # This instance will be used to generate the hanami logger available on application module.
1664
- #
1665
- # @return [Config::Logger] Configure logger instance
1666
- #
1667
- # @since 0.5.0
1668
- #
1669
- # @example Define a logger
1670
- # require 'hanami'
1671
- #
1672
- # module Bookshelf
1673
- # class Application < Hanami::Application
1674
- # configure do
1675
- # logger.stream 'path/to/log/file'
1676
- # end
1677
- # load!
1678
- # end
1679
- #
1680
- # module Controllers::Error
1681
- # class Index
1682
- # include Bookshelf::Action
1683
- #
1684
- # def call(params)
1685
- # Bookshelf::Logger.info "Logging to STDOUT"
1686
- # end
1687
- # end
1688
- # end
1689
- # end
1690
- #
1691
- def logger
1692
- @logger ||= Config::Logger.new
1693
- end
1694
-
1695
- # This options is used as a bridge between container and router application.
1696
- #
1697
- # @return [String, NilClass] path prefix for routes
1698
- #
1699
- # @since 0.4.0
1700
- # @api private
1701
- def path_prefix(value = nil)
1702
- if value.nil?
1703
- @path_prefix
1704
- else
1705
- @path_prefix = value
43
+ def apps
44
+ mounted.each_pair do |klass, app|
45
+ yield(app) if klass.ancestors.include?(Hanami::Application)
1706
46
  end
1707
47
  end
1708
48
 
1709
49
  private
1710
50
 
1711
- # @since 0.2.0
1712
- # @api private
1713
- def evaluate_configurations!
1714
- configurations.each { |c| instance_eval(&c) }
1715
- end
1716
-
1717
- # @since 0.2.0
1718
- # @api private
1719
- def configurations
1720
- [ @blk ] + @configurations[@env.environment]
1721
- end
51
+ attr_reader :settings
1722
52
  end
1723
53
  end