hanami-controller 1.3.3 → 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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -7
  3. data/README.md +295 -537
  4. data/hanami-controller.gemspec +3 -3
  5. data/lib/hanami/action.rb +653 -38
  6. data/lib/hanami/action/base_params.rb +2 -2
  7. data/lib/hanami/action/cache.rb +1 -139
  8. data/lib/hanami/action/cache/cache_control.rb +4 -4
  9. data/lib/hanami/action/cache/conditional_get.rb +4 -5
  10. data/lib/hanami/action/cache/directives.rb +1 -1
  11. data/lib/hanami/action/cache/expires.rb +3 -3
  12. data/lib/hanami/action/cookie_jar.rb +3 -3
  13. data/lib/hanami/action/cookies.rb +3 -62
  14. data/lib/hanami/action/flash.rb +2 -2
  15. data/lib/hanami/action/glue.rb +5 -31
  16. data/lib/hanami/action/halt.rb +12 -0
  17. data/lib/hanami/action/mime.rb +77 -491
  18. data/lib/hanami/action/params.rb +3 -3
  19. data/lib/hanami/action/rack/file.rb +1 -1
  20. data/lib/hanami/action/request.rb +30 -20
  21. data/lib/hanami/action/response.rb +174 -0
  22. data/lib/hanami/action/session.rb +8 -117
  23. data/lib/hanami/action/validatable.rb +2 -2
  24. data/lib/hanami/controller.rb +0 -210
  25. data/lib/hanami/controller/configuration.rb +51 -506
  26. data/lib/hanami/controller/version.rb +1 -1
  27. metadata +12 -21
  28. data/lib/hanami/action/callable.rb +0 -92
  29. data/lib/hanami/action/callbacks.rb +0 -214
  30. data/lib/hanami/action/configurable.rb +0 -50
  31. data/lib/hanami/action/exposable.rb +0 -126
  32. data/lib/hanami/action/exposable/guard.rb +0 -104
  33. data/lib/hanami/action/head.rb +0 -121
  34. data/lib/hanami/action/rack.rb +0 -411
  35. data/lib/hanami/action/rack/callable.rb +0 -47
  36. data/lib/hanami/action/rack/errors.rb +0 -53
  37. data/lib/hanami/action/redirect.rb +0 -59
  38. data/lib/hanami/action/throwable.rb +0 -169
@@ -1,4 +1,3 @@
1
- require 'hanami/utils/class_attribute'
2
1
  require 'hanami/action'
3
2
  require 'hanami/controller/configuration'
4
3
  require 'hanami/controller/version'
@@ -62,214 +61,5 @@ module Hanami
62
61
  super("To use `#{session_method}', add `include Hanami::Action::Session`.")
63
62
  end
64
63
  end
