relaton-ietf 1.10.3 → 1.10.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +1 -1
- data/lib/relaton_ietf/bibxml_parser.rb +1 -0
- data/lib/relaton_ietf/data_fetcher.rb +95 -7
- data/lib/relaton_ietf/rfc_entry.rb +11 -3
- data/lib/relaton_ietf/rfc_index_entry.rb +4 -4
- data/lib/relaton_ietf/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e52b5d3e6287636c00d9a09d115773d39156bf81f59d9db8d5168a8b4476f44b
|
4
|
+
data.tar.gz: fce58a6de2d758419f999861353b1dad1e19deb03ee52f30e901a4563a6e0750
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7ce9a5b44b815388c76c231038759227937b50e4d352f5e8d1a218fdef73419c6740e7714e810d76c8dbab778c9b8d0003681e05f7ef7195e6f80cbfd58f634
|
7
|
+
data.tar.gz: 57d38a23804da9618620725efd21a232b3992a3e3a3f0d067eec9e1f4d29a5eb248c9e1cf3ad8cdbb37d6af62bf4c2d1c61afc99ec45b062ce8d9c56b12f0225
|
data/README.adoc
CHANGED
@@ -135,7 +135,7 @@ RelatonIetf::IetfBibliographicItem.from_hash hash
|
|
135
135
|
|
136
136
|
=== Fetch data
|
137
137
|
|
138
|
-
There
|
138
|
+
There are IETF datasets what can be converted into RelatonXML/BibXML/BibYAML formats:
|
139
139
|
|
140
140
|
- `ietf-rfcsubseries` - https://www.rfc-editor.org/rfc-index.xml (`<bcp-entry>`, `<fyi-entry>`, `<std-entry>`)
|
141
141
|
- `ietf-internet-drafts` - converts files from local directory `./bibxml-ids`. Use `rsync -avcizxL rsync.ietf.org::bibxml-ids ./bibxml-ids` command to fetch the files.
|
@@ -64,11 +64,93 @@ module RelatonIetf
|
|
64
64
|
# Fetches ietf-internet-drafts documents
|
65
65
|
#
|
66
66
|
def fetch_ieft_internet_drafts # rubocop:disable Metrics/MethodLength
|
67
|
-
Dir["bibxml-ids/*.xml"].
|
68
|
-
|
67
|
+
versions = Dir["bibxml-ids/*.xml"].each_with_object([]) do |path, vers|
|
68
|
+
file = File.basename path, ".xml"
|
69
|
+
if file.include?("D.draft-")
|
70
|
+
vers << file.sub(/^reference\.I-D\./, "")
|
71
|
+
end
|
72
|
+
save_doc BibXMLParser.parse(File.read(path, encoding: "UTF-8"))
|
69
73
|
end
|
74
|
+
update_versions(versions) if versions.any? && @format != "bibxml"
|
70
75
|
end
|
71
76
|
|
77
|
+
#
|
78
|
+
# Updates I-D's versions
|
79
|
+
#
|
80
|
+
# @param [Array<String>] versions list of versions
|
81
|
+
#
|
82
|
+
def update_versions(versions) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
83
|
+
series = ""
|
84
|
+
bib_versions = []
|
85
|
+
Dir["#{@output}/*.#{@ext}"].each do |file|
|
86
|
+
match = /(?<series>draft-.+)-(?<ver>\d{2})\.#{@ext}$/.match file
|
87
|
+
if match
|
88
|
+
if series != match[:series]
|
89
|
+
bib_versions = versions.select { |ref| ref.include? match[:series] }
|
90
|
+
create_series match[:series], bib_versions
|
91
|
+
end
|
92
|
+
lv = bib_versions.select { |ref| ref.match(/\d+$/).to_s.to_i < match[:ver].to_i }
|
93
|
+
hv = bib_versions.select { |ref| ref.match(/\d+$/).to_s.to_i > match[:ver].to_i }
|
94
|
+
if lv.any? || hv.any?
|
95
|
+
bib = read_doc(file)
|
96
|
+
bib.relation << version_relation(lv.last, "updates") if lv.any?
|
97
|
+
bib.relation << version_relation(hv.first, "updatedBy") if hv.any?
|
98
|
+
save_doc bib, check_duplicate: false
|
99
|
+
end
|
100
|
+
series = match[:series]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Create unversioned bibliographic item
|
107
|
+
#
|
108
|
+
# @param [String] ref reference
|
109
|
+
# @param [Array<String>] versions list of versions
|
110
|
+
#
|
111
|
+
def create_series(ref, versions)
|
112
|
+
return if versions.size < 2
|
113
|
+
|
114
|
+
fref = RelatonBib::FormattedRef.new content: ref
|
115
|
+
rel = versions.map do |v|
|
116
|
+
version_relation v, "includes"
|
117
|
+
end
|
118
|
+
save_doc IetfBibliographicItem.new(formattedref: fref, relation: rel)
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# Create bibitem relation
|
123
|
+
#
|
124
|
+
# @param [String] ref reference
|
125
|
+
# @param [String] type relation type
|
126
|
+
#
|
127
|
+
# @return [RelatonBib::DocumentRelation] relation
|
128
|
+
#
|
129
|
+
def version_relation(ref, type)
|
130
|
+
fref = RelatonBib::FormattedRef.new content: ref
|
131
|
+
bibitem = IetfBibliographicItem.new formattedref: fref
|
132
|
+
RelatonBib::DocumentRelation.new(type: type, bibitem: bibitem)
|
133
|
+
end
|
134
|
+
|
135
|
+
#
|
136
|
+
# Redad saved documents
|
137
|
+
#
|
138
|
+
# @param [String] file path to file
|
139
|
+
#
|
140
|
+
# @return [RelatonIetf::IetfBibliographicItem] bibliographic item
|
141
|
+
#
|
142
|
+
def read_doc(file)
|
143
|
+
doc = File.read(file, encoding: "UTF-8")
|
144
|
+
case @format
|
145
|
+
when "xml" then XMLParser.from_xml(doc)
|
146
|
+
when "yaml" then IetfBibliographicItem.from_hash YAML.safe_load(doc)
|
147
|
+
else BibXMLParser.parse(doc)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# Fetches ietf-rfc-entries documents
|
153
|
+
#
|
72
154
|
def fetch_ieft_rfcs
|
73
155
|
rfc_index.xpath("xmlns:rfc-entry").each do |doc|
|
74
156
|
save_doc RfcEntry.parse(doc)
|
@@ -78,6 +160,11 @@ module RelatonIetf
|
|
78
160
|
end
|
79
161
|
end
|
80
162
|
|
163
|
+
#
|
164
|
+
# Get RFC index
|
165
|
+
#
|
166
|
+
# @return [Nokogiri::XML::Document] RFC index
|
167
|
+
#
|
81
168
|
def rfc_index
|
82
169
|
uri = URI "https://www.rfc-editor.org/rfc-index.xml"
|
83
170
|
Nokogiri::XML(Net::HTTP.get(uri)).at("/xmlns:rfc-index")
|
@@ -87,8 +174,9 @@ module RelatonIetf
|
|
87
174
|
# Save document to file
|
88
175
|
#
|
89
176
|
# @param [RelatonIetf::RfcIndexEntry, nil] rfc index entry
|
177
|
+
# @param [Boolean] check_duplicate check for duplicate
|
90
178
|
#
|
91
|
-
def save_doc(entry) # rubocop:disable Metrics/MethodLength
|
179
|
+
def save_doc(entry, check_duplicate: true) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
92
180
|
return unless entry
|
93
181
|
|
94
182
|
c = case @format
|
@@ -97,9 +185,9 @@ module RelatonIetf
|
|
97
185
|
else entry.send("to_#{@format}")
|
98
186
|
end
|
99
187
|
file = file_name entry
|
100
|
-
if @files.include?
|
188
|
+
if check_duplicate && @files.include?(file)
|
101
189
|
warn "File #{file} already exists. Document: #{entry.docnumber}"
|
102
|
-
|
190
|
+
elsif check_duplicate
|
103
191
|
@files << file
|
104
192
|
end
|
105
193
|
File.write file, c, encoding: "UTF-8"
|
@@ -112,11 +200,11 @@ module RelatonIetf
|
|
112
200
|
#
|
113
201
|
# @return [String] file name
|
114
202
|
#
|
115
|
-
def file_name(entry)
|
203
|
+
def file_name(entry) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
116
204
|
id = if entry.respond_to? :docidentifier
|
117
205
|
entry.docidentifier.detect { |i| i.type == "Internet-Draft" }&.id
|
118
206
|
end
|
119
|
-
id ||= entry.docnumber
|
207
|
+
id ||= entry.docnumber || entry.formattedref.content
|
120
208
|
if @source == "ietf-internet-drafts" then id.downcase!
|
121
209
|
else id.upcase!
|
122
210
|
end
|
@@ -68,7 +68,7 @@ module RelatonIetf
|
|
68
68
|
def parse_docid
|
69
69
|
ids = [
|
70
70
|
RelatonBib::DocumentIdentifier.new(id: pub_id, type: "IETF", primary: true),
|
71
|
-
RelatonBib::DocumentIdentifier.new(id:
|
71
|
+
RelatonBib::DocumentIdentifier.new(id: anchor, type: "IETF", scope: "anchor"),
|
72
72
|
]
|
73
73
|
doi = @doc.at("./xmlns:doi").text
|
74
74
|
ids << RelatonBib::DocumentIdentifier.new(id: doi, type: "DOI")
|
@@ -112,14 +112,22 @@ module RelatonIetf
|
|
112
112
|
@doc.at("./xmlns:doc-id").text
|
113
113
|
end
|
114
114
|
|
115
|
+
#
|
116
|
+
# Create acnhor
|
117
|
+
#
|
118
|
+
# @return [String] anchor
|
119
|
+
#
|
120
|
+
def anchor
|
121
|
+
"RFC#{docnum}"
|
122
|
+
end
|
123
|
+
|
115
124
|
#
|
116
125
|
# Create link
|
117
126
|
#
|
118
127
|
# @return [Array<RelatonBib::TypedUri>]
|
119
128
|
#
|
120
129
|
def parse_link
|
121
|
-
|
122
|
-
url = "https://www.rfc-editor.org/info/rfc#{num}"
|
130
|
+
url = "https://www.rfc-editor.org/info/rfc#{docnum}"
|
123
131
|
[RelatonBib::TypedUri.new(content: url, type: "src")]
|
124
132
|
end
|
125
133
|
|
@@ -19,7 +19,7 @@ module RelatonIetf
|
|
19
19
|
#
|
20
20
|
# @param [Nokogiri::XML::Element] doc document
|
21
21
|
#
|
22
|
-
# @return [RelatonIetf
|
22
|
+
# @return [RelatonIetf::IetfBibliographicItem, nil]
|
23
23
|
#
|
24
24
|
def self.parse(doc)
|
25
25
|
doc_id = doc.at("./xmlns:doc-id")
|
@@ -55,7 +55,7 @@ module RelatonIetf
|
|
55
55
|
def parse_docid
|
56
56
|
[
|
57
57
|
RelatonBib::DocumentIdentifier.new(type: "IETF", id: pub_id, primary: true),
|
58
|
-
RelatonBib::DocumentIdentifier.new(type: "IETF", scope: "anchor", id:
|
58
|
+
RelatonBib::DocumentIdentifier.new(type: "IETF", scope: "anchor", id: anchor),
|
59
59
|
]
|
60
60
|
end
|
61
61
|
|
@@ -78,9 +78,9 @@ module RelatonIetf
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def parse_relation
|
81
|
-
@is_also.
|
81
|
+
@is_also.each_with_object([]) do |ref, a|
|
82
82
|
bib = IetfBibliography.get ref.sub(/^(RFC)(\d+)/, '\1 \2')
|
83
|
-
{ type: "includes", bibitem: bib }
|
83
|
+
a << { type: "includes", bibitem: bib } if bib
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
data/lib/relaton_ietf/version.rb
CHANGED
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.10.
|
4
|
+
version: 1.10.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: equivalent-xml
|