relaton-ietf 1.7.3 → 1.9.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/rake.yml +1 -11
- data/.rubocop.yml +1 -1
- data/README.adoc +16 -9
- data/grammars/basicdoc.rng +165 -20
- data/grammars/biblio.rng +5 -6
- data/grammars/ietf.rng +42 -0
- data/grammars/isodoc.rng +532 -16
- data/grammars/reqt.rng +31 -2
- data/lib/relaton_ietf/hash_converter.rb +1 -1
- data/lib/relaton_ietf/ietf_bibliographic_item.rb +7 -0
- data/lib/relaton_ietf/ietf_bibliography.rb +5 -1
- data/lib/relaton_ietf/processor.rb +1 -2
- data/lib/relaton_ietf/scrapper.rb +27 -20
- data/lib/relaton_ietf/version.rb +1 -1
- data/relaton_ietf.gemspec +3 -5
- metadata +8 -8
data/grammars/reqt.rng
CHANGED
@@ -30,15 +30,34 @@
|
|
30
30
|
<data type="boolean"/>
|
31
31
|
</attribute>
|
32
32
|
</optional>
|
33
|
+
<optional>
|
34
|
+
<attribute name="number"/>
|
35
|
+
</optional>
|
33
36
|
<optional>
|
34
37
|
<attribute name="subsequence"/>
|
35
38
|
</optional>
|
39
|
+
<optional>
|
40
|
+
<attribute name="keep-with-next">
|
41
|
+
<data type="boolean"/>
|
42
|
+
</attribute>
|
43
|
+
</optional>
|
44
|
+
<optional>
|
45
|
+
<attribute name="keep-lines-together">
|
46
|
+
<data type="boolean"/>
|
47
|
+
</attribute>
|
48
|
+
</optional>
|
36
49
|
<attribute name="id">
|
37
50
|
<data type="ID"/>
|
38
51
|
</attribute>
|
39
52
|
<optional>
|
40
53
|
<attribute name="filename"/>
|
41
54
|
</optional>
|
55
|
+
<optional>
|
56
|
+
<attribute name="model"/>
|
57
|
+
</optional>
|
58
|
+
<optional>
|
59
|
+
<attribute name="type"/>
|
60
|
+
</optional>
|
42
61
|
<optional>
|
43
62
|
<ref name="reqtitle"/>
|
44
63
|
</optional>
|
@@ -48,9 +67,9 @@
|
|
48
67
|
<optional>
|
49
68
|
<ref name="subject"/>
|
50
69
|
</optional>
|
51
|
-
<
|
70
|
+
<zeroOrMore>
|
52
71
|
<ref name="reqinherit"/>
|
53
|
-
</
|
72
|
+
</zeroOrMore>
|
54
73
|
<zeroOrMore>
|
55
74
|
<ref name="classification"/>
|
56
75
|
</zeroOrMore>
|
@@ -135,6 +154,16 @@
|
|
135
154
|
<data type="boolean"/>
|
136
155
|
</attribute>
|
137
156
|
</optional>
|
157
|
+
<optional>
|
158
|
+
<attribute name="keep-with-next">
|
159
|
+
<data type="boolean"/>
|
160
|
+
</attribute>
|
161
|
+
</optional>
|
162
|
+
<optional>
|
163
|
+
<attribute name="keep-lines-together">
|
164
|
+
<data type="boolean"/>
|
165
|
+
</attribute>
|
166
|
+
</optional>
|
138
167
|
<oneOrMore>
|
139
168
|
<ref name="BasicBlock"/>
|
140
169
|
</oneOrMore>
|
@@ -17,6 +17,13 @@ module RelatonIetf
|
|
17
17
|
super
|
18
18
|
end
|
19
19
|
|
20
|
+
# @param hash [Hash]
|
21
|
+
# @return [RelatonIetf::IetfBibliographicItem]
|
22
|
+
def self.from_hash(hash)
|
23
|
+
item_hash = ::RelatonIetf::HashConverter.hash_to_bib(hash)
|
24
|
+
new **item_hash
|
25
|
+
end
|
26
|
+
|
20
27
|
# @param opts [Hash]
|
21
28
|
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
22
29
|
# @option opts [Boolean] :bibdata
|
@@ -20,7 +20,11 @@ module RelatonIetf
|
|
20
20
|
def get(code, _year = nil, _opts = {})
|
21
21
|
warn "[relaton-ietf] (\"#{code}\") fetching..."
|
22
22
|
result = search code
|
23
|
-
|
23
|
+
if result
|
24
|
+
warn "[relaton-ietf] (\"#{code}\") found #{result.docidentifier.first.id}"
|
25
|
+
else
|
26
|
+
warn "[relaton-ietf] (\"#{code}\") not found"
|
27
|
+
end
|
24
28
|
result
|
25
29
|
end
|
26
30
|
end
|
@@ -27,8 +27,7 @@ module RelatonIetf
|
|
27
27
|
# @param hash [Hash]
|
28
28
|
# @return [RelatonIetf::IetfBibliographicItem]
|
29
29
|
def hash_to_bib(hash)
|
30
|
-
|
31
|
-
::RelatonIetf::IetfBibliographicItem.new item_hash
|
30
|
+
::RelatonIetf::IetfBibliographicItem.from_hash hash
|
32
31
|
end
|
33
32
|
|
34
33
|
# Returns hash of XML grammar
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "net/http"
|
4
|
-
require "nokogiri"
|
5
4
|
require "relaton_bib"
|
6
5
|
require "relaton_ietf/ietf_bibliographic_item"
|
7
6
|
|
@@ -17,16 +16,16 @@ module RelatonIetf
|
|
17
16
|
# @param text [String]
|
18
17
|
# @param is_relation [TrueClass, FalseClass]
|
19
18
|
# @return [RelatonIetf::IetfBibliographicItem]
|
20
|
-
def scrape_page(text, is_relation
|
19
|
+
def scrape_page(text, is_relation: false)
|
21
20
|
# Remove initial "IETF " string if specified
|
22
21
|
ref = text.gsub(/^IETF /, "")
|
23
|
-
/^(RFC|BCP|FYI|STD)\s(?<num>\d+)/ =~ ref
|
22
|
+
/^(?:RFC|BCP|FYI|STD)\s(?<num>\d+)/ =~ ref
|
24
23
|
ref.sub! /(?<=^(?:RFC|BCP|FYI|STD)\s)(\d+)/, num.rjust(4, "0") if num
|
25
24
|
rfc_item ref, is_relation
|
26
25
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
|
27
26
|
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
|
28
27
|
Net::ProtocolError, SocketError
|
29
|
-
raise RelatonBib::RequestError, "No document found for #{ref} reference
|
28
|
+
raise RelatonBib::RequestError, "No document found for #{ref} reference"
|
30
29
|
end
|
31
30
|
|
32
31
|
# @param reference [Nokogiri::XML::Element, nil]
|
@@ -34,7 +33,7 @@ module RelatonIetf
|
|
34
33
|
# @param url [String, NilClass]
|
35
34
|
# @param ver [String, NilClass] Internet Draft version
|
36
35
|
# @return [RelatonIetf::IetfBibliographicItem]
|
37
|
-
def fetch_rfc(reference, is_relation
|
36
|
+
def fetch_rfc(reference, is_relation: false, url: nil, ver: nil) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
38
37
|
return unless reference
|
39
38
|
|
40
39
|
ietf_item(
|
@@ -54,7 +53,7 @@ module RelatonIetf
|
|
54
53
|
series: series(reference),
|
55
54
|
place: ["Fremont, CA"],
|
56
55
|
keyword: reference.xpath("front/keyword").map(&:text),
|
57
|
-
doctype: doctype(reference[:anchor])
|
56
|
+
doctype: doctype(reference[:anchor]),
|
58
57
|
)
|
59
58
|
end
|
60
59
|
|
@@ -92,6 +91,7 @@ module RelatonIetf
|
|
92
91
|
end
|
93
92
|
|
94
93
|
# @param ref [String]
|
94
|
+
# @param is_relation [Boolen, nil]
|
95
95
|
# @return [RelatonIetf::IetfBibliographicItem]
|
96
96
|
def rfc_item(ref, is_relation)
|
97
97
|
/(?<=-)(?<ver>\d{2})$/ =~ ref
|
@@ -102,14 +102,15 @@ module RelatonIetf
|
|
102
102
|
|
103
103
|
uri = "#{GH_URL}#{ref.sub(/\s|\u00a0/, '.')}.xml"
|
104
104
|
doc = Nokogiri::XML get_page(uri)
|
105
|
-
|
105
|
+
r = doc.at("/referencegroup", "/reference")
|
106
|
+
fetch_rfc r, is_relation: is_relation, url: uri, ver: ver
|
106
107
|
end
|
107
108
|
|
108
109
|
# @param reference [Nokogiri::XML::Element]
|
109
110
|
# @return [Hash]
|
110
111
|
def relations(reference)
|
111
112
|
reference.xpath("reference").map do |ref|
|
112
|
-
{ type: "includes", bibitem: fetch_rfc(ref, true) }
|
113
|
+
{ type: "includes", bibitem: fetch_rfc(ref, is_relation: true) }
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
@@ -117,9 +118,10 @@ module RelatonIetf
|
|
117
118
|
# @return [String] HTTP response body
|
118
119
|
def get_page(uri)
|
119
120
|
res = Net::HTTP.get_response(URI(uri))
|
120
|
-
|
121
|
-
|
122
|
-
|
121
|
+
return unless res.code == "200"
|
122
|
+
|
123
|
+
# raise RelatonBib::RequestError, "No document found at #{uri}"
|
124
|
+
# end
|
123
125
|
|
124
126
|
res.body
|
125
127
|
end
|
@@ -144,7 +146,11 @@ module RelatonIetf
|
|
144
146
|
return if reference.at "./fornt/title"
|
145
147
|
|
146
148
|
cont = (reference[:anchor] || reference[:docName] || reference[:number])
|
147
|
-
|
149
|
+
if cont
|
150
|
+
RelatonBib::FormattedRef.new(
|
151
|
+
content: cont, language: language(reference), script: "Latn",
|
152
|
+
)
|
153
|
+
end
|
148
154
|
end
|
149
155
|
|
150
156
|
# @param reference [Nokogiri::XML::Element]
|
@@ -172,14 +178,15 @@ module RelatonIetf
|
|
172
178
|
entity = RelatonBib::Person.new(
|
173
179
|
name: full_name(author, reference),
|
174
180
|
affiliation: [affiliation(author)],
|
175
|
-
contact: contacts(author.at("./address"))
|
181
|
+
contact: contacts(author.at("./address")),
|
176
182
|
)
|
177
183
|
{ entity: entity, role: [contributor_role(author)] }
|
178
184
|
end
|
179
185
|
end
|
180
186
|
|
181
187
|
# @param reference [Nokogiri::XML::Element]
|
182
|
-
# @return [Array<Hash{Symbol=>RelatonBib::Organization,
|
188
|
+
# @return [Array<Hash{Symbol=>RelatonBib::Organization,
|
189
|
+
# Symbol=>Array<String>}>]
|
183
190
|
def organizations(reference)
|
184
191
|
publisher = { entity: new_org, role: [type: "publisher"] }
|
185
192
|
orgs = reference.xpath("./seriesinfo").reduce([publisher]) do |mem, si|
|
@@ -188,7 +195,7 @@ module RelatonIetf
|
|
188
195
|
mem << { entity: new_org(si[:stream], nil), role: [type: "author"] }
|
189
196
|
end
|
190
197
|
orgs + reference.xpath(
|
191
|
-
"front/author[not(@surname)][not(@fullname)]/organization"
|
198
|
+
"front/author[not(@surname)][not(@fullname)]/organization",
|
192
199
|
).map do |org|
|
193
200
|
{ entity: new_org(org.text, nil), role: [type: "author"] }
|
194
201
|
end
|
@@ -202,7 +209,7 @@ module RelatonIetf
|
|
202
209
|
RelatonBib::FullName.new(
|
203
210
|
completename: localized_string(author[:fullname], lang),
|
204
211
|
initial: [localized_string(author[:initials], lang)].compact,
|
205
|
-
surname: localized_string(author[:surname], lang)
|
212
|
+
surname: localized_string(author[:surname], lang),
|
206
213
|
)
|
207
214
|
end
|
208
215
|
|
@@ -237,7 +244,7 @@ module RelatonIetf
|
|
237
244
|
city: postal.at("./city")&.text,
|
238
245
|
postcode: postal.at("./code")&.text,
|
239
246
|
country: postal.at("./country")&.text,
|
240
|
-
state: postal.at("./region")&.text
|
247
|
+
state: postal.at("./region")&.text,
|
241
248
|
)
|
242
249
|
end
|
243
250
|
|
@@ -309,7 +316,7 @@ module RelatonIetf
|
|
309
316
|
ret = []
|
310
317
|
if id
|
311
318
|
ret << RelatonBib::DocumentIdentifier.new(
|
312
|
-
type: "IETF", id: id.sub(/^(RFC)/, "\\1 ")
|
319
|
+
type: "IETF", id: id.sub(/^(RFC)/, "\\1 "),
|
313
320
|
)
|
314
321
|
end
|
315
322
|
if (id = reference[:anchor])
|
@@ -336,10 +343,10 @@ module RelatonIetf
|
|
336
343
|
|
337
344
|
RelatonBib::Series.new(
|
338
345
|
title: RelatonBib::TypedTitleString.new(
|
339
|
-
content: si[:name], language: language(reference), script: "Latn"
|
346
|
+
content: si[:name], language: language(reference), script: "Latn",
|
340
347
|
),
|
341
348
|
number: si[:value],
|
342
|
-
type: "main"
|
349
|
+
type: "main",
|
343
350
|
)
|
344
351
|
end.compact
|
345
352
|
end
|
data/lib/relaton_ietf/version.rb
CHANGED
data/relaton_ietf.gemspec
CHANGED
@@ -27,18 +27,16 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.bindir = "exe"
|
28
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
29
|
spec.require_paths = ["lib"]
|
30
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
30
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
31
31
|
|
32
|
-
# spec.add_development_dependency "debase"
|
33
32
|
spec.add_development_dependency "equivalent-xml", "~> 0.6"
|
34
33
|
spec.add_development_dependency "pry-byebug"
|
35
|
-
spec.add_development_dependency "rake", "~>
|
34
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
36
35
|
spec.add_development_dependency "rspec", "~> 3.0"
|
37
|
-
# spec.add_development_dependency "ruby-debug-ide"
|
38
36
|
spec.add_development_dependency "ruby-jing"
|
39
37
|
spec.add_development_dependency "simplecov"
|
40
38
|
spec.add_development_dependency "vcr"
|
41
39
|
spec.add_development_dependency "webmock"
|
42
40
|
|
43
|
-
spec.add_dependency "relaton-bib", "~> 1.
|
41
|
+
spec.add_dependency "relaton-bib", "~> 1.9.0"
|
44
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaton-ietf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
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-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: equivalent-xml
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
131
|
+
version: 1.9.0
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.
|
138
|
+
version: 1.9.0
|
139
139
|
description: "RelatonIetf: retrieve IETF Standards for bibliographic use \nusing the
|
140
140
|
BibliographicItem model.\n\nFormerly known as rfcbib.\n"
|
141
141
|
email:
|
@@ -183,14 +183,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
183
183
|
requirements:
|
184
184
|
- - ">="
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version: 2.
|
186
|
+
version: 2.5.0
|
187
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
188
|
requirements:
|
189
189
|
- - ">="
|
190
190
|
- !ruby/object:Gem::Version
|
191
191
|
version: '0'
|
192
192
|
requirements: []
|
193
|
-
rubygems_version: 3.
|
193
|
+
rubygems_version: 3.2.3
|
194
194
|
signing_key:
|
195
195
|
specification_version: 4
|
196
196
|
summary: 'RelatonIetf: retrieve IETF Standards for bibliographic use using the BibliographicItem
|