65
-
66
- include Utils::ClassAttribute
67
-
68
- # Framework configuration
69
- #
70
- # @since 0.2.0
71
- # @api private
72
- class_attribute :configuration
73
- self.configuration = Configuration.new
74
-
75
- # Configure the framework.
76
- # It yields the given block in the context of the configuration
77
- #
78
- # @param blk [Proc] the configuration block
79
- #
80
- # @since 0.2.0
81
- #
82
- # @see Hanami::Controller::Configuration
83
- #
84
- # @example
85
- # require 'hanami/controller'
86
- #
87
- # Hanami::Controller.configure do
88
- # handle_exceptions false
89
- # end
90
- def self.configure(&blk)
91
- configuration.instance_eval(&blk)
92
- end
93
-
94
- # Duplicate Hanami::Controller in order to create a new separated instance
95
- # of the framework.
96
- #
97
- # The new instance of the framework will be completely decoupled from the
98
- # original. It will inherit the configuration, but all the changes that
99
- # happen after the duplication, won't be reflected on the other copies.
100
- #
101
- # @return [Module] a copy of Hanami::Controller
102
- #
103
- # @since 0.2.0
104
- # @api private
105
- #
106
- # @example Basic usage
107
- # require 'hanami/controller'
108
- #
109
- # module MyApp
110
- # Controller = Hanami::Controller.dupe
111
- # end
112
- #
113
- # MyApp::Controller == Hanami::Controller # => false
114
- #
115
- # MyApp::Controller.configuration ==
116
- # Hanami::Controller.configuration # => false
117
- #
118
- # @example Inheriting configuration
119
- # require 'hanami/controller'
120
- #
121
- # Hanami::Controller.configure do
122
- # handle_exceptions false
123
- # end
124
- #
125
- # module MyApp
126
- # Controller = Hanami::Controller.dupe
127
- # end
128
- #
129
- # module MyApi
130
- # Controller = Hanami::Controller.dupe
131
- # Controller.configure do
132
- # handle_exceptions true
133
- # end
134
- # end
135
- #
136
- # Hanami::Controller.configuration.handle_exceptions # => false
137
- # MyApp::Controller.configuration.handle_exceptions # => false
138
- # MyApi::Controller.configuration.handle_exceptions # => true
139
- def self.dupe
140
- dup.tap do |duplicated|
141
- duplicated.configuration = configuration.duplicate
142
- end
143
- end
144
-
145
- # Duplicate the framework and generate modules for the target application
146
- #
147
- # @param mod [Module] the Ruby namespace of the application
148
- # @param controllers [String] the optional namespace where the application's
149
- # controllers will live
150
- # @param blk [Proc] an optional block to configure the framework
151
- #
152
- # @return [Module] a copy of Hanami::Controller
153
- #
154
- # @since 0.2.0
155
- #
156
- # @see Hanami::Controller#dupe
157
- # @see Hanami::Controller::Configuration
158
- # @see Hanami::Controller::Configuration#action_module
159
- #
160
- # @example Basic usage
161
- # require 'hanami/controller'
162
- #
163
- # module MyApp
164
- # Controller = Hanami::Controller.duplicate(self)
165
- # end
166
- #
167
- # # It will:
168
- # #
169
- # # 1. Generate MyApp::Controller
170
- # # 2. Generate MyApp::Action
171
- # # 3. Generate MyApp::Controllers
172
- # # 4. Configure MyApp::Action as the default module for actions
173
- #
174
- # module MyApp::Controllers::Dashboard
175
- # include MyApp::Controller
176
- #
177
- # action 'Index' do # this will inject MyApp::Action
178
- # def call(params)
179
- # # ...
180
- # end
181
- # end
182
- # end
183
- #
184
- # @example Compare code
185
- # require 'hanami/controller'
186
- #
187
- # module MyApp
188
- # Controller = Hanami::Controller.duplicate(self) do
189
- # # ...
190
- # end
191
- # end
192
- #
193
- # # it's equivalent to:
194
- #
195
- # module MyApp
196
- # Controller = Hanami::Controller.dupe
197
- # Action = Hanami::Action.dup
198
- #
199
- # module Controllers
200
- # end
201
- #
202
- # Controller.configure do
203
- # action_module MyApp::Action
204
- # end
205
- #
206
- # Controller.configure do
207
- # # ...
208
- # end
209
- # end
210
- #
211
- # @example Custom controllers module
212
- # require 'hanami/controller'
213
- #
214
- # module MyApp
215
- # Controller = Hanami::Controller.duplicate(self, 'Ctrls')
216
- # end
217
- #
218
- # defined?(MyApp::Controllers) # => nil
219
- # defined?(MyApp::Ctrls) # => "constant"
220
- #
221
- # # Developers can namespace controllers under Ctrls
222
- # module MyApp::Ctrls::Dashboard
223
- # # ...
224
- # end
225
- #
226
- # @example Nil controllers module
227
- # require 'hanami/controller'
228
- #
229
- # module MyApp
230
- # Controller = Hanami::Controller.duplicate(self, nil)
231
- # end
232
- #
233
- # defined?(MyApp::Controllers) # => nil
234
- #
235
- # # Developers can namespace controllers under MyApp
236
- # module MyApp::DashboardController
237
- # # ...
238
- # end
239
- #
240
- # @example Block usage
241
- # require 'hanami/controller'
242
- #
243
- # module MyApp
244
- # Controller = Hanami::Controller.duplicate(self) do
245
- # handle_exceptions false
246
- # end
247
- # end
248
- #
249
- # Hanami::Controller.configuration.handle_exceptions # => true
250
- # MyApp::Controller.configuration.handle_exceptions # => false
251
- def self.duplicate(mod, controllers = 'Controllers', &blk)
252
- dupe.tap do |duplicated|
253
- mod.module_eval %{ module #{ controllers }; end } if controllers
254
- mod.module_eval %{ Action = Hanami::Action.dup }
255
-
256
- duplicated.module_eval %{
257
- configure do
258
- action_module #{ mod }::Action
259
- end
260
- }
261
-
262
- duplicated.configure(&blk) if block_given?
263
- end
264
- end
265
-
266
- # Framework loading entry point
267
- #
268
- # @return [void]
269
- #
270
- # @since 0.3.0
271
- def self.load!
272
- configuration.load!
273
- end
274
64
  end
275
65
  end
@@ -44,126 +44,25 @@ module Hanami
44
44
  'text/html' => :html
45
45
  }.freeze
