relaton 1.8.0 → 1.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -11
  3. data/.rubocop.yml +1 -1
  4. data/docs/README.adoc +7 -6
  5. data/lib/relaton/db.rb +36 -3
  6. data/lib/relaton/processor.rb +13 -2
  7. data/lib/relaton/registry.rb +12 -0
  8. data/lib/relaton/version.rb +1 -1
  9. data/relaton.gemspec +22 -22
  10. data/spec/relaton/db_spec.rb +4 -2
  11. data/spec/relaton/processor_spec.rb +4 -0
  12. data/spec/relaton/{regirtry_spec.rb → registry_spec.rb} +14 -0
  13. data/spec/relaton_spec.rb +26 -12
  14. data/spec/vcr_cassetes/api_relaton_org.yml +57 -0
  15. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +198 -0
  16. data/spec/vcr_cassetes/async_fetch.yml +1572 -1416
  17. data/spec/vcr_cassetes/bsi_bs_en_iso_8848.yml +113 -114
  18. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +20 -20
  19. data/spec/vcr_cassetes/cen_en_10160_1999.yml +249 -0
  20. data/spec/vcr_cassetes/cie_001_1980.yml +8 -8
  21. data/spec/vcr_cassetes/ecma_6.yml +8 -8
  22. data/spec/vcr_cassetes/fisp_140.yml +6 -59
  23. data/spec/vcr_cassetes/gb_t_20223_2006.yml +8 -8
  24. data/spec/vcr_cassetes/iec_60050_102_2007.yml +28 -28
  25. data/spec/vcr_cassetes/iec_combined_included.yml +100 -100
  26. data/spec/vcr_cassetes/ieee_528_2019.yml +37 -37
  27. data/spec/vcr_cassetes/iho_b_11.yml +8 -8
  28. data/spec/vcr_cassetes/iso_111111119115_1.yml +45 -26
  29. data/spec/vcr_cassetes/iso_19115_1.yml +57 -41
  30. data/spec/vcr_cassetes/iso_19115_1_2.yml +113 -81
  31. data/spec/vcr_cassetes/iso_19115_all_parts.yml +198 -0
  32. data/spec/vcr_cassetes/iso_19133_2005.yml +198 -0
  33. data/spec/vcr_cassetes/iso_cd_14093.yml +202 -0
  34. data/spec/vcr_cassetes/iso_combined_applied.yml +114 -82
  35. data/spec/vcr_cassetes/iso_combined_included.yml +112 -80
  36. data/spec/vcr_cassetes/itu_combined_included.yml +315 -199
  37. data/spec/vcr_cassetes/ogc_19_025r1.yml +14 -13074
  38. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +4 -4
  39. data/spec/vcr_cassetes/rfc_8341.yml +8 -8
  40. data/spec/vcr_cassetes/sp_800_38b.yml +6 -59
  41. data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +34 -36
  42. data/spec/vcr_cassetes/w3c_json_ld11.yml +12 -12
  43. metadata +96 -54
  44. data/spec/vcr_cassetes/19133_2005.yml +0 -182
  45. data/spec/vcr_cassetes/hist_cmbined_included.yml +0 -105
  46. data/spec/vcr_cassetes/iso_19115.yml +0 -182
  47. data/spec/vcr_cassetes/iso_awi_14093.yml +0 -182
  48. data/spec/vcr_cassetes/iso_iec_guide_2.yml +0 -232
  49. data/spec/vcr_cassetes/rfc_unsuccess.yml +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da9850bded053378f5adfddf9df94595b2fc5f7bf332a683c6ef179ffc3e8526
4
- data.tar.gz: 024d0ed9038f3d3cfd71d31e69037f22c7fe6a2bfcdb51b6ab3f0a1d83e4c919
3
+ metadata.gz: 00617ed8db3b679a9c44d7b8854b17c16d48f10b84a30bbc2e175113d02e9025
4
+ data.tar.gz: 198a87943ebe8f2ffdeabfc0c1ec12a9499ec9642d90ca393a8c26440f3acf3f
5
5
  SHA512:
