contentful 2.14.0 → 2.15.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +24 -0
- data/README.md +2 -0
- data/contentful.gemspec +2 -2
- data/contentful.rb.sublime-project +9 -0
- data/contentful.rb.sublime-workspace +2154 -0
- data/lib/contentful/array.rb +9 -4
- data/lib/contentful/array_like.rb +2 -2
- data/lib/contentful/asset.rb +10 -4
- data/lib/contentful/base_resource.rb +15 -1
- data/lib/contentful/client.rb +4 -3
- data/lib/contentful/entry.rb +2 -1
- data/lib/contentful/fields_resource.rb +1 -5
- data/lib/contentful/request.rb +6 -1
- data/lib/contentful/resource_builder.rb +4 -3
- data/lib/contentful/version.rb +1 -1
- data/spec/array_spec.rb +29 -0
- data/spec/client_class_spec.rb +1 -1
- data/spec/client_configuration_spec.rb +17 -0
- data/spec/entry_spec.rb +30 -0
- data/spec/fixtures/vcr_cassettes/entries/unresolvable_assets.yml +89 -0
- data/spec/fixtures/vcr_cassettes/query_array_1.yml +89 -0
- data/spec/fixtures/vcr_cassettes/query_array_2.yml +89 -0
- metadata +49 -36
data/lib/contentful/array.rb
CHANGED
@@ -11,13 +11,15 @@ module Contentful
|
|
11
11
|
|
12
12
|
include Contentful::ArrayLike
|
13
13
|
|
14
|
-
attr_reader :total, :limit, :skip, :items, :endpoint
|
14
|
+
attr_reader :total, :limit, :skip, :items, :endpoint, :query
|
15
15
|
|
16
16
|
def initialize(item = nil,
|
17
17
|
configuration = {
|
18
18
|
default_locale: Contentful::Client::DEFAULT_CONFIGURATION[:default_locale]
|
19
19
|
},
|
20
|
-
endpoint = '',
|
20
|
+
endpoint = '',
|
21
|
+
query = {},
|
22
|
+
*)
|
21
23
|
super(item, configuration)
|
22
24
|
|
23
25
|
@endpoint = endpoint
|
@@ -25,11 +27,12 @@ module Contentful
|
|
25
27
|
@limit = item.fetch('limit', nil)
|
26
28
|
@skip = item.fetch('skip', nil)
|
27
29
|
@items = item.fetch('items', [])
|
30
|
+
@query = query
|
28
31
|
end
|
29
32
|
|
30
33
|
# @private
|
31
34
|
def marshal_dump
|
32
|
-
super.merge(endpoint: endpoint)
|
35
|
+
super.merge(endpoint: endpoint, query: query)
|
33
36
|
end
|
34
37
|
|
35
38
|
# @private
|
@@ -39,6 +42,7 @@ module Contentful
|
|
39
42
|
@total = raw.fetch('total', nil)
|
40
43
|
@limit = raw.fetch('limit', nil)
|
41
44
|
@skip = raw.fetch('skip', nil)
|
45
|
+
@query = raw_object[:query]
|
42
46
|
@items = raw.fetch('items', []).map do |item|
|
43
47
|
require_relative 'resource_builder'
|
44
48
|
ResourceBuilder.new(
|
@@ -72,7 +76,8 @@ module Contentful
|
|
72
76
|
'Asset' => 'assets',
|
73
77
|
'Locale' => 'locales'
|
74
78
|
}
|
75
|
-
|
79
|
+
|
80
|
+
client.public_send(plurals[items.first.type], query.merge(limit: limit, skip: new_skip))
|
76
81
|
end
|
77
82
|
end
|
78
83
|
end
|
data/lib/contentful/asset.rb
CHANGED
@@ -10,10 +10,7 @@ module Contentful
|
|
10
10
|
|
11
11
|
# @private
|
12
12
|
def marshal_dump
|
13
|
-
|
14
|
-
configuration: @configuration,
|
15
|
-
raw: raw
|
16
|
-
}
|
13
|
+
super.merge(raw: raw)
|
17
14
|
end
|
18
15
|
|
19
16
|
# @private
|
@@ -23,6 +20,11 @@ module Contentful
|
|
23
20
|
define_asset_methods!
|
24
21
|
end
|
25
22
|
|
23
|
+
# @private
|
24
|
+
def known_link?(*)
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
26
28
|
# @private
|
27
29
|
def inspect
|
28
30
|
"<#{repr_name} id='#{sys[:id]}' url='#{url}'>"
|
@@ -91,6 +93,10 @@ module Contentful
|
|
91
93
|
end
|
92
94
|
|
93
95
|
def define_asset_methods!
|
96
|
+
define_singleton_method :title do
|
97
|
+
fields.fetch(:title, nil)
|
98
|
+
end
|
99
|
+
|
94
100
|
define_singleton_method :description do
|
95
101
|
fields.fetch(:description, nil)
|
96
102
|
end
|
@@ -31,14 +31,28 @@ module Contentful
|
|
31
31
|
|
32
32
|
# @private
|
33
33
|
def marshal_dump
|
34
|
+
entry_mapping = @configuration[:entry_mapping].each_with_object({}) do |(k, v), res|
|
35
|
+
res[k] = v.to_s
|
36
|
+
end
|
37
|
+
|
34
38
|
{
|
35
|
-
|
39
|
+
# loggers usually have a file handle that can't be marshalled, so let's not return that
|
40
|
+
configuration: @configuration.merge(entry_mapping: entry_mapping, logger: nil),
|
36
41
|
raw: raw
|
37
42
|
}
|
38
43
|
end
|
39
44
|
|
40
45
|
# @private
|
41
46
|
def marshal_load(raw_object)
|
47
|
+
raw_object[:configuration][:entry_mapping] = raw_object[:configuration].fetch(:entry_mapping, {}).each_with_object({}) do |(k, v), res|
|
48
|
+
begin
|
49
|
+
v = v.to_s unless v.is_a?(::String)
|
50
|
+
res[k] = v.split('::').inject(Object) { |o, c| o.const_get c }
|
51
|
+
rescue
|
52
|
+
next
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
42
56
|
@raw = raw_object[:raw]
|
43
57
|
@configuration = raw_object[:configuration]
|
44
58
|
@default_locale = @configuration[:default_locale]
|
data/lib/contentful/client.rb
CHANGED
@@ -30,7 +30,6 @@ module Contentful
|
|
30
30
|
raw_mode: false,
|
31
31
|
gzip_encoded: true,
|
32
32
|
logger: false,
|
33
|
-
log_level: Logger::INFO,
|
34
33
|
proxy_host: nil,
|
35
34
|
proxy_username: nil,
|
36
35
|
proxy_password: nil,
|
@@ -105,7 +104,7 @@ module Contentful
|
|
105
104
|
# @private
|
106
105
|
def setup_logger
|
107
106
|
@logger = configuration[:logger]
|
108
|
-
logger.level = configuration[:log_level] if logger
|
107
|
+
logger.level = configuration[:log_level] if logger && configuration.key?(:log_level)
|
109
108
|
end
|
110
109
|
|
111
110
|
# @private
|
@@ -386,7 +385,9 @@ module Contentful
|
|
386
385
|
response.object,
|
387
386
|
configuration.merge(endpoint: response.request.endpoint),
|
388
387
|
(response.request.query || {}).fetch(:locale, nil) == '*',
|
389
|
-
0
|
388
|
+
0,
|
389
|
+
[],
|
390
|
+
response.request.query || {}
|
390
391
|
).run
|
391
392
|
end
|
392
393
|
|
data/lib/contentful/entry.rb
CHANGED
@@ -17,7 +17,8 @@ module Contentful
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def coerce(field_id, value, includes, errors, entries = {})
|
20
|
-
if Support.link?(value)
|
20
|
+
if Support.link?(value)
|
21
|
+
return nil if Support.unresolvable?(value, errors)
|
21
22
|
return build_nested_resource(value, includes, entries, errors)
|
22
23
|
end
|
23
24
|
return coerce_link_array(value, includes, errors, entries) if Support.link_array?(value)
|
data/lib/contentful/request.rb
CHANGED
@@ -13,7 +13,12 @@ module Contentful
|
|
13
13
|
|
14
14
|
if id
|
15
15
|
@type = :single
|
16
|
-
|
16
|
+
# Given the deprecation of `URI::escape` and `URI::encode`
|
17
|
+
# it is needed to replace it with `URI::encode_www_form_component`.
|
18
|
+
# This method, does replace spaces with `+` instead of `%20`.
|
19
|
+
# Therefore, to keep backwards compatibility, we're replacing the resulting `+`
|
20
|
+
# back with `%20`.
|
21
|
+
@id = URI.encode_www_form_component(id).gsub('+', '%20')
|
17
22
|
else
|
18
23
|
@type = :multi
|
19
24
|
@id = nil
|
@@ -32,9 +32,9 @@ module Contentful
|
|
32
32
|
# Buildable Resources
|
33
33
|
BUILDABLES = %w[Entry Asset ContentType Space DeletedEntry DeletedAsset Locale].freeze
|
34
34
|
|
35
|
-
attr_reader :json, :default_locale, :endpoint, :depth, :localized, :resource_mapping, :entry_mapping, :resource
|
35
|
+
attr_reader :json, :default_locale, :endpoint, :depth, :localized, :resource_mapping, :entry_mapping, :resource, :query
|
36
36
|
|
37
|
-
def initialize(json, configuration = {}, localized = false, depth = 0, errors = [])
|
37
|
+
def initialize(json, configuration = {}, localized = false, depth = 0, errors = [], query = {})
|
38
38
|
@json = json
|
39
39
|
@default_locale = configuration.fetch(:default_locale, ::Contentful::Client::DEFAULT_CONFIGURATION[:default_locale])
|
40
40
|
@resource_mapping = default_resource_mapping.merge(configuration.fetch(:resource_mapping, {}))
|
@@ -46,6 +46,7 @@ module Contentful
|
|
46
46
|
@configuration = configuration
|
47
47
|
@resource_cache = configuration[:_entries_cache] || {}
|
48
48
|
@errors = errors
|
49
|
+
@query = query
|
49
50
|
end
|
50
51
|
|
51
52
|
# Starts the parsing process.
|
@@ -69,7 +70,7 @@ module Contentful
|
|
69
70
|
build_item(item, includes, errors)
|
70
71
|
end
|
71
72
|
array_class = fetch_array_class
|
72
|
-
array_class.new(json.merge('items' => result), @configuration, endpoint)
|
73
|
+
array_class.new(json.merge('items' => result), @configuration, endpoint, query)
|
73
74
|
end
|
74
75
|
|
75
76
|
def build_single
|
data/lib/contentful/version.rb
CHANGED
data/spec/array_spec.rb
CHANGED
@@ -36,6 +36,16 @@ describe Contentful::Array do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
describe '#[]' do
|
40
|
+
it 'provides access to items by index' do
|
41
|
+
expect(array[0]).to be_a Contentful::BaseResource
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'provides access to items by two indices' do
|
45
|
+
expect(array[0, 4]).to eq array.items
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
39
49
|
describe '#each' do
|
40
50
|
it 'is an Enumerator' do
|
41
51
|
expect(array.each).to be_a Enumerator
|
@@ -63,6 +73,25 @@ describe Contentful::Array do
|
|
63
73
|
it 'will return false if #request not available' do
|
64
74
|
expect(Contentful::Array.new({}).reload).to be_falsey
|
65
75
|
end
|
76
|
+
|
77
|
+
it 'respects query parameters' do
|
78
|
+
array_page_1 = vcr('query_array_1') { client.entries(content_type: 'cat', limit: 1) }
|
79
|
+
array_page_2 = vcr('query_array_2') { array_page_1.next_page(client) }
|
80
|
+
|
81
|
+
expect(array_page_1).to be_a Contentful::Array
|
82
|
+
expect(array_page_2).to be_a Contentful::Array
|
83
|
+
|
84
|
+
expect(array_page_1.query).to include(content_type: 'cat')
|
85
|
+
expect(array_page_2.query).to include(content_type: 'cat')
|
86
|
+
|
87
|
+
expect(array_page_1.size).to eq 1
|
88
|
+
expect(array_page_2.size).to eq 1
|
89
|
+
|
90
|
+
expect(array_page_1[0].content_type.id).to eq 'cat'
|
91
|
+
expect(array_page_2[0].content_type.id).to eq 'cat'
|
92
|
+
|
93
|
+
expect(array_page_1[0].id).not_to eq array_page_2[0].id
|
94
|
+
end
|
66
95
|
end
|
67
96
|
|
68
97
|
describe 'marshalling' do
|
data/spec/client_class_spec.rb
CHANGED
@@ -48,6 +48,23 @@ describe 'Client Configuration Options' do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
describe ':log_level' do
|
52
|
+
|
53
|
+
let(:logger) { Logger.new(STDOUT) }
|
54
|
+
|
55
|
+
it 'changes the level of the logger instance when given' do
|
56
|
+
expect do
|
57
|
+
create_client(logger: logger, log_level: ::Logger::WARN)
|
58
|
+
end.to change { logger.level }.from(::Logger::DEBUG).to(::Logger::WARN)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'does not change the level of the logger instance when not given' do
|
62
|
+
expect do
|
63
|
+
create_client(logger: logger)
|
64
|
+
end.not_to change { logger.level }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
51
68
|
describe ':dynamic_entries' do
|
52
69
|
before :each do
|
53
70
|
Contentful::ContentTypeCache.clear!
|
data/spec/entry_spec.rb
CHANGED
@@ -160,6 +160,7 @@ describe Contentful::Entry do
|
|
160
160
|
describe 'can be marshalled' do
|
161
161
|
def test_dump(nyancat)
|
162
162
|
dump = Marshal.dump(nyancat)
|
163
|
+
yield if block_given?
|
163
164
|
new_cat = Marshal.load(dump)
|
164
165
|
|
165
166
|
# Attributes
|
@@ -184,6 +185,14 @@ describe Contentful::Entry do
|
|
184
185
|
expect(new_cat.image.file.url).to eq "//images.contentful.com/cfexampleapi/4gp6taAwW4CmSgumq2ekUm/9da0cd1936871b8d72343e895a00d611/Nyan_cat_250px_frame.png"
|
185
186
|
end
|
186
187
|
|
188
|
+
it 'marshals properly when entry_mapping changed' do
|
189
|
+
vcr('entry/marshall') {
|
190
|
+
class TestEntryMapping; end
|
191
|
+
nyancat = create_client(gzip_encoded: false, max_include_resolution_depth: 2, entry_mapping: { 'irrelevant_model' => TestEntryMapping }).entries(include: 2, 'sys.id' => 'nyancat').first
|
192
|
+
test_dump(nyancat) { Object.send(:remove_const, :TestEntryMapping) }
|
193
|
+
}
|
194
|
+
end
|
195
|
+
|
187
196
|
it 'marshals properly' do
|
188
197
|
vcr('entry/marshall') {
|
189
198
|
nyancat = create_client(gzip_encoded: false, max_include_resolution_depth: 2).entries(include: 2, 'sys.id' => 'nyancat').first
|
@@ -191,6 +200,16 @@ describe Contentful::Entry do
|
|
191
200
|
}
|
192
201
|
end
|
193
202
|
|
203
|
+
it 'marshals with a logger set but keeps the instance' do
|
204
|
+
logger = Logger.new(IO::NULL)
|
205
|
+
vcr('entry/marshall') {
|
206
|
+
nyancat = create_client(gzip_encoded: false, max_include_resolution_depth: 2, logger: logger).entries(include: 2, 'sys.id' => 'nyancat').first
|
207
|
+
expect(nyancat.instance_variable_get(:@configuration)[:logger]).to eq(logger)
|
208
|
+
test_dump(nyancat)
|
209
|
+
expect(nyancat.instance_variable_get(:@configuration)[:logger]).to eq(logger)
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
194
213
|
it 'can remarshall an unmarshalled object' do
|
195
214
|
vcr('entry/marshall') {
|
196
215
|
nyancat = create_client(max_include_resolution_depth: 2).entries(include: 2, 'sys.id' => 'nyancat').first
|
@@ -477,6 +496,17 @@ describe Contentful::Entry do
|
|
477
496
|
end
|
478
497
|
|
479
498
|
describe 'issues' do
|
499
|
+
it 'filters out unresolvable assets' do
|
500
|
+
vcr('entries/unresolvable_assets') {
|
501
|
+
client = create_client(space: 'facgnwwgj5fe', access_token: '4d0f55d940975f78139daae5d965b463c0816e88ad16062d2c1ee3d6cb930521')
|
502
|
+
entry = client.entry('gLVzQlb09IeOeU181fwtz')
|
503
|
+
|
504
|
+
expect(entry.single_asset).to be_nil
|
505
|
+
expect(entry.multi_asset.size).to eq 1
|
506
|
+
expect(entry.raw["fields"]["multiAsset"].size).to eq 2
|
507
|
+
}
|
508
|
+
end
|
509
|
+
|
480
510
|
it 'Symbol/Text field with null values should be serialized as nil - #117' do
|
481
511
|
vcr('entries/issue_117') {
|
482
512
|
client = create_client(space: '8jbbayggj9gj', access_token: '4ce0108f04e55c76476ba84ab0e6149734db73d67cd1b429323ef67f00977e07')
|
@@ -0,0 +1,89 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://cdn.contentful.com/spaces/facgnwwgj5fe/environments/master/entries?sys.id=gLVzQlb09IeOeU181fwtz
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
X-Contentful-User-Agent:
|
11
|
+
- sdk contentful.rb/2.15.1; platform ruby/2.6.3; os macOS/18;
|
12
|
+
Authorization:
|
13
|
+
- Bearer 4d0f55d940975f78139daae5d965b463c0816e88ad16062d2c1ee3d6cb930521
|
14
|
+
Content-Type:
|
15
|
+
- application/vnd.contentful.delivery.v1+json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- cdn.contentful.com
|
22
|
+
User-Agent:
|
23
|
+
- http.rb/4.2.0
|
24
|
+
response:
|
25
|
+
status:
|
26
|
+
code: 200
|
27
|
+
message: OK
|
28
|
+
headers:
|
29
|
+
Access-Control-Allow-Headers:
|
30
|
+
- Accept,Accept-Language,Authorization,Cache-Control,Content-Length,Content-Range,Content-Type,DNT,Destination,Expires,If-Match,If-Modified-Since,If-None-Match,Keep-Alive,Last-Modified,Origin,Pragma,Range,User-Agent,X-Http-Method-Override,X-Mx-ReqToken,X-Requested-With,X-Contentful-Version,X-Contentful-Content-Type,X-Contentful-Organization,X-Contentful-Skip-Transformation,X-Contentful-User-Agent,X-Contentful-Enable-Alpha-Feature
|
31
|
+
Access-Control-Allow-Methods:
|
32
|
+
- GET,HEAD,OPTIONS
|
33
|
+
Access-Control-Allow-Origin:
|
34
|
+
- "*"
|
35
|
+
Access-Control-Expose-Headers:
|
36
|
+
- Etag
|
37
|
+
Access-Control-Max-Age:
|
38
|
+
- '86400'
|
39
|
+
Cf-Environment-Id:
|
40
|
+
- master
|
41
|
+
Cf-Environment-Uuid:
|
42
|
+
- 7df33faa-1d21-4dea-83e9-9ebda5f47ba9
|
43
|
+
Cf-Organization-Id:
|
44
|
+
- 4SsuxQCaMaemfIms52Jr8s
|
45
|
+
Cf-Space-Id:
|
46
|
+
- facgnwwgj5fe
|
47
|
+
Content-Encoding:
|
48
|
+
- gzip
|
49
|
+
Content-Type:
|
50
|
+
- application/vnd.contentful.delivery.v1+json
|
51
|
+
Contentful-Api:
|
52
|
+
- cda_cached
|
53
|
+
Etag:
|
54
|
+
- W/"14036385179019726604"
|
55
|
+
Server:
|
56
|
+
- Contentful
|
57
|
+
X-Content-Type-Options:
|
58
|
+
- nosniff
|
59
|
+
X-Contentful-Region:
|
60
|
+
- us-east-1
|
61
|
+
Content-Length:
|
62
|
+
- '832'
|
63
|
+
Accept-Ranges:
|
64
|
+
- bytes
|
65
|
+
Date:
|
66
|
+
- Thu, 19 Dec 2019 09:54:02 GMT
|
67
|
+
Via:
|
68
|
+
- 1.1 varnish
|
69
|
+
Age:
|
70
|
+
- '0'
|
71
|
+
Connection:
|
72
|
+
- close
|
73
|
+
X-Served-By:
|
74
|
+
- cache-ams21023-AMS
|
75
|
+
X-Cache:
|
76
|
+
- MISS
|
77
|
+
X-Cache-Hits:
|
78
|
+
- '0'
|
79
|
+
Vary:
|
80
|
+
- Accept-Encoding
|
81
|
+
X-Contentful-Request-Id:
|
82
|
+
- e8767cee-9cbe-46be-8fab-47d35d6c5db7
|
83
|
+
body:
|
84
|
+
encoding: ASCII-8BIT
|
85
|
+
string: !binary |-
|
86
|
+
H4sIAAAAAAAAA81WW2+bMBR+769APK8J5NbSt25r127VqqZJq22qIgMHYkoMwiZZWuW/zxdIHEpINk3TUBRhG5/znet3Xo8Mw6RLap4Zr/yVL9gyBb4yz7MMLU2+t3onvmEJQzHft+WKPuOULyy5iPEMM3FkqTVmMBMCf0iBSmxFi9REU+QJVeUXalPDIjbkZonpBpNnU+jcPFw7eR4VmO+lxMoH2BfmBMgLyWIRRv0AhFXls1q/SzvVY6o74c3Dy13sWs413MLYPrWDBXvRxK9xXRCWLfUDLwPEwD8XbjE7lu0c251j2xlZzlnf5r9Wtzf4rl/IU//3LgCZ4ywhMyBCx34XKotmiDLIqh461L0Xms69LsxgjilOSJkzhWe9hDCOuYjYftyHYvugya1NgJykuRtjOuVhoRQY3Z8FceKhWBYDkOPxfXlhnShmgCH2N7UjTDQZZurOeKPQKDRqGUYxCWOQ+wfF71A/KIm1HhhEEXr46OZkNIiW6PLh5+XYuRrvd8MsjxkukaqiVsHUo1dT4EXEG5DL5rEp3zrs/BOVup34PWTzG5/ln/E1HV4NrShiCx09b1V6Vuo++KdIH++6wym6fQzpt9GXr/e9IB/M4waga9BPxZsyQ/w/yQYLWZZkh3RU5SmSsCHQJJ4jl2eilnNlJKS8t9nsA0M4rqZz0VorrbcxbgdFrDBSwdtNEv+XSc0lVI0bJl6c+6CRa7WKNnm5RcJF5dQR5N+oszqaXNfZLqJsqK4i3vV5r5fhZriQfW/rqIEye5w1rVZ/YOuUyQE3kOauK7tpc7djG6iTXzq8ve2gzybH1pOoaJv11FRMa0X+1NCTAFwS1Kck9oEYGbAMwxwyg88snJWMFIfUCJKkEqAAS16rtNI8E1Oh2W7jGQqBtjwWIEmvLQKsrSdTuzY/2l3PPUXd7kkHen3/xHVcO+gg1wPUCzpgn1ptBXOyhjlRMCcC5kTAbEVpWB1p6npZWVX4Rdjh2J2T7jZPihoQVryxUhL7Avtsyo/6asxV0sp/cwo4nAoqH/QdjYXEuc5KWwGSYoVbv6KZHDP+yNTtiUpZ0I5SCHcw+xbJCMpZHa2OfgEgI0mYCAwAAA==
|
87
|
+
http_version:
|
88
|
+
recorded_at: Thu, 19 Dec 2019 09:54:02 GMT
|
89
|
+
recorded_with: VCR 5.0.0
|