relaton 1.11.4 → 1.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/relaton/db.rb +61 -31
- data/lib/relaton/db_cache.rb +7 -1
- data/lib/relaton/version.rb +1 -1
- data/relaton.gemspec +21 -21
- data/spec/relaton/db_spec.rb +51 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/vcr_cassetes/3gpp_tr_00_01u_umts_3_0_0.yml +7 -7
- data/spec/vcr_cassetes/async_fetch.yml +1402 -1402
- data/spec/vcr_cassetes/bipm_i18n_async_fetch.yml +51 -259
- data/spec/vcr_cassetes/bsi_bs_en_iso_8848.yml +11 -11
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +10 -10
- data/spec/vcr_cassetes/cie_001_1980.yml +10 -9
- data/spec/vcr_cassetes/ecma_6.yml +47 -15
- data/spec/vcr_cassetes/en_10160_1999.yml +27 -27
- data/spec/vcr_cassetes/fisp_140.yml +6 -6
- data/spec/vcr_cassetes/gb_t_20223_2006.yml +6 -6
- data/spec/vcr_cassetes/iana_service_names_port_numbers.yml +10 -13
- data/spec/vcr_cassetes/iec_60050_102_2007.yml +28 -28
- data/spec/vcr_cassetes/iec_combined_included.yml +88 -88
- data/spec/vcr_cassetes/ieee_528_2019.yml +823 -1133
- data/spec/vcr_cassetes/iho_b_11.yml +7 -7
- data/spec/vcr_cassetes/iso_111111119115_1.yml +2 -2
- data/spec/vcr_cassetes/iso_19115_1.yml +16 -16
- data/spec/vcr_cassetes/iso_19115_1_2.yml +29 -29
- data/spec/vcr_cassetes/iso_19115_all_parts.yml +15 -15
- data/spec/vcr_cassetes/iso_19133_2005.yml +15 -15
- data/spec/vcr_cassetes/iso_combined_applied.yml +30 -30
- data/spec/vcr_cassetes/iso_combined_included.yml +31 -31
- data/spec/vcr_cassetes/iso_dis_14093.yml +14 -14
- data/spec/vcr_cassetes/itu_combined_included.yml +168 -168
- data/spec/vcr_cassetes/oasis_amqp_core_types_v1_0_pt1.yml +9 -9
- data/spec/vcr_cassetes/ogc_19_025r1.yml +7 -7
- data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +4 -4
- data/spec/vcr_cassetes/rfc_8341.yml +10 -10
- data/spec/vcr_cassetes/sp_800_38b.yml +6 -6
- data/spec/vcr_cassetes/threads_from_env.yml +56 -56
- data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +31 -29
- data/spec/vcr_cassetes/w3c_json_ld11.yml +20 -20
- metadata +44 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8299cf7ea6a28e344f438461d16233fe9acd733bc00441583ce9768c702b15fa
|
4
|
+
data.tar.gz: 28d87384bb3b763981ae98902b144236254b7cce20c3d608ef746be679b0661a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5720aed26b5585b6673d92fd8c99fbae0883689c254344d5dbad5549a157388bd6422a2550942eb58a8d32f1c2d0aeafd6485de55274c0c02271ec5f87661405
|
7
|
+
data.tar.gz: 45fca34e30fe15699b9b3933f4060c877d54947ae31c5bc70ff05812b654c0876175eedda1d71ef16755a4db02a797c30199cd2128d081ae46b186a4939964f5
|
data/lib/relaton/db.rb
CHANGED
@@ -95,9 +95,18 @@ module Relaton
|
|
95
95
|
result
|
96
96
|
end
|
97
97
|
|
98
|
+
#
|
98
99
|
# Fetch asynchronously
|
99
|
-
|
100
|
-
|
100
|
+
#
|
101
|
+
# @param [String] ref reference
|
102
|
+
# @param [String] year document yer
|
103
|
+
# @param [Hash] opts options
|
104
|
+
#
|
105
|
+
# @return [RelatonBib::BibliographicItem, RelatonBib::RequestError, nil] bibitem if document is found,
|
106
|
+
# request error if server doesn't answer, nil if document not found
|
107
|
+
#
|
108
|
+
def fetch_async(ref, year = nil, opts = {}, &block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
109
|
+
stdclass = @registry.class_by_ref ref
|
101
110
|
if stdclass
|
102
111
|
unless @queues[stdclass]
|
103
112
|
processor = @registry.processors[stdclass]
|
@@ -106,11 +115,14 @@ module Relaton
|
|
106
115
|
args[3].call fetch(*args[0..2])
|
107
116
|
rescue RelatonBib::RequestError => e
|
108
117
|
args[3].call e
|
118
|
+
rescue StandardError => e
|
119
|
+
Util.log "[relaton] ERROR: #{args[0]} -- #{e.message}", :error
|
120
|
+
args[3].call nil
|
109
121
|
end
|
110
122
|
@queues[stdclass] = { queue: Queue.new, workers_pool: wp }
|
111
123
|
Thread.new { process_queue @queues[stdclass] }
|
112
124
|
end
|
113
|
-
@queues[stdclass][:queue] << [
|
125
|
+
@queues[stdclass][:queue] << [ref, year, opts, block]
|
114
126
|
else yield nil
|
115
127
|
end
|
116
128
|
end
|
@@ -196,7 +208,7 @@ module Relaton
|
|
196
208
|
end
|
197
209
|
|
198
210
|
# @param file [String] file path
|
199
|
-
# @param content [String] content in XML or
|
211
|
+
# @param content [String] content in XML or YAML format
|
200
212
|
# @param edition [String, nil] edition to filter
|
201
213
|
# @param year [Integer, nil] year to filter
|
202
214
|
# @return [BibliographicItem, nil]
|
@@ -205,7 +217,7 @@ module Relaton
|
|
205
217
|
item = if file.match?(/xml$/) then processor.from_xml(content)
|
206
218
|
else processor.hash_to_bib(YAML.safe_load(content))
|
207
219
|
end
|
208
|
-
item if (edition.nil? || item.edition == edition) && (year.nil? ||
|
220
|
+
item if (edition.nil? || item.edition.content == edition) && (year.nil? ||
|
209
221
|
item.date.detect { |d| d.type == "published" && d.on(:year).to_s == year.to_s })
|
210
222
|
end
|
211
223
|
|
@@ -293,8 +305,10 @@ module Relaton
|
|
293
305
|
[prefix, code]
|
294
306
|
end
|
295
307
|
|
308
|
+
#
|
296
309
|
# @param entry [String] XML string
|
297
310
|
# @param stdclass [Symbol]
|
311
|
+
#
|
298
312
|
# @return [nil, RelatonBib::BibliographicItem,
|
299
313
|
# RelatonIsoBib::IsoBibliographicItem, RelatonItu::ItuBibliographicItem,
|
300
314
|
# RelatonIetf::IetfBibliographicItem, RelatonIec::IecBibliographicItem,
|
@@ -304,9 +318,7 @@ module Relaton
|
|
304
318
|
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
305
319
|
# RelatonOmg::OmgBibliographicItem, RelatonW3c::W3cBibliographicItem]
|
306
320
|
def bib_retval(entry, stdclass)
|
307
|
-
|
308
|
-
else @registry.processors[stdclass].from_xml(entry)
|
309
|
-
end
|
321
|
+
@registry.processors[stdclass].from_xml(entry) if entry
|
310
322
|
end
|
311
323
|
|
312
324
|
# @param code [String]
|
@@ -334,8 +346,7 @@ module Relaton
|
|
334
346
|
if db.nil?
|
335
347
|
return if opts[:fetch_db]
|
336
348
|
|
337
|
-
bibentry = new_bib_entry(searchcode, year, opts, stdclass
|
338
|
-
id: id)
|
349
|
+
bibentry = new_bib_entry(searchcode, year, opts, stdclass)
|
339
350
|
return bib_retval(bibentry, stdclass)
|
340
351
|
end
|
341
352
|
|
@@ -348,45 +359,58 @@ module Relaton
|
|
348
359
|
@semaphore.synchronize do
|
349
360
|
db.clone_entry id, altdb if altdb.valid_entry? id, year
|
350
361
|
end
|
351
|
-
|
362
|
+
new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
352
363
|
@semaphore.synchronize do
|
353
|
-
db[id] ||= entry
|
354
364
|
altdb.clone_entry(id, db) if !altdb.valid_entry?(id, year)
|
355
365
|
end
|
356
366
|
else
|
357
367
|
return bib_retval(db[id], stdclass) if opts[:fetch_db]
|
358
368
|
|
359
|
-
|
360
|
-
id: id)
|
369
|
+
new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
361
370
|
end
|
362
371
|
bib_retval(db[id], stdclass)
|
363
372
|
end
|
364
373
|
|
374
|
+
#
|
375
|
+
# Create new bibliographic entry if it doesn't exist in database
|
376
|
+
#
|
365
377
|
# @param code [String]
|
366
378
|
# @param year [String]
|
367
379
|
#
|
368
380
|
# @param opts [Hash]
|
369
|
-
# @option opts [Boolean] :all_parts If all-parts reference is
|
370
|
-
#
|
371
|
-
#
|
381
|
+
# @option opts [Boolean, nil] :all_parts If true then all-parts reference is
|
382
|
+
# requested
|
383
|
+
# @option opts [Boolean, nil] :keep_year If true then undated reference
|
384
|
+
# should return actual reference with year
|
372
385
|
# @option opts [Integer] :retries (1) Number of network retries
|
373
386
|
#
|
374
387
|
# @param stdclass [Symbol]
|
375
|
-
# @param db [Relaton::DbCache,`
|
376
|
-
# @param id [String] docid
|
377
|
-
#
|
378
|
-
|
388
|
+
# @param db [Relaton::DbCache,`nil]
|
389
|
+
# @param id [String, nil] docid
|
390
|
+
#
|
391
|
+
# @return [String] bibliographic entry
|
392
|
+
# XML or "redirection ID" or "not_found YYYY-MM-DD" string
|
393
|
+
#
|
394
|
+
def new_bib_entry(code, year, opts, stdclass, **args) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
395
|
+
entry = @semaphore.synchronize { args[:db] && args[:db][args[:id]] }
|
396
|
+
if entry
|
397
|
+
Util.log "[relaton] (#{code}) not found." if entry&.match?(/^not_found/)
|
398
|
+
return entry
|
399
|
+
end
|
400
|
+
|
379
401
|
bib = net_retry(code, year, opts, stdclass, opts.fetch(:retries, 1))
|
380
402
|
bib_id = bib&.docidentifier&.first&.id
|
381
403
|
|
382
404
|
# when docid doesn't match bib's id then return a reference to bib's id
|
383
|
-
if args[:db] && args[:id] &&
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
405
|
+
entry = if args[:db] && args[:id] && bib_id && args[:id] !~ %r{#{Regexp.quote("(#{bib_id})")}}
|
406
|
+
bid = std_id(bib.docidentifier.first.id, nil, {}, stdclass).first
|
407
|
+
@semaphore.synchronize { args[:db][bid] ||= bib_entry bib }
|
408
|
+
"redirection #{bid}"
|
409
|
+
else bib_entry bib
|
410
|
+
end
|
411
|
+
return entry if args[:db].nil? || args[:id].nil?
|
412
|
+
|
413
|
+
@semaphore.synchronize { args[:db][args[:id]] ||= entry }
|
390
414
|
end
|
391
415
|
|
392
416
|
# @raise [RelatonBib::RequestError]
|
@@ -442,10 +466,16 @@ module Relaton
|
|
442
466
|
end
|
443
467
|
|
444
468
|
class << self
|
469
|
+
#
|
445
470
|
# Initialse and return relaton instance, with local and global cache names
|
446
|
-
#
|
447
|
-
#
|
448
|
-
#
|
471
|
+
#
|
472
|
+
# @param local_cache [String, nil] local cache name;
|
473
|
+
# "relaton" created if empty or nil
|
474
|
+
# @param global_cache [Boolean, nil] create global_cache if true
|
475
|
+
# @param flush_caches [Boolean, nil] flush caches if true
|
476
|
+
#
|
477
|
+
# @return [Relaton::Db] relaton DB instance
|
478
|
+
#
|
449
479
|
def init_bib_caches(**opts) # rubocop:disable Metrics/CyclomaticComplexity
|
450
480
|
globalname = global_bibliocache_name if opts[:global_cache]
|
451
481
|
localname = local_bibliocache_name(opts[:local_cache])
|
data/lib/relaton/db_cache.rb
CHANGED
@@ -45,7 +45,7 @@ module Relaton
|
|
45
45
|
end
|
46
46
|
|
47
47
|
prefix_dir = "#{@dir}/#{prefix(key)}"
|
48
|
-
FileUtils::mkdir_p prefix_dir
|
48
|
+
FileUtils::mkdir_p prefix_dir
|
49
49
|
set_version prefix_dir
|
50
50
|
file_safe_write "#{filename(key)}.#{ext(value)}", value
|
51
51
|
end
|
@@ -72,6 +72,12 @@ module Relaton
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
#
|
76
|
+
# Save entry from cache of `db` to this cache.
|
77
|
+
#
|
78
|
+
# @param [String] key key of the entry
|
79
|
+
# @param [Relaton::Db] db database
|
80
|
+
#
|
75
81
|
def clone_entry(key, db)
|
76
82
|
self[key] ||= db.get(key)
|
77
83
|
if (code = redirect? get(key))
|
data/lib/relaton/version.rb
CHANGED
data/relaton.gemspec
CHANGED
@@ -29,27 +29,27 @@ Gem::Specification.new do |spec|
|
|
29
29
|
# spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
30
30
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
31
31
|
|
32
|
-
spec.add_dependency "relaton-3gpp", "~> 1.
|
33
|
-
spec.add_dependency "relaton-bipm", "~> 1.
|
34
|
-
spec.add_dependency "relaton-bsi", "~> 1.
|
35
|
-
spec.add_dependency "relaton-calconnect", "~> 1.
|
36
|
-
spec.add_dependency "relaton-cen", "~> 1.
|
37
|
-
spec.add_dependency "relaton-cie", "~> 1.
|
38
|
-
spec.add_dependency "relaton-ecma", "~> 1.
|
39
|
-
spec.add_dependency "relaton-gb", "~> 1.
|
40
|
-
spec.add_dependency "relaton-iana", "~> 1.
|
41
|
-
spec.add_dependency "relaton-iec", "~> 1.
|
42
|
-
spec.add_dependency "relaton-ieee", "~> 1.
|
43
|
-
spec.add_dependency "relaton-ietf", "~> 1.
|
44
|
-
spec.add_dependency "relaton-iho", "~> 1.
|
45
|
-
spec.add_dependency "relaton-iso", "~> 1.
|
46
|
-
spec.add_dependency "relaton-itu", "~> 1.
|
47
|
-
spec.add_dependency "relaton-nist", "~> 1.
|
48
|
-
spec.add_dependency "relaton-oasis", "~> 1.
|
49
|
-
spec.add_dependency "relaton-ogc", "~> 1.
|
50
|
-
spec.add_dependency "relaton-omg", "~> 1.
|
51
|
-
spec.add_dependency "relaton-un", "~> 1.
|
52
|
-
spec.add_dependency "relaton-w3c", "~> 1.
|
32
|
+
spec.add_dependency "relaton-3gpp", "~> 1.12.0"
|
33
|
+
spec.add_dependency "relaton-bipm", "~> 1.12.0"
|
34
|
+
spec.add_dependency "relaton-bsi", "~> 1.12.0"
|
35
|
+
spec.add_dependency "relaton-calconnect", "~> 1.12.0"
|
36
|
+
spec.add_dependency "relaton-cen", "~> 1.12.0"
|
37
|
+
spec.add_dependency "relaton-cie", "~> 1.12.0"
|
38
|
+
spec.add_dependency "relaton-ecma", "~> 1.12.0"
|
39
|
+
spec.add_dependency "relaton-gb", "~> 1.12.0"
|
40
|
+
spec.add_dependency "relaton-iana", "~> 1.12.0"
|
41
|
+
spec.add_dependency "relaton-iec", "~> 1.12.0"
|
42
|
+
spec.add_dependency "relaton-ieee", "~> 1.12.0"
|
43
|
+
spec.add_dependency "relaton-ietf", "~> 1.12.0"
|
44
|
+
spec.add_dependency "relaton-iho", "~> 1.12.0"
|
45
|
+
spec.add_dependency "relaton-iso", "~> 1.12.0"
|
46
|
+
spec.add_dependency "relaton-itu", "~> 1.12.0"
|
47
|
+
spec.add_dependency "relaton-nist", "~> 1.12.0"
|
48
|
+
spec.add_dependency "relaton-oasis", "~> 1.12.0"
|
49
|
+
spec.add_dependency "relaton-ogc", "~> 1.12.0"
|
50
|
+
spec.add_dependency "relaton-omg", "~> 1.12.0"
|
51
|
+
spec.add_dependency "relaton-un", "~> 1.12.0"
|
52
|
+
spec.add_dependency "relaton-w3c", "~> 1.12.0"
|
53
53
|
|
54
54
|
spec.add_development_dependency "byebug", "~> 11.0"
|
55
55
|
spec.add_development_dependency "equivalent-xml", "~> 0.6"
|
data/spec/relaton/db_spec.rb
CHANGED
@@ -1,6 +1,40 @@
|
|
1
1
|
RSpec.describe Relaton::Db do
|
2
2
|
before(:each) { FileUtils.rm_rf %w[testcache testcache2] }
|
3
3
|
|
4
|
+
context "instance methods" do
|
5
|
+
subject { Relaton::Db.new nil, nil }
|
6
|
+
|
7
|
+
context "#search_edition_year" do
|
8
|
+
it "create bibitem from YAML content" do
|
9
|
+
h = { "docid" => [{ "id" => "ISO 123", type: "ISO", "primary" => true }] }
|
10
|
+
expect(YAML).to receive(:safe_load).with(:content).and_return h
|
11
|
+
item = subject.send :search_edition_year, "iso/item.yaml", :content, nil, nil
|
12
|
+
expect(item).to be_instance_of RelatonIsoBib::IsoBibliographicItem
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#new_bib_entry" do
|
17
|
+
it "warn if cached entry is not_found" do
|
18
|
+
id = "ISO(ISO 123)"
|
19
|
+
db = double "db"
|
20
|
+
expect(db).to receive(:[]).with(id).and_return "not_found"
|
21
|
+
expect do
|
22
|
+
entry = subject.send :new_bib_entry, "ISO 123", nil, {}, :relaton_iso, db: db, id: id
|
23
|
+
expect(entry).to eq "not_found"
|
24
|
+
end.to output("[relaton] (ISO 123) not found.\n").to_stderr
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "class methods" do
|
30
|
+
it "::init_bib_caches" do
|
31
|
+
expect(FileUtils).to receive(:rm_rf).with(/\/\.relaton\/cache$/)
|
32
|
+
expect(FileUtils).to receive(:rm_rf).with(/testcache\/cache$/)
|
33
|
+
expect(Relaton::Db).to receive(:new).with(/\/\.relaton\/cache$/, /testcache\/cache$/)
|
34
|
+
Relaton::Db.init_bib_caches(global_cache: true, local_cache: "testcache", flush_caches: true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
4
38
|
context "modifing database" do
|
5
39
|
let(:db) { Relaton::Db.new "testcache", "testcache2" }
|
6
40
|
|
@@ -178,7 +212,7 @@ RSpec.describe Relaton::Db do
|
|
178
212
|
refs = ["CGPM Resolution 1889-00", "CGPM Résolution 1889-00",
|
179
213
|
"CGPM Réunion 9", "CGPM Meeting 9"]
|
180
214
|
results = []
|
181
|
-
VCR.use_cassette "bipm_i18n_async_fetch" do
|
215
|
+
VCR.use_cassette "bipm_i18n_async_fetch", match_requests_on: %i[method uri body] do
|
182
216
|
refs.each do |ref|
|
183
217
|
db.fetch_async(ref) { |r| queue << [r, ref] }
|
184
218
|
end
|
@@ -198,6 +232,22 @@ RSpec.describe Relaton::Db do
|
|
198
232
|
expect(result).to be_nil
|
199
233
|
end
|
200
234
|
|
235
|
+
it "handle HTTP request error" do
|
236
|
+
expect(db).to receive(:fetch).and_raise RelatonBib::RequestError
|
237
|
+
db.fetch_async("ISO REF") { |r| queue << r }
|
238
|
+
result = Timeout.timeout(5) { queue.pop }
|
239
|
+
expect(result).to be_instance_of RelatonBib::RequestError
|
240
|
+
end
|
241
|
+
|
242
|
+
it "handle other errors" do
|
243
|
+
expect(db).to receive(:fetch).and_raise Errno::EACCES
|
244
|
+
expect do
|
245
|
+
db.fetch_async("ISO REF") { |r| queue << r }
|
246
|
+
result = Timeout.timeout(5) { queue.pop }
|
247
|
+
expect(result).to be_nil
|
248
|
+
end.to output("[relaton] ERROR: ISO REF -- Permission denied\n").to_stderr
|
249
|
+
end
|
250
|
+
|
201
251
|
it "use threads number from RELATON_FETCH_PARALLEL" do
|
202
252
|
expect(ENV).to receive(:[]).with("RELATON_FETCH_PARALLEL").and_return(1)
|
203
253
|
allow(ENV).to receive(:[]).and_call_original
|
data/spec/spec_helper.rb
CHANGED
@@ -41,29 +41,29 @@ http_interactions:
|
|
41
41
|
X-Xss-Protection:
|
42
42
|
- 1; mode=block
|
43
43
|
X-Github-Request-Id:
|
44
|
-
-
|
44
|
+
- 7D28:10C50:1BF854C:1DDFC0B:62BDDA6B
|
45
45
|
Accept-Ranges:
|
46
46
|
- bytes
|
47
47
|
Date:
|
48
|
-
- Thu,
|
48
|
+
- Thu, 30 Jun 2022 17:16:27 GMT
|
49
49
|
Via:
|
50
50
|
- 1.1 varnish
|
51
51
|
X-Served-By:
|
52
|
-
- cache-
|
52
|
+
- cache-vie6348-VIE
|
53
53
|
X-Cache:
|
54
54
|
- MISS
|
55
55
|
X-Cache-Hits:
|
56
56
|
- '0'
|
57
57
|
X-Timer:
|
58
|
-
-
|
58
|
+
- S1656609387.047148,VS0,VE235
|
59
59
|
Vary:
|
60
60
|
- Authorization,Accept-Encoding,Origin
|
61
61
|
Access-Control-Allow-Origin:
|
62
62
|
- "*"
|
63
63
|
X-Fastly-Request-Id:
|
64
|
-
-
|
64
|
+
- 93a267346ed97c52087b05f16495084f70b848e8
|
65
65
|
Expires:
|
66
|
-
- Thu,
|
66
|
+
- Thu, 30 Jun 2022 17:21:27 GMT
|
67
67
|
Source-Age:
|
68
68
|
- '0'
|
69
69
|
body:
|
@@ -143,5 +143,5 @@ http_interactions:
|
|
143
143
|
freeze_stage3_meeting: SMG-28
|
144
144
|
close_meeting: SP-28
|
145
145
|
project_end: '1999-02-12'
|
146
|
-
recorded_at: Thu,
|
146
|
+
recorded_at: Thu, 30 Jun 2022 17:16:27 GMT
|
147
147
|
recorded_with: VCR 6.1.0
|