relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.1

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.
Files changed (610) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +109 -38
  3. data/lib/relaton/3gpp/bibdata.rb +9 -0
  4. data/lib/relaton/3gpp/bibitem.rb +9 -0
  5. data/lib/relaton/3gpp/bibliography.rb +48 -0
  6. data/lib/relaton/3gpp/data_fetcher.rb +255 -0
  7. data/lib/relaton/3gpp/doctype.rb +9 -0
  8. data/lib/relaton/3gpp/ext.rb +31 -0
  9. data/lib/relaton/3gpp/item.rb +12 -0
  10. data/lib/relaton/3gpp/item_data.rb +15 -0
  11. data/lib/relaton/3gpp/parser.rb +400 -0
  12. data/lib/relaton/3gpp/processor.rb +68 -0
  13. data/lib/relaton/3gpp/release.rb +34 -0
  14. data/lib/relaton/3gpp/util.rb +8 -0
  15. data/lib/relaton/3gpp.rb +25 -0
  16. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  17. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  18. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  19. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  20. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  21. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  22. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  23. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  24. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  25. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  26. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  27. data/lib/relaton/bib/item_data.rb +229 -0
  28. data/lib/relaton/bib/model/abstract.rb +16 -0
  29. data/lib/relaton/bib/model/address.rb +22 -0
  30. data/lib/relaton/bib/model/affiliation.rb +16 -0
  31. data/lib/relaton/bib/model/bibdata.rb +11 -0
  32. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  33. data/lib/relaton/bib/model/bibitem.rb +11 -0
  34. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  35. data/lib/relaton/bib/model/contact.rb +18 -0
  36. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  37. data/lib/relaton/bib/model/contributor.rb +29 -0
  38. data/lib/relaton/bib/model/copyright.rb +27 -0
  39. data/lib/relaton/bib/model/date.rb +31 -0
  40. data/lib/relaton/bib/model/depiction.rb +16 -0
  41. data/lib/relaton/bib/model/docidentifier.rb +34 -0
  42. data/lib/relaton/bib/model/doctype.rb +14 -0
  43. data/lib/relaton/bib/model/edition.rb +14 -0
  44. data/lib/relaton/bib/model/ext.rb +39 -0
  45. data/lib/relaton/bib/model/extent.rb +16 -0
  46. data/lib/relaton/bib/model/formattedref.rb +43 -0
  47. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  48. data/lib/relaton/bib/model/fullname.rb +11 -0
  49. data/lib/relaton/bib/model/ics.rb +49 -0
  50. data/lib/relaton/bib/model/image.rb +28 -0
  51. data/lib/relaton/bib/model/item.rb +96 -0
  52. data/lib/relaton/bib/model/item_base.rb +20 -0
  53. data/lib/relaton/bib/model/item_shared.rb +88 -0
  54. data/lib/relaton/bib/model/keyword.rb +30 -0
  55. data/lib/relaton/bib/model/locality.rb +18 -0
  56. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  57. data/lib/relaton/bib/model/localized_string.rb +48 -0
  58. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  59. data/lib/relaton/bib/model/logo.rb +14 -0
  60. data/lib/relaton/bib/model/medium.rb +22 -0
  61. data/lib/relaton/bib/model/note.rb +16 -0
  62. data/lib/relaton/bib/model/organization.rb +13 -0
  63. data/lib/relaton/bib/model/organization_type.rb +42 -0
  64. data/lib/relaton/bib/model/person.rb +36 -0
  65. data/lib/relaton/bib/model/phone.rb +14 -0
  66. data/lib/relaton/bib/model/place.rb +33 -0
  67. data/lib/relaton/bib/model/price.rb +14 -0
  68. data/lib/relaton/bib/model/relation.rb +43 -0
  69. data/lib/relaton/bib/model/series.rb +34 -0
  70. data/lib/relaton/bib/model/size.rb +23 -0
  71. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  72. data/lib/relaton/bib/model/status.rb +27 -0
  73. data/lib/relaton/bib/model/structured_identifier.rb +48 -0
  74. data/lib/relaton/bib/model/subdivision.rb +16 -0
  75. data/lib/relaton/bib/model/title.rb +56 -0
  76. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  77. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  78. data/lib/relaton/bib/model/uri.rb +18 -0
  79. data/lib/relaton/bib/model/validity.rb +16 -0
  80. data/lib/relaton/bib/model/version.rb +43 -0
  81. data/lib/relaton/bib/namespace_helper.rb +21 -0
  82. data/lib/relaton/bib/sanitizer.rb +68 -0
  83. data/lib/relaton/bib/util.rb +18 -0
  84. data/lib/relaton/bib/versions.json +35 -0
  85. data/lib/relaton/bib.rb +48 -0
  86. data/lib/relaton/bipm/bibliography.rb +82 -0
  87. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  88. data/lib/relaton/bipm/data_fetcher.rb +57 -0
  89. data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
  90. data/lib/relaton/bipm/id_parser.rb +277 -0
  91. data/lib/relaton/bipm/item_data.rb +47 -0
  92. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  93. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  94. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  95. data/lib/relaton/bipm/model/doctype.rb +12 -0
  96. data/lib/relaton/bipm/model/ext.rb +38 -0
  97. data/lib/relaton/bipm/model/item.rb +11 -0
  98. data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
  99. data/lib/relaton/bipm/processor.rb +69 -0
  100. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  101. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
  102. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  103. data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
  104. data/lib/relaton/bipm/util.rb +8 -0
  105. data/lib/relaton/bipm.rb +32 -0
  106. data/lib/relaton/bsi/bibliography.rb +124 -0
  107. data/lib/relaton/bsi/hit.rb +14 -0
  108. data/lib/relaton/bsi/hit_collection.rb +114 -0
  109. data/lib/relaton/bsi/item_data.rb +13 -0
  110. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  111. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  112. data/lib/relaton/bsi/model/docidentifier.rb +9 -0
  113. data/lib/relaton/bsi/model/doctype.rb +14 -0
  114. data/lib/relaton/bsi/model/ext.rb +17 -0
  115. data/lib/relaton/bsi/model/item.rb +17 -0
  116. data/lib/relaton/bsi/model/item_base.rb +22 -0
  117. data/lib/relaton/bsi/model/relation.rb +9 -0
  118. data/lib/relaton/bsi/processor.rb +42 -0
  119. data/lib/relaton/bsi/schema.json +24882 -0
  120. data/lib/relaton/bsi/scraper.rb +288 -0
  121. data/lib/relaton/bsi/util.rb +8 -0
  122. data/lib/relaton/bsi.rb +25 -0
  123. data/lib/relaton/calconnect/bibliography.rb +95 -0
  124. data/lib/relaton/calconnect/data_fetcher.rb +106 -0
  125. data/lib/relaton/calconnect/hit.rb +14 -0
  126. data/lib/relaton/calconnect/hit_collection.rb +84 -0
  127. data/lib/relaton/calconnect/item_data.rb +12 -0
  128. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  129. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  130. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  131. data/lib/relaton/calconnect/model/ext.rb +11 -0
  132. data/lib/relaton/calconnect/model/item.rb +13 -0
  133. data/lib/relaton/calconnect/processor.rb +66 -0
  134. data/lib/relaton/calconnect/scraper.rb +87 -0
  135. data/lib/relaton/calconnect/util.rb +8 -0
  136. data/lib/relaton/calconnect.rb +26 -0
  137. data/lib/relaton/ccsds/bibliography.rb +63 -0
  138. data/lib/relaton/ccsds/data/fetcher.rb +247 -0
  139. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  140. data/lib/relaton/ccsds/data/parser.rb +194 -0
  141. data/lib/relaton/ccsds/hit.rb +24 -0
  142. data/lib/relaton/ccsds/hit_collection.rb +42 -0
  143. data/lib/relaton/ccsds/item_data.rb +9 -0
  144. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  145. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  146. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  147. data/lib/relaton/ccsds/model/ext.rb +19 -0
  148. data/lib/relaton/ccsds/model/item.rb +13 -0
  149. data/lib/relaton/ccsds/processor.rb +68 -0
  150. data/lib/relaton/ccsds/util.rb +10 -0
  151. data/lib/relaton/ccsds.rb +33 -0
  152. data/lib/relaton/cen/bibliography.rb +121 -0
  153. data/lib/relaton/cen/committees.yaml +66 -0
  154. data/lib/relaton/cen/hit.rb +16 -0
  155. data/lib/relaton/cen/hit_collection.rb +68 -0
  156. data/lib/relaton/cen/item_data.rb +7 -0
  157. data/lib/relaton/cen/model/bibdata.rb +8 -0
  158. data/lib/relaton/cen/model/bibitem.rb +8 -0
  159. data/lib/relaton/cen/model/docidentifier.rb +9 -0
  160. data/lib/relaton/cen/model/ext.rb +11 -0
  161. data/lib/relaton/cen/model/item.rb +14 -0
  162. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  163. data/lib/relaton/cen/processor.rb +40 -0
  164. data/lib/relaton/cen/scraper.rb +210 -0
  165. data/lib/relaton/cen/util.rb +8 -0
  166. data/lib/relaton/cen.rb +29 -0
  167. data/lib/relaton/cie/bibdata.rb +8 -0
  168. data/lib/relaton/cie/bibitem.rb +8 -0
  169. data/lib/relaton/cie/bibliography.rb +31 -0
  170. data/lib/relaton/cie/data_fetcher.rb +355 -0
  171. data/lib/relaton/cie/ext.rb +7 -0
  172. data/lib/relaton/cie/item.rb +11 -0
  173. data/lib/relaton/cie/item_data.rb +6 -0
  174. data/lib/relaton/cie/processor.rb +66 -0
  175. data/lib/relaton/cie/scrapper.rb +39 -0
  176. data/lib/relaton/cie/util.rb +8 -0
  177. data/lib/relaton/cie.rb +28 -0
  178. data/lib/relaton/core/array_wrapper.rb +20 -0
  179. data/lib/relaton/core/data_fetcher.rb +97 -0
  180. data/lib/relaton/core/date_parser.rb +42 -0
  181. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  182. data/lib/relaton/core/hit.rb +49 -0
  183. data/lib/relaton/core/hit_collection.rb +118 -0
  184. data/lib/relaton/core/processor.rb +48 -0
  185. data/lib/relaton/core/workers_pool.rb +45 -0
  186. data/lib/relaton/core.rb +9 -0
  187. data/lib/relaton/db/registry.rb +4 -4
  188. data/lib/relaton/db.rb +0 -1
  189. data/lib/relaton/doi/crossref.rb +72 -0
  190. data/lib/relaton/doi/parser.rb +827 -0
  191. data/lib/relaton/doi/processor.rb +65 -0
  192. data/lib/relaton/doi/util.rb +8 -0
  193. data/lib/relaton/doi.rb +20 -0
  194. data/lib/relaton/ecma/bibdata.rb +8 -0
  195. data/lib/relaton/ecma/bibitem.rb +8 -0
  196. data/lib/relaton/ecma/bibliography.rb +81 -0
  197. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  198. data/lib/relaton/ecma/data_parser.rb +49 -0
  199. data/lib/relaton/ecma/edition_parser.rb +80 -0
  200. data/lib/relaton/ecma/ext.rb +7 -0
  201. data/lib/relaton/ecma/item.rb +11 -0
  202. data/lib/relaton/ecma/item_data.rb +6 -0
  203. data/lib/relaton/ecma/memento_parser.rb +60 -0
  204. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  205. data/lib/relaton/ecma/parser_common.rb +33 -0
  206. data/lib/relaton/ecma/processor.rb +66 -0
  207. data/lib/relaton/ecma/standard_parser.rb +134 -0
  208. data/lib/relaton/ecma/util.rb +8 -0
  209. data/lib/relaton/ecma.rb +24 -0
  210. data/lib/relaton/etsi/bibdata.rb +10 -0
  211. data/lib/relaton/etsi/bibitem.rb +10 -0
  212. data/lib/relaton/etsi/bibliography.rb +46 -0
  213. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  214. data/lib/relaton/etsi/data_parser.rb +208 -0
  215. data/lib/relaton/etsi/doctype.rb +30 -0
  216. data/lib/relaton/etsi/ext.rb +31 -0
  217. data/lib/relaton/etsi/item.rb +15 -0
  218. data/lib/relaton/etsi/item_data.rb +6 -0
  219. data/lib/relaton/etsi/processor.rb +69 -0
  220. data/lib/relaton/etsi/pubid.rb +37 -0
  221. data/lib/relaton/etsi/status.rb +13 -0
  222. data/lib/relaton/etsi/util.rb +8 -0
  223. data/lib/relaton/etsi.rb +25 -0
  224. data/lib/relaton/gb/bibdata.rb +8 -0
  225. data/lib/relaton/gb/bibitem.rb +8 -0
  226. data/lib/relaton/gb/bibliography.rb +145 -0
  227. data/lib/relaton/gb/ccs.rb +14 -0
  228. data/lib/relaton/gb/committee.rb +13 -0
  229. data/lib/relaton/gb/docidentifier.rb +23 -0
  230. data/lib/relaton/gb/doctype.rb +9 -0
  231. data/lib/relaton/gb/ext.rb +36 -0
  232. data/lib/relaton/gb/gb_scraper.rb +61 -0
  233. data/lib/relaton/gb/gb_type.rb +20 -0
  234. data/lib/relaton/gb/hit.rb +48 -0
  235. data/lib/relaton/gb/hit_collection.rb +19 -0
  236. data/lib/relaton/gb/item.rb +13 -0
  237. data/lib/relaton/gb/item_data.rb +6 -0
  238. data/lib/relaton/gb/processor.rb +46 -0
  239. data/lib/relaton/gb/project_number.rb +38 -0
  240. data/lib/relaton/gb/scraper.rb +204 -0
  241. data/lib/relaton/gb/sec_scraper.rb +92 -0
  242. data/lib/relaton/gb/stage_name.rb +13 -0
  243. data/lib/relaton/gb/structured_identifier.rb +26 -0
  244. data/lib/relaton/gb/t_scraper.rb +126 -0
  245. data/lib/relaton/gb/util.rb +8 -0
  246. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  247. data/lib/relaton/gb.rb +33 -0
  248. data/lib/relaton/iana/bibdata.rb +8 -0
  249. data/lib/relaton/iana/bibitem.rb +8 -0
  250. data/lib/relaton/iana/bibliography.rb +47 -0
  251. data/lib/relaton/iana/data_fetcher.rb +71 -0
  252. data/lib/relaton/iana/item.rb +7 -0
  253. data/lib/relaton/iana/item_data.rb +6 -0
  254. data/lib/relaton/iana/parser.rb +146 -0
  255. data/lib/relaton/iana/processor.rb +68 -0
  256. data/lib/relaton/iana/util.rb +8 -0
  257. data/lib/relaton/iana.rb +29 -0
  258. data/lib/relaton/iec/bibliography.rb +283 -0
  259. data/lib/relaton/iec/data_fetcher.rb +216 -0
  260. data/lib/relaton/iec/data_parser.rb +391 -0
  261. data/lib/relaton/iec/hit.rb +26 -0
  262. data/lib/relaton/iec/hit_collection.rb +138 -0
  263. data/lib/relaton/iec/item_data.rb +7 -0
  264. data/lib/relaton/iec/model/bibdata.rb +8 -0
  265. data/lib/relaton/iec/model/bibitem.rb +8 -0
  266. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  267. data/lib/relaton/iec/model/doctype.rb +12 -0
  268. data/lib/relaton/iec/model/ext.rb +53 -0
  269. data/lib/relaton/iec/model/item.rb +20 -0
  270. data/lib/relaton/iec/model/item_base.rb +12 -0
  271. data/lib/relaton/iec/model/relation.rb +7 -0
  272. data/lib/relaton/iec/model/stage_name.rb +13 -0
  273. data/lib/relaton/iec/processor.rb +73 -0
  274. data/lib/relaton/iec/statuses.yml +199 -0
  275. data/lib/relaton/iec/util.rb +8 -0
  276. data/lib/relaton/iec.rb +98 -0
  277. data/lib/relaton/ieee/balloting_group.rb +13 -0
  278. data/lib/relaton/ieee/bibdata.rb +8 -0
  279. data/lib/relaton/ieee/bibitem.rb +8 -0
  280. data/lib/relaton/ieee/bibliography.rb +51 -0
  281. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  282. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  283. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  284. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  285. data/lib/relaton/ieee/doctype.rb +9 -0
  286. data/lib/relaton/ieee/editorial_group.rb +19 -0
  287. data/lib/relaton/ieee/ext.rb +36 -0
  288. data/lib/relaton/ieee/idams_parser.rb +323 -0
  289. data/lib/relaton/ieee/item.rb +11 -0
  290. data/lib/relaton/ieee/item_data.rb +7 -0
  291. data/lib/relaton/ieee/processor.rb +68 -0
  292. data/lib/relaton/ieee/pub_id.rb +161 -0
  293. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  294. data/lib/relaton/ieee/util.rb +8 -0
  295. data/lib/relaton/ieee.rb +29 -0
  296. data/lib/relaton/ietf/bibdata.rb +8 -0
  297. data/lib/relaton/ietf/bibitem.rb +8 -0
  298. data/lib/relaton/ietf/bibliography.rb +35 -0
  299. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  300. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  301. data/lib/relaton/ietf/doctype.rb +9 -0
  302. data/lib/relaton/ietf/ext.rb +63 -0
  303. data/lib/relaton/ietf/item.rb +16 -0
  304. data/lib/relaton/ietf/item_base.rb +18 -0
  305. data/lib/relaton/ietf/item_data.rb +6 -0
  306. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  307. data/lib/relaton/ietf/processor.rb +68 -0
  308. data/lib/relaton/ietf/relation.rb +9 -0
  309. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  310. data/lib/relaton/ietf/rfc/author.rb +21 -0
  311. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  312. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  313. data/lib/relaton/ietf/rfc/format.rb +19 -0
  314. data/lib/relaton/ietf/rfc/index.rb +46 -0
  315. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  316. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  317. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  318. data/lib/relaton/ietf/scraper.rb +68 -0
  319. data/lib/relaton/ietf/util.rb +8 -0
  320. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  321. data/lib/relaton/ietf.rb +27 -0
  322. data/lib/relaton/iho/bibdata.rb +8 -0
  323. data/lib/relaton/iho/bibitem.rb +8 -0
  324. data/lib/relaton/iho/bibliography.rb +114 -0
  325. data/lib/relaton/iho/comment_period.rb +13 -0
  326. data/lib/relaton/iho/docidentifier.rb +31 -0
  327. data/lib/relaton/iho/doctype.rb +10 -0
  328. data/lib/relaton/iho/ext.rb +20 -0
  329. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  330. data/lib/relaton/iho/item.rb +20 -0
  331. data/lib/relaton/iho/item_base.rb +18 -0
  332. data/lib/relaton/iho/item_data.rb +6 -0
  333. data/lib/relaton/iho/processor.rb +54 -0
  334. data/lib/relaton/iho/relation.rb +9 -0
  335. data/lib/relaton/iho/structured_identifier.rb +20 -0
  336. data/lib/relaton/iho/util.rb +8 -0
  337. data/lib/relaton/iho.rb +27 -0
  338. data/lib/relaton/index/config.rb +52 -0
  339. data/lib/relaton/index/file_io.rb +305 -0
  340. data/lib/relaton/index/file_storage.rb +61 -0
  341. data/lib/relaton/index/id_number.rb +30 -0
  342. data/lib/relaton/index/pool.rb +41 -0
  343. data/lib/relaton/index/type.rb +159 -0
  344. data/lib/relaton/index/util.rb +18 -0
  345. data/lib/relaton/index.rb +60 -0
  346. data/lib/relaton/isbn/isbn.rb +61 -0
  347. data/lib/relaton/isbn/open_library.rb +43 -0
  348. data/lib/relaton/isbn/parser.rb +88 -0
  349. data/lib/relaton/isbn/processor.rb +48 -0
  350. data/lib/relaton/isbn/util.rb +8 -0
  351. data/lib/relaton/isbn.rb +19 -0
  352. data/lib/relaton/iso/bibliography.rb +407 -0
  353. data/lib/relaton/iso/data_fetcher.rb +338 -0
  354. data/lib/relaton/iso/data_parser.rb +444 -0
  355. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  356. data/lib/relaton/iso/hit.rb +57 -0
  357. data/lib/relaton/iso/hit_collection.rb +184 -0
  358. data/lib/relaton/iso/item_data.rb +28 -0
  359. data/lib/relaton/iso/model/bibdata.rb +10 -0
  360. data/lib/relaton/iso/model/bibitem.rb +8 -0
  361. data/lib/relaton/iso/model/contributor.rb +6 -0
  362. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  363. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  364. data/lib/relaton/iso/model/doctype.rb +13 -0
  365. data/lib/relaton/iso/model/ext.rb +35 -0
  366. data/lib/relaton/iso/model/item.rb +17 -0
  367. data/lib/relaton/iso/model/item_base.rb +22 -0
  368. data/lib/relaton/iso/model/organization.rb +9 -0
  369. data/lib/relaton/iso/model/project_number.rb +22 -0
  370. data/lib/relaton/iso/model/relation.rb +9 -0
  371. data/lib/relaton/iso/model/stagename.rb +14 -0
  372. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  373. data/lib/relaton/iso/processor.rb +84 -0
  374. data/lib/relaton/iso/scraper.rb +619 -0
  375. data/lib/relaton/iso/type/pubid.rb +50 -0
  376. data/lib/relaton/iso/util.rb +8 -0
  377. data/lib/relaton/iso.rb +30 -0
  378. data/lib/relaton/itu/bibliography.rb +90 -0
  379. data/lib/relaton/itu/data_fetcher.rb +104 -0
  380. data/lib/relaton/itu/data_parser_r.rb +140 -0
  381. data/lib/relaton/itu/hit.rb +22 -0
  382. data/lib/relaton/itu/hit_collection.rb +127 -0
  383. data/lib/relaton/itu/item_data.rb +6 -0
  384. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  385. data/lib/relaton/itu/model/bibdata.rb +8 -0
  386. data/lib/relaton/itu/model/bibitem.rb +8 -0
  387. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  388. data/lib/relaton/itu/model/doctype.rb +13 -0
  389. data/lib/relaton/itu/model/ext.rb +47 -0
  390. data/lib/relaton/itu/model/item.rb +13 -0
  391. data/lib/relaton/itu/model/meeting.rb +13 -0
  392. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  393. data/lib/relaton/itu/model/question.rb +13 -0
  394. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  395. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  396. data/lib/relaton/itu/processor.rb +66 -0
  397. data/lib/relaton/itu/pubid.rb +177 -0
  398. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  399. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  400. data/lib/relaton/itu/scraper.rb +193 -0
  401. data/lib/relaton/itu/util.rb +8 -0
  402. data/lib/relaton/itu.rb +33 -0
  403. data/lib/relaton/jis/bibdata.rb +8 -0
  404. data/lib/relaton/jis/bibitem.rb +8 -0
  405. data/lib/relaton/jis/bibliography.rb +75 -0
  406. data/lib/relaton/jis/data_fetcher.rb +181 -0
  407. data/lib/relaton/jis/docidentifier.rb +21 -0
  408. data/lib/relaton/jis/doctype.rb +9 -0
  409. data/lib/relaton/jis/ext.rb +13 -0
  410. data/lib/relaton/jis/hit.rb +93 -0
  411. data/lib/relaton/jis/hit_collection.rb +127 -0
  412. data/lib/relaton/jis/item.rb +22 -0
  413. data/lib/relaton/jis/item_base.rb +26 -0
  414. data/lib/relaton/jis/item_data.rb +8 -0
  415. data/lib/relaton/jis/processor.rb +55 -0
  416. data/lib/relaton/jis/relation.rb +11 -0
  417. data/lib/relaton/jis/scraper.rb +232 -0
  418. data/lib/relaton/jis/structured_identifier.rb +13 -0
  419. data/lib/relaton/jis/util.rb +8 -0
  420. data/lib/relaton/jis.rb +33 -0
  421. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  422. data/lib/relaton/logger/config.rb +34 -0
  423. data/lib/relaton/logger/formatter_json.rb +8 -0
  424. data/lib/relaton/logger/formatter_string.rb +12 -0
  425. data/lib/relaton/logger/log.rb +64 -0
  426. data/lib/relaton/logger/log_device.rb +27 -0
  427. data/lib/relaton/logger/pool.rb +24 -0
  428. data/lib/relaton/logger.rb +18 -0
  429. data/lib/relaton/nist/bibdata.rb +8 -0
  430. data/lib/relaton/nist/bibitem.rb +8 -0
  431. data/lib/relaton/nist/bibliography.rb +191 -0
  432. data/lib/relaton/nist/comment_period.rb +15 -0
  433. data/lib/relaton/nist/data_fetcher.rb +84 -0
  434. data/lib/relaton/nist/date.rb +7 -0
  435. data/lib/relaton/nist/doctype.rb +7 -0
  436. data/lib/relaton/nist/ext.rb +16 -0
  437. data/lib/relaton/nist/hit.rb +18 -0
  438. data/lib/relaton/nist/hit_collection.rb +362 -0
  439. data/lib/relaton/nist/item.rb +17 -0
  440. data/lib/relaton/nist/item_data.rb +6 -0
  441. data/lib/relaton/nist/mods_parser.rb +276 -0
  442. data/lib/relaton/nist/processor.rb +68 -0
  443. data/lib/relaton/nist/pubs_export.rb +69 -0
  444. data/lib/relaton/nist/relation.rb +7 -0
  445. data/lib/relaton/nist/scraper.rb +290 -0
  446. data/lib/relaton/nist/series.yaml +49 -0
  447. data/lib/relaton/nist/util.rb +8 -0
  448. data/lib/relaton/nist.rb +34 -0
  449. data/lib/relaton/oasis/bibdata.rb +8 -0
  450. data/lib/relaton/oasis/bibitem.rb +8 -0
  451. data/lib/relaton/oasis/bibliography.rb +60 -0
  452. data/lib/relaton/oasis/browser_agent.rb +71 -0
  453. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  454. data/lib/relaton/oasis/data_parser.rb +305 -0
  455. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  456. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  457. data/lib/relaton/oasis/doctype.rb +7 -0
  458. data/lib/relaton/oasis/ext.rb +19 -0
  459. data/lib/relaton/oasis/item.rb +11 -0
  460. data/lib/relaton/oasis/item_data.rb +6 -0
  461. data/lib/relaton/oasis/processor.rb +68 -0
  462. data/lib/relaton/oasis/util.rb +8 -0
  463. data/lib/relaton/oasis.rb +28 -0
  464. data/lib/relaton/ogc/bibdata.rb +8 -0
  465. data/lib/relaton/ogc/bibitem.rb +8 -0
  466. data/lib/relaton/ogc/bibliography.rb +64 -0
  467. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  468. data/lib/relaton/ogc/docidentifier.rb +6 -0
  469. data/lib/relaton/ogc/doctype.rb +12 -0
  470. data/lib/relaton/ogc/ext.rb +15 -0
  471. data/lib/relaton/ogc/hit.rb +18 -0
  472. data/lib/relaton/ogc/hit_collection.rb +36 -0
  473. data/lib/relaton/ogc/item.rb +13 -0
  474. data/lib/relaton/ogc/item_data.rb +6 -0
  475. data/lib/relaton/ogc/processor.rb +58 -0
  476. data/lib/relaton/ogc/scraper.rb +225 -0
  477. data/lib/relaton/ogc/util.rb +8 -0
  478. data/lib/relaton/ogc.rb +26 -0
  479. data/lib/relaton/oiml/bibdata.rb +8 -0
  480. data/lib/relaton/oiml/bibitem.rb +8 -0
  481. data/lib/relaton/oiml/bibliography.rb +94 -0
  482. data/lib/relaton/oiml/docidentifier.rb +33 -0
  483. data/lib/relaton/oiml/doctype.rb +13 -0
  484. data/lib/relaton/oiml/ext.rb +42 -0
  485. data/lib/relaton/oiml/item.rb +20 -0
  486. data/lib/relaton/oiml/item_base.rb +18 -0
  487. data/lib/relaton/oiml/item_data.rb +6 -0
  488. data/lib/relaton/oiml/processor.rb +54 -0
  489. data/lib/relaton/oiml/relation.rb +9 -0
  490. data/lib/relaton/oiml/util.rb +8 -0
  491. data/lib/relaton/oiml.rb +24 -0
  492. data/lib/relaton/omg/bibdata.rb +8 -0
  493. data/lib/relaton/omg/bibitem.rb +8 -0
  494. data/lib/relaton/omg/bibliography.rb +31 -0
  495. data/lib/relaton/omg/ext.rb +7 -0
  496. data/lib/relaton/omg/item.rb +8 -0
  497. data/lib/relaton/omg/item_data.rb +6 -0
  498. data/lib/relaton/omg/processor.rb +34 -0
  499. data/lib/relaton/omg/scraper.rb +141 -0
  500. data/lib/relaton/omg/util.rb +8 -0
  501. data/lib/relaton/omg.rb +24 -0
  502. data/lib/relaton/plateau/bibdata.rb +8 -0
  503. data/lib/relaton/plateau/bibitem.rb +8 -0
  504. data/lib/relaton/plateau/bibliography.rb +24 -0
  505. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  506. data/lib/relaton/plateau/doctype.rb +7 -0
  507. data/lib/relaton/plateau/ext.rb +23 -0
  508. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  509. data/lib/relaton/plateau/hit.rb +13 -0
  510. data/lib/relaton/plateau/hit_collection.rb +59 -0
  511. data/lib/relaton/plateau/item.rb +12 -0
  512. data/lib/relaton/plateau/item_data.rb +6 -0
  513. data/lib/relaton/plateau/parser.rb +101 -0
  514. data/lib/relaton/plateau/processor.rb +49 -0
  515. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  516. data/lib/relaton/plateau/util.rb +8 -0
  517. data/lib/relaton/plateau.rb +28 -0
  518. data/lib/relaton/un/bibdata.rb +8 -0
  519. data/lib/relaton/un/bibitem.rb +8 -0
  520. data/lib/relaton/un/bibliography.rb +48 -0
  521. data/lib/relaton/un/doctype.rb +10 -0
  522. data/lib/relaton/un/ext.rb +30 -0
  523. data/lib/relaton/un/hit.rb +56 -0
  524. data/lib/relaton/un/hit_collection.rb +61 -0
  525. data/lib/relaton/un/item.rb +11 -0
  526. data/lib/relaton/un/item_data.rb +6 -0
  527. data/lib/relaton/un/parser.rb +108 -0
  528. data/lib/relaton/un/processor.rb +38 -0
  529. data/lib/relaton/un/session.rb +25 -0
  530. data/lib/relaton/un/token_generator.rb +105 -0
  531. data/lib/relaton/un/util.rb +8 -0
  532. data/lib/relaton/un/wasm/decoder.rb +434 -0
  533. data/lib/relaton/un/wasm/instance.rb +101 -0
  534. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  535. data/lib/relaton/un/wasm/memory.rb +112 -0
  536. data/lib/relaton/un/wasm/module.rb +47 -0
  537. data/lib/relaton/un/wasm.rb +17 -0
  538. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  539. data/lib/relaton/un.rb +28 -0
  540. data/lib/relaton/version.rb +1 -1
  541. data/lib/relaton/w3c/bibdata.rb +8 -0
  542. data/lib/relaton/w3c/bibitem.rb +8 -0
  543. data/lib/relaton/w3c/bibliography.rb +54 -0
  544. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  545. data/lib/relaton/w3c/data_parser.rb +379 -0
  546. data/lib/relaton/w3c/doctype.rb +7 -0
  547. data/lib/relaton/w3c/ext.rb +11 -0
  548. data/lib/relaton/w3c/item.rb +12 -0
  549. data/lib/relaton/w3c/item_data.rb +6 -0
  550. data/lib/relaton/w3c/processor.rb +49 -0
  551. data/lib/relaton/w3c/pubid.rb +73 -0
  552. data/lib/relaton/w3c/safe_realize.rb +59 -0
  553. data/lib/relaton/w3c/util.rb +8 -0
  554. data/lib/relaton/w3c.rb +25 -0
  555. data/lib/relaton/xsf/bibdata.rb +8 -0
  556. data/lib/relaton/xsf/bibitem.rb +8 -0
  557. data/lib/relaton/xsf/bibliography.rb +24 -0
  558. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  559. data/lib/relaton/xsf/hit.rb +17 -0
  560. data/lib/relaton/xsf/hit_collection.rb +24 -0
  561. data/lib/relaton/xsf/item.rb +7 -0
  562. data/lib/relaton/xsf/item_data.rb +6 -0
  563. data/lib/relaton/xsf/processor.rb +50 -0
  564. data/lib/relaton/xsf/util.rb +9 -0
  565. data/lib/relaton/xsf.rb +30 -0
  566. data/lib/relaton-core.rb +1 -0
  567. data/lib/relaton.rb +43 -0
  568. metadata +673 -170
  569. data/.github/workflows/rake.yml +0 -14
  570. data/.github/workflows/release.yml +0 -24
  571. data/.github/workflows/rubocop.yml +0 -48
  572. data/.gitignore +0 -12
  573. data/.rspec +0 -3
  574. data/CLAUDE.md +0 -78
  575. data/Gemfile +0 -29
  576. data/Rakefile +0 -6
  577. data/docs/CHANGELOG.adoc +0 -16
  578. data/docs/VERSIONING_POLICY.adoc +0 -38
  579. data/docs/navigation.adoc +0 -6
  580. data/lib/relaton/db/version.rb +0 -5
  581. data/relaton.gemspec +0 -72
  582. data/spec/relaton/config_spec.rb +0 -10
  583. data/spec/relaton/db_cache_spec.rb +0 -51
  584. data/spec/relaton/db_spec.rb +0 -567
  585. data/spec/relaton/registry_spec.rb +0 -178
  586. data/spec/relaton/util_spec.rb +0 -3
  587. data/spec/relaton_meta_spec.rb +0 -25
  588. data/spec/relaton_spec.rb +0 -800
  589. data/spec/spec_helper.rb +0 -45
  590. data/spec/support/gb_t_20223_2006.xml +0 -33
  591. data/spec/support/iso_111111119115_1.xml +0 -0
  592. data/spec/support/iso_19115_1.xml +0 -115
  593. data/spec/support/iso_19115_2.xml +0 -95
  594. data/spec/support/rfc_8341.xml +0 -46
  595. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  596. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  597. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  598. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  599. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  600. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  601. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  602. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  603. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  604. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  605. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  606. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  607. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  608. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  609. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  610. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,232 @@