46
46
 
47
- # Return a copy of the configuration of the framework instance associated
48
- # with the given class.
49
- #
50
- # When multiple instances of Hanami::Controller are used in the same
51
- # application, we want to make sure that a controller or an action will
52
- # receive the expected configuration.
53
- #
54
- # @param base [Class, Module] a controller or an action
55
- #
56
- # @return [Hanami::Controller::Configuration] the configuration associated
57
- # to the given class.
58
- #
59
- # @since 0.2.0
60
- # @api private
61
- #
62
- # @example Direct usage of the framework
63
- # require 'hanami/controller'
64
- #
65
- # class Show
66
- # include Hanami::Action
67
- # end
68
- #
69
- # Hanami::Controller::Configuration.for(Show)
70
- # # => will duplicate from Hanami::Controller
71
- #
72
- # @example Multiple instances of the framework
73
- # require 'hanami/controller'
74
- #
75
- # module MyApp
76
- # Controller = Hanami::Controller.duplicate(self)
77
- #
78
- # module Controllers::Dashboard
79
- # class Index
80
- # include MyApp::Action
81
- #
82
- # def call(params)
83
- # # ...
84
- # end
85
- # end
86
- # end
87
- # end
88
- #
89
- # class Show
90
- # include Hanami::Action
91
- # end
92
- #
93
- # Hanami::Controller::Configuration.for(Show)
94
- # # => will duplicate from Hanami::Controller
95
- #
96
- # Hanami::Controller::Configuration.for(MyApp::Controllers::Dashboard)
97
- # # => will duplicate from MyApp::Controller
98
- def self.for(base)
99
- namespace = Utils::String.namespace(base.name)
100
- framework = Utils::Class.load("#{namespace}::Controller") || Utils::Class.load!('Hanami::Controller')
101
- framework.configuration.duplicate
102
- end
103
-
104
47
  # Initialize a configuration instance
105
48
  #
106
49
  # @return [Hanami::Controller::Configuration] a new configuration's
107
50
  # instance
108
51
  #
109
52
  # @since 0.2.0
110
- def initialize
111
- reset!
112
- end
113
-
114
- # @attr_writer handle_exceptions [TrueClass,FalseClass] Handle exceptions
115
- # with an HTTP status or leave them uncaught
116
- #
117
- # @since 0.2.0
118
- #
119
- # @return void
120
- #
121
- # @see Hanami::Controller::Configuration#handle_exceptions
122
- attr_writer :handle_exceptions
123
-
124
- # Handle exceptions with an HTTP status or let them uncaught
125
- #
126
- # If this value is set to `true`, the configured exceptions will return
127
- # the specified HTTP status, the rest of them with `500`.
128
- #
129
- # If this value is set to `false`, the exceptions won't be caught.
130
- #
131
- # This is part of a DSL, for this reason when this method is called with
132
- # an argument, it will set the corresponding instance variable. When
133
- # called without, it will return the already set value, or the default.
134
- #
135
- # @overload handle_exceptions(value)
136
- # Sets the given value
137
- # @param value [TrueClass, FalseClass] true or false, default to true
138
- #
139
- # @overload handle_exceptions
140
- # Gets the value
141
- # @return [TrueClass, FalseClass]
142
- #
143
- # @since 0.2.0
144
- #
145
- # @see Hanami::Controller::Configuration#handle_exception
146
- # @see Hanami::Controller#configure
147
- # @see Hanami::Action::Throwable
148
- # @see http://httpstatus.es/500
149
- #
150
- # @example Getting the value
151
- # require 'hanami/controller'
152
- #
153
- # Hanami::Controller.configuration.handle_exceptions # => true
154
- #
155
- # @example Setting the value
156
- # require 'hanami/controller'
157
- #
158
- # Hanami::Controller.configure do
159
- # handle_exceptions false
160
- # end
161
- def handle_exceptions(value = nil)
162
- if value.nil?
163
- @handle_exceptions
164
- else
165
- @handle_exceptions = value
166
- end
53
+ def initialize(&blk)
54
+ @handled_exceptions = {}
55
+ @formats = DEFAULT_FORMATS.dup
56
+ @mime_types = nil
57
+ @default_request_format = nil
58
+ @default_response_format = nil
59
+ @default_charset = nil
60
+ @default_headers = {}
61
+ @cookies = {}
62
+ @root_directory = ::Pathname.new(Dir.pwd).realpath
63
+ @public_directory = root_directory.join(DEFAULT_PUBLIC_DIRECTORY).to_s
64
+ instance_eval(&blk) unless blk.nil?
65
+ freeze
167
66
  end
