hoodoo 2.12.2 → 2.12.7
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/communicators/pool.rb +12 -4
- data/lib/hoodoo/presenters/base.rb +15 -3
- data/lib/hoodoo/presenters/common_resource_fields.rb +1 -0
- data/lib/hoodoo/presenters/types/hash.rb +1 -1
- data/lib/hoodoo/services/middleware/middleware.rb +4 -2
- data/lib/hoodoo/version.rb +2 -2
- data/spec/presenters/base_spec.rb +8 -3
- data/spec/presenters/common_resource_fields_spec.rb +3 -1
- data/spec/services/services/response_spec.rb +9 -9
- data/spec/utilities/utilities_spec.rb +1 -1
- metadata +7 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 430542c918e33830c23d09b1d4d6116f9d948bdca2d43f60c7b65c3a6d8be4f9
|
|
4
|
+
data.tar.gz: add79127d4fcc1ffa7a99a83c59bcdc47f6a766ce27c96fe3bd9f18f07874f8e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1464c30acc087565f5c609ce1fbf6f9048dd9c3f995f2094ecdf7e6328b43d2c952e013feec8550ba253c820f0fd70946d52b40e1a57a2ecdf98138ba4a8a0a0
|
|
7
|
+
data.tar.gz: 5bfbf36ce4b624de24ef07bd64ba12462e471e3755ee23ce891370535e63382b986efdd2716a7caf25d365d36e8a800cad46c371935d59dbaf9384210b56099b
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
# 15-Dec-2014 (ADH): Created.
|
|
10
10
|
########################################################################
|
|
11
11
|
|
|
12
|
+
require 'pp'
|
|
13
|
+
|
|
12
14
|
module Hoodoo
|
|
13
15
|
module Communicators
|
|
14
16
|
|
|
@@ -151,7 +153,7 @@ module Hoodoo
|
|
|
151
153
|
begin
|
|
152
154
|
communicator.communicate( object )
|
|
153
155
|
rescue => exception
|
|
154
|
-
handle_exception( exception, communicator )
|
|
156
|
+
handle_exception( exception, communicator, object )
|
|
155
157
|
end
|
|
156
158
|
|
|
157
159
|
else
|
|
@@ -333,6 +335,7 @@ module Hoodoo
|
|
|
333
335
|
#
|
|
334
336
|
loop do
|
|
335
337
|
|
|
338
|
+
obj = nil
|
|
336
339
|
# Exception handler block.
|
|
337
340
|
#
|
|
338
341
|
begin
|
|
@@ -342,20 +345,23 @@ module Hoodoo
|
|
|
342
345
|
#
|
|
343
346
|
loop do
|
|
344
347
|
entry = work_queue.shift() # ".shift" => FIFO, ".pop" would be LIFO
|
|
348
|
+
obj = nil
|
|
345
349
|
|
|
346
350
|
if entry.terminate?
|
|
347
351
|
::Thread.exit
|
|
348
352
|
elsif entry.sync?
|
|
353
|
+
|
|
349
354
|
sync_queue << :sync
|
|
350
355
|
elsif entry.dropped?
|
|
351
356
|
communicator.dropped( entry.dropped )
|
|
352
357
|
else
|
|
358
|
+
obj = entry.payload
|
|
353
359
|
communicator.communicate( entry.payload )
|
|
354
360
|
end
|
|
355
361
|
end
|
|
356
362
|
|
|
357
363
|
rescue => exception
|
|
358
|
-
handle_exception( exception, communicator )
|
|
364
|
+
handle_exception( exception, communicator, obj )
|
|
359
365
|
|
|
360
366
|
end
|
|
361
367
|
end
|
|
@@ -453,12 +459,14 @@ module Hoodoo
|
|
|
453
459
|
#
|
|
454
460
|
# +exception+:: Exception (or Exception subclass) instance to print.
|
|
455
461
|
# +communicator+:: Communicator instance that raised the exception.
|
|
462
|
+
# +obj+:: Parameter passed to the communicator subclass instance
|
|
463
|
+
# #communicate methods
|
|
456
464
|
#
|
|
457
|
-
def handle_exception( exception, communicator )
|
|
465
|
+
def handle_exception( exception, communicator, obj )
|
|
458
466
|
begin
|
|
459
467
|
report = "Communicator class #{ communicator.class.name } raised exception '#{ exception }': #{ exception.backtrace }"
|
|
460
468
|
$stderr.puts( report )
|
|
461
|
-
|
|
469
|
+
pp( obj, $stderr )
|
|
462
470
|
rescue
|
|
463
471
|
# If the above fails then everything else is probably about to
|
|
464
472
|
# collapse, but optimistically try to ignore the error and keep
|
|
@@ -90,12 +90,16 @@ module Hoodoo
|
|
|
90
90
|
# were used to create the Session under which the
|
|
91
91
|
# resource instance was created. Absent if omitted.
|
|
92
92
|
#
|
|
93
|
+
# +updated_at+:: Optional Date/Time of instance update. This is a Ruby
|
|
94
|
+
# DateTime instance or similar, _NOT_ a string!
|
|
95
|
+
#
|
|
93
96
|
def self.render( data,
|
|
94
97
|
uuid = nil,
|
|
95
98
|
created_at = nil,
|
|
96
99
|
language = 'en-nz',
|
|
97
|
-
created_by = nil
|
|
98
|
-
|
|
100
|
+
created_by = nil,
|
|
101
|
+
updated_at = nil
|
|
102
|
+
)
|
|
99
103
|
target = {}
|
|
100
104
|
data = data || {}
|
|
101
105
|
|
|
@@ -126,6 +130,7 @@ module Hoodoo
|
|
|
126
130
|
'created_at' => Hoodoo::Utilities.standard_datetime( created_at.to_datetime )
|
|
127
131
|
} )
|
|
128
132
|
|
|
133
|
+
target[ 'updated_at' ] = Hoodoo::Utilities.standard_datetime( updated_at.to_datetime ) unless updated_at.nil?
|
|
129
134
|
target[ 'created_by' ] = created_by unless created_by.nil?
|
|
130
135
|
target[ 'language' ] = language if self.is_internationalised?()
|
|
131
136
|
|
|
@@ -167,6 +172,9 @@ module Hoodoo
|
|
|
167
172
|
# +created_at+:: Same as the +created_at+ parameter to ::render, except
|
|
168
173
|
# mandatory.
|
|
169
174
|
#
|
|
175
|
+
# +updated_at+:: Optional value expressing the time the resource was last
|
|
176
|
+
# updated.
|
|
177
|
+
#
|
|
170
178
|
# +created_by+:: Optional fingerprint of the Caller whose credentials
|
|
171
179
|
# were used to create the Session under which the
|
|
172
180
|
# resource instance was created.
|
|
@@ -194,13 +202,14 @@ module Hoodoo
|
|
|
194
202
|
def self.render_in( context, data, options = {} )
|
|
195
203
|
uuid = options[ :uuid ]
|
|
196
204
|
created_at = options[ :created_at ]
|
|
205
|
+
updated_at = options[ :updated_at ]
|
|
197
206
|
created_by = options[ :created_by ]
|
|
198
207
|
language = options[ :language ] || context.request.locale
|
|
199
208
|
secured_with = options[ :secured_with ]
|
|
200
209
|
embeds = options[ :embeds ]
|
|
201
210
|
references = options[ :references ]
|
|
202
211
|
|
|
203
|
-
target = self.render( data, uuid, created_at, language, created_by )
|
|
212
|
+
target = self.render( data, uuid, created_at, language, created_by, updated_at )
|
|
204
213
|
|
|
205
214
|
if defined?( ::ActiveRecord ) && secured_with.is_a?( ::ActiveRecord::Base )
|
|
206
215
|
result_hash = {}
|
|
@@ -251,6 +260,9 @@ module Hoodoo
|
|
|
251
260
|
created_by = data[ :created_by ]
|
|
252
261
|
common_fields[ 'created_by' ] = created_by unless created_by.nil?
|
|
253
262
|
|
|
263
|
+
updated_at = data[ :updated_at ]
|
|
264
|
+
common_fields[ 'updated_at' ] = updated_at unless updated_at.nil?
|
|
265
|
+
|
|
254
266
|
if self.is_internationalised?
|
|
255
267
|
common_fields[ 'internationalised' ] = data[ 'internationalised' ]
|
|
256
268
|
Hoodoo::Presenters::CommonResourceFields.get_schema.properties[ 'language' ].required = true
|
|
@@ -62,7 +62,7 @@ module Hoodoo
|
|
|
62
62
|
# If an explicit type is given, use that. Otherwise, default to Field
|
|
63
63
|
# if no block is given, or Object is a block is given.
|
|
64
64
|
#
|
|
65
|
-
value_klass = !options[:type].
|
|
65
|
+
value_klass = !(options[:type].nil? || options[:type] == '') ? type_option_to_class( options.delete( :type ) ) :
|
|
66
66
|
(block_given? ? Hoodoo::Presenters::Object : Hoodoo::Presenters::Field)
|
|
67
67
|
|
|
68
68
|
# If we're defining specific keys and some of those keys have fields
|
|
@@ -132,12 +132,14 @@ module Hoodoo; module Services
|
|
|
132
132
|
MAXIMUM_PAYLOAD_SIZE = 1048576 # 1MB Should Be Enough For Anyone
|
|
133
133
|
|
|
134
134
|
# Maximum *logged* payload (inbound data) size.
|
|
135
|
+
# Keep consistent with max payload size so data is not lost from the logs.
|
|
135
136
|
#
|
|
136
|
-
MAXIMUM_LOGGED_PAYLOAD_SIZE =
|
|
137
|
+
MAXIMUM_LOGGED_PAYLOAD_SIZE = MAXIMUM_PAYLOAD_SIZE
|
|
137
138
|
|
|
138
139
|
# Maximum *logged* response (outbound data) size.
|
|
140
|
+
# Keep consistent with max payload size so data is not lost from the logs.
|
|
139
141
|
#
|
|
140
|
-
MAXIMUM_LOGGED_RESPONSE_SIZE =
|
|
142
|
+
MAXIMUM_LOGGED_RESPONSE_SIZE = MAXIMUM_PAYLOAD_SIZE
|
|
141
143
|
|
|
142
144
|
# The default test session; a Hoodoo::Services::Session instance with the
|
|
143
145
|
# following characteristics:
|
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.12.
|
|
15
|
+
VERSION = '2.12.7'
|
|
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 = '
|
|
20
|
+
DATE = '2021-02-12'
|
|
21
21
|
|
|
22
22
|
end
|
|
@@ -362,7 +362,8 @@ describe '#schema' do
|
|
|
362
362
|
Hoodoo::UUID.generate,
|
|
363
363
|
Time.now,
|
|
364
364
|
'en-gb',
|
|
365
|
-
Hoodoo::UUID.generate
|
|
365
|
+
Hoodoo::UUID.generate,
|
|
366
|
+
Time.now
|
|
366
367
|
)
|
|
367
368
|
|
|
368
369
|
expect(Hoodoo::Data::Resources::World.validate(rendered, true).errors).to eq([])
|
|
@@ -707,6 +708,7 @@ describe '#schema' do
|
|
|
707
708
|
'id' => @uuid,
|
|
708
709
|
'kind' => 'World',
|
|
709
710
|
'created_at' => Hoodoo::Utilities.standard_datetime( @time ),
|
|
711
|
+
'updated_at' => Hoodoo::Utilities.standard_datetime( @time ),
|
|
710
712
|
'language' => 'en-gb',
|
|
711
713
|
'errors_id' => @input['errors_id'],
|
|
712
714
|
'test_tags' => 'foo,bar,baz',
|
|
@@ -729,7 +731,9 @@ describe '#schema' do
|
|
|
729
731
|
@input,
|
|
730
732
|
@uuid,
|
|
731
733
|
@time,
|
|
732
|
-
'en-gb'
|
|
734
|
+
'en-gb',
|
|
735
|
+
nil,
|
|
736
|
+
@time
|
|
733
737
|
)
|
|
734
738
|
).to( eq( @output ) )
|
|
735
739
|
end
|
|
@@ -744,7 +748,8 @@ describe '#schema' do
|
|
|
744
748
|
@uuid,
|
|
745
749
|
@time,
|
|
746
750
|
'en-gb',
|
|
747
|
-
fingerprint
|
|
751
|
+
fingerprint,
|
|
752
|
+
@time
|
|
748
753
|
)
|
|
749
754
|
).to( eq( @output ) )
|
|
750
755
|
end
|
|
@@ -6,13 +6,15 @@ describe Hoodoo::Presenters::CommonResourceFields do
|
|
|
6
6
|
|
|
7
7
|
expect(schema.is_internationalised?()).to eq(false)
|
|
8
8
|
|
|
9
|
-
expect(schema.properties.count).to eq(
|
|
9
|
+
expect(schema.properties.count).to eq(8)
|
|
10
10
|
|
|
11
11
|
expect(schema.properties['id']).to be_a(Hoodoo::Presenters::UUID)
|
|
12
12
|
expect(schema.properties['id'].required).to eq(true)
|
|
13
13
|
expect(schema.properties['id'].resource).to be_nil
|
|
14
14
|
expect(schema.properties['created_at']).to be_a(Hoodoo::Presenters::DateTime)
|
|
15
15
|
expect(schema.properties['created_at'].required).to eq(true)
|
|
16
|
+
expect(schema.properties['updated_at']).to be_a(Hoodoo::Presenters::DateTime)
|
|
17
|
+
expect(schema.properties['updated_at'].required).to eq(false)
|
|
16
18
|
expect(schema.properties['kind']).to be_a(Hoodoo::Presenters::Text)
|
|
17
19
|
expect(schema.properties['kind'].required).to eq(true)
|
|
18
20
|
expect(schema.properties['language']).to be_a(Hoodoo::Presenters::Text)
|
|
@@ -160,7 +160,7 @@ describe Hoodoo::Services::Response do
|
|
|
160
160
|
expected = JSON.generate({})
|
|
161
161
|
expect(status).to eq(200)
|
|
162
162
|
expect(headers).to eq({'Content-Length' => expected.length.to_s})
|
|
163
|
-
expect(body
|
|
163
|
+
expect(body).to eq([expected])
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
it 'should return header data correctly' do
|
|
@@ -172,7 +172,7 @@ describe Hoodoo::Services::Response do
|
|
|
172
172
|
expected = JSON.generate({})
|
|
173
173
|
expect(status).to eq(200)
|
|
174
174
|
expect(headers).to eq({'X-Foo' => 'baz', 'X-Bar' => 'boo', 'Content-Length' => expected.length.to_s})
|
|
175
|
-
expect(body
|
|
175
|
+
expect(body).to eq([expected])
|
|
176
176
|
end
|
|
177
177
|
|
|
178
178
|
it 'should return error condition Rack data correctly' do
|
|
@@ -187,7 +187,7 @@ describe Hoodoo::Services::Response do
|
|
|
187
187
|
expected = JSON.generate(errors_hash)
|
|
188
188
|
expect(status).to eq(422) # From the first error we stored, not the second
|
|
189
189
|
expect(headers).to eq({'Content-Length' => expected.length.to_s})
|
|
190
|
-
expect(body
|
|
190
|
+
expect(body).to eq([expected])
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
it 'should return non-error condition Rack data correctly with a Hash body' do
|
|
@@ -199,7 +199,7 @@ describe Hoodoo::Services::Response do
|
|
|
199
199
|
expected = JSON.generate(response_hash)
|
|
200
200
|
expect(status).to eq(200) # From the first error we stored, not the second
|
|
201
201
|
expect(headers).to eq({'Content-Length' => expected.length.to_s})
|
|
202
|
-
expect(body
|
|
202
|
+
expect(body).to eq([expected])
|
|
203
203
|
end
|
|
204
204
|
|
|
205
205
|
it 'returns non-error condition Rack data correctly with an Array body' do
|
|
@@ -211,7 +211,7 @@ describe Hoodoo::Services::Response do
|
|
|
211
211
|
expected = JSON.generate({'_data' => response_array})
|
|
212
212
|
expect(status).to eq(200) # From the first error we stored, not the second
|
|
213
213
|
expect(headers).to eq({'Content-Length' => expected.length.to_s})
|
|
214
|
-
expect(body
|
|
214
|
+
expect(body).to eq([expected])
|
|
215
215
|
end
|
|
216
216
|
|
|
217
217
|
it 'returns non-error condition Rack data correctly with a dataset size' do
|
|
@@ -223,7 +223,7 @@ describe Hoodoo::Services::Response do
|
|
|
223
223
|
expected = JSON.generate( { '_data' => response_array, '_dataset_size' => response_array.count } )
|
|
224
224
|
expect( status ).to eq( 200 )
|
|
225
225
|
expect( headers ).to eq( { 'Content-Length' => expected.length.to_s } )
|
|
226
|
-
expect( body
|
|
226
|
+
expect( body ).to eq( [ expected ] )
|
|
227
227
|
end
|
|
228
228
|
|
|
229
229
|
it 'returns non-error condition Rack data correctly with an estimated dataset size' do
|
|
@@ -235,7 +235,7 @@ describe Hoodoo::Services::Response do
|
|
|
235
235
|
expected = JSON.generate( { '_data' => response_array, '_estimated_dataset_size' => response_array.count } )
|
|
236
236
|
expect( status ).to eq( 200 )
|
|
237
237
|
expect( headers ).to eq( { 'Content-Length' => expected.length.to_s } )
|
|
238
|
-
expect( body
|
|
238
|
+
expect( body ).to eq( [ expected ] )
|
|
239
239
|
end
|
|
240
240
|
|
|
241
241
|
it 'returns non-error condition Rack data correctly with both an accurate and an estimated dataset size' do
|
|
@@ -252,7 +252,7 @@ describe Hoodoo::Services::Response do
|
|
|
252
252
|
|
|
253
253
|
expect( status ).to eq( 200 )
|
|
254
254
|
expect( headers ).to eq( { 'Content-Length' => expected.length.to_s } )
|
|
255
|
-
expect( body
|
|
255
|
+
expect( body ).to eq( [ expected ] )
|
|
256
256
|
end
|
|
257
257
|
|
|
258
258
|
it 'should allow pre-encoded strings in the body' do
|
|
@@ -261,7 +261,7 @@ describe Hoodoo::Services::Response do
|
|
|
261
261
|
status, headers, body = @r.for_rack
|
|
262
262
|
|
|
263
263
|
expect(status).to eq(200)
|
|
264
|
-
expect(body
|
|
264
|
+
expect(body).to eq(['Hello World!'])
|
|
265
265
|
end
|
|
266
266
|
|
|
267
267
|
it 'should raise an exception when the body is in an unsupported format' do
|
|
@@ -604,7 +604,7 @@ describe Hoodoo::Utilities do
|
|
|
604
604
|
end
|
|
605
605
|
|
|
606
606
|
after :each do
|
|
607
|
-
@old_tz.
|
|
607
|
+
(@old_tz.nil? || @old_tz == '') ? ENV.delete( 'TZ' ) : ENV[ 'TZ' ] = @old_tz
|
|
608
608
|
end
|
|
609
609
|
|
|
610
610
|
it 'accepts a non-UTC Time and renders a UTC date-time' do
|
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.12.
|
|
4
|
+
version: 2.12.7
|
|
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:
|
|
11
|
+
date: 2021-02-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -184,28 +184,28 @@ dependencies:
|
|
|
184
184
|
requirements:
|
|
185
185
|
- - "~>"
|
|
186
186
|
- !ruby/object:Gem::Version
|
|
187
|
-
version:
|
|
187
|
+
version: 5.2.4.3
|
|
188
188
|
type: :development
|
|
189
189
|
prerelease: false
|
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
|
191
191
|
requirements:
|
|
192
192
|
- - "~>"
|
|
193
193
|
- !ruby/object:Gem::Version
|
|
194
|
-
version:
|
|
194
|
+
version: 5.2.4.3
|
|
195
195
|
- !ruby/object:Gem::Dependency
|
|
196
196
|
name: activesupport
|
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
|
198
198
|
requirements:
|
|
199
199
|
- - "~>"
|
|
200
200
|
- !ruby/object:Gem::Version
|
|
201
|
-
version:
|
|
201
|
+
version: 5.2.4.3
|
|
202
202
|
type: :development
|
|
203
203
|
prerelease: false
|
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
|
205
205
|
requirements:
|
|
206
206
|
- - "~>"
|
|
207
207
|
- !ruby/object:Gem::Version
|
|
208
|
-
version:
|
|
208
|
+
version: 5.2.4.3
|
|
209
209
|
- !ruby/object:Gem::Dependency
|
|
210
210
|
name: database_cleaner
|
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -598,8 +598,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
598
598
|
- !ruby/object:Gem::Version
|
|
599
599
|
version: '0'
|
|
600
600
|
requirements: []
|
|
601
|
-
|
|
602
|
-
rubygems_version: 2.7.7
|
|
601
|
+
rubygems_version: 3.2.9
|
|
603
602
|
signing_key:
|
|
604
603
|
specification_version: 4
|
|
605
604
|
summary: Opinionated APIs
|