relaton-ietf 1.10.3 → 1.10.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 39327270eb3e1efbd565881ac04a81623a6a1b9b0c03bfe5bec0403c47c6ffc6
4
- data.tar.gz: 93d3e101fd02e503d7e3ba64b5c3e6e15c63071c769b4242094611bc40ed1685
3
+ metadata.gz: e52b5d3e6287636c00d9a09d115773d39156bf81f59d9db8d5168a8b4476f44b
4
+ data.tar.gz: fce58a6de2d758419f999861353b1dad1e19deb03ee52f30e901a4563a6e0750
5
5
  SHA512:
6
- metadata.gz: 05ab0ccbc44d9c51ca1565e74dcaacfba1977d1bea2b28684132a249959c427ae83a81c9fde16b87418c82c16dfe5433959e8bce2ec01cf821eb1ae069de7c4a
7
- data.tar.gz: 5d3ffb6cb20c518447106b78df29e1db9489ad291e31ba1542162e69e6f283809490805a28cc9bf382cfced8d845594dcc1174851be1b8d165c07016d8db4022
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 is a IETF datasets what can be converted into RelatonXML/BibXML/BibYAML formats:
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.
@@ -24,6 +24,7 @@ module RelatonIetf
24
24
  type = super
25
25
  case type
26
26
  when "BCP", "FYI", "STD", "RFC" then "RFC"
27
+ when "Internet-Draft" then type
27
28
  else "IETF"
28
29
  end
29
30
  end
@@ -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"].each do |file|
68
- save_doc BibXMLParser.parse(File.read(file, encoding: "UTF-8"))
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? file
188
+ if check_duplicate && @files.include?(file)
101
189
  warn "File #{file} already exists. Document: #{entry.docnumber}"
102
- else
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: code, type: "IETF", scope: "anchor"),
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
- num = code[-4..-1].sub(/^0+/, "")
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:IetfBibliographicItem, nil]
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: @doc_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.map do |ref|
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
@@ -1,3 +1,3 @@
1
1
  module RelatonIetf
2
- VERSION = "1.10.3".freeze
2
+ VERSION = "1.10.6".freeze
3
3
  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.10.3
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-02-18 00:00:00.000000000 Z
11
+ date: 2022-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: equivalent-xml