168
67
 
169
68
  # Specify how to handle an exception with an HTTP status
@@ -176,7 +75,6 @@ module Hanami
176
75
  #
177
76
  # @since 0.2.0
178
77
  #
179
- # @see Hanami::Controller::Configuration#handle_exceptions
180
78
  # @see Hanami::Controller#configure
181
79
  # @see Hanami::Action::Throwable
182
80
  #
@@ -188,178 +86,6 @@ module Hanami
188
86
  # end
189
87
  def handle_exception(exception)
190
88
  @handled_exceptions.merge!(exception)
191
- _sort_handled_exceptions!
192
- end
193
-
194
- # Return a callable handler for the given exception
195
- #
196
- # @param exception [Exception] an exception
197
- #
198
- # @since 0.3.0
199
- # @api private
200
- #
201
- # @see Hanami::Controller::Configuration#handle_exception
202
- def exception_handler(exception)
203
- exception_handler_for(exception) || DEFAULT_ERROR_CODE
204
- end
205
-
206
- # Check if the given exception is handled.
207
- #
208
- # @param exception [Exception] an exception
209
- #
210
- # @since 0.3.2
211
- # @api private
212
- #
213
- # @see Hanami::Controller::Configuration#handle_exception
214
- def handled_exception?(exception)
215
- handled_exceptions &&
216
- !exception_handler_for(exception).nil?
217
- end
218
-
219
- # Finds configured handler for given exception, or nil if not found.
220
- #
221
- # @param exception [Exception] an exception
222
- #
223
- # @since 1.0.0
224
- # @api private
225
- #
226
- # @see Hanami::Controller::Configuration#handle_exception
227
- def exception_handler_for(exception)
228
- @handled_exceptions.each do |exception_class, handler|
229
- return handler if exception.kind_of?(exception_class)
230
- end
231
-
232
- nil
233
- end
234
-
235
- # Specify which is the default action module to be included when we use
236
- # the `Hanami::Controller.action` method.
237
- #
238
- # This setting is useful when we use multiple instances of the framework
239
- # in the same process, so we want to ensure that the actions will include
240
- # `MyApp::Action`, rather than `AnotherApp::Action`.
241
- #
242
- # If not set, the default value is `Hanami::Action`
243
- #
244
- # This is part of a DSL, for this reason when this method is called with
245
- # an argument, it will set the corresponding instance variable. When
246
- # called without, it will return the already set value, or the default.
247
- #
248
- # @overload action_module(value)
249
- # Sets the given value
250
- # @param value [Module] the module to be included in all the actions
251
- #
252
- # @overload action_module
253
- # Gets the value
254
- # @return [Module]
255
- #
256
- # @since 0.2.0
257
- #
258
- # @see Hanami::Controller::Dsl#action
259
- # @see Hanami::Controller#duplicate
260
- #
261
- # @example Getting the value
262
- # require 'hanami/controller'
263
- #
264
- # Hanami::Controller.configuration.action_module # => Hanami::Action
265
- #
266
- # @example Setting the value
267
- # require 'hanami/controller'
268
- #
269
- # module MyAction
270
- # end
271
- #
272
- # Hanami::Controller.configure do
273
- # action_module MyAction
274
- # end
275
- #
276
- # module Dashboard
277
- # # It includes MyAction, instead of Hanami::Action
278
- # class Index
279
- # include MyAction
280
- #
281
- # def call(params)
282
- # # ...
283
- # end
284
- # end
285
- # end
286
- #
287
- # @example Duplicated framework
288
- # require 'hanami/controller'
289
- #
290
- # module MyApp
291
- # Controller = Hanami::Controller.duplicate(self)
292
- #
293
- # module Controllers::Dashboard
294
- # include MyApp::Controller
295
- #
296
- # # It includes MyApp::Action, instead of Hanami::Action
297
- # class Index
298
- # include MyApp::Action
299
- #
300
- # def call(params)
301
- # # ...
302
- # end
303
- # end
304
- # end
305
- # end
306
- def action_module(value = nil)
307
- if value.nil?
308
- @action_module
309
- else
310
- @action_module = value
311
- end
312
- end
313
-
314
- # Configure the logic to be executed when Hanami::Action is included
315
- # This is useful to DRY code by having a single place where to configure
316
- # shared behaviors like authentication, sessions, cookies etc.
317
- #
318
- # This method can be called multiple times.
319
- #
320
- # @param blk [Proc] the code block
321
- #
322
- # @return [void]
323
- #
324
- # @raise [ArgumentError] if called without passing a block
325
- #
326
- # @since 0.3.0
327
- #
328
- # @see Hanami::Controller.configure
329
- # @see Hanami::Controller.duplicate
330
- #
331
- # @example Configure shared logic.
332
- # require 'hanami/controller'
333
- #
334
- # Hanami::Controller.configure do
335
- # prepare do
336
- # include Hanami::Action::Session
337
- # include MyAuthentication
338
- # use SomeMiddleWare
339
- #
340
- # before { authenticate! }
341
- # end
342
- # end
343
- #
344
- # module Dashboard
345
- # class Index
346
- # # When Hanami::Action is included, it will:
347
- # # * Include `Hanami::Action::Session` and `MyAuthentication`
348
- # # * Configure to use `SomeMiddleWare`
349
- # # * Configure a `before` callback that triggers `#authenticate!`
350
- # include Hanami::Action
351
- #
352
- # def call(params)
353
- # # ...
354
- # end
355
- # end
356
- # end
357
- def prepare(&blk)
358
- if block_given?
359
- @modules.push(blk)
360
- else
361
- raise ArgumentError.new('Please provide a block')
362
- end
363
89
  end
