relaton 1.7.pre7 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/macos.yml +34 -0
- data/.github/workflows/ubuntu.yml +32 -0
- data/.github/workflows/windows.yml +35 -0
- data/docs/README.adoc +3 -233
- data/lib/relaton/config.rb +2 -3
- data/lib/relaton/db.rb +35 -247
- data/lib/relaton/db_cache.rb +6 -28
- data/lib/relaton/processor.rb +0 -11
- data/lib/relaton/registry.rb +1 -1
- data/lib/relaton/version.rb +1 -1
- data/lib/relaton.rb +7 -8
- data/relaton.gemspec +6 -8
- data/spec/relaton/db_cache_spec.rb +1 -1
- data/spec/relaton/db_spec.rb +0 -145
- data/spec/relaton/processor_spec.rb +0 -4
- data/spec/relaton/regirtry_spec.rb +44 -54
- data/spec/relaton_spec.rb +19 -120
- data/spec/vcr_cassetes/19133_2005.yml +20 -20
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +10 -10
- data/spec/vcr_cassetes/fisp_140.yml +6 -6
- data/spec/vcr_cassetes/gb_t_20223_2006.yml +11 -15
- data/spec/vcr_cassetes/ieee_528_2019.yml +17 -17
- data/spec/vcr_cassetes/iho_b_11.yml +15 -15
- data/spec/vcr_cassetes/iso_111111119115_1.yml +5 -5
- data/spec/vcr_cassetes/iso_19115.yml +22 -22
- data/spec/vcr_cassetes/iso_19115_1.yml +20 -20
- data/spec/vcr_cassetes/iso_19115_1_2.yml +39 -39
- data/spec/vcr_cassetes/iso_awi_24229.yml +22 -22
- data/spec/vcr_cassetes/ogc_19_025r1.yml +1902 -2554
- data/spec/vcr_cassetes/ogm_ami4ccm_1_0.yml +7 -7
- data/spec/vcr_cassetes/rfc_8341.yml +15 -47
- data/spec/vcr_cassetes/sp_800_38b.yml +6 -6
- data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +30 -30
- data/spec/vcr_cassetes/w3c_json_ld11.yml +12 -12
- metadata +51 -61
- data/.github/workflows/rake.yml +0 -46
- data/globalcache/iec/iec_60050_102_2007.xml +0 -58
- data/globalcache/iec/version +0 -1
- data/lib/relaton/workers_pool.rb +0 -23
- data/spec/vcr_cassetes/cie_001_1980.yml +0 -120
- data/spec/vcr_cassetes/ecma_6.yml +0 -159
- data/spec/vcr_cassetes/hist_cmbined_included.yml +0 -105
- data/spec/vcr_cassetes/iec_60050_102_2007.yml +0 -285
- data/spec/vcr_cassetes/iec_combined_included.yml +0 -945
- data/spec/vcr_cassetes/iso_combined_applied.yml +0 -361
- data/spec/vcr_cassetes/iso_combined_included.yml +0 -361
- data/spec/vcr_cassetes/itu_combined_included.yml +0 -1296
- data/spec/vcr_cassetes/rfc_unsuccess.yml +0 -70
data/lib/relaton/db.rb
CHANGED
@@ -10,121 +10,39 @@ module Relaton
|
|
10
10
|
# @param local_cache [String] directory of local DB
|
11
11
|
def initialize(global_cache, local_cache)
|
12
12
|
@registry = Relaton::Registry.instance
|
13
|
-
|
14
|
-
@
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
@
|
13
|
+
@db = open_cache_biblio(global_cache, type: :global)
|
14
|
+
@local_db = open_cache_biblio(local_cache, type: :local)
|
15
|
+
@db_name = global_cache
|
16
|
+
@local_db_name = local_cache
|
17
|
+
static_db_name = File.expand_path "../relaton/static_cache", __dir__
|
18
|
+
@static_db = open_cache_biblio static_db_name
|
19
19
|
end
|
20
20
|
|
21
|
-
# Move global or local caches to anothe dirs
|
22
|
-
# @param new_dir [String, nil]
|
23
|
-
# @param type: [Symbol]
|
24
|
-
# @return [String, nil]
|
25
|
-
def mv(new_dir, type: :global)
|
26
|
-
case type
|
27
|
-
when :global
|
28
|
-
@db&.mv new_dir
|
29
|
-
when :local
|
30
|
-
@local_db&.mv new_dir
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# Clear global and local databases
|
35
|
-
def clear
|
36
|
-
@db&.clear
|
37
|
-
@local_db&.clear
|
38
|
-
end
|
39
|
-
|
40
|
-
##
|
41
21
|
# The class of reference requested is determined by the prefix of the code:
|
42
22
|
# GB Standard for gbbib, IETF for ietfbib, ISO for isobib, IEC or IEV for iecbib,
|
43
|
-
#
|
44
23
|
# @param code [String] the ISO standard Code to look up (e.g. "ISO 9000")
|
45
24
|
# @param year [String] the year the standard was published (optional)
|
46
|
-
#
|
47
|
-
# @
|
48
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
49
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
50
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
51
|
-
#
|
52
|
-
# @return [nil, RelatonBib::BibliographicItem, RelatonIsoBib::IsoBibliographicItem,
|
25
|
+
# @param opts [Hash] options; restricted to :all_parts if all-parts reference is required
|
26
|
+
# @return [NilClass, RelatonIsoBib::IsoBibliographicItem,
|
53
27
|
# RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
|
54
|
-
#
|
55
|
-
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem,
|
56
|
-
# RelatonOgc::OgcBibliographicItem, RelatonCalconnect::CcBibliographicItem]
|
57
|
-
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
58
|
-
# RelatonOmg::OmgBibliographicItem RelatinUn::UnBibliographicItem,
|
59
|
-
# RelatonW3c::W3cBibliographicItem
|
60
|
-
##
|
28
|
+
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem]
|
61
29
|
def fetch(code, year = nil, opts = {})
|
62
30
|
stdclass = standard_class(code) || return
|
63
|
-
|
64
|
-
ref = processor.respond_to?(:urn_to_code) ? processor.urn_to_code(code)&.first : code
|
65
|
-
ref ||= code
|
66
|
-
result = combine_doc ref, year, opts, stdclass
|
67
|
-
result ||= check_bibliocache(ref, year, opts, stdclass)
|
68
|
-
result
|
69
|
-
end
|
70
|
-
|
71
|
-
# @see Relaton::Db#fetch
|
72
|
-
def fetch_db(code, year = nil, opts = {})
|
73
|
-
opts[:fetch_db] = true
|
74
|
-
fetch code, year, opts
|
75
|
-
end
|
76
|
-
|
77
|
-
# fetch all standards from DB
|
78
|
-
# @param test [String, nil]
|
79
|
-
# @param edition [String], nil
|
80
|
-
# @param year [Integer, nil]
|
81
|
-
# @return [Array]
|
82
|
-
def fetch_all(text = nil, edition: nil, year: nil)
|
83
|
-
result = @static_db.all { |file, yml| search_yml file, yml, text, edition, year }.compact
|
84
|
-
db = @db || @local_db
|
85
|
-
result += db.all { |file, xml| search_xml file, xml, text, edition, year }.compact if db
|
86
|
-
result
|
87
|
-
end
|
88
|
-
|
89
|
-
# Fetch asynchronously
|
90
|
-
def fetch_async(code, year = nil, opts = {}, &_block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
91
|
-
stdclass = standard_class code
|
92
|
-
if stdclass
|
93
|
-
unless @queues[stdclass]
|
94
|
-
processor = @registry.processors[stdclass]
|
95
|
-
wp = WorkersPool.new(processor.threads) { |args| yield fetch *args }
|
96
|
-
@queues[stdclass] = { queue: Queue.new, workers_pool: wp }
|
97
|
-
Thread.new { process_queue @queues[stdclass] }
|
98
|
-
end
|
99
|
-
@queues[stdclass][:queue] << [code, year, opts]
|
100
|
-
else yield nil
|
101
|
-
end
|
31
|
+
check_bibliocache(code, year, opts, stdclass)
|
102
32
|
end
|
103
33
|
|
104
34
|
# @param code [String]
|
105
35
|
# @param year [String, NilClass]
|
106
36
|
# @param stdclass [Symbol, NilClass]
|
107
|
-
#
|
108
37
|
# @param opts [Hash]
|
109
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
110
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
111
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
112
|
-
#
|
113
|
-
# @return [nil, RelatonBib::BibliographicItem, RelatonIsoBib::IsoBibliographicItem,
|
114
|
-
# RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
|
115
|
-
# RelatonIec::IecBibliographicItem, RelatonIeee::IeeeBibliographicItem,
|
116
|
-
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem,
|
117
|
-
# RelatonOgc::OgcBibliographicItem, RelatonCalconnect::CcBibliographicItem]
|
118
|
-
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
119
|
-
# RelatonOmg::OmgBibliographicItem RelatinUn::UnBibliographicItem,
|
120
|
-
# RelatonW3c::W3cBibliographicItem
|
121
38
|
def fetch_std(code, year = nil, stdclass = nil, opts = {})
|
122
39
|
std = nil
|
123
40
|
@registry.processors.each do |name, processor|
|
124
41
|
std = name if processor.prefix == stdclass
|
125
42
|
end
|
126
|
-
|
127
|
-
|
43
|
+
unless std
|
44
|
+
std = standard_class(code) or return nil
|
45
|
+
end
|
128
46
|
check_bibliocache(code, year, opts, std)
|
129
47
|
end
|
130
48
|
|
@@ -168,115 +86,27 @@ module Relaton
|
|
168
86
|
|
169
87
|
private
|
170
88
|
|
171
|
-
# @param file [String] file path
|
172
|
-
# @param yml [String] content in YAML format
|
173
|
-
# @param text [String, nil] text to serach
|
174
|
-
# @param edition [String, nil] edition to filter
|
175
|
-
# @param year [Integer, nil] year to filter
|
176
|
-
# @return [BibliographicItem, nil]
|
177
|
-
def search_yml(file, yml, text, edition, year)
|
178
|
-
item = search_edition_year(file, yml, edition, year)
|
179
|
-
return unless item
|
180
|
-
|
181
|
-
item if match_xml_text(item.to_xml(bibdata: true), text)
|
182
|
-
end
|
183
|
-
|
184
|
-
# @param file [String] file path
|
185
|
-
# @param xml [String] content in XML format
|
186
|
-
# @param text [String, nil] text to serach
|
187
|
-
# @param edition [String, nil] edition to filter
|
188
|
-
# @param year [Integer, nil] year to filter
|
189
|
-
# @return [BibliographicItem, nil]
|
190
|
-
def search_xml(file, xml, text, edition, year)
|
191
|
-
return unless text.nil? || match_xml_text(xml, text)
|
192
|
-
|
193
|
-
search_edition_year(file, xml, edition, year)
|
194
|
-
end
|
195
|
-
|
196
|
-
# @param file [String] file path
|
197
|
-
# @param content [String] content in XML or YAmL format
|
198
|
-
# @param edition [String, nil] edition to filter
|
199
|
-
# @param year [Integer, nil] year to filter
|
200
|
-
# @return [BibliographicItem, nil]
|
201
|
-
def search_edition_year(file, content, edition, year) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
202
|
-
processor = @registry.processors[standard_class(file.split("/")[-2])]
|
203
|
-
item = file.match?(/xml$/) ? processor.from_xml(content) : processor.hash_to_bib(YAML.safe_load(content))
|
204
|
-
item if (edition.nil? || item.edition == edition) &&
|
205
|
-
(year.nil? || item.date.detect { |d| d.type == "published" && d.on(:year).to_s == year.to_s })
|
206
|
-
end
|
207
|
-
|
208
|
-
# @param xml [String] content in XML format
|
209
|
-
# @param text [String, nil] text to serach
|
210
|
-
# @return [Boolean]
|
211
|
-
def match_xml_text(xml, text)
|
212
|
-
%r{((?<attr>=((?<apstr>')|"))|>).*?#{text}.*?(?(<attr>)(?(<apstr>)'|")|<)}mi.match?(xml)
|
213
|
-
end
|
214
|
-
|
215
|
-
# @param code [String]
|
216
|
-
# @param year [String, nil]
|
217
|
-
# @param stdslass [String]
|
218
|
-
#
|
219
|
-
# @param opts [Hash] options
|
220
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
221
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
222
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
223
|
-
#
|
224
|
-
# @return [nil, RelatonBib::BibliographicItem, RelatonIsoBib::IsoBibliographicItem,
|
225
|
-
# RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
|
226
|
-
# RelatonIec::IecBibliographicItem, RelatonIeee::IeeeBibliographicItem,
|
227
|
-
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem,
|
228
|
-
# RelatonOgc::OgcBibliographicItem, RelatonCalconnect::CcBibliographicItem]
|
229
|
-
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
230
|
-
# RelatonOmg::OmgBibliographicItem RelatinUn::UnBibliographicItem,
|
231
|
-
# RelatonW3c::W3cBibliographicItem
|
232
|
-
def combine_doc(code, year, opts, stdclass) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
233
|
-
if (refs = code.split " + ").size > 1
|
234
|
-
reltype = "derivedFrom"
|
235
|
-
reldesc = nil
|
236
|
-
elsif (refs = code.split ", ").size > 1
|
237
|
-
reltype = "complements"
|
238
|
-
reldesc = RelatonBib::FormattedString.new content: "amendment"
|
239
|
-
else return
|
240
|
-
end
|
241
|
-
|
242
|
-
doc = @registry.processors[stdclass].hash_to_bib docid: { id: code }
|
243
|
-
ref = refs[0]
|
244
|
-
updates = check_bibliocache(ref, year, opts, stdclass)
|
245
|
-
doc.relation << RelatonBib::DocumentRelation.new(bibitem: updates, type: "updates") if updates
|
246
|
-
refs[1..-1].each_with_object(doc) do |c, d|
|
247
|
-
bib = check_bibliocache("#{ref}/#{c}", year, opts, stdclass)
|
248
|
-
if bib
|
249
|
-
d.relation << RelatonBib::DocumentRelation.new(type: reltype, description: reldesc, bibitem: bib)
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
89
|
# @param code [String] code of standard
|
255
90
|
# @return [Symbol] standard class name
|
256
91
|
def standard_class(code)
|
257
92
|
@registry.processors.each do |name, processor|
|
258
|
-
return name if
|
93
|
+
return name if /^#{processor.prefix}/.match(code) ||
|
259
94
|
processor.defaultprefix.match(code)
|
260
95
|
end
|
261
96
|
allowed = @registry.processors.reduce([]) do |m, (_k, v)|
|
262
97
|
m << v.prefix
|
263
98
|
end
|
264
99
|
warn <<~WARN
|
265
|
-
|
266
|
-
|
267
|
-
|
100
|
+
#{code} does not have a recognised prefix: #{allowed.join(', ')}.
|
101
|
+
See https://github.com/relaton/relaton/ for instructions on prefixing and wrapping document identifiers to disambiguate them.
|
102
|
+
WARN
|
268
103
|
end
|
269
104
|
|
270
105
|
# TODO: i18n
|
271
106
|
# Fofmat ID
|
272
107
|
# @param code [String]
|
273
108
|
# @param year [String]
|
274
|
-
#
|
275
109
|
# @param opts [Hash]
|
276
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
277
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
278
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
279
|
-
#
|
280
110
|
# @param stdClass [Symbol]
|
281
111
|
# @return [Array<String>] docid and code
|
282
112
|
def std_id(code, year, opts, stdclass)
|
@@ -299,36 +129,23 @@ module Relaton
|
|
299
129
|
|
300
130
|
# @param entry [String] XML string
|
301
131
|
# @param stdclass [Symbol]
|
302
|
-
# @
|
132
|
+
# @param id [String] docid
|
133
|
+
# @return [NilClass, RelatonIsoBib::IsoBibliographicItem,
|
303
134
|
# RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
|
304
|
-
#
|
305
|
-
|
306
|
-
|
307
|
-
# RelatonBipm::BipmBibliographicItem, RelatonIho::IhoBibliographicItem,
|
308
|
-
# RelatonOmg::OmgBibliographicItem RelatinUn::UnBibliographicItem,
|
309
|
-
# RelatonW3c::W3cBibliographicItem
|
310
|
-
def bib_retval(entry, stdclass)
|
311
|
-
entry.nil? || entry.match?(/^not_found/) ? nil : @registry.processors[stdclass].from_xml(entry)
|
135
|
+
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem]
|
136
|
+
def bib_retval(entry, stdclass, id)
|
137
|
+
entry =~ /^not_found/ ? nil : @registry.processors[stdclass].from_xml(entry)
|
312
138
|
end
|
313
139
|
|
314
140
|
# @param code [String]
|
315
141
|
# @param year [String]
|
316
|
-
#
|
317
142
|
# @param opts [Hash]
|
318
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
319
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
320
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
321
|
-
#
|
322
143
|
# @param stdclass [Symbol]
|
323
|
-
# @return [
|
144
|
+
# @return [NilClass, RelatonIsoBib::IsoBibliographicItem,
|
324
145
|
# RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
|
325
|
-
# RelatonIec::IecBibliographicItem, RelatonIeee::IeeeBibliographicItem,
|
326
146
|
# RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem,
|
327
147
|
# RelatonOgc::OgcBibliographicItem, RelatonCalconnect::CcBibliographicItem]
|
328
|
-
|
329
|
-
# RelatonOmg::OmgBibliographicItem RelatinUn::UnBibliographicItem,
|
330
|
-
# RelatonW3c::W3cBibliographicItem
|
331
|
-
def check_bibliocache(code, year, opts, stdclass) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
148
|
+
def check_bibliocache(code, year, opts, stdclass)
|
332
149
|
id, searchcode = std_id(code, year, opts, stdclass)
|
333
150
|
yaml = @static_db[id]
|
334
151
|
return @registry.processors[stdclass].hash_to_bib YAML.safe_load(yaml) if yaml
|
@@ -336,41 +153,31 @@ module Relaton
|
|
336
153
|
db = @local_db || @db
|
337
154
|
altdb = @local_db && @db ? @db : nil
|
338
155
|
if db.nil?
|
339
|
-
return if opts[:fetch_db]
|
340
|
-
|
341
156
|
bibentry = new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
342
|
-
return bib_retval(bibentry, stdclass)
|
157
|
+
return bib_retval(bibentry, stdclass, id)
|
343
158
|
end
|
344
159
|
|
345
160
|
db.delete(id) unless db.valid_entry?(id, year)
|
346
161
|
if altdb
|
347
|
-
|
348
|
-
|
349
|
-
db.clone_entry id, altdb if altdb.valid_entry? id, year
|
162
|
+
# db[id] ||= altdb[id]
|
163
|
+
db.clone_entry id, altdb
|
350
164
|
db[id] ||= new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
351
165
|
altdb.clone_entry(id, db) if !altdb.valid_entry?(id, year)
|
352
166
|
else
|
353
|
-
return bib_retval(db[id], stdclass) if opts[:fetch_db]
|
354
|
-
|
355
167
|
db[id] ||= new_bib_entry(searchcode, year, opts, stdclass, db: db, id: id)
|
356
168
|
end
|
357
|
-
bib_retval(db[id], stdclass)
|
169
|
+
bib_retval(db[id], stdclass, id)
|
358
170
|
end
|
359
171
|
|
360
172
|
# @param code [String]
|
361
173
|
# @param year [String]
|
362
|
-
#
|
363
174
|
# @param opts [Hash]
|
364
|
-
# @option opts [Boolean] :all_parts If all-parts reference is required
|
365
|
-
# @option opts [Boolean] :keep_year If undated reference should return actual reference with year
|
366
|
-
# @option opts [Integer] :retries (1) Number of network retries
|
367
|
-
#
|
368
175
|
# @param stdclass [Symbol]
|
369
176
|
# @param db [Relaton::DbCache,`NilClass]
|
370
177
|
# @param id [String] docid
|
371
178
|
# @return [String]
|
372
|
-
def new_bib_entry(code, year, opts, stdclass, **args)
|
373
|
-
bib =
|
179
|
+
def new_bib_entry(code, year, opts, stdclass, **args)
|
180
|
+
bib = @registry.processors[stdclass].get(code, year, opts)
|
374
181
|
bib_id = bib&.docidentifier&.first&.id
|
375
182
|
|
376
183
|
# when docid doesn't match bib's id then return a reference to bib's id
|
@@ -378,19 +185,11 @@ module Relaton
|
|
378
185
|
bid = std_id(bib.docidentifier.first.id, nil, {}, stdclass).first
|
379
186
|
args[:db][bid] ||= bib_entry bib
|
380
187
|
"redirection #{bid}"
|
381
|
-
else
|
188
|
+
else
|
189
|
+
bib_entry bib
|
382
190
|
end
|
383
191
|
end
|
384
192
|
|
385
|
-
# @raise [RelatonBib::RequestError]
|
386
|
-
def net_retry(code, year, opts, stdclass, retries)
|
387
|
-
@registry.processors[stdclass].get(code, year, opts)
|
388
|
-
rescue RelatonBib::RequestError => e
|
389
|
-
raise e unless retries > 1
|
390
|
-
|
391
|
-
net_retry(code, year, opts, stdclass, retries - 1)
|
392
|
-
end
|
393
|
-
|
394
193
|
# @param bib [RelatonGb::GbBibliongraphicItem, RelatonIsoBib::IsoBibliographicItem,
|
395
194
|
# RelatonIetf::IetfBibliographicItem, RelatonItu::ItuBibliographicItem,
|
396
195
|
# RelatonNist::NistBibliongraphicItem, RelatonOgc::OgcBibliographicItem]
|
@@ -403,32 +202,21 @@ module Relaton
|
|
403
202
|
end
|
404
203
|
end
|
405
204
|
|
406
|
-
# @param dir [String
|
205
|
+
# @param dir [String] DB directory
|
407
206
|
# @param type [Symbol]
|
408
207
|
# @return [Relaton::DbCache, NilClass]
|
409
208
|
def open_cache_biblio(dir, type: :static)
|
410
209
|
return nil if dir.nil?
|
411
210
|
|
412
211
|
db = DbCache.new dir, type == :static ? "yml" : "xml"
|
413
|
-
return db if type == :static
|
414
212
|
|
415
213
|
Dir["#{dir}/*/"].each do |fdir|
|
416
|
-
next if db.check_version?(fdir)
|
214
|
+
next if type == :static || db.check_version?(fdir)
|
417
215
|
|
418
|
-
FileUtils.rm_rf(fdir, secure: true)
|
419
|
-
# db.set_version fdir
|
216
|
+
FileUtils.rm_rf(Dir.glob(fdir + "/*"), secure: true)
|
420
217
|
warn "[relaton] cache #{fdir}: version is obsolete and cache is cleared."
|
421
218
|
end
|
422
219
|
db
|
423
220
|
end
|
424
|
-
|
425
|
-
# @param qwp [Hash]
|
426
|
-
# @option qwp [Queue] :queue The queue of references to fetch
|
427
|
-
# @option qwp [Relaton::WorkersPool] :workers_pool The pool of workers
|
428
|
-
def process_queue(qwp)
|
429
|
-
while args = qwp[:queue].pop
|
430
|
-
qwp[:workers_pool] << args
|
431
|
-
end
|
432
|
-
end
|
433
221
|
end
|
434
222
|
end
|
data/lib/relaton/db_cache.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "fileutils"
|
2
|
-
require "timeout"
|
3
2
|
|
4
3
|
module Relaton
|
5
4
|
class DbCache
|
@@ -15,26 +14,6 @@ module Relaton
|
|
15
14
|
# set_version # unless File.exist? file_version
|
16
15
|
end
|
17
16
|
|
18
|
-
# Move caches to anothe dir
|
19
|
-
# @param new_dir [String, nil]
|
20
|
-
# @return [String, nil]
|
21
|
-
def mv(new_dir)
|
22
|
-
return unless new_dir && @ext == "xml"
|
23
|
-
|
24
|
-
if File.exist? new_dir
|
25
|
-
warn "[relaton] WARNING: target directory exists \"#{new_dir}\""
|
26
|
-
return
|
27
|
-
end
|
28
|
-
|
29
|
-
FileUtils.mv dir, new_dir
|
30
|
-
@dir = new_dir
|
31
|
-
end
|
32
|
-
|
33
|
-
# Clear database
|
34
|
-
def clear
|
35
|
-
FileUtils.rm_rf Dir.glob "#{dir}/*" if @ext == "xml" # unless it's static DB
|
36
|
-
end
|
37
|
-
|
38
17
|
# Save item
|
39
18
|
# @param key [String]
|
40
19
|
# @param value [String] Bibitem xml serialization
|
@@ -86,7 +65,7 @@ module Relaton
|
|
86
65
|
value = self[key]
|
87
66
|
return unless value
|
88
67
|
|
89
|
-
if value
|
68
|
+
if value =~ /^not_found/
|
90
69
|
value.match(/\d{4}-\d{2}-\d{2}/).to_s
|
91
70
|
else
|
92
71
|
doc = Nokogiri::XML value
|
@@ -97,9 +76,8 @@ module Relaton
|
|
97
76
|
# Returns all items
|
98
77
|
# @return [Array<String>]
|
99
78
|
def all
|
100
|
-
Dir.glob("#{@dir}/**/*.
|
101
|
-
|
102
|
-
block_given? ? yield(f, content) : content
|
79
|
+
Dir.glob("#{@dir}/**/*.xml").sort.map do |f|
|
80
|
+
File.read(f, encoding: "utf-8")
|
103
81
|
end
|
104
82
|
end
|
105
83
|
|
@@ -181,7 +159,7 @@ module Relaton
|
|
181
159
|
def filename(key)
|
182
160
|
prefcode = key.downcase.match /^(?<prefix>[^\(]+)\((?<code>[^\)]+)/
|
183
161
|
fn = if prefcode
|
184
|
-
"#{prefcode[:prefix]}/#{prefcode[:code].gsub(/[-:\s\/\()]/, '_').squeeze(
|
162
|
+
"#{prefcode[:prefix]}/#{prefcode[:code].gsub(/[-:\s\/\()]/, '_').squeeze("_")}"
|
185
163
|
else
|
186
164
|
key.gsub(/[-:\s]/, "_")
|
187
165
|
end
|
@@ -215,7 +193,7 @@ module Relaton
|
|
215
193
|
# @content [String]
|
216
194
|
def file_safe_write(file, content)
|
217
195
|
File.open file, File::RDWR | File::CREAT, encoding: "UTF-8" do |f|
|
218
|
-
Timeout.timeout(
|
196
|
+
Timeout.timeout(1) { f.flock File::LOCK_EX }
|
219
197
|
f.write content
|
220
198
|
end
|
221
199
|
end
|
@@ -240,7 +218,7 @@ module Relaton
|
|
240
218
|
# local_cache: local cache name; none created if nil; "relaton" created
|
241
219
|
# if empty global_cache: boolean to create global_cache
|
242
220
|
# flush_caches: flush caches
|
243
|
-
def init_bib_caches(opts)
|
221
|
+
def init_bib_caches(opts)
|
244
222
|
globalname = global_bibliocache_name if opts[:global_cache]
|
245
223
|
localname = local_bibliocache_name(opts[:local_cache])
|
246
224
|
localname = "relaton" if localname&.empty?
|
data/lib/relaton/processor.rb
CHANGED
@@ -20,16 +20,5 @@ module Relaton
|
|
20
20
|
def hash_to_bib(_hash)
|
21
21
|
raise "This is an abstract class!"
|
22
22
|
end
|
23
|
-
|
24
|
-
def grammar_hash
|
25
|
-
raise "This is an abstract class!"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Retuns default number of workers. Should be overraded by childred classes if need.
|
29
|
-
#
|
30
|
-
# @return [Integer] nuber of wokrers
|
31
|
-
def threads
|
32
|
-
10
|
33
|
-
end
|
34
23
|
end
|
35
24
|
end
|
data/lib/relaton/registry.rb
CHANGED
@@ -8,7 +8,7 @@ module Relaton
|
|
8
8
|
SUPPORTED_GEMS = %w[
|
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
|
-
relaton_ieee relaton_iho relaton_bipm
|
11
|
+
relaton_ieee relaton_iho relaton_bipm
|
12
12
|
].freeze
|
13
13
|
|
14
14
|
include Singleton
|
data/lib/relaton/version.rb
CHANGED
data/lib/relaton.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative "relaton/util"
|
2
|
+
require_relative "relaton/config"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require "relaton/processor"
|
4
|
+
require_relative "relaton/db"
|
5
|
+
require_relative "relaton/db_cache"
|
6
|
+
require_relative "relaton/version"
|
7
|
+
require_relative "relaton/registry"
|
8
|
+
require_relative "relaton/processor"
|
data/relaton.gemspec
CHANGED
@@ -32,23 +32,21 @@ Gem::Specification.new do |spec|
|
|
32
32
|
# spec.add_dependency "algoliasearch"
|
33
33
|
spec.add_dependency "relaton-bipm", "~> 1.7.0"
|
34
34
|
spec.add_dependency "relaton-calconnect", "~> 1.7.0"
|
35
|
-
spec.add_dependency "relaton-cie", "~> 1.7.pre1"
|
36
|
-
spec.add_dependency "relaton-ecma", "~> 1.7.pre1"
|
37
35
|
spec.add_dependency "relaton-gb", "~> 1.7.0"
|
38
|
-
spec.add_dependency "relaton-iec", "
|
36
|
+
spec.add_dependency "relaton-iec", "~> 1.7.0"
|
39
37
|
spec.add_dependency "relaton-ieee", "~> 1.7.0"
|
40
38
|
spec.add_dependency "relaton-ietf", "~> 1.7.0"
|
41
39
|
spec.add_dependency "relaton-iho", "~> 1.7.0"
|
42
|
-
spec.add_dependency "relaton-iso", "
|
43
|
-
spec.add_dependency "relaton-itu", "
|
44
|
-
spec.add_dependency "relaton-nist", "
|
40
|
+
spec.add_dependency "relaton-iso", "~> 1.7.0"
|
41
|
+
spec.add_dependency "relaton-itu", "~> 1.7.0"
|
42
|
+
spec.add_dependency "relaton-nist", "~> 1.7.0"
|
45
43
|
spec.add_dependency "relaton-ogc", "~> 1.7.0"
|
46
44
|
spec.add_dependency "relaton-omg", "~> 1.7.0"
|
47
45
|
spec.add_dependency "relaton-un", "~> 1.7.0"
|
48
46
|
spec.add_dependency "relaton-w3c", "~> 1.7.0"
|
49
47
|
|
50
48
|
spec.add_development_dependency "byebug", "~> 11.0"
|
51
|
-
|
49
|
+
spec.add_development_dependency "debase"
|
52
50
|
spec.add_development_dependency "equivalent-xml", "~> 0.6"
|
53
51
|
spec.add_development_dependency "guard", "~> 2.14"
|
54
52
|
spec.add_development_dependency "guard-rspec", "~> 4.7"
|
@@ -56,7 +54,7 @@ Gem::Specification.new do |spec|
|
|
56
54
|
spec.add_development_dependency "rake", "~> 10.0"
|
57
55
|
spec.add_development_dependency "rspec", "~> 3.6"
|
58
56
|
spec.add_development_dependency "rubocop", "= 0.54.0"
|
59
|
-
|
57
|
+
spec.add_development_dependency "ruby-debug-ide"
|
60
58
|
spec.add_development_dependency "simplecov", "~> 0.15"
|
61
59
|
spec.add_development_dependency "timecop", "~> 0.9"
|
62
60
|
spec.add_development_dependency "vcr", "~> 5"
|
@@ -7,7 +7,7 @@ RSpec.describe Relaton::DbCache do
|
|
7
7
|
FileUtils.mv cache_path, "relaton1/cache", force: true
|
8
8
|
FileUtils.rm_rf %w(relaton)
|
9
9
|
Relaton::DbCache.init_bib_caches(
|
10
|
-
global_cache: true, local_cache: "", flush_caches: true
|
10
|
+
global_cache: true, local_cache: "", flush_caches: true,
|
11
11
|
)
|
12
12
|
expect(File.exist?(cache_path)).to be true
|
13
13
|
expect(File.exist?("relaton")).to be true
|