hoodoo 2.4.3 → 2.5.0
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/lib/hoodoo/client/client.rb +6 -6
- data/lib/hoodoo/client/endpoint/endpoint.rb +3 -3
- data/lib/hoodoo/services/middleware/exception_reporting/base_reporter.rb +1 -7
- data/lib/hoodoo/services/middleware/middleware.rb +5 -0
- data/lib/hoodoo/services/services/request.rb +40 -0
- data/lib/hoodoo/version.rb +2 -2
- data/spec/services/middleware/exception_reporting/base_reporter_spec.rb +5 -5
- data/spec/services/services/request_spec.rb +168 -41
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82cf349eadbadcea2eaeb98421fb6a9e8b35dd5b0f037b2089ff553d99b650d0
|
4
|
+
data.tar.gz: 20564a912fb0e68505cb59721b081a61a64227b9676343180b117bcc9246a982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 555bb645bc07d3b4db3ff5341683ea98d5dfeea6a7dc1347723f892a36171da59f6faccb36e4a75e8a4b950c62c173b969e435e3eb8c37bb58319b5753be442c
|
7
|
+
data.tar.gz: 7f4c18b64388d17816227885ba6078d0ddc6fd009ede81e00b76e799c42e0e93b2033eec1e0a9bfb5417449cee5869fa0fc6b78da100873d6d2a00e3f50f92cd
|
data/lib/hoodoo/client/client.rb
CHANGED
@@ -63,12 +63,12 @@ module Hoodoo
|
|
63
63
|
# implementation of such a Resource interface available! - as follows:
|
64
64
|
#
|
65
65
|
# results = members.list(
|
66
|
-
# :
|
67
|
-
# :
|
68
|
-
# :
|
69
|
-
# :
|
70
|
-
# :
|
71
|
-
# :
|
66
|
+
# offset: 50,
|
67
|
+
# limit: 25,
|
68
|
+
# sort: 'created_at',
|
69
|
+
# direction: 'asc',
|
70
|
+
# search: { 'surname' => 'Smith' },
|
71
|
+
# _embed: 'account'
|
72
72
|
# )
|
73
73
|
#
|
74
74
|
# This will return a Hoodoo::Client::AugmentedArray. This is an Array
|
@@ -189,7 +189,7 @@ module Hoodoo
|
|
189
189
|
# +query_hash+:: A hash of _unencoded_ data that can be encoded to form
|
190
190
|
# a query string. Search and filter data is represented
|
191
191
|
# with nested hashes. Embed and reference data uses an
|
192
|
-
# array. Example:
|
192
|
+
# array. All keys are Strings. Example:
|
193
193
|
#
|
194
194
|
# {
|
195
195
|
# offset: 75,
|
@@ -328,13 +328,13 @@ module Hoodoo
|
|
328
328
|
# Returns the +augmented_array+ passed in, with the +next_page_proc+
|
329
329
|
# value set.
|
330
330
|
#
|
331
|
-
def inject_enumeration_state
|
331
|
+
def inject_enumeration_state( augmented_array, query_hash )
|
332
332
|
|
333
333
|
endpoint = self
|
334
334
|
query_hash = query_hash.nil? ? {} : query_hash.dup
|
335
335
|
batch_size = [ 1, augmented_array.size ].max
|
336
336
|
augmented_array.next_page_proc = Proc.new do
|
337
|
-
query_hash[
|
337
|
+
query_hash[ 'offset' ] = ( query_hash[ 'offset' ] || 0 ) + batch_size
|
338
338
|
endpoint.list( query_hash )
|
339
339
|
end
|
340
340
|
|
@@ -162,13 +162,7 @@ module Hoodoo; module Services
|
|
162
162
|
:embeds => context.request.embeds,
|
163
163
|
:references => context.request.references,
|
164
164
|
:headers => context.request.headers,
|
165
|
-
:list =>
|
166
|
-
:offset => context.request.list.offset,
|
167
|
-
:limit => context.request.list.limit,
|
168
|
-
:sort_data => context.request.list.sort_data,
|
169
|
-
:search_data => context.request.list.search_data,
|
170
|
-
:filter_data => context.request.list.filter_data
|
171
|
-
}
|
165
|
+
:list => context.request.list.to_h
|
172
166
|
}
|
173
167
|
}
|
174
168
|
|
@@ -1292,6 +1292,11 @@ module Hoodoo; module Services
|
|
1292
1292
|
#
|
1293
1293
|
# For other kinds of data, check the secure actions to see if the body
|
1294
1294
|
# should be included.
|
1295
|
+
#
|
1296
|
+
# TODO: This uses deprecated acccessors into the "context.request.list"
|
1297
|
+
# object, but it keeps the code simple. It'd be nice to just have
|
1298
|
+
# e.g. "data[ :list ] = context.request.list.to_h()" but the
|
1299
|
+
# change in log output format might break dependent clients.
|
1295
1300
|
|
1296
1301
|
if context.response.body.is_a?( ::Array )
|
1297
1302
|
attributes = %i( list_offset list_limit list_sort_data list_search_data list_filter_data embeds references )
|
@@ -63,6 +63,46 @@ module Hoodoo; module Services
|
|
63
63
|
self.search_data = {}
|
64
64
|
self.filter_data = {}
|
65
65
|
end
|
66
|
+
|
67
|
+
# Represent the list data as a Hash, for uses such as persistence
|
68
|
+
# or loading into another session instance. The returned Hash is a
|
69
|
+
# full deep copy of any internal data; changing it will not alter
|
70
|
+
# the ListParameters object state.
|
71
|
+
#
|
72
|
+
# Top-level keys in the Hash are Strings corresponding to the names
|
73
|
+
# of accessor parameters:
|
74
|
+
#
|
75
|
+
# * +"offset"+
|
76
|
+
# * +"limit"+
|
77
|
+
# * +"sort_data"+
|
78
|
+
# * +"search_data"+
|
79
|
+
# * +"filter_data"+
|
80
|
+
#
|
81
|
+
# Sort, search and filter data, if not empty, also have String keys.
|
82
|
+
#
|
83
|
+
# See also #from_h!.
|
84
|
+
#
|
85
|
+
def to_h
|
86
|
+
{
|
87
|
+
'offset' => self.offset,
|
88
|
+
'limit' => self.limit,
|
89
|
+
'sort_data' => Hoodoo::Utilities.deep_dup( self.sort_data ),
|
90
|
+
'search_data' => Hoodoo::Utilities.deep_dup( self.search_data ),
|
91
|
+
'filter_data' => Hoodoo::Utilities.deep_dup( self.filter_data )
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
# Load list parameters from a given Hash, of the form set by #to_h.
|
96
|
+
# Overwrites any corresponding internal attributes and takes full
|
97
|
+
# deep copies of sort, search and filter values.
|
98
|
+
#
|
99
|
+
def from_h!( hash )
|
100
|
+
self.offset = hash[ 'offset' ] if hash.has_key?( 'offset' )
|
101
|
+
self.limit = hash[ 'limit' ] if hash.has_key?( 'limit' )
|
102
|
+
self.sort_data = Hoodoo::Utilities.deep_dup( hash[ 'sort_data' ] ) if hash[ 'sort_data' ].is_a?( Hash )
|
103
|
+
self.search_data = Hoodoo::Utilities.deep_dup( hash[ 'search_data' ] ) if hash[ 'search_data' ].is_a?( Hash )
|
104
|
+
self.filter_data = Hoodoo::Utilities.deep_dup( hash[ 'filter_data' ] ) if hash[ 'filter_data' ].is_a?( Hash )
|
105
|
+
end
|
66
106
|
end
|
67
107
|
|
68
108
|
# Requested locale for internationalised operations; +"en-nz"+ by
|
data/lib/hoodoo/version.rb
CHANGED
@@ -12,11 +12,11 @@ module Hoodoo
|
|
12
12
|
# The Hoodoo gem version. If this changes, be sure to re-run
|
13
13
|
# <tt>bundle install</tt> or <tt>bundle update</tt>.
|
14
14
|
#
|
15
|
-
VERSION = '2.
|
15
|
+
VERSION = '2.5.0'
|
16
16
|
|
17
17
|
# The Hoodoo gem date. If this changes, be sure to re-run
|
18
18
|
# <tt>bundle install</tt> or <tt>bundle update</tt>.
|
19
19
|
#
|
20
|
-
DATE = '2018-
|
20
|
+
DATE = '2018-05-17'
|
21
21
|
|
22
22
|
end
|
@@ -88,11 +88,11 @@ describe Hoodoo::Services::Middleware::ExceptionReporting::BaseReporter do
|
|
88
88
|
:references => [ 'r1', 'r2' ],
|
89
89
|
:headers => { 'HTTP_X_EXAMPLE' => '42' },
|
90
90
|
:list => {
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
91
|
+
'offset' => 0,
|
92
|
+
'limit' => 50,
|
93
|
+
'sort_data' => { 'created_at' => 'desc' },
|
94
|
+
'search_data' => { 'example' => '42' },
|
95
|
+
'filter_data' => { 'unexample' => '24' }
|
96
96
|
}
|
97
97
|
},
|
98
98
|
:session => Hoodoo::Services::Middleware.test_session().to_h()
|
@@ -1,12 +1,30 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hoodoo::Services::Request do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
before do
|
5
|
+
@r = Hoodoo::Services::Request.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'has correct default values' do
|
8
9
|
|
9
|
-
|
10
|
+
# For list parameters in @r.list, see later.
|
11
|
+
#
|
12
|
+
expect( @r.locale ).to eq( 'en-nz' )
|
13
|
+
expect( @r.dated_at ).to eq( nil )
|
14
|
+
expect( @r.body ).to eq( nil )
|
15
|
+
expect( @r.uri_path_components ).to eq( [] )
|
16
|
+
expect( @r.ident ).to eq( nil )
|
17
|
+
expect( @r.uri_path_extension ).to eq( '' )
|
18
|
+
expect( @r.embeds ).to eq( [] )
|
19
|
+
expect( @r.references ).to eq( [] )
|
20
|
+
expect( @r.headers ).to eq( {} )
|
21
|
+
|
22
|
+
expect( @r.headers.frozen? ).to eq( true )
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'uri_path_components' do
|
27
|
+
it 'records path components properly' do
|
10
28
|
ary = [ 'one', 'two', 'three' ]
|
11
29
|
@r.uri_path_components = ary
|
12
30
|
|
@@ -14,7 +32,7 @@ describe Hoodoo::Services::Request do
|
|
14
32
|
expect(@r.ident).to eq(ary.first)
|
15
33
|
end
|
16
34
|
|
17
|
-
it '
|
35
|
+
it 'deals with nil path components properly' do
|
18
36
|
ary = nil
|
19
37
|
@r.uri_path_components = ary
|
20
38
|
|
@@ -22,56 +40,165 @@ describe Hoodoo::Services::Request do
|
|
22
40
|
expect(@r.ident).to be_nil
|
23
41
|
end
|
24
42
|
|
25
|
-
it '
|
43
|
+
it 'deals with non-array path components properly' do
|
26
44
|
ary = 'not an array'
|
27
45
|
@r.uri_path_components = ary
|
28
46
|
|
29
47
|
expect(@r.uri_path_components).to be_nil
|
30
48
|
expect(@r.ident).to be_nil
|
31
49
|
end
|
50
|
+
end
|
32
51
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
52
|
+
it 'rationalises date/time' do
|
53
|
+
[ :dated_at, :dated_from ].each do | attr |
|
54
|
+
now = DateTime.now
|
55
|
+
@r.send( "#{ attr }=", now )
|
56
|
+
expect( @r.send( attr ) ).to eq( now )
|
38
57
|
|
39
|
-
|
40
|
-
|
41
|
-
|
58
|
+
now = DateTime.now + 10
|
59
|
+
@r.send( "#{ attr }=", now.to_time )
|
60
|
+
expect( @r.send( attr ) ).to eq( now )
|
42
61
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
62
|
+
now = DateTime.now + 20
|
63
|
+
@r.send( "#{ attr }=", Hoodoo::Utilities::nanosecond_iso8601( now ) )
|
64
|
+
expect( @r.send( attr ) ).to eq( now )
|
47
65
|
end
|
66
|
+
end
|
48
67
|
|
68
|
+
context '#list' do
|
49
69
|
it 'has correct default values' do
|
50
|
-
expect( @r.
|
51
|
-
expect( @r.
|
52
|
-
expect( @r.
|
53
|
-
expect( @r.
|
54
|
-
expect( @r.
|
55
|
-
expect( @r.uri_path_extension ).to eq( '' )
|
56
|
-
expect( @r.list.offset ).to eq( 0 )
|
57
|
-
expect( @r.list.limit ).to eq( 50 )
|
58
|
-
expect( @r.list_sort_data ).to eq( { 'created_at' => 'desc' } )
|
59
|
-
expect( @r.list.search_data ).to eq( {} )
|
60
|
-
expect( @r.list.filter_data ).to eq( {} )
|
61
|
-
expect( @r.embeds ).to eq( [] )
|
62
|
-
expect( @r.references ).to eq( [] )
|
63
|
-
expect( @r.headers ).to eq( {} )
|
64
|
-
|
65
|
-
expect( @r.headers.frozen? ).to eq( true )
|
70
|
+
expect( @r.list.offset ).to eq( 0 )
|
71
|
+
expect( @r.list.limit ).to eq( 50 )
|
72
|
+
expect( @r.list.sort_data ).to eq( { 'created_at' => 'desc' } )
|
73
|
+
expect( @r.list.search_data ).to eq( {} )
|
74
|
+
expect( @r.list.filter_data ).to eq( {} )
|
66
75
|
end
|
67
76
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
77
|
+
context 'and hashes via' do
|
78
|
+
before :each do
|
79
|
+
@offset = 1000
|
80
|
+
@limit = 500
|
81
|
+
@sort = { 'created_at' => 'asc' }
|
82
|
+
@search = { 'foo' => 'bar', 'bar' => { 'baz' => 3 } }
|
83
|
+
@filter = { 'bar' => 'foo', 'baz' => { 'bar' => 2 } }
|
84
|
+
|
85
|
+
@replacement_hash = {
|
86
|
+
'offset' => @offset,
|
87
|
+
'limit' => @limit,
|
88
|
+
'sort_data' => @sort,
|
89
|
+
'search_data' => @search,
|
90
|
+
'filter_data' => @filter
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
context '#to_h' do
|
95
|
+
before :each do
|
96
|
+
@r.list.offset = @offset
|
97
|
+
@r.list.limit = @limit
|
98
|
+
@r.list.sort_data = @sort
|
99
|
+
@r.list.search_data = @search
|
100
|
+
@r.list.filter_data = @filter
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns the expected Hash' do
|
104
|
+
expect( @r.list.to_h ).to eq( @replacement_hash )
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'deep-duplicates the parameters' do
|
108
|
+
result = @r.list.to_h()
|
109
|
+
|
110
|
+
old_sort_value = @sort[ @sort.keys.first ]
|
111
|
+
result[ 'sort_data' ][ @sort.keys.first ] == 'changed'
|
112
|
+
expect( @sort[ @sort.keys.first ] ).to eql( old_sort_value )
|
113
|
+
|
114
|
+
old_search_value = @search[ @search.keys.first ]
|
115
|
+
result[ 'search_data' ][ @search.keys.first ] == 'changed'
|
116
|
+
expect( @search[ @search.keys.first ] ).to eql( old_search_value )
|
117
|
+
|
118
|
+
old_filter_value = @filter[ @filter.keys.first ]
|
119
|
+
result[ 'filter_data' ][ @filter.keys.first ] == 'changed'
|
120
|
+
expect( @filter[ @filter.keys.first ] ).to eql( old_filter_value )
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context '#from_h!' do
|
125
|
+
it 'overwrites all parameters' do
|
126
|
+
request = Hoodoo::Services::Request.new
|
127
|
+
|
128
|
+
expect( request.list.offset ).to eq( 0 )
|
129
|
+
expect( request.list.limit ).to eq( 50 )
|
130
|
+
expect( request.list.sort_data ).to eq( { 'created_at' => 'desc' } )
|
131
|
+
expect( request.list.search_data ).to eq( {} )
|
132
|
+
expect( request.list.filter_data ).to eq( {} )
|
133
|
+
|
134
|
+
request.list.from_h!( @replacement_hash )
|
135
|
+
|
136
|
+
expect( request.list.offset ).to eq( @offset )
|
137
|
+
expect( request.list.limit ).to eq( @limit )
|
138
|
+
expect( request.list.sort_data ).to eq( @sort )
|
139
|
+
expect( request.list.search_data ).to eq( @search )
|
140
|
+
expect( request.list.filter_data ).to eq( @filter )
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'overwrites only provided parameters' do
|
144
|
+
replacements = {
|
145
|
+
'offset' => @offset,
|
146
|
+
'limit' => @limit,
|
147
|
+
'sort_data' => @sort,
|
148
|
+
'search_data' => @search,
|
149
|
+
'filter_data' => @filter
|
150
|
+
}
|
151
|
+
|
152
|
+
# Iterate over all the possible keys above and build a Hash that
|
153
|
+
# contains just one at a time. Make a new request, set the list
|
154
|
+
# options from the one-at-a-time Hash and verify that only that
|
155
|
+
# one parameter changed.
|
156
|
+
|
157
|
+
replacements.each do | replacement_key, replacement_value |
|
158
|
+
request = Hoodoo::Services::Request.new
|
159
|
+
clean = {
|
160
|
+
'offset' => request.list.offset,
|
161
|
+
'limit' => request.list.limit,
|
162
|
+
'sort_data' => request.list.sort_data,
|
163
|
+
'search_data' => request.list.search_data,
|
164
|
+
'filter_data' => request.list.filter_data
|
165
|
+
}
|
166
|
+
|
167
|
+
hash = { replacement_key => replacement_value }
|
168
|
+
request.list.from_h!( hash )
|
169
|
+
|
170
|
+
clean.each do | clean_key, clean_value |
|
171
|
+
if clean_key == replacement_key
|
172
|
+
expect( request.list.send( clean_key ) ).to eql( replacement_value )
|
173
|
+
else
|
174
|
+
expect( request.list.send( clean_key ) ).to eql( clean_value )
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context '#to_h and #from_h! together' do
|
182
|
+
before :each do
|
183
|
+
@r.list.offset = @offset
|
184
|
+
@r.list.limit = @limit
|
185
|
+
@r.list.sort_data = @sort
|
186
|
+
@r.list.search_data = @search
|
187
|
+
@r.list.filter_data = @filter
|
188
|
+
end
|
74
189
|
|
190
|
+
it 'translates from one list to another' do
|
191
|
+
hash = @r.list.to_h
|
192
|
+
|
193
|
+
request = Hoodoo::Services::Request.new
|
194
|
+
request.list.from_h!( hash )
|
195
|
+
|
196
|
+
expect( request.list.to_h ).to eql( @replacement_hash )
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'supports deprecated accessors' do
|
75
202
|
lo = 10
|
76
203
|
ll = 20
|
77
204
|
ke = 'foo'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hoodoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Loyalty New Zealand
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dalli
|