hanami-controller 1.3.2 → 2.0.0.alpha3

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +83 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +299 -537
  5. data/hanami-controller.gemspec +5 -4
  6. data/lib/hanami/action/application_action.rb +112 -0
  7. data/lib/hanami/action/application_configuration/cookies.rb +29 -0
  8. data/lib/hanami/action/application_configuration/sessions.rb +46 -0
  9. data/lib/hanami/action/application_configuration.rb +92 -0
  10. data/lib/hanami/action/base_params.rb +2 -2
  11. data/lib/hanami/action/cache/cache_control.rb +4 -4
  12. data/lib/hanami/action/cache/conditional_get.rb +3 -1
  13. data/lib/hanami/action/cache/directives.rb +1 -1
  14. data/lib/hanami/action/cache/expires.rb +3 -3
  15. data/lib/hanami/action/cache.rb +1 -139
  16. data/lib/hanami/action/configuration.rb +428 -0
  17. data/lib/hanami/action/cookie_jar.rb +3 -3
  18. data/lib/hanami/action/cookies.rb +3 -62
  19. data/lib/hanami/action/csrf_protection.rb +214 -0
  20. data/lib/hanami/action/flash.rb +102 -207
  21. data/lib/hanami/action/glue.rb +5 -31
  22. data/lib/hanami/action/halt.rb +12 -0
  23. data/lib/hanami/action/mime.rb +78 -485
  24. data/lib/hanami/action/params.rb +2 -2
  25. data/lib/hanami/action/rack/file.rb +1 -1
  26. data/lib/hanami/action/request.rb +30 -20
  27. data/lib/hanami/action/response.rb +193 -0
  28. data/lib/hanami/action/session.rb +11 -128
  29. data/lib/hanami/action/standalone_action.rb +579 -0
  30. data/lib/hanami/action/validatable.rb +1 -1
  31. data/lib/hanami/action/view_name_inferrer.rb +46 -0
  32. data/lib/hanami/action.rb +129 -73
  33. data/lib/hanami/controller/version.rb +1 -1
  34. data/lib/hanami/controller.rb +0 -227
  35. data/lib/hanami/http/status.rb +2 -2
  36. metadata +45 -27
  37. data/lib/hanami/action/callable.rb +0 -92
  38. data/lib/hanami/action/callbacks.rb +0 -214
  39. data/lib/hanami/action/configurable.rb +0 -50
  40. data/lib/hanami/action/exposable/guard.rb +0 -104
  41. data/lib/hanami/action/exposable.rb +0 -126
  42. data/lib/hanami/action/head.rb +0 -121
  43. data/lib/hanami/action/rack/callable.rb +0 -47
  44. data/lib/hanami/action/rack.rb +0 -399
  45. data/lib/hanami/action/redirect.rb +0 -59
  46. data/lib/hanami/action/throwable.rb +0 -196
  47. data/lib/hanami/controller/configuration.rb +0 -763
  48. data/lib/hanami-controller.rb +0 -1
data/lib/hanami/action.rb CHANGED
@@ -1,17 +1,5 @@
1
- require 'hanami/action/configurable'
2
- require 'hanami/action/rack'
3
- require 'hanami/action/mime'
4
- require 'hanami/action/redirect'
5
- require 'hanami/action/exposable'
6
- require 'hanami/action/throwable'
7
- require 'hanami/action/callbacks'
8
- begin
9
- require 'hanami/validations'
10
- require 'hanami/action/validatable'
11
- rescue LoadError
12
- end
13
- require 'hanami/action/head'
14
- require 'hanami/action/callable'
1
+ require_relative 'action/application_action'
2
+ require_relative 'action/standalone_action'
15
3
 
16
4
  module Hanami
17
5
  # An HTTP endpoint
@@ -28,84 +16,152 @@ module Hanami
28
16
  # # ...
29
17
  # end
30
18
  # end
31
- module Action
32
- # Override Ruby's hook for modules.
33
- # It includes basic Hanami::Action modules to the given class.
19
+ class Action
20
+ # Rack SPEC response code
34
21
  #
35
- # @param base [Class] the target action
22
+ # @since 1.0.0
23
+ # @api private
24
+ RESPONSE_CODE = 0
25
+
26
+ # Rack SPEC response headers
36
27
  #
37
- # @since 0.1.0
28
+ # @since 1.0.0
38
29
  # @api private
30
+ RESPONSE_HEADERS = 1
31
+
32
+ # Rack SPEC response body
39
33
  #
