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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +46 -7
- data/README.md +295 -537
- data/hanami-controller.gemspec +3 -3
- data/lib/hanami/action.rb +653 -38
- data/lib/hanami/action/base_params.rb +2 -2
- data/lib/hanami/action/cache.rb +1 -139
- data/lib/hanami/action/cache/cache_control.rb +4 -4
- data/lib/hanami/action/cache/conditional_get.rb +4 -5
- data/lib/hanami/action/cache/directives.rb +1 -1
- data/lib/hanami/action/cache/expires.rb +3 -3
- data/lib/hanami/action/cookie_jar.rb +3 -3
- data/lib/hanami/action/cookies.rb +3 -62
- data/lib/hanami/action/flash.rb +2 -2
- data/lib/hanami/action/glue.rb +5 -31
- data/lib/hanami/action/halt.rb +12 -0
- data/lib/hanami/action/mime.rb +77 -491
- data/lib/hanami/action/params.rb +3 -3
- data/lib/hanami/action/rack/file.rb +1 -1
- data/lib/hanami/action/request.rb +30 -20
- data/lib/hanami/action/response.rb +174 -0
- data/lib/hanami/action/session.rb +8 -117
- data/lib/hanami/action/validatable.rb +2 -2
- data/lib/hanami/controller.rb +0 -210
- data/lib/hanami/controller/configuration.rb +51 -506
- data/lib/hanami/controller/version.rb +1 -1
- metadata +12 -21
- data/lib/hanami/action/callable.rb +0 -92
- data/lib/hanami/action/callbacks.rb +0 -214
- data/lib/hanami/action/configurable.rb +0 -50
- data/lib/hanami/action/exposable.rb +0 -126
- data/lib/hanami/action/exposable/guard.rb +0 -104
- data/lib/hanami/action/head.rb +0 -121
- data/lib/hanami/action/rack.rb +0 -411
- data/lib/hanami/action/rack/callable.rb +0 -47
- data/lib/hanami/action/rack/errors.rb +0 -53
- data/lib/hanami/action/redirect.rb +0 -59
- data/lib/hanami/action/throwable.rb +0 -169
data/lib/hanami/controller.rb
CHANGED
@@ -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
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
433
|
-
|
434
|
-
|
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
|
-
#
|
477
|
-
|
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
|
-
#
|
521
|
-
|
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
|
-
#
|
549
|
-
|
550
|
-
|
551
|
-
|
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.
|
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
|
587
|
-
|
588
|
-
|
589
|
-
|
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.
|
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
|
619
|
-
|
620
|
-
|
621
|
-
|
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
|
-
|
659
|
-
|
660
|
-
|
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
|
-
|
752
|
-
|
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
|