hanami-controller 2.0.1 → 2.0.2
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 +14 -0
- data/lib/hanami/action/cache/directives.rb +2 -2
- data/lib/hanami/action/errors.rb +33 -7
- data/lib/hanami/action/halt.rb +2 -2
- data/lib/hanami/action/mime.rb +1 -1
- data/lib/hanami/action/params.rb +9 -0
- data/lib/hanami/action/response.rb +21 -0
- data/lib/hanami/controller/version.rb +1 -1
- data/lib/hanami/http/status.rb +102 -6
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 477af228e710dc40efbe4387c47f5cd04d24680f5041e0218390ad22e64fe349
|
4
|
+
data.tar.gz: f70b9d82c375465cfebabcd00db19fb13243ea5888bc8096fbdeac3f01e86c9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 202511cc4ae1c987c1990a93b6041b3dc3edf8c9391d3938499aea83fe672d43f69d8cf90420d4b222de88124c1222e2aea8fbf7d981ada5a0cf0b8c8d9a40a3
|
7
|
+
data.tar.gz: 4af98190f0ea03130a595cfa2cb222d321b77f22d3e9003daa932786b1bb2de68984d0175cb107b10af656e1e9409c38f4096959f570c2d5aaf168502481d435
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,20 @@
|
|
2
2
|
|
3
3
|
Complete, fast and testable actions for Rack
|
4
4
|
|
5
|
+
## v2.0.2 - 2023-02-01
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- [Adam Lassek] Params Pattern Matching
|
10
|
+
- [Adam Lassek, Luca Guidi] Allow to `halt` using a `Symbol`: `halt :unauthorized`
|
11
|
+
- [Adam Lassek, Luca Guidi] Introduce `Hanami::Action::Response#status=` to accept an `Integer` or a `Symbol`
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
- [Pat Allan] Ensure action accepting the request with a custom MIME Type
|
16
|
+
- [Luca Guidi] Halting with an unknown HTTP code will raise a `Hanami::Action::UnknownHttpStatusError`
|
17
|
+
- [Luca Guidi] Fix error message for missing format (MIME Type)
|
18
|
+
|
5
19
|
## v2.0.1 - 2022-12-25
|
6
20
|
|
7
21
|
### Added
|
@@ -88,9 +88,9 @@ module Hanami
|
|
88
88
|
@directives = []
|
89
89
|
values.each do |directive_key|
|
90
90
|
if directive_key.is_a? Hash
|
91
|
-
directive_key.each { |name, value| self
|
91
|
+
directive_key.each { |name, value| self << ValueDirective.new(name, value) }
|
92
92
|
else
|
93
|
-
self
|
93
|
+
self << NonValueDirective.new(directive_key)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
data/lib/hanami/action/errors.rb
CHANGED
@@ -9,6 +9,20 @@ module Hanami
|
|
9
9
|
class Error < ::StandardError
|
10
10
|
end
|
11
11
|
|
12
|
+
# Unknown status HTTP Status error
|
13
|
+
#
|
14
|
+
# @since 2.0.2
|
15
|
+
#
|
16
|
+
# @see Hanami::Action::Response#status=
|
17
|
+
# @see https://guides.hanamirb.org/v2.0/actions/status-codes/
|
18
|
+
class UnknownHttpStatusError < Error
|
19
|
+
# @since 2.0.2
|
20
|
+
# @api private
|
21
|
+
def initialize(code)
|
22
|
+
super("unknown HTTP status: `#{code.inspect}'")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
12
26
|
# Unknown format error
|
13
27
|
#
|
14
28
|
# This error is raised when a action sets a format that it isn't recognized
|
@@ -21,14 +35,26 @@ module Hanami
|
|
21
35
|
# @since 2.0.0
|
22
36
|
# @api private
|
23
37
|
def initialize(format)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
38
|
+
message = <<~MSG
|
39
|
+
Cannot find a corresponding MIME type for format `#{format.inspect}'.
|
40
|
+
MSG
|
41
|
+
|
42
|
+
unless blank?(format)
|
43
|
+
message += <<~MSG
|
44
|
+
|
45
|
+
Configure one via: `config.actions.formats.add(:#{format}, "MIME_TYPE_HERE")' in `config/app.rb' to share between actions of a Hanami app.
|
46
|
+
|
47
|
+
Or make it available only in the current action: `config.formats.add(:#{format}, "MIME_TYPE_HERE")'.
|
48
|
+
MSG
|
49
|
+
end
|
50
|
+
|
51
|
+
super(message)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
30
55
|
|
31
|
-
|
56
|
+
def blank?(format)
|
57
|
+
format.to_s.match(/\A[[:space:]]*\z/)
|
32
58
|
end
|
33
59
|
end
|
34
60
|
|
data/lib/hanami/action/halt.rb
CHANGED
@@ -10,8 +10,8 @@ module Hanami
|
|
10
10
|
# @api private
|
11
11
|
# @since 2.0.0
|
12
12
|
def self.call(status, body = nil)
|
13
|
-
|
14
|
-
throw :halt, [
|
13
|
+
code, message = Http::Status.for_code(status)
|
14
|
+
throw :halt, [code, body || message]
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/hanami/action/mime.rb
CHANGED
@@ -237,7 +237,7 @@ module Hanami
|
|
237
237
|
# @api private
|
238
238
|
def accepted_mime_type?(mime_type, config)
|
239
239
|
accepted_mime_types(config).any? { |accepted_mime_type|
|
240
|
-
::Rack::Mime.match?(
|
240
|
+
::Rack::Mime.match?(mime_type, accepted_mime_type)
|
241
241
|
}
|
242
242
|
end
|
243
243
|
|
data/lib/hanami/action/params.rb
CHANGED
@@ -81,6 +81,27 @@ module Hanami
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
# Set the response status
|
85
|
+
#
|
86
|
+
# @param code [Integer, Symbol] the status code
|
87
|
+
#
|
88
|
+
# @since 2.0.2
|
89
|
+
# @api public
|
90
|
+
#
|
91
|
+
# @raise [Hanami::Action::UnknownHttpStatusError] if the given code
|
92
|
+
# cannot be associated to a known HTTP status
|
93
|
+
#
|
94
|
+
# @example
|
95
|
+
# response.status = :unprocessable_entity
|
96
|
+
#
|
97
|
+
# @example
|
98
|
+
# response.status = 422
|
99
|
+
#
|
100
|
+
# @see https://guides.hanamirb.org/v2.0/actions/status-codes/
|
101
|
+
def status=(code)
|
102
|
+
super(Http::Status.lookup(code))
|
103
|
+
end
|
104
|
+
|
84
105
|
# This is NOT RELEASED with 2.0.0
|
85
106
|
#
|
86
107
|
# @api private
|
data/lib/hanami/http/status.rb
CHANGED
@@ -17,31 +17,127 @@ module Hanami
|
|
17
17
|
# @api private
|
18
18
|
ALL = ::Rack::Utils::HTTP_STATUS_CODES
|
19
19
|
|
20
|
+
# Symbolic names for status codes
|
21
|
+
#
|
22
|
+
# @since 2.0.2
|
23
|
+
# @api private
|
24
|
+
SYMBOLS = ::Rack::Utils::SYMBOL_TO_STATUS_CODE
|
25
|
+
|
20
26
|
# Return a status for the given code
|
21
27
|
#
|
22
|
-
# @param code [Integer] a valid HTTP code
|
28
|
+
# @param code [Integer, Symbol] a valid HTTP code
|
23
29
|
#
|
24
30
|
# @return [Array] a pair of code and message for an HTTP status
|
25
31
|
#
|
32
|
+
# @raise [Hanami::Action::UnknownHttpStatusError] if the given code
|
33
|
+
# cannot be associated to a known HTTP status
|
34
|
+
#
|
26
35
|
# @since 0.1.0
|
27
36
|
# @api private
|
28
37
|
#
|
29
|
-
# @
|
30
|
-
#
|
38
|
+
# @see https://guides.hanamirb.org/v2.0/actions/status-codes/
|
39
|
+
#
|
40
|
+
# @example Integer HTTP Status
|
41
|
+
# require "hanami/http/status"
|
42
|
+
#
|
43
|
+
# Hanami::Http::Status.for_code(401)
|
44
|
+
# # => [401, "Unauthorized"]
|
45
|
+
#
|
46
|
+
# @example Symbol HTTP Status
|
47
|
+
# require "hanami/http/status"
|
48
|
+
#
|
49
|
+
# Hanami::Http::Status.for_code(:unauthorized)
|
50
|
+
# # => [401, "Unauthorized"]
|
51
|
+
#
|
52
|
+
# @example Unknown HTTP Status
|
53
|
+
# require "hanami/http/status"
|
31
54
|
#
|
32
|
-
# Hanami::Http::Status.for_code(
|
55
|
+
# Hanami::Http::Status.for_code(999)
|
56
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
57
|
+
#
|
58
|
+
# Hanami::Http::Status.for_code(:foo)
|
59
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
33
60
|
def self.for_code(code)
|
34
|
-
|
61
|
+
case code
|
62
|
+
when Integer
|
63
|
+
ALL.assoc(code)
|
64
|
+
when Symbol
|
65
|
+
ALL.assoc(SYMBOLS[code])
|
66
|
+
end or raise ::Hanami::Action::UnknownHttpStatusError.new(code)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Return a status code for the given code
|
70
|
+
#
|
71
|
+
# @param code [Integer,Symbol] a valid HTTP code
|
72
|
+
#
|
73
|
+
# @return [Integer] a message for the given status code
|
74
|
+
#
|
75
|
+
# @raise [Hanami::Action::UnknownHttpStatusError] if the given code
|
76
|
+
# cannot be associated to a known HTTP status
|
77
|
+
#
|
78
|
+
# @see https://guides.hanamirb.org/v2.0/actions/status-codes/
|
79
|
+
#
|
80
|
+
# @since 2.0.2
|
81
|
+
# @api private
|
82
|
+
#
|
83
|
+
# @example Integer HTTP Status
|
84
|
+
# require "hanami/http/status"
|
85
|
+
#
|
86
|
+
# Hanami::Http::Status.lookup(401)
|
87
|
+
# # => 401
|
88
|
+
#
|
89
|
+
# @example Symbol HTTP Status
|
90
|
+
# require "hanami/http/status"
|
91
|
+
#
|
92
|
+
# Hanami::Http::Status.lookup(:unauthorized)
|
93
|
+
# # => 401
|
94
|
+
#
|
95
|
+
# @example Unknown HTTP Status
|
96
|
+
# require "hanami/http/status"
|
97
|
+
#
|
98
|
+
# Hanami::Http::Status.lookup(999)
|
99
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
100
|
+
#
|
101
|
+
# Hanami::Http::Status.lookup(:foo)
|
102
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
103
|
+
def self.lookup(code)
|
104
|
+
for_code(code)[0]
|
35
105
|
end
|
36
106
|
|
37
107
|
# Return a message for the given status code
|
38
108
|
#
|
39
|
-
# @param code [Integer] a valid HTTP code
|
109
|
+
# @param code [Integer,Symbol] a valid HTTP code
|
40
110
|
#
|
41
111
|
# @return [String] a message for the given status code
|
42
112
|
#
|
113
|
+
# @raise [Hanami::Action::UnknownHttpStatusError] if the given code
|
114
|
+
# cannot be associated to a known HTTP status
|
115
|
+
#
|
116
|
+
# @see https://guides.hanamirb.org/v2.0/actions/status-codes/
|
117
|
+
#
|
43
118
|
# @since 0.3.2
|
44
119
|
# @api private
|
120
|
+
#
|
121
|
+
# @example Integer HTTP Status
|
122
|
+
# require "hanami/http/status"
|
123
|
+
#
|
124
|
+
# Hanami::Http::Status.message_for(401)
|
125
|
+
# # => "Unauthorized"
|
126
|
+
#
|
127
|
+
# @example Symbol HTTP Status
|
128
|
+
# require "hanami/http/status"
|
129
|
+
#
|
130
|
+
# Hanami::Http::Status.message_for(:unauthorized)
|
131
|
+
# # => "Unauthorized"
|
132
|
+
#
|
133
|
+
# @example Unknown HTTP Status
|
134
|
+
# require "hanami/http/status"
|
135
|
+
#
|
136
|
+
# Hanami::Http::Status.message_for(999)
|
137
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
138
|
+
#
|
139
|
+
# Hanami::Http::Status.message_for(:foo)
|
140
|
+
# # => raise Hanami::Action::UnknownHttpStatusError
|
45
141
|
def self.message_for(code)
|
46
142
|
for_code(code)[1]
|
47
143
|
end
|
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: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -222,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0'
|
224
224
|
requirements: []
|
225
|
-
rubygems_version: 3.4.
|
225
|
+
rubygems_version: 3.4.5
|
226
226
|
signing_key:
|
227
227
|
specification_version: 4
|
228
228
|
summary: Complete, fast and testable actions for Rack and Hanami
|