hanami-controller 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +1 -1
- data/hanami-controller.gemspec +2 -2
- data/lib/hanami/action/base_params.rb +20 -30
- data/lib/hanami/action/mime.rb +39 -17
- data/lib/hanami/controller/configuration.rb +17 -2
- data/lib/hanami/controller/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f54bdf6d87a22221ce3dae2d7c17ceb8b8097fcc
|
4
|
+
data.tar.gz: 1a7108c3fcb857a3a6f5a84055f25afb144b65af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41cebc4b699df51ee187a0423ae9b062299cc374f24e0511defe3ec869aab0833b04044e10aacb0b7b96ff9416b7e975e99576b1d8afd4cef535f7047d5e2f4a
|
7
|
+
data.tar.gz: d852c7b7c2a3de1f9fdeb2b6a21d034bed9d61efdb0e1187a38e16a2addba194a40094c31f578d0674b6b1dd30a194b2c7e33e2ffd24fa45a58e8349de4c0675
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
# Hanami::Controller
|
2
2
|
Complete, fast and testable actions for Rack
|
3
3
|
|
4
|
+
## v0.8.0 - 2016-11-15
|
5
|
+
### Added
|
6
|
+
- [Marion Duprey] Allow `BaseParams#get` to read (nested) arrays
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
- [Russell Cloak] Respect custom formats when referenced by HTTP `Accept`
|
10
|
+
- [Kyle Chong] Don't symbolize raw params
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
- [Luca Guidi] Let `BaseParams#get` to accept a list of keys (symbols) instead of string with dot notation (`params.get(:customer, :address, :city)` instead of `params.get('customer.address.city')`)
|
14
|
+
|
4
15
|
## v0.7.1 - 2016-10-06
|
5
16
|
### Added
|
6
17
|
- [Kyle Chong] Introduced `parsed_request_body` for action
|
data/README.md
CHANGED
data/hanami-controller.gemspec
CHANGED
@@ -17,10 +17,10 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = []
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
|
-
spec.required_ruby_version = '>= 2.
|
20
|
+
spec.required_ruby_version = '>= 2.3.0'
|
21
21
|
|
22
22
|
spec.add_dependency 'rack', '~> 1.6', '>= 1.6.2'
|
23
|
-
spec.add_dependency 'hanami-utils', '~> 0.
|
23
|
+
spec.add_dependency 'hanami-utils', '~> 0.9'
|
24
24
|
|
25
25
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
26
26
|
spec.add_development_dependency 'rack-test', '~> 0.6'
|
@@ -15,14 +15,6 @@ module Hanami
|
|
15
15
|
# @since 0.7.0
|
16
16
|
ROUTER_PARAMS = 'router.params'.freeze
|
17
17
|
|
18
|
-
# Separator for #get
|
19
|
-
#
|
20
|
-
# @since 0.7.0
|
21
|
-
# @api private
|
22
|
-
#
|
23
|
-
# @see Hanami::Action::Params#get
|
24
|
-
GET_SEPARATOR = '.'.freeze
|
25
|
-
|
26
18
|
# @attr_reader env [Hash] the Rack env
|
27
19
|
#
|
28
20
|
# @since 0.7.0
|
@@ -45,7 +37,7 @@ module Hanami
|
|
45
37
|
def initialize(env)
|
46
38
|
@env = env
|
47
39
|
@raw = _extract_params
|
48
|
-
@params = Utils::Hash.new(@raw).symbolize!.to_h
|
40
|
+
@params = Utils::Hash.new(@raw).deep_dup.symbolize!.to_h
|
49
41
|
freeze
|
50
42
|
end
|
51
43
|
|
@@ -61,14 +53,12 @@ module Hanami
|
|
61
53
|
end
|
62
54
|
|
63
55
|
# Get an attribute value associated with the given key.
|
64
|
-
# Nested attributes are reached
|
56
|
+
# Nested attributes are reached by listing all the keys to get to the value.
|
65
57
|
#
|
66
|
-
# @param
|
58
|
+
# @param keys [Array<Symbol,Integer>] the key
|
67
59
|
#
|
68
60
|
# @return [Object,NilClass] return the associated value, if found
|
69
61
|
#
|
70
|
-
# @raise [NoMethodError] if key is nil
|
71
|
-
#
|
72
62
|
# @since 0.7.0
|
73
63
|
#
|
74
64
|
# @example
|
@@ -79,30 +69,30 @@ module Hanami
|
|
79
69
|
# include Hanami::Action
|
80
70
|
#
|
81
71
|
# def call(params)
|
82
|
-
# params.get(
|
83
|
-
# params.get(
|
72
|
+
# params.get(:customer_name) # => "Luca"
|
73
|
+
# params.get(:uknown) # => nil
|
84
74
|
#
|
85
|
-
# params.get(
|
86
|
-
# params.get(
|
75
|
+
# params.get(:address, :city) # => "Rome"
|
76
|
+
# params.get(:address, :unknown) # => nil
|
87
77
|
#
|
88
|
-
# params.get(
|
78
|
+
# params.get(:tags, 0) # => "foo"
|
79
|
+
# params.get(:tags, 1) # => "bar"
|
80
|
+
# params.get(:tags, 999) # => nil
|
81
|
+
#
|
82
|
+
# params.get(nil) # => nil
|
89
83
|
# end
|
90
84
|
# end
|
91
85
|
# end
|
92
|
-
def get(
|
93
|
-
|
94
|
-
return if key.nil?
|
95
|
-
|
96
|
-
result = self[key.to_sym]
|
97
|
-
|
98
|
-
Array(keys).each do |k|
|
99
|
-
break if result.nil?
|
100
|
-
result = result[k.to_sym]
|
101
|
-
end
|
102
|
-
|
103
|
-
result
|
86
|
+
def get(*keys)
|
87
|
+
@params.dig(*keys)
|
104
88
|
end
|
105
89
|
|
90
|
+
# This is for compatibility with Hanami::Helpers::FormHelper::Values
|
91
|
+
#
|
92
|
+
# @api private
|
93
|
+
# @since 0.8.0
|
94
|
+
alias dig get
|
95
|
+
|
106
96
|
# Provide a common interface with Params
|
107
97
|
#
|
108
98
|
# @return [TrueClass] always returns true
|
data/lib/hanami/action/mime.rb
CHANGED
@@ -41,12 +41,6 @@ module Hanami
|
|
41
41
|
# @api private
|
42
42
|
DEFAULT_CHARSET = 'utf-8'.freeze
|
43
43
|
|
44
|
-
# The default mime types list
|
45
|
-
#
|
46
|
-
# @since 0.6.1
|
47
|
-
# @api private
|
48
|
-
MIME_TYPES = ::Rack::Mime::MIME_TYPES.values.freeze
|
49
|
-
|
50
44
|
# Override Ruby's hook for modules.
|
51
45
|
# It includes Mime types logic
|
52
46
|
#
|
@@ -180,9 +174,11 @@ module Hanami
|
|
180
174
|
# The content type that will be automatically set in the response.
|
181
175
|
#
|
182
176
|
# It prefers, in order:
|
183
|
-
# * Explicit set value (see #format=)
|
184
|
-
# * Weighted value from Accept
|
185
|
-
#
|
177
|
+
# * Explicit set value (see Hanami::Action::Mime#format=)
|
178
|
+
# * Weighted value from Accept header based on all known MIME Types:
|
179
|
+
# - Custom registered MIME Types (see Hanami::Controller::Configuration#format)
|
180
|
+
# * Configured default content type (see Hanami::Controller::Configuration#default_response_format)
|
181
|
+
# * Hard-coded default content type (see Hanami::Action::Mime::DEFAULT_CONTENT_TYPE)
|
186
182
|
#
|
187
183
|
# To override the value, use <tt>#format=</tt>
|
188
184
|
#
|
@@ -194,6 +190,8 @@ module Hanami
|
|
194
190
|
# @see Hanami::Configuration#default_request_format
|
195
191
|
# @see Hanami::Action::Mime#default_content_type
|
196
192
|
# @see Hanami::Action::Mime#DEFAULT_CONTENT_TYPE
|
193
|
+
# @see Hanami::Controller::Configuration#format
|
194
|
+
# @see Hanami::Controller::Configuration#default_response_format
|
197
195
|
#
|
198
196
|
# @example
|
199
197
|
# require 'hanami/controller'
|
@@ -207,7 +205,14 @@ module Hanami
|
|
207
205
|
# end
|
208
206
|
# end
|
209
207
|
def content_type
|
210
|
-
@content_type
|
208
|
+
return @content_type unless @content_type.nil?
|
209
|
+
|
210
|
+
if accept_header?
|
211
|
+
type = content_type_from_accept_header
|
212
|
+
return type if type
|
213
|
+
end
|
214
|
+
|
215
|
+
default_response_type || default_content_type || DEFAULT_CONTENT_TYPE
|
211
216
|
end
|
212
217
|
|
213
218
|
# Action charset setter, receives new charset value
|
@@ -427,20 +432,37 @@ module Hanami
|
|
427
432
|
end
|
428
433
|
end
|
429
434
|
|
430
|
-
private
|
431
|
-
|
432
435
|
# @since 0.1.0
|
433
436
|
# @api private
|
434
437
|
def accept
|
435
438
|
@accept ||= @_env[HTTP_ACCEPT] || DEFAULT_ACCEPT
|
436
439
|
end
|
437
440
|
|
438
|
-
#
|
441
|
+
# Checks if there is an Accept header for the current request.
|
442
|
+
#
|
443
|
+
# @return [TrueClass,FalseClass] the result of the check
|
444
|
+
#
|
445
|
+
# @since 0.8.0
|
439
446
|
# @api private
|
440
|
-
def
|
441
|
-
|
442
|
-
|
443
|
-
|
447
|
+
def accept_header?
|
448
|
+
accept != DEFAULT_ACCEPT
|
449
|
+
end
|
450
|
+
|
451
|
+
# Look at the Accept header for the current request and see if it
|
452
|
+
# matches any of the common MIME types (see Hanami::Action::Mime#MIME_TYPES)
|
453
|
+
# or the custom registered ones (see Hanami::Controller::Configuration#format).
|
454
|
+
#
|
455
|
+
# @return [String,Nil] The matched MIME type for the given Accept header.
|
456
|
+
#
|
457
|
+
# @since 0.8.0
|
458
|
+
# @api private
|
459
|
+
#
|
460
|
+
# @see Hanami::Action::Mime#MIME_TYPES
|
461
|
+
# @see Hanami::Controller::Configuration#format
|
462
|
+
#
|
463
|
+
# @api private
|
464
|
+
def content_type_from_accept_header
|
465
|
+
best_q_match(accept, configuration.mime_types)
|
444
466
|
end
|
445
467
|
|
446
468
|
# @since 0.5.0
|
@@ -402,8 +402,22 @@ module Hanami
|
|
402
402
|
def format(hash)
|
403
403
|
symbol, mime_type = *Utils::Kernel.Array(hash)
|
404
404
|
|
405
|
-
@formats
|
406
|
-
|
405
|
+
@formats[Utils::Kernel.String(mime_type)] = Utils::Kernel.Symbol(symbol)
|
406
|
+
@mime_types = nil
|
407
|
+
end
|
408
|
+
|
409
|
+
# Return the configured format's MIME types
|
410
|
+
#
|
411
|
+
# @since 0.8.0
|
412
|
+
# @api private
|
413
|
+
#
|
414
|
+
# @see Hanami::Controller::Configuration#format
|
415
|
+
# @see Hanami::Action::Mime::MIME_TYPES
|
416
|
+
def mime_types
|
417
|
+
@mime_types ||= begin
|
418
|
+
((@formats.keys - DEFAULT_FORMATS.keys) +
|
419
|
+
::Rack::Mime::MIME_TYPES.values).freeze
|
420
|
+
end
|
407
421
|
end
|
408
422
|
|
409
423
|
# Set a format as default fallback for all the requests without a strict
|
@@ -650,6 +664,7 @@ module Hanami
|
|
650
664
|
@handled_exceptions = {}
|
651
665
|
@modules = []
|
652
666
|
@formats = DEFAULT_FORMATS.dup
|
667
|
+
@mime_types = nil
|
653
668
|
@default_request_format = nil
|
654
669
|
@default_response_format = nil
|
655
670
|
@default_charset = nil
|
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.
|
4
|
+
version: 0.8.0
|
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-11-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -38,14 +38,14 @@ dependencies:
|
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '0.
|
41
|
+
version: '0.9'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '0.
|
48
|
+
version: '0.9'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: bundler
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
146
146
|
requirements:
|
147
147
|
- - ">="
|
148
148
|
- !ruby/object:Gem::Version
|
149
|
-
version: 2.
|
149
|
+
version: 2.3.0
|
150
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
152
|
- - ">="
|