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,657 @@
1
+ module Relaton::Bipm
2
+ class DataOutcomesParser
3
+ SHORTTYPE = {
4
+ "Resolution" => "RES",
5
+ "Recommendation" => "REC",
6
+ "Decision" => "DECN",
7
+ "Statement" => "DECL",
8
+ "Declaration" => "DECL",
9
+ "Action" => "ACT",
10
+ }.freeze
11
+
12
+ TRANSLATIONS = {
13
+ "Declaration" => "Déclaration",
14
+ "Meeting" => "Réunion",
15
+ "Recommendation" => "Recommandation",
16
+ "Resolution" => "Résolution",
17
+ "Decision" => "Décision",
18
+ }.freeze
19
+
20
+ #
21
+ # Create data-outcomes parser
22
+ #
23
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
24
+ #
25
+ def initialize(data_fetcher)
26
+ @data_fetcher = WeakRef.new data_fetcher
27
+ end
28
+
29
+ #
30
+ # Parse documents from data-outcomes dataset and write them to YAML files
31
+ #
32
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
33
+ #
34
+ def self.parse(data_fetcher)
35
+ new(data_fetcher).parse
36
+ end
37
+
38
+ #
39
+ # Parse BIPM meeting and write them to YAML files
40
+ #
41
+ def parse
42
+ dirs = "cctf,cgpm,cipm,ccauv,ccem,ccl,ccm,ccpr,ccqm,ccri,cct,ccu,jcgm,jcrb"
43
+ source_path = File.join "bipm-data-outcomes", "{#{dirs}}"
44
+ Dir[source_path].each { |body_dir| fetch_body(body_dir) }
45
+ end
46
+
47
+ #
48
+ # Search for English meetings in the body directory
49
+ #
50
+ # @param [String] dir body directory
51
+ #
52
+ def fetch_body(dir)
53
+ body = dir.split("/").last.upcase
54
+ Dir[File.join(dir, "*-en")].each { |type_dir| fetch_type type_dir, body }
55
+ end
56
+
57
+ #
58
+ # Search for meetings
59
+ #
60
+ # @param [String] dir meeting directory
61
+ # @param [String] body name of body
62
+ #
63
+ def fetch_type(dir, body) # rubocop:disable Metrics/AbcSize
64
+ type = dir.split("/").last.split("-").first.sub(/s$/, "").capitalize
65
+ body_dir = File.join @data_fetcher.output, body.downcase
66
+ FileUtils.mkdir_p body_dir
67
+ outdir = File.join body_dir, type.downcase
68
+ FileUtils.mkdir_p outdir
69
+ Dir[File.join(dir, "*.{yml,yaml}")].each { |en_file| fetch_meeting en_file, body, type, outdir }
70
+ end
71
+
72
+ #
73
+ # Create and write BIPM meeting/resolution
74
+ #
75
+ # @param [String] en_file Path to English file
76
+ # @param [String] body Body name
77
+ # @param [String] type meeting
78
+ # @param [String] dir output directory
79
+ #
80
+ def fetch_meeting(en_file, body, type, dir) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
81
+ _, en, fr_file, fr = read_files en_file
82
+ en_md, fr_md, num, part = meeting_md en, fr
83
+ src = meeting_links en_file, fr_file
84
+
85
+ file = "#{num}.#{@data_fetcher.ext}"
86
+ path = File.join dir, file
87
+ hash = meeting_bibitem body: body, type: type, en: en_md, fr: fr_md, num: num, src: src, pdf: en["pdf"]
88
+ if @data_fetcher.files.include?(path) && part
89
+ add_part hash, body, type, num, part
90
+ item = ItemData.new(**hash)
91
+ has_part_item = parse_file path
92
+ has_part_item.relation << Relaton::Bib::Relation.new(type: "partOf", bibitem: item)
93
+ @data_fetcher.write_file path, has_part_item, warn_duplicate: false
94
+ path = File.join dir, "#{num}-#{part}.#{@data_fetcher.ext}"
95
+ elsif part
96
+ hash[:title].each { |t| t.content.sub!(/\s\(.+\)$/, "") }
97
+ h = meeting_bibitem body: body, type: type, en: en_md, fr: fr_md, num: num, src: src, pdf: en["pdf"]
98
+ add_part h, body, type, num, part
99
+ part_item = ItemData.new(**h)
100
+ part_item_path = File.join dir, "#{num}-#{part}.#{@data_fetcher.ext}"
101
+ @data_fetcher.write_file part_item_path, part_item
102
+ add_to_index part_item, part_item_path
103
+ hash[:relation] = [Relaton::Bib::Relation.new(type: "partOf", bibitem: part_item)]
104
+ item = ItemData.new(**hash)
105
+ else
106
+ item = ItemData.new(**hash)
107
+ end
108
+ @data_fetcher.write_file path, item
109
+ add_to_index item, path
110
+ fetch_resolution body: body, en: en, fr: fr, dir: dir, src: src, num: num
111
+ end
112
+
113
+ def parse_file(path)
114
+ case @data_fetcher.format
115
+ when "yaml"
116
+ Item.from_yaml(File.read(path, encoding: "UTF-8"))
117
+ when "xml"
118
+ Item.from_xml(File.read(path, encoding: "UTF-8"))
119
+ end
120
+ end
121
+
122
+ #
123
+ # Read English and French files
124
+ #
125
+ # @param [String] en_file Path to English file
126
+ #
127
+ # @return [Array<Hash, String, nil>] English / French metadata and file path
128
+ #
129
+ def read_files(en_file)
130
+ fr_file = en_file.sub "en", "fr"
131
+ [en_file, fr_file].map do |file|
132
+ if File.exist? file
133
+ data = YAML.safe_load(File.read(file, encoding: "UTF-8"))
134
+ path = file
135
+ end
136
+ [path, data]
137
+ end.flatten
138
+ end
139
+
140
+ def meeting_md(eng, frn)
141
+ en_md = eng["metadata"]
142
+ num, part = en_md["identifier"].to_s.split("-")
143
+ [en_md, frn&.dig("metadata"), num, part]
144
+ end
145
+
146
+ def meeting_links(en_file, fr_file)
147
+ gh_src = "https://raw.githubusercontent.com/metanorma/bipm-data-outcomes/"
148
+ { "en" => en_file, "fr" => fr_file }.map do |lang, file|
149
+ next unless file
150
+
151
+ src = gh_src + file.split("/")[-3..].unshift("main").join("/")
152
+ Relaton::Bib::Uri.new(type: "src", content: src, language: lang, script: "Latn")
153
+ end.compact
154
+ end
155
+
156
+ #
157
+ # Parse BIPM resolutions and write them to YAML files
158
+ #
159
+ # @param [String] body body name
160
+ # @param [Hash] eng English metadata
161
+ # @param [Hash] frn French metadata
162
+ # @param [String] dir output directory
163
+ # @param [Array<Hash>] src links to bipm-data-outcomes
164
+ # @param [String] num number of meeting
165
+ #
166
+ def fetch_resolution(**args) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
167
+ args[:en]["resolutions"].each.with_index do |r, i| # rubocop:disable Metrics/BlockLength
168
+ num = r["identifier"].to_s # .split("-").last
169
+ date = r["dates"].first.to_s
170
+ @data_fetcher.errors[:resolution_date] &&= date.nil? || date.empty?
171
+ year = date.split("-").first
172
+ num = "0" if num == year
173
+
174
+ hash = {
175
+ type: "proceedings",
176
+ title: [],
177
+ place: [Relaton::Bib::Place.new(city: "Paris")],
178
+ ext: create_ext(r["type"], num),
179
+ }
180
+
181
+ fr_r = args.dig(:fr, "resolutions", i) # @TODO: create a GH issue when fr is missing
182
+ hash[:title] = resolution_title r, fr_r
183
+ hash[:source] = resolution_source r, fr_r, args[:src]
184
+ hash[:date] = create_date(type: "published", at: date)
185
+ num_justed = num.rjust 2, "0"
186
+ type = r["type"].capitalize
187
+ docnum = create_resolution_docnum args[:body], type, num, date
188
+ hash[:id] = create_id(body: args[:body], type: type, num: num_justed, date: date)
189
+ hash[:docidentifier] = create_resolution_docids args[:body], type, num, date
190
+ hash[:docnumber] = docnum
191
+ hash[:language] = %w[en fr]
192
+ hash[:script] = ["Latn"]
193
+ hash[:contributor] = contributors date, args[:body]
194
+ @data_fetcher.errors[:resolution_contributor] &&= hash[:contributor].size < 2 # BIPM + committee
195
+ item = ItemData.new(**hash)
196
+ file = "#{year}-#{num_justed}.#{@data_fetcher.ext}"
197
+ out_dir = File.join args[:dir], r["type"].downcase
198
+ FileUtils.mkdir_p out_dir
199
+ path = File.join out_dir, file
200
+ @data_fetcher.write_file path, item
201
+ add_to_index item, path
202
+ end
203
+ end
204
+
205
+ def create_ext(type, num)
206
+ doctype = Doctype.new(content: parse_doctype(type))
207
+ strid = StructuredIdentifier.new docnumber: num
208
+ Ext.new(doctype: doctype, structuredidentifier: strid)
209
+ end
210
+
211
+ def parse_doctype(type)
212
+ case type
213
+ when "Meeting" then "meeting-report"
214
+ else type.downcase
215
+ end
216
+ end
217
+
218
+ #
219
+ # Parse resolution titles
220
+ #
221
+ # @param [Hash] en_r english resolution
222
+ # @param [Hash] fr_r french resolution
223
+ #
224
+ # @return [Array<Hash>] titles
225
+ #
226
+ def resolution_title(en_r, fr_r)
227
+ title = []
228
+ title << create_title(en_r["title"], "en") if en_r["title"] && !en_r["title"].empty?
229
+ title << create_title(fr_r["title"], "fr") if fr_r && fr_r["title"] && !fr_r["title"].empty?
230
+ @data_fetcher.errors[:resolution_title] &&= title.empty?
231
+ title
232
+ end
233
+
234
+ #
235
+ # Parse resolution links
236
+ #
237
+ # @param [Hash] en_r english resolution
238
+ # @param [Hash] fr_r french resolution
239
+ # @param [Array<Hash>] src data source links
240
+ #
241
+ # @return [Array<Hash>] links
242
+ #
243
+ def resolution_source(en_r, fr_r, src)
244
+ source = []
245
+ if en_r["url"] && !en_r["url"].empty?
246
+ source << Relaton::Bib::Uri.new(type: "citation", content: en_r["url"], language: "en", script: "Latn")
247
+ @data_fetcher.errors[:resolution_source_citation_en] = false
248
+ else
249
+ @data_fetcher.errors[:resolution_source_citation] &&= true
250
+ end
251
+ if fr_r && fr_r["url"] && !fr_r["url"].empty?
252
+ source << Relaton::Bib::Uri.new(type: "citation", content: fr_r["url"], language: "fr", script: "Latn")
253
+ @data_fetcher.errors[:resolution_source_citation_fr] = false
254
+ else
255
+ @data_fetcher.errors[:resolution_source_citation_fr] &&= true
256
+ end
257
+ source += src if src
258
+ if en_r["reference"]
259
+ source << Relaton::Bib::Uri.new(type: "pdf", content: en_r["reference"])
260
+ @data_fetcher.errors[:resolution_source_pdf] = false
261
+ else
262
+ @data_fetcher.errors[:resolution_source_pdf] &&= true
263
+ end
264
+ source
265
+ end
266
+
267
+ #
268
+ # Add item to index
269
+ #
270
+ # @param [Relaton::Bipm::ItemData] item bibliographic item
271
+ # @param [String] path path to YAML file
272
+ #
273
+ def add_to_index(item, path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
274
+ key = Id.new.parse(item.docnumber).to_hash
275
+ @data_fetcher.index.add_or_update key, path
276
+ end
277
+
278
+ #
279
+ # Create contributors
280
+ #
281
+ # @param [Strign] date date of publication
282
+ # @param [Strign] body organization abbreviation (CCTF, CIPM, CGPM)
283
+ #
284
+ # @return [Array<Hash>] contributors
285
+ #
286
+ def contributors(date, body)
287
+ contribs = [bipm_contrib]
288
+ subdiv = committee_subdivision date, body
289
+ return contribs unless subdiv
290
+
291
+ bipm_name = [Relaton::Bib::TypedLocalizedString.new(content: "BIPM", script: "Latn")]
292
+ org = Relaton::Bib::Organization.new(name: bipm_name, subdivision: [subdiv])
293
+ desc = Relaton::Bib::LocalizedMarkedUpString.new(content: "committee")
294
+ role = Relaton::Bib::Contributor::Role.new(type: "author", description: [desc])
295
+ contribs << Relaton::Bib::Contributor.new(organization: org, role: [role])
296
+ end
297
+
298
+ #
299
+ # Create committee subdivision
300
+ #
301
+ # @param [String] date date of publication
302
+ # @param [String] body organization abbreviation (CCTF, CIPM, CGPM)
303
+ #
304
+ # @return [Relaton::Bib::Subdivision, nil] committee subdivision
305
+ #
306
+ def committee_subdivision(date, body)
307
+ case body
308
+ when "CCTF" then cctf_subdivision date
309
+ when "CGPM" then cgpm_subdivision
310
+ when "CIPM" then cipm_subdivision
311
+ end
312
+ end
313
+
314
+ #
315
+ # Create BIPM contributor
316
+ #
317
+ # @return [Relaton::Bipm::Contributor] BIPM organization
318
+ #
319
+ def bipm_contrib
320
+ nms = [
321
+ { content: "International Bureau of Weights and Measures", language: "en" },
322
+ { content: "Bureau international des poids et mesures", language: "fr" },
323
+ ]
324
+ bipm_org = organization(nms, "BIPM", abbr_lang: "fr", url: ["www.bipm.org"])
325
+ role = Relaton::Bib::Contributor::Role.new(type: "publisher")
326
+ Relaton::Bib::Contributor.new(organization: bipm_org, role: [role])
327
+ end
328
+
329
+ #
330
+ # Create CCTF subdivision
331
+ #
332
+ # @param [String] date date of meeting
333
+ #
334
+ # @return [Relaton::Bib::Subdivision] CCTF subdivision
335
+ #
336
+ def cctf_subdivision(date) # rubocop:disable Metrics/MethodLength
337
+ if ::Date.parse(date).year < 1999
338
+ nms = [
339
+ { content: "Consultative Committee for the Definition of the Second", language: "en" },
340
+ { content: "Comité Consultatif pour la Définition de la Seconde", language: "fr" },
341
+ ]
342
+ subdivision nms, "CCDS"
343
+ else
344
+ nms = [
345
+ { content: "Consultative Committee for Time and Frequency", language: "en" },
346
+ { content: "Comité consultatif du temps et des fréquences", language: "fr" },
347
+ ]
348
+ subdivision nms, "CCTF"
349
+ end
350
+ end
351
+
352
+ #
353
+ # Create organization
354
+ #
355
+ # @param [Array<Hash>] names organization names in different languages
356
+ # @param [String] abbr abbreviation
357
+ # @param [String] abbr_lang language of abbreviation
358
+ # @param [Array<String>] url array of organization URLs
359
+ #
360
+ # @return [Relaton::Bib::Organization] organization
361
+ #
362
+ def organization(names, abbr, abbr_lang: "en", url: [])
363
+ name = names.map { |ctrb| Relaton::Bib::TypedLocalizedString.new(**ctrb, script: "Latn") }
364
+ abbreviation = Relaton::Bib::LocalizedString.new(content: abbr, language: abbr_lang, script: "Latn")
365
+ uri = url.map { |u| Relaton::Bib::Uri.new(content: u) }
366
+ Relaton::Bib::Organization.new(name: name, abbreviation: abbreviation, uri: uri)
367
+ end
368
+
369
+ #
370
+ # Create subdivision
371
+ #
372
+ # @param [Array<Hash>] names subdivision names in different languages
373
+ # @param [String] abbr abbreviation
374
+ # @param [String] abbr_lang language of abbreviation
375
+ #
376
+ # @return [Relaton::Bib::Subdivision] subdivision
377
+ #
378
+ def subdivision(names, abbr, abbr_lang: "en")
379
+ name = names.map { |n| Relaton::Bib::TypedLocalizedString.new(**n, script: "Latn") }
380
+ abbreviation = Relaton::Bib::LocalizedString.new(content: abbr, language: abbr_lang, script: "Latn")
381
+ Relaton::Bib::Subdivision.new(type: "committee", name: name, abbreviation: abbreviation)
382
+ end
383
+
384
+ #
385
+ # Create CGPM subdivision
386
+ #
387
+ # @return [Relaton::Bib::Subdivision] CGPM subdivision
388
+ #
389
+ def cgpm_subdivision
390
+ nms = [
391
+ { content: "General Conference on Weights and Measures", language: "en" },
392
+ { content: "Conférence Générale des Poids et Mesures", language: "fr" },
393
+ ]
394
+ subdivision nms, "CGPM", abbr_lang: "fr"
395
+ end
396
+
397
+ #
398
+ # Create CIPM subdivision
399
+ #
400
+ # @return [Relaton::Bib::Subdivision] CIPM subdivision
401
+ #
402
+ def cipm_subdivision
403
+ names = [
404
+ { content: "International Committee for Weights and Measures", language: "en" },
405
+ { content: "Comité international des poids et mesures", language: "fr" },
406
+ ]
407
+ subdivision names, "CIPM", abbr_lang: "fr"
408
+ end
409
+
410
+ #
411
+ # Create a title
412
+ #
413
+ # @param [String] content title content
414
+ # @param [String] language language code (en, fr)
415
+ #
416
+ # @return [Hash] title
417
+ #
418
+ def create_title(content, language, format = "text/plain")
419
+ if language == "fr"
420
+ content.sub!(/(\d+)(e)/, '\1<sup>\2</sup>')
421
+ end
422
+ Relaton::Bib::Title.new(content: content, language: language, script: "Latn")
423
+ end
424
+
425
+ #
426
+ # Add part to ID and structured identifier
427
+ #
428
+ # @param [Hash] hash Hash of BIPM meeting
429
+ # @param [String] session number of meeting
430
+ #
431
+ def add_part(hash, body, type, num, part)
432
+ regex = /(\p{L}+\s(?:\w+\/)?\d+)(?![\d-])/
433
+ date = hash[:date].first.at.to_s
434
+ hash[:id] = create_id(body: body, type: type, num: num, part: part, date: date) # += "#{part}"
435
+ hash[:docnumber].sub!(regex) { |m| "#{m}-#{part}" }
436
+ hash[:docidentifier].select { |id| id.type == "BIPM" }.each do |did|
437
+ did.content.sub!(regex) { "#{$1}-#{part}" }
438
+ # did.instance_variable_set(:@id, id)
439
+ end
440
+ hash[:ext].structuredidentifier.part = part
441
+ end
442
+
443
+ #
444
+ # Create hash from BIPM meeting
445
+ #
446
+ # @param [Hash] **args Hash of arguments
447
+ # @option args [String] :type meeting
448
+ # @option args [Hash] :en Hash of English metadata
449
+ # @option args [Hash] :fr Hash of French metadata
450
+ # @option args [String] :id ID of meeting
451
+ # @option args [String] :num Number of meeting
452
+ # @option args [Array<Hash>] :src Array of links to bipm-data-outcomes
453
+ # @option args [String] :pdf link to PDF
454
+ #
455
+ # @return [Hash] Hash of BIPM meeting/resolution
456
+ #
457
+ def meeting_bibitem(**args) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
458
+ docnum = create_meeting_docnum args[:body], args[:type], args[:num], args[:en]["date"]
459
+ hash = {
460
+ title: [],
461
+ type: "proceedings",
462
+ place: [Relaton::Bib::Place.new(city: "Paris")],
463
+ ext: create_ext(args[:type], args[:num]),
464
+ }
465
+ hash[:title] = create_titles args.slice(:en, :fr)
466
+ hash[:date] = create_date(type: "published", at: args[:en]["date"])
467
+ @data_fetcher.errors[:meeting_date] &&= hash[:date].empty?
468
+ hash[:docidentifier] = create_meeting_docids docnum
469
+ hash[:docnumber] = docnum # .sub(" --", "").sub(/\s\(\d{4}\)/, "")
470
+ hash[:id] = create_id(body: args[:body], type: args[:type], num: args[:num], date: args[:en]["date"])
471
+ hash[:source] = create_links(**args)
472
+ @data_fetcher.errors[:meeting_source] &&= hash[:source].empty?
473
+ hash[:language] = %w[en fr]
474
+ hash[:script] = ["Latn"]
475
+ hash[:contributor] = contributors args[:en]["date"], args[:body]
476
+ @data_fetcher.errors[:meeting_contributor] &&= hash[:contributor].size < 2 # BIPM + committee
477
+ hash
478
+ end
479
+
480
+ def create_date(**args)
481
+ return [] if args[:at].nil? || args[:at].empty?
482
+
483
+ [Relaton::Bib::Date.new(**args)]
484
+ end
485
+
486
+ def create_titles(data)
487
+ result = data.each_with_object([]) do |(lang, md), mem|
488
+ mem << create_title(md["title"], lang.to_s) if md && md["title"]
489
+ end
490
+ @data_fetcher.errors[:meeting_title] &&= result.empty?
491
+ result
492
+ end
493
+
494
+ #
495
+ # Create links
496
+ #
497
+ # @param [Hash] **args Hash of arguments
498
+ #
499
+ # @return [Array<Hash>] Array of links
500
+ #
501
+ def create_links(**args)
502
+ links = args.slice(:en, :fr).each_with_object([]) do |(lang, md), mem|
503
+ next unless md && md["url"]
504
+
505
+ mem << Relaton::Bib::Uri.new(type: "citation", content: md["url"], language: lang.to_s, script: "Latn")
506
+ end
507
+ Array(args[:pdf]).each { |pdf| links << Relaton::Bib::Uri.new(type: "pdf", content: pdf) }
508
+ links += args[:src] if args[:src]
509
+ links
510
+ end
511
+
512
+ #
513
+ # Creata resolution document number
514
+ #
515
+ # @param [String] body CIPM, CGPM, CCTF
516
+ # @param [String] type Recommendation, Resolution, Decision
517
+ # @param [String] num number of recommendation, resolution, decision
518
+ # @param [String] date date of publication
519
+ #
520
+ # @return [String] document number
521
+ #
522
+ def create_resolution_docnum(body, type, num, date)
523
+ year = ::Date.parse(date).year
524
+ id = "#{body} #{SHORTTYPE[type.capitalize]}"
525
+ id += " #{num}" if num.to_i.positive?
526
+ "#{id} (#{year})"
527
+ end
528
+
529
+ #
530
+ # Create meeting document number
531
+ #
532
+ # @param [String] body CIPM, CGPM, CCTF
533
+ # @param [String] type meeting
534
+ # @param [String] num number of meeting
535
+ # @param [String] date date of publication
536
+ #
537
+ # @return [String] <description>
538
+ #
539
+ def create_meeting_docnum(body, type, num, date)
540
+ year = ::Date.parse(date).year
541
+ ord = %w[th st nd rd th th th th th th][num.to_i % 10]
542
+ "#{body} #{num}#{ord} #{type} (#{year})"
543
+ end
544
+
545
+ #
546
+ # Create ID
547
+ #
548
+ # @param [String] body CIPM, CGPM, CCTF
549
+ # @param [String] type meeting, recommendation, resolution, decision
550
+ # @param [String, nil] num number of meeting, recommendation, resolution, decision
551
+ # @param [String] date published date
552
+ #
553
+ # @return [String] ID
554
+ #
555
+ def create_id(body:, type:, num:, part: nil, date:)
556
+ year = ::Date.parse(date).year
557
+ [body, SHORTTYPE[type.capitalize] || type, num, part, year].compact.join.gsub("-", "")
558
+ end
559
+
560
+ #
561
+ # Check if ID is special case
562
+ #
563
+ # @param [String] body body of meeting
564
+ # @param [String] type type of meeting
565
+ # @param [String] year published year
566
+ #
567
+ # @return [Boolean] is special case
568
+ #
569
+ def special_id_case?(body, type, year)
570
+ (body == "CIPM" && type == "Decision" && year.to_i > 2011) ||
571
+ (body == "JCRB" && %w[Recomendation Resolution Descision].include?(type))
572
+ end
573
+
574
+ #
575
+ # Create documetn IDs
576
+ #
577
+ # @param [String] en_id document ID in English
578
+ #
579
+ # @return [Array<Relaton::Bib::Docidentifier>] document IDs
580
+ #
581
+ def create_resolution_docids(body, type, num, date)
582
+ year = ::Date.parse(date).year
583
+ ids = []
584
+ resolution_short_ids(body, type, num, year) { |id| ids << id }
585
+ resolution_long_ids(body, type, num, year) { |id| ids << id }
586
+ @data_fetcher.errors[:resolution_docidentifier] &&= ids.empty?
587
+ ids
588
+ end
589
+
590
+ def resolution_short_ids(body, type, num, year, &_block)
591
+ short_type = SHORTTYPE[type]
592
+ id = "#{body} #{short_type}"
593
+ id += " #{num}" if num.to_i.positive?
594
+
595
+ short = "#{id} (#{year})"
596
+ yield make_docid(content: short, type: "BIPM", primary: true)
597
+
598
+ en = "#{id} (#{year}, E)"
599
+ yield make_docid(content: en, type: "BIPM", primary: true, language: "en", script: "Latn")
600
+
601
+ fr = "#{id} (#{year}, F)"
602
+ yield make_docid(content: fr, type: "BIPM", primary: true, language: "fr", script: "Latn")
603
+ end
604
+
605
+ def resolution_long_ids(body, type, num, year, &_block)
606
+ en = "#{body} #{type}"
607
+ en += " #{num}" if num.to_i.positive?
608
+ en += " (#{year})"
609
+ yield make_docid content: en, type: "BIPM-long", language: "en", script: "Latn"
610
+
611
+ fr = resolution_fr_long_id(body, type, num, year)
612
+ yield make_docid content: fr, type: "BIPM-long", language: "fr", script: "Latn"
613
+
614
+ yield make_docid(content: "#{en} / #{fr}", type: "BIPM-long")
615
+ end
616
+
617
+ def resolution_fr_long_id(body, type, num, year)
618
+ fr = TRANSLATIONS[type] || type
619
+ if special_id_case? body, type, year
620
+ fr += " #{body}"
621
+ fr += "/#{num}" if num.to_i.positive?
622
+ else
623
+ fr += " #{num}" if num.to_i.positive?
624
+ fr += body == "CGPM" ? " de la" : " du"
625
+ fr += " #{body}"
626
+ end
627
+ "#{fr} (#{year})"
628
+ end
629
+
630
+ def create_meeting_docids(en_id)
631
+ fr_id = en_id.sub(/(\d+)(?:st|nd|rd|th)/, '\1e').sub("Meeting", "réunion")
632
+ fr_id_sup = fr_id.sub(/(\d+)(e)/, '\1<sup>\2</sup>')
633
+ result = [
634
+ make_docid(content: en_id, type: "BIPM", primary: true, language: "en", script: "Latn"),
635
+ make_docid(content: fr_id_sup, type: "BIPM", primary: true, language: "fr", script: "Latn"),
636
+ make_docid(content: "#{en_id} / #{fr_id_sup}", type: "BIPM", primary: true),
637
+ ]
638
+ @data_fetcher.errors[:meeting_docidentifier] &&= result.empty?
639
+ result
640
+ end
641
+
642
+ #
643
+ # Create doucment ID
644
+ #
645
+ # @param [String] id ID of document
646
+ # @param [String] type Type of document
647
+ # @param [Boolean] primary Primary document
648
+ # @param [String] language Language of document
649
+ # @param [String] script Script of document
650
+ #
651
+ # @return [Relaton::Bib::Docidentifier] Document ID
652
+ #
653
+ def make_docid(**args)
654
+ Relaton::Bib::Docidentifier.new(**args)
655
+ end
656
+ end
657
+ end