6
- metadata.gz: 2b3222bf273ef4b5391394c85754d1feaacc123c420f4ee868b1f76b930f62f9532b9970d3e40de64127a1f743a27ad6d5ed0f473fc4b6269a144a930d500555
7
- data.tar.gz: 95895e7ab8061bf0d492efaf02b0f5c049b37bef5c7c21617a477bcd122d00d2a381fd05427856266a87631917a07f08a008518d0692141ce7aefede8d1e78e0
6
+ metadata.gz: 2bf33ca669f3b719eea8e9add8a107e9f54e86ffcfda53d3845fe5dd109f08cde651b08024dda622f5d3438f8dce51d142c8b1f886e5b45b7ef481242b9212ea
7
+ data.tar.gz: bf242855dfb87ff3920907cf69616b2831c8ce35e65342327d0cfee3182b252bbceca244fbd30cdb097f09befc90769c9c4b72847b52cea852ddd3dc9c2d7441
@@ -16,19 +16,9 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.7', '2.6', '2.5', '2.4' ]
19
+ ruby: [ '3.0', '2.7', '2.6', '2.5' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
- include:
23
- - ruby: '3.0'
24
- os: 'ubuntu-latest'
25
- experimental: true
26
- - ruby: '3.0'
27
- os: 'windows-latest'
28
- experimental: true
29
- - ruby: '3.0'
30
- os: 'macos-latest'
31
- experimental: true
32
22
  steps:
33
23
  - uses: actions/checkout@v2
34
24
  with:
data/.rubocop.yml CHANGED
@@ -5,6 +5,6 @@
5
5
  inherit_from:
6
6
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
7
7
  AllCops:
8
- TargetRubyVersion: 2.4
8
+ TargetRubyVersion: 2.5
9
9
  Rails:
10
10
  Enabled: false
data/docs/README.adoc CHANGED
@@ -182,20 +182,21 @@ x = db.fetch_db("ISO 5749")
182
182
  # prepare queue for results
183
183
  results = Queue.new
184
184
 
185
- # references ot fetch
185
+ # references to fetch
186
186
  refs = ["ISO 19011", "ISO 19115"]
187
187
 
188
188
  # fetch documents
189
189
  refs.each do |ref|
190
- db.fetch_async(ref) do |doc|
191
- results << [ref, doc]
190
+ db.fetch_async(ref, ref: ref) do |doc, other_args|
191
+ results << [doc, other_args[:ref]]
192
192
  end
193
193
  end
194
194
 
195
- # wait until documets fetching
195
+ # wait until all the documents fetching
196
196
  refs.size.times do
197
- ref, doc = results.pop
198
- # do thatever you need with result x
197
+ doc, ref = results.pop
198
+ # do whatever you need with the result
199
+ # in case request error doc will be instance of Relaton::RequestError
199
200
  end
200
201
  ----
201
202
 
data/lib/relaton/db.rb CHANGED
@@ -99,16 +99,20 @@ module Relaton
99
99
  end
100
100
 
101
101
  # Fetch asynchronously
102
- def fetch_async(code, year = nil, opts = {}, &_block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
102
+ def fetch_async(code, year = nil, opts = {}, **others, &_block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
103
103
  stdclass = standard_class code
104
104
  if stdclass
105
105
  unless @queues[stdclass]
106
106
  processor = @registry.processors[stdclass]
107
- wp = WorkersPool.new(processor.threads) { |args| yield fetch *args }
107
+ wp = WorkersPool.new(processor.threads) do |args|
108
+ yield fetch(*args[0..2]), **args[3]
109
+ rescue RelatonBib::RequestError => e
110
+ yield e, **args[3]
111
+ end
108
112
  @queues[stdclass] = { queue: Queue.new, workers_pool: wp }
109
113
  Thread.new { process_queue @queues[stdclass] }
110
114
  end
111
- @queues[stdclass][:queue] << [code, year, opts]
115
+ @queues[stdclass][:queue] << [code, year, opts, others]
112
116
  else yield nil
113
117
  end
114
118
  end
@@ -469,5 +473,34 @@ module Relaton
469
473
  def process_queue(qwp)
470
474
  while args = qwp[:queue].pop; qwp[:workers_pool] << args end
471
475
  end
476
+
477
+ class << self
478
+ # Initialse and return relaton instance, with local and global cache names
479
+ # local_cache: local cache name; none created if nil; "relaton" created
480
+ # if empty global_cache: boolean to create global_cache
481
+ # flush_caches: flush caches
482
+ def init_bib_caches(**opts) # rubocop:disable Metrics/CyclomaticComplexity
483
+ globalname = global_bibliocache_name if opts[:global_cache]
484
+ localname = local_bibliocache_name(opts[:local_cache])
485
+ flush_caches globalname, localname if opts[:flush_caches]
486
+ Relaton::Db.new(globalname, localname)
487
+ end
488
+
489
+ private
490
+
491
+ def flush_caches(gcache, lcache)
492
+ FileUtils.rm_rf gcache unless gcache.nil?
493
+ FileUtils.rm_rf lcache unless lcache.nil?
494
+ end
495
+
496
+ def global_bibliocache_name
497
+ "#{Dir.home}/.relaton/cache"
498
+ end
499
+
500
+ def local_bibliocache_name(cachename)
501
+ cachename = "relaton" if cachename.nil? || cachename.empty?
502
+ "#{cachename}/cache"
503
+ end
504
+ end
472
505
  end
473
506
  end
@@ -1,9 +1,16 @@
1
1
  module Relaton
2
2
  class Processor
3
+ # @rerurn [Symbol]
3
4
  attr_reader :short
4
- attr_reader :prefix
5
+
6
+ # @return [String]
7
+ attr_reader :prefix, :idtype
8
+
9
+ # @return [Regexp]
5
10
  attr_reader :defaultprefix
6
- attr_reader :idtype
11
+
12
+ # @return [Array<String>]
13
+ attr_reader :datasets
7
14
 
8
15
  def initialize
9
16
  raise "This is an abstract class!"
@@ -13,6 +20,10 @@ module Relaton
13
20
  raise "This is an abstract class!"
14
21
  end
15
22
 
23
+ def fetch_data(_source, _opts)
24
+ raise "This is an abstract class!"
25
+ end
26
+
16
27
  def from_xml(_xml)
17
28
  raise "This is an abstract class!"
18
29
  end
@@ -9,6 +9,7 @@ module Relaton
9
9
  relaton_gb relaton_iec relaton_ietf relaton_iso relaton_itu relaton_nist
10
10
  relaton_ogc relaton_calconnect relaton_omg relaton_un relaton_w3c
11
11
  relaton_ieee relaton_iho relaton_bipm relaton_ecma relaton_cie relaton_bsi
12
+ relaton_cen
12
13
  ].freeze
13
14
 
14
15
  include Singleton
@@ -53,6 +54,17 @@ module Relaton
53
54
  processors.keys
54
55
  end
55
56
 
57
+ #
58
+ # Search a rpocessos by dataset name
59
+ #
60
+ # @param [String] dataset
61
+ #
62
+ # @return [Relaton::Processor, nil]
63
+ #
64
+ def find_processor_by_dataset(dataset)
65
+ processors.values.detect { |p| p.datasets&.include? dataset }
66
+ end
67
+
56
68
  #
57
69
  # Find processor by type
58
70
  #
@@ -1,3 +1,3 @@
1
1
  module Relaton
2
- VERSION = "1.8.0".freeze
2
+ VERSION = "1.9.2".freeze
3
3
  end
data/relaton.gemspec CHANGED
@@ -27,37 +27,37 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
  spec.files = `git ls-files`.split("\n")
29
29
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
30
- spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
30
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
31
31
 
32
- # spec.add_dependency "algoliasearch"
33
- spec.add_dependency "relaton-bipm", "~> 1.8.0"
34
- spec.add_dependency "relaton-bsi", "~> 1.8.0"
35
- spec.add_dependency "relaton-calconnect", "~> 1.8.0"
36
- spec.add_dependency "relaton-cie", "~> 1.8.0"
37
- spec.add_dependency "relaton-ecma", "~> 1.8.0"
38
- spec.add_dependency "relaton-gb", "~> 1.8.0"
39
- spec.add_dependency "relaton-iec", ">= 1.8.0"
40
- spec.add_dependency "relaton-ieee", "~> 1.8.0"
41
- spec.add_dependency "relaton-ietf", "~> 1.8.0"
42
- spec.add_dependency "relaton-iho", "~> 1.8.0"
43
- spec.add_dependency "relaton-iso", ">= 1.8.0"
44
- spec.add_dependency "relaton-itu", ">= 1.8.0"
45
- spec.add_dependency "relaton-nist", ">= 1.8.0"
46
- spec.add_dependency "relaton-ogc", "~> 1.8.0"
47
- spec.add_dependency "relaton-omg", "~> 1.8.0"
48
- spec.add_dependency "relaton-un", "~> 1.8.0"
49
- spec.add_dependency "relaton-w3c", "~> 1.8.0"
32
+ spec.add_dependency "relaton-bipm", "~> 1.9.0"
33
+ spec.add_dependency "relaton-bsi", "~> 1.9.0"
34
+ spec.add_dependency "relaton-calconnect", "~> 1.9.0"
35
+ spec.add_dependency "relaton-cen", "~> 1.9.0"
36
+ spec.add_dependency "relaton-cie", "~> 1.9.0"
37
+ spec.add_dependency "relaton-ecma", "~> 1.9.0"
38
+ spec.add_dependency "relaton-gb", "~> 1.9.0"
39
+ spec.add_dependency "relaton-iec", "~> 1.9.0"
40
+ spec.add_dependency "relaton-ieee", "~> 1.9.0"
41
+ spec.add_dependency "relaton-ietf", "~> 1.9.0"
42
+ spec.add_dependency "relaton-iho", "~> 1.9.0"
43
+ spec.add_dependency "relaton-iso", "~> 1.9.0"
44
+ spec.add_dependency "relaton-itu", "~> 1.9.0"
45
+ spec.add_dependency "relaton-nist", ">= 1.9.2"
46
+ spec.add_dependency "relaton-ogc", "~> 1.9.0"
47
+ spec.add_dependency "relaton-omg", "~> 1.9.0"
48
+ spec.add_dependency "relaton-un", "~> 1.9.0"
49
+ spec.add_dependency "relaton-w3c", "~> 1.9.0"
50
50
 
51
51
  spec.add_development_dependency "byebug", "~> 11.0"
52
- # spec.add_development_dependency "debase"
53
52
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
54
53
  spec.add_development_dependency "guard", "~> 2.14"
55
54
  spec.add_development_dependency "guard-rspec", "~> 4.7"
56
55
  spec.add_development_dependency "pry-byebug", "~> 3.9.0"
57
56
  spec.add_development_dependency "rake", "~> 13.0"
58
57
  spec.add_development_dependency "rspec", "~> 3.6"
59
- spec.add_development_dependency "rubocop", "= 0.54.0"
60
- # spec.add_development_dependency "ruby-debug-ide"
58
+ spec.add_development_dependency "rubocop", "~> 1.17.0"
59
+ spec.add_development_dependency "rubocop-performance", "~> 1.11.0"
60
+ spec.add_development_dependency "rubocop-rails", "~> 2.10.0"
61
61
  spec.add_development_dependency "simplecov", "~> 0.15"
62
62
  spec.add_development_dependency "timecop", "~> 0.9"
63
63
  spec.add_development_dependency "vcr", "~> 5"
@@ -163,14 +163,16 @@ RSpec.describe Relaton::Db do
163
163
  results = []
164
164
  VCR.use_cassette "async_fetch", match_requests_on: %i[method uri body] do
165
165
  refs.each do |ref|
166
- db.fetch_async(ref) { |r| queue << r }
166
+ db.fetch_async(ref, ref: ref) do |r, otherargs|
167
+ queue << [r, otherargs[:ref]]
168
+ end
167
169
  end
168
170
  Timeout.timeout(60) do
169
171
  refs.size.times { results << queue.pop }
170
172
  end
171
173
  end
172
174
  results.each do |result|
173
- expect(result).to be_instance_of RelatonItu::ItuBibliographicItem
175
+ expect(result[0]).to be_instance_of RelatonItu::ItuBibliographicItem
174
176
  end
175
177
  end
176
178
 
@@ -16,6 +16,10 @@ RSpec.describe Relaton::Processor do
16
16
  expect { subject.get "code", nil, {} }.to raise_error StandardError
17
17
  end
18
18
 
19
+ it "fetch_data method should be implemented" do
20
+ expect { subject.fetch_data "cource", {} }.to raise_error StandardError
21
+ end
22
+
19
23
  it "from_xml method should be implemented" do
20
24
  expect { subject.from_xml "" }.to raise_error StandardError
21
25
  end
@@ -79,5 +79,19 @@ RSpec.describe Relaton::Registry do
79
79
  it "CIE" do
80
80
  expect(Relaton::Registry.instance.by_type("CIE")).to be_instance_of RelatonCie::Processor
81
81
  end
82
+
83
+ it "BSI" do
84
+ expect(Relaton::Registry.instance.by_type("BSI")).to be_instance_of RelatonBsi::Processor
85
+ end
86
+
87
+ it "CEN" do
88
+ expect(Relaton::Registry.instance.by_type("CEN")).to be_instance_of RelatonCen::Processor
89
+ end
90
+ end
91
+
92
+ it "find processot by dataset" do
93
+ expect(Relaton::Registry.instance
94
+ .find_processor_by_dataset("nist-tech-pubs"))
95
+ .to be_instance_of RelatonNist::Processor
82
96
  end
83
97
  end
data/spec/relaton_spec.rb CHANGED
@@ -15,15 +15,15 @@ RSpec.describe Relaton::Db do
15
15
  VCR.use_cassette "iso_19115_1" do
16
16
  bib = @db.fetch("ISO 19115-1", nil, {})
17
17
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
18
- expect(bib.to_xml(bibdata: true)).to include "<project-number>"\
18
+ expect(bib.to_xml(bibdata: true)).to include "<project-number part=\"1\">"\
19
19
  "ISO 19115</project-number>"
20
20
  expect(File.exist?("testcache")).to be true
21
21
  expect(File.exist?("testcache2")).to be true
22
22
  testcache = Relaton::DbCache.new "testcache"
23
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
23
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number part=\"1\">"\
24
24
  "ISO 19115</project-number>"
25
25
  testcache = Relaton::DbCache.new "testcache2"
26
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
26
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number part=\"1\">"\
27
27
  "ISO 19115</project-number>"
28
28
  end
29
29
  bib = @db.fetch("ISO 19115-1", nil, {})
@@ -31,7 +31,7 @@ RSpec.describe Relaton::Db do
31
31
  end
32
32
 
33
33
  it "with year in code" do
34
- VCR.use_cassette "19133_2005" do
34
+ VCR.use_cassette "iso_19133_2005" do
35
35
  bib = @db.fetch("ISO 19133:2005")
36
36
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
37
37
  expect(bib.to_xml).to include '<bibitem id="ISO19133-2005" '\
@@ -45,24 +45,24 @@ RSpec.describe Relaton::Db do
45
45
 
46
46
  context "all parts" do
47
47
  it "implicity" do
48
- VCR.use_cassette "iso_19115" do
49
- bib = @db.fetch("ISO 19115", nil, {})
48
+ VCR.use_cassette "iso_19115_all_parts" do
49
+ bib = @db.fetch("ISO 19115", nil, all_parts: true)
50
50
  expect(bib.docidentifier[0].id).to eq "ISO 19115 (all parts)"
51
51
  end
52
52
  end
53
53
 
54
54
  it "explicity" do
55
- VCR.use_cassette "iso_19115" do
56
- bib = @db.fetch("ISO 19115 (all parts)", nil, {})
55
+ VCR.use_cassette "iso_19115_all_parts" do
56
+ bib = @db.fetch("ISO 19115 (all parts)")
57
57
  expect(bib.docidentifier[0].id).to eq "ISO 19115 (all parts)"
58
58
  end
59
59
  end
60
60
  end
61
61
 
62
- it "gets sn ISO/AWI reference" do
63
- VCR.use_cassette "iso_awi_14093" do
64
- bib = @db.fetch "ISO/AWI 14093"
65
- expect(bib).not_to be_nil
62
+ it "gets sn ISO/CD reference" do
63
+ VCR.use_cassette "iso_cd_14093" do
64
+ bib = @db.fetch "ISO/CD 14093"
65
+ expect(bib.docidentifier[0].id).to eq "ISO/CD 14093"
66
66
  end
67
67
  end
68
68
  end
@@ -204,6 +204,13 @@ RSpec.describe Relaton::Db do
204
204
  end
205
205
 
206
206
  it "get OGC refrence and cache it" do
207
+ cc_fr = /\.relaton\/ogc\/bibliography\.json/
208
+ allow(File).to receive(:exist?).with(cc_fr).and_return false
209
+ allow(File).to receive(:exist?).with(/etag\.txt/).and_return false
210
+ expect(File).to receive(:exist?).and_call_original.at_least :once
211
+ expect(File).to receive(:write).with(cc_fr, kind_of(String), kind_of(Hash))
212
+ .at_most :once
213
+ allow(File).to receive(:write).and_call_original
207
214
  VCR.use_cassette "ogc_19_025r1" do
208
215
  bib = @db.fetch "OGC 19-025r1", nil, {}
209
216
  expect(bib).to be_instance_of RelatonOgc::OgcBibliographicItem
@@ -285,6 +292,13 @@ RSpec.describe Relaton::Db do
285
292
  end
286
293
  end
287
294
 
295
+ it "get CEN reference" do
296
+ VCR.use_cassette "cen_en_10160_1999" do
297
+ bib = @db.fetch "CEN EN 10160:1999"
298
+ expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
299
+ end
300
+ end
301
+
288
302
  context "get combined documents" do
289
303
  context "ISO" do
290
304
  it "included" do
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.relaton.org/api/v1/document?code=ISO%2019115-2&year=2019
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - api.relaton.org
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Content-Type:
24
+ - text/xml
25
+ Content-Length:
26
+ - '2963'
27
+ Connection:
28
+ - keep-alive
29
+ Date:
30
+ - Mon, 23 Aug 2021 12:02:12 GMT
31
+ X-Amzn-Requestid:
32
+ - '098ad305-defa-47c8-ab52-48343ab03fa8'
33
+ Access-Control-Allow-Origin:
34
+ - "*"
35
+ Access-Control-Allow-Headers:
36
+ - Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
37
+ X-Amz-Apigw-Id:
38
+ - EhMocHeAoAMFtlg=
39
+ Access-Control-Allow-Methods:
40
+ - GET, POST, OPTIONS
41
+ X-Amzn-Trace-Id:
42
+ - Root=1-61238e35-5a78c6585f0a12aa03ef6ad2;Sampled=0
43
+ X-Cache:
44
+ - Miss from cloudfront
45
+ Via:
46
+ - 1.1 a65cc3f0f56427b7099c895c026d63f0.cloudfront.net (CloudFront)
47
+ X-Amz-Cf-Pop:
48
+ - ZAG50-C1
49
+ X-Amz-Cf-Id:
50
+ - AQ2ZtJn4PYqRprdqa7s-risSYgyC2fp3TfB26w8gi7l_4N7BHW252w==
51
+ body:
52
+ encoding: ASCII-8BIT
53
+ string: !binary |-
54
+ PGJpYmRhdGEgdHlwZT0ic3RhbmRhcmQiPgogIDxmZXRjaGVkPjIwMjEtMDctMTE8L2ZldGNoZWQ+CiAgPHRpdGxlIHR5cGU9InRpdGxlLWludHJvIiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJlbiIgc2NyaXB0PSJMYXRuIj5HZW9ncmFwaGljIGluZm9ybWF0aW9uPC90aXRsZT4KICA8dGl0bGUgdHlwZT0idGl0bGUtbWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZW4iIHNjcmlwdD0iTGF0biI+TWV0YWRhdGE8L3RpdGxlPgogIDx0aXRsZSB0eXBlPSJ0aXRsZS1wYXJ0IiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJlbiIgc2NyaXB0PSJMYXRuIj5QYXJ0IDI6IEV4dGVuc2lvbnMgZm9yIGFjcXVpc2l0aW9uIGFuZCBwcm9jZXNzaW5nPC90aXRsZT4KICA8dGl0bGUgdHlwZT0ibWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZW4iIHNjcmlwdD0iTGF0biI+R2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiAtIE1ldGFkYXRhIC0gUGFydCAyOiBFeHRlbnNpb25zIGZvciBhY3F1aXNpdGlvbiBhbmQgcHJvY2Vzc2luZzwvdGl0bGU+CiAgPHRpdGxlIHR5cGU9InRpdGxlLWludHJvIiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJmciIgc2NyaXB0PSJMYXRuIj5JbmZvcm1hdGlvbiBnw6lvZ3JhcGhpcXVlPC90aXRsZT4KICA8dGl0bGUgdHlwZT0idGl0bGUtbWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZnIiIHNjcmlwdD0iTGF0biI+TcOpdGFkb25uw6llczwvdGl0bGU+CiAgPHRpdGxlIHR5cGU9InRpdGxlLXBhcnQiIGZvcm1hdD0idGV4dC9wbGFpbiIgbGFuZ3VhZ2U9ImZyIiBzY3JpcHQ9IkxhdG4iPlBhcnRpZSAyOiBFeHRlbnNpb25zIHBvdXIgbCdhY3F1aXNpdGlvbiBldCBsZSB0cmFpdGVtZW50PC90aXRsZT4KICA8dGl0bGUgdHlwZT0ibWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZnIiIHNjcmlwdD0iTGF0biI+SW5mb3JtYXRpb24gZ8Opb2dyYXBoaXF1ZSAtIE3DqXRhZG9ubsOpZXMgLSBQYXJ0aWUgMjogRXh0ZW5zaW9ucyBwb3VyIGwnYWNxdWlzaXRpb24gZXQgbGUgdHJhaXRlbWVudDwvdGl0bGU+CiAgPHVyaSB0eXBlPSJzcmMiPmh0dHBzOi8vd3d3Lmlzby5vcmcvc3RhbmRhcmQvNjcwMzkuaHRtbDwvdXJpPgogIDx1cmkgdHlwZT0ib2JwIj5odHRwczovL3d3dy5pc28ub3JnL29icC91aS8jIWlzbzpzdGQ6NjcwMzk6ZW48L3VyaT4KICA8dXJpIHR5cGU9InJzcyI+aHR0cHM6Ly93d3cuaXNvLm9yZy9jb250ZW50cy9kYXRhL3N0YW5kYXJkLzA2LzcwLzY3MDM5LmRldGFpbC5yc3M8L3VyaT4KICA8ZG9jaWRlbnRpZmllciB0eXBlPSJJU08iPklTTyAxOTExNS0yOjIwMTk8L2RvY2lkZW50aWZpZXI+CiAgPGRvY2lkZW50aWZpZXIgdHlwZT0iVVJOIj51cm46aXNvOnN0ZDppc286MTkxMTU6LTI6c3RhZ2UtNjAuNjA6ZWQtMjplbixmcjwvZG9jaWRlbnRpZmllcj4KICA8ZG9jbnVtYmVyPjE5MTE1PC9kb2NudW1iZXI+CiAgPGRhdGUgdHlwZT0icHVibGlzaGVkIj4KICAgIDxvbj4yMDE5LTAxPC9vbj4KICA8L2RhdGU+CiAgPGNvbnRyaWJ1dG9yPgogICAgPHJvbGUgdHlwZT0icHVibGlzaGVyIi8+CiAgICA8b3JnYW5pemF0aW9uPgogICAgICA8bmFtZT5JbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uPC9uYW1lPgogICAgICA8YWJicmV2aWF0aW9uPklTTzwvYWJicmV2aWF0aW9uPgogICAgICA8dXJpPnd3dy5pc28ub3JnPC91cmk+CiAgICA8L29yZ2FuaXphdGlvbj4KICA8L2NvbnRyaWJ1dG9yPgogIDxlZGl0aW9uPjI8L2VkaXRpb24+CiAgPGxhbmd1YWdlPmVuPC9sYW5ndWFnZT4KICA8bGFuZ3VhZ2U+ZnI8L2xhbmd1YWdlPgogIDxzY3JpcHQ+TGF0bjwvc2NyaXB0PgogIDxzdGF0dXM+CiAgICA8c3RhZ2U+NjA8L3N0YWdlPgogICAgPHN1YnN0YWdlPjYwPC9zdWJzdGFnZT4KICA8L3N0YXR1cz4KICA8Y29weXJpZ2h0PgogICAgPGZyb20+MjAxOTwvZnJvbT4KICAgIDxvd25lcj4KICAgICAgPG9yZ2FuaXphdGlvbj4KICAgICAgICA8bmFtZT5JU088L25hbWU+CiAgICAgIDwvb3JnYW5pemF0aW9uPgogICAgPC9vd25lcj4KICA8L2NvcHlyaWdodD4KICA8cmVsYXRpb24gdHlwZT0ib2Jzb2xldGVzIj4KICAgIDxiaWJpdGVtIHR5cGU9InN0YW5kYXJkIj4KICAgICAgPGZvcm1hdHRlZHJlZiBmb3JtYXQ9InRleHQvcGxhaW4iPklTTyAxOTExNS0yOjIwMDk8L2Zvcm1hdHRlZHJlZj4KICAgIDwvYmliaXRlbT4KICA8L3JlbGF0aW9uPgogIDxyZWxhdGlvbiB0eXBlPSJ1cGRhdGVzIj4KICAgIDxiaWJpdGVtIHR5cGU9InN0YW5kYXJkIj4KICAgICAgPGZvcm1hdHRlZHJlZiBmb3JtYXQ9InRleHQvcGxhaW4iPklTTyAxOTExNS0yOjIwMTkvUFJGIEFtZCAxPC9mb3JtYXR0ZWRyZWY+CiAgICAgIDxkYXRlIHR5cGU9ImNpcmN1bGF0ZWQiPgogICAgICAgIDxvbj4yMDE5LTAxLTEwPC9vbj4KICAgICAgPC9kYXRlPgogICAgPC9iaWJpdGVtPgogIDwvcmVsYXRpb24+CiAgPHBsYWNlPkdlbmV2YTwvcGxhY2U+CiAgPGV4dD4KICAgIDxkb2N0eXBlPmludGVybmF0aW9uYWwtc3RhbmRhcmQ8L2RvY3R5cGU+CiAgICA8ZWRpdG9yaWFsZ3JvdXA+CiAgICAgIDx0ZWNobmljYWwtY29tbWl0dGVlIG51bWJlcj0iMjExIiB0eXBlPSJUQyI+SVNPL1RDIDIxMUdlb2dyYXBoaWMgaW5mb3JtYXRpb24vR2VvbWF0aWNzPC90ZWNobmljYWwtY29tbWl0dGVlPgogICAgPC9lZGl0b3JpYWxncm91cD4KICAgIDxpY3M+CiAgICAgIDxjb2RlPjM1LjI0MC43MDwvY29kZT4KICAgICAgPHRleHQ+SVQgYXBwbGljYXRpb25zIGluIHNjaWVuY2U8L3RleHQ+CiAgICA8L2ljcz4KICAgIDxzdHJ1Y3R1cmVkaWRlbnRpZmllciB0eXBlPSJJU08iPgogICAgICA8cHJvamVjdC1udW1iZXI+SVNPIDE5MTE1PC9wcm9qZWN0LW51bWJlcj4KICAgIDwvc3RydWN0dXJlZGlkZW50aWZpZXI+CiAgPC9leHQ+CjwvYmliZGF0YT4=
55
+ http_version:
56
+ recorded_at: Mon, 23 Aug 2021 12:02:12 GMT
57
+ recorded_with: VCR 5.1.0