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,458 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+ require_relative "../iso"
5
+ require_relative "scraper"
6
+
7
+ module Relaton
8
+ module Iso
9
+ #
10
+ # Parses one ISO Open Data record (`iso_deliverables_metadata.jsonl` line)
11
+ # into an `Relaton::Iso::ItemData`.
12
+ #
13
+ # See https://www.iso.org/open-data.html for the field reference.
14
+ #
15
+ class DataParser
16
+ ATTRS = %i[
17
+ type docidentifier docnumber edition language script title status ics
18
+ date contributor abstract copyright source relation place
19
+ structuredidentifier ext
20
+ ].freeze
21
+
22
+ DOCTYPES = {
23
+ "IS" => "international-standard",
24
+ "TS" => "technical-specification",
25
+ "TR" => "technical-report",
26
+ "PAS" => "publicly-available-specification",
27
+ "GUIDE" => "guide",
28
+ "IWA" => "international-workshop-agreement",
29
+ "R" => "recommendation",
30
+ "ISP" => "international-standard",
31
+ "DATA" => "international-standard",
32
+ "TTA" => "international-standard",
33
+ }.freeze
34
+
35
+ SUPPLEMENT_DOCTYPES = {
36
+ "Amd" => "amendment",
37
+ "Cor" => "technical-corrigendum",
38
+ "Add" => "addendum",
39
+ "Suppl" => "supplement",
40
+ "Ext" => "extract",
41
+ }.freeze
42
+
43
+ DOC_URL = "https://www.iso.org/standard/%d.html"
44
+ OBP_URL = "https://www.iso.org/obp/ui/en/#!iso:std:%d:en"
45
+ RSS_URL = "https://www.iso.org/contents/data/standard/%s/%s/%d.detail.rss"
46
+
47
+ #
48
+ # @param [Hash] pub one Open Data record
49
+ # @param [Hash{Integer=>String}] ref_index map of Open Data `id` ->
50
+ # `reference`, used to resolve `replaces` / `replacedBy` (which are
51
+ # numeric IDs in the source).
52
+ # @param [Hash] errors error accumulator (`Hash.new(true)`); fields are
53
+ # AND-ed across all records by the `report_errors` machinery.
54
+ # @param [Hash{String=>Hash}] tc_index map of TC/SC reference ->
55
+ # `{ "en" => title, "fr" => title }`, used to resolve the human
56
+ # committee label from the Open Data technical-committees dataset.
57
+ # @param [Hash{String=>Array<String>}] amend_index map of base
58
+ # reference -> list of supplement (Amd/Cor/Add) references that
59
+ # target it. Open Data records the supplement -> base direction only
60
+ # via the reference string, so we pre-build the reverse map.
61
+ # @param [Hash{String=>String}] date_index map of reference ->
62
+ # `publicationDate`, used to attach a `published` date to each
63
+ # emitted relation's bibitem when the related document is itself
64
+ # present in the Open Data feed.
65
+ #
66
+ def initialize(pub, ref_index = {}, errors = {}, tc_index = {}, amend_index = {}, date_index = {})
67
+ @pub = pub
68
+ @ref_index = ref_index
69
+ @errors = errors
70
+ @tc_index = tc_index
71
+ @amend_index = amend_index
72
+ @date_index = date_index
73
+ end
74
+
75
+ def parse
76
+ ItemData.new(**ATTRS.each_with_object({}) { |a, h| h[a] = send(a) })
77
+ end
78
+
79
+ private
80
+
81
+ def type = "standard"
82
+
83
+ # ---- identifiers -----------------------------------------------------
84
+
85
+ def reference
86
+ @reference ||= @pub["reference"] || ""
87
+ end
88
+
89
+ def pubid
90
+ return @pubid if defined?(@pubid)
91
+
92
+ @pubid = begin
93
+ ::Pubid::Iso::Identifier.parse(reference)
94
+ rescue StandardError => e
95
+ Util.warn "Failed to parse pubid `#{reference}`: #{e.message}"
96
+ nil
97
+ end
98
+ end
99
+
100
+ def docidentifier
101
+ ids = []
102
+ if pubid
103
+ primary = Docidentifier.new(content: pubid, type: "ISO", primary: true)
104
+ ids << primary
105
+ if (undated = undated_docid(primary))
106
+ ids << undated
107
+ end
108
+ if (ref = iso_reference_pubid)
109
+ ids << Docidentifier.new(content: ref, type: "iso-reference")
110
+ end
111
+ if (urn = safe_urn_docid)
112
+ ids << urn
113
+ end
114
+ else
115
+ ids << Docidentifier.new(content: reference, type: "ISO", primary: true)
116
+ end
117
+ @errors[:docidentifier] &&= ids.empty?
118
+ ids
119
+ end
120
+
121
+ # Build the undated reference docid (e.g. `ISO 10303-52` from
122
+ # `ISO 10303-52:2011`). Returns nil when the reference carries no year
123
+ # (the undated form would just duplicate the primary).
124
+ def undated_docid(primary)
125
+ undated = Docidentifier.new(content: pubid, type: "iso-undated")
126
+ undated unless undated.to_s == primary.to_s
127
+ rescue StandardError
128
+ nil
129
+ end
130
+
131
+ def safe_urn_docid
132
+ return nil unless urn_pubid
133
+
134
+ Docidentifier.new(content: urn_pubid, type: "URN")
135
+ rescue StandardError
136
+ nil
137
+ end
138
+
139
+ def iso_reference_pubid
140
+ pubid.dup.tap do |id|
141
+ id.languages = [::Pubid::Components::Language.new(code: "en", original_code: "E")]
142
+ end
143
+ rescue StandardError
144
+ nil
145
+ end
146
+
147
+ def urn_pubid
148
+ return @urn_pubid if defined?(@urn_pubid)
149
+
150
+ @urn_pubid = begin
151
+ # Override stage even when the parsed pubid carries the default
152
+ # "published" stage — relaton's currentStage (e.g. 9092 = Withdrawn)
153
+ # is the authoritative source for URN stage.
154
+ stage_dotted ? pubid.with_harmonized_stage(stage_dotted) : pubid.dup
155
+ rescue StandardError
156
+ nil
157
+ end
158
+ end
159
+
160
+ def docnumber
161
+ pubid&.to_s&.match(/\d+/)&.to_s
162
+ end
163
+
164
+ def edition
165
+ return nil unless @pub["edition"]
166
+
167
+ Bib::Edition.new(content: @pub["edition"].to_s)
168
+ end
169
+
170
+ # ---- language / script ----------------------------------------------
171
+
172
+ def language
173
+ langs = Array(@pub["languages"]).dup
174
+ langs << "en" if langs.empty?
175
+ langs.uniq
176
+ end
177
+
178
+ def script
179
+ language.filter_map { |l| script_for(l) }.uniq
180
+ end
181
+
182
+ def script_for(lang)
183
+ case lang
184
+ when "en", "fr" then "Latn"
185
+ when "ru" then "Cyrl"
186
+ end
187
+ end
188
+
189
+ # ---- title -----------------------------------------------------------
190
+
191
+ def title
192
+ result = []
193
+ result += titles_for("en")
194
+ result += titles_for("fr")
195
+ @errors[:title] &&= result.empty?
196
+ result
197
+ end
198
+
199
+ def titles_for(lang)
200
+ raw = @pub.dig("title", lang)
201
+ return [] if raw.nil? || raw.empty?
202
+
203
+ Bib::Title.from_string(normalize_dashes(raw), lang, script_for(lang))
204
+ end
205
+
206
+ def normalize_dashes(str)
207
+ str.gsub(/\s—\s/, " - ").gsub(/\s–\s/, " - ")
208
+ end
209
+
210
+ # ---- status ----------------------------------------------------------
211
+
212
+ # Open Data exposes a 4-digit stage code (e.g. 2098 = 20.98, 6060 = 60.60).
213
+ # Records occasionally come through with 2 or 3 digits (zero-padded).
214
+ def stage_dotted
215
+ return @stage_dotted if defined?(@stage_dotted)
216
+
217
+ @stage_dotted =
218
+ if @pub["currentStage"]
219
+ digits = format("%04d", @pub["currentStage"].to_i)
220
+ "#{digits[0, 2]}.#{digits[2, 2]}"
221
+ end
222
+ end
223
+
224
+ def status
225
+ return nil unless stage_dotted
226
+
227
+ stg, sub = stage_dotted.split(".")
228
+ Bib::Status.new(
229
+ stage: Bib::Status::Stage.new(content: stg),
230
+ substage: sub ? Bib::Status::Stage.new(content: sub) : nil,
231
+ )
232
+ end
233
+
234
+ # ---- ICS -------------------------------------------------------------
235
+
236
+ def ics
237
+ return [] unless @pub["icsCode"]
238
+
239
+ Array(@pub["icsCode"]).map do |code|
240
+ info = safe_isoics_fetch(code)
241
+ Bib::ICS.new(code: code, text: info&.description)
242
+ end
243
+ end
244
+
245
+ def safe_isoics_fetch(code)
246
+ Isoics.fetch code
247
+ rescue StandardError
248
+ nil
249
+ end
250
+
251
+ # ---- dates -----------------------------------------------------------
252
+
253
+ def date
254
+ pd = @pub["publicationDate"]
255
+ return [] if pd.nil? || pd.empty?
256
+
257
+ [Bib::Date.new(type: "published", at: pd)]
258
+ end
259
+
260
+ # ---- contributors ----------------------------------------------------
261
+
262
+ def contributor
263
+ publishers + Array(editorialgroup_contributor)
264
+ end
265
+
266
+ def publishers
267
+ reference.sub(/\s.*/, "").split("/").filter_map do |abbrev|
268
+ info = Scraper::PUBLISHERS[abbrev]
269
+ next unless info
270
+
271
+ name = Bib::TypedLocalizedString.new(content: info[:name])
272
+ abbr = Bib::LocalizedString.new(content: abbrev)
273
+ uri = Bib::Uri.new(content: info[:uri]) if info[:uri]
274
+ org = Bib::Organization.new(name: [name], abbreviation: abbr, uri: [uri].compact)
275
+ role = Bib::Contributor::Role.new(type: "publisher")
276
+ Bib::Contributor.new(organization: org, role: [role])
277
+ end
278
+ end
279
+
280
+ def editorialgroup_contributor
281
+ wg = @pub["ownerCommittee"]
282
+ return nil if wg.nil? || wg.empty?
283
+
284
+ parts = wg.split("/")
285
+ prefix = parts[0]
286
+ type = parts[1]&.match(/^[A-Z]+/)&.to_s || "TC"
287
+
288
+ publisher = Scraper::PUBLISHERS[prefix]
289
+ name = if publisher
290
+ [Bib::TypedLocalizedString.new(content: publisher[:name])]
291
+ elsif prefix
292
+ [Bib::TypedLocalizedString.new(content: prefix)]
293
+ else
294
+ []
295
+ end
296
+ abbreviation = (Bib::LocalizedString.new(content: prefix) if prefix)
297
+
298
+ label = @tc_index.dig(wg, "en") || wg
299
+ subdivision = Bib::Subdivision.new(
300
+ type: "technical-committee",
301
+ subtype: type,
302
+ name: [Bib::TypedLocalizedString.new(content: label)],
303
+ identifier: [Bib::OrganizationType::Identifier.new(content: wg)],
304
+ )
305
+
306
+ role = Bib::Contributor::Role.new(
307
+ type: "author",
308
+ description: [Bib::LocalizedMarkedUpString.new(content: "committee")],
309
+ )
310
+
311
+ Bib::Contributor.new(
312
+ role: [role],
313
+ organization: Bib::Organization.new(
314
+ name: name, subdivision: [subdivision], abbreviation: abbreviation,
315
+ ),
316
+ )
317
+ end
318
+
319
+ # ---- abstract --------------------------------------------------------
320
+
321
+ def abstract
322
+ %w[en fr].filter_map do |lang|
323
+ html = @pub.dig("scope", lang)
324
+ next if html.nil? || html.empty?
325
+
326
+ text = strip_html(html)
327
+ next if text.empty?
328
+
329
+ Bib::Abstract.new(content: text, language: lang, script: script_for(lang))
330
+ end
331
+ end
332
+
333
+ def strip_html(html)
334
+ Nokogiri::HTML.fragment(html).text.strip.gsub(/\s+/, " ")
335
+ end
336
+
337
+ # ---- copyright -------------------------------------------------------
338
+
339
+ def copyright
340
+ from = reference[/(?<=:)\d{4}/] ||
341
+ @pub["publicationDate"]&.match(/\d{4}/)&.to_s
342
+ return [] unless from && !from.empty?
343
+
344
+ owner_name = reference.match(/.*?(?=\s)/).to_s
345
+ name = Bib::TypedLocalizedString.new(content: owner_name)
346
+ org = Bib::Organization.new(name: [name])
347
+ contrib = Bib::ContributionInfo.new(organization: org)
348
+ [Bib::Copyright.new(owner: [contrib], from: from)]
349
+ end
350
+
351
+ # ---- source links ----------------------------------------------------
352
+
353
+ def source
354
+ id = @pub["id"]
355
+ return [] unless id
356
+
357
+ pad = format("%06d", id)
358
+ [
359
+ Bib::Uri.new(type: "src", content: format(DOC_URL, id)),
360
+ Bib::Uri.new(type: "obp", content: format(OBP_URL, id)),
361
+ Bib::Uri.new(type: "rss", content: format(RSS_URL, pad[0, 2], pad[2, 2], id)),
362
+ ]
363
+ end
364
+
365
+ # ---- relations -------------------------------------------------------
366
+
367
+ # Open Data semantics:
368
+ # * `replaces` - older docs THIS one supersedes -> `obsoletes`
369
+ # * `replacedBy` - newer docs that supersede THIS one -> `obsoletedBy`
370
+ # Amendments/corrigenda/addenda are stitched in via two routes:
371
+ # * on the BASE record, look up `@amend_index` for supplements
372
+ # targeting it (-> `updatedBy`); the index is pre-built in
373
+ # `DataFetcher#build_ref_index` because Open Data only records
374
+ # the supplement -> base direction via the reference string.
375
+ # * on the SUPPLEMENT record itself, derive the base from
376
+ # `pubid.base` and emit the forward `updates` relation.
377
+ def relation
378
+ rels = []
379
+ rels += build_relations(@pub["replaces"], "obsoletes")
380
+ rels += build_relations(@pub["replacedBy"], "obsoletedBy")
381
+ rels += amendment_relations
382
+ rels += base_relation
383
+ rels
384
+ end
385
+
386
+ def build_relations(ids, type)
387
+ Array(ids).filter_map do |id|
388
+ ref = @ref_index[id] || @ref_index[id.to_s]
389
+ next unless ref
390
+
391
+ relation_for(ref, type)
392
+ end
393
+ end
394
+
395
+ def amendment_relations
396
+ Array(@amend_index[pubid&.to_s || reference]).map do |amend_ref|
397
+ relation_for(amend_ref, "updatedBy")
398
+ end
399
+ end
400
+
401
+ def base_relation
402
+ return [] unless pubid&.base
403
+
404
+ [relation_for(pubid.base.to_s, "updates")]
405
+ end
406
+
407
+ def relation_for(ref, type)
408
+ docid = Docidentifier.new(content: ref, type: "ISO", primary: true)
409
+ attrs = {
410
+ docidentifier: [docid],
411
+ formattedref: Bib::Formattedref.new(content: ref),
412
+ }
413
+ if (pub_date = @date_index[ref]) && !pub_date.empty?
414
+ attrs[:date] = [Bib::Date.new(type: "published", at: pub_date)]
415
+ end
416
+ Relation.new(type: type, bibitem: ItemData.new(**attrs))
417
+ end
418
+
419
+ # ---- structured identifier ------------------------------------------
420
+
421
+ def structuredidentifier
422
+ return nil unless @pub["id"]
423
+
424
+ pnum = ProjectNumber.new(content: @pub["id"].to_s)
425
+ publisher = pubid&.respond_to?(:publisher) ? pubid.publisher : nil
426
+ StructuredIdentifier.new(project_number: pnum, type: publisher || "ISO")
427
+ end
428
+
429
+ # ---- place -----------------------------------------------------------
430
+
431
+ def place
432
+ [Bib::Place.new(city: "Geneva")]
433
+ end
434
+
435
+ # ---- ext -------------------------------------------------------------
436
+
437
+ def ext
438
+ Ext.new(
439
+ doctype: doctype,
440
+ flavor: "iso",
441
+ ics: ics,
442
+ structuredidentifier: structuredidentifier,
443
+ stagename: nil,
444
+ updates_document_type: nil,
445
+ fast_track: nil,
446
+ price_code: nil,
447
+ )
448
+ end
449
+
450
+ def doctype
451
+ type = SUPPLEMENT_DOCTYPES[@pub["supplementType"]] ||
452
+ DOCTYPES[@pub["deliverableType"]] ||
453
+ "international-standard"
454
+ Doctype.new(content: type)
455
+ end
456
+ end
457
+ end
458
+ end
@@ -0,0 +1,177 @@
1
+ require "relaton/bib/hash_parser_v1"
2
+ require_relative "../iso"
3
+
4
+ module Relaton
5
+ module Iso
6
+ #
7
+ # This module is used to parse hash data from Relaton YAML version 1 files.
8
+ # It needs for trasition form Relaton v! to Relaton v2.
9
+ #
10
+ module HashParserV1
11
+ include Bib::HashParserV1
12
+ extend self
13
+
14
+ PUBLISHERS = {
15
+ "IEC" => "International Electrotechnical Commission",
16
+ "ISO" => "International Organization for Standardization",
17
+ "IEEE" => "Institute of Electrical and Electronics Engineers",
18
+ "SAE" => "SAE International",
19
+ "CIE" => " International Commission on Illumination",
20
+ "ASME" => "American Society of Mechanical Engineers",
21
+ }.freeze
22
+
23
+ private
24
+
25
+ def ext_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
26
+ ret[:ext] ||= {}
27
+ ret[:ext][:schema_version] = ret[:ext].delete(:"schema-version")
28
+ doctype_hash_to_bib ret
29
+ ret[:ext][:subdoctype] = ret.delete(:subdoctype) if ret[:subdoctype]
30
+ ret[:ext][:flavor] ||= flavor(ret)
31
+ ret[:ext][:horizontal] = ret.delete(:horizontal) unless ret[:horizontal].nil?
32
+ editorialgroup_hash_to_bib ret
33
+ approvalgroup_hash_to_bib ret
34
+ ics_hash_to_bib ret
35
+ structuredidentifier_hash_to_bib ret
36
+ stagename_hash_to_bib ret
37
+ ret[:ext][:fast_track] = ret.delete(:fast_track) unless ret[:fast_track].nil?
38
+ ret[:ext][:price_code] = ret.delete(:price_code) if ret[:price_code]
39
+ ret[:ext] = Ext.new(**ret[:ext]) if ret[:ext]
40
+ end
41
+
42
+ def create_docid(**args)
43
+ Docidentifier.new(**args)
44
+ end
45
+
46
+ #
47
+ # Ovverides superclass's method
48
+ #
49
+ # @param item [Hash]
50
+ # @retirn [RelatonIsoBib::IsoBibliographicItem]
51
+ def bib_item(item)
52
+ ItemData.new(**item)
53
+ end
54
+
55
+ #
56
+ # Ovverides superclass's method
57
+ #
58
+ # @param title [Hash]
59
+ # @return [RelatonBib::TypedTitleString]
60
+ def typed_title_strig(title)
61
+ Relaton::Bib::Title.new(**title)
62
+ end
63
+
64
+ # @param ret [Hash]
65
+ def editorialgroup_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
66
+ eg = ret.dig(:ext, :editorialgroup) || ret[:editorialgroup]
67
+ return unless eg
68
+
69
+ ret[:ext]&.delete(:editorialgroup)
70
+ ret.delete(:editorialgroup)
71
+ ret[:contributor] ||= []
72
+ add_group_contributors(ret, eg, "committee")
73
+ end
74
+
75
+ def approvalgroup_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize
76
+ ag = ret.dig(:ext, :approvalgroup) || ret[:approvalgroup]
77
+ return unless ag
78
+
79
+ ret[:ext]&.delete(:approvalgroup)
80
+ ret.delete(:approvalgroup)
81
+ ret[:contributor] ||= []
82
+ add_group_contributors(ret, ag, "authorizer", role_type: "authorizer")
83
+ end
84
+
85
+ def add_group_contributors(ret, group, description, role_type: "author") # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
86
+ subdiv_types = {
87
+ technical_committee: "technical-committee",
88
+ subcommittee: "subcommittee",
89
+ workgroup: "workgroup",
90
+ }
91
+ subdiv_types.each do |key, subdiv_type|
92
+ array(group[key]).each do |wg|
93
+ wg[:content] ||= wg.delete(:name)
94
+ next unless wg[:content]
95
+
96
+ prefix = wg[:prefix] || wg[:identifier]&.split("/")&.first || extract_prefix(wg[:content])
97
+ publisher_name = PUBLISHERS[prefix]
98
+ name = if publisher_name
99
+ [Bib::TypedLocalizedString.new(content: publisher_name)]
100
+ elsif prefix
101
+ [Bib::TypedLocalizedString.new(content: prefix)]
102
+ else
103
+ [Bib::TypedLocalizedString.new(content: wg[:content])]
104
+ end
105
+ abbreviation = prefix ? Bib::LocalizedString.new(content: prefix) : nil
106
+
107
+ subdivision = Bib::Subdivision.new(
108
+ type: subdiv_type, subtype: wg[:type],
109
+ name: [Bib::TypedLocalizedString.new(content: wg[:content])],
110
+ identifier: wg[:identifier] ? [Bib::OrganizationType::Identifier.new(content: wg[:identifier])] : [],
111
+ )
112
+
113
+ role = Bib::Contributor::Role.new(
114
+ type: role_type,
115
+ description: [Bib::LocalizedMarkedUpString.new(content: description)],
116
+ )
117
+
118
+ ret[:contributor] << Bib::Contributor.new(
119
+ role: [role],
120
+ organization: Bib::Organization.new(
121
+ name: name, subdivision: [subdivision], abbreviation: abbreviation,
122
+ ),
123
+ )
124
+ end
125
+ end
126
+ end
127
+
128
+ def extract_prefix(content)
129
+ match = content&.match(%r{^([A-Z]+)/})
130
+ match[1] if match
131
+ end
132
+
133
+ # @param ret [Hash]
134
+ def structuredidentifier_hash_to_bib(ret)
135
+ struct_id = ret.dig(:ext, :structuredidentifier) || ret[:structuredidentifier]
136
+ return unless struct_id
137
+
138
+ struct_id[:project_number] = project_number_hash_to_bib(struct_id)
139
+ ret[:ext][:structuredidentifier] = StructuredIdentifier.new(**struct_id)
140
+ end
141
+
142
+ def project_number_hash_to_bib(struct_id)
143
+ ProjectNumber.new(
144
+ part: struct_id.delete(:part),
145
+ subpart: struct_id.delete(:subpart),
146
+ amendment: struct_id.delete(:amendment),
147
+ corrigendum: struct_id.delete(:corrigendum),
148
+ origyr: struct_id.delete(:origyr),
149
+ content: struct_id.delete(:project_number),
150
+ )
151
+ end
152
+
153
+ def stagename_hash_to_bib(ret)
154
+ stagename = ret.dig(:ext, :stagename) || ret[:stagename]
155
+ return unless stagename
156
+
157
+ ret[:ext][:stagename] = Stagename.new(**stagename_args(stagename))
158
+ end
159
+
160
+ def stagename_args(stagename)
161
+ if stagename.is_a? Hash
162
+ stagename
163
+ else
164
+ { content: stagename }
165
+ end
166
+ end
167
+
168
+ def create_doctype(args)
169
+ Doctype.new(**args)
170
+ end
171
+
172
+ def create_relation(rel)
173
+ Relation.new(**rel)
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Iso
5
+ # Hit.
6
+ class Hit < Relaton::Core::Hit
7
+ # @return [RelatonIsoBib::IsoBibliographicItem]
8
+ attr_writer :item
9
+
10
+ # @return [Pubid::Iso::Identifier] pubid
11
+ attr_writer :pubid
12
+
13
+ # Parse page.
14
+ # @return [Relaton::Iso::ItemData]
15
+ def item
16
+ @item ||= begin
17
+ url = "#{HitCollection::ENDPOINT}#{hit[:file]}"
18
+ resp = Net::HTTP.get_response URI(url)
19
+ item = Item.from_yaml resp.body
20
+ item.fetched = ::Date.today.to_s
21
+ item
22
+ end
23
+ end
24
+
25
+ # @return [Integer]
26
+ def sort_weight
27
+ case hit[:status] # && hit["publicationStatus"]["key"]
28
+ when "Published" then 0
29
+ when "Under development" then 1
30
+ when "Withdrawn" then 2
31
+ when "Deleted" then 3
32
+ else 4
33
+ end
34
+ end
35
+
36
+ # @return [Pubid::Iso::Identifier]
37
+ def pubid
38
+ return @pubid if defined? @pubid
39
+
40
+ @pubid = create_pubid hit[:id]
41
+ rescue StandardError
42
+ Util.warn "Unable to create an identifier from #{hit[:id]}"
43
+ @pubid = nil
44
+ end
45
+
46
+ private
47
+
48
+ def create_pubid(id)
49
+ if id.is_a?(Hash)
50
+ ::Pubid::Iso::Identifier.from_hash(id)
51
+ else
52
+ id
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end