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,8 @@
1
+ module Relaton
2
+ module Iana
3
+ class Bibdata < Item
4
+ model ItemData
5
+ include Bib::BibdataShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Iana
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Iana
5
+ # Methods for search IANA standards.
6
+ module Bibliography
7
+ SOURCE = "https://raw.githubusercontent.com/relaton/relaton-data-iana/refs/heads/v2/"
8
+
9
+ # @param text [String]
10
+ # @return [Relaton::Iana::ItemData, nil]
11
+ def search(text) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
12
+ index = Relaton::Index.find_or_create :iana, url: "#{SOURCE}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml"
13
+ id = text.sub(/^IANA\s/, "")
14
+ row = index.search(id).min_by { |i| i[:id] }
15
+ return unless row
16
+
17
+ url = "#{SOURCE}#{row[:file]}"
18
+ resp = Net::HTTP.get_response URI(url)
19
+ return unless resp.code == "200"
20
+
21
+ Item.from_yaml(resp.body).tap { |item| item.fetched = Date.today.to_s }
22
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
23
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
24
+ Net::ProtocolError, Errno::ETIMEDOUT => e
25
+ raise Relaton::RequestError, e.message
26
+ end
27
+
28
+ # @param ref [String] the W3C standard Code to look up
29
+ # @param year [String, NilClass] not used
30
+ # @param opts [Hash] options
31
+ # @return [Relaton::Iana::ItemData, nil]
32
+ def get(ref, _year = nil, _opts = {})
33
+ Util.info "Fetching from Relaton repository ...", key: ref
34
+ result = search(ref)
35
+ unless result
36
+ Util.info "Not found.", key: ref
37
+ return
38
+ end
39
+
40
+ Util.info "Found: `#{result.docidentifier[0].content}`", key: ref
41
+ result
42
+ end
43
+
44
+ extend self
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,71 @@
1
+ require "relaton/core"
2
+ require_relative "../iana"
3
+ require_relative "parser"
4
+
5
+ module Relaton
6
+ module Iana
7
+ class DataFetcher < Core::DataFetcher
8
+ #
9
+ # Parse documents
10
+ #
11
+ def log_error(msg)
12
+ Util.error msg
13
+ end
14
+
15
+ def fetch(_source = nil)
16
+ Dir["iana-registries/**/*.xml"].each do |file|
17
+ content = File.read file, encoding: "UTF-8"
18
+ parse(content) if content.include? "<registry"
19
+ rescue StandardError => e
20
+ Util.error "Error: #{e.message}. File: #{file}"
21
+ end
22
+ index.save
23
+ report_errors
24
+ end
25
+
26
+ private
27
+
28
+ def index
29
+ @index ||= Relaton::Index.find_or_create :iana, file: "#{INDEXFILE}.yaml"
30
+ end
31
+
32
+ def parse(content)
33
+ xml = Nokogiri::XML(content)
34
+ registry = xml.at("/xmlns:registry")
35
+ doc = Parser.parse registry, nil, @errors
36
+ save_doc doc
37
+ registry.xpath("./xmlns:registry").each { |r| save_doc Parser.parse(r, doc, @errors) }
38
+ end
39
+
40
+ #
41
+ # Save document to file
42
+ #
43
+ # @param [RelatonIana::IanaBibliographicItem, nil] bib bibliographic item
44
+ #
45
+ def save_doc(bib) # rubocop:disable Metrics/MethodLength
46
+ return unless bib
47
+
48
+ file = output_file(bib.docnumber)
49
+ if @files.include? file
50
+ Util.warn "File #{file} already exists. Document: #{bib.docnumber}"
51
+ else
52
+ @files << file
53
+ end
54
+ index.add_or_update bib.docnumber, file
55
+ File.write file, serialize(bib), encoding: "UTF-8"
56
+ end
57
+
58
+ def to_xml(bib)
59
+ bib.to_xml(bibdata: true)
60
+ end
61
+
62
+ def to_yaml(bib)
63
+ bib.to_yaml
64
+ end
65
+
66
+ def to_bibxml(bib)
67
+ bib.to_rfcxml
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,7 @@
1
+ module Relaton
2
+ module Iana
3
+ class Item < Bib::Item
4
+ model ItemData
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Iana
3
+ class ItemData < Bib::ItemData
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,146 @@
1
+ module Relaton
2
+ module Iana
3
+ class Parser
4
+ #
5
+ # Document parser initalization
6
+ #
7
+ # @param [Nokogiri::XML::Element] xml
8
+ #
9
+ def initialize(xml, rootdoc, errors = {})
10
+ @xml = xml
11
+ @rootdoc = rootdoc
12
+ @errors = errors
13
+ end
14
+
15
+ #
16
+ # Initialize document parser and run it
17
+ #
18
+ # @param [Nokogiri::XML::Element] xml
19
+ #
20
+ # @return [Relaton::Iana::ItemData, nil] bibliographic item
21
+ #
22
+ def self.parse(xml, rootdoc = nil, errors = {})
23
+ new(xml, rootdoc, errors).parse
24
+ end
25
+
26
+ #
27
+ # Parse document
28
+ #
29
+ # @return [Relaton::Iana::ItemData, nil] bibliographic item
30
+ #
31
+ def parse # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
32
+ return unless @xml
33
+
34
+ Relaton::Iana::ItemData.new(
35
+ type: "standard",
36
+ language: ["en"],
37
+ script: ["Latn"],
38
+ title: parse_title,
39
+ source: parse_source,
40
+ docidentifier: parse_docid,
41
+ docnumber: docnumber,
42
+ date: parse_date,
43
+ contributor: contributor,
44
+ )
45
+ end
46
+
47
+ #
48
+ # Parse title
49
+ #
50
+ # @return [Array<Relaton::Bib::Title>] title
51
+ #
52
+ def parse_title
53
+ content = @xml.at("./xmlns:title")&.text || @xml[:id]
54
+ result = [Bib::Title.new(content: content, language: "en", script: "Latn")]
55
+ @errors[:title] &&= result.empty?
56
+ result
57
+ end
58
+
59
+ #
60
+ # Parse link
61
+ #
62
+ # @return [Array<Relaton::Bib::Uri>] link
63
+ #
64
+ def parse_source
65
+ result = if @rootdoc then @rootdoc.source
66
+ elsif @xml[:id]
67
+ uri = URI.join "https://www.iana.org/assignments/", @xml[:id]
68
+ [Bib::Uri.new(type: "src", content: uri.to_s)]
69
+ else
70
+ []
71
+ end
72
+ @errors[:source] &&= result.empty?
73
+ result
74
+ end
75
+
76
+ #
77
+ # Parse docidentifier
78
+ #
79
+ # @return [Arra<RelatonBib::DocumentIdentifier>] docidentifier
80
+ #
81
+ def parse_docid
82
+ result = [Bib::Docidentifier.new(type: "IANA", content: pub_id, primary: true)]
83
+ @errors[:docid] &&= result.empty?
84
+ result
85
+ end
86
+
87
+ #
88
+ # Create anchor
89
+ #
90
+ # @return [String] anchor
91
+ #
92
+ def anchor
93
+ docnumber.upcase.gsub("/", "__")
94
+ end
95
+
96
+ #
97
+ # Generate PubID
98
+ #
99
+ # @return [String] PubID
100
+ #
101
+ def pub_id
102
+ "IANA #{docnumber}"
103
+ end
104
+
105
+ #
106
+ # Create docnumber
107
+ #
108
+ # @return [String] docnumber
109
+ #
110
+ def docnumber
111
+ dn = ""
112
+ dn += "#{@rootdoc.docnumber}/" if @rootdoc
113
+ id = @xml["id"].to_s
114
+ @errors[:docnumber] &&= id.empty?
115
+ dn + id
116
+ end
117
+
118
+ #
119
+ # Parse date
120
+ #
121
+ # @return [Array<Relaton::Bib::Date>] date
122
+ #
123
+ def parse_date
124
+ d = @xml.xpath("./xmlns:created|./xmlns:published|./xmlns:updated").map do |dt|
125
+ Bib::Date.new(type: dt.name, at: dt.text)
126
+ end
127
+ result = d.none? && @rootdoc ? @rootdoc.date : d
128
+ @errors[:date] &&= result.empty?
129
+ result
130
+ end
131
+
132
+ #
133
+ # Create contributor
134
+ #
135
+ # @return [Array<Relaton::Bib::Contributor>] contributor
136
+ #
137
+ def contributor
138
+ orgname = Bib::TypedLocalizedString.new(content: "Internet Assigned Numbers Authority")
139
+ abbrev = Bib::LocalizedString.new(content: "IANA")
140
+ org = Bib::Organization.new(name: [orgname], abbreviation: abbrev)
141
+ role = Bib::Contributor::Role.new(type: "publisher")
142
+ [Bib::Contributor.new(organization: org, role: [role])]
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,68 @@
1
+ require "relaton/core/processor"
2
+
3
+ module Relaton
4
+ module Iana
5
+ class Processor < Relaton::Core::Processor
6
+ attr_reader :idtype
7
+
8
+ def initialize # rubocop:disable Lint/MissingSuper
9
+ @short = :relaton_iana
10
+ @prefix = "IANA"
11
+ @defaultprefix = %r{^IANA\s}
12
+ @idtype = "IANA"
13
+ @datasets = %w[iana-registries]
14
+ end
15
+
16
+ # @param code [String]
17
+ # @param date [String, NilClass] year
18
+ # @param opts [Hash]
19
+ # @return [Relaton::Iana::ItemData, nil]
20
+ def get(code, date, opts)
21
+ require_relative "../iana"
22
+ Bibliography.get(code, date, opts)
23
+ end
24
+
25
+ #
26
+ # Fetch all the documents from https://github.com/ietf-ribose/iana-registries
27
+ #
28
+ # @param [String] source source name
29
+ # @param [Hash] opts
30
+ # @option opts [String] :output directory to output documents
31
+ # @option opts [String] :format output format, "xml" or "yaml"
32
+ #
33
+ def fetch_data(source, opts)
34
+ require_relative "data_fetcher"
35
+ DataFetcher.fetch(source, **opts)
36
+ end
37
+
38
+ # @param xml [String]
39
+ # @return [Relaton::Iana::ItemData]
40
+ def from_xml(xml)
41
+ require_relative "../iana"
42
+ Item.from_xml xml
43
+ end
44
+
45
+ # @param yaml [String]
46
+ # @return [RelatonIana::ItemData]
47
+ def from_yaml(yaml)
48
+ require_relative "../iana"
49
+ Item.from_yaml yaml
50
+ end
51
+
52
+ # Returns hash of XML grammar
53
+ # @return [String]
54
+ def grammar_hash
55
+ require_relative "../iana"
56
+ @grammar_hash ||= ::Relaton::Iana.grammar_hash
57
+ end
58
+
59
+ #
60
+ # Remove index file
61
+ #
62
+ def remove_index_file
63
+ require_relative "../iana"
64
+ Relaton::Index.find_or_create(:iana, url: true, file: "#{INDEXFILE}.yaml").remove_file
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Iana
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-iana".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require "relaton/index"
5
+ require "relaton/bib"
6
+ require_relative "version"
7
+ require_relative "iana/util"
8
+ require_relative "iana/item_data"
9
+ require_relative "iana/item"
10
+ require_relative "iana/bibitem"
11
+ require_relative "iana/bibdata"
12
+ require_relative "iana/bibliography"
13
+ # require_relative "relaton_iana/parser"
14
+ # require_relative "relaton_iana/data_fetcher"
15
+
16
+ module Relaton
17
+ module Iana
18
+ INDEXFILE = "index-v1"
19
+
20
+ # Returns hash of XML reammar
21
+ # @return [String]
22
+ def self.grammar_hash
23
+ # gem_path = File.expand_path "..", __dir__
24
+ # grammars_path = File.join gem_path, "grammars", "*"
25
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
26
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit_collection"
4
+ require "date"
5
+
6
+ module Relaton
7
+ module Iec
8
+ # Class methods for search IEC standards.
9
+ class Bibliography
10
+ extend Core::ArrayWrapper
11
+
12
+ DOCTYPES = %w[TS TR PAS SRD TEC STTR WP Guide OD CS CA].freeze
13
+
14
+ class << self
15
+ ##
16
+ # Search for standards entries.
17
+ #
18
+ # @param pubid [Pubid::Iec::Identifier]
19
+ # @param exclude [Array<Symbol>] keys to exclude from comparison
20
+ # @return [Relaton::Iec::HitCollection]
21
+ def search(pubid, exclude: [:year])
22
+ HitCollection.new(pubid).search(exclude: exclude)
23
+ rescue SocketError, OpenSSL::SSL::SSLError => e
24
+ raise Relaton::RequestError, e.message
25
+ end
26
+
27
+ # @param code [String] the IEC standard code to look up (e.g. "IEC 8000")
28
+ # @param year [String] the year the standard was published (optional)
29
+ # @param opts [Hash] options; restricted to :all_parts if all-parts
30
+ # reference is required
31
+ # @return [Relaton::Iec::ItemData, nil]
32
+ def get(code, year = nil, opts = {}) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity
33
+ opts[:all_parts] ||= code.match?(/\s\(all parts\)/)
34
+ ref = code.sub(/\s\(all parts\)/, "")
35
+ return iev if ref.casecmp("IEV").zero?
36
+
37
+ pubid = ::Pubid::Iec::Identifier.parse ref.upcase
38
+ if year
39
+ pubid.date = ::Pubid::Components::Date.new(year: year.to_s)
40
+ end
41
+
42
+ ret = iecbib_get(pubid, opts)
43
+ return nil if ret.nil?
44
+
45
+ ret = ret.to_most_recent_reference unless pubid.date&.year || opts[:keep_year] ||
46
+ opts[:publication_date_before] || opts[:publication_date_after]
47
+ ret
48
+ end
49
+
50
+ private
51
+
52
+ def iev(code = "IEC 60050")
53
+ ItemData.new(
54
+ type: "standard",
55
+ fetched: Date.today,
56
+ title: [Bib::Title.new(
57
+ content: "International Electrotechnical Vocabulary", language: "en", script: "Latn"
58
+ )],
59
+ source: [Bib::Uri.new(content: "http://www.electropedia.org")],
60
+ docidentifier: [Docidentifier.new(content: "#{code}:2011", type: "IEC", primary: true)],
61
+ date: [Bib::Date.new(type: "published", at: "2011")],
62
+ contributor: [Bib::Contributor.new(
63
+ role: [Bib::Contributor::Role.new(type: "publisher")],
64
+ organization: Bib::Organization.new(
65
+ name: [Bib::TypedLocalizedString.new(
66
+ content: "International Electrotechnical Commission", language: "en", script: "Latn"
67
+ )],
68
+ abbreviation: Bib::LocalizedString.new(content: "IEC", language: "en", script: "Latn"),
69
+ uri: [Bib::Uri.new(content: "www.iec.ch")]
70
+ )
71
+ )],
72
+ language: %w(en fr),
73
+ script: "Latn",
74
+ status: Bib::Status.new(stage: Bib::Status::Stage.new(content: "60")),
75
+ copyright: Bib::Copyright.new(
76
+ from: "2018",
77
+ owner: [Bib::ContributionInfo.new(
78
+ organization: Bib::Organization.new(
79
+ name: [Bib::TypedLocalizedString.new(
80
+ content: "International Electrotechnical Commission", language: "en", script: "Latn"
81
+ )],
82
+ abbreviation: Bib::LocalizedString.new(content: "IEC", language: "en", script: "Latn"),
83
+ uri: [Bib::Uri.new(content: "www.iec.ch")]
84
+ )
85
+ )]
86
+ )
87
+ )
88
+ end
89
+
90
+ # @param pubid [Pubid::Iec::Identifier]
91
+ # @param opts [Hash]
92
+ # @return [Relaton::Iec::ItemData, nil]
93
+ def iecbib_get(pubid, opts) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
94
+ Util.info "Fetching from Relaton repository ...", key: pubid.to_s
95
+ # pubid 2.x splits multi-level numbers ("61326-2-6") into part +
96
+ # subpart, so all-parts matching must ignore subpart too.
97
+ exclude = opts[:all_parts] ? %i[year part subpart] : %i[year]
98
+ result = search(pubid, exclude: exclude) || return
99
+
100
+ if opts[:all_parts]
101
+ ret = result.to_all_parts(pubid.date&.year&.to_s, opts)
102
+ Util.info "Found: `#{ret&.docidentifier&.first&.content}`", key: pubid.to_s if ret
103
+ return ret
104
+ end
105
+
106
+ ret = find_match(result, pubid, opts)
107
+ return ret if ret
108
+
109
+ provide_tips(pubid, result)
110
+ nil
111
+ end
112
+
113
+ # Find exact match considering year and date filters.
114
+ # @param result [Relaton::Iec::HitCollection]
115
+ # @param pubid [Pubid::Iec::Identifier]
116
+ # @param opts [Hash]
117
+ # @return [Relaton::Iec::ItemData, nil]
118
+ def find_match(result, pubid, opts = {}) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
119
+ pubid_year = pubid.date&.year
120
+ if pubid_year
121
+ hit = result.detect { |h| h.hit[:id].date&.year == pubid_year }
122
+ return fetch_and_check_date(hit, pubid, opts) if hit
123
+ elsif opts[:publication_date_before] || opts[:publication_date_after]
124
+ candidates = result.select { |h| year_in_range?(h.hit[:id].date&.year.to_i, opts) }
125
+ candidates = candidates.sort_by { |h| -h.hit[:id].date&.year.to_i }
126
+ candidates.each do |h|
127
+ ret = fetch_and_check_date(h, pubid, opts)
128
+ return ret if ret
129
+ end
130
+ return nil
131
+ else
132
+ hit = result.max_by { |h| h.hit[:id].date&.year.to_i }
133
+ return unless hit
134
+
135
+ ret = hit.item
136
+ Util.info "Found: `#{ret.docidentifier.first.content}`", key: pubid.to_s
137
+ return ret
138
+ end
139
+ nil
140
+ end
141
+
142
+ # Check if a year falls within the date filter range.
143
+ # @param year [Integer]
144
+ # @param opts [Hash]
145
+ # @return [Boolean]
146
+ def year_in_range?(year, opts)
147
+ return false if year.zero?
148
+
149
+ if opts[:publication_date_before]
150
+ return false if year > opts[:publication_date_before].year
151
+ end
152
+ if opts[:publication_date_after]
153
+ return false if year < opts[:publication_date_after].year
154
+ end
155
+ true
156
+ end
157
+
158
+ # Check if the item's published date falls within the filter range.
159
+ # @param item [Relaton::Iec::ItemData]
160
+ # @param opts [Hash]
161
+ # @return [Boolean]
162
+ def publication_date_in_range?(item, opts)
163
+ pub_date_entry = item.date.find { |d| d.type == "published" }
164
+ return true unless pub_date_entry&.at
165
+
166
+ pub_date = pub_date_entry.at.to_date
167
+ return true unless pub_date
168
+
169
+ if opts[:publication_date_before]
170
+ return false if pub_date >= opts[:publication_date_before]
171
+ end
172
+ if opts[:publication_date_after]
173
+ return false if pub_date < opts[:publication_date_after]
174
+ end
175
+ true
176
+ end
177
+
178
+ # Fetch the item for a hit and check if its publication date is in range.
179
+ # @param hit [Relaton::Iec::Hit]
180
+ # @param pubid [Pubid::Iec::Identifier]
181
+ # @param opts [Hash]
182
+ # @return [Relaton::Iec::ItemData, nil]
183
+ def fetch_and_check_date(hit, pubid, opts)
184
+ ret = hit.item
185
+ if publication_date_in_range?(ret, opts)
186
+ Util.info "Found: `#{ret.docidentifier.first.content}`", key: pubid.to_s
187
+ freeze_item(ret, opts)
188
+ end
189
+ end
190
+
191
+ # Freeze a document in time by filtering out relations, dates, and status
192
+ # that fall outside the specified date range.
193
+ def freeze_item(item, opts) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
194
+ return item unless opts[:publication_date_before] || opts[:publication_date_after]
195
+
196
+ item.relation = item.relation.select { |r| relation_in_range?(r, opts) }
197
+
198
+ had_obsoleted = item.date.any? { |d| d.type == "obsoleted" }
199
+ item.date = item.date.select { |d| date_entry_in_range?(d, opts) }
200
+ lost_obsoleted = had_obsoleted && item.date.none? { |d| d.type == "obsoleted" }
201
+
202
+ if lost_obsoleted && item.status&.stage&.content == "95"
203
+ item.status.stage.content = "60"
204
+ item.status.substage&.content = "60"
205
+ end
206
+
207
+ item
208
+ end
209
+
210
+ # Check if a relation's bibitem falls within the date range.
211
+ def relation_in_range?(rel, opts) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
212
+ rel.bibitem.date&.each do |d|
213
+ dt = (d.at || d.from)&.to_date
214
+ next unless dt
215
+
216
+ return false if opts[:publication_date_before] && dt >= opts[:publication_date_before]
217
+ return false if opts[:publication_date_after] && dt < opts[:publication_date_after]
218
+ end
219
+
220
+ rel.bibitem.docidentifier&.each do |did|
221
+ year = did.to_s[/:(\d{4})/, 1]&.to_i
222
+ next unless year&.positive?
223
+
224
+ return false if opts[:publication_date_before] && year >= opts[:publication_date_before].year
225
+ return false if opts[:publication_date_after] && year < opts[:publication_date_after].year
226
+ end
227
+
228
+ true
229
+ end
230
+
231
+ # Check if a date entry falls within the date range (always keeps published).
232
+ def date_entry_in_range?(date_entry, opts)
233
+ return true if date_entry.type == "published"
234
+
235
+ dt = (date_entry.at || date_entry.from)&.to_date
236
+ return true unless dt
237
+
238
+ return false if opts[:publication_date_before] && dt >= opts[:publication_date_before]
239
+ return false if opts[:publication_date_after] && dt < opts[:publication_date_after]
240
+
241
+ true
242
+ end
243
+
244
+ # Analyze why no match was found and give helpful tips.
245
+ # @param pubid [Pubid::Iec::Identifier]
246
+ # @param result [Relaton::Iec::HitCollection]
247
+ def provide_tips(pubid, result) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
248
+ Util.info "Not found.", key: pubid.to_s
249
+
250
+ # Year mismatch: hits exist but not for the requested year
251
+ if pubid.date&.year && result.any?
252
+ years = result.map { |h| h.hit[:id].date&.year&.to_s }.compact.uniq.sort
253
+ Util.info "TIP: No match for edition year `#{pubid.date&.year}`, " \
254
+ "but matches exist for `#{years.join('`, `')}`.", key: pubid.to_s
255
+ return
256
+ end
257
+
258
+ # Search broadly (exclude year + part) to check for part/type mismatches
259
+ broad = search(pubid, exclude: %i[year part])
260
+
261
+ # Part mismatch: no part given but parts exist
262
+ unless pubid.part
263
+ if broad.any?
264
+ parts = broad.map { |h| h.hit[:id].to_s }.uniq.sort
265
+ Util.info "TIP: If you wish to cite all document parts for " \
266
+ "the reference, use `#{pubid} (all parts)`. " \
267
+ "Available: `#{parts.join('`, `')}`.", key: pubid.to_s
268
+ return
269
+ end
270
+ end
271
+
272
+ # Doctype mismatch: search excluding type to find entries with same number but different type
273
+ type_broad = search(pubid, exclude: %i[year type])
274
+ if type_broad.any?
275
+ types = type_broad.map { |h| h.hit[:id].to_s }.uniq.sort
276
+ Util.info "TIP: No match for type, but matches exist: " \
277
+ "`#{types.join('`, `')}`.", key: pubid.to_s
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end