40
- # @see http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included
41
- #
42
- # @see Hanami::Action::Rack
43
- # @see Hanami::Action::Mime
44
- # @see Hanami::Action::Http
45
- # @see Hanami::Action::Redirect
46
- # @see Hanami::Action::Exposable
47
- # @see Hanami::Action::Throwable
48
- # @see Hanami::Action::Callbacks
49
- # @see Hanami::Action::Validatable
50
- # @see Hanami::Action::Configurable
51
- # @see Hanami::Action::Callable
52
- def self.included(base)
53
- base.class_eval do
54
- include Rack
55
- include Mime
56
- include Redirect
57
- include Exposable
58
- include Throwable
59
- include Callbacks
60
- include Validatable if defined?(Validatable)
61
- include Configurable
62
- include Head
63
- prepend Callable
64
- end
65
- end
34
+ # @since 1.0.0
35
+ # @api private
36
+ RESPONSE_BODY = 2
66
37
 
67
- private
38
+ DEFAULT_ERROR_CODE = 500
68
39
 
69
- # Raise error when `Hanami::Action::Session` isn't included.
40
+ # Status codes that by RFC must not include a message body
70
41
  #
71
- # To use `session`, include `Hanami::Action::Session`.
42
+ # @since 0.3.2
43
+ # @api private
44
+ HTTP_STATUSES_WITHOUT_BODY = Set.new((100..199).to_a << 204 << 205 << 304).freeze
45
+
46
+ # Not Found
72
47
  #
73
- # @raise [Hanami::Controller::MissingSessionError]
48
+ # @since 1.0.0
49
+ # @api private
50
+ NOT_FOUND = 404
51
+
52
+ # Entity headers allowed in blank body responses, according to
53
+ # RFC 2616 - Section 10 (HTTP 1.1).
74
54
  #
75
- # @since 1.2.0
76
- def session
77
- raise Hanami::Controller::MissingSessionError.new(:session)
78
- end
55
+ # "The response MAY include new or updated metainformation in the form
56
+ # of entity-headers".
57
+ #
58
+ # @since 0.4.0
59
+ # @api private
60
+ #
61
+ # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.5
62
+ # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html
63
+ ENTITY_HEADERS = {
64
+ 'Allow' => true,
65
+ 'Content-Encoding' => true,
66
+ 'Content-Language' => true,
67
+ 'Content-Location' => true,
68
+ 'Content-MD5' => true,
69
+ 'Content-Range' => true,
70
+ 'Expires' => true,
71
+ 'Last-Modified' => true,
72
+ 'extension-header' => true
73
+ }.freeze
79
74
 
80
- # Raise error when `Hanami::Action::Session` isn't included.
75
+ # The request method
81
76
  #
82
- # To use `flash`, include `Hanami::Action::Session`.
77
+ # @since 0.3.2
78
+ # @api private
79
+ REQUEST_METHOD = 'REQUEST_METHOD'.freeze
80
+
81
+ # The Content-Length HTTP header
83
82
  #
84
- # @raise [Hanami::Controller::MissingSessionError]
83
+ # @since 1.0.0
84
+ # @api private
85
+ CONTENT_LENGTH = 'Content-Length'.freeze
86
+
87
+ # The non-standard HTTP header to pass the control over when a resource
88
+ # cannot be found by the current endpoint
85
89
  #
86
- # @since 1.2.0
87
- def flash
88
- raise Hanami::Controller::MissingSessionError.new(:flash)
89
- end
90
+ # @since 1.0.0
91
+ # @api private
92
+ X_CASCADE = 'X-Cascade'.freeze
93
+
94
+ # HEAD request
95
+ #
96
+ # @since 0.3.2
97
+ # @api private
98
+ HEAD = 'HEAD'.freeze
99
+
100
+ # The key that returns accepted mime types from the Rack env
101
+ #
102
+ # @since 0.1.0
103
+ # @api private
104
+ HTTP_ACCEPT = 'HTTP_ACCEPT'.freeze
90
105
 
91
- # Finalize the response
106
+ # The header key to set the mime type of the response
92
107
  #
93
- # This method is abstract and COULD be implemented by included modules in
94
- # order to prepare their data before the response will be returned to the
95
- # webserver.
108
+ # @since 0.1.0
109
+ # @api private
110
+ CONTENT_TYPE = 'Content-Type'.freeze
111
+
112
+ # The default mime type for an incoming HTTP request
96
113
  #
97
114
  # @since 0.1.0
98
115
  # @api private