364
90
 
365
91
  # Register a format
@@ -418,7 +144,6 @@ module Hanami
418
144
  symbol, mime_type = *Utils::Kernel.Array(hash)
419
145
 
420
146
  @formats[Utils::Kernel.String(mime_type)] = Utils::Kernel.Symbol(symbol)
421
- @mime_types = nil
422
147
  end
423
148
 
424
149
  # Return the configured format's MIME types
@@ -427,24 +152,10 @@ module Hanami
427
152
  # @api private
428
153
  #
429
154
  # @see Hanami::Controller::Configuration#format
430
- # @see Hanami::Action::Mime::MIME_TYPES
431
155
  def mime_types
432
- @mime_types ||= begin
433
- ((@formats.keys - DEFAULT_FORMATS.keys) +
434
- Hanami::Action::Mime::MIME_TYPES.values).freeze
435
- end
436
- end
437
-
438
- # Restrict the MIME types set only to the given set
439
- #
440
- # @param mime_types [Array] the set of MIME types
441
- #
442
- # @since 1.0.0
443
- # @api private
444
- #
445
- # @see Hanami::Action::Mime::ClassMethods#accept
446
- def restrict_mime_types!(mime_types)
447
- @mime_types = self.mime_types & mime_types
156
+ # FIXME: this isn't efficient. speed it up!
157
+ ((@formats.keys - DEFAULT_FORMATS.keys) +
158
+ Hanami::Action::Mime::TYPES.values).freeze
448
159
  end
449
160
 
450
161
  # Set a format as default fallback for all the requests without a strict
@@ -456,42 +167,17 @@ module Hanami
456
167
  #
457
168
  # By default this value is nil.
458
169
  #
459
- # This is part of a DSL, for this reason when this method is called with
460
- # an argument, it will set the corresponding instance variable. When
461
- # called without, it will return the already set value, or the default.
462
- #
463
- # @overload default_request_format(format)
464
- # Sets the given value
465
- # @param format [#to_sym] the symbol format
466
- # @raise [TypeError] if it cannot be coerced to a symbol
467
- #
468
- # @overload default_request_format
469
- # Gets the value
470
- # @return [Symbol,nil]
471
- #
472
170
  # @since 0.5.0
473
171
  #
474
172
  # @see Hanami::Action::Mime
475
173
  #
