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,444 @@
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
+ ids << Docidentifier.new(content: pubid, type: "ISO", primary: true)
104
+ if (ref = iso_reference_pubid)
105
+ ids << Docidentifier.new(content: ref, type: "iso-reference")
106
+ end
107
+ if (urn = safe_urn_docid)
108
+ ids << urn
109
+ end
110
+ else
111
+ ids << Docidentifier.new(content: reference, type: "ISO", primary: true)
112
+ end
113
+ @errors[:docidentifier] &&= ids.empty?
114
+ ids
115
+ end
116
+
117
+ def safe_urn_docid
118
+ return nil unless urn_pubid
119
+
120
+ Docidentifier.new(content: urn_pubid, type: "URN")
121
+ rescue StandardError
122
+ nil
123
+ end
124
+
125
+ def iso_reference_pubid
126
+ pubid.dup.tap do |id|
127
+ id.languages = [::Pubid::Components::Language.new(code: "en", original_code: "E")]
128
+ end
129
+ rescue StandardError
130
+ nil
131
+ end
132
+
133
+ def urn_pubid
134
+ return @urn_pubid if defined?(@urn_pubid)
135
+
136
+ @urn_pubid = begin
137
+ # Override stage even when the parsed pubid carries the default
138
+ # "published" stage — relaton's currentStage (e.g. 9092 = Withdrawn)
139
+ # is the authoritative source for URN stage.
140
+ stage_dotted ? pubid.with_harmonized_stage(stage_dotted) : pubid.dup
141
+ rescue StandardError
142
+ nil
143
+ end
144
+ end
145
+
146
+ def docnumber
147
+ pubid&.to_s&.match(/\d+/)&.to_s
148
+ end
149
+
150
+ def edition
151
+ return nil unless @pub["edition"]
152
+
153
+ Bib::Edition.new(content: @pub["edition"].to_s)
154
+ end
155
+
156
+ # ---- language / script ----------------------------------------------
157
+
158
+ def language
159
+ langs = Array(@pub["languages"]).dup
160
+ langs << "en" if langs.empty?
161
+ langs.uniq
162
+ end
163
+
164
+ def script
165
+ language.filter_map { |l| script_for(l) }.uniq
166
+ end
167
+
168
+ def script_for(lang)
169
+ case lang
170
+ when "en", "fr" then "Latn"
171
+ when "ru" then "Cyrl"
172
+ end
173
+ end
174
+
175
+ # ---- title -----------------------------------------------------------
176
+
177
+ def title
178
+ result = []
179
+ result += titles_for("en")
180
+ result += titles_for("fr")
181
+ @errors[:title] &&= result.empty?
182
+ result
183
+ end
184
+
185
+ def titles_for(lang)
186
+ raw = @pub.dig("title", lang)
187
+ return [] if raw.nil? || raw.empty?
188
+
189
+ Bib::Title.from_string(normalize_dashes(raw), lang, script_for(lang))
190
+ end
191
+
192
+ def normalize_dashes(str)
193
+ str.gsub(/\s—\s/, " - ").gsub(/\s–\s/, " - ")
194
+ end
195
+
196
+ # ---- status ----------------------------------------------------------
197
+
198
+ # Open Data exposes a 4-digit stage code (e.g. 2098 = 20.98, 6060 = 60.60).
199
+ # Records occasionally come through with 2 or 3 digits (zero-padded).
200
+ def stage_dotted
201
+ return @stage_dotted if defined?(@stage_dotted)
202
+
203
+ @stage_dotted =
204
+ if @pub["currentStage"]
205
+ digits = format("%04d", @pub["currentStage"].to_i)
206
+ "#{digits[0, 2]}.#{digits[2, 2]}"
207
+ end
208
+ end
209
+
210
+ def status
211
+ return nil unless stage_dotted
212
+
213
+ stg, sub = stage_dotted.split(".")
214
+ Bib::Status.new(
215
+ stage: Bib::Status::Stage.new(content: stg),
216
+ substage: sub ? Bib::Status::Stage.new(content: sub) : nil,
217
+ )
218
+ end
219
+
220
+ # ---- ICS -------------------------------------------------------------
221
+
222
+ def ics
223
+ return [] unless @pub["icsCode"]
224
+
225
+ Array(@pub["icsCode"]).map do |code|
226
+ info = safe_isoics_fetch(code)
227
+ Bib::ICS.new(code: code, text: info&.description)
228
+ end
229
+ end
230
+
231
+ def safe_isoics_fetch(code)
232
+ Isoics.fetch code
233
+ rescue StandardError
234
+ nil
235
+ end
236
+
237
+ # ---- dates -----------------------------------------------------------
238
+
239
+ def date
240
+ pd = @pub["publicationDate"]
241
+ return [] if pd.nil? || pd.empty?
242
+
243
+ [Bib::Date.new(type: "published", at: pd)]
244
+ end
245
+
246
+ # ---- contributors ----------------------------------------------------
247
+
248
+ def contributor
249
+ publishers + Array(editorialgroup_contributor)
250
+ end
251
+
252
+ def publishers
253
+ reference.sub(/\s.*/, "").split("/").filter_map do |abbrev|
254
+ info = Scraper::PUBLISHERS[abbrev]
255
+ next unless info
256
+
257
+ name = Bib::TypedLocalizedString.new(content: info[:name])
258
+ abbr = Bib::LocalizedString.new(content: abbrev)
259
+ uri = Bib::Uri.new(content: info[:uri]) if info[:uri]
260
+ org = Bib::Organization.new(name: [name], abbreviation: abbr, uri: [uri].compact)
261
+ role = Bib::Contributor::Role.new(type: "publisher")
262
+ Bib::Contributor.new(organization: org, role: [role])
263
+ end
264
+ end
265
+
266
+ def editorialgroup_contributor
267
+ wg = @pub["ownerCommittee"]
268
+ return nil if wg.nil? || wg.empty?
269
+
270
+ parts = wg.split("/")
271
+ prefix = parts[0]
272
+ type = parts[1]&.match(/^[A-Z]+/)&.to_s || "TC"
273
+
274
+ publisher = Scraper::PUBLISHERS[prefix]
275
+ name = if publisher
276
+ [Bib::TypedLocalizedString.new(content: publisher[:name])]
277
+ elsif prefix
278
+ [Bib::TypedLocalizedString.new(content: prefix)]
279
+ else
280
+ []
281
+ end
282
+ abbreviation = (Bib::LocalizedString.new(content: prefix) if prefix)
283
+
284
+ label = @tc_index.dig(wg, "en") || wg
285
+ subdivision = Bib::Subdivision.new(
286
+ type: "technical-committee",
287
+ subtype: type,
288
+ name: [Bib::TypedLocalizedString.new(content: label)],
289
+ identifier: [Bib::OrganizationType::Identifier.new(content: wg)],
290
+ )
291
+
292
+ role = Bib::Contributor::Role.new(
293
+ type: "author",
294
+ description: [Bib::LocalizedMarkedUpString.new(content: "committee")],
295
+ )
296
+
297
+ Bib::Contributor.new(
298
+ role: [role],
299
+ organization: Bib::Organization.new(
300
+ name: name, subdivision: [subdivision], abbreviation: abbreviation,
301
+ ),
302
+ )
303
+ end
304
+
305
+ # ---- abstract --------------------------------------------------------
306
+
307
+ def abstract
308
+ %w[en fr].filter_map do |lang|
309
+ html = @pub.dig("scope", lang)
310
+ next if html.nil? || html.empty?
311
+
312
+ text = strip_html(html)
313
+ next if text.empty?
314
+
315
+ Bib::Abstract.new(content: text, language: lang, script: script_for(lang))
316
+ end
317
+ end
318
+
319
+ def strip_html(html)
320
+ Nokogiri::HTML.fragment(html).text.strip.gsub(/\s+/, " ")
321
+ end
322
+
323
+ # ---- copyright -------------------------------------------------------
324
+
325
+ def copyright
326
+ from = reference[/(?<=:)\d{4}/] ||
327
+ @pub["publicationDate"]&.match(/\d{4}/)&.to_s
328
+ return [] unless from && !from.empty?
329
+
330
+ owner_name = reference.match(/.*?(?=\s)/).to_s
331
+ name = Bib::TypedLocalizedString.new(content: owner_name)
332
+ org = Bib::Organization.new(name: [name])
333
+ contrib = Bib::ContributionInfo.new(organization: org)
334
+ [Bib::Copyright.new(owner: [contrib], from: from)]
335
+ end
336
+
337
+ # ---- source links ----------------------------------------------------
338
+
339
+ def source
340
+ id = @pub["id"]
341
+ return [] unless id
342
+
343
+ pad = format("%06d", id)
344
+ [
345
+ Bib::Uri.new(type: "src", content: format(DOC_URL, id)),
346
+ Bib::Uri.new(type: "obp", content: format(OBP_URL, id)),
347
+ Bib::Uri.new(type: "rss", content: format(RSS_URL, pad[0, 2], pad[2, 2], id)),
348
+ ]
349
+ end
350
+
351
+ # ---- relations -------------------------------------------------------
352
+
353
+ # Open Data semantics:
354
+ # * `replaces` - older docs THIS one supersedes -> `obsoletes`
355
+ # * `replacedBy` - newer docs that supersede THIS one -> `obsoletedBy`
356
+ # Amendments/corrigenda/addenda are stitched in via two routes:
357
+ # * on the BASE record, look up `@amend_index` for supplements
358
+ # targeting it (-> `updatedBy`); the index is pre-built in
359
+ # `DataFetcher#build_ref_index` because Open Data only records
360
+ # the supplement -> base direction via the reference string.
361
+ # * on the SUPPLEMENT record itself, derive the base from
362
+ # `pubid.base` and emit the forward `updates` relation.
363
+ def relation
364
+ rels = []
365
+ rels += build_relations(@pub["replaces"], "obsoletes")
366
+ rels += build_relations(@pub["replacedBy"], "obsoletedBy")
367
+ rels += amendment_relations
368
+ rels += base_relation
369
+ rels
370
+ end
371
+
372
+ def build_relations(ids, type)
373
+ Array(ids).filter_map do |id|
374
+ ref = @ref_index[id] || @ref_index[id.to_s]
375
+ next unless ref
376
+
377
+ relation_for(ref, type)
378
+ end
379
+ end
380
+
381
+ def amendment_relations
382
+ Array(@amend_index[pubid&.to_s || reference]).map do |amend_ref|
383
+ relation_for(amend_ref, "updatedBy")
384
+ end
385
+ end
386
+
387
+ def base_relation
388
+ return [] unless pubid&.base_identifier
389
+
390
+ [relation_for(pubid.base_identifier.to_s, "updates")]
391
+ end
392
+
393
+ def relation_for(ref, type)
394
+ docid = Docidentifier.new(content: ref, type: "ISO", primary: true)
395
+ attrs = {
396
+ docidentifier: [docid],
397
+ formattedref: Bib::Formattedref.new(content: ref),
398
+ }
399
+ if (pub_date = @date_index[ref]) && !pub_date.empty?
400
+ attrs[:date] = [Bib::Date.new(type: "published", at: pub_date)]
401
+ end
402
+ Relation.new(type: type, bibitem: ItemData.new(**attrs))
403
+ end
404
+
405
+ # ---- structured identifier ------------------------------------------
406
+
407
+ def structuredidentifier
408
+ return nil unless @pub["id"]
409
+
410
+ pnum = ProjectNumber.new(content: @pub["id"].to_s)
411
+ publisher = pubid&.respond_to?(:publisher) ? pubid.publisher : nil
412
+ StructuredIdentifier.new(project_number: pnum, type: publisher || "ISO")
413
+ end
414
+
415
+ # ---- place -----------------------------------------------------------
416
+
417
+ def place
418
+ [Bib::Place.new(city: "Geneva")]
419
+ end
420
+
421
+ # ---- ext -------------------------------------------------------------
422
+
423
+ def ext
424
+ Ext.new(
425
+ doctype: doctype,
426
+ flavor: "iso",
427
+ ics: ics,
428
+ structuredidentifier: structuredidentifier,
429
+ stagename: nil,
430
+ updates_document_type: nil,
431
+ fast_track: nil,
432
+ price_code: nil,
433
+ )
434
+ end
435
+
436
+ def doctype
437
+ type = SUPPLEMENT_DOCTYPES[@pub["supplementType"]] ||
438
+ DOCTYPES[@pub["deliverableType"]] ||
439
+ "international-standard"
440
+ Doctype.new(content: type)
441
+ end
442
+ end
443
+ end
444
+ 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