99
- # @abstract
116
+ DEFAULT_ACCEPT = '*/*'.freeze
117
+
118
+ # The default mime type that is returned in the response
119
+ #
120
+ # @since 0.1.0
121
+ # @api private
122
+ DEFAULT_CONTENT_TYPE = 'application/octet-stream'.freeze
123
+
124
+ # @since 0.2.0
125
+ # @api private
126
+ RACK_ERRORS = 'rack.errors'.freeze
127
+
128
+ # This isn't part of Rack SPEC
129
+ #
130
+ # Exception notifiers use <tt>rack.exception</tt> instead of
131
+ # <tt>rack.errors</tt>, so we need to support it.
132
+ #
133
+ # @since 0.5.0
134
+ # @api private
100
135
  #
101
- # @see Hanami::Action::Mime#finish
102
- # @see Hanami::Action::Exposable#finish
103
- # @see Hanami::Action::Callable#finish
104
- # @see Hanami::Action::Session#finish
105
- # @see Hanami::Action::Cookies#finish
106
- # @see Hanami::Action::Cache#finish
107
- # @see Hanami::Action::Head#finish
108
- def finish
136
+ # @see Hanami::Action::Throwable::RACK_ERRORS
137
+ # @see http://www.rubydoc.info/github/rack/rack/file/SPEC#The_Error_Stream
138
+ # @see https://github.com/hanami/controller/issues/133
139
+ RACK_EXCEPTION = 'rack.exception'.freeze
140
+
141
+ # The HTTP header for redirects
142
+ #
143
+ # @since 0.2.0
144
+ # @api private
145
+ LOCATION = 'Location'.freeze
146
+
147
+ include StandaloneAction
148
+
149
+ def self.inherited(subclass)
150
+ super
151
+
152
+ # When inheriting within an Hanami app, and the application provider has
153
+ # changed from the superclass, (re-)configure the action for the provider,
154
+ # i.e. for the slice and/or the application itself
155
+ if (provider = application_provider(subclass)) && provider != application_provider(subclass.superclass)
156
+ subclass.include ApplicationAction.new(provider)
157
+ end
158
+ end
159
+
160
+ def self.application_provider(subclass)
161
+ if Hanami.respond_to?(:application?) && Hanami.application?
162
+ Hanami.application.component_provider(subclass)
163
+ end
109
164
  end
165
+ private_class_method :application_provider
110
166
  end
111
167
  end
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '1.3.2'.freeze
6
+ VERSION = '2.0.0.alpha3'.freeze
7
7
  end
8
8
  end
@@ -1,6 +1,4 @@
1
- require 'hanami/utils/class_attribute'
2
1
  require 'hanami/action'
3
- require 'hanami/controller/configuration'
4
2
  require 'hanami/controller/version'
5
3
  require 'hanami/controller/error'
6
4
 
@@ -46,230 +44,5 @@ module Hanami
46
44
  super("Cannot find a corresponding Mime type for '#{ format }'. Please configure it with Hanami::Controller::Configuration#format.")
47
45
  end
48
46
  end
49
-
50
- # Missing session error
51
- #
52
- # This error is raised when an action sends either `session` or `flash` to
53
- # itself and it does not include `Hanami::Action::Session`.
54
- #
55
- # @since 1.2.0
56
- #
57
- # @see Hanami::Action::Session
58
- # @see Hanami::Action#session
59
- # @see Hanami::Action#flash
60
- class MissingSessionError < Hanami::Controller::Error
61
- def initialize(session_method)
62
- super("To use `#{session_method}', add `include Hanami::Action::Session`.")
63
- end
64
- 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
47
  end
275
48
  end
@@ -31,7 +31,7 @@ module Hanami
31
31
 
32
32
  # Return a status for the given code
33
33
  #
34
- # @param code [Fixnum] a valid HTTP code
34
+ # @param code [Integer] a valid HTTP code
35
35
  #
36
36
  # @return [Array] a pair of code and message for an HTTP status
37
37
  #
@@ -48,7 +48,7 @@ module Hanami
48
48
 
49
49
  # Return a message for the given status code
50
50
  #
51
- # @param code [Fixnum] a valid HTTP code
51
+ # @param code [Integer] a valid HTTP code
52
52
  #
53
53
  # @return [String] a message for the given status code
54
54
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 2.0.0.alpha3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-28 00:00:00.000000000 Z
11
+ date: 2021-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -30,14 +30,34 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: 2.0.alpha
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: 2.0.alpha
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-configurable
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.13'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.13.0
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.13'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.13.0
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: bundler
43
63
  requirement: !ruby/object:Gem::Requirement
@@ -78,28 +98,28 @@ dependencies:
78
98
  requirements:
79
99
  - - "~>"
80
100
  - !ruby/object:Gem::Version