476
- # @example Getting the value
477
- # require 'hanami/controller'
478
- #
479
- # Hanami::Controller.configuration.default_request_format # => nil
480
- #
481
- # @example Setting the value
482
- # require 'hanami/controller'
483
- #
484
- # Hanami::Controller.configure do
485
- # default_request_format :html
486
- # end
487
- def default_request_format(format = nil)
488
- if format
489
- @default_request_format = Utils::Kernel.Symbol(format)
490
- else
491
- @default_request_format
492
- end
174
+ # FIXME: new API docs
175
+ def default_request_format=(value)
176
+ @default_request_format = Utils::Kernel.Symbol(value) unless value.nil?
493
177
  end
494
178
 
179
+ attr_reader :default_request_format
180
+
495
181
  # Set a format to be used for all responses regardless of the request type.
496
182
  #
497
183
  # The given format must be coercible to a symbol, and be a valid mime type
@@ -500,42 +186,17 @@ module Hanami
500
186
  #
501
187
  # By default this value is nil.
502
188
  #
503
- # This is part of a DSL, for this reason when this method is called with
504
- # an argument, it will set the corresponding instance variable. When
505
- # called without, it will return the already set value, or the default.
506
- #
507
- # @overload default_response_format(format)
508
- # Sets the given value
509
- # @param format [#to_sym] the symbol format
510
- # @raise [TypeError] if it cannot be coerced to a symbol
511
- #
512
- # @overload default_response_format
513
- # Gets the value
514
- # @return [Symbol,nil]
515
- #
516
189
  # @since 0.5.0
517
190
  #
518
191
  # @see Hanami::Action::Mime
519
192
  #
520
- # @example Getting the value
521
- # require 'hanami/controller'
522
- #
523
- # Hanami::Controller.configuration.default_response_format # => nil
524
- #
525
- # @example Setting the value
526
- # require 'hanami/controller'
527
- #
528
- # Hanami::Controller.configure do
529
- # default_response_format :json
530
- # end
531
- def default_response_format(format = nil)
532
- if format
533
- @default_response_format = Utils::Kernel.Symbol(format)
534
- else
535
- @default_response_format
536
- end
193
+ # FIXME: new API docs
194
+ def default_response_format=(value)
195
+ @default_response_format = Utils::Kernel.Symbol(value) unless value.nil?
537
196
  end
538
197
 
198
+ attr_reader :default_response_format
199
+
539
200
  # Set a charset as default fallback for all the requests without a strict
540
201
  # requirement for the charset.
541
202
  #
@@ -545,24 +206,10 @@ module Hanami
545
206
  #
546
207
  # @see Hanami::Action::Mime
547
208
  #
548
- # @example Getting the value
549
- # require 'hanami/controller'
550
- #
551
- # Hanami::Controller.configuration.default_charset # => nil
552
- #
553
- # @example Setting the value
554
- # require 'hanami/controller'
555
- #
556
- # Hanami::Controller.configure do
557
- # default_charset 'koi8-r'
558
- # end
559
- def default_charset(charset = nil)
560
- if charset
561
- @default_charset = charset
562
- else
563
- @default_charset
564
- end
565
- end
209
+ # FIXME: new API docs
210
+ attr_accessor :default_charset
211
+
212
+ attr_reader :default_headers
566
213
 
567
214
  # Set default headers for all responses
568
215
  #
@@ -578,21 +225,19 @@ module Hanami
578
225
  # @example Setting the value
579
226
  # require 'hanami/controller'
580
227
  #
581
- # Hanami::Controller.configure do
582
- # default_headers({
228
+ # Hanami::Controller::Configuration.new do |config|
229
+ # config.default_headers = {
583
230
  # 'X-Frame-Options' => 'DENY'
584
- # })
231
+ # }
585
232
  # end
586
- def default_headers(headers = nil)
587
- if headers
588
- @default_headers.merge!(
589
- headers.reject {|_,v| v.nil? }
590
- )
591
- else
592
- @default_headers
593
- end
233
+ def default_headers=(headers)
234
+ @default_headers.merge!(
235
+ headers.reject { |_, v| v.nil? }
236
+ )
594
237
  end
595
238
 
239
+ attr_reader :cookies
240
+
596
241
  # Set default cookies options for all responses
597
242
  #
598
243
  # By default this value is an empty hash.
@@ -607,22 +252,18 @@ module Hanami
607
252
  # @example Setting the value
608
253
  # require 'hanami/controller'
