relaton-bib 1.8.2 → 1.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +1 -11
- data/.rubocop.yml +1 -1
- data/grammars/biblio.rng +1 -0
- data/grammars/isodoc.rng +72 -10
- data/lib/relaton_bib/bibliographic_date.rb +1 -1
- data/lib/relaton_bib/bibliographic_item.rb +22 -16
- data/lib/relaton_bib/document_status.rb +5 -4
- data/lib/relaton_bib/editorial_group.rb +1 -1
- data/lib/relaton_bib/formatted_ref.rb +1 -1
- data/lib/relaton_bib/hash_converter.rb +21 -21
- data/lib/relaton_bib/hit.rb +6 -6
- data/lib/relaton_bib/localized_string.rb +5 -4
- data/lib/relaton_bib/organization.rb +3 -3
- data/lib/relaton_bib/typed_uri.rb +1 -1
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/workgroup.rb +24 -12
- data/lib/relaton_bib/xml_parser.rb +14 -11
- data/lib/relaton_bib.rb +2 -2
- data/relaton-bib.gemspec +1 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c432bbee2d1bcf2b1c6b0d23abdeb2d4d017ab6bd5cb317b3d88cd82a304c3f8
|
4
|
+
data.tar.gz: 8d8ed4ea374b4c5e978608e97a46dd98e98d024ee8ab07835fbede899dee9a33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b94f4f9ff22469817a83635e410d49011b19c65ae1cd1c03af7a9f96a666bad564812440fd73c5dfaa6ff98a81ddcfaff970c8e7c85f4a247ce1fca15440c5c1
|
7
|
+
data.tar.gz: 0fa9dd7153a13a91e7663626058f11c7152b990aff1e016ce093f8e394a5166fac72ee726aad4ce89b20cbb90a7e5b35f65bdaa95d3f7fb74c2bf5b90de0960b
|
data/.github/workflows/rake.yml
CHANGED
@@ -16,19 +16,9 @@ jobs:
|
|
16
16
|
strategy:
|
17
17
|
fail-fast: false
|
18
18
|
matrix:
|
19
|
-
ruby: [ '
|
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
data/grammars/biblio.rng
CHANGED
data/grammars/isodoc.rng
CHANGED
@@ -45,6 +45,11 @@
|
|
45
45
|
<optional>
|
46
46
|
<attribute name="alt"/>
|
47
47
|
</optional>
|
48
|
+
<optional>
|
49
|
+
<attribute name="updatetype">
|
50
|
+
<data type="boolean"/>
|
51
|
+
</attribute>
|
52
|
+
</optional>
|
48
53
|
<text/>
|
49
54
|
</element>
|
50
55
|
</define>
|
@@ -199,6 +204,18 @@
|
|
199
204
|
</zeroOrMore>
|
200
205
|
</element>
|
201
206
|
</define>
|
207
|
+
<define name="dt">
|
208
|
+
<element name="dt">
|
209
|
+
<optional>
|
210
|
+
<attribute name="id">
|
211
|
+
<data type="ID"/>
|
212
|
+
</attribute>
|
213
|
+
</optional>
|
214
|
+
<zeroOrMore>
|
215
|
+
<ref name="TextElement"/>
|
216
|
+
</zeroOrMore>
|
217
|
+
</element>
|
218
|
+
</define>
|
202
219
|
<define name="example">
|
203
220
|
<element name="example">
|
204
221
|
<attribute name="id">
|
@@ -543,6 +560,9 @@
|
|
543
560
|
</define>
|
544
561
|
<define name="BibDataExtensionType">
|
545
562
|
<ref name="doctype"/>
|
563
|
+
<optional>
|
564
|
+
<ref name="docsubtype"/>
|
565
|
+
</optional>
|
546
566
|
<optional>
|
547
567
|
<ref name="editorialgroup"/>
|
548
568
|
</optional>
|
@@ -890,6 +910,14 @@
|
|
890
910
|
</define>
|
891
911
|
</include>
|
892
912
|
<!-- end overrides -->
|
913
|
+
<define name="docsubtype">
|
914
|
+
<element name="subdoctype">
|
915
|
+
<ref name="DocumentSubtype"/>
|
916
|
+
</element>
|
917
|
+
</define>
|
918
|
+
<define name="DocumentSubtype">
|
919
|
+
<text/>
|
920
|
+
</define>
|
893
921
|
<define name="colgroup">
|
894
922
|
<element name="colgroup">
|
895
923
|
<oneOrMore>
|
@@ -939,7 +967,34 @@
|
|
939
967
|
<define name="concept">
|
940
968
|
<element name="concept">
|
941
969
|
<optional>
|
942
|
-
<attribute name="
|
970
|
+
<attribute name="ital">
|
971
|
+
<data type="boolean"/>
|
972
|
+
</attribute>
|
973
|
+
</optional>
|
974
|
+
<optional>
|
975
|
+
<attribute name="ref">
|
976
|
+
<data type="boolean"/>
|
977
|
+
</attribute>
|
978
|
+
</optional>
|
979
|
+
<optional>
|
980
|
+
<element name="refterm">
|
981
|
+
<zeroOrMore>
|
982
|
+
<choice>
|
983
|
+
<ref name="PureTextElement"/>
|
984
|
+
<ref name="stem"/>
|
985
|
+
</choice>
|
986
|
+
</zeroOrMore>
|
987
|
+
</element>
|
988
|
+
</optional>
|
989
|
+
<optional>
|
990
|
+
<element name="renderterm">
|
991
|
+
<zeroOrMore>
|
992
|
+
<choice>
|
993
|
+
<ref name="PureTextElement"/>
|
994
|
+
<ref name="stem"/>
|
995
|
+
</choice>
|
996
|
+
</zeroOrMore>
|
997
|
+
</element>
|
943
998
|
</optional>
|
944
999
|
<choice>
|
945
1000
|
<ref name="eref"/>
|
@@ -965,6 +1020,9 @@
|
|
965
1020
|
</attribute>
|
966
1021
|
<attribute name="name"/>
|
967
1022
|
<attribute name="action"/>
|
1023
|
+
<optional>
|
1024
|
+
<attribute name="class"/>
|
1025
|
+
</optional>
|
968
1026
|
<zeroOrMore>
|
969
1027
|
<choice>
|
970
1028
|
<ref name="TextElement"/>
|
@@ -1191,13 +1249,17 @@
|
|
1191
1249
|
</define>
|
1192
1250
|
<define name="IsoWorkgroup">
|
1193
1251
|
<optional>
|
1194
|
-
<attribute name="number"
|
1195
|
-
<data type="int"/>
|
1196
|
-
</attribute>
|
1252
|
+
<attribute name="number"/>
|
1197
1253
|
</optional>
|
1198
1254
|
<optional>
|
1199
1255
|
<attribute name="type"/>
|
1200
1256
|
</optional>
|
1257
|
+
<optional>
|
1258
|
+
<attribute name="identifier"/>
|
1259
|
+
</optional>
|
1260
|
+
<optional>
|
1261
|
+
<attribute name="prefix"/>
|
1262
|
+
</optional>
|
1201
1263
|
<text/>
|
1202
1264
|
</define>
|
1203
1265
|
<define name="ics">
|
@@ -1459,26 +1521,26 @@
|
|
1459
1521
|
<optional>
|
1460
1522
|
<ref name="section-title"/>
|
1461
1523
|
</optional>
|
1462
|
-
<
|
1524
|
+
<choice>
|
1463
1525
|
<choice>
|
1464
1526
|
<group>
|
1465
|
-
<
|
1527
|
+
<oneOrMore>
|
1466
1528
|
<ref name="BasicBlock"/>
|
1467
|
-
</
|
1529
|
+
</oneOrMore>
|
1468
1530
|
<zeroOrMore>
|
1469
1531
|
<ref name="note"/>
|
1470
1532
|
</zeroOrMore>
|
1471
1533
|
</group>
|
1472
1534
|
<ref name="amend"/>
|
1473
1535
|
</choice>
|
1474
|
-
<
|
1536
|
+
<oneOrMore>
|
1475
1537
|
<choice>
|
1476
1538
|
<ref name="clause-subsection"/>
|
1477
1539
|
<ref name="terms"/>
|
1478
1540
|
<ref name="definitions"/>
|
1479
1541
|
</choice>
|
1480
|
-
</
|
1481
|
-
</
|
1542
|
+
</oneOrMore>
|
1543
|
+
</choice>
|
1482
1544
|
</define>
|
1483
1545
|
<define name="Annex-Section">
|
1484
1546
|
<optional>
|
@@ -7,7 +7,7 @@ module RelatonBib
|
|
7
7
|
class BibliographicDate
|
8
8
|
TYPES = %w[published accessed created implemented obsoleted confirmed
|
9
9
|
updated issued transmitted copied unchanged circulated adapted
|
10
|
-
vote-started vote-ended].freeze
|
10
|
+
vote-started vote-ended announced].freeze
|
11
11
|
|
12
12
|
# @return [String]
|
13
13
|
attr_reader :type
|
@@ -42,7 +42,7 @@ module RelatonBib
|
|
42
42
|
attr_accessor :all_parts
|
43
43
|
|
44
44
|
# @return [String, NilClass]
|
45
|
-
attr_reader :id, :type, :docnumber, :edition, :doctype
|
45
|
+
attr_reader :id, :type, :docnumber, :edition, :doctype, :subdoctype
|
46
46
|
|
47
47
|
# @!attribute [r] title
|
48
48
|
# @return [RelatonBib::TypedTitleStringCollection]
|
@@ -148,6 +148,7 @@ module RelatonBib
|
|
148
148
|
# @param fetched [Date, NilClass] default nil
|
149
149
|
# @param keyword [Array<String>]
|
150
150
|
# @param doctype [String]
|
151
|
+
# @param subdoctype [String]
|
151
152
|
# @param editorialgroup [RelatonBib::EditorialGroup, nil]
|
152
153
|
# @param ics [Array<RelatonBib::ICS>]
|
153
154
|
# @param structuredidentifier [RelatonBib::StructuredIdentifierCollection]
|
@@ -229,8 +230,9 @@ module RelatonBib
|
|
229
230
|
@status = args[:docstatus]
|
230
231
|
@relation = DocRelationCollection.new(args[:relation] || [])
|
231
232
|
@link = args.fetch(:link, []).map do |s|
|
232
|
-
|
233
|
-
|
233
|
+
case s
|
234
|
+
when Hash then TypedUri.new(**s)
|
235
|
+
when String then TypedUri.new(content: s)
|
234
236
|
else s
|
235
237
|
end
|
236
238
|
end
|
@@ -250,6 +252,7 @@ module RelatonBib
|
|
250
252
|
end
|
251
253
|
@license = args.fetch :license, []
|
252
254
|
@doctype = args[:doctype]
|
255
|
+
@subdoctype = args[:subdoctype]
|
253
256
|
@editorialgroup = args[:editorialgroup]
|
254
257
|
@ics = args.fetch :ics, []
|
255
258
|
@structuredidentifier = args[:structuredidentifier]
|
@@ -260,8 +263,8 @@ module RelatonBib
|
|
260
263
|
# @param hash [Hash]
|
261
264
|
# @return [RelatonBipm::BipmBibliographicItem]
|
262
265
|
def self.from_hash(hash)
|
263
|
-
item_hash = Object.const_get(
|
264
|
-
new
|
266
|
+
item_hash = Object.const_get(name.split("::")[0])::HashConverter.hash_to_bib(hash)
|
267
|
+
new(**item_hash)
|
265
268
|
end
|
266
269
|
|
267
270
|
# @param lang [String] language code Iso639
|
@@ -286,7 +289,7 @@ module RelatonBib
|
|
286
289
|
# contribs = publishers.map { |p| p&.entity&.abbreviation }.join '/'
|
287
290
|
# idstr = "#{contribs}#{delim}#{id.project_number}"
|
288
291
|
# idstr = id.project_number.to_s
|
289
|
-
idstr = id.id.gsub(/:/, "-").gsub
|
292
|
+
idstr = id.id.gsub(/:/, "-").gsub(/\s/, "")
|
290
293
|
# if id.part_number&.size&.positive? then idstr += "-#{id.part_number}"
|
291
294
|
idstr.strip
|
292
295
|
end
|
@@ -299,7 +302,7 @@ module RelatonBib
|
|
299
302
|
def shortref(identifier, **opts) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/PerceivedComplexity
|
300
303
|
pubdate = date.select { |d| d.type == "published" }
|
301
304
|
year = if opts[:no_year] || pubdate.empty? then ""
|
302
|
-
else "
|
305
|
+
else ":#{pubdate&.first&.on(:year)}"
|
303
306
|
end
|
304
307
|
year += ": All Parts" if opts[:all_parts] || @all_parts
|
305
308
|
|
@@ -314,7 +317,7 @@ module RelatonBib
|
|
314
317
|
# @return [String] XML
|
315
318
|
def to_xml(**opts, &block)
|
316
319
|
if opts[:builder]
|
317
|
-
render_xml
|
320
|
+
render_xml(**opts, &block)
|
318
321
|
else
|
319
322
|
Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
|
320
323
|
render_xml builder: xml, **opts, &block
|
@@ -361,6 +364,7 @@ module RelatonBib
|
|
361
364
|
hash["keyword"] = single_element_array(keyword) if keyword&.any?
|
362
365
|
hash["license"] = single_element_array(license) if license&.any?
|
363
366
|
hash["doctype"] = doctype if doctype
|
367
|
+
hash["subdoctype"] = subdoctype if subdoctype
|
364
368
|
if editorialgroup&.presence?
|
365
369
|
hash["editorialgroup"] = editorialgroup.to_hash
|
366
370
|
end
|
@@ -460,7 +464,7 @@ module RelatonBib
|
|
460
464
|
me.date = []
|
461
465
|
me.docidentifier.each &:remove_date
|
462
466
|
me.structuredidentifier&.remove_date
|
463
|
-
me.id&.sub!
|
467
|
+
me.id&.sub!(/-[12]\d\d\d/, "")
|
464
468
|
me
|
465
469
|
end
|
466
470
|
|
@@ -477,7 +481,7 @@ module RelatonBib
|
|
477
481
|
# @param prefix [String]
|
478
482
|
# @return [String]
|
479
483
|
def to_asciibib(prefix = "") # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
480
|
-
pref = prefix.empty? ? prefix : prefix
|
484
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
481
485
|
out = prefix.empty? ? "[%bibitem]\n== {blank}\n" : ""
|
482
486
|
out += "#{pref}id:: #{id}\n" if id
|
483
487
|
out += "#{pref}fetched:: #{fetched}\n" if fetched
|
@@ -513,6 +517,7 @@ module RelatonBib
|
|
513
517
|
out += relation.to_asciibib prefix if relation
|
514
518
|
series.each { |s| out += s.to_asciibib prefix, series.size }
|
515
519
|
out += "#{pref}doctype:: #{doctype}\n" if doctype
|
520
|
+
out += "#{pref}subdoctype:: #{subdoctype}\n" if subdoctype
|
516
521
|
out += "#{pref}formattedref:: #{formattedref}\n" if formattedref
|
517
522
|
keyword.each { |kw| out += kw.to_asciibib "#{pref}keyword", keyword.size }
|
518
523
|
out += editorialgroup.to_asciibib prefix if editorialgroup
|
@@ -682,21 +687,21 @@ module RelatonBib
|
|
682
687
|
root = opts[:bibdata] ? :bibdata : :bibitem
|
683
688
|
xml = opts[:builder].send(root) do |builder|
|
684
689
|
builder.fetched fetched if fetched
|
685
|
-
title.to_xml
|
690
|
+
title.to_xml(**opts)
|
686
691
|
formattedref&.to_xml builder
|
687
692
|
link.each { |s| s.to_xml builder }
|
688
|
-
docidentifier.each { |di| di.to_xml
|
693
|
+
docidentifier.each { |di| di.to_xml(**opts) }
|
689
694
|
builder.docnumber docnumber if docnumber
|
690
695
|
date.each { |d| d.to_xml builder, **opts }
|
691
696
|
contributor.each do |c|
|
692
697
|
builder.contributor do
|
693
|
-
c.role.each { |r| r.to_xml
|
694
|
-
c.to_xml
|
698
|
+
c.role.each { |r| r.to_xml(**opts) }
|
699
|
+
c.to_xml(**opts)
|
695
700
|
end
|
696
701
|
end
|
697
702
|
builder.edition edition if edition
|
698
703
|
version&.to_xml builder
|
699
|
-
biblionote.to_xml
|
704
|
+
biblionote.to_xml(**opts)
|
700
705
|
opts[:note]&.each do |n|
|
701
706
|
builder.note(n[:text], format: "text/plain", type: n[:type])
|
702
707
|
end
|
@@ -706,7 +711,7 @@ module RelatonBib
|
|
706
711
|
abstr = abstract unless abstr.any?
|
707
712
|
abstr.each { |a| builder.abstract { a.to_xml(builder) } }
|
708
713
|
status&.to_xml builder
|
709
|
-
copyright&.each { |c| c.to_xml
|
714
|
+
copyright&.each { |c| c.to_xml(**opts) }
|
710
715
|
relation.each { |r| r.to_xml builder, **opts }
|
711
716
|
series.each { |s| s.to_xml builder }
|
712
717
|
medium&.to_xml builder
|
@@ -724,6 +729,7 @@ module RelatonBib
|
|
724
729
|
structuredidentifier&.presence?)
|
725
730
|
builder.ext do |b|
|
726
731
|
b.doctype doctype if doctype
|
732
|
+
b.subdoctype subdoctype if subdoctype
|
727
733
|
editorialgroup&.to_xml b
|
728
734
|
ics.each { |i| i.to_xml b }
|
729
735
|
structuredidentifier&.to_xml b
|
@@ -42,7 +42,7 @@ module RelatonBib
|
|
42
42
|
# @param prefix [String]
|
43
43
|
# @return [String]
|
44
44
|
def to_asciibib(prefix = "")
|
45
|
-
pref = prefix.empty? ? prefix : prefix
|
45
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
46
46
|
out = "#{pref}docstatus.stage:: #{stage.value}\n"
|
47
47
|
out += "#{pref}docstatus.substage:: #{substage.value}\n" if substage
|
48
48
|
out += "#{pref}docstatus.iteration:: #{iteration}\n" if iteration
|
@@ -54,9 +54,10 @@ module RelatonBib
|
|
54
54
|
# @param stg [RelatonBib::DocumentStatus::Stage, Hash, String, NilClass]
|
55
55
|
# @return [RelatonBib::DocumentStatus::Stage]
|
56
56
|
def stage_new(stg)
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
case stg
|
58
|
+
when Stage then stg
|
59
|
+
when Hash then Stage.new(**stg)
|
60
|
+
when String then Stage.new(value: stg)
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -27,7 +27,7 @@ module RelatonBib
|
|
27
27
|
# @param prefix [String]
|
28
28
|
# @return [String]
|
29
29
|
def to_asciibib(prefix = "")
|
30
|
-
pref = prefix.empty? ? "editorialgroup" : prefix
|
30
|
+
pref = prefix.empty? ? "editorialgroup" : "#{prefix}.editorialgroup"
|
31
31
|
technical_committee.map do |tc|
|
32
32
|
tc.to_asciibib pref, technical_committee.size
|
33
33
|
end.join
|
@@ -10,7 +10,7 @@ module RelatonBib
|
|
10
10
|
# @param prefix [String]
|
11
11
|
# @return [String]
|
12
12
|
def to_asciibib(prefix = "")
|
13
|
-
pref = prefix.empty? ? "formattedref" : prefix
|
13
|
+
pref = prefix.empty? ? "formattedref" : "#{prefix}.formattedref"
|
14
14
|
super pref
|
15
15
|
end
|
16
16
|
end
|
@@ -107,7 +107,7 @@ module RelatonBib
|
|
107
107
|
ret[:accesslocation] = array(ret[:accesslocation])
|
108
108
|
end
|
109
109
|
|
110
|
-
def dates_hash_to_bib(ret)
|
110
|
+
def dates_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize
|
111
111
|
return unless ret[:date]
|
112
112
|
|
113
113
|
ret[:date] = array(ret[:date])
|
@@ -160,7 +160,7 @@ module RelatonBib
|
|
160
160
|
ret[:docstatus] && ret[:docstatus] = DocumentStatus.new(
|
161
161
|
stage: stage(ret[:docstatus][:stage]),
|
162
162
|
substage: stage(ret[:docstatus][:substage]),
|
163
|
-
iteration: ret[:docstatus][:iteration]
|
163
|
+
iteration: ret[:docstatus][:iteration],
|
164
164
|
)
|
165
165
|
end
|
166
166
|
|
@@ -207,6 +207,7 @@ module RelatonBib
|
|
207
207
|
org[:subdivision] = array(org[:subdivision]).map do |sd|
|
208
208
|
LocalizedString.new sd
|
209
209
|
end
|
210
|
+
org[:contact] = contacts_hash_to_bib(org)
|
210
211
|
org
|
211
212
|
end
|
212
213
|
|
@@ -215,7 +216,7 @@ module RelatonBib
|
|
215
216
|
name: fullname_hash_to_bib(person),
|
216
217
|
affiliation: affiliation_hash_to_bib(person),
|
217
218
|
contact: contacts_hash_to_bib(person),
|
218
|
-
identifier: person_identifiers_hash_to_bib(person)
|
219
|
+
identifier: person_identifiers_hash_to_bib(person),
|
219
220
|
)
|
220
221
|
end
|
221
222
|
|
@@ -227,7 +228,7 @@ module RelatonBib
|
|
227
228
|
addition: array(n[:addition])&.map { |f| localname(f, person) },
|
228
229
|
prefix: array(n[:prefix])&.map { |f| localname(f, person) },
|
229
230
|
surname: localname(n[:surname], person),
|
230
|
-
completename: localname(n[:completename], person)
|
231
|
+
completename: localname(n[:completename], person),
|
231
232
|
)
|
232
233
|
end
|
233
234
|
|
@@ -247,19 +248,19 @@ module RelatonBib
|
|
247
248
|
script: d[:script], format: d[:format] }
|
248
249
|
else { content: d }
|
249
250
|
end
|
250
|
-
FormattedString.new
|
251
|
+
FormattedString.new(**cnt)
|
251
252
|
end
|
252
253
|
Affiliation.new(
|
253
254
|
organization: Organization.new(**org_hash_to_bib(a[:organization])),
|
254
|
-
description: a[:description]
|
255
|
+
description: a[:description],
|
255
256
|
)
|
256
257
|
end
|
257
258
|
end
|
258
259
|
|
259
|
-
def contacts_hash_to_bib(
|
260
|
-
return [] unless
|
260
|
+
def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
261
|
+
return [] unless entity[:contact]
|
261
262
|
|
262
|
-
array(
|
263
|
+
array(entity[:contact]).map do |a|
|
263
264
|
if a[:city] || a[:country]
|
264
265
|
RelatonBib::Address.new(
|
265
266
|
street: Array(a[:street]), city: a[:city], postcode: a[:postcode],
|
@@ -288,7 +289,7 @@ module RelatonBib
|
|
288
289
|
ret[:relation] = array(ret[:relation])
|
289
290
|
ret[:relation]&.each do |r|
|
290
291
|
if r[:description]
|
291
|
-
r[:description] = FormattedString.new
|
292
|
+
r[:description] = FormattedString.new(**r[:description])
|
292
293
|
end
|
293
294
|
relation_bibitem_hash_to_bib(r)
|
294
295
|
relation_locality_hash_to_bib(r)
|
@@ -309,7 +310,7 @@ module RelatonBib
|
|
309
310
|
# @param item_hash [Hash]
|
310
311
|
# @return [RelatonBib::BibliographicItem]
|
311
312
|
def bib_item(item_hash)
|
312
|
-
BibliographicItem.new
|
313
|
+
BibliographicItem.new(**item_hash)
|
313
314
|
end
|
314
315
|
|
315
316
|
# @param rel [Hash] relation
|
@@ -363,7 +364,7 @@ module RelatonBib
|
|
363
364
|
# @param title [Hash]
|
364
365
|
# @return [RelatonBib::TypedTitleString]
|
365
366
|
def typed_title_strig(title)
|
366
|
-
TypedTitleString.new
|
367
|
+
TypedTitleString.new(**title)
|
367
368
|
end
|
368
369
|
|
369
370
|
# @param ret [Hash]
|
@@ -375,7 +376,7 @@ module RelatonBib
|
|
375
376
|
def classification_hash_to_bib(ret)
|
376
377
|
if ret[:classification]
|
377
378
|
ret[:classification] = array(ret[:classification]).map do |cls|
|
378
|
-
Classification.new
|
379
|
+
Classification.new(**cls)
|
379
380
|
end
|
380
381
|
end
|
381
382
|
end
|
@@ -418,7 +419,7 @@ module RelatonBib
|
|
418
419
|
def ics_hash_to_bib(ret)
|
419
420
|
return unless ret[:ics]
|
420
421
|
|
421
|
-
ret[:ics] = array(ret[:ics]).map { |ics| ICS.new
|
422
|
+
ret[:ics] = array(ret[:ics]).map { |ics| ICS.new(**ics) }
|
422
423
|
end
|
423
424
|
|
424
425
|
# @param ret [Hash]
|
@@ -427,7 +428,7 @@ module RelatonBib
|
|
427
428
|
|
428
429
|
sids = array(ret[:structuredidentifier]).map do |si|
|
429
430
|
si[:agency] = array si[:agency]
|
430
|
-
StructuredIdentifier.new
|
431
|
+
StructuredIdentifier.new(**si)
|
431
432
|
end
|
432
433
|
ret[:structuredidentifier] = StructuredIdentifierCollection.new sids
|
433
434
|
end
|
@@ -435,15 +436,14 @@ module RelatonBib
|
|
435
436
|
# @param ogj [Hash, Array, String]
|
436
437
|
# @return [Hash, Array, String]
|
437
438
|
def symbolize(obj)
|
438
|
-
|
439
|
+
case obj
|
440
|
+
when Hash
|
439
441
|
obj.reduce({}) do |memo, (k, v)|
|
440
442
|
memo[k.to_sym] = symbolize(v)
|
441
443
|
memo
|
442
444
|
end
|
443
|
-
|
444
|
-
|
445
|
-
else
|
446
|
-
obj
|
445
|
+
when Array then obj.reduce([]) { |memo, v| memo << symbolize(v) }
|
446
|
+
else obj
|
447
447
|
end
|
448
448
|
end
|
449
449
|
|
@@ -459,7 +459,7 @@ module RelatonBib
|
|
459
459
|
# @param name [Hash, String, NilClass]
|
460
460
|
# @param person [Hash]
|
461
461
|
# @return [RelatonBib::LocalizedString]
|
462
|
-
def localname(name, person) # rubocop:disable Metrics/CyclomaticComplexity
|
462
|
+
def localname(name, person) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize
|
463
463
|
return nil if name.nil?
|
464
464
|
|
465
465
|
lang = name[:language] if name.is_a?(Hash)
|
data/lib/relaton_bib/hit.rb
CHANGED
@@ -21,10 +21,10 @@ module RelatonBib
|
|
21
21
|
# @return [String]
|
22
22
|
def inspect
|
23
23
|
"<#{self.class}:#{format('%<id>#.14x', id: object_id << 1)} "\
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
"@text=\"#{@hit_collection&.text}\" "\
|
25
|
+
"@fetched=\"#{!@fetch.nil?}\" "\
|
26
|
+
"@fullIdentifier=\"#{@fetch&.shortref(nil)}\" "\
|
27
|
+
"@title=\"#{@hit[:code]}\">"
|
28
28
|
end
|
29
29
|
|
30
30
|
def fetch
|
@@ -38,10 +38,10 @@ module RelatonBib
|
|
38
38
|
# @return [String] XML
|
39
39
|
def to_xml(**opts)
|
40
40
|
if opts[:builder]
|
41
|
-
fetch.to_xml
|
41
|
+
fetch.to_xml(**opts)
|
42
42
|
else
|
43
43
|
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
|
44
|
-
fetch.to_xml
|
44
|
+
fetch.to_xml(**opts.merge(builder: xml))
|
45
45
|
end
|
46
46
|
builder.doc.root.to_xml
|
47
47
|
end
|
@@ -21,14 +21,15 @@ module RelatonBib
|
|
21
21
|
if content.is_a?(Array) && content.none?
|
22
22
|
raise ArgumentError, "LocalizedString content is empty"
|
23
23
|
end
|
24
|
+
|
24
25
|
@language = language.is_a?(String) ? [language] : language
|
25
26
|
@script = script.is_a?(String) ? [script] : script
|
26
27
|
@content = if content.is_a?(Array)
|
27
28
|
content.map do |c|
|
28
|
-
|
29
|
+
case c
|
30
|
+
when Hash
|
29
31
|
LocalizedString.new c[:content], c[:language], c[:script]
|
30
|
-
|
31
|
-
LocalizedString.new c
|
32
|
+
when String then LocalizedString.new c
|
32
33
|
else c
|
33
34
|
end
|
34
35
|
end
|
@@ -38,7 +39,7 @@ module RelatonBib
|
|
38
39
|
|
39
40
|
# @return [String]
|
40
41
|
def to_s
|
41
|
-
content.is_a?(
|
42
|
+
content.is_a?(Array) ? content.first.to_s : content.to_s
|
42
43
|
end
|
43
44
|
|
44
45
|
# @return [TrueClass, FalseClass]
|
@@ -40,7 +40,7 @@ module RelatonBib
|
|
40
40
|
# @return [String]
|
41
41
|
def to_asciibib(prefix = "", count = 1)
|
42
42
|
pref = prefix.empty? ? prefix : prefix + "."
|
43
|
-
out = count > 1 ? "#{pref}identifier::\
|
43
|
+
out = count > 1 ? "#{pref}identifier::\n" : ""
|
44
44
|
out += "#{pref}identifier.type:: #{type}\n"
|
45
45
|
out += "#{pref}identifier.value:: #{value}\n"
|
46
46
|
out
|
@@ -99,7 +99,7 @@ module RelatonBib
|
|
99
99
|
builder.abbreviation { |a| abbreviation.to_xml a } if abbreviation
|
100
100
|
builder.uri url if uri
|
101
101
|
identifier.each { |identifier| identifier.to_xml builder }
|
102
|
-
super
|
102
|
+
super builder
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -119,7 +119,7 @@ module RelatonBib
|
|
119
119
|
# @return [String]
|
120
120
|
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
121
121
|
pref = prefix.sub /\*$/, "organization"
|
122
|
-
out = count > 1 ? "#{pref}::\
|
122
|
+
out = count > 1 ? "#{pref}::\n" : ""
|
123
123
|
name.each { |n| out += n.to_asciibib "#{pref}.name", name.size }
|
124
124
|
out += abbreviation.to_asciibib "#{pref}.abbreviation" if abbreviation
|
125
125
|
subdivision.each do |sd|
|
data/lib/relaton_bib/version.rb
CHANGED
@@ -1,45 +1,57 @@
|
|
1
1
|
module RelatonBib
|
2
2
|
class WorkGroup
|
3
3
|
# @return [String]
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :name
|
5
5
|
|
6
6
|
# @return [Integer, nil]
|
7
7
|
attr_reader :number
|
8
8
|
|
9
9
|
# @return [String, nil]
|
10
|
-
attr_reader :type
|
10
|
+
attr_reader :identifier, :prefix, :type
|
11
11
|
|
12
|
-
# @param
|
12
|
+
# @param name [String]
|
13
|
+
# @param identifier [String, nil]
|
14
|
+
# @param prefix [String, nil]
|
13
15
|
# @param number [Integer, nil]
|
14
16
|
# @param type [String, nil]
|
15
|
-
def initialize(
|
16
|
-
@
|
17
|
+
def initialize(name:, identifier: nil, prefix: nil, number: nil, type: nil)
|
18
|
+
@identifier = identifier
|
19
|
+
@prefix = prefix
|
20
|
+
@name = name
|
17
21
|
@number = number
|
18
22
|
@type = type
|
19
23
|
end
|
20
24
|
|
21
25
|
# @param builder [Nokogiri::XML::Builder]
|
22
|
-
def to_xml(builder)
|
23
|
-
builder.text
|
26
|
+
def to_xml(builder) # rubocop:disable Metrics/AbcSize
|
27
|
+
builder.text name
|
24
28
|
builder.parent[:number] = number if number
|
25
29
|
builder.parent[:type] = type if type
|
30
|
+
builder.parent[:identifier] = identifier if identifier
|
31
|
+
builder.parent[:prefix] = prefix if prefix
|
26
32
|
end
|
27
33
|
|
28
34
|
# @return [Hash]
|
29
35
|
def to_hash
|
30
|
-
hash = { "
|
36
|
+
hash = { "name" => name }
|
31
37
|
hash["number"] = number if number
|
32
38
|
hash["type"] = type if type
|
39
|
+
hash["identifier"] = identifier if identifier
|
40
|
+
hash["prefix"] = prefix if prefix
|
33
41
|
hash
|
34
42
|
end
|
35
43
|
|
36
|
-
# @param
|
44
|
+
# @param prfx [String]
|
45
|
+
# @param count [Integer]
|
37
46
|
# @return [String]
|
38
|
-
def to_asciibib(
|
39
|
-
pref =
|
40
|
-
out = "#{pref}
|
47
|
+
def to_asciibib(prfx = "", count = 1) # rubocop:disable Metrics/CyclomaticComplexity
|
48
|
+
pref = prfx.empty? ? prfx : "#{prfx}."
|
49
|
+
out = count > 1 ? "#{pref}::\n" : ""
|
50
|
+
out += "#{pref}name:: #{name}\n"
|
41
51
|
out += "#{pref}number:: #{number}\n" if number
|
42
52
|
out += "#{pref}type:: #{type}\n" if type
|
53
|
+
out += "#{pref}identifier:: #{identifier}\n" if identifier
|
54
|
+
out += "#{pref}prefix:: #{prefix}\n" if prefix
|
43
55
|
out
|
44
56
|
end
|
45
57
|
end
|
@@ -52,6 +52,7 @@ module RelatonBib
|
|
52
52
|
license: bibitem.xpath("license").map(&:text),
|
53
53
|
validity: fetch_validity(bibitem),
|
54
54
|
doctype: ext&.at("doctype")&.text,
|
55
|
+
subdoctype: ext&.at("subdoctype")&.text,
|
55
56
|
editorialgroup: fetch_editorialgroup(ext),
|
56
57
|
ics: fetch_ics(ext),
|
57
58
|
structuredidentifier: fetch_structuredidentifier(ext),
|
@@ -81,7 +82,7 @@ module RelatonBib
|
|
81
82
|
type: n[:type],
|
82
83
|
format: n[:format],
|
83
84
|
language: n[:language],
|
84
|
-
script: n[:script]
|
85
|
+
script: n[:script],
|
85
86
|
)
|
86
87
|
end
|
87
88
|
BiblioNoteCollection.new bnotes
|
@@ -201,7 +202,7 @@ module RelatonBib
|
|
201
202
|
DocumentStatus.new(
|
202
203
|
stage: stg ? stage(stg) : status.text,
|
203
204
|
substage: stage(status.at("substage")),
|
204
|
-
iteration: status.at("iteration")&.text
|
205
|
+
iteration: status.at("iteration")&.text,
|
205
206
|
)
|
206
207
|
end
|
207
208
|
|
@@ -262,7 +263,7 @@ module RelatonBib
|
|
262
263
|
city: c.at("./city")&.text,
|
263
264
|
state: c.at("./state")&.text,
|
264
265
|
country: c.at("./country")&.text,
|
265
|
-
postcode: c.at("./postcode")&.text
|
266
|
+
postcode: c.at("./postcode")&.text,
|
266
267
|
)
|
267
268
|
else
|
268
269
|
Contact.new(type: c.name, value: c.text)
|
@@ -290,13 +291,13 @@ module RelatonBib
|
|
290
291
|
name: name,
|
291
292
|
affiliation: affiliations,
|
292
293
|
contact: contact,
|
293
|
-
identifier: identifier
|
294
|
+
identifier: identifier,
|
294
295
|
)
|
295
296
|
end
|
296
297
|
|
297
298
|
def name_part(person, part)
|
298
299
|
person.xpath("./name/#{part}").map do |np|
|
299
|
-
LocalizedString.new np.text, np[:language]
|
300
|
+
LocalizedString.new np.text, np[:language], np[:script]
|
300
301
|
end
|
301
302
|
end
|
302
303
|
|
@@ -358,7 +359,7 @@ module RelatonBib
|
|
358
359
|
description: relation_description(rel),
|
359
360
|
bibitem: bib_item(item_data(rel.at("./bibitem"))),
|
360
361
|
locality: localities(rel),
|
361
|
-
source_locality: source_localities(rel)
|
362
|
+
source_locality: source_localities(rel),
|
362
363
|
)
|
363
364
|
end
|
364
365
|
end
|
@@ -376,7 +377,7 @@ module RelatonBib
|
|
376
377
|
# @param item_hash [Hash]
|
377
378
|
# @return [RelatonBib::BibliographicItem]
|
378
379
|
def bib_item(item_hash)
|
379
|
-
BibliographicItem.new
|
380
|
+
BibliographicItem.new(**item_hash)
|
380
381
|
end
|
381
382
|
|
382
383
|
# @param rel [Nokogiri::XML::Element]
|
@@ -398,7 +399,7 @@ module RelatonBib
|
|
398
399
|
klass.new(
|
399
400
|
loc[:type],
|
400
401
|
LocalizedString.new(loc.at("./referenceFrom").text),
|
401
|
-
ref_to
|
402
|
+
ref_to,
|
402
403
|
)
|
403
404
|
end
|
404
405
|
|
@@ -436,8 +437,10 @@ module RelatonBib
|
|
436
437
|
return unless ext && (eg = ext.at "editorialgroup")
|
437
438
|
|
438
439
|
eg = eg.xpath("technical-committee").map do |tc|
|
439
|
-
wg = WorkGroup.new(
|
440
|
-
|
440
|
+
wg = WorkGroup.new(
|
441
|
+
name: tc.text, number: tc[:number]&.to_i, type: tc[:type],
|
442
|
+
identifier: tc[:identifier], prefix: tc[:prefix]
|
443
|
+
)
|
441
444
|
TechnicalCommittee.new wg
|
442
445
|
end
|
443
446
|
EditorialGroup.new eg if eg.any?
|
@@ -468,7 +471,7 @@ module RelatonBib
|
|
468
471
|
supplementtype: si.at("supplementtype")&.text,
|
469
472
|
supplementnumber: si.at("supplementnumber")&.text,
|
470
473
|
language: si.at("language")&.text,
|
471
|
-
year: si.at("year")&.text
|
474
|
+
year: si.at("year")&.text,
|
472
475
|
)
|
473
476
|
end
|
474
477
|
StructuredIdentifierCollection.new sids
|
data/lib/relaton_bib.rb
CHANGED
@@ -39,11 +39,11 @@ module RelatonBib
|
|
39
39
|
|
40
40
|
# @param array [Array]
|
41
41
|
# @return [Array<String>, String]
|
42
|
-
def single_element_array(array)
|
42
|
+
def single_element_array(array)
|
43
43
|
if array.size > 1
|
44
44
|
array.map { |e| e.is_a?(String) ? e : e.to_hash }
|
45
45
|
else
|
46
|
-
array.first
|
46
|
+
array.first.is_a?(String) ? array[0] : array.first&.to_hash
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
data/relaton-bib.gemspec
CHANGED
@@ -21,14 +21,12 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.bindir = "exe"
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ["lib"]
|
24
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
24
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
25
25
|
|
26
26
|
spec.add_development_dependency "byebug"
|
27
|
-
# ec.add_development_dependency "debase"
|
28
27
|
spec.add_development_dependency "equivalent-xml", "~> 0.6"
|
29
28
|
spec.add_development_dependency "rake", "~> 13.0"
|
30
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
-
# spec.add_development_dependency "ruby-debug-ide"
|
32
30
|
spec.add_development_dependency "ruby-jing"
|
33
31
|
spec.add_development_dependency "simplecov"
|
34
32
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaton-bib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -226,7 +226,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
226
226
|
requirements:
|
227
227
|
- - ">="
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version: 2.
|
229
|
+
version: 2.5.0
|
230
230
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
231
|
requirements:
|
232
232
|
- - ">="
|