81
- version: '12'
101
+ version: '13'
82
102
  type: :development
83
103
  prerelease: false
84
104
  version_requirements: !ruby/object:Gem::Requirement
85
105
  requirements:
86
106
  - - "~>"
87
107
  - !ruby/object:Gem::Version
88
- version: '12'
108
+ version: '13'
89
109
  - !ruby/object:Gem::Dependency
90
110
  name: rspec
91
111
  requirement: !ruby/object:Gem::Requirement
92
112
  requirements:
93
113
  - - "~>"
94
114
  - !ruby/object:Gem::Version
95
- version: '3.7'
115
+ version: '3.9'
96
116
  type: :development
97
117
  prerelease: false
98
118
  version_requirements: !ruby/object:Gem::Requirement
99
119
  requirements:
100
120
  - - "~>"
101
121
  - !ruby/object:Gem::Version
102
- version: '3.7'
122
+ version: '3.9'
103
123
  description: Complete, fast and testable actions for Rack
104
124
  email:
105
125
  - me@lucaguidi.com
@@ -111,36 +131,34 @@ files:
111
131
  - LICENSE.md
112
132
  - README.md
113
133
  - hanami-controller.gemspec
114
- - lib/hanami-controller.rb
115
134
  - lib/hanami/action.rb
135
+ - lib/hanami/action/application_action.rb
136
+ - lib/hanami/action/application_configuration.rb
137
+ - lib/hanami/action/application_configuration/cookies.rb
138
+ - lib/hanami/action/application_configuration/sessions.rb
116
139
  - lib/hanami/action/base_params.rb
117
140
  - lib/hanami/action/cache.rb
118
141
  - lib/hanami/action/cache/cache_control.rb
119
142
  - lib/hanami/action/cache/conditional_get.rb
120
143
  - lib/hanami/action/cache/directives.rb
121
144
  - lib/hanami/action/cache/expires.rb
122
- - lib/hanami/action/callable.rb
123
- - lib/hanami/action/callbacks.rb
124
- - lib/hanami/action/configurable.rb
145
+ - lib/hanami/action/configuration.rb
125
146
  - lib/hanami/action/cookie_jar.rb
126
147
  - lib/hanami/action/cookies.rb
127
- - lib/hanami/action/exposable.rb
128
- - lib/hanami/action/exposable/guard.rb
148
+ - lib/hanami/action/csrf_protection.rb
129
149
  - lib/hanami/action/flash.rb
130
150
  - lib/hanami/action/glue.rb
131
- - lib/hanami/action/head.rb
151
+ - lib/hanami/action/halt.rb
132
152
  - lib/hanami/action/mime.rb
133
153
  - lib/hanami/action/params.rb
134
- - lib/hanami/action/rack.rb
135
- - lib/hanami/action/rack/callable.rb
136
154
  - lib/hanami/action/rack/file.rb
137
- - lib/hanami/action/redirect.rb
138
155
  - lib/hanami/action/request.rb
156
+ - lib/hanami/action/response.rb
139
157
  - lib/hanami/action/session.rb
140
- - lib/hanami/action/throwable.rb
158
+ - lib/hanami/action/standalone_action.rb
141
159
  - lib/hanami/action/validatable.rb
160
+ - lib/hanami/action/view_name_inferrer.rb
142
161
  - lib/hanami/controller.rb
143
- - lib/hanami/controller/configuration.rb
144
162
  - lib/hanami/controller/error.rb
145
163
  - lib/hanami/controller/version.rb
146
164
  - lib/hanami/http/status.rb
@@ -148,7 +166,7 @@ homepage: http://hanamirb.org
148
166
  licenses:
149
167
  - MIT
150
168
  metadata: {}
151
- post_install_message:
169
+ post_install_message:
152
170
  rdoc_options: []
153
171
  require_paths:
154
172
  - lib
@@ -156,15 +174,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
156
174
  requirements:
157
175
  - - ">="
158
176
  - !ruby/object:Gem::Version
159
- version: 2.3.0
177
+ version: 2.6.0
160
178
  required_rubygems_version: !ruby/object:Gem::Requirement
161
179
  requirements:
162
- - - ">="
180
+ - - ">"
163
181
  - !ruby/object:Gem::Version
164
- version: '0'
182
+ version: 1.3.1
165
183
  requirements: []
166
- rubygems_version: 3.0.3
167
- signing_key:
184
+ rubygems_version: 3.2.3
185
+ signing_key:
168
186
  specification_version: 4
169
187
  summary: Complete, fast and testable actions for Rack and Hanami
170
188
  test_files: []