609
254
  #
610
- # Hanami::Controller.configure do
611
- # cookies({
255
+ # Hanami::Controller::Configuration.new do |config|
256
+ # config.cookies = {
612
257
  # domain: 'hanamirb.org',
613
258
  # path: '/controller',
614
259
  # secure: true,
615
260
  # httponly: true
616
- # })
261
+ # }
617
262
  # end
618
- def cookies(options = nil)
619
- if options
620
- @cookies.merge!(
621
- options.reject { |_, v| v.nil? }
622
- )
623
- else
624
- @cookies
625
- end
263
+ def cookies=(options)
264
+ @cookies.merge!(
265
+ options.reject { |_, v| v.nil? }
266
+ )
626
267
  end
627
268
 
628
269
  # Returns a format for the given mime type
@@ -655,109 +296,13 @@ module Hanami
655
296
  # @since 1.0.0
656
297
  attr_reader :root_directory
657
298
 
658
- def public_directory(value = nil)
659
- if value.nil?
660
- @public_directory
661
- else
662
- @public_directory = root_directory.join(value).to_s
663
- end
664
- end
665
-
666
- # Duplicate by copying the settings in a new instance.
667
- #
668
- # @return [Hanami::Controller::Configuration] a copy of the configuration
669
- #
670
- # @since 0.2.0
671
- # @api private
672
- def duplicate
673
- Configuration.new.tap do |c|
674
- c.handle_exceptions = handle_exceptions
675
- c.handled_exceptions = handled_exceptions.dup
676
- c.action_module = action_module
677
- c.modules = modules.dup
678
- c.formats = formats.dup
679
- c.default_request_format = default_request_format
680
- c.default_response_format = default_response_format
681
- c.default_charset = default_charset
682
- c.default_headers = default_headers.dup
683
- c.public_directory = public_directory
684
- c.cookies = cookies.dup
685
- end
686
- end
687
-
688
- # Return included modules
689
- #
690
- # @return [Array<Proc>] array of included blocks
691
- #
692
- # @since 0.2.0
693
- # @api private
694
- #
695
- # @see Hanami::Controller::Configuration#prepare
696
- attr_reader :modules
697
-
698
- # Reset all the values to the defaults
699
- #
700
- # @since 0.2.0
701
- # @api private
702
- def reset!
703
- @handle_exceptions = true
704
- @handled_exceptions = {}
705
- @modules = []
706
- @formats = DEFAULT_FORMATS.dup
707
- @mime_types = nil
708
- @default_request_format = nil
709
- @default_response_format = nil
710
- @default_charset = nil
711
- @default_headers = {}
712
- @cookies = {}
713
- @root_directory = ::Pathname.new(Dir.pwd).realpath
714
- @public_directory = root_directory.join(DEFAULT_PUBLIC_DIRECTORY).to_s
715
- @action_module = ::Hanami::Action
716
- end
717
-
718
- # Copy the configuration for the given action
719
- #
720
- # @param base [Class] the target action
721
- #
722
- # @return void
723
- #
724
- # @since 0.3.0
725
- # @api private
726
- #
727
- # @see Hanami::Controller::Configurable.included
728
- def copy!(base)
729
- modules.each do |mod|
730
- base.class_eval(&mod)
731
- end
732
- end
733
-
734
- # Load the framework
735
- #
736
- # @since 0.3.0
737
- # @api private
738
- def load!
739
- freeze
740
- end
741
-
742
- protected
743
- # @since 0.5.0
744
- # @api private
745
- def _sort_handled_exceptions!
746
- @handled_exceptions = Hash[
747
- @handled_exceptions.sort{|(ex1,_),(ex2,_)| ex1.ancestors.include?(ex2) ? -1 : 1 }
748
- ]
299
+ # FIXME: API docs
300
+ def public_directory=(value)
301
+ @public_directory = root_directory.join(value).to_s
749
302
  end
750
303
 
751
- attr_accessor :handled_exceptions
752
- attr_accessor :formats
753
- attr_writer :action_module
754
- attr_writer :modules
755
- attr_writer :default_request_format
756
- attr_writer :default_response_format
757
- attr_writer :default_charset
758
- attr_writer :default_headers
759
- attr_writer :cookies
760
- attr_writer :public_directory
304
+ attr_reader :public_directory
305
+ attr_reader :handled_exceptions
761
306
  end
762
307
  end
763
308
  end