relaton 2.1.0 → 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 (625) 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/cache.rb +232 -0
  188. data/lib/relaton/db/config.rb +24 -0
  189. data/lib/relaton/db/registry.rb +119 -0
  190. data/lib/relaton/db/util.rb +9 -0
  191. data/lib/relaton/db/workers_pool.rb +22 -0
  192. data/lib/relaton/db.rb +20 -206
  193. data/lib/relaton/doi/crossref.rb +72 -0
  194. data/lib/relaton/doi/parser.rb +827 -0
  195. data/lib/relaton/doi/processor.rb +65 -0
  196. data/lib/relaton/doi/util.rb +8 -0
  197. data/lib/relaton/doi.rb +20 -0
  198. data/lib/relaton/ecma/bibdata.rb +8 -0
  199. data/lib/relaton/ecma/bibitem.rb +8 -0
  200. data/lib/relaton/ecma/bibliography.rb +81 -0
  201. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  202. data/lib/relaton/ecma/data_parser.rb +49 -0
  203. data/lib/relaton/ecma/edition_parser.rb +80 -0
  204. data/lib/relaton/ecma/ext.rb +7 -0
  205. data/lib/relaton/ecma/item.rb +11 -0
  206. data/lib/relaton/ecma/item_data.rb +6 -0
  207. data/lib/relaton/ecma/memento_parser.rb +60 -0
  208. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  209. data/lib/relaton/ecma/parser_common.rb +33 -0
  210. data/lib/relaton/ecma/processor.rb +66 -0
  211. data/lib/relaton/ecma/standard_parser.rb +134 -0
  212. data/lib/relaton/ecma/util.rb +8 -0
  213. data/lib/relaton/ecma.rb +24 -0
  214. data/lib/relaton/etsi/bibdata.rb +10 -0
  215. data/lib/relaton/etsi/bibitem.rb +10 -0
  216. data/lib/relaton/etsi/bibliography.rb +46 -0
  217. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  218. data/lib/relaton/etsi/data_parser.rb +208 -0
  219. data/lib/relaton/etsi/doctype.rb +30 -0
  220. data/lib/relaton/etsi/ext.rb +31 -0
  221. data/lib/relaton/etsi/item.rb +15 -0
  222. data/lib/relaton/etsi/item_data.rb +6 -0
  223. data/lib/relaton/etsi/processor.rb +69 -0
  224. data/lib/relaton/etsi/pubid.rb +37 -0
  225. data/lib/relaton/etsi/status.rb +13 -0
  226. data/lib/relaton/etsi/util.rb +8 -0
  227. data/lib/relaton/etsi.rb +25 -0
  228. data/lib/relaton/gb/bibdata.rb +8 -0
  229. data/lib/relaton/gb/bibitem.rb +8 -0
  230. data/lib/relaton/gb/bibliography.rb +145 -0
  231. data/lib/relaton/gb/ccs.rb +14 -0
  232. data/lib/relaton/gb/committee.rb +13 -0
  233. data/lib/relaton/gb/docidentifier.rb +23 -0
  234. data/lib/relaton/gb/doctype.rb +9 -0
  235. data/lib/relaton/gb/ext.rb +36 -0
  236. data/lib/relaton/gb/gb_scraper.rb +61 -0
  237. data/lib/relaton/gb/gb_type.rb +20 -0
  238. data/lib/relaton/gb/hit.rb +48 -0
  239. data/lib/relaton/gb/hit_collection.rb +19 -0
  240. data/lib/relaton/gb/item.rb +13 -0
  241. data/lib/relaton/gb/item_data.rb +6 -0
  242. data/lib/relaton/gb/processor.rb +46 -0
  243. data/lib/relaton/gb/project_number.rb +38 -0
  244. data/lib/relaton/gb/scraper.rb +204 -0
  245. data/lib/relaton/gb/sec_scraper.rb +92 -0
  246. data/lib/relaton/gb/stage_name.rb +13 -0
  247. data/lib/relaton/gb/structured_identifier.rb +26 -0
  248. data/lib/relaton/gb/t_scraper.rb +126 -0
  249. data/lib/relaton/gb/util.rb +8 -0
  250. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  251. data/lib/relaton/gb.rb +33 -0
  252. data/lib/relaton/iana/bibdata.rb +8 -0
  253. data/lib/relaton/iana/bibitem.rb +8 -0
  254. data/lib/relaton/iana/bibliography.rb +47 -0
  255. data/lib/relaton/iana/data_fetcher.rb +71 -0
  256. data/lib/relaton/iana/item.rb +7 -0
  257. data/lib/relaton/iana/item_data.rb +6 -0
  258. data/lib/relaton/iana/parser.rb +146 -0
  259. data/lib/relaton/iana/processor.rb +68 -0
  260. data/lib/relaton/iana/util.rb +8 -0
  261. data/lib/relaton/iana.rb +29 -0
  262. data/lib/relaton/iec/bibliography.rb +283 -0
  263. data/lib/relaton/iec/data_fetcher.rb +216 -0
  264. data/lib/relaton/iec/data_parser.rb +391 -0
  265. data/lib/relaton/iec/hit.rb +26 -0
  266. data/lib/relaton/iec/hit_collection.rb +138 -0
  267. data/lib/relaton/iec/item_data.rb +7 -0
  268. data/lib/relaton/iec/model/bibdata.rb +8 -0
  269. data/lib/relaton/iec/model/bibitem.rb +8 -0
  270. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  271. data/lib/relaton/iec/model/doctype.rb +12 -0
  272. data/lib/relaton/iec/model/ext.rb +53 -0
  273. data/lib/relaton/iec/model/item.rb +20 -0
  274. data/lib/relaton/iec/model/item_base.rb +12 -0
  275. data/lib/relaton/iec/model/relation.rb +7 -0
  276. data/lib/relaton/iec/model/stage_name.rb +13 -0
  277. data/lib/relaton/iec/processor.rb +73 -0
  278. data/lib/relaton/iec/statuses.yml +199 -0
  279. data/lib/relaton/iec/util.rb +8 -0
  280. data/lib/relaton/iec.rb +98 -0
  281. data/lib/relaton/ieee/balloting_group.rb +13 -0
  282. data/lib/relaton/ieee/bibdata.rb +8 -0
  283. data/lib/relaton/ieee/bibitem.rb +8 -0
  284. data/lib/relaton/ieee/bibliography.rb +51 -0
  285. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  286. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  287. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  288. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  289. data/lib/relaton/ieee/doctype.rb +9 -0
  290. data/lib/relaton/ieee/editorial_group.rb +19 -0
  291. data/lib/relaton/ieee/ext.rb +36 -0
  292. data/lib/relaton/ieee/idams_parser.rb +323 -0
  293. data/lib/relaton/ieee/item.rb +11 -0
  294. data/lib/relaton/ieee/item_data.rb +7 -0
  295. data/lib/relaton/ieee/processor.rb +68 -0
  296. data/lib/relaton/ieee/pub_id.rb +161 -0
  297. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  298. data/lib/relaton/ieee/util.rb +8 -0
  299. data/lib/relaton/ieee.rb +29 -0
  300. data/lib/relaton/ietf/bibdata.rb +8 -0
  301. data/lib/relaton/ietf/bibitem.rb +8 -0
  302. data/lib/relaton/ietf/bibliography.rb +35 -0
  303. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  304. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  305. data/lib/relaton/ietf/doctype.rb +9 -0
  306. data/lib/relaton/ietf/ext.rb +63 -0
  307. data/lib/relaton/ietf/item.rb +16 -0
  308. data/lib/relaton/ietf/item_base.rb +18 -0
  309. data/lib/relaton/ietf/item_data.rb +6 -0
  310. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  311. data/lib/relaton/ietf/processor.rb +68 -0
  312. data/lib/relaton/ietf/relation.rb +9 -0
  313. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  314. data/lib/relaton/ietf/rfc/author.rb +21 -0
  315. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  316. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  317. data/lib/relaton/ietf/rfc/format.rb +19 -0
  318. data/lib/relaton/ietf/rfc/index.rb +46 -0
  319. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  320. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  321. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  322. data/lib/relaton/ietf/scraper.rb +68 -0
  323. data/lib/relaton/ietf/util.rb +8 -0
  324. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  325. data/lib/relaton/ietf.rb +27 -0
  326. data/lib/relaton/iho/bibdata.rb +8 -0
  327. data/lib/relaton/iho/bibitem.rb +8 -0
  328. data/lib/relaton/iho/bibliography.rb +114 -0
  329. data/lib/relaton/iho/comment_period.rb +13 -0
  330. data/lib/relaton/iho/docidentifier.rb +31 -0
  331. data/lib/relaton/iho/doctype.rb +10 -0
  332. data/lib/relaton/iho/ext.rb +20 -0
  333. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  334. data/lib/relaton/iho/item.rb +20 -0
  335. data/lib/relaton/iho/item_base.rb +18 -0
  336. data/lib/relaton/iho/item_data.rb +6 -0
  337. data/lib/relaton/iho/processor.rb +54 -0
  338. data/lib/relaton/iho/relation.rb +9 -0
  339. data/lib/relaton/iho/structured_identifier.rb +20 -0
  340. data/lib/relaton/iho/util.rb +8 -0
  341. data/lib/relaton/iho.rb +27 -0
  342. data/lib/relaton/index/config.rb +52 -0
  343. data/lib/relaton/index/file_io.rb +305 -0
  344. data/lib/relaton/index/file_storage.rb +61 -0
  345. data/lib/relaton/index/id_number.rb +30 -0
  346. data/lib/relaton/index/pool.rb +41 -0
  347. data/lib/relaton/index/type.rb +159 -0
  348. data/lib/relaton/index/util.rb +18 -0
  349. data/lib/relaton/index.rb +60 -0
  350. data/lib/relaton/isbn/isbn.rb +61 -0
  351. data/lib/relaton/isbn/open_library.rb +43 -0
  352. data/lib/relaton/isbn/parser.rb +88 -0
  353. data/lib/relaton/isbn/processor.rb +48 -0
  354. data/lib/relaton/isbn/util.rb +8 -0
  355. data/lib/relaton/isbn.rb +19 -0
  356. data/lib/relaton/iso/bibliography.rb +407 -0
  357. data/lib/relaton/iso/data_fetcher.rb +338 -0
  358. data/lib/relaton/iso/data_parser.rb +444 -0
  359. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  360. data/lib/relaton/iso/hit.rb +57 -0
  361. data/lib/relaton/iso/hit_collection.rb +184 -0
  362. data/lib/relaton/iso/item_data.rb +28 -0
  363. data/lib/relaton/iso/model/bibdata.rb +10 -0
  364. data/lib/relaton/iso/model/bibitem.rb +8 -0
  365. data/lib/relaton/iso/model/contributor.rb +6 -0
  366. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  367. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  368. data/lib/relaton/iso/model/doctype.rb +13 -0
  369. data/lib/relaton/iso/model/ext.rb +35 -0
  370. data/lib/relaton/iso/model/item.rb +17 -0
  371. data/lib/relaton/iso/model/item_base.rb +22 -0
  372. data/lib/relaton/iso/model/organization.rb +9 -0
  373. data/lib/relaton/iso/model/project_number.rb +22 -0
  374. data/lib/relaton/iso/model/relation.rb +9 -0
  375. data/lib/relaton/iso/model/stagename.rb +14 -0
  376. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  377. data/lib/relaton/iso/processor.rb +84 -0
  378. data/lib/relaton/iso/scraper.rb +619 -0
  379. data/lib/relaton/iso/type/pubid.rb +50 -0
  380. data/lib/relaton/iso/util.rb +8 -0
  381. data/lib/relaton/iso.rb +30 -0
  382. data/lib/relaton/itu/bibliography.rb +90 -0
  383. data/lib/relaton/itu/data_fetcher.rb +104 -0
  384. data/lib/relaton/itu/data_parser_r.rb +140 -0
  385. data/lib/relaton/itu/hit.rb +22 -0
  386. data/lib/relaton/itu/hit_collection.rb +127 -0
  387. data/lib/relaton/itu/item_data.rb +6 -0
  388. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  389. data/lib/relaton/itu/model/bibdata.rb +8 -0
  390. data/lib/relaton/itu/model/bibitem.rb +8 -0
  391. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  392. data/lib/relaton/itu/model/doctype.rb +13 -0
  393. data/lib/relaton/itu/model/ext.rb +47 -0
  394. data/lib/relaton/itu/model/item.rb +13 -0
  395. data/lib/relaton/itu/model/meeting.rb +13 -0
  396. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  397. data/lib/relaton/itu/model/question.rb +13 -0
  398. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  399. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  400. data/lib/relaton/itu/processor.rb +66 -0
  401. data/lib/relaton/itu/pubid.rb +177 -0
  402. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  403. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  404. data/lib/relaton/itu/scraper.rb +193 -0
  405. data/lib/relaton/itu/util.rb +8 -0
  406. data/lib/relaton/itu.rb +33 -0
  407. data/lib/relaton/jis/bibdata.rb +8 -0
  408. data/lib/relaton/jis/bibitem.rb +8 -0
  409. data/lib/relaton/jis/bibliography.rb +75 -0
  410. data/lib/relaton/jis/data_fetcher.rb +181 -0
  411. data/lib/relaton/jis/docidentifier.rb +21 -0
  412. data/lib/relaton/jis/doctype.rb +9 -0
  413. data/lib/relaton/jis/ext.rb +13 -0
  414. data/lib/relaton/jis/hit.rb +93 -0
  415. data/lib/relaton/jis/hit_collection.rb +127 -0
  416. data/lib/relaton/jis/item.rb +22 -0
  417. data/lib/relaton/jis/item_base.rb +26 -0
  418. data/lib/relaton/jis/item_data.rb +8 -0
  419. data/lib/relaton/jis/processor.rb +55 -0
  420. data/lib/relaton/jis/relation.rb +11 -0
  421. data/lib/relaton/jis/scraper.rb +232 -0
  422. data/lib/relaton/jis/structured_identifier.rb +13 -0
  423. data/lib/relaton/jis/util.rb +8 -0
  424. data/lib/relaton/jis.rb +33 -0
  425. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  426. data/lib/relaton/logger/config.rb +34 -0
  427. data/lib/relaton/logger/formatter_json.rb +8 -0
  428. data/lib/relaton/logger/formatter_string.rb +12 -0
  429. data/lib/relaton/logger/log.rb +64 -0
  430. data/lib/relaton/logger/log_device.rb +27 -0
  431. data/lib/relaton/logger/pool.rb +24 -0
  432. data/lib/relaton/logger.rb +18 -0
  433. data/lib/relaton/nist/bibdata.rb +8 -0
  434. data/lib/relaton/nist/bibitem.rb +8 -0
  435. data/lib/relaton/nist/bibliography.rb +191 -0
  436. data/lib/relaton/nist/comment_period.rb +15 -0
  437. data/lib/relaton/nist/data_fetcher.rb +84 -0
  438. data/lib/relaton/nist/date.rb +7 -0
  439. data/lib/relaton/nist/doctype.rb +7 -0
  440. data/lib/relaton/nist/ext.rb +16 -0
  441. data/lib/relaton/nist/hit.rb +18 -0
  442. data/lib/relaton/nist/hit_collection.rb +362 -0
  443. data/lib/relaton/nist/item.rb +17 -0
  444. data/lib/relaton/nist/item_data.rb +6 -0
  445. data/lib/relaton/nist/mods_parser.rb +276 -0
  446. data/lib/relaton/nist/processor.rb +68 -0
  447. data/lib/relaton/nist/pubs_export.rb +69 -0
  448. data/lib/relaton/nist/relation.rb +7 -0
  449. data/lib/relaton/nist/scraper.rb +290 -0
  450. data/lib/relaton/nist/series.yaml +49 -0
  451. data/lib/relaton/nist/util.rb +8 -0
  452. data/lib/relaton/nist.rb +34 -0
  453. data/lib/relaton/oasis/bibdata.rb +8 -0
  454. data/lib/relaton/oasis/bibitem.rb +8 -0
  455. data/lib/relaton/oasis/bibliography.rb +60 -0
  456. data/lib/relaton/oasis/browser_agent.rb +71 -0
  457. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  458. data/lib/relaton/oasis/data_parser.rb +305 -0
  459. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  460. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  461. data/lib/relaton/oasis/doctype.rb +7 -0
  462. data/lib/relaton/oasis/ext.rb +19 -0
  463. data/lib/relaton/oasis/item.rb +11 -0
  464. data/lib/relaton/oasis/item_data.rb +6 -0
  465. data/lib/relaton/oasis/processor.rb +68 -0
  466. data/lib/relaton/oasis/util.rb +8 -0
  467. data/lib/relaton/oasis.rb +28 -0
  468. data/lib/relaton/ogc/bibdata.rb +8 -0
  469. data/lib/relaton/ogc/bibitem.rb +8 -0
  470. data/lib/relaton/ogc/bibliography.rb +64 -0
  471. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  472. data/lib/relaton/ogc/docidentifier.rb +6 -0
  473. data/lib/relaton/ogc/doctype.rb +12 -0
  474. data/lib/relaton/ogc/ext.rb +15 -0
  475. data/lib/relaton/ogc/hit.rb +18 -0
  476. data/lib/relaton/ogc/hit_collection.rb +36 -0
  477. data/lib/relaton/ogc/item.rb +13 -0
  478. data/lib/relaton/ogc/item_data.rb +6 -0
  479. data/lib/relaton/ogc/processor.rb +58 -0
  480. data/lib/relaton/ogc/scraper.rb +225 -0
  481. data/lib/relaton/ogc/util.rb +8 -0
  482. data/lib/relaton/ogc.rb +26 -0
  483. data/lib/relaton/oiml/bibdata.rb +8 -0
  484. data/lib/relaton/oiml/bibitem.rb +8 -0
  485. data/lib/relaton/oiml/bibliography.rb +94 -0
  486. data/lib/relaton/oiml/docidentifier.rb +33 -0
  487. data/lib/relaton/oiml/doctype.rb +13 -0
  488. data/lib/relaton/oiml/ext.rb +42 -0
  489. data/lib/relaton/oiml/item.rb +20 -0
  490. data/lib/relaton/oiml/item_base.rb +18 -0
  491. data/lib/relaton/oiml/item_data.rb +6 -0
  492. data/lib/relaton/oiml/processor.rb +54 -0
  493. data/lib/relaton/oiml/relation.rb +9 -0
  494. data/lib/relaton/oiml/util.rb +8 -0
  495. data/lib/relaton/oiml.rb +24 -0
  496. data/lib/relaton/omg/bibdata.rb +8 -0
  497. data/lib/relaton/omg/bibitem.rb +8 -0
  498. data/lib/relaton/omg/bibliography.rb +31 -0
  499. data/lib/relaton/omg/ext.rb +7 -0
  500. data/lib/relaton/omg/item.rb +8 -0
  501. data/lib/relaton/omg/item_data.rb +6 -0
  502. data/lib/relaton/omg/processor.rb +34 -0
  503. data/lib/relaton/omg/scraper.rb +141 -0
  504. data/lib/relaton/omg/util.rb +8 -0
  505. data/lib/relaton/omg.rb +24 -0
  506. data/lib/relaton/plateau/bibdata.rb +8 -0
  507. data/lib/relaton/plateau/bibitem.rb +8 -0
  508. data/lib/relaton/plateau/bibliography.rb +24 -0
  509. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  510. data/lib/relaton/plateau/doctype.rb +7 -0
  511. data/lib/relaton/plateau/ext.rb +23 -0
  512. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  513. data/lib/relaton/plateau/hit.rb +13 -0
  514. data/lib/relaton/plateau/hit_collection.rb +59 -0
  515. data/lib/relaton/plateau/item.rb +12 -0
  516. data/lib/relaton/plateau/item_data.rb +6 -0
  517. data/lib/relaton/plateau/parser.rb +101 -0
  518. data/lib/relaton/plateau/processor.rb +49 -0
  519. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  520. data/lib/relaton/plateau/util.rb +8 -0
  521. data/lib/relaton/plateau.rb +28 -0
  522. data/lib/relaton/un/bibdata.rb +8 -0
  523. data/lib/relaton/un/bibitem.rb +8 -0
  524. data/lib/relaton/un/bibliography.rb +48 -0
  525. data/lib/relaton/un/doctype.rb +10 -0
  526. data/lib/relaton/un/ext.rb +30 -0
  527. data/lib/relaton/un/hit.rb +56 -0
  528. data/lib/relaton/un/hit_collection.rb +61 -0
  529. data/lib/relaton/un/item.rb +11 -0
  530. data/lib/relaton/un/item_data.rb +6 -0
  531. data/lib/relaton/un/parser.rb +108 -0
  532. data/lib/relaton/un/processor.rb +38 -0
  533. data/lib/relaton/un/session.rb +25 -0
  534. data/lib/relaton/un/token_generator.rb +105 -0
  535. data/lib/relaton/un/util.rb +8 -0
  536. data/lib/relaton/un/wasm/decoder.rb +434 -0
  537. data/lib/relaton/un/wasm/instance.rb +101 -0
  538. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  539. data/lib/relaton/un/wasm/memory.rb +112 -0
  540. data/lib/relaton/un/wasm/module.rb +47 -0
  541. data/lib/relaton/un/wasm.rb +17 -0
  542. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  543. data/lib/relaton/un.rb +28 -0
  544. data/lib/relaton/version.rb +1 -1
  545. data/lib/relaton/w3c/bibdata.rb +8 -0
  546. data/lib/relaton/w3c/bibitem.rb +8 -0
  547. data/lib/relaton/w3c/bibliography.rb +54 -0
  548. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  549. data/lib/relaton/w3c/data_parser.rb +379 -0
  550. data/lib/relaton/w3c/doctype.rb +7 -0
  551. data/lib/relaton/w3c/ext.rb +11 -0
  552. data/lib/relaton/w3c/item.rb +12 -0
  553. data/lib/relaton/w3c/item_data.rb +6 -0
  554. data/lib/relaton/w3c/processor.rb +49 -0
  555. data/lib/relaton/w3c/pubid.rb +73 -0
  556. data/lib/relaton/w3c/safe_realize.rb +59 -0
  557. data/lib/relaton/w3c/util.rb +8 -0
  558. data/lib/relaton/w3c.rb +25 -0
  559. data/lib/relaton/xsf/bibdata.rb +8 -0
  560. data/lib/relaton/xsf/bibitem.rb +8 -0
  561. data/lib/relaton/xsf/bibliography.rb +24 -0
  562. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  563. data/lib/relaton/xsf/hit.rb +17 -0
  564. data/lib/relaton/xsf/hit_collection.rb +24 -0
  565. data/lib/relaton/xsf/item.rb +7 -0
  566. data/lib/relaton/xsf/item_data.rb +6 -0
  567. data/lib/relaton/xsf/processor.rb +50 -0
  568. data/lib/relaton/xsf/util.rb +9 -0
  569. data/lib/relaton/xsf.rb +30 -0
  570. data/lib/relaton-core.rb +1 -0
  571. data/lib/relaton.rb +44 -9
  572. metadata +708 -150
  573. data/.github/workflows/rake.yml +0 -14
  574. data/.github/workflows/release.yml +0 -24
  575. data/.github/workflows/rubocop.yml +0 -48
  576. data/.gitignore +0 -12
  577. data/.rspec +0 -3
  578. data/.rubocop.yml +0 -12
  579. data/CLAUDE.md +0 -70
  580. data/Gemfile +0 -21
  581. data/Rakefile +0 -6
  582. data/docs/CHANGELOG.adoc +0 -16
  583. data/docs/VERSIONING_POLICY.adoc +0 -38
  584. data/docs/navigation.adoc +0 -6
  585. data/lib/relaton/config.rb +0 -24
  586. data/lib/relaton/db_cache.rb +0 -230
  587. data/lib/relaton/registry.rb +0 -118
  588. data/lib/relaton/util.rb +0 -7
  589. data/lib/relaton/workers_pool.rb +0 -21
  590. data/relaton.gemspec +0 -61
  591. data/spec/relaton/config_spec.rb +0 -10
  592. data/spec/relaton/db_cache_spec.rb +0 -51
  593. data/spec/relaton/db_spec.rb +0 -556
  594. data/spec/relaton/registry_spec.rb +0 -178
  595. data/spec/relaton/util_spec.rb +0 -3
  596. data/spec/relaton_spec.rb +0 -725
  597. data/spec/spec_helper.rb +0 -45
  598. data/spec/support/gb_t_20223_2006.xml +0 -33
  599. data/spec/support/iso_111111119115_1.xml +0 -0
  600. data/spec/support/iso_19115_1.xml +0 -115
  601. data/spec/support/iso_19115_2.xml +0 -95
  602. data/spec/support/rfc_8341.xml +0 -46
  603. data/spec/vcr_cassetes/3gpp_tr_00_01u_umts_3_0_0.yml +0 -12720
  604. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  605. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -143
  606. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -199
  607. data/spec/vcr_cassetes/cie_001_1980.yml +0 -401
  608. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1513
  609. data/spec/vcr_cassetes/doi_10_6028_nist_ir_8245.yml +0 -86
  610. data/spec/vcr_cassetes/ecma_6.yml +0 -112
  611. data/spec/vcr_cassetes/en_10160_1999.yml +0 -13624
  612. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -733
  613. data/spec/vcr_cassetes/ieee_528_2019.yml +0 -2786
  614. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  615. data/spec/vcr_cassetes/iso_19115_1.yml +0 -13177
  616. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -369
  617. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -13177
  618. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -229
  619. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -148
  620. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -364
  621. data/spec/vcr_cassetes/iso_combined_included.yml +0 -364
  622. data/spec/vcr_cassetes/iso_dis.yml +0 -157
  623. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -371
  624. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  625. data/spec/vcr_cassetes/rfc_8341.yml +0 -1272
