relaton 1.12.0 → 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 +45 -27
- data/lib/relaton/db_cache.rb +7 -1
- data/lib/relaton/version.rb +1 -1
- data/spec/relaton/db_spec.rb +34 -0
- data/spec/vcr_cassetes/3gpp_tr_00_01u_umts_3_0_0.yml +7 -7
- data/spec/vcr_cassetes/async_fetch.yml +1343 -1343
- data/spec/vcr_cassetes/bsi_bs_en_iso_8848.yml +10 -10
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +8 -8
- data/spec/vcr_cassetes/cie_001_1980.yml +10 -9
- data/spec/vcr_cassetes/ecma_6.yml +47 -16
- 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 +33 -43
- data/spec/vcr_cassetes/iec_combined_included.yml +95 -105
- data/spec/vcr_cassetes/ieee_528_2019.yml +1164 -1485
- 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 +13 -13
- data/spec/vcr_cassetes/iso_19115_1_2.yml +25 -25
- data/spec/vcr_cassetes/iso_19115_all_parts.yml +12 -12
- data/spec/vcr_cassetes/iso_19133_2005.yml +13 -13
- data/spec/vcr_cassetes/iso_combined_applied.yml +27 -27
- data/spec/vcr_cassetes/iso_combined_included.yml +28 -28
- 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 +11 -11
- data/spec/vcr_cassetes/sp_800_38b.yml +6 -6
- data/spec/vcr_cassetes/threads_from_env.yml +59 -59
- data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +31 -29
- data/spec/vcr_cassetes/w3c_json_ld11.yml +19 -19
- 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: 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
@@ -208,7 +208,7 @@ module Relaton
|
|
208
208
|
end
|
209
209
|
|
210
210
|
# @param file [String] file path
|
211
|
-
# @param content [String] content in XML or
|
211
|
+
# @param content [String] content in XML or YAML format
|
212
212
|
# @param edition [String, nil] edition to filter
|
213
213
|
# @param year [Integer, nil] year to filter
|
214
214
|
# @return [BibliographicItem, nil]
|
@@ -305,8 +305,10 @@ module Relaton
|
|
305
305
|
[prefix, code]
|
306
306
|
end
|
307
307
|
|
308
|
+
#
|
308
309
|
# @param entry [String] XML string
|
309
310
|
# @param stdclass [Symbol]
|
311
|
+
#
|
310
312
|
# @return [nil, RelatonBib::BibliographicItem,
|
311
313
|
# RelatonIsoBib::IsoBibliographicItem, RelatonItu::ItuBibliographicItem,
|
312
314
|
# RelatonIetf::IetfBibliographicItem, RelatonIec::IecBibliographicItem,
|
@@ -316,9 +318,7 @@ module Relaton
|
|
316
318
|
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
317
319
|
# RelatonOmg::OmgBibliographicItem, RelatonW3c::W3cBibliographicItem]
|
318
320
|
def bib_retval(entry, stdclass)
|
319
|
-
|
320
|
-
else @registry.processors[stdclass].from_xml(entry)
|
321
|
-
end
|
321
|
+
@registry.processors[stdclass].from_xml(entry) if entry
|
322
322
|
end
|
323
323
|
|
324
324
|
# @param code [String]
|
@@ -346,8 +346,7 @@ module Relaton
|
|
346
346
|
if db.nil?
|
347
347
|
return if opts[:fetch_db]
|
348
348
|
|
349
|
-
bibentry = new_bib_entry(searchcode, year, opts, stdclass
|
350
|
-
id: id)
|
349
|
+
bibentry = new_bib_entry(searchcode, year, opts, stdclass)
|
351
350
|
return bib_retval(bibentry, stdclass)
|
352
351
|
end
|
353
352
|
|
@@ -360,45 +359,58 @@ module Relaton
|
|
360
359
|
@semaphore.synchronize do
|
361
360
|
db.clone_entry id, altdb if altdb.valid_entry? id, year
|
362
361
|
end
|
363
|
-
|
362
|
+
new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
364
363
|
@semaphore.synchronize do
|
365
|
-
db[id] ||= entry
|
366
364
|
altdb.clone_entry(id, db) if !altdb.valid_entry?(id, year)
|
367
365
|
end
|
368
366
|
else
|
369
367
|
return bib_retval(db[id], stdclass) if opts[:fetch_db]
|
370
368
|
|
371
|
-
|
372
|
-
@semaphore.synchronize { db[id] ||= entry }
|
369
|
+
new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
373
370
|
end
|
374
371
|
bib_retval(db[id], stdclass)
|
375
372
|
end
|
376
373
|
|
374
|
+
#
|
375
|
+
# Create new bibliographic entry if it doesn't exist in database
|
376
|
+
#
|
377
377
|
# @param code [String]
|
378
378
|
# @param year [String]
|
379
379
|
#
|
380
380
|
# @param opts [Hash]
|
381
|
-
# @option opts [Boolean] :all_parts If all-parts reference is
|
382
|
-
#
|
383
|
-
#
|
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
|
384
385
|
# @option opts [Integer] :retries (1) Number of network retries
|
385
386
|
#
|
386
387
|
# @param stdclass [Symbol]
|
387
|
-
# @param db [Relaton::DbCache,`
|
388
|
-
# @param id [String] docid
|
389
|
-
#
|
390
|
-
|
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
|
+
|
391
401
|
bib = net_retry(code, year, opts, stdclass, opts.fetch(:retries, 1))
|
392
402
|
bib_id = bib&.docidentifier&.first&.id
|
393
403
|
|
394
404
|
# when docid doesn't match bib's id then return a reference to bib's id
|
395
|
-
if args[:db] && args[:id] &&
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
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 }
|
402
414
|
end
|
403
415
|
|
404
416
|
# @raise [RelatonBib::RequestError]
|
@@ -454,10 +466,16 @@ module Relaton
|
|
454
466
|
end
|
455
467
|
|
456
468
|
class << self
|
469
|
+
#
|
457
470
|
# Initialse and return relaton instance, with local and global cache names
|
458
|
-
#
|
459
|
-
#
|
460
|
-
#
|
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
|
+
#
|
461
479
|
def init_bib_caches(**opts) # rubocop:disable Metrics/CyclomaticComplexity
|
462
480
|
globalname = global_bibliocache_name if opts[:global_cache]
|
463
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/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
|
|
@@ -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
|