relaton 1.7.pre7 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|