@@ -0,0 +1,68 @@
1
+ require "relaton/core/processor"
2
+
3
+ module Relaton
4
+ module Nist
5
+ class Processor < Core::Processor
6
+ def initialize # rubocop:disable Lint/MissingSuper
7
+ @short = :relaton_nist
8
+ @prefix = "NIST"
9
+ @defaultprefix = %r{^(NIST|NBS|NISTGCR|ITL Bulletin|JPCRD|NISTIR|CSRC|FIPS)(/[^\s])?\s}
10
+ @idtype = "NIST"
11
+ @datasets = %w[nist-tech-pubs]
12
+ end
13
+
14
+ # @param code [String]
15
+ # @param date [String, NilClass] year
16
+ # @param opts [Hash]
17
+ # @return [Relaton::Nist::ItemData]
18
+ def get(code, date = nil, opts = {})
19
+ require_relative "../nist"
20
+ Bibliography.get(code, date, opts)
21
+ end
22
+
23
+ #
24
+ # Fetch all the documents from a source
25
+ #
26
+ # @param [String] _source source name
27
+ # @param [Hash] opts
28
+ # @option opts [String] :output directory to output documents
29
+ # @option opts [String] :format
30
+ #
31
+ def fetch_data(_source, opts)
32
+ require_relative "data_fetcher"
33
+ DataFetcher.fetch(**opts)
34
+ end
35
+
36
+ # @param xml [String]
37
+ # @return [Relaton::Nist::ItemData]
38
+ def from_xml(xml)
39
+ require_relative "../nist"
40
+ Item.from_xml(xml)
41
+ end
42
+
43
+ # @param yaml [String]
44
+ # @return [Relaton::Nist::ItemData]
45
+ def from_yaml(yaml)
46
+ require_relative "../nist"
47
+ Item.from_yaml(yaml)
48
+ end
49
+
50
+ # Returns hash of XML grammar
51
+ # @return [String]
52
+ def grammar_hash
53
+ require_relative "../nist"
54
+ @grammar_hash ||= Nist.grammar_hash
55
+ end
56
+
57
+ #
58
+ # Remove index file
59
+ #
60
+ def remove_index_file
61
+ require_relative "../nist"
62
+ Relaton::Index.find_or_create(
63
+ :nist, url: true, file: "#{INDEXFILE}.yaml", pubid_class: ::Pubid::Nist::Identifier
64
+ ).remove_file
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,69 @@
1
+ require "singleton"
2
+
3
+ module Relaton
4
+ module Nist
5
+ class PubsExport
6
+ include Singleton
7
+
8
+ DOMAIN = "https://csrc.nist.gov".freeze
9
+ PUBS_EXPORT = URI.join(DOMAIN, "/CSRC/media/feeds/metanorma/pubs-export")
10
+ DATAFILEDIR = File.expand_path ".relaton/nist", Dir.home
11
+ DATAFILE = File.expand_path "pubs-export.zip", DATAFILEDIR
12
+
13
+ def initialize
14
+ @mutex = Mutex.new
15
+ end
16
+
17
+ #
18
+ # Fetches json data form server
19
+ #
20
+ # @return [Array<Hash>] json data
21
+ #
22
+ def data
23
+ @mutex.synchronize do
24
+ @data ||= begin
25
+ ctime = File.ctime DATAFILE if File.exist? DATAFILE
26
+ if !ctime || ctime.to_date < ::Date.today || File.size(DATAFILE).zero?
27
+ fetch_data(ctime)
28
+ end
29
+ unzip
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ #
37
+ # Fetch data form server and save it to file
38
+ #
39
+ # @param ctime [Time, nil] file creation time
40
+ #
41
+ def fetch_data(ctime)
42
+ if !ctime || ctime < last_modified
43
+ @data = nil
44
+ uri_open = URI.method(:open) || Kernel.method(:open)
45
+ FileUtils.mkdir_p DATAFILEDIR
46
+ IO.copy_stream(uri_open.call("#{PUBS_EXPORT}.zip"), DATAFILE)
47
+ end
48
+ end
49
+
50
+ def last_modified
51
+ uri = URI("#{PUBS_EXPORT}.meta")
52
+ Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
53
+ Time.httpdate(http.head(uri.request_uri)["last-modified"])
54
+ end
55
+ end
56
+
57
+ #
58
+ # upack zip file
59
+ #
60
+ # @return [Array<Hash>] json data
61
+ #
62
+ def unzip
63
+ Zip::File.open(DATAFILE) do |zf|
64
+ JSON.parse zf.first.get_input_stream.read
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,7 @@
1
+ module Relaton
2
+ module Nist
3
+ class Relation
4
+ attribute :type, :string, values: %w[obsoletedBy supersedes supersededBy]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,290 @@
1
+ require "yaml"
2
+ require "net/http"
3
+
4
+ module Relaton
5
+ module Nist
6
+ class Scraper
7
+ extend Core::DateParser
8
+
9
+ class << self
10
+ DOMAIN = "https://csrc.nist.gov".freeze
11
+
12
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
13
+
14
+ # Parse page.
15
+ # @param hit_data [Hash]
16
+ # @return [Relaton::Nist::ItemData]
17
+ def parse_page(hit_data)
18
+ hit_data[:path] ? fetch_gh(hit_data) : parse_json(hit_data)
19
+ end
20
+
21
+ def fetch_gh(hit_data)
22
+ uri = URI.parse "#{HitCollection::GHNISTDATA}#{hit_data[:path]}"
23
+ yaml = Net::HTTP.get(uri)
24
+ Item.from_yaml(yaml)
25
+ end
26
+
27
+ def parse_json(hit_data)
28
+ item_data = from_json hit_data
29
+ titles = fetch_titles(hit_data)
30
+ item_data[:fetched] = ::Date.today.to_s
31
+ item_data[:type] = "standard"
32
+ item_data[:title] = titles
33
+ ItemData.new(**item_data)
34
+ end
35
+
36
+ private
37
+
38
+ def from_json(hit_data)
39
+ json = hit_data[:json]
40
+ {
41
+ source: fetch_link(json),
42
+ docidentifier: fetch_docid(hit_data),
43
+ date: fetch_dates(json, hit_data[:release_date]),
44
+ contributor: fetch_contributors(json),
45
+ edition: fetch_edition(json),
46
+ language: [json["language"]],
47
+ script: [json["script"]],
48
+ status: fetch_status(json),
49
+ copyright: fetch_copyright(json["published-date"]),
50
+ relation: fetch_relations_json(hit_data),
51
+ place: fetch_place,
52
+ keyword: fetch_keywords(json),
53
+ ext: Ext.new(
54
+ doctype: Doctype.new(content: "standard"),
55
+ flavor: "nist",
56
+ commentperiod: fetch_commentperiod_json(json),
57
+ ),
58
+ }
59
+ end
60
+
61
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
62
+
63
+ # Fetch docid.
64
+ # @param hit [Hash]
65
+ # @return [Array<Bib::Docidentifier>]
66
+ def fetch_docid(hit)
67
+ ids = [Bib::Docidentifier.new(content: hit[:code], type: "NIST", primary: true)]
68
+ doi = hit[:json]["doi"]&.split("/")&.last
69
+ ids << Bib::Docidentifier.new(content: doi, type: "DOI") if doi
70
+ ids
71
+ end
72
+
73
+ # Fetch status.
74
+ # @param doc [Hash]
75
+ # @return [Bib::Status]
76
+ def fetch_status(doc)
77
+ stage = doc["status"]
78
+ subst = doc["substage"]
79
+ iter = iteration(doc["iteration"])
80
+ Bib::Status.new(
81
+ stage: Bib::Status::Stage.new(content: stage),
82
+ substage: subst ? Bib::Status::Stage.new(content: subst) : nil,
83
+ iteration: iter.to_s,
84
+ )
85
+ end
86
+
87
+ def iteration(iter)
88
+ case iter
89
+ when "initial", "ipd" then 1
90
+ when /(\d)pd/i then $1
91
+ else iter
92
+ end
93
+ end
94
+
95
+ # Fetch titles.
96
+ # @param hit_data [Hash]
97
+ # @return [Array<Bib::Title>]
98
+ def fetch_titles(hit_data)
99
+ [Bib::Title.new(content: hit_data[:title], language: "en", script: "Latn")]
100
+ end
101
+
102
+ # Fetch dates
103
+ # @param doc [Hash]
104
+ # @param release_date [Date]
105
+ # @return [Array<Bib::Date>]
106
+ def fetch_dates(doc, release_date) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
107
+ dates = [Bib::Date.new(type: "published", at: release_date.to_s)]
108
+
109
+ issued = safe_parse_date doc["issued-date"]
110
+ updated = safe_parse_date doc["updated-date"]
111
+ dates << Bib::Date.new(type: "updated", at: updated.to_s) if updated
112
+ obsoleted = safe_parse_date doc["obsoleted-date"]
113
+ dates << Bib::Date.new(type: "obsoleted", at: obsoleted.to_s) if obsoleted
114
+ dates << Bib::Date.new(type: "issued", at: issued.to_s) if issued
115
+ dates
116
+ end
117
+
118
+ def safe_parse_date(str)
119
+ return unless str
120
+
121
+ parse_date(str, str: false)
122
+ end
123
+
124
+ # @param doc [Hash]
125
+ # @return [Array<Bib::Contributor>]
126
+ def fetch_contributors(doc)
127
+ contribs = []
128
+ contribs += contributors_json(
129
+ doc["authors"], "author", doc["language"], doc["script"],
130
+ )
131
+ contribs + contributors_json(
132
+ doc["editors"], "editor", doc["language"], doc["script"],
133
+ )
134
+ end
135
+
136
+ # @param doc [Array<Hash>]
137
+ # @param role [String]
138
+ # @return [Array<Bib::Contributor>]
139
+ def contributors_json(doc, role, lang = "en", script = "Latn") # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
140
+ doc.map do |contr|
141
+ if contr["affiliation"]
142
+ abbrev = if contr["affiliation"]["acronym"]
143
+ Bib::LocalizedString.new(content: contr["affiliation"]["acronym"])
144
+ end
145
+ org = Bib::Organization.new(
146
+ name: [Bib::TypedLocalizedString.new(content: contr["affiliation"]["name"])],
147
+ abbreviation: abbrev,
148
+ )
149
+ end
150
+ if contr["surname"]
151
+ affiliation = []
152
+ affiliation << Bib::Affiliation.new(organization: org) if org
153
+ entity = Bib::Person.new(
154
+ name: full_name(contr, lang, script), affiliation: affiliation,
155
+ )
156
+ Bib::Contributor.new(
157
+ person: entity,
158
+ role: [Bib::Contributor::Role.new(type: role)],
159
+ )
160
+ elsif org
161
+ Bib::Contributor.new(
162
+ organization: org,
163
+ role: [Bib::Contributor::Role.new(type: role)],
164
+ )
165
+ end
166
+ end.compact
167
+ end
168
+
169
+ # @param name [Hash]
170
+ # @param lang [String]
171
+ # @param script [String]
172
+ # @return [Bib::FullName]
173
+ def full_name(name, lang, script)
174
+ Bib::FullName.new(
175
+ surname: Bib::LocalizedString.new(content: name["surname"], language: lang, script: script),
176
+ forename: name_parts_forename(name["givenName"], lang, script),
177
+ addition: name_parts(name["suffix"], lang, script),
178
+ prefix: name_parts(name["title"], lang, script),
179
+ completename: Bib::LocalizedString.new(content: name["fullName"], language: lang, script: script),
180
+ )
181
+ end
182
+
183
+ # @param part [String, NilClass]
184
+ # @param lang [String]
185
+ # @param script [String]
186
+ # @return [Array<Bib::LocalizedString>]
187
+ def name_parts(part, lang, script)
188
+ return [] unless part
189
+
190
+ [Bib::LocalizedString.new(content: part, language: lang, script: script)]
191
+ end
192
+
193
+ # @param part [String, NilClass]
194
+ # @param lang [String]
195
+ # @param script [String]
196
+ # @return [Array<Bib::FullNameType::Forename>]
197
+ def name_parts_forename(part, lang, script)
198
+ return [] unless part
199
+
200
+ [Bib::FullNameType::Forename.new(content: part, language: lang, script: script)]
201
+ end
202
+
203
+ # @param doc [Hash]
204
+ # @return [String, NilClass]
205
+ def fetch_edition(doc)
206
+ return unless doc["edition"] || doc["revision"]
207
+
208
+ rev = doc["edition"] || doc["revision"]
209
+ Bib::Edition.new(content: "Revision #{rev}")
210
+ end
211
+
212
+ # Fetch copyright.
213
+ # @param doc [String]
214
+ # @return [Array<Bib::Copyright>]
215
+ def fetch_copyright(doc)
216
+ from = doc&.match(/\d{4}/)&.to_s
217
+ owner = Bib::ContributionInfo.new(
218
+ organization: Bib::Organization.new(
219
+ name: [Bib::TypedLocalizedString.new(content: "National Institute of Standards and Technology")],
220
+ abbreviation: Bib::LocalizedString.new(content: "NIST"),
221
+ uri: [Bib::Uri.new(content: "www.nist.gov")],
222
+ ),
223
+ )
224
+ [Bib::Copyright.new(owner: [owner], from: from)]
225
+ end
226
+
227
+ # Fetch links.
228
+ # @param doc [Hash]
229
+ # @return [Array<Bib::Uri>]
230
+ def fetch_link(doc)
231
+ links = []
232
+ links << Bib::Uri.new(type: "src", content: doc["uri"]) if doc["uri"]
233
+ if doc["doi"]
234
+ links << Bib::Uri.new(type: "doi", content: "https://doi.org/#{doc['doi']}")
235
+ end
236
+ links
237
+ end
238
+
239
+ # @return [Array<Bib::Place>]
240
+ def fetch_place
241
+ [Bib::Place.new(city: "Gaithersburg", region: [Bib::Place::RegionType.new(iso: "MD")])]
242
+ end
243
+
244
+ def fetch_relations_json(hit) # rubocop:disable Metrics/AbcSize
245
+ doc = hit[:json]
246
+ relations = doc["supersedes"].map do |r|
247
+ doc_relation "supersedes", hit[:code], r["uri"]
248
+ end
249
+
250
+ relations + doc["superseded-by"].map do |r|
251
+ doc_relation "updates", hit[:code], r["uri"]
252
+ end
253
+ end
254
+
255
+ # @param type [String]
256
+ # @param ref [String]
257
+ # @param uri [String]
258
+ # @return [Nist::Relation]
259
+ def doc_relation(type, ref, uri, lang = "en", script = "Latn") # rubocop:disable Metrics/MethodLength
260
+ if type == "supersedes"
261
+ descr = Bib::LocalizedMarkedUpString.new(content: "supersedes", language: lang, script: script)
262
+ t = "obsoletes"
263
+ else t = type
264
+ end
265
+ ids = [Bib::Docidentifier.new(content: ref, type: "NIST", primary: true)]
266
+ link = [Bib::Uri.new(type: "src", content: uri)]
267
+ bib = ItemData.new(formattedref: Bib::Formattedref.new(content: ref), source: link, docidentifier: ids)
268
+ Relation.new(type: t, description: descr, bibitem: bib)
269
+ end
270
+
271
+ # @param doc [Hash]
272
+ # @return [Array<Bib::Keyword>]
273
+ def fetch_keywords(doc)
274
+ doc["keywords"].map do |kw|
275
+ text = kw.is_a?(String) ? kw : kw.text
276
+ Bib::Keyword.new(vocab: Bib::LocalizedString.new(content: text))
277
+ end
278
+ end
279
+
280
+ # @param json [Hash]
281
+ # @return [Nist::CommentPeriod, NilClass]
282
+ def fetch_commentperiod_json(json)
283
+ return unless json["comment-from"]
284
+
285
+ CommentPeriod.new from: json["comment-from"], to: json["comment-to"]
286
+ end
287
+ end
288
+ end
289
+ end
290
+ end
@@ -0,0 +1,49 @@
1
+ ---
2
+ AMS: Advanced Manufacturing Series
3
+ BRPD: Basic Radio Propagation Predictions Series
4
+ BH: Building and Housing Reports
5
+ BMS: Building Materials and Structures Reports
6
+ BSS: Building Science Series
7
+ CRPL: CRPL Solar-Geophysical Data
8
+ IP: CRPL Ionospheric Predictions
9
+ CIRC: Circulars
10
+ CIS: Consumer Information Series
11
+ CS: Commercial Standards
12
+ CSM: Commercial Standards Monthly
13
+ CSWP: Cybersecurity White Papers
14
+ EAB: Economic Analysis Briefs
15
+ FIPS: Federal Information Processing Standards Publications
16
+ GCR: Grant/Contractor Reports
17
+ HB: Handbooks
18
+ HR: Hydraulic Research in the United States
19
+ IRPL: Interservice Radio Propagation Laboratory
20
+ LCIRC: Letter Circular
21
+ MONO: Monographs
22
+ MP: Miscellaneous Publications
23
+ NCSTAR: National Construction Safety Team Act Reports
24
+ NSRDS: National Standard Reference Data Series
25
+ IR: IR (Interagency/Internal Reports)
26
+ OWMWP: Office of Weights and Measures White Papers
27
+ PC: Photographic Circulars
28
+ RPT: NBS Reports
29
+ SIBS: Special Interior Ballistics Studies
30
+ SP: Special Publications (General)
31
+ SP250: 'SP 250: Calibration Services'
32
+ SP260: 'SP 260: Standard Reference Materials'
33
+ SP300: 'SP 300: Precision Measurement and Calibration'
34
+ SP400: 'SP 400: Semiconductor Measurement Technology'
35
+ SP480: 'SP 480: Law Enforcement Technology'
36
+ SP500: 'SP 500: Computer Systems Technology'
37
+ SP700: 'SP 700: Industrial Measurement Series'
38
+ SP800: 'SP 800: Computer Security Series'
39
+ SP823: 'SP 823: Integrated Services Digital Network Series'
40
+ SP960: 'SP 960: NIST Recommended Practice Guides'
41
+ SP1200: 'SP 1200: Protocols'
42
+ SP1500: 'SP 1500: Working Group Papers'
43
+ SP1800: 'SP 1800: NIST Cybersecurity Practice Guides'
44
+ SP1900: 'SP 1900: Cyber-Physical Systems'
45
+ SP2000: 'SP 2000: Standards Coordination'
46
+ SP2100: 'SP 2100: Conference Proceedings'
47
+ TIBM: Technical Information on Building Materials
48
+ TN: Technical Notes
49
+ TTB: Technology Transfer Brief
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Nist
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-nist".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,34 @@
1
+ require "pubid"
2
+ require "relaton/index"
3
+ require "relaton/bib"
4
+ require_relative "version"
5
+ require_relative "nist/util"
6
+ require_relative "nist/item_data"
7
+ require_relative "nist/item"
8
+ require_relative "nist/relation"
9
+ require_relative "nist/bibitem"
10
+ require_relative "nist/bibdata"
11
+ require_relative "nist/pubs_export"
12
+ require_relative "nist/hit"
13
+ require_relative "nist/hit_collection"
14
+ require_relative "nist/scraper"
15
+ require_relative "nist/bibliography"
16
+ # require_relative "nist/tech_pubs_parser"
17
+
18
+ module Relaton
19
+ module Nist
20
+ # Pubid-based index (index-v2): `:id` is a Pubid::Nist::Identifier hash, so
21
+ # search narrows by number via binary search. The legacy string index-v1
22
+ # (for older gem versions) is rebuilt separately by the relaton-data-nist
23
+ # crawler, not by this gem's DataFetcher.
24
+ INDEXFILE = "index-v2"
25
+
26
+ class Error < StandardError; end
27
+
28
+ # Returns hash of XML grammar
29
+ # @return [String]
30
+ def self.grammar_hash
31
+ Digest::MD5.hexdigest Relaton::VERSION
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Oasis
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 Oasis
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+
5
+ module Relaton
6
+ module Oasis
7
+ module Bibliography
8
+ ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-oasis/refs/heads/v2/"
9
+
10
+ class << self
11
+ def search(text, _year = nil, _opts = {}) # rubocop:disable Metrics/MethodLength
12
+ Util.info "Fetching from Relaton repository ...", key: text
13
+ /^(?:OASIS\s)?(?<code>.+)/ =~ text
14
+ row = find_index_entry(code)
15
+ unless row
16
+ Util.info "Not found.", key: text
17
+ return
18
+ end
19
+
20
+ uri = URI("#{ENDPOINT}#{row[:file]}")
21
+ parse_item(fetch_yaml(uri), text)
22
+ rescue SocketError, Errno::EINVAL, Errno::ECONNRESET, EOFError,
23
+ Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
24
+ Net::ProtocolError, Net::ReadTimeout,
25
+ OpenSSL::SSL::SSLError, Errno::ETIMEDOUT => e
26
+ raise Relaton::RequestError,
27
+ "Could not access #{uri}: #{e.message}"
28
+ end
29
+
30
+ def get(ref, year = nil, opts = {})
31
+ search(ref, year, opts)
32
+ end
33
+
34
+ private
35
+
36
+ def find_index_entry(code)
37
+ index = Relaton::Index.find_or_create(
38
+ :oasis, url: "#{ENDPOINT}#{INDEXFILE}.zip"
39
+ )
40
+ index.search(code).min_by { |r| r[:id] }
41
+ end
42
+
43
+ def fetch_yaml(uri)
44
+ resp = Net::HTTP.get_response uri
45
+ unless resp.code == "200"
46
+ raise Relaton::RequestError,
47
+ "Could not access #{uri}: HTTP #{resp.code}"
48
+ end
49
+ resp.body
50
+ end
51
+
52
+ def parse_item(yaml, text)
53
+ item = Item.from_yaml yaml
54
+ Util.info "Found: `#{item.docidentifier.first.content}`", key: text
55
+ item.tap { |i| i.fetched = Date.today.to_s }
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,71 @@
1
+ require "ferrum"
2
+ require "nokogiri"
3
+
4
+ module Relaton
5
+ module Oasis
6
+ # Thin Ferrum-backed agent that drives headless Chrome with stealth tweaks
7
+ # so the Cloudflare-protected oasis-open.org host serves real HTML instead
8
+ # of a "Just a moment..." challenge. Mirrors the pattern used by
9
+ # Relaton::Cie::BrowserAgent.
10
+ class BrowserAgent
11
+ UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " \
12
+ "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
13
+ CHALLENGE_MARKERS = ["Just a moment", "challenge-platform"].freeze
14
+ MAX_CHALLENGE_WAIT = 30
15
+
16
+ def initialize
17
+ @browser = Ferrum::Browser.new(
18
+ headless: true,
19
+ timeout: 90,
20
+ process_timeout: 90,
21
+ window_size: [1366, 768],
22
+ browser_options: {
23
+ "disable-blink-features" => "AutomationControlled",
24
+ "disable-quic" => nil,
25
+ "no-sandbox" => nil,
26
+ },
27
+ )
28
+ @browser.headers.set(
29
+ "Accept-Language" => "en-US,en;q=0.9",
30
+ "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9," \
31
+ "image/webp,*/*;q=0.8",
32
+ "User-Agent" => UA,
33
+ )
34
+ @browser.evaluate_on_new_document(<<~JS)
35
+ Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
36
+ Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
37
+ Object.defineProperty(navigator, 'plugins', { get: () => [1,2,3,4,5] });
38
+ window.chrome = { runtime: {} };
39
+ JS
40
+ end
41
+
42
+ def get(url)
43
+ @browser.go_to(url)
44
+ wait_for_challenge
45
+ Nokogiri::HTML(@browser.body)
46
+ end
47
+
48
+ # HTTP status code of the most recent navigation's main resource,
49
+ # or nil if no navigation has happened yet.
50
+ def last_status
51
+ @browser&.network&.status
52
+ end
53
+
54
+ def quit
55
+ @browser&.quit
56
+ ensure
57
+ @browser = nil
58
+ end
59
+
60
+ private
61
+
62
+ def wait_for_challenge
63
+ MAX_CHALLENGE_WAIT.times do
64
+ return unless CHALLENGE_MARKERS.any? { |m| @browser.body.include?(m) }
65
+
66
+ sleep 1
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end