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

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 (702) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +165 -38
  3. data/bin/console +0 -1
  4. data/lib/relaton/3gpp/bibdata.rb +9 -0
  5. data/lib/relaton/3gpp/bibitem.rb +9 -0
  6. data/lib/relaton/3gpp/bibliography.rb +123 -0
  7. data/lib/relaton/3gpp/data_fetcher.rb +303 -0
  8. data/lib/relaton/3gpp/docidentifier.rb +114 -0
  9. data/lib/relaton/3gpp/doctype.rb +9 -0
  10. data/lib/relaton/3gpp/ext.rb +31 -0
  11. data/lib/relaton/3gpp/item.rb +18 -0
  12. data/lib/relaton/3gpp/item_data.rb +15 -0
  13. data/lib/relaton/3gpp/parser.rb +400 -0
  14. data/lib/relaton/3gpp/processor.rb +71 -0
  15. data/lib/relaton/3gpp/release.rb +34 -0
  16. data/lib/relaton/3gpp/util.rb +8 -0
  17. data/lib/relaton/3gpp.rb +29 -0
  18. data/lib/relaton/adobe/bibdata.rb +8 -0
  19. data/lib/relaton/adobe/bibitem.rb +8 -0
  20. data/lib/relaton/adobe/bibliography.rb +92 -0
  21. data/lib/relaton/adobe/docidentifier.rb +49 -0
  22. data/lib/relaton/adobe/doctype.rb +14 -0
  23. data/lib/relaton/adobe/ext.rb +32 -0
  24. data/lib/relaton/adobe/item.rb +15 -0
  25. data/lib/relaton/adobe/item_base.rb +18 -0
  26. data/lib/relaton/adobe/item_data.rb +6 -0
  27. data/lib/relaton/adobe/processor.rb +45 -0
  28. data/lib/relaton/adobe/util.rb +8 -0
  29. data/lib/relaton/adobe.rb +37 -0
  30. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  31. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  32. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  33. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  34. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  35. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  36. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  37. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  38. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  39. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  40. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  41. data/lib/relaton/bib/item_data.rb +229 -0
  42. data/lib/relaton/bib/model/abstract.rb +16 -0
  43. data/lib/relaton/bib/model/address.rb +22 -0
  44. data/lib/relaton/bib/model/affiliation.rb +16 -0
  45. data/lib/relaton/bib/model/bibdata.rb +11 -0
  46. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  47. data/lib/relaton/bib/model/bibitem.rb +11 -0
  48. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  49. data/lib/relaton/bib/model/contact.rb +18 -0
  50. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  51. data/lib/relaton/bib/model/contributor.rb +29 -0
  52. data/lib/relaton/bib/model/copyright.rb +27 -0
  53. data/lib/relaton/bib/model/date.rb +31 -0
  54. data/lib/relaton/bib/model/depiction.rb +16 -0
  55. data/lib/relaton/bib/model/docidentifier.rb +49 -0
  56. data/lib/relaton/bib/model/doctype.rb +14 -0
  57. data/lib/relaton/bib/model/edition.rb +14 -0
  58. data/lib/relaton/bib/model/ext.rb +39 -0
  59. data/lib/relaton/bib/model/extent.rb +16 -0
  60. data/lib/relaton/bib/model/formattedref.rb +43 -0
  61. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  62. data/lib/relaton/bib/model/fullname.rb +11 -0
  63. data/lib/relaton/bib/model/ics.rb +49 -0
  64. data/lib/relaton/bib/model/image.rb +28 -0
  65. data/lib/relaton/bib/model/item.rb +96 -0
  66. data/lib/relaton/bib/model/item_base.rb +20 -0
  67. data/lib/relaton/bib/model/item_shared.rb +88 -0
  68. data/lib/relaton/bib/model/keyword.rb +30 -0
  69. data/lib/relaton/bib/model/locality.rb +18 -0
  70. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  71. data/lib/relaton/bib/model/localized_string.rb +48 -0
  72. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  73. data/lib/relaton/bib/model/logo.rb +14 -0
  74. data/lib/relaton/bib/model/medium.rb +22 -0
  75. data/lib/relaton/bib/model/note.rb +16 -0
  76. data/lib/relaton/bib/model/organization.rb +13 -0
  77. data/lib/relaton/bib/model/organization_type.rb +42 -0
  78. data/lib/relaton/bib/model/person.rb +36 -0
  79. data/lib/relaton/bib/model/phone.rb +14 -0
  80. data/lib/relaton/bib/model/place.rb +33 -0
  81. data/lib/relaton/bib/model/price.rb +14 -0
  82. data/lib/relaton/bib/model/relation.rb +43 -0
  83. data/lib/relaton/bib/model/series.rb +34 -0
  84. data/lib/relaton/bib/model/size.rb +23 -0
  85. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  86. data/lib/relaton/bib/model/status.rb +27 -0
  87. data/lib/relaton/bib/model/structured_identifier.rb +49 -0
  88. data/lib/relaton/bib/model/subdivision.rb +16 -0
  89. data/lib/relaton/bib/model/title.rb +56 -0
  90. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  91. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  92. data/lib/relaton/bib/model/uri.rb +18 -0
  93. data/lib/relaton/bib/model/validity.rb +16 -0
  94. data/lib/relaton/bib/model/version.rb +43 -0
  95. data/lib/relaton/bib/namespace_helper.rb +21 -0
  96. data/lib/relaton/bib/sanitizer.rb +264 -0
  97. data/lib/relaton/bib/util.rb +18 -0
  98. data/lib/relaton/bib/versions.json +35 -0
  99. data/lib/relaton/bib.rb +46 -0
  100. data/lib/relaton/bipm/bibliography.rb +231 -0
  101. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  102. data/lib/relaton/bipm/data_fetcher.rb +81 -0
  103. data/lib/relaton/bipm/data_outcomes_parser.rb +656 -0
  104. data/lib/relaton/bipm/id_parser.rb +278 -0
  105. data/lib/relaton/bipm/item_data.rb +47 -0
  106. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  107. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  108. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  109. data/lib/relaton/bipm/model/doctype.rb +12 -0
  110. data/lib/relaton/bipm/model/ext.rb +38 -0
  111. data/lib/relaton/bipm/model/item.rb +11 -0
  112. data/lib/relaton/bipm/model/structured_identifier.rb +36 -0
  113. data/lib/relaton/bipm/processor.rb +69 -0
  114. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  115. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +172 -0
  116. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  117. data/lib/relaton/bipm/si_brochure_parser.rb +188 -0
  118. data/lib/relaton/bipm/util.rb +8 -0
  119. data/lib/relaton/bipm.rb +38 -0
  120. data/lib/relaton/bsi/bibliography.rb +196 -0
  121. data/lib/relaton/bsi/hit.rb +28 -0
  122. data/lib/relaton/bsi/hit_collection.rb +113 -0
  123. data/lib/relaton/bsi/item_data.rb +13 -0
  124. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  125. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  126. data/lib/relaton/bsi/model/docidentifier.rb +107 -0
  127. data/lib/relaton/bsi/model/doctype.rb +14 -0
  128. data/lib/relaton/bsi/model/ext.rb +17 -0
  129. data/lib/relaton/bsi/model/item.rb +17 -0
  130. data/lib/relaton/bsi/model/item_base.rb +22 -0
  131. data/lib/relaton/bsi/model/relation.rb +9 -0
  132. data/lib/relaton/bsi/processor.rb +43 -0
  133. data/lib/relaton/bsi/schema.json +24882 -0
  134. data/lib/relaton/bsi/scraper.rb +288 -0
  135. data/lib/relaton/bsi/util.rb +8 -0
  136. data/lib/relaton/bsi.rb +25 -0
  137. data/lib/relaton/calconnect/bibliography.rb +93 -0
  138. data/lib/relaton/calconnect/data_fetcher.rb +174 -0
  139. data/lib/relaton/calconnect/docidentifier.rb +80 -0
  140. data/lib/relaton/calconnect/hit.rb +14 -0
  141. data/lib/relaton/calconnect/hit_collection.rb +92 -0
  142. data/lib/relaton/calconnect/item_data.rb +12 -0
  143. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  144. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  145. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  146. data/lib/relaton/calconnect/model/ext.rb +11 -0
  147. data/lib/relaton/calconnect/model/item.rb +20 -0
  148. data/lib/relaton/calconnect/processor.rb +72 -0
  149. data/lib/relaton/calconnect/scraper.rb +87 -0
  150. data/lib/relaton/calconnect/util.rb +8 -0
  151. data/lib/relaton/calconnect.rb +36 -0
  152. data/lib/relaton/ccsds/bibliography.rb +63 -0
  153. data/lib/relaton/ccsds/data/fetcher.rb +252 -0
  154. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  155. data/lib/relaton/ccsds/data/parser.rb +194 -0
  156. data/lib/relaton/ccsds/hit.rb +24 -0
  157. data/lib/relaton/ccsds/hit_collection.rb +47 -0
  158. data/lib/relaton/ccsds/item_data.rb +9 -0
  159. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  160. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  161. data/lib/relaton/ccsds/model/docidentifier.rb +121 -0
  162. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  163. data/lib/relaton/ccsds/model/ext.rb +19 -0
  164. data/lib/relaton/ccsds/model/item.rb +15 -0
  165. data/lib/relaton/ccsds/processor.rb +68 -0
  166. data/lib/relaton/ccsds/util.rb +10 -0
  167. data/lib/relaton/ccsds.rb +33 -0
  168. data/lib/relaton/cen/bibliography.rb +149 -0
  169. data/lib/relaton/cen/committees.yaml +66 -0
  170. data/lib/relaton/cen/hit.rb +31 -0
  171. data/lib/relaton/cen/hit_collection.rb +116 -0
  172. data/lib/relaton/cen/item_data.rb +7 -0
  173. data/lib/relaton/cen/model/bibdata.rb +8 -0
  174. data/lib/relaton/cen/model/bibitem.rb +8 -0
  175. data/lib/relaton/cen/model/docidentifier.rb +100 -0
  176. data/lib/relaton/cen/model/ext.rb +11 -0
  177. data/lib/relaton/cen/model/item.rb +14 -0
  178. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  179. data/lib/relaton/cen/processor.rb +45 -0
  180. data/lib/relaton/cen/scraper.rb +218 -0
  181. data/lib/relaton/cen/util.rb +8 -0
  182. data/lib/relaton/cen.rb +30 -0
  183. data/lib/relaton/cie/bibdata.rb +8 -0
  184. data/lib/relaton/cie/bibitem.rb +8 -0
  185. data/lib/relaton/cie/bibliography.rb +31 -0
  186. data/lib/relaton/cie/data_fetcher.rb +540 -0
  187. data/lib/relaton/cie/ext.rb +7 -0
  188. data/lib/relaton/cie/item.rb +11 -0
  189. data/lib/relaton/cie/item_data.rb +6 -0
  190. data/lib/relaton/cie/processor.rb +68 -0
  191. data/lib/relaton/cie/scrapper.rb +52 -0
  192. data/lib/relaton/cie/util.rb +8 -0
  193. data/lib/relaton/cie.rb +29 -0
  194. data/lib/relaton/core/array_wrapper.rb +20 -0
  195. data/lib/relaton/core/data_fetcher.rb +244 -0
  196. data/lib/relaton/core/date_parser.rb +42 -0
  197. data/lib/relaton/core/governor.rb +320 -0
  198. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  199. data/lib/relaton/core/hit.rb +49 -0
  200. data/lib/relaton/core/hit_collection.rb +118 -0
  201. data/lib/relaton/core/pacer.rb +134 -0
  202. data/lib/relaton/core/processor.rb +67 -0
  203. data/lib/relaton/core/request_error.rb +14 -0
  204. data/lib/relaton/core/workers_pool.rb +45 -0
  205. data/lib/relaton/core.rb +12 -0
  206. data/lib/relaton/db/registry.rb +44 -4
  207. data/lib/relaton/db.rb +0 -1
  208. data/lib/relaton/doi/crossref.rb +89 -0
  209. data/lib/relaton/doi/parser.rb +921 -0
  210. data/lib/relaton/doi/processor.rb +65 -0
  211. data/lib/relaton/doi/util.rb +8 -0
  212. data/lib/relaton/doi.rb +20 -0
  213. data/lib/relaton/easc/bibdata.rb +8 -0
  214. data/lib/relaton/easc/bibitem.rb +8 -0
  215. data/lib/relaton/easc/bibliography.rb +95 -0
  216. data/lib/relaton/easc/docidentifier.rb +100 -0
  217. data/lib/relaton/easc/doctype.rb +14 -0
  218. data/lib/relaton/easc/ext.rb +44 -0
  219. data/lib/relaton/easc/item.rb +13 -0
  220. data/lib/relaton/easc/item_base.rb +18 -0
  221. data/lib/relaton/easc/item_data.rb +6 -0
  222. data/lib/relaton/easc/processor.rb +46 -0
  223. data/lib/relaton/easc/util.rb +8 -0
  224. data/lib/relaton/easc.rb +35 -0
  225. data/lib/relaton/ecma/bibdata.rb +8 -0
  226. data/lib/relaton/ecma/bibitem.rb +8 -0
  227. data/lib/relaton/ecma/bibliography.rb +149 -0
  228. data/lib/relaton/ecma/data_fetcher.rb +162 -0
  229. data/lib/relaton/ecma/data_parser.rb +49 -0
  230. data/lib/relaton/ecma/docidentifier.rb +124 -0
  231. data/lib/relaton/ecma/edition_parser.rb +80 -0
  232. data/lib/relaton/ecma/ext.rb +7 -0
  233. data/lib/relaton/ecma/item.rb +13 -0
  234. data/lib/relaton/ecma/item_data.rb +6 -0
  235. data/lib/relaton/ecma/memento_parser.rb +60 -0
  236. data/lib/relaton/ecma/page_fetcher.rb +39 -0
  237. data/lib/relaton/ecma/parser_common.rb +33 -0
  238. data/lib/relaton/ecma/processor.rb +69 -0
  239. data/lib/relaton/ecma/standard_parser.rb +134 -0
  240. data/lib/relaton/ecma/util.rb +8 -0
  241. data/lib/relaton/ecma.rb +33 -0
  242. data/lib/relaton/etsi/bibdata.rb +10 -0
  243. data/lib/relaton/etsi/bibitem.rb +10 -0
  244. data/lib/relaton/etsi/bibliography.rb +111 -0
  245. data/lib/relaton/etsi/data_fetcher.rb +167 -0
  246. data/lib/relaton/etsi/data_parser.rb +208 -0
  247. data/lib/relaton/etsi/doctype.rb +30 -0
  248. data/lib/relaton/etsi/ext.rb +31 -0
  249. data/lib/relaton/etsi/item.rb +15 -0
  250. data/lib/relaton/etsi/item_data.rb +6 -0
  251. data/lib/relaton/etsi/processor.rb +71 -0
  252. data/lib/relaton/etsi/pubid.rb +37 -0
  253. data/lib/relaton/etsi/status.rb +13 -0
  254. data/lib/relaton/etsi/util.rb +8 -0
  255. data/lib/relaton/etsi.rb +26 -0
  256. data/lib/relaton/gb/bibdata.rb +8 -0
  257. data/lib/relaton/gb/bibitem.rb +8 -0
  258. data/lib/relaton/gb/bibliography.rb +171 -0
  259. data/lib/relaton/gb/ccs.rb +14 -0
  260. data/lib/relaton/gb/committee.rb +13 -0
  261. data/lib/relaton/gb/docidentifier.rb +72 -0
  262. data/lib/relaton/gb/doctype.rb +9 -0
  263. data/lib/relaton/gb/ext.rb +36 -0
  264. data/lib/relaton/gb/gb_scraper.rb +61 -0
  265. data/lib/relaton/gb/gb_type.rb +20 -0
  266. data/lib/relaton/gb/hit.rb +48 -0
  267. data/lib/relaton/gb/hit_collection.rb +19 -0
  268. data/lib/relaton/gb/item.rb +13 -0
  269. data/lib/relaton/gb/item_data.rb +6 -0
  270. data/lib/relaton/gb/processor.rb +49 -0
  271. data/lib/relaton/gb/project_number.rb +38 -0
  272. data/lib/relaton/gb/scraper.rb +221 -0
  273. data/lib/relaton/gb/sec_scraper.rb +92 -0
  274. data/lib/relaton/gb/stage_name.rb +13 -0
  275. data/lib/relaton/gb/structured_identifier.rb +26 -0
  276. data/lib/relaton/gb/t_scraper.rb +126 -0
  277. data/lib/relaton/gb/util.rb +8 -0
  278. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  279. data/lib/relaton/gb.rb +33 -0
  280. data/lib/relaton/gost/bibdata.rb +8 -0
  281. data/lib/relaton/gost/bibitem.rb +8 -0
  282. data/lib/relaton/gost/bibliography.rb +107 -0
  283. data/lib/relaton/gost/docidentifier.rb +80 -0
  284. data/lib/relaton/gost/doctype.rb +16 -0
  285. data/lib/relaton/gost/ext.rb +46 -0
  286. data/lib/relaton/gost/item.rb +15 -0
  287. data/lib/relaton/gost/item_base.rb +18 -0
  288. data/lib/relaton/gost/item_data.rb +6 -0
  289. data/lib/relaton/gost/processor.rb +49 -0
  290. data/lib/relaton/gost/util.rb +8 -0
  291. data/lib/relaton/gost.rb +36 -0
  292. data/lib/relaton/iala/bibdata.rb +8 -0
  293. data/lib/relaton/iala/bibitem.rb +8 -0
  294. data/lib/relaton/iala/bibliography.rb +146 -0
  295. data/lib/relaton/iala/docidentifier.rb +89 -0
  296. data/lib/relaton/iala/doctype.rb +18 -0
  297. data/lib/relaton/iala/ext.rb +32 -0
  298. data/lib/relaton/iala/item.rb +21 -0
  299. data/lib/relaton/iala/item_base.rb +18 -0
  300. data/lib/relaton/iala/item_data.rb +6 -0
  301. data/lib/relaton/iala/processor.rb +43 -0
  302. data/lib/relaton/iala/relation.rb +7 -0
  303. data/lib/relaton/iala/util.rb +8 -0
  304. data/lib/relaton/iala.rb +35 -0
  305. data/lib/relaton/iana/bibdata.rb +8 -0
  306. data/lib/relaton/iana/bibitem.rb +8 -0
  307. data/lib/relaton/iana/bibliography.rb +100 -0
  308. data/lib/relaton/iana/data_fetcher.rb +101 -0
  309. data/lib/relaton/iana/item.rb +7 -0
  310. data/lib/relaton/iana/item_data.rb +6 -0
  311. data/lib/relaton/iana/parser.rb +146 -0
  312. data/lib/relaton/iana/processor.rb +70 -0
  313. data/lib/relaton/iana/util.rb +8 -0
  314. data/lib/relaton/iana.rb +40 -0
  315. data/lib/relaton/iec/bibliography.rb +283 -0
  316. data/lib/relaton/iec/data_fetcher.rb +222 -0
  317. data/lib/relaton/iec/data_parser.rb +391 -0
  318. data/lib/relaton/iec/hit.rb +26 -0
  319. data/lib/relaton/iec/hit_collection.rb +138 -0
  320. data/lib/relaton/iec/item_data.rb +7 -0
  321. data/lib/relaton/iec/model/bibdata.rb +8 -0
  322. data/lib/relaton/iec/model/bibitem.rb +8 -0
  323. data/lib/relaton/iec/model/docidentifier.rb +135 -0
  324. data/lib/relaton/iec/model/doctype.rb +12 -0
  325. data/lib/relaton/iec/model/ext.rb +53 -0
  326. data/lib/relaton/iec/model/item.rb +20 -0
  327. data/lib/relaton/iec/model/item_base.rb +12 -0
  328. data/lib/relaton/iec/model/relation.rb +7 -0
  329. data/lib/relaton/iec/model/stage_name.rb +13 -0
  330. data/lib/relaton/iec/processor.rb +74 -0
  331. data/lib/relaton/iec/statuses.yml +199 -0
  332. data/lib/relaton/iec/util.rb +8 -0
  333. data/lib/relaton/iec.rb +98 -0
  334. data/lib/relaton/ieee/balloting_group.rb +13 -0
  335. data/lib/relaton/ieee/bibdata.rb +8 -0
  336. data/lib/relaton/ieee/bibitem.rb +8 -0
  337. data/lib/relaton/ieee/bibliography.rb +73 -0
  338. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  339. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  340. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  341. data/lib/relaton/ieee/data_fetcher.rb +771 -0
  342. data/lib/relaton/ieee/doctype.rb +9 -0
  343. data/lib/relaton/ieee/editorial_group.rb +19 -0
  344. data/lib/relaton/ieee/ext.rb +36 -0
  345. data/lib/relaton/ieee/idams_parser.rb +330 -0
  346. data/lib/relaton/ieee/item.rb +11 -0
  347. data/lib/relaton/ieee/item_data.rb +7 -0
  348. data/lib/relaton/ieee/processor.rb +71 -0
  349. data/lib/relaton/ieee/rawbib_id_parser.rb +753 -0
  350. data/lib/relaton/ieee/util.rb +8 -0
  351. data/lib/relaton/ieee.rb +30 -0
  352. data/lib/relaton/ietf/bibdata.rb +8 -0
  353. data/lib/relaton/ietf/bibitem.rb +8 -0
  354. data/lib/relaton/ietf/bibliography.rb +35 -0
  355. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  356. data/lib/relaton/ietf/data_fetcher.rb +561 -0
  357. data/lib/relaton/ietf/doctype.rb +9 -0
  358. data/lib/relaton/ietf/ext.rb +63 -0
  359. data/lib/relaton/ietf/item.rb +16 -0
  360. data/lib/relaton/ietf/item_base.rb +18 -0
  361. data/lib/relaton/ietf/item_data.rb +6 -0
  362. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  363. data/lib/relaton/ietf/processor.rb +72 -0
  364. data/lib/relaton/ietf/relation.rb +9 -0
  365. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  366. data/lib/relaton/ietf/rfc/author.rb +21 -0
  367. data/lib/relaton/ietf/rfc/entry.rb +446 -0
  368. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  369. data/lib/relaton/ietf/rfc/format.rb +19 -0
  370. data/lib/relaton/ietf/rfc/index.rb +46 -0
  371. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  372. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  373. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  374. data/lib/relaton/ietf/scraper.rb +101 -0
  375. data/lib/relaton/ietf/util.rb +8 -0
  376. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  377. data/lib/relaton/ietf.rb +30 -0
  378. data/lib/relaton/iho/bibdata.rb +8 -0
  379. data/lib/relaton/iho/bibitem.rb +8 -0
  380. data/lib/relaton/iho/bibliography.rb +114 -0
  381. data/lib/relaton/iho/comment_period.rb +13 -0
  382. data/lib/relaton/iho/docidentifier.rb +31 -0
  383. data/lib/relaton/iho/doctype.rb +10 -0
  384. data/lib/relaton/iho/ext.rb +20 -0
  385. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  386. data/lib/relaton/iho/item.rb +20 -0
  387. data/lib/relaton/iho/item_base.rb +18 -0
  388. data/lib/relaton/iho/item_data.rb +6 -0
  389. data/lib/relaton/iho/processor.rb +54 -0
  390. data/lib/relaton/iho/relation.rb +9 -0
  391. data/lib/relaton/iho/structured_identifier.rb +20 -0
  392. data/lib/relaton/iho/util.rb +8 -0
  393. data/lib/relaton/iho.rb +27 -0
  394. data/lib/relaton/index/config.rb +52 -0
  395. data/lib/relaton/index/file_io.rb +305 -0
  396. data/lib/relaton/index/file_storage.rb +66 -0
  397. data/lib/relaton/index/pool.rb +46 -0
  398. data/lib/relaton/index/shard_source.rb +201 -0
  399. data/lib/relaton/index/type.rb +210 -0
  400. data/lib/relaton/index/util.rb +18 -0
  401. data/lib/relaton/index.rb +61 -0
  402. data/lib/relaton/isbn/isbn.rb +61 -0
  403. data/lib/relaton/isbn/open_library.rb +43 -0
  404. data/lib/relaton/isbn/parser.rb +88 -0
  405. data/lib/relaton/isbn/processor.rb +48 -0
  406. data/lib/relaton/isbn/util.rb +8 -0
  407. data/lib/relaton/isbn.rb +19 -0
  408. data/lib/relaton/iso/bibliography.rb +412 -0
  409. data/lib/relaton/iso/data_fetcher.rb +338 -0
  410. data/lib/relaton/iso/data_parser.rb +458 -0
  411. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  412. data/lib/relaton/iso/hit.rb +57 -0
  413. data/lib/relaton/iso/hit_collection.rb +196 -0
  414. data/lib/relaton/iso/item_data.rb +50 -0
  415. data/lib/relaton/iso/model/bibdata.rb +10 -0
  416. data/lib/relaton/iso/model/bibitem.rb +8 -0
  417. data/lib/relaton/iso/model/contributor.rb +6 -0
  418. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  419. data/lib/relaton/iso/model/docidentifier.rb +146 -0
  420. data/lib/relaton/iso/model/doctype.rb +13 -0
  421. data/lib/relaton/iso/model/ext.rb +35 -0
  422. data/lib/relaton/iso/model/item.rb +17 -0
  423. data/lib/relaton/iso/model/item_base.rb +22 -0
  424. data/lib/relaton/iso/model/organization.rb +9 -0
  425. data/lib/relaton/iso/model/project_number.rb +22 -0
  426. data/lib/relaton/iso/model/relation.rb +9 -0
  427. data/lib/relaton/iso/model/stagename.rb +14 -0
  428. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  429. data/lib/relaton/iso/processor.rb +85 -0
  430. data/lib/relaton/iso/scraper.rb +635 -0
  431. data/lib/relaton/iso/type/pubid.rb +50 -0
  432. data/lib/relaton/iso/util.rb +8 -0
  433. data/lib/relaton/iso.rb +30 -0
  434. data/lib/relaton/itu/bibliography.rb +95 -0
  435. data/lib/relaton/itu/data_crawler_r.rb +664 -0
  436. data/lib/relaton/itu/data_fetcher.rb +550 -0
  437. data/lib/relaton/itu/data_merge_r.rb +149 -0
  438. data/lib/relaton/itu/data_parser_r.rb +214 -0
  439. data/lib/relaton/itu/data_parser_t.rb +228 -0
  440. data/lib/relaton/itu/family_cache.rb +177 -0
  441. data/lib/relaton/itu/governor.rb +56 -0
  442. data/lib/relaton/itu/hit.rb +28 -0
  443. data/lib/relaton/itu/hit_collection.rb +299 -0
  444. data/lib/relaton/itu/item_data.rb +6 -0
  445. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  446. data/lib/relaton/itu/model/bibdata.rb +8 -0
  447. data/lib/relaton/itu/model/bibitem.rb +8 -0
  448. data/lib/relaton/itu/model/docidentifier.rb +75 -0
  449. data/lib/relaton/itu/model/doctype.rb +13 -0
  450. data/lib/relaton/itu/model/ext.rb +47 -0
  451. data/lib/relaton/itu/model/item.rb +13 -0
  452. data/lib/relaton/itu/model/meeting.rb +13 -0
  453. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  454. data/lib/relaton/itu/model/question.rb +13 -0
  455. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  456. data/lib/relaton/itu/model/structured_identifier.rb +38 -0
  457. data/lib/relaton/itu/processor.rb +72 -0
  458. data/lib/relaton/itu/pubid.rb +199 -0
  459. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  460. data/lib/relaton/itu/recommendation_fields.rb +334 -0
  461. data/lib/relaton/itu/recommendation_parser.rb +30 -0
  462. data/lib/relaton/itu/scraper.rb +203 -0
  463. data/lib/relaton/itu/util.rb +8 -0
  464. data/lib/relaton/itu.rb +34 -0
  465. data/lib/relaton/jcgm/bibdata.rb +8 -0
  466. data/lib/relaton/jcgm/bibitem.rb +8 -0
  467. data/lib/relaton/jcgm/bibliography.rb +97 -0
  468. data/lib/relaton/jcgm/data_fetcher.rb +81 -0
  469. data/lib/relaton/jcgm/docidentifier.rb +102 -0
  470. data/lib/relaton/jcgm/doctype.rb +12 -0
  471. data/lib/relaton/jcgm/ext.rb +23 -0
  472. data/lib/relaton/jcgm/item.rb +20 -0
  473. data/lib/relaton/jcgm/item_base.rb +18 -0
  474. data/lib/relaton/jcgm/item_data.rb +6 -0
  475. data/lib/relaton/jcgm/meetings_parser.rb +175 -0
  476. data/lib/relaton/jcgm/processor.rb +71 -0
  477. data/lib/relaton/jcgm/relation.rb +9 -0
  478. data/lib/relaton/jcgm/structured_identifier.rb +40 -0
  479. data/lib/relaton/jcgm/util.rb +8 -0
  480. data/lib/relaton/jcgm.rb +24 -0
  481. data/lib/relaton/jis/bibdata.rb +8 -0
  482. data/lib/relaton/jis/bibitem.rb +8 -0
  483. data/lib/relaton/jis/bibliography.rb +73 -0
  484. data/lib/relaton/jis/data_fetcher.rb +183 -0
  485. data/lib/relaton/jis/docidentifier.rb +120 -0
  486. data/lib/relaton/jis/doctype.rb +9 -0
  487. data/lib/relaton/jis/ext.rb +13 -0
  488. data/lib/relaton/jis/hit.rb +88 -0
  489. data/lib/relaton/jis/hit_collection.rb +128 -0
  490. data/lib/relaton/jis/item.rb +22 -0
  491. data/lib/relaton/jis/item_base.rb +26 -0
  492. data/lib/relaton/jis/item_data.rb +8 -0
  493. data/lib/relaton/jis/processor.rb +55 -0
  494. data/lib/relaton/jis/relation.rb +11 -0
  495. data/lib/relaton/jis/scraper.rb +232 -0
  496. data/lib/relaton/jis/structured_identifier.rb +13 -0
  497. data/lib/relaton/jis/util.rb +8 -0
  498. data/lib/relaton/jis.rb +32 -0
  499. data/lib/relaton/logger/channels/gh_issue.rb +143 -0
  500. data/lib/relaton/logger/config.rb +34 -0
  501. data/lib/relaton/logger/formatter_json.rb +8 -0
  502. data/lib/relaton/logger/formatter_string.rb +12 -0
  503. data/lib/relaton/logger/log.rb +64 -0
  504. data/lib/relaton/logger/log_device.rb +27 -0
  505. data/lib/relaton/logger/pool.rb +24 -0
  506. data/lib/relaton/logger.rb +18 -0
  507. data/lib/relaton/nist/bibdata.rb +8 -0
  508. data/lib/relaton/nist/bibitem.rb +8 -0
  509. data/lib/relaton/nist/bibliography.rb +191 -0
  510. data/lib/relaton/nist/comment_period.rb +15 -0
  511. data/lib/relaton/nist/data_fetcher.rb +134 -0
  512. data/lib/relaton/nist/date.rb +7 -0
  513. data/lib/relaton/nist/docidentifier.rb +165 -0
  514. data/lib/relaton/nist/doctype.rb +7 -0
  515. data/lib/relaton/nist/ext.rb +16 -0
  516. data/lib/relaton/nist/hit.rb +18 -0
  517. data/lib/relaton/nist/hit_collection.rb +362 -0
  518. data/lib/relaton/nist/item.rb +19 -0
  519. data/lib/relaton/nist/item_base.rb +16 -0
  520. data/lib/relaton/nist/item_data.rb +6 -0
  521. data/lib/relaton/nist/mods_parser.rb +302 -0
  522. data/lib/relaton/nist/processor.rb +69 -0
  523. data/lib/relaton/nist/pubs_export.rb +69 -0
  524. data/lib/relaton/nist/relation.rb +10 -0
  525. data/lib/relaton/nist/scraper.rb +293 -0
  526. data/lib/relaton/nist/series.yaml +49 -0
  527. data/lib/relaton/nist/util.rb +8 -0
  528. data/lib/relaton/nist.rb +34 -0
  529. data/lib/relaton/oasis/bibdata.rb +8 -0
  530. data/lib/relaton/oasis/bibitem.rb +8 -0
  531. data/lib/relaton/oasis/bibliography.rb +201 -0
  532. data/lib/relaton/oasis/browser_agent.rb +71 -0
  533. data/lib/relaton/oasis/data_fetcher.rb +130 -0
  534. data/lib/relaton/oasis/data_parser.rb +305 -0
  535. data/lib/relaton/oasis/data_parser_utils.rb +330 -0
  536. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  537. data/lib/relaton/oasis/docidentifier.rb +54 -0
  538. data/lib/relaton/oasis/doctype.rb +7 -0
  539. data/lib/relaton/oasis/ext.rb +19 -0
  540. data/lib/relaton/oasis/item.rb +14 -0
  541. data/lib/relaton/oasis/item_data.rb +6 -0
  542. data/lib/relaton/oasis/processor.rb +74 -0
  543. data/lib/relaton/oasis/util.rb +8 -0
  544. data/lib/relaton/oasis.rb +41 -0
  545. data/lib/relaton/ogc/bibdata.rb +8 -0
  546. data/lib/relaton/ogc/bibitem.rb +8 -0
  547. data/lib/relaton/ogc/bibliography.rb +64 -0
  548. data/lib/relaton/ogc/data_fetcher.rb +131 -0
  549. data/lib/relaton/ogc/docidentifier.rb +111 -0
  550. data/lib/relaton/ogc/doctype.rb +12 -0
  551. data/lib/relaton/ogc/ext.rb +15 -0
  552. data/lib/relaton/ogc/hit.rb +18 -0
  553. data/lib/relaton/ogc/hit_collection.rb +111 -0
  554. data/lib/relaton/ogc/item.rb +13 -0
  555. data/lib/relaton/ogc/item_data.rb +6 -0
  556. data/lib/relaton/ogc/processor.rb +59 -0
  557. data/lib/relaton/ogc/scraper.rb +225 -0
  558. data/lib/relaton/ogc/util.rb +8 -0
  559. data/lib/relaton/ogc.rb +30 -0
  560. data/lib/relaton/oiml/bibdata.rb +8 -0
  561. data/lib/relaton/oiml/bibitem.rb +8 -0
  562. data/lib/relaton/oiml/bibliography.rb +169 -0
  563. data/lib/relaton/oiml/docidentifier.rb +48 -0
  564. data/lib/relaton/oiml/doctype.rb +13 -0
  565. data/lib/relaton/oiml/ext.rb +42 -0
  566. data/lib/relaton/oiml/item.rb +20 -0
  567. data/lib/relaton/oiml/item_base.rb +18 -0
  568. data/lib/relaton/oiml/item_data.rb +6 -0
  569. data/lib/relaton/oiml/processor.rb +54 -0
  570. data/lib/relaton/oiml/relation.rb +9 -0
  571. data/lib/relaton/oiml/util.rb +8 -0
  572. data/lib/relaton/oiml.rb +24 -0
  573. data/lib/relaton/omg/bibdata.rb +8 -0
  574. data/lib/relaton/omg/bibitem.rb +8 -0
  575. data/lib/relaton/omg/bibliography.rb +31 -0
  576. data/lib/relaton/omg/docidentifier.rb +67 -0
  577. data/lib/relaton/omg/ext.rb +7 -0
  578. data/lib/relaton/omg/item.rb +9 -0
  579. data/lib/relaton/omg/item_data.rb +6 -0
  580. data/lib/relaton/omg/processor.rb +35 -0
  581. data/lib/relaton/omg/scraper.rb +186 -0
  582. data/lib/relaton/omg/util.rb +8 -0
  583. data/lib/relaton/omg.rb +25 -0
  584. data/lib/relaton/plateau/bibdata.rb +8 -0
  585. data/lib/relaton/plateau/bibitem.rb +8 -0
  586. data/lib/relaton/plateau/bibliography.rb +31 -0
  587. data/lib/relaton/plateau/data_fetcher.rb +176 -0
  588. data/lib/relaton/plateau/doctype.rb +7 -0
  589. data/lib/relaton/plateau/ext.rb +23 -0
  590. data/lib/relaton/plateau/handbook_parser.rb +102 -0
  591. data/lib/relaton/plateau/hit.rb +21 -0
  592. data/lib/relaton/plateau/hit_collection.rb +79 -0
  593. data/lib/relaton/plateau/item.rb +12 -0
  594. data/lib/relaton/plateau/item_data.rb +6 -0
  595. data/lib/relaton/plateau/parser.rb +101 -0
  596. data/lib/relaton/plateau/processor.rb +51 -0
  597. data/lib/relaton/plateau/technical_report_parser.rb +98 -0
  598. data/lib/relaton/plateau/util.rb +8 -0
  599. data/lib/relaton/plateau.rb +29 -0
  600. data/lib/relaton/sdo/config.rb +34 -0
  601. data/lib/relaton/sdo/fetcher.rb +52 -0
  602. data/lib/relaton/sdo/logo.rb +95 -0
  603. data/lib/relaton/sdo/name.rb +26 -0
  604. data/lib/relaton/sdo/organization.rb +71 -0
  605. data/lib/relaton/sdo/store.rb +49 -0
  606. data/lib/relaton/sdo.rb +29 -0
  607. data/lib/relaton/un/bibdata.rb +8 -0
  608. data/lib/relaton/un/bibitem.rb +8 -0
  609. data/lib/relaton/un/bibliography.rb +48 -0
  610. data/lib/relaton/un/doctype.rb +10 -0
  611. data/lib/relaton/un/ext.rb +30 -0
  612. data/lib/relaton/un/hit.rb +56 -0
  613. data/lib/relaton/un/hit_collection.rb +61 -0
  614. data/lib/relaton/un/item.rb +11 -0
  615. data/lib/relaton/un/item_data.rb +6 -0
  616. data/lib/relaton/un/parser.rb +108 -0
  617. data/lib/relaton/un/processor.rb +38 -0
  618. data/lib/relaton/un/session.rb +25 -0
  619. data/lib/relaton/un/token_generator.rb +105 -0
  620. data/lib/relaton/un/util.rb +8 -0
  621. data/lib/relaton/un/wasm/decoder.rb +434 -0
  622. data/lib/relaton/un/wasm/instance.rb +101 -0
  623. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  624. data/lib/relaton/un/wasm/memory.rb +112 -0
  625. data/lib/relaton/un/wasm/module.rb +47 -0
  626. data/lib/relaton/un/wasm.rb +17 -0
  627. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  628. data/lib/relaton/un.rb +28 -0
  629. data/lib/relaton/version.rb +1 -1
  630. data/lib/relaton/w3c/bibdata.rb +8 -0
  631. data/lib/relaton/w3c/bibitem.rb +8 -0
  632. data/lib/relaton/w3c/bibliography.rb +174 -0
  633. data/lib/relaton/w3c/data_fetcher.rb +487 -0
  634. data/lib/relaton/w3c/data_parser.rb +379 -0
  635. data/lib/relaton/w3c/docidentifier.rb +48 -0
  636. data/lib/relaton/w3c/doctype.rb +7 -0
  637. data/lib/relaton/w3c/ext.rb +11 -0
  638. data/lib/relaton/w3c/governor.rb +32 -0
  639. data/lib/relaton/w3c/item.rb +15 -0
  640. data/lib/relaton/w3c/item_data.rb +6 -0
  641. data/lib/relaton/w3c/processor.rb +49 -0
  642. data/lib/relaton/w3c/pubid.rb +85 -0
  643. data/lib/relaton/w3c/safe_realize.rb +148 -0
  644. data/lib/relaton/w3c/util.rb +8 -0
  645. data/lib/relaton/w3c.rb +36 -0
  646. data/lib/relaton/xsf/bibdata.rb +8 -0
  647. data/lib/relaton/xsf/bibitem.rb +8 -0
  648. data/lib/relaton/xsf/bibliography.rb +84 -0
  649. data/lib/relaton/xsf/data_fetcher.rb +106 -0
  650. data/lib/relaton/xsf/docidentifier.rb +46 -0
  651. data/lib/relaton/xsf/hit.rb +17 -0
  652. data/lib/relaton/xsf/hit_collection.rb +52 -0
  653. data/lib/relaton/xsf/item.rb +13 -0
  654. data/lib/relaton/xsf/item_data.rb +6 -0
  655. data/lib/relaton/xsf/processor.rb +51 -0
  656. data/lib/relaton/xsf/util.rb +9 -0
  657. data/lib/relaton/xsf.rb +34 -0
  658. data/lib/relaton-core.rb +1 -0
  659. data/lib/relaton.rb +85 -0
  660. metadata +775 -161
  661. data/.github/workflows/rake.yml +0 -14
  662. data/.github/workflows/release.yml +0 -24
  663. data/.github/workflows/rubocop.yml +0 -48
  664. data/.gitignore +0 -12
  665. data/.rspec +0 -3
  666. data/CLAUDE.md +0 -78
  667. data/Gemfile +0 -29
  668. data/Rakefile +0 -6
  669. data/docs/CHANGELOG.adoc +0 -16
  670. data/docs/VERSIONING_POLICY.adoc +0 -38
  671. data/docs/navigation.adoc +0 -6
  672. data/lib/relaton/db/version.rb +0 -5
  673. data/relaton.gemspec +0 -72
  674. data/spec/relaton/config_spec.rb +0 -10
  675. data/spec/relaton/db_cache_spec.rb +0 -51
  676. data/spec/relaton/db_spec.rb +0 -567
  677. data/spec/relaton/registry_spec.rb +0 -178
  678. data/spec/relaton/util_spec.rb +0 -3
  679. data/spec/relaton_meta_spec.rb +0 -25
  680. data/spec/relaton_spec.rb +0 -800
  681. data/spec/spec_helper.rb +0 -45
  682. data/spec/support/gb_t_20223_2006.xml +0 -33
  683. data/spec/support/iso_111111119115_1.xml +0 -0
  684. data/spec/support/iso_19115_1.xml +0 -115
  685. data/spec/support/iso_19115_2.xml +0 -95
  686. data/spec/support/rfc_8341.xml +0 -46
  687. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  688. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  689. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  690. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  691. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  692. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  693. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  694. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  695. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  696. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  697. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  698. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  699. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  700. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  701. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  702. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,24 @@
1
+ module Relaton::Logger
2
+ class Pool
3
+ extend Forwardable
4
+ def_delegators :@loggers, :[], :[]=, :size, :each
5
+
6
+ attr_accessor :loggers
7
+
8
+ def initialize
9
+ @loggers = {}
10
+ end
11
+
12
+ def unknown(message = nil, progname = nil, **args, &block)
13
+ @loggers.each { |_, logger| logger.send(__callee__, message, progname, **args, &block) }
14
+ nil
15
+ end
16
+
17
+ %i[fatal error warn info debug].each { |m| alias_method m, :unknown }
18
+
19
+ def truncate
20
+ @loggers.each { |_, logger| logger.truncate }
21
+ nil
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+ require "logger"
5
+ require_relative "version"
6
+ require_relative "logger/log"
7
+ require_relative "logger/log_device"
8
+ require_relative "logger/pool"
9
+ require_relative "logger/formatter_string"
10
+ require_relative "logger/formatter_json"
11
+ require_relative "logger/config"
12
+ require_relative "logger/channels/gh_issue"
13
+
14
+ module Relaton
15
+ def self.logger_pool
16
+ Logger.configuration.logger_pool
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Nist
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 Nist
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,191 @@
1
+ module Relaton
2
+ module Nist
3
+ class Bibliography
4
+ extend Core::DateParser
5
+
6
+ class << self
7
+ #
8
+ # Search NIST documents by reference
9
+ #
10
+ # @param text [String] reference
11
+ #
12
+ # @return [Relaton::Nist::HitCollection] search result
13
+ #
14
+ def search(text, year = nil, opts = {})
15
+ ref = text.sub(/^NISTIR/, "NIST IR").sub(/\/Add/, " Add")
16
+ # pubid 2.x only recognizes the addendum marker with a trailing
17
+ # period, and only splits an uppercase part letter — canonicalize
18
+ # both ("800-38a Add" -> "800-38A Add.") so @reference parses to the
19
+ # same pubid the index/CSRC carry.
20
+ ref = ref.sub(/\bAdd\b\.?/i, "Add.").sub(/([0-9])([a-z])(?=\s+Add\.)/) { "#{$1}#{$2.upcase}" }
21
+ HitCollection.search ref, year, opts
22
+ rescue OpenURI::HTTPError, SocketError, OpenSSL::SSL::SSLError => e
23
+ raise Relaton::RequestError, e.message
24
+ end
25
+
26
+ #
27
+ # Get NIST document by reference
28
+ #
29
+ # @param code [String] the NIST standard Code to look up
30
+ # @param year [String] the year the standard was published (optional)
31
+ # @param opts [Hash] options
32
+ # @option opts [Boolean] :all_parts restricted to all parts
33
+ #
34
+ # @return [Relaton::Nist::ItemData, nil] bibliographic item
35
+ #
36
+ def get(code, year = nil, opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
37
+ return fetch_ref_err(code, year, []) if code.match?(/\sEP$/)
38
+
39
+ /^(?<code2>[^(]+)(?:\((?<date2>\w+\s(?:\d{2},\s)?\d{4})\))?\s?\(?(?:(?<=\()(?<stage>(?:I|F|\d)PD))?/ =~ code
40
+ stage ||= /(?<=\.)PD-\w+(?=\.)/.match(code)&.to_s
41
+ if code2
42
+ code = code2.strip
43
+ opts[:date] = parse_date(date2, str: false) if date2
44
+ opts[:stage] = stage if stage
45
+ end
46
+
47
+ if year.nil?
48
+ /^(?<code1>[^:]+):(?<year1>[^:]+)$/ =~ code
49
+ unless code1.nil?
50
+ code = code1
51
+ year = year1
52
+ end
53
+ end
54
+
55
+ code += "-1" if opts[:all_parts]
56
+ nistbib_get(code, year, opts)
57
+ end
58
+
59
+ private
60
+
61
+ #
62
+ # Get NIST document by reference
63
+ #
64
+ # @param [String] code reference
65
+ # @param [String] year year
66
+ # @param [Hash] opts options
67
+ #
68
+ # @return [Relaton::Nist::ItemData, nil] bibliographic item
69
+ #
70
+ def nistbib_get(code, year, opts)
71
+ result = nistbib_search_filter(code, year, opts) || (return nil)
72
+ ret = nistbib_results_filter(result, year, opts)
73
+ if ret[:ret]
74
+ Util.info "Found: `#{ret[:ret].docidentifier.first.content}`", key: result.reference
75
+ ret[:ret]
76
+ else
77
+ fetch_ref_err(result.reference, year, ret[:years])
78
+ end
79
+ end
80
+
81
+ #
82
+ # Sort through results, return first match by code, year, and title
83
+ #
84
+ # @param opts [Hash] options
85
+ # @option opts [Date] :date date filter
86
+ # @option opts [String] :stage stage filter
87
+ #
88
+ # @return [Hash] result
89
+ #
90
+ def nistbib_results_filter(result, year, opts)
91
+ missed_years = []
92
+ iteration = parse_iteration(opts[:stage])
93
+
94
+ # A stageless query means "the published document". Multiple
95
+ # editions can match once stage is excluded (e.g. a final "r2"
96
+ # and its draft "Rev. 2 ipd"), so try published hits before
97
+ # drafts. An explicit stage keeps the original order. Stable
98
+ # partition preserves existing tie-order among finals.
99
+ ordered = if iteration
100
+ result.array
101
+ else
102
+ result.array.sort_by.with_index { |h, i| [draft_hit?(h) ? 1 : 0, i] }
103
+ end
104
+
105
+ ordered.each do |h|
106
+ r = h.item
107
+ next if opts[:date] && !match_date?(r, opts[:date])
108
+ next if iteration && r.status&.iteration != iteration
109
+ return { ret: r } unless year
110
+ next unless match_year?(r, year) { |y| missed_years << y }
111
+
112
+ return { ret: r }
113
+ end
114
+ { years: missed_years }
115
+ end
116
+
117
+ # A hit is a draft when its CSRC status says so (e.g. "draft-public")
118
+ # or its rendered code carries a PD stage marker (ipd/fpd/NpD).
119
+ def draft_hit?(hit)
120
+ hit.hit[:status].to_s.include?("draft") ||
121
+ hit.hit[:code].to_s.match?(/(?:\bi|\bf|\b\d)pd\b|\(Draft\)/i)
122
+ end
123
+
124
+ def parse_iteration(stage)
125
+ iter = /\w+(?=PD)|(?<=PD-)\w+/.match(stage)&.to_s
126
+ case iter
127
+ when "I" then "1"
128
+ when "F" then "final"
129
+ else iter
130
+ end
131
+ end
132
+
133
+ def match_date?(item, date)
134
+ item.date.any? do |d|
135
+ date_val = d.at || d.from
136
+ date_val && parse_date(date_val.to_s, str: false) == date
137
+ end
138
+ end
139
+
140
+ def match_year?(item, year)
141
+ item.date.select { |d| d.type == "published" || d.type == "issued" }.each do |d|
142
+ date_val = d.at || d.from
143
+ next unless date_val
144
+
145
+ parsed_year = parse_date(date_val.to_s, str: false)&.year
146
+ return parsed_year if year.to_i == parsed_year
147
+
148
+ yield parsed_year if block_given?
149
+ end
150
+ nil
151
+ end
152
+
153
+ #
154
+ # Get search results and filter them by code and year
155
+ #
156
+ # @param code [String] reference
157
+ # @param year [String, nil] year
158
+ # @param opts [Hash] options
159
+ #
160
+ # @return [Relaton::Nist::HitCollection] hits collection
161
+ #
162
+ def nistbib_search_filter(code, year, opts)
163
+ result = search(code, year, opts)
164
+ result.search_filter
165
+ end
166
+
167
+ #
168
+ # Outputs warning message if no match found
169
+ #
170
+ # @param [String] ref reference
171
+ # @param [String, nil] year year
172
+ # @param [Array<String>] missed_years missed years
173
+ #
174
+ # @return [nil] nil
175
+ #
176
+ def fetch_ref_err(ref, year, missed_years)
177
+ Util.info "Not found.", key: ref
178
+ unless missed_years.empty?
179
+ Util.info "(There was no match for #{year}, though there " \
180
+ "were matches found for `#{missed_years.join('`, `')}`.)", key: ref
181
+ end
182
+ if /\d-\d/.match? ref
183
+ Util.info "The provided document part may not exist, " \
184
+ "or the document may no longer be published in parts.", key: ref
185
+ end
186
+ nil
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,15 @@
1
+ module Relaton
2
+ module Nist
3
+ class CommentPeriod < Lutaml::Model::Serializable
4
+ attribute :from, :date
5
+ attribute :to, :date
6
+ attribute :extended, :date
7
+
8
+ xml do
9
+ map_element "from", to: :from
10
+ map_element "to", to: :to
11
+ map_element "extended", to: :extended
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "mechanize"
5
+ require "loc_mods"
6
+ require_relative "../nist"
7
+ require_relative "mods_parser"
8
+
9
+ module Relaton
10
+ module Nist
11
+ class DataFetcher < Core::DataFetcher
12
+ RELEASES_URL = "https://github.com/usnistgov/NIST-Tech-Pubs/releases"
13
+ MODS_ASSET = "allrecords-MODS.xml"
14
+
15
+ def fetch(source = nil)
16
+ FileUtils.rm Dir[File.join(@output, "*.#{@ext}")]
17
+ fetch_tech_pubs source
18
+ # add_static_files
19
+ index.save
20
+ report_errors
21
+ end
22
+
23
+ def fetch_tech_pubs(source = nil)
24
+ xml_data = Mechanize.new.get(source_url(source)).body
25
+ docs = LocMods::Collection.from_xml xml_data
26
+ docs.mods.each { |doc| write_file ModsParser.new(doc, series, @errors).parse }
27
+ end
28
+
29
+ # Build the MODS download URL for a NIST-Tech-Pubs release. With no tag
30
+ # (nil, blank, or "latest") use GitHub's `latest/download` redirect so new
31
+ # releases are picked up automatically by the crawler; a concrete tag
32
+ # (e.g. "June2026") pins that specific release.
33
+ def source_url(source = nil)
34
+ tag = source.to_s.strip
35
+ path = tag.empty? || tag.casecmp?("latest") ? "latest/download" : "download/#{tag}"
36
+ "#{RELEASES_URL}/#{path}/#{MODS_ASSET}"
37
+ end
38
+
39
+ def write_file(bib)
40
+ id = bib.docidentifier.find(&:primary) || bib.docidentifier.first
41
+ unless id
42
+ failures << "Document skipped: no identifier (#{document_label(bib)})"
43
+ return
44
+ end
45
+ # Distinct docids can sanitize to one filename; take a path of our own
46
+ # rather than overwriting the other document (Core#unique_output_file).
47
+ docid = id.content.sub(/^NIST IR/, "NISTIR")
48
+ file = unique_output_file docid
49
+ if @files.include? file
50
+ # Same reserved path == same docid: a genuine duplicate. Checked FIRST,
51
+ # because a disambiguated path stays != output_file forever.
52
+ Util.warn "File #{file} exists. Docid: #{id.content}"
53
+ elsif file != output_file(docid)
54
+ Util.warn "File #{output_file docid} exists. Docid: #{id.content}. Writing #{file} instead."
55
+ end
56
+ @files << file
57
+ pid = pubid id.content
58
+ if pid
59
+ index.add_or_update pid, file
60
+ else
61
+ failures << "Unparseable id `#{id.content}` was not indexed (#{file})"
62
+ end
63
+ File.write file, serialize(bib), encoding: "UTF-8"
64
+ end
65
+
66
+ # A human-readable label for a bib with no usable docidentifier, so the
67
+ # skipped record is identifiable in the reported error.
68
+ def document_label(bib)
69
+ Array(bib.title).map(&:content).compact.reject(&:empty?).first || "unknown title"
70
+ end
71
+
72
+ # Parse a docidentifier string into a Pubid::Nist::Identifier, or nil if
73
+ # pubid can't parse it — so a single bad id never aborts the crawl or
74
+ # corrupts index-v2. The caller records the failure (see #write_file) so
75
+ # #report_errors can surface it as a tracked GitHub issue.
76
+ def pubid(id)
77
+ ::Pubid::Nist::Identifier.parse id
78
+ rescue StandardError
79
+ nil
80
+ end
81
+
82
+ # Per-document failures (unparseable ids, identifier-less records)
83
+ # collected during the crawl and surfaced by #report_errors.
84
+ def failures
85
+ @failures ||= []
86
+ end
87
+
88
+ # Surface accumulated per-document failures through the shared error
89
+ # machinery (the "Error fetching documents" GitHub issue in CI) so they
90
+ # are visible and tracked, not a hard crash or a silent stderr warning.
91
+ # The gh_issue channel is registered inside #report_errors, so emit these
92
+ # at :error (via #log_error) after it is set up and before super creates
93
+ # the issue.
94
+ def report_errors
95
+ gh_issue
96
+ failures.each { |msg| log_error msg }
97
+ super
98
+ end
99
+
100
+ # def add_static_files
101
+ # Dir["./static/*.yaml"].each do |file|
102
+ # bib = Item.from_yaml(File.read(file, encoding: "UTF-8"))
103
+ # index.add_or_update bib.docidentifier[0].content, file
104
+ # end
105
+ # end
106
+
107
+ def to_yaml(bib)
108
+ Item.to_yaml(bib)
109
+ end
110
+
111
+ def to_xml(bib)
112
+ Bibdata.to_xml(bib)
113
+ end
114
+
115
+ def to_bibxml(bib)
116
+ bib.to_rfcxml
117
+ end
118
+
119
+ def log_error(msg)
120
+ Util.error msg
121
+ end
122
+
123
+ def index
124
+ @index ||= Relaton::Index.find_or_create(
125
+ :nist, file: "#{INDEXFILE}.yaml", pubid_class: ::Pubid::Nist::Identifier
126
+ )
127
+ end
128
+
129
+ def series
130
+ @series ||= YAML.load_file File.expand_path("series.yaml", __dir__)
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,7 @@
1
+ module Relaton
2
+ module Nist
3
+ class Date < Bib::Date
4
+ attribute :type, :string, values: %w[abandoned superseded]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,165 @@
1
+ module Relaton
2
+ module Nist
3
+ # NIST document identifier backed by a parsed Pubid::Nist::Identifier.
4
+ #
5
+ # Mirrors the CCSDS/IEC flavors (lib/relaton/ccsds/model/docidentifier.rb,
6
+ # lib/relaton/iec/model/docidentifier.rb): the lutaml `content` stays a plain
7
+ # string for serialization, while the parsed pubid is kept in `@pubid` so the
8
+ # base class's abstract structural mutators (`remove_part!`, `remove_date!`,
9
+ # `to_all_parts!`) can edit the identifier graph and re-render.
10
+ #
11
+ # NIST-specific caveats:
12
+ # - **A pubid is only adopted when it round-trips.** A NIST DOI such as
13
+ # `NIST.SP.800-162` is itself a valid NIST pubid in dotted MR form, but it
14
+ # must serialize verbatim (its `:human` render is `NIST SP 800-162`). So
15
+ # `content=` keeps the parsed pubid only when `pubid.to_s(:human)` equals
16
+ # the input; otherwise the raw string is preserved. This test is
17
+ # type-independent, so it holds no matter what order lutaml assigns
18
+ # `content`/`type` on `from_xml`/`from_yaml` (unlike a `type == "NIST"`
19
+ # gate, which sees a nil `type` on the YAML setter-ordering path).
20
+ # - **The date lives in the `edition` component, not a `:date` attribute.**
21
+ # NIST has no single date field (`year`/`month` scalars are nil on the
22
+ # common parse paths); a publication year is carried as the edition id
23
+ # (`FIPS 46e1977`) or its trailing `additional_text` (`NBS CIRC 11e2.1915`).
24
+ # So `remove_date!` clears the scalar date fields *and* the edition's
25
+ # year component, while preserving non-year editions/revisions (`r5`, `e2`).
26
+ # Dates carried in the `update` component (some NBS supplements) are left
27
+ # intact — `update` also encodes non-date update codes (`/Upd2`).
28
+ # - **No `(all parts)` marker in `content`.** `content` is live-derived
29
+ # from `@pubid` (see below), so `to_all_parts!` freezes the already
30
+ # part+date+stage-stripped rendering into `@raw_content` before
31
+ # wrapping `@pubid` — matching IEC/CCSDS. `#pubid` itself, read
32
+ # directly, now answers `all_parts? == true` and renders WITH pubid's
33
+ # generic "(all parts)" marker, since it's the wrapper.
34
+ class Docidentifier < Bib::Docidentifier
35
+ attribute :content, :string
36
+
37
+ attr_reader :pubid
38
+
39
+ YEAR = /\A\d{4}\z/
40
+
41
+ def initialize(arg = nil, **kwargs)
42
+ arg.is_a?(Hash) ? super(arg) : super(**kwargs)
43
+ # `super` normally runs `content=` via lutaml's attribute application; the
44
+ # re-run is a fallback for construction paths that skip it (so the value
45
+ # is parsed exactly once in the common case).
46
+ raw = arg.is_a?(Hash) ? (arg["content"] || arg[:content]) : kwargs[:content]
47
+ self.content = raw if raw && @pubid.nil? && @raw_content.nil?
48
+ end
49
+
50
+ alias_method :original_content=, :content=
51
+ alias_method :original_content, :content
52
+
53
+ def content=(value)
54
+ @pubid = nil
55
+ @raw_content = nil
56
+
57
+ parsed = value.is_a?(::Pubid::Nist::Identifier) ? value : parse_pubid(value)
58
+
59
+ # Adopt the pubid only when it renders back to the exact input, so
60
+ # non-canonical forms (DOIs) are preserved as the raw string.
61
+ if parsed && (!value.is_a?(::String) || parsed.to_s(format: :human) == value)
62
+ @pubid = parsed
63
+ elsif value.is_a?(::String)
64
+ @raw_content = value
65
+ end
66
+
67
+ send(:original_content=, to_s)
68
+ end
69
+
70
+ def content
71
+ return @raw_content if @raw_content
72
+ return @pubid.to_s(format: :human) if @pubid
73
+
74
+ original_content
75
+ end
76
+
77
+ def to_s
78
+ content.to_s
79
+ end
80
+
81
+ # `#exclude` (no args) clones the whole graph (incl. a supplement's
82
+ # base), since `walk_chain` mutates it in place. `@raw_content` freezes
83
+ # the stripped rendering — `content` is live from `@pubid`, and the
84
+ # wrapper would otherwise add pubid's generic "(all parts)" marker,
85
+ # which pubid-nist itself never has. `identifiers` then keeps the
86
+ # ORIGINAL part/date/stage, not the stripped working copy.
87
+ def to_all_parts!
88
+ return if !@pubid || @pubid.all_parts?
89
+
90
+ original = @pubid.exclude
91
+ remove_part!
92
+ remove_date!
93
+ remove_stage!
94
+ @raw_content = to_s
95
+ @pubid = original.to_all_parts
96
+ end
97
+
98
+ def remove_part!
99
+ walk_chain { |node| clear_part_on(node) }
100
+ end
101
+
102
+ def remove_stage!
103
+ walk_chain { |node| node.stage = nil if node.respond_to?(:stage=) }
104
+ end
105
+
106
+ def remove_date!
107
+ walk_chain { |node| clear_date_on(node) }
108
+ end
109
+
110
+ private
111
+
112
+ def parse_pubid(value)
113
+ return nil unless value.is_a?(::String) && !value.empty?
114
+
115
+ ::Pubid::Nist::Identifier.parse(value)
116
+ rescue StandardError
117
+ Util.warn "Failed to parse Pubid: #{value}"
118
+ nil
119
+ end
120
+
121
+ # Apply a mutation to the top pubid and every identifier down the
122
+ # `base` chain (only SupplementIdentifier exposes the chain; a
123
+ # plain identifier returns nil and the walk terminates after one pass).
124
+ def walk_chain
125
+ return unless @pubid
126
+
127
+ node = @pubid
128
+ while node
129
+ yield node
130
+ node = node.respond_to?(:base) ? node.base : nil
131
+ end
132
+ refresh_content!
133
+ end
134
+
135
+ def clear_part_on(pubid)
136
+ pubid.part = nil if pubid.respond_to?(:part=)
137
+ pubid.parts = nil if pubid.respond_to?(:parts=)
138
+ end
139
+
140
+ # NIST spreads the date across scalar fields (mostly nil in practice) and
141
+ # the edition component. Clear the scalars, then strip a year that rides on
142
+ # the edition: a trailing year suffix (`e2.1915` -> `e2`) or a whole
143
+ # bare-year edition (`e1977`/`r2001` -> gone), while leaving numbered
144
+ # editions and revisions (`e2`, `r5`) intact.
145
+ def clear_date_on(pubid)
146
+ %i[year month revision_year revision_month edition_year update_year]
147
+ .each { |f| pubid.send("#{f}=", nil) if pubid.respond_to?("#{f}=") }
148
+
149
+ return unless pubid.respond_to?(:edition) && (ed = pubid.edition)
150
+
151
+ if ed.respond_to?(:additional_text) && ed.additional_text.to_s.match?(YEAR)
152
+ ed.additional_text = nil
153
+ end
154
+ return unless ed.respond_to?(:id) && ed.id.to_s.match?(YEAR) &&
155
+ (!ed.respond_to?(:additional_text) || ed.additional_text.nil?)
156
+
157
+ pubid.edition = nil if pubid.respond_to?(:edition=)
158
+ end
159
+
160
+ def refresh_content!
161
+ send(:original_content=, to_s)
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,7 @@
1
+ module Relaton
2
+ module Nist
3
+ class Doctype < Bib::Doctype
4
+ attribute :content, :string, values: %w[standard]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "doctype"
2
+ require_relative "comment_period"
3
+
4
+ module Relaton
5
+ module Nist
6
+ class Ext < Bib::Ext
7
+ attribute :doctype, Doctype
8
+ attribute :commentperiod, CommentPeriod
9
+
10
+ xml { map_element "commentperiod", to: :commentperiod }
11
+ key_value { map_element "commentperiod", to: :commentperiod }
12
+
13
+ def get_schema_version = Relaton.schema_versions["relaton-model-nist"]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Nist
5
+ class Hit < Core::Hit
6
+ attr_writer :item
7
+
8
+ #
9
+ # Parse page.
10
+ #
11
+ # @return [Relaton::Nist::ItemData] bibliographic item
12
+ #
13
+ def item
14
+ @item ||= Scraper.parse_page @hit
15
+ end
16
+ end
17
+ end
18
+ end