1
+ module Relaton
2
+ module Ietf
3
+ module BibXMLParser # rubocop:disable Metrics/ModuleLength
4
+ extend self
5
+
6
+ def parse(xml)
7
+ reference = Rfcxml::V3::Reference.from_xml(xml)
8
+ FromRfcxml.new(reference).transform
9
+ end
10
+
11
+ def parse_rfc(xml)
12
+ rfc = Rfcxml::V3::Rfc.from_xml(xml)
13
+ FromRfc.new(rfc).transform
14
+ end
15
+
16
+ def pubid_type(id)
17
+ pref = id.match(/^(\S+)/)[1]
18
+ case pref
19
+ when "BCP", "FYI", "STD", "RFC" then "RFC"
20
+ when "I-D" then "Internet-Draft"
21
+ else "IETF"
22
+ end
23
+ end
24
+
25
+ def full_name_org(name) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
26
+ case name
27
+ when "ISO"
28
+ build_org(name, "International Organization for Standardization")
29
+ when "IAB"
30
+ build_org(name, "Internet Architecture Board")
31
+ when "IESG"
32
+ build_org(name, "Internet Engineering Steering Group")
33
+ when "IANA"
34
+ build_org(name, "Internet Assigned Numbers Authority")
35
+ when "International Organization for Standardization"
36
+ build_org("ISO", name)
37
+ when "Federal Networking Council", "Internet Architecture Board", "Internet Activities Board",
38
+ "Defense Advanced Research Projects Agency", "National Science Foundation",
39
+ "National Research Council", "National Bureau of Standards",
40
+ "Internet Engineering Steering Group"
41
+ abbr = name.split.map { |w| w[0] if w[0] == w[0].upcase }.join
42
+ build_org(abbr, name)
43
+ when "IETF Secretariat"
44
+ build_org("IETF", name)
45
+ when "Audio-Video Transport Working Group", /North American Directory Forum/, "EARN Staff",
46
+ "Vietnamese Standardization Working Group", "ACM SIGUCCS", "ESCC X.500/X.400 Task Force",
47
+ "Sun Microsystems", "NetBIOS Working Group in the Defense Advanced Research Projects Agency",
48
+ "End-to-End Services Task Force", "Network Technical Advisory Group", "Bolt Beranek",
49
+ "Newman Laboratories", "Gateway Algorithms and Data Structures Task Force",
50
+ "Network Information Center. Stanford Research Institute", "RFC Editor",
51
+ "Information Sciences Institute University of Southern California", "IAB and IESG",
52
+ "RARE WG-MSG Task Force 88", "KOI8-U Working Group", "The Internet Society",
53
+ "IAB Advisory Committee", "ISOC Board of Trustees", "Mitra", "RFC Editor, et al."
54
+ build_org(nil, name)
55
+ when "Internet Assigned Numbers Authority (IANA)"
56
+ build_org("IANA", "Internet Assigned Numbers Authority (IANA)")
57
+ when "ESnet Site Coordinating Comittee (ESCC)"
58
+ build_org("ESCC", "ESnet Site Coordinating Comittee (ESCC)")
59
+ when "Energy Sciences Network (ESnet)"
60
+ build_org("ESnet", "Energy Sciences Network (ESnet)")
61
+ when "International Telegraph and Telephone Consultative Committee of the International Telecommunication Union"
62
+ build_org("CCITT", name)
63
+ end
64
+ end
65
+
66
+ def build_org(abbr, name)
67
+ args = { name: [Bib::TypedLocalizedString.new(content: name, language: "en")] }
68
+ args[:abbreviation] = Bib::LocalizedString.new(content: abbr, language: "en") if abbr && !abbr.empty?
69
+ Bib::Organization.new(**args)
70
+ end
71
+
72
+ #
73
+ # Parse name, surname, and initials from full name
74
+ #
75
+ # @param [String] fname full name
76
+ # @param [String, nil] sname surname
77
+ # @param [String, nil] inits
78
+ #
79
+ # @return [Array<String, nil>] surname, initials, forename
80
+ #
81
+ def parse_surname_initials(fname, sname, inits) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
82
+ regex = /(?:(?<name>\w{3,})\s)?(?<inits>(?:[A-Z]{1,2}(?:\.[\s-]?|\s))+)?/
83
+ match = fname&.match(regex)
84
+ surname = sname || fname&.sub(regex, "")&.strip
85
+ initials = inits || (match && match[:inits]&.strip)
86
+ [surname, initials, (match && match[:name])]
87
+ end
88
+
89
+ class FromRfcxml < Bib::Converter::BibXml::FromRfcxml # rubocop:disable Metrics/ClassLength
90
+ private
91
+
92
+ def pubid_type(id)
93
+ BibXMLParser.pubid_type(id)
94
+ end
95
+
96
+ def contributor # rubocop:disable Metrics/MethodLength
97
+ contribs = []
98
+ unless @reference.anchor&.match?(/^I-D/)
99
+ org = BibXMLParser.build_org("IETF", "Internet Engineering Task Force")
100
+ contribs << Bib::Contributor.new(
101
+ organization: org,
102
+ role: [Bib::Contributor::Role.new(type: "publisher")],
103
+ )
104
+ end
105
+ contribs + super
106
+ end
107
+
108
+ def person(author)
109
+ return unless author.fullname && author.fullname != "None"
110
+ return if BibXMLParser.full_name_org(author.fullname)
111
+
112
+ super
113
+ end
114
+
115
+ def organization(author)
116
+ if author.fullname
117
+ org = BibXMLParser.full_name_org(author.fullname)
118
+ return org if org
119
+ end
120
+ super
121
+ end
122
+
123
+ def person_name(author) # rubocop:disable Metrics/MethodLength
124
+ fname = author.fullname
125
+ surname, inits, forename = BibXMLParser.parse_surname_initials(
126
+ fname, author.surname, author.initials
127
+ )
128
+ fnames = []
129
+ if forename
130
+ fnames << Bib::FullNameType::Forename.new(
131
+ content: forename, language: "en", script: "Latn",
132
+ )
133
+ end
134
+ if inits
135
+ inits.split(/\.-?\s?|\s/).each do |i|
136
+ fnames << Bib::FullNameType::Forename.new(
137
+ initial: i, language: "en", script: "Latn",
138
+ )
139
+ end
140
+ end
141
+ Bib::FullName.new(
142
+ completename: Bib::LocalizedString.new(content: fname, language: "en"),
143
+ formatted_initials: inits ? Bib::LocalizedString.new(content: inits, language: "en") : nil,
144
+ surname: Bib::LocalizedString.new(content: surname, language: "en"),
145
+ forename: fnames,
146
+ )
147
+ end
148
+ end
149
+
150
+ class FromRfc < FromRfcxml # rubocop:disable Metrics/ClassLength
151
+ def transform # rubocop:disable Metrics/MethodLength
152
+ namespace::ItemData.new(
153
+ docnumber: doc_name&.sub(/^\w+\./, ""),
154
+ type: "standard",
155
+ docidentifier: docidentifiers,
156
+ status: status,
157
+ language: ["en"],
158
+ script: ["Latn"],
159
+ source: source,
160
+ title: title,
161
+ abstract: abstract,
162
+ contributor: contributor + workgroup_contributors,
163
+ date: date,
164
+ series: series,
165
+ keyword: keyword,
166
+ ext: ext,
167
+ )
168
+ end
169
+
170
+ private
171
+
172
+ def doc_name = @reference.doc_name
173
+
174
+ def docidentifiers
175
+ ids = []
176
+ if doc_name
177
+ ids << Bib::Docidentifier.new(type: "Internet-Draft", content: doc_name, primary: true)
178
+ ids << Bib::Docidentifier.new(type: "IETF", content: doc_name, scope: "docName")
179
+ end
180
+ ids + docid_from_series_info
181
+ end
182
+
183
+ def source = []
184
+
185
+ def contributor # rubocop:disable Metrics/MethodLength
186
+ contribs = []
187
+ org = BibXMLParser.build_org("IETF", "Internet Engineering Task Force")
188
+ contribs << Bib::Contributor.new(
189
+ organization: org,
190
+ role: [Bib::Contributor::Role.new(type: "publisher")],
191
+ )
192
+ contribs + Bib::Converter::BibXml::FromRfcxml.instance_method(:contributor).bind_call(self)
193
+ end
194
+
195
+ def doctype
196
+ namespace::Doctype.new(content: "rfc")
197
+ end
198
+
199
+ def series
200
+ front_si = @reference.front.series_info || []
201
+ front_si.filter_map do |si|
202
+ next if si.name == "DOI" || si.stream || si.status
203
+
204
+ t = Bib::Title.new(content: si.name, language: "en", script: "Latn")
205
+ Bib::Series.new(title: [t], number: si.value, type: "main")
206
+ end
207
+ end
208
+
209
+ def status
210
+ si = @reference.front.series_info&.find(&:status)
211
+ return unless si
212
+
213
+ stage = Bib::Status::Stage.new(content: si.status)
214
+ Bib::Status.new(stage: stage)
215
+ end
216
+
217
+ def versioned_internet_draft_id
218
+ internet_draft_series_info(@reference.front)
219
+ end
220
+
221
+ def docid_from_series_info
222
+ front_si = @reference.front.series_info || []
223
+ front_si.each_with_object([]) do |s, acc|
224
+ next unless s.name.casecmp("doi").zero?
225
+
226
+ acc << Bib::Docidentifier.new(type: "DOI", content: s.value)
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,278 @@
1
+ require "etc"
2
+ require "parallel"
3
+ require "relaton/core"
4
+ require_relative "../ietf"
5
+ require_relative "bibxml_parser"
6
+ require_relative "rfc/index"
7
+ require_relative "rfc/entry"
8
+ require_relative "wg_name_resolver"
9
+
10
+ module Relaton
11
+ module Ietf
12
+ class DataFetcher < Core::DataFetcher
13
+ #
14
+ # Fetch documents
15
+ #
16
+ def fetch(source)
17
+ @source = source
18
+ case source
19
+ when "ietf-rfcsubseries" then fetch_ieft_rfcsubseries
20
+ when "ietf-internet-drafts" then fetch_ieft_internet_drafts
21
+ when "ietf-rfc-entries" then fetch_ieft_rfcs
22
+ end
23
+ index.save
24
+ end
25
+
26
+ private
27
+
28
+ def index
29
+ @index ||= Relaton::Index.find_or_create :IETF, file: "#{INDEXFILE}.yaml"
30
+ end
31
+
32
+ #
33
+ # Fetches ietf-rfcsubseries documents
34
+ #
35
+ def fetch_ieft_rfcsubseries
36
+ idx = Rfc::Index.from_xml(rfc_index)
37
+ rfc_map = (idx.rfc_entries || []).each_with_object({}) do |entry, h|
38
+ h[entry.doc_id] = entry
39
+ end
40
+ idx.subseries_entries.each do |entry|
41
+ save_doc entry.to_item(rfc_map, wg_names: wg_names)
42
+ end
43
+ end
44
+
45
+ #
46
+ # Fetches ietf-internet-drafts documents.
47
+ #
48
+ # Each work unit (one series, or one singleton XML) is processed
49
+ # end-to-end in a worker process: parse → link relations → serialize →
50
+ # write. Workers return Marshal-friendly index entries; the parent
51
+ # collects them and updates `Relaton::Index` and the duplicate-check set
52
+ # serially. Set `RELATON_IETF_PARALLEL_WORKERS=0` to force serial
53
+ # execution (useful for tests and debugging).
54
+ #
55
+ def fetch_ieft_internet_drafts
56
+ series_groups, singleton_paths = group_draft_paths
57
+
58
+ series_results = parallelize(series_groups.to_a) do |(series, paths_info)|
59
+ process_series(series, paths_info)
60
+ end.flatten(1)
61
+
62
+ singleton_results = parallelize(singleton_paths) do |path|
63
+ process_singleton(path)
64
+ end
65
+
66
+ (series_results + singleton_results).compact.each { |r| record_index_entry(r) }
67
+ end
68
+
69
+ #
70
+ # Run `block` once per item, in parallel worker processes when configured.
71
+ # `Parallel.map(items, in_processes: 0)` runs synchronously in the
72
+ # current process, which keeps tests deterministic and lets mocks work.
73
+ #
74
+ def parallelize(items, &block)
75
+ Parallel.map(items, in_processes: worker_count, &block)
76
+ end
77
+
78
+ def worker_count
79
+ ENV.fetch("RELATON_IETF_PARALLEL_WORKERS", Etc.nprocessors.to_s).to_i
80
+ end
81
+
82
+ #
83
+ # Filename-only scan: group versioned drafts by normalized series stem;
84
+ # everything else (non-versioned, non-`D.draft-`) goes to singletons.
85
+ # No XML parsing happens here — workers do that.
86
+ #
87
+ # @return [Array(Hash, Array<String>)]
88
+ # series_groups: { normalized_series => [{path, ver, ref}, ...] }
89
+ # singleton_paths: [path, ...]
90
+ #
91
+ def group_draft_paths
92
+ series_groups = {}
93
+ singleton_paths = []
94
+ Dir["bibxml-ids/*.xml"].each do |path|
95
+ file = File.basename(path, ".xml")
96
+ is_draft = file.include?("D.draft-")
97
+ ver = is_draft ? file[/(\d+)$/, 1] : nil
98
+ ref = file.sub(/^reference\.I-D\./, "").downcase
99
+ stem_match = is_draft && ver ? /^(draft-.+)-(\d{2})$/.match(ref) : nil
100
+ if stem_match
101
+ series = stem_match[1].gsub(/[.\s\/:-]+/, "-")
102
+ (series_groups[series] ||= []) << { path: path, ver: ver, ref: ref }
103
+ else
104
+ singleton_paths << path
105
+ end
106
+ end
107
+ [series_groups, singleton_paths]
108
+ end
109
+
110
+ #
111
+ # Worker: parse all files in a series, sort by version, append
112
+ # immediate-neighbor relations (skipped for bibxml), write each version
113
+ # and the un-versioned aggregator doc. Returns an array of index entries
114
+ # for the parent.
115
+ #
116
+ def process_series(series, paths_info)
117
+ sorted = paths_info.sort_by { |p| p[:ver].to_i }.map do |p|
118
+ bib = BibXMLParser.parse(File.read(p[:path], encoding: "UTF-8"))
119
+ bib.version = [Bib::Version.new(draft: p[:ver])]
120
+ p.merge(bib: bib, source: bib.source)
121
+ end
122
+ link_neighbor_relations(sorted) if @format != "bibxml"
123
+
124
+ results = sorted.map { |entry| serialize_and_write(entry[:bib]) }
125
+ results << serialize_and_write(build_unversioned_doc(series, sorted)) if @format != "bibxml"
126
+ results.compact
127
+ end
128
+
129
+ #
130
+ # Worker: parse + serialize + write a single non-grouped XML.
131
+ #
132
+ def process_singleton(path)
133
+ file = File.basename(path, ".xml")
134
+ is_draft = file.include?("D.draft-")
135
+ ver = is_draft ? file[/(\d+)$/, 1] : nil
136
+ bib = BibXMLParser.parse(File.read(path, encoding: "UTF-8"))
137
+ bib.version = [Bib::Version.new(draft: ver)] if ver
138
+ serialize_and_write(bib)
139
+ end
140
+
141
+ #
142
+ # Append immediate-neighbor `updates` / `updatedBy` relations in memory.
143
+ # Single-version series get no relations (no neighbors).
144
+ #
145
+ def link_neighbor_relations(sorted)
146
+ sorted.each_with_index do |entry, i|
147
+ if i.positive?
148
+ prev = sorted[i - 1]
149
+ entry[:bib].relation << version_relation({ ref: prev[:ref], source: prev[:source] }, "updates")
150
+ end
151
+ if i < sorted.size - 1
152
+ nxt = sorted[i + 1]
153
+ entry[:bib].relation << version_relation({ ref: nxt[:ref], source: nxt[:source] }, "updatedBy")
154
+ end
155
+ end
156
+ end
157
+
158
+ #
159
+ # Build (but do not write) the un-versioned series aggregator doc with
160
+ # `includes` relations to every version. Uses the latest version's
161
+ # title/abstract from memory.
162
+ #
163
+ # @return [Relaton::Ietf::ItemData, nil]
164
+ #
165
+ def build_unversioned_doc(series, sorted)
166
+ if sorted.empty?
167
+ Util.warn "No versions found for #{series}"
168
+ return nil
169
+ end
170
+
171
+ last_v = sorted.last[:bib]
172
+ docid = Bib::Docidentifier.new(type: "Internet-Draft", content: series, primary: true)
173
+ rel = sorted.map { |e| version_relation({ ref: e[:ref], source: e[:source] }, "includes") }
174
+ ItemData.new(
175
+ title: last_v.title, abstract: last_v.abstract, formattedref: Bib::Formattedref.new(content: series),
176
+ docidentifier: [docid], relation: rel
177
+ )
178
+ end
179
+
180
+ #
181
+ # Create bibitem relation
182
+ #
183
+ # @param [Hash] ver version reference, { ref:, source: }
184
+ # @param [String] type relation type
185
+ #
186
+ # @return [Relaton::Ietf::Relation] relation
187
+ #
188
+ def version_relation(ver, type)
189
+ docid = Bib::Docidentifier.new(type: "Internet-Draft", content: ver[:ref], primary: true)
190
+ bibitem = ItemData.new(formattedref: Bib::Formattedref.new(content: ver[:ref]), docidentifier: [docid], source: ver[:source])
191
+ Relaton::Ietf::Relation.new(type: type, bibitem: bibitem)
192
+ end
193
+
194
+ #
195
+ # Fetches ietf-rfc-entries documents
196
+ #
197
+ def fetch_ieft_rfcs
198
+ idx = Rfc::Index.from_xml(rfc_index)
199
+ idx.rfc_entries.each do |entry|
200
+ save_doc entry.to_item(nil, wg_names: wg_names)
201
+ rescue StandardError => e
202
+ Util.error "Error parsing #{entry.doc_id}: #{e.message}\n" \
203
+ "#{e.backtrace[0..5].join("\n")}"
204
+ end
205
+ end
206
+
207
+ #
208
+ # Get RFC index
209
+ #
210
+ # @return [Nokogiri::XML::Document] RFC index
211
+ #
212
+ def rfc_index
213
+ uri = URI "https://www.rfc-editor.org/rfc-index.xml"
214
+ Net::HTTP.get(uri)
215
+ end
216
+
217
+ def wg_names
218
+ @wg_names ||= WgNameResolver.fetch
219
+ end
220
+
221
+ #
222
+ # Save document to file (sequential path: serialize, write, index).
223
+ # Used by the rfcsubseries / rfc-entries fetchers; the I-D fetcher splits
224
+ # this into worker-safe `serialize_and_write` plus parent-only
225
+ # `record_index_entry` so the index is touched only in the main process.
226
+ #
227
+ # @param [Relaton::Ietf::Rfc::Entry, nil] entry
228
+ # @param [Boolean] check_duplicate check for duplicate
229
+ #
230
+ def save_doc(entry, check_duplicate: true)
231
+ result = serialize_and_write(entry)
232
+ record_index_entry(result, check_duplicate: check_duplicate) if result
233
+ end
234
+
235
+ #
236
+ # Worker-safe: serialize, compute output filename, write to disk, return
237
+ # a Marshal-friendly hash with the docid+file pair the parent needs to
238
+ # update `Relaton::Index` and `@files`. Does NOT touch instance state
239
+ # that has to stay consistent across workers (`@files`, the index).
240
+ #
241
+ # @param [#to_yaml, #to_xml, #to_rfcxml, nil] entry
242
+ # @return [Hash, nil]
243
+ #
244
+ def serialize_and_write(entry) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
245
+ return nil unless entry
246
+
247
+ content = case @format
248
+ when "xml" then entry.to_xml(bibdata: true)
249
+ when "yaml" then entry.to_yaml
250
+ when "bibxml" then entry.to_rfcxml
251
+ else entry.send("to_#{@format}")
252
+ end
253
+ id = if entry.respond_to?(:docidentifier)
254
+ entry.docidentifier.detect { |i| i.type == "Internet-Draft" && i.primary }&.content
255
+ end
256
+ id ||= entry.docnumber || entry.formattedref.content
257
+ file = output_file(id)
258
+ File.write file, content, encoding: "UTF-8"
259
+ primary = entry.docidentifier.detect(&:primary) || entry.docidentifier.first
260
+ { docnumber: entry.docnumber, file: file, index_id: primary.content }
261
+ end
262
+
263
+ #
264
+ # Parent-only: dedupe-check `@files` and update `Relaton::Index`. Called
265
+ # serially after workers return so index updates are race-free.
266
+ #
267
+ def record_index_entry(result, check_duplicate: true)
268
+ if check_duplicate && @files.include?(result[:file])
269
+ Util.warn "File #{result[:file]} already exists. Document: #{result[:docnumber]}"
270
+ elsif check_duplicate
271
+ @files << result[:file]
272
+ end
273
+ index.add_or_update result[:index_id], result[:file]
274
+ end
275
+
276
+ end
277
+ end
278
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Ietf
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[rfc internet-draft].freeze
5
+
6
+ attribute :type, :string, values: TYPES
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,63 @@
1
+ require_relative "doctype"
2
+ require_relative "processing_instructions"
3
+
4
+ module Relaton
5
+ module Ietf
6
+ class Ext < Bib::Ext
7
+ attribute :doctype, Doctype
8
+ attribute :area, :string, collection: true, values: %W[
9
+ apt gen int ops rtg sec tsv Applications\sand\sReal-Time General
10
+ Internet Operations\sand\sManagement Routing Security Transport
11
+ ]
12
+ attribute :stream, :string, values: %w[IAB IETF Independent IRTF Legacy Editorial]
13
+ attribute :ipr, :string
14
+ attribute :pi, ProcessingInstructions
15
+ attribute :consensus, :string
16
+ attribute :index_include, :string
17
+ attribute :ipr_extract, :string
18
+ attribute :sort_refs, :string
19
+ attribute :sym_refs, :string
20
+ attribute :toc_include, :string
21
+ attribute :toc_depth, :string
22
+ attribute :show_on_front_page, :string
23
+
24
+ xml do
25
+ map_element "area", to: :area
26
+ map_element "stream", to: :stream
27
+ map_element "ipr", to: :ipr
28
+ map_element "pi", to: :pi
29
+ map_element "consensus", to: :consensus
30
+ map_element "indexInclude", to: :index_include
31
+ map_element "iprExtract", to: :ipr_extract
32
+ map_element "sortRefs", to: :sort_refs
33
+ map_element "symRefs", to: :sym_refs
34
+ map_element "tocInclude", to: :toc_include
35
+ map_element "tocDepth", to: :toc_depth
36
+ map_element "showOnFrontPage", to: :show_on_front_page
37
+ end
38
+
39
+ key_value do
40
+ map_element "schema_version", to: :schema_version, render_default: true
41
+ map_element "doctype", to: :doctype
42
+ map_element "subdoctype", to: :subdoctype
43
+ map_element "flavor", to: :flavor
44
+ map_element "ics", to: :ics
45
+ map_element "structuredidentifier", to: :structuredidentifier
46
+ map_element "area", to: :area
47
+ map_element "stream", to: :stream
48
+ map_element "ipr", to: :ipr
49
+ map_element "pi", to: :pi
50
+ map_element "consensus", to: :consensus
51
+ map_element "index_include", to: :index_include
52
+ map_element "ipr_extract", to: :ipr_extract
53
+ map_element "sort_refs", to: :sort_refs
54
+ map_element "sym_refs", to: :sym_refs
55
+ map_element "toc_include", to: :toc_include
56
+ map_element "toc_depth", to: :toc_depth
57
+ map_element "show_on_front_page", to: :show_on_front_page
58
+ end
59
+
60
+ def get_schema_version = Relaton.schema_versions["relaton-model-ietf"]
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "ext"
2
+
3
+ module Relaton
4
+ module Ietf
5
+ class Item < Bib::Item
6
+ model ItemData
7
+
8
+ attribute :ext, Ext
9
+ end
10
+ end
11
+ end
12
+
13
+ require_relative "relation"
14
+
15
+ Relaton::Ietf::Item.attribute :relation, Relaton::Ietf::Relation,
16
+ collection: true, initialize_empty: true
@@ -0,0 +1,18 @@
1
+ module Relaton
2
+ module Ietf
3
+ class ItemBase < Lutaml::Model::Serializable
4
+ include Bib::NamespaceHelper
5
+
6
+ attr_accessor :type
7
+
8
+ model ItemData
9
+
10
+ instance_exec(&Bib::ItemShared::ATTRIBUTES)
11
+
12
+ xml do
13
+ map_attribute "type", to: :type
14
+ instance_exec(&Bib::ItemShared::XML_BODY)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Ietf
3
+ class ItemData < Bib::ItemData
4
+ end
5
+ end
6
+ end