relaton 2.2.0.pre.alpha.1 → 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 (610) 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/registry.rb +4 -4
  188. data/lib/relaton/db.rb +0 -1
  189. data/lib/relaton/doi/crossref.rb +72 -0
  190. data/lib/relaton/doi/parser.rb +827 -0
  191. data/lib/relaton/doi/processor.rb +65 -0
  192. data/lib/relaton/doi/util.rb +8 -0
  193. data/lib/relaton/doi.rb +20 -0
  194. data/lib/relaton/ecma/bibdata.rb +8 -0
  195. data/lib/relaton/ecma/bibitem.rb +8 -0
  196. data/lib/relaton/ecma/bibliography.rb +81 -0
  197. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  198. data/lib/relaton/ecma/data_parser.rb +49 -0
  199. data/lib/relaton/ecma/edition_parser.rb +80 -0
  200. data/lib/relaton/ecma/ext.rb +7 -0
  201. data/lib/relaton/ecma/item.rb +11 -0
  202. data/lib/relaton/ecma/item_data.rb +6 -0
  203. data/lib/relaton/ecma/memento_parser.rb +60 -0
  204. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  205. data/lib/relaton/ecma/parser_common.rb +33 -0
  206. data/lib/relaton/ecma/processor.rb +66 -0
  207. data/lib/relaton/ecma/standard_parser.rb +134 -0
  208. data/lib/relaton/ecma/util.rb +8 -0
  209. data/lib/relaton/ecma.rb +24 -0
  210. data/lib/relaton/etsi/bibdata.rb +10 -0
  211. data/lib/relaton/etsi/bibitem.rb +10 -0
  212. data/lib/relaton/etsi/bibliography.rb +46 -0
  213. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  214. data/lib/relaton/etsi/data_parser.rb +208 -0
  215. data/lib/relaton/etsi/doctype.rb +30 -0
  216. data/lib/relaton/etsi/ext.rb +31 -0
  217. data/lib/relaton/etsi/item.rb +15 -0
  218. data/lib/relaton/etsi/item_data.rb +6 -0
  219. data/lib/relaton/etsi/processor.rb +69 -0
  220. data/lib/relaton/etsi/pubid.rb +37 -0
  221. data/lib/relaton/etsi/status.rb +13 -0
  222. data/lib/relaton/etsi/util.rb +8 -0
  223. data/lib/relaton/etsi.rb +25 -0
  224. data/lib/relaton/gb/bibdata.rb +8 -0
  225. data/lib/relaton/gb/bibitem.rb +8 -0
  226. data/lib/relaton/gb/bibliography.rb +145 -0
  227. data/lib/relaton/gb/ccs.rb +14 -0
  228. data/lib/relaton/gb/committee.rb +13 -0
  229. data/lib/relaton/gb/docidentifier.rb +23 -0
  230. data/lib/relaton/gb/doctype.rb +9 -0
  231. data/lib/relaton/gb/ext.rb +36 -0
  232. data/lib/relaton/gb/gb_scraper.rb +61 -0
  233. data/lib/relaton/gb/gb_type.rb +20 -0
  234. data/lib/relaton/gb/hit.rb +48 -0
  235. data/lib/relaton/gb/hit_collection.rb +19 -0
  236. data/lib/relaton/gb/item.rb +13 -0
  237. data/lib/relaton/gb/item_data.rb +6 -0
  238. data/lib/relaton/gb/processor.rb +46 -0
  239. data/lib/relaton/gb/project_number.rb +38 -0
  240. data/lib/relaton/gb/scraper.rb +204 -0
  241. data/lib/relaton/gb/sec_scraper.rb +92 -0
  242. data/lib/relaton/gb/stage_name.rb +13 -0
  243. data/lib/relaton/gb/structured_identifier.rb +26 -0
  244. data/lib/relaton/gb/t_scraper.rb +126 -0
  245. data/lib/relaton/gb/util.rb +8 -0
  246. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  247. data/lib/relaton/gb.rb +33 -0
  248. data/lib/relaton/iana/bibdata.rb +8 -0
  249. data/lib/relaton/iana/bibitem.rb +8 -0
  250. data/lib/relaton/iana/bibliography.rb +47 -0
  251. data/lib/relaton/iana/data_fetcher.rb +71 -0
  252. data/lib/relaton/iana/item.rb +7 -0
  253. data/lib/relaton/iana/item_data.rb +6 -0
  254. data/lib/relaton/iana/parser.rb +146 -0
  255. data/lib/relaton/iana/processor.rb +68 -0
  256. data/lib/relaton/iana/util.rb +8 -0
  257. data/lib/relaton/iana.rb +29 -0
  258. data/lib/relaton/iec/bibliography.rb +283 -0
  259. data/lib/relaton/iec/data_fetcher.rb +216 -0
  260. data/lib/relaton/iec/data_parser.rb +391 -0
  261. data/lib/relaton/iec/hit.rb +26 -0
  262. data/lib/relaton/iec/hit_collection.rb +138 -0
  263. data/lib/relaton/iec/item_data.rb +7 -0
  264. data/lib/relaton/iec/model/bibdata.rb +8 -0
  265. data/lib/relaton/iec/model/bibitem.rb +8 -0
  266. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  267. data/lib/relaton/iec/model/doctype.rb +12 -0
  268. data/lib/relaton/iec/model/ext.rb +53 -0
  269. data/lib/relaton/iec/model/item.rb +20 -0
  270. data/lib/relaton/iec/model/item_base.rb +12 -0
  271. data/lib/relaton/iec/model/relation.rb +7 -0
  272. data/lib/relaton/iec/model/stage_name.rb +13 -0
  273. data/lib/relaton/iec/processor.rb +73 -0
  274. data/lib/relaton/iec/statuses.yml +199 -0
  275. data/lib/relaton/iec/util.rb +8 -0
  276. data/lib/relaton/iec.rb +98 -0
  277. data/lib/relaton/ieee/balloting_group.rb +13 -0
  278. data/lib/relaton/ieee/bibdata.rb +8 -0
  279. data/lib/relaton/ieee/bibitem.rb +8 -0
  280. data/lib/relaton/ieee/bibliography.rb +51 -0
  281. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  282. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  283. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  284. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  285. data/lib/relaton/ieee/doctype.rb +9 -0
  286. data/lib/relaton/ieee/editorial_group.rb +19 -0
  287. data/lib/relaton/ieee/ext.rb +36 -0
  288. data/lib/relaton/ieee/idams_parser.rb +323 -0
  289. data/lib/relaton/ieee/item.rb +11 -0
  290. data/lib/relaton/ieee/item_data.rb +7 -0
  291. data/lib/relaton/ieee/processor.rb +68 -0
  292. data/lib/relaton/ieee/pub_id.rb +161 -0
  293. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  294. data/lib/relaton/ieee/util.rb +8 -0
  295. data/lib/relaton/ieee.rb +29 -0
  296. data/lib/relaton/ietf/bibdata.rb +8 -0
  297. data/lib/relaton/ietf/bibitem.rb +8 -0
  298. data/lib/relaton/ietf/bibliography.rb +35 -0
  299. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  300. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  301. data/lib/relaton/ietf/doctype.rb +9 -0
  302. data/lib/relaton/ietf/ext.rb +63 -0
  303. data/lib/relaton/ietf/item.rb +16 -0
  304. data/lib/relaton/ietf/item_base.rb +18 -0
  305. data/lib/relaton/ietf/item_data.rb +6 -0
  306. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  307. data/lib/relaton/ietf/processor.rb +68 -0
  308. data/lib/relaton/ietf/relation.rb +9 -0
  309. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  310. data/lib/relaton/ietf/rfc/author.rb +21 -0
  311. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  312. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  313. data/lib/relaton/ietf/rfc/format.rb +19 -0
  314. data/lib/relaton/ietf/rfc/index.rb +46 -0
  315. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  316. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  317. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  318. data/lib/relaton/ietf/scraper.rb +68 -0
  319. data/lib/relaton/ietf/util.rb +8 -0
  320. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  321. data/lib/relaton/ietf.rb +27 -0
  322. data/lib/relaton/iho/bibdata.rb +8 -0
  323. data/lib/relaton/iho/bibitem.rb +8 -0
  324. data/lib/relaton/iho/bibliography.rb +114 -0
  325. data/lib/relaton/iho/comment_period.rb +13 -0
  326. data/lib/relaton/iho/docidentifier.rb +31 -0
  327. data/lib/relaton/iho/doctype.rb +10 -0
  328. data/lib/relaton/iho/ext.rb +20 -0
  329. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  330. data/lib/relaton/iho/item.rb +20 -0
  331. data/lib/relaton/iho/item_base.rb +18 -0
  332. data/lib/relaton/iho/item_data.rb +6 -0
  333. data/lib/relaton/iho/processor.rb +54 -0
  334. data/lib/relaton/iho/relation.rb +9 -0
  335. data/lib/relaton/iho/structured_identifier.rb +20 -0
  336. data/lib/relaton/iho/util.rb +8 -0
  337. data/lib/relaton/iho.rb +27 -0
  338. data/lib/relaton/index/config.rb +52 -0
  339. data/lib/relaton/index/file_io.rb +305 -0
  340. data/lib/relaton/index/file_storage.rb +61 -0
  341. data/lib/relaton/index/id_number.rb +30 -0
  342. data/lib/relaton/index/pool.rb +41 -0
  343. data/lib/relaton/index/type.rb +159 -0
  344. data/lib/relaton/index/util.rb +18 -0
  345. data/lib/relaton/index.rb +60 -0
  346. data/lib/relaton/isbn/isbn.rb +61 -0
  347. data/lib/relaton/isbn/open_library.rb +43 -0
  348. data/lib/relaton/isbn/parser.rb +88 -0
  349. data/lib/relaton/isbn/processor.rb +48 -0
  350. data/lib/relaton/isbn/util.rb +8 -0
  351. data/lib/relaton/isbn.rb +19 -0
  352. data/lib/relaton/iso/bibliography.rb +407 -0
  353. data/lib/relaton/iso/data_fetcher.rb +338 -0
  354. data/lib/relaton/iso/data_parser.rb +444 -0
  355. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  356. data/lib/relaton/iso/hit.rb +57 -0
  357. data/lib/relaton/iso/hit_collection.rb +184 -0
  358. data/lib/relaton/iso/item_data.rb +28 -0
  359. data/lib/relaton/iso/model/bibdata.rb +10 -0
  360. data/lib/relaton/iso/model/bibitem.rb +8 -0
  361. data/lib/relaton/iso/model/contributor.rb +6 -0
  362. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  363. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  364. data/lib/relaton/iso/model/doctype.rb +13 -0
  365. data/lib/relaton/iso/model/ext.rb +35 -0
  366. data/lib/relaton/iso/model/item.rb +17 -0
  367. data/lib/relaton/iso/model/item_base.rb +22 -0
  368. data/lib/relaton/iso/model/organization.rb +9 -0
  369. data/lib/relaton/iso/model/project_number.rb +22 -0
  370. data/lib/relaton/iso/model/relation.rb +9 -0
  371. data/lib/relaton/iso/model/stagename.rb +14 -0
  372. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  373. data/lib/relaton/iso/processor.rb +84 -0
  374. data/lib/relaton/iso/scraper.rb +619 -0
  375. data/lib/relaton/iso/type/pubid.rb +50 -0
  376. data/lib/relaton/iso/util.rb +8 -0
  377. data/lib/relaton/iso.rb +30 -0
  378. data/lib/relaton/itu/bibliography.rb +90 -0
  379. data/lib/relaton/itu/data_fetcher.rb +104 -0
  380. data/lib/relaton/itu/data_parser_r.rb +140 -0
  381. data/lib/relaton/itu/hit.rb +22 -0
  382. data/lib/relaton/itu/hit_collection.rb +127 -0
  383. data/lib/relaton/itu/item_data.rb +6 -0
  384. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  385. data/lib/relaton/itu/model/bibdata.rb +8 -0
  386. data/lib/relaton/itu/model/bibitem.rb +8 -0
  387. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  388. data/lib/relaton/itu/model/doctype.rb +13 -0
  389. data/lib/relaton/itu/model/ext.rb +47 -0
  390. data/lib/relaton/itu/model/item.rb +13 -0
  391. data/lib/relaton/itu/model/meeting.rb +13 -0
  392. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  393. data/lib/relaton/itu/model/question.rb +13 -0
  394. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  395. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  396. data/lib/relaton/itu/processor.rb +66 -0
  397. data/lib/relaton/itu/pubid.rb +177 -0
  398. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  399. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  400. data/lib/relaton/itu/scraper.rb +193 -0
  401. data/lib/relaton/itu/util.rb +8 -0
  402. data/lib/relaton/itu.rb +33 -0
  403. data/lib/relaton/jis/bibdata.rb +8 -0
  404. data/lib/relaton/jis/bibitem.rb +8 -0
  405. data/lib/relaton/jis/bibliography.rb +75 -0
  406. data/lib/relaton/jis/data_fetcher.rb +181 -0
  407. data/lib/relaton/jis/docidentifier.rb +21 -0
  408. data/lib/relaton/jis/doctype.rb +9 -0
  409. data/lib/relaton/jis/ext.rb +13 -0
  410. data/lib/relaton/jis/hit.rb +93 -0
  411. data/lib/relaton/jis/hit_collection.rb +127 -0
  412. data/lib/relaton/jis/item.rb +22 -0
  413. data/lib/relaton/jis/item_base.rb +26 -0
  414. data/lib/relaton/jis/item_data.rb +8 -0
  415. data/lib/relaton/jis/processor.rb +55 -0
  416. data/lib/relaton/jis/relation.rb +11 -0
  417. data/lib/relaton/jis/scraper.rb +232 -0
  418. data/lib/relaton/jis/structured_identifier.rb +13 -0
  419. data/lib/relaton/jis/util.rb +8 -0
  420. data/lib/relaton/jis.rb +33 -0
  421. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  422. data/lib/relaton/logger/config.rb +34 -0
  423. data/lib/relaton/logger/formatter_json.rb +8 -0
  424. data/lib/relaton/logger/formatter_string.rb +12 -0
  425. data/lib/relaton/logger/log.rb +64 -0
  426. data/lib/relaton/logger/log_device.rb +27 -0
  427. data/lib/relaton/logger/pool.rb +24 -0
  428. data/lib/relaton/logger.rb +18 -0
  429. data/lib/relaton/nist/bibdata.rb +8 -0
  430. data/lib/relaton/nist/bibitem.rb +8 -0
  431. data/lib/relaton/nist/bibliography.rb +191 -0
  432. data/lib/relaton/nist/comment_period.rb +15 -0
  433. data/lib/relaton/nist/data_fetcher.rb +84 -0
  434. data/lib/relaton/nist/date.rb +7 -0
  435. data/lib/relaton/nist/doctype.rb +7 -0
  436. data/lib/relaton/nist/ext.rb +16 -0
  437. data/lib/relaton/nist/hit.rb +18 -0
  438. data/lib/relaton/nist/hit_collection.rb +362 -0
  439. data/lib/relaton/nist/item.rb +17 -0
  440. data/lib/relaton/nist/item_data.rb +6 -0
  441. data/lib/relaton/nist/mods_parser.rb +276 -0
  442. data/lib/relaton/nist/processor.rb +68 -0
  443. data/lib/relaton/nist/pubs_export.rb +69 -0
  444. data/lib/relaton/nist/relation.rb +7 -0
  445. data/lib/relaton/nist/scraper.rb +290 -0
  446. data/lib/relaton/nist/series.yaml +49 -0
  447. data/lib/relaton/nist/util.rb +8 -0
  448. data/lib/relaton/nist.rb +34 -0
  449. data/lib/relaton/oasis/bibdata.rb +8 -0
  450. data/lib/relaton/oasis/bibitem.rb +8 -0
  451. data/lib/relaton/oasis/bibliography.rb +60 -0
  452. data/lib/relaton/oasis/browser_agent.rb +71 -0
  453. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  454. data/lib/relaton/oasis/data_parser.rb +305 -0
  455. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  456. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  457. data/lib/relaton/oasis/doctype.rb +7 -0
  458. data/lib/relaton/oasis/ext.rb +19 -0
  459. data/lib/relaton/oasis/item.rb +11 -0
  460. data/lib/relaton/oasis/item_data.rb +6 -0
  461. data/lib/relaton/oasis/processor.rb +68 -0
  462. data/lib/relaton/oasis/util.rb +8 -0
  463. data/lib/relaton/oasis.rb +28 -0
  464. data/lib/relaton/ogc/bibdata.rb +8 -0
  465. data/lib/relaton/ogc/bibitem.rb +8 -0
  466. data/lib/relaton/ogc/bibliography.rb +64 -0
  467. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  468. data/lib/relaton/ogc/docidentifier.rb +6 -0
  469. data/lib/relaton/ogc/doctype.rb +12 -0
  470. data/lib/relaton/ogc/ext.rb +15 -0
  471. data/lib/relaton/ogc/hit.rb +18 -0
  472. data/lib/relaton/ogc/hit_collection.rb +36 -0
  473. data/lib/relaton/ogc/item.rb +13 -0
  474. data/lib/relaton/ogc/item_data.rb +6 -0
  475. data/lib/relaton/ogc/processor.rb +58 -0
  476. data/lib/relaton/ogc/scraper.rb +225 -0
  477. data/lib/relaton/ogc/util.rb +8 -0
  478. data/lib/relaton/ogc.rb +26 -0
  479. data/lib/relaton/oiml/bibdata.rb +8 -0
  480. data/lib/relaton/oiml/bibitem.rb +8 -0
  481. data/lib/relaton/oiml/bibliography.rb +94 -0
  482. data/lib/relaton/oiml/docidentifier.rb +33 -0
  483. data/lib/relaton/oiml/doctype.rb +13 -0
  484. data/lib/relaton/oiml/ext.rb +42 -0
  485. data/lib/relaton/oiml/item.rb +20 -0
  486. data/lib/relaton/oiml/item_base.rb +18 -0
  487. data/lib/relaton/oiml/item_data.rb +6 -0
  488. data/lib/relaton/oiml/processor.rb +54 -0
  489. data/lib/relaton/oiml/relation.rb +9 -0
  490. data/lib/relaton/oiml/util.rb +8 -0
  491. data/lib/relaton/oiml.rb +24 -0
  492. data/lib/relaton/omg/bibdata.rb +8 -0
  493. data/lib/relaton/omg/bibitem.rb +8 -0
  494. data/lib/relaton/omg/bibliography.rb +31 -0
  495. data/lib/relaton/omg/ext.rb +7 -0
  496. data/lib/relaton/omg/item.rb +8 -0
  497. data/lib/relaton/omg/item_data.rb +6 -0
  498. data/lib/relaton/omg/processor.rb +34 -0
  499. data/lib/relaton/omg/scraper.rb +141 -0
  500. data/lib/relaton/omg/util.rb +8 -0
  501. data/lib/relaton/omg.rb +24 -0
  502. data/lib/relaton/plateau/bibdata.rb +8 -0
  503. data/lib/relaton/plateau/bibitem.rb +8 -0
  504. data/lib/relaton/plateau/bibliography.rb +24 -0
  505. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  506. data/lib/relaton/plateau/doctype.rb +7 -0
  507. data/lib/relaton/plateau/ext.rb +23 -0
  508. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  509. data/lib/relaton/plateau/hit.rb +13 -0
  510. data/lib/relaton/plateau/hit_collection.rb +59 -0
  511. data/lib/relaton/plateau/item.rb +12 -0
  512. data/lib/relaton/plateau/item_data.rb +6 -0
  513. data/lib/relaton/plateau/parser.rb +101 -0
  514. data/lib/relaton/plateau/processor.rb +49 -0
  515. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  516. data/lib/relaton/plateau/util.rb +8 -0
  517. data/lib/relaton/plateau.rb +28 -0
  518. data/lib/relaton/un/bibdata.rb +8 -0
  519. data/lib/relaton/un/bibitem.rb +8 -0
  520. data/lib/relaton/un/bibliography.rb +48 -0
  521. data/lib/relaton/un/doctype.rb +10 -0
  522. data/lib/relaton/un/ext.rb +30 -0
  523. data/lib/relaton/un/hit.rb +56 -0
  524. data/lib/relaton/un/hit_collection.rb +61 -0
  525. data/lib/relaton/un/item.rb +11 -0
  526. data/lib/relaton/un/item_data.rb +6 -0
  527. data/lib/relaton/un/parser.rb +108 -0
  528. data/lib/relaton/un/processor.rb +38 -0
  529. data/lib/relaton/un/session.rb +25 -0
  530. data/lib/relaton/un/token_generator.rb +105 -0
  531. data/lib/relaton/un/util.rb +8 -0
  532. data/lib/relaton/un/wasm/decoder.rb +434 -0
  533. data/lib/relaton/un/wasm/instance.rb +101 -0
  534. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  535. data/lib/relaton/un/wasm/memory.rb +112 -0
  536. data/lib/relaton/un/wasm/module.rb +47 -0
  537. data/lib/relaton/un/wasm.rb +17 -0
  538. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  539. data/lib/relaton/un.rb +28 -0
  540. data/lib/relaton/version.rb +1 -1
  541. data/lib/relaton/w3c/bibdata.rb +8 -0
  542. data/lib/relaton/w3c/bibitem.rb +8 -0
  543. data/lib/relaton/w3c/bibliography.rb +54 -0
  544. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  545. data/lib/relaton/w3c/data_parser.rb +379 -0
  546. data/lib/relaton/w3c/doctype.rb +7 -0
  547. data/lib/relaton/w3c/ext.rb +11 -0
  548. data/lib/relaton/w3c/item.rb +12 -0
  549. data/lib/relaton/w3c/item_data.rb +6 -0
  550. data/lib/relaton/w3c/processor.rb +49 -0
  551. data/lib/relaton/w3c/pubid.rb +73 -0
  552. data/lib/relaton/w3c/safe_realize.rb +59 -0
  553. data/lib/relaton/w3c/util.rb +8 -0
  554. data/lib/relaton/w3c.rb +25 -0
  555. data/lib/relaton/xsf/bibdata.rb +8 -0
  556. data/lib/relaton/xsf/bibitem.rb +8 -0
  557. data/lib/relaton/xsf/bibliography.rb +24 -0
  558. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  559. data/lib/relaton/xsf/hit.rb +17 -0
  560. data/lib/relaton/xsf/hit_collection.rb +24 -0
  561. data/lib/relaton/xsf/item.rb +7 -0
  562. data/lib/relaton/xsf/item_data.rb +6 -0
  563. data/lib/relaton/xsf/processor.rb +50 -0
  564. data/lib/relaton/xsf/util.rb +9 -0
  565. data/lib/relaton/xsf.rb +30 -0
  566. data/lib/relaton-core.rb +1 -0
  567. data/lib/relaton.rb +43 -0
  568. metadata +673 -170
  569. data/.github/workflows/rake.yml +0 -14
  570. data/.github/workflows/release.yml +0 -24
  571. data/.github/workflows/rubocop.yml +0 -48
  572. data/.gitignore +0 -12
  573. data/.rspec +0 -3
  574. data/CLAUDE.md +0 -78
  575. data/Gemfile +0 -29
  576. data/Rakefile +0 -6
  577. data/docs/CHANGELOG.adoc +0 -16
  578. data/docs/VERSIONING_POLICY.adoc +0 -38
  579. data/docs/navigation.adoc +0 -6
  580. data/lib/relaton/db/version.rb +0 -5
  581. data/relaton.gemspec +0 -72
  582. data/spec/relaton/config_spec.rb +0 -10
  583. data/spec/relaton/db_cache_spec.rb +0 -51
  584. data/spec/relaton/db_spec.rb +0 -567
  585. data/spec/relaton/registry_spec.rb +0 -178
  586. data/spec/relaton/util_spec.rb +0 -3
  587. data/spec/relaton_meta_spec.rb +0 -25
  588. data/spec/relaton_spec.rb +0 -800
  589. data/spec/spec_helper.rb +0 -45
  590. data/spec/support/gb_t_20223_2006.xml +0 -33
  591. data/spec/support/iso_111111119115_1.xml +0 -0
  592. data/spec/support/iso_19115_1.xml +0 -115
  593. data/spec/support/iso_19115_2.xml +0 -95
  594. data/spec/support/rfc_8341.xml +0 -46
  595. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  596. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  597. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  598. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  599. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  600. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  601. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  602. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  603. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  604. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  605. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  606. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  607. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  608. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  609. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  610. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit"
4
+
5
+ module Relaton
6
+ module Iso
7
+ # Page of hit collection.
8
+ class HitCollection < Relaton::Core::HitCollection
9
+ ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-iso/v2/"
10
+
11
+ def opts
12
+ @opts ||= {}
13
+ end
14
+
15
+ # Maps the legacy 1.x exclude symbols to their pubid 2.x attribute
16
+ # names. The public excludings API still uses :year/:iteration for
17
+ # backwards compatibility with existing call sites and specs.
18
+ LEGACY_EXCLUDE_MAP = { year: :date, iteration: :stage_iteration }.freeze
19
+ private_constant :LEGACY_EXCLUDE_MAP
20
+
21
+ def translate_excludings(attrs)
22
+ out = attrs.map { |a| LEGACY_EXCLUDE_MAP[a] || a }
23
+ # Excluding :stage implies excluding :typed_stage too — the two
24
+ # carry overlapping data and their default-published values can
25
+ # differ in trivia (e.g. original_abbr "" vs nil), so leaving
26
+ # typed_stage in the comparison breaks otherwise-equal matches.
27
+ out << :typed_stage if out.include?(:stage) && !out.include?(:typed_stage)
28
+ out
29
+ end
30
+
31
+ def ref_pubid_no_year
32
+ @ref_pubid_no_year ||=
33
+ if ref.base_identifier
34
+ ref.dup.tap { |r| r.base_identifier = r.base_identifier.exclude(:date) }
35
+ else
36
+ ref.exclude(:date)
37
+ end
38
+ end
39
+
40
+ def ref_pubid_excluded
41
+ return @ref_pubid_excluded if defined? @ref_pubid_excluded
42
+
43
+ ref_excludings = translate_excludings(excludings) + [:all_parts]
44
+ @ref_pubid_excluded ||= ref_pubid_no_year.exclude(*ref_excludings)
45
+ end
46
+
47
+ #
48
+ # Find all the entries that match the given reference.
49
+ #
50
+ # @return [Array<Relaton::Iso::Hit>] hits
51
+ #
52
+ def find # rubocop:disable Metrics/AbcSize
53
+ # Pass `ref` (a Pubid::Identifier, not a String) so the index can
54
+ # narrow candidates by number via binary search before applying the
55
+ # block, instead of a full O(n) scan of every row. Every row's `:id`
56
+ # is already a Pubid::Identifier — Relaton::Index deserialized it via
57
+ # the `pubid_class` passed in `#index` — so `pubid_match?` compares
58
+ # Pubid to Pubid directly.
59
+ @array = index.search(ref) do |row|
60
+ pubid_match?(row[:id])
61
+ end.map { |row| Hit.new row, self }
62
+ # An all-parts query drops :part from the match, so multiple rows can
63
+ # resolve to the same pubid; collapse them so each part appears once.
64
+ @array.uniq! { |h| h.pubid.to_s } if ref.root.all_parts
65
+ # Most-recent first (pubid string desc ~ year desc), then float
66
+ # published-stage ids above drafts. An undated query excludes :stage
67
+ # when matching, so a future draft (e.g. ISO/AWI) matches alongside the
68
+ # published edition; without this the draft would sort first lexically
69
+ # ("ISO/AWI …" > "ISO …") and be returned by fetch_doc's `first`. The
70
+ # index id carries no lifecycle status, so the parsed stage is the only
71
+ # signal available here. partition is stable, preserving the year order
72
+ # within each group.
73
+ @array.sort_by! { |h| h.pubid.to_s }.reverse!
74
+ published, drafts = @array.partition do |h|
75
+ h.pubid && default_published_stage?(h.pubid)
76
+ end
77
+ @array = published + drafts
78
+ self
79
+ end
80
+
81
+ def pubid_match?(pubid)
82
+ match_excludings = translate_excludings(excludings) + [:all_parts]
83
+ match_excludings << :edition unless pubid.typed_stage&.abbr&.include?("DIR")
84
+ # Only the candidate is built via .create (from the index) and so may
85
+ # carry a compound part; `ref_pubid_no_year` is always a parsed pubid,
86
+ # already split, so it needs no normalization.
87
+ cand = normalize_compound_part(exclude_id_attrs(pubid, *match_excludings))
88
+ cand == exclude_id_attrs(ref_pubid_no_year, *match_excludings)
89
+ end
90
+
91
+ # @TODO TEMP WORKAROUND (pubid 2.x migration): the v1-generated index
92
+ # stores a compound part such as "5-1-3" in :part with no :subpart, and
93
+ # Relaton::Index builds each row via Pubid::Iso::Identifier.from_hash(id),
94
+ # which keeps it as part="5-1-3" subpart=nil. A parsed query splits it
95
+ # (part="5", subpart="1-3"), so the two never compare equal. Re-split the
96
+ # compound part on the first dash to mirror parse before comparing.
97
+ # `exclude` returns a fresh instance, so mutating this copy is safe.
98
+ # Remove once pubid create() splits compound parts itself.
99
+ def normalize_compound_part(pubid)
100
+ num = pubid.part&.value.to_s
101
+ return pubid unless pubid.subpart.nil? && num.include?("-")
102
+
103
+ head, tail = num.split("-", 2)
104
+ pubid.part = ::Pubid::Iso::Components::Code.new(value: head)
105
+ pubid.subpart = ::Pubid::Iso::Components::Code.new(value: tail)
106
+ pubid
107
+ end
108
+
109
+ def exclude_id_attrs(pubid, *attrs)
110
+ xid = pubid.exclude(*attrs)
111
+ curr = xid
112
+ while curr.base_identifier
113
+ curr.base_identifier = curr.base_identifier.exclude(*attrs)
114
+ curr = curr.base_identifier
115
+ end
116
+ xid
117
+ end
118
+
119
+ def excludings # rubocop:disable Metrics/AbcSize
120
+ return @excludings if defined? @excludings
121
+
122
+ excl_attrs = %i[year]
123
+ excl_attrs << :part if ref.root.part.nil? || ref.root.all_parts
124
+ if default_published_stage?(ref) || ref.root.all_parts
125
+ excl_attrs << :stage
126
+ excl_attrs << :iteration
127
+ end
128
+ @excludings = excl_attrs
129
+ end
130
+
131
+ # Pubid 2.x auto-populates a published-stage default on parse/.create,
132
+ # so ref.stage is never nil. Treat that default as "no stage specified".
133
+ def default_published_stage?(pubid)
134
+ return true if pubid.typed_stage.nil?
135
+
136
+ pubid.typed_stage.stage_code.to_s == "published"
137
+ end
138
+
139
+ def index
140
+ @index ||= Relaton::Index.find_or_create(
141
+ :iso,
142
+ url: "#{ENDPOINT}#{INDEXFILE}.zip",
143
+ file: "#{INDEXFILE}.yaml",
144
+ pubid_class: ::Pubid::Iso::Identifier,
145
+ )
146
+ end
147
+
148
+ def fetch_doc(options = {})
149
+ @excludings = nil if options != opts
150
+ @opts = options
151
+
152
+ if !ref.root.all_parts || size == 1
153
+ any? && first.item # (opts[:lang])
154
+ else
155
+ to_all_parts
156
+ end
157
+ end
158
+
159
+ # @return [RelatonIsoBib::IsoBibliographicItem, nil]
160
+ def to_all_parts # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity
161
+ parts = @array.select { |h| h.pubid.part }
162
+ if opts[:publication_date_before] || opts[:publication_date_after]
163
+ parts = parts.select { |h| Bibliography.send(:year_in_range?, (h.pubid.date&.year || h.hit[:year]).to_i, opts) }
164
+ end
165
+ hit = parts.min_by { |h| h.pubid.part.value.to_i }
166
+ return @array.first&.item unless hit
167
+
168
+ bibitem = hit.item
169
+ all_parts_item = bibitem.to_all_parts
170
+ @array.reject { |h| h.pubid.part == hit.pubid.part }.each do |hi|
171
+ all_parts_item.relation << create_relation(hi)
172
+ end
173
+ all_parts_item
174
+ end
175
+
176
+ def create_relation(hit)
177
+ # pubid = Pubid.new hit.pubid
178
+ docid = Docidentifier.new(content: hit.pubid, type: "ISO", primary: true)
179
+ isobib = ItemData.new(formattedref: Bib::Formattedref.new(content: hit.pubid.to_s), docidentifier: [docid])
180
+ Relation.new(type: "instanceOf", bibitem: isobib)
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,28 @@
1
+ module Relaton
2
+ module Iso
3
+ class ItemData < Bib::ItemData
4
+ def create_id(without_date: false)
5
+ docid = docidentifier.find(&:primary) || docidentifier.first
6
+ return unless docid
7
+
8
+ if docid.content.is_a?(String)
9
+ create_id_from_string(docid.content, without_date)
10
+ else
11
+ create_id_from_pubid(docid.content, without_date)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def create_id_from_string(content, without_date)
18
+ pubid = without_date ? content.sub(/:\d{4}$/, "") : content
19
+ self.id = pubid.gsub(/\W+/, "")
20
+ end
21
+
22
+ def create_id_from_pubid(content, without_date)
23
+ pubid = without_date ? content.exclude(:year) : content
24
+ self.id = pubid.to_s.gsub(/\W+/, "")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "ext"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class Bibdata < Item
6
+ model ItemData
7
+ include Bib::BibdataShared
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Iso
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Iso
3
+ class Contributor < Bib::Contributor
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Iso
3
+ class ContributorInfo < Lutaml::Model::Serializable
4
+ choice do
5
+ attribute :person, Bib::Person
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,134 @@
1
+ require_relative "../type/pubid"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class Docidentifier < Bib::Docidentifier
6
+ attribute :content, Type::Pubid
7
+
8
+ attr_reader :pubid
9
+
10
+ def initialize(arg = nil, **kwargs)
11
+ arg.is_a?(Hash) ? super(arg) : super(**kwargs)
12
+ # Content may have been set before type during lutaml init. Re-run
13
+ # the setter so type-dependent parsing (e.g. iso-tc bypass) applies.
14
+ raw = arg.is_a?(Hash) ? (arg["content"] || arg[:content]) : kwargs[:content]
15
+ self.content = raw if raw
16
+ end
17
+
18
+ alias_method :original_content=, :content=
19
+ alias_method :original_content, :content
20
+
21
+ def content=(value)
22
+ @pubid = nil
23
+ @raw_content = nil
24
+
25
+ if type == "iso-tc" && value.is_a?(String)
26
+ @raw_content = value
27
+ else
28
+ parsed =
29
+ case value
30
+ when ::Pubid::Iso::Identifier then value
31
+ when String
32
+ begin
33
+ ::Pubid::Iso::Identifier.parse(value)
34
+ rescue StandardError
35
+ # Suppress when type is not yet set (lutaml runs the setter
36
+ # once during init before `type` is assigned, then `initialize`
37
+ # re-runs it; only the second pass is authoritative).
38
+ Util.warn "Failed to parse Pubid: #{value}" if type
39
+ nil
40
+ end
41
+ end
42
+
43
+ if parsed
44
+ @pubid = parsed
45
+ # TC committee documents have a canonical spelling ("… N1110")
46
+ # that pubid renders with a space ("… N 1110"). Preserve the
47
+ # source string (same intent as the iso-tc bypass) while keeping
48
+ # the parsed pubid for any structural operations.
49
+ if value.is_a?(String) && parsed.is_a?(::Pubid::Iso::Identifiers::TcDocument)
50
+ @raw_content = value
51
+ end
52
+ elsif value.is_a?(String)
53
+ @raw_content = value
54
+ end
55
+ end
56
+
57
+ send(:original_content=, to_s)
58
+ end
59
+
60
+ def content
61
+ return @raw_content if @raw_content
62
+ return render_pubid(@pubid) if @pubid
63
+
64
+ original_content
65
+ end
66
+
67
+ def to_s
68
+ content.to_s
69
+ end
70
+
71
+ def to_all_parts!
72
+ return unless @pubid
73
+
74
+ remove_part!
75
+ remove_date!
76
+ remove_stage!
77
+ @pubid.all_parts = true
78
+ refresh_content!
79
+ end
80
+
81
+ def remove_stage!
82
+ remove_attr!(:stage)
83
+ end
84
+
85
+ def remove_part!
86
+ remove_attr!(:part)
87
+ end
88
+
89
+ def remove_date!
90
+ remove_attr!(:date)
91
+ end
92
+
93
+ def exclude_year
94
+ return @raw_content if @raw_content
95
+ return nil unless @pubid
96
+
97
+ pubid = @pubid.exclude(:date)
98
+ current = pubid
99
+ while current.base_identifier
100
+ current.base_identifier = current.base_identifier.exclude(:date)
101
+ current = current.base_identifier
102
+ end
103
+ pubid
104
+ end
105
+
106
+ private
107
+
108
+ def render_pubid(pubid)
109
+ case type
110
+ when "URN" then pubid.to_urn
111
+ when "ISO" then pubid.exclude(:languages).to_s
112
+ else
113
+ pubid.to_s
114
+ end
115
+ end
116
+
117
+ def remove_attr!(attr)
118
+ return unless @pubid
119
+
120
+ @pubid.send("#{attr}=", nil)
121
+ base = @pubid.base_identifier
122
+ while base
123
+ base.send("#{attr}=", nil)
124
+ base = base.base_identifier
125
+ end
126
+ refresh_content!
127
+ end
128
+
129
+ def refresh_content!
130
+ send(:original_content=, to_s)
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Iso
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[
5
+ international-standard technical-specification technical-report publicly-available-specification
6
+ international-workshop-agreement guide recommendation amendment technical-corrigendum directive
7
+ committee-document addendum supplement extract
8
+ ].freeze
9
+
10
+ attribute :content, :string, values: TYPES
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ require_relative "doctype"
2
+ require_relative "stagename"
3
+ require_relative "structured_identifier"
4
+
5
+ module Relaton
6
+ module Iso
7
+ class Ext < Bib::Ext
8
+ attribute :doctype, Doctype
9
+ attribute :structuredidentifier, StructuredIdentifier
10
+ attribute :horizontal, :boolean
11
+ attribute :stagename, Stagename
12
+ attribute :updates_document_type, :string, values: Doctype::TYPES
13
+ attribute :fast_track, :boolean
14
+ attribute :price_code, :string
15
+
16
+ def get_schema_version = Relaton.schema_versions["relaton-model-iso"]
17
+
18
+ xml do
19
+ map_element "horizontal", to: :horizontal
20
+ map_element "stagename", to: :stagename
21
+ map_element "updates-document-type", to: :updates_document_type
22
+ map_element "fast-track", to: :fast_track
23
+ map_element "price-code", to: :price_code
24
+ end
25
+
26
+ key_value do
27
+ map_element "horizontal", to: :horizontal
28
+ map_element "stagename", to: :stagename
29
+ map_element "updates_document_type", to: :updates_document_type
30
+ map_element "fast_track", to: :fast_track
31
+ map_element "price_code", to: :price_code
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+
4
+ module Relaton
5
+ module Iso
6
+ class Relation < Bib::Relation
7
+ end
8
+
9
+ class Item < Bib::Item
10
+ model ItemData
11
+
12
+ attribute :docidentifier, Docidentifier, collection: true, initialize_empty: true
13
+ attribute :relation, Relation, collection: true, initialize_empty: true
14
+ attribute :ext, Ext
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "docidentifier"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class ItemBase < Lutaml::Model::Serializable
6
+ include Bib::NamespaceHelper
7
+
8
+ attr_accessor :type
9
+
10
+ model ItemData
11
+
12
+ instance_exec(&Bib::ItemShared::ATTRIBUTES)
13
+ attribute :docidentifier, Docidentifier, collection: true, initialize_empty: true
14
+ attribute :relation, Relation, collection: true, initialize_empty: true
15
+
16
+ xml do
17
+ map_attribute "type", to: :type
18
+ instance_exec(&Bib::ItemShared::XML_BODY)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Iso
3
+ class Organization < Lutaml::Model::Serializable
4
+ # choice(min: 1, max: 1) do
5
+ # attribute
6
+ # end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ module Relaton
2
+ module Iso
3
+ class ProjectNumber < Lutaml::Model::Serializable
4
+ attribute :part, :integer
5
+ attribute :subpart, :integer
6
+ attribute :amendment, :integer
7
+ attribute :corrigendum, :integer
8
+ attribute :origyr, :string
9
+ attribute :content, :string
10
+
11
+ xml do
12
+ root "project-number"
13
+ map_attribute "part", to: :part
14
+ map_attribute "subpart", to: :subpart
15
+ map_attribute "amendment", to: :amendment
16
+ map_attribute "corrigendum", to: :corrigendum
17
+ map_attribute "origyr", to: :origyr
18
+ map_content to: :content
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "item_base"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class Relation
6
+ attribute :bibitem, ItemBase
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Relaton
2
+ module Iso
3
+ class Stagename < Lutaml::Model::Serializable
4
+ attribute :abbreviation, :string
5
+ attribute :content, :string
6
+
7
+ xml do
8
+ root "stagename"
9
+ map_attribute "abbreviation", to: :abbreviation
10
+ map_content to: :content
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "project_number"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class StructuredIdentifier < Lutaml::Model::Serializable
6
+ attribute :type, :string
7
+ attribute :project_number, ProjectNumber
8
+ attribute :tc_document_number, :integer
9
+
10
+ xml do
11
+ root "structuredidentifier"
12
+ map_attribute "type", to: :type
13
+ map_element "project-number", to: :project_number
14
+ map_element "tc-document-number", to: :tc_document_number
15
+ end
16
+
17
+ def remove_date!
18
+ project_number&.origyr = nil
19
+ end
20
+
21
+ def remove_part!
22
+ project_number&.part = nil
23
+ end
24
+
25
+ def to_all_parts!
26
+ remove_date!
27
+ remove_part!
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,84 @@
1
+ require "relaton/core/processor"
2
+
3
+ module Relaton
4
+ module Iso
5
+ class Processor < Core::Processor
6
+ attr_reader :idtype
7
+
8
+ def initialize # rubocop:disable Lint/MissingSuper
9
+ @short = :relaton_iso
10
+ @prefix = "ISO"
11
+ @defaultprefix = %r{^ISO(/IEC)?\s}
12
+ @idtype = "ISO"
13
+ @datasets = %w[iso-open-data iso-open-data-all]
14
+ end
15
+
16
+ # @param code [String]
17
+ # @param date [String, nil] year
18
+ # @param opts [Hash]
19
+ # @return [RelatonIsoBib::IsoBibliographicItem]
20
+ def get(code, date, opts)
21
+ require_relative "../iso"
22
+ Bibliography.get(code, date, opts)
23
+ end
24
+
25
+ #
26
+ # Fetch all the documents from the ISO Open Data programme
27
+ # (https://www.iso.org/open-data.html).
28
+ #
29
+ # @param [String] source source name
30
+ # * `iso-open-data` - skip if upstream `Last-Modified` is unchanged
31
+ # * `iso-open-data-all` - wipe `output` and re-emit every record
32
+ # @param [Hash] opts
33
+ # @option opts [String] :output directory to output documents
34
+ # @option opts [String] :format output format (xml, yaml, bibxml)
35
+ #
36
+ def fetch_data(source, opts)
37
+ require_relative "data_fetcher"
38
+ DataFetcher.fetch(source, **opts)
39
+ end
40
+
41
+ # @param xml [String]
42
+ # @return [RelatonIsoBib::IsoBibliographicItem]
43
+ def from_xml(xml)
44
+ require_relative "../iso"
45
+ Item.from_xml xml
46
+ end
47
+
48
+ def from_yaml(yaml)
49
+ require_relative "../iso"
50
+ Item.from_yaml yaml
51
+ end
52
+
53
+ # @param hash [Hash]
54
+ # @return [RelatonIsoBib::IsoBibliographicItem]
55
+ # def hash_to_bib(hash)
56
+ # item_hash = HashConverter.hash_to_bib(hash)
57
+ # ::RelatonIsoBib::IsoBibliographicItem.new(**item_hash)
58
+ # end
59
+
60
+ # Returns hash of XML grammar
61
+ # @return [String]
62
+ def grammar_hash
63
+ require_relative "../iso"
64
+ Iso.grammar_hash
65
+ end
66
+
67
+ # Returns number of workers
68
+ # @return [Integer]
69
+ def threads = 3
70
+
71
+ #
72
+ # Remove index file
73
+ #
74
+ def remove_index_file
75
+ # ../iso defines INDEXFILE and loads Index, both otherwise missing
76
+ # when remove_index_file runs without iso.rb already loaded.
77
+ require_relative "../iso"
78
+ require_relative "hit_collection"
79
+ Index.find_or_create(:iso, url: true, file: "#{INDEXFILE}.yaml")
80
+ .remove_file
81
+ end
82
+ end
83
+ end
84
+ end