hanami-controller 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/lib/hanami/action/base_params.rb +9 -0
- data/lib/hanami/action/exposable.rb +9 -1
- data/lib/hanami/action/exposable/guard.rb +102 -0
- data/lib/hanami/action/glue.rb +1 -1
- data/lib/hanami/action/mime.rb +6 -2
- data/lib/hanami/action/params.rb +9 -23
- data/lib/hanami/action/rack.rb +7 -0
- data/lib/hanami/action/session.rb +1 -1
- data/lib/hanami/controller/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19ed324ba067df9dae1f836edc8232f5ab9ec658
|
4
|
+
data.tar.gz: 83d999e3d478d6b5048da0f57bc6ce9e4a3bd42e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4df22338de1f7d4ec7fc609327917a905db7939f28dbb2113d54e1bc2394b6877bccecd94aba0047e3a745a8098a6341e9afc7fbd36a81b1cd56d2a494685140
|
7
|
+
data.tar.gz: dcb8ffe55c81813c9bd976a04cc840811b9ee0993f46ad76282d8e1f27eb58d9c069807c5f900afffacb9767d0ac900b55c2a49c0955c0c19a1a93e71488d300
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
# Hanami::Controller
|
2
2
|
Complete, fast and testable actions for Rack
|
3
3
|
|
4
|
+
## v0.7.1 - 2016-10-06
|
5
|
+
### Added
|
6
|
+
- [Kyle Chong] Introduced `parsed_request_body` for action
|
7
|
+
- [Luca Guidi] Introduced `Hanami::Action::BaseParams#each`
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
- [Ayleen McCann] Use default content type when `HTTP_ACCEPT` is `*/*`
|
11
|
+
- [Kyle Chong] Don't stringify uploaded files
|
12
|
+
- [Kyle Chong] Don't stringify params values when not necessary
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- [akhramov & Luca Guidi] Raise `Hanami::Controller::IllegalExposureError` when try to expose reserved words: `params`, and `flash`.
|
16
|
+
|
4
17
|
## v0.7.0 - 2016-07-22
|
5
18
|
### Added
|
6
19
|
- [Luca Guidi] Introduced `Hanami::Action::Params#error_messages` which returns a flat collection of full error messages
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'hanami/action/exposable/guard'
|
2
|
+
|
1
3
|
module Hanami
|
2
4
|
module Action
|
3
5
|
# Exposures API
|
@@ -18,7 +20,9 @@ module Hanami
|
|
18
20
|
def self.included(base)
|
19
21
|
base.class_eval do
|
20
22
|
extend ClassMethods
|
21
|
-
|
23
|
+
include Guard
|
24
|
+
|
25
|
+
_expose :params
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
@@ -68,6 +72,10 @@ module Hanami
|
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
75
|
+
# Alias of #expose to be used in internal modules.
|
76
|
+
# #_expose is not watched by the Guard
|
77
|
+
alias _expose expose
|
78
|
+
|
71
79
|
# Set of exposures attribute names
|
72
80
|
#
|
73
81
|
# @return [Array] the exposures attribute names
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'hanami/controller/error'
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module Controller
|
5
|
+
# Exposure of reserved words
|
6
|
+
#
|
7
|
+
# @since 0.7.1
|
8
|
+
class IllegalExposureError < Error
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Action
|
13
|
+
module Exposable
|
14
|
+
# Guard for Exposures API.
|
15
|
+
# Prevents exposure of reserved words
|
16
|
+
#
|
17
|
+
# @since 0.7.1
|
18
|
+
#
|
19
|
+
# @see Hanami::Action::Exposable::Guard::ClassMethods#expose
|
20
|
+
# @see Hanami::Action::Exposable::Guard::ClassMethods#reserved_word?
|
21
|
+
module Guard
|
22
|
+
# Override Ruby's hook for modules.
|
23
|
+
# It prepends a guard for the exposures logic
|
24
|
+
#
|
25
|
+
# @param base [Class] the target action
|
26
|
+
#
|
27
|
+
# @since 0.7.1
|
28
|
+
# @api private
|
29
|
+
#
|
30
|
+
# @see http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included
|
31
|
+
def self.included(base)
|
32
|
+
class << base
|
33
|
+
prepend ClassMethods
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Exposures API Guard class methods
|
38
|
+
#
|
39
|
+
# @since 0.7.1
|
40
|
+
# @api private
|
41
|
+
module ClassMethods
|
42
|
+
# Prevents exposure if names contain a reserved word.
|
43
|
+
#
|
44
|
+
# @param names [Array<Symbol>] the name(s) of the attribute(s) to be
|
45
|
+
# exposed
|
46
|
+
#
|
47
|
+
# @return [void]
|
48
|
+
#
|
49
|
+
# @since 0.7.1
|
50
|
+
def expose(*names)
|
51
|
+
detect_reserved_words!(names)
|
52
|
+
|
53
|
+
super
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Raises error if given names contain a reserved word.
|
59
|
+
#
|
60
|
+
# @param names [Array<Symbol>] a list of names to be checked.
|
61
|
+
#
|
62
|
+
# @return [void]
|
63
|
+
#
|
64
|
+
# @raise [IllegalExposeError] if names contain one or more of reserved
|
65
|
+
# words
|
66
|
+
#
|
67
|
+
# @since 0.7.1
|
68
|
+
# @api private
|
69
|
+
def detect_reserved_words!(names)
|
70
|
+
names.each do |name|
|
71
|
+
if reserved_word?(name)
|
72
|
+
raise Hanami::Controller::IllegalExposureError.new("#{name} is a reserved word. It cannot be exposed")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Checks if a string is a reserved word
|
78
|
+
#
|
79
|
+
# Reserved word is a name of the method defined in one of the modules
|
80
|
+
# of a given namespace.
|
81
|
+
#
|
82
|
+
# @param name [Symbol] the word to be checked
|
83
|
+
# @param namespace [String] the namespace containing internal modules
|
84
|
+
#
|
85
|
+
# @return [true, false]
|
86
|
+
#
|
87
|
+
# @since 0.7.1
|
88
|
+
# @api private
|
89
|
+
def reserved_word?(name, namespace = 'Hanami')
|
90
|
+
if method_defined?(name) || private_method_defined?(name)
|
91
|
+
method_owner = instance_method(name).owner
|
92
|
+
|
93
|
+
Utils::String.new(method_owner).namespace == namespace
|
94
|
+
else
|
95
|
+
false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/hanami/action/glue.rb
CHANGED
@@ -23,7 +23,7 @@ module Hanami
|
|
23
23
|
# @api private
|
24
24
|
# @since 0.3.0
|
25
25
|
def self.included(base)
|
26
|
-
base.class_eval {
|
26
|
+
base.class_eval { _expose(:format) if respond_to?(:_expose) }
|
27
27
|
end
|
28
28
|
|
29
29
|
# Check if the current HTTP request is renderable.
|
data/lib/hanami/action/mime.rb
CHANGED
@@ -487,9 +487,13 @@ module Hanami
|
|
487
487
|
# @see https://github.com/hanami/controller/issues/104
|
488
488
|
def best_q_match(q_value_header, available_mimes)
|
489
489
|
values = ::Rack::Utils.q_values(q_value_header)
|
490
|
-
|
491
490
|
values = values.map do |req_mime, quality|
|
492
|
-
|
491
|
+
if req_mime == DEFAULT_ACCEPT
|
492
|
+
# See https://github.com/hanami/controller/issues/167
|
493
|
+
match = default_content_type
|
494
|
+
else
|
495
|
+
match = available_mimes.find { |am| ::Rack::Mime.match?(am, req_mime) }
|
496
|
+
end
|
493
497
|
next unless match
|
494
498
|
[match, quality]
|
495
499
|
end.compact
|
data/lib/hanami/action/params.rb
CHANGED
@@ -90,6 +90,15 @@ module Hanami
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
+
# Returns true if no validation errors are found,
|
94
|
+
# false otherwise.
|
95
|
+
#
|
96
|
+
# @return [TrueClass, FalseClass]
|
97
|
+
#
|
98
|
+
# @since 0.7.0
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# params.valid? # => true
|
93
102
|
def valid?
|
94
103
|
@result.success?
|
95
104
|
end
|
@@ -106,32 +115,9 @@ module Hanami
|
|
106
115
|
|
107
116
|
private
|
108
117
|
|
109
|
-
# @since 0.7.0
|
110
|
-
# @api private
|
111
|
-
def _extract_params
|
112
|
-
# FIXME: this is required for dry-v whitelisting
|
113
|
-
stringify!(super)
|
114
|
-
end
|
115
|
-
|
116
118
|
def _params
|
117
119
|
@result.output.merge(_router_params)
|
118
120
|
end
|
119
|
-
|
120
|
-
def stringify!(result)
|
121
|
-
result.keys.each do |key|
|
122
|
-
value = result.delete(key)
|
123
|
-
result[key.to_s] = case value
|
124
|
-
when ::Hash
|
125
|
-
stringify!(value)
|
126
|
-
when ::Array
|
127
|
-
value.map(&:to_s)
|
128
|
-
else
|
129
|
-
value.to_s
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
result
|
134
|
-
end
|
135
121
|
end
|
136
122
|
end
|
137
123
|
end
|
data/lib/hanami/action/rack.rb
CHANGED
@@ -42,6 +42,9 @@ module Hanami
|
|
42
42
|
# @api private
|
43
43
|
HEAD = 'HEAD'.freeze
|
44
44
|
|
45
|
+
# The key that returns router parsed body from the Rack env
|
46
|
+
ROUTER_PARSED_BODY = 'router.parsed_body'.freeze
|
47
|
+
|
45
48
|
# Override Ruby's hook for modules.
|
46
49
|
# It includes basic Hanami::Action modules to the given class.
|
47
50
|
#
|
@@ -202,6 +205,10 @@ module Hanami
|
|
202
205
|
@request ||= ::Hanami::Action::Request.new(@_env)
|
203
206
|
end
|
204
207
|
|
208
|
+
def parsed_request_body
|
209
|
+
@_env.fetch(ROUTER_PARSED_BODY, nil)
|
210
|
+
end
|
211
|
+
|
205
212
|
private
|
206
213
|
|
207
214
|
# Sets the HTTP status code for the response
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-10-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/hanami/action/cookie_jar.rb
|
116
116
|
- lib/hanami/action/cookies.rb
|
117
117
|
- lib/hanami/action/exposable.rb
|
118
|
+
- lib/hanami/action/exposable/guard.rb
|
118
119
|
- lib/hanami/action/flash.rb
|
119
120
|
- lib/hanami/action/glue.rb
|
120
121
|
- lib/hanami/action/head.rb
|