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,186 @@
1
+ require "nokogiri"
2
+ require_relative "id_parser"
3
+
4
+ module Relaton::Bipm
5
+ class SiBrochureParser
6
+ #
7
+ # Create new parser
8
+ #
9
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
10
+ #
11
+ def initialize(data_fetcher)
12
+ @data_fetcher = WeakRef.new data_fetcher
13
+ end
14
+
15
+ #
16
+ # Parse documents from SI brochure dataset and write thems to YAML files
17
+ #
18
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
19
+ #
20
+ def self.parse(data_fetcher)
21
+ new(data_fetcher).parse
22
+ end
23
+
24
+ #
25
+ # Parse SI brochure and write them to YAML files
26
+ #
27
+ def parse # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
28
+ # metanorma site generate writes per-document outputs into a subdirectory
29
+ # named after the source path (e.g. _site/documents/si-brochure/3.01/
30
+ # si-brochure-en.rxl). The legacy top-level *.rxl glob is kept for
31
+ # backwards compatibility with any older flow that flattened outputs.
32
+ si_brochure_rxls.each do |f|
33
+ puts "Parsing #{f}"
34
+ xml = File.read(f, encoding: "UTF-8")
35
+ xml = xml.force_encoding("UTF-8") if xml.encoding != Encoding::UTF_8
36
+ item1 = Bibdata.from_xml(xml)
37
+ # Workaround for relaton-bib Version#content bug: whitespace between
38
+ # legacy <revision-date>/<draft> children gets captured as @content,
39
+ # blocking the legacy-fold path. Clear it so the getter recomputes.
40
+ item1.version.each do |v|
41
+ c = v.instance_variable_get(:@content)
42
+ next unless c.is_a?(Array) || (c.is_a?(String) && c.strip.empty?)
43
+ v.instance_variable_set(:@content, nil)
44
+ end
45
+ @data_fetcher.errors[:si_brochure_title] &&= item1.title.empty?
46
+ @data_fetcher.errors[:si_brochure_docidentifier] &&= item1.docidentifier.empty?
47
+ unless has_committee_contributor?(item1)
48
+ contribs = extract_editorialgroup(xml)
49
+ contribs.each { |c| item1.contributor << c }
50
+ end
51
+ fix_si_brochure_id item1
52
+ basename = File.join @data_fetcher.output, File.basename(f).sub(/(?:-(?:en|fr))?\.rxl$/, "")
53
+ outfile = "#{basename}.#{@data_fetcher.ext}"
54
+ key = item1.docnumber || basename
55
+ @data_fetcher.index.add_or_update Id.new.parse(key).to_hash, outfile
56
+ item =
57
+ if File.exist? outfile
58
+ warn_duplicate = false
59
+ item2 = Item.from_yaml File.read(outfile, encoding: "UTF-8")
60
+ fix_si_brochure_id item2
61
+ hash1 = YAML.safe_load item1.to_yaml
62
+ hash2 = YAML.safe_load item2.to_yaml
63
+ Item.from_yaml deep_merge(hash1, hash2).to_yaml
64
+ else
65
+ warn_duplicate = true
66
+ item1
67
+ end
68
+ @data_fetcher.write_file outfile, item, warn_duplicate: warn_duplicate
69
+ puts "Saved to #{outfile}"
70
+ end
71
+ end
72
+
73
+ #
74
+ # @return [Array<String>] paths to SI Brochure RXL files. Looks at the
75
+ # legacy flat layout first, then the metanorma-cli subdirectory layout
76
+ # (`<source_path_without_'sources'>/<doc>.rxl`) used by current
77
+ # `metanorma site generate` output.
78
+ #
79
+ def si_brochure_rxls
80
+ flat = Dir["bipm-si-brochure/_site/documents/*.rxl"]
81
+ return flat if flat.any?
82
+
83
+ Dir["bipm-si-brochure/_site/documents/**/si-brochure-{en,fr}.rxl"]
84
+ end
85
+
86
+ #
87
+ # Update ID of SI brochure
88
+ #
89
+ # @param [ItemData] item bibliographic item
90
+ #
91
+ # @return [void]
92
+ #
93
+ def fix_si_brochure_id(item)
94
+ # isbn = hash["docid"].detect { |id| id["type"] == "ISBN" }
95
+ # num = isbn && isbn["id"] == "978-92-822-2272-0" ? "SI Brochure" : "SI Brochure, Appendix 4"
96
+
97
+ update_id item
98
+
99
+ prid = primary_id item
100
+ if item.docnumber
101
+ item.docnumber.sub!(/^Brochure(?:\sConcise|\sFAQ)?$/i, prid.sub(/^BIPM\s/, ""))
102
+ else
103
+ item.docnumber = prid.sub(/^BIPM\s/, "")
104
+ end
105
+ item.id = prid.gsub(/[,\s-]/, "")
106
+ end
107
+
108
+ def update_id(item)
109
+ item.docidentifier.each do |id|
110
+ next unless id.type == "BIPM" && id.content&.match?(/BIPM Brochure/i)
111
+
112
+ id.primary = true
113
+ id.content.sub!(/(?<=^BIPM\s)(Brochure)/i, "SI \\1")
114
+ end
115
+ end
116
+
117
+ def primary_id(item)
118
+ item.docidentifier.detect do |id|
119
+ id.primary && (id.language == "en" || id.language.nil?)
120
+ end.content
121
+ end
122
+
123
+ def has_committee_contributor?(item)
124
+ item.contributor.any? do |c|
125
+ c.role.any? { |r| r.description.any? { |d| d.content == "committee" } }
126
+ end
127
+ end
128
+
129
+ def extract_editorialgroup(xml)
130
+ doc = Nokogiri::XML(xml)
131
+ doc.xpath("//editorialgroup/committee").map do |committee|
132
+ acronym = committee["acronym"]
133
+ names = committee.xpath("variant").map do |v|
134
+ Relaton::Bib::TypedLocalizedString.new(
135
+ content: v.text, language: v["language"], script: v["script"],
136
+ )
137
+ end
138
+ subdiv = Relaton::Bib::Subdivision.new(
139
+ type: "committee", name: names,
140
+ abbreviation: Relaton::Bib::LocalizedString.new(content: acronym),
141
+ )
142
+ bipm_name = [Relaton::Bib::TypedLocalizedString.new(content: acronym)]
143
+ org = Relaton::Bib::Organization.new(name: bipm_name, subdivision: [subdiv])
144
+ desc = Relaton::Bib::LocalizedMarkedUpString.new(content: "committee")
145
+ role = Relaton::Bib::Contributor::Role.new(type: "author", description: [desc])
146
+ Relaton::Bib::Contributor.new(organization: org, role: [role])
147
+ end
148
+ end
149
+
150
+ #
151
+ # Deep merge two hashes
152
+ #
153
+ # @param [Hash] hash1
154
+ # @param [Hash] hash2
155
+ #
156
+ # @return [Hash] Merged hash
157
+ #
158
+ def deep_merge(hash1, hash2) # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
159
+ hash1.merge(hash2) do |_, oldval, newval|
160
+ if oldval.is_a?(Hash) && newval.is_a?(Hash)
161
+ deep_merge(oldval, newval)
162
+ elsif oldval.is_a?(Array) && newval.is_a?(Array)
163
+ (oldval + newval).uniq { |i| downcase_all i }
164
+ else
165
+ newval || oldval
166
+ end
167
+ end
168
+ end
169
+
170
+ #
171
+ # Downcase all values in hash or array
172
+ #
173
+ # @param [Array, Hash, String] content hash, array or string
174
+ #
175
+ # @return [Array, Hash, String] hash, array or string with downcased values
176
+ #
177
+ def downcase_all(content)
178
+ case content
179
+ when Hash then content.transform_values { |v| downcase_all v }
180
+ when Array then content.map { |v| downcase_all v }
181
+ when String then content.downcase
182
+ else content
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bipm
3
+ module Util
4
+ extend Bib::Util
5
+ PROGNAME = "relaton-bipm".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,32 @@
1
+ require "zip"
2
+ require "fileutils"
3
+ require "parslet"
4
+ require "relaton/bib"
5
+ require "relaton/index"
6
+ require "relaton/core"
7
+ require_relative "version"
8
+ require_relative "bipm/util"
9
+ require_relative "bipm/item_data"
10
+ require_relative "bipm/model/item"
11
+ require_relative "bipm/model/bibitem"
12
+ require_relative "bipm/model/bibdata"
13
+ require_relative "bipm/bibliography"
14
+
15
+ module Relaton
16
+ module Bipm
17
+ class Error < StandardError; end
18
+
19
+ INDEXFILE = "index-v1.yaml".freeze
20
+
21
+ # Returns hash of gems versions used to generate the data model.
22
+ # @return [String]
23
+ def grammar_hash
24
+ # gem_path = File.expand_path "..", __dir__
25
+ # grammars_path = File.join gem_path, "grammars", "*"
26
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
27
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
28
+ end
29
+
30
+ extend self
31
+ end
32
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton::Bsi
4
+ # Class methods for search ISO standards.
5
+ class Bibliography
6
+ class << self
7
+ # @param text [String]
8
+ # @return [Relaton::Bsi::HitCollection]
9
+ def search(text, year = nil)
10
+ code = text.sub(/^BSI\s/, "").sub(/ExComm|Expert commentary/, "Ex")
11
+ HitCollection.search(code, year)
12
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
13
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
14
+ Net::ProtocolError, Algolia::AlgoliaUnreachableHostError => e
15
+ raise Relaton::RequestError, e.message
16
+ end
17
+
18
+ #
19
+ # @param code [String] the BSI standard Code to look up
20
+ # @param year [String] the year the standard was published (optional)
21
+ # @param opts [Hash] options
22
+ # @option opts [Boolean] :all_parts if all-parts reference is required
23
+ # @option opts [Boolean] :no_year if last published document is required
24
+ #
25
+ # @return [String] Relaton XML serialisation of reference
26
+ def get(code, year = nil, opts = {})
27
+ # y = code.split(":")[1]
28
+ year ||= code_parts(code)[:year]
29
+ ret = bib_get(code, year, opts)
30
+ return nil if ret.nil?
31
+
32
+ ret = ret.to_most_recent_reference unless year || opts[:keep_year]
33
+ # ret = ret.to_all_parts if opts[:all_parts]
34
+ ret
35
+ end
36
+
37
+ #
38
+ # Destruct code to its parts.
39
+ #
40
+ # @param [String] code document identifier
41
+ #
42
+ # @return [MatchData] parts of the code
43
+ #
44
+ def code_parts(code)
45
+ %r{
46
+ ^(?:BSI\s)?(?<code>(?:[A-Z]+\s)*[^:\s+]+(?:\s\d+)?)
47
+ (?::(?<year>\d{4})(?:-\d{2})?)?
48
+ (?:\+(?<a>[^:\s]+)(?::(?<y>\d{4}))?)?
49
+ (?:\s(?<rest>.+))?
50
+ }x.match code
51
+ end
52
+
53
+ private
54
+
55
+ def fetch_ref_err(code, year, missed_years) # rubocop:disable Metrics/MethodLength
56
+ # y = code_parts(code)[:year]
57
+ # id = year && !y ? "#{code}:#{year}" : code
58
+ # Util.warn "WARNING: no match found online for `#{id}`. " \
59
+ # "The code must be exactly like it is on the standards website."
60
+ unless missed_years.empty?
61
+ Util.info "There was no match for `#{year}`, though there " \
62
+ "were matches found for `#{missed_years.join('`, `')}`."
63
+ end
64
+ # if /\d-\d/.match? code
65
+ # warn "[relaton-bsi] The provided document part may not exist, or "\
66
+ # "the document may no longer be published in parts."
67
+ # else
68
+ # warn "[relaton-bsi] If you wanted to cite all document parts for "\
69
+ # "the reference, use \"#{code} (all parts)\".\nIf the document "\
70
+ # "is not a standard, use its document type abbreviation (TS, TR, "\
71
+ # "PAS, Guide)."
72
+ # end
73
+ nil
74
+ end
75
+
76
+ #
77
+ # Search for a BSI standard.
78
+ #
79
+ # @param [String] code the BSI standard Code to look up
80
+ #
81
+ # @return [Relaton::Bsi::HitCollection] a collection of hits
82
+ #
83
+ def search_filter(code)
84
+ cp = code_parts code
85
+ Util.info "Fetching from shop.bsigroup.com ...", key: code
86
+ unless cp
87
+ Util.info "Could not parse the reference", key: code
88
+ return []
89
+ end
90
+
91
+ search(code).filter_hits!(cp)
92
+ end
93
+
94
+ # Sort through the results from Isobib, fetching them three at a time,
95
+ # and return the first result that matches the code,
96
+ # matches the year (if provided), and which # has a title (amendments do not).
97
+ # Only expects the first page of results to be populated.
98
+ # Does not match corrigenda etc (e.g. ISO 3166-1:2006/Cor 1:2007)
99
+ # If no match, returns any years which caused mismatch, for error reporting
100
+ def results_filter(result, year)
101
+ missed_years = []
102
+ result.each do |r|
103
+ pyear = code_parts(r.hit[:code])[:year]
104
+ return { ret: r.item } if (!year || year == pyear) && r.item
105
+
106
+ missed_years << pyear
107
+ end
108
+ { years: missed_years }
109
+ end
110
+
111
+ def bib_get(code, year, _opts)
112
+ result = search_filter(code) || return
113
+ ret = results_filter(result, year)
114
+ if ret[:ret]
115
+ Util.info "Found: `#{ret[:ret].docidentifier.first&.content}`", key: code
116
+ ret[:ret]
117
+ else
118
+ Util.info "Not found", key: code
119
+ fetch_ref_err(code, year, ret[:years])
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton::Bsi
4
+ # Hit.
5
+ class Hit < Relaton::Core::Hit
6
+ attr_writer :fetch
7
+
8
+ # Parse page.
9
+ # @return [Relaton::Bsi::ItemData]
10
+ def item
11
+ @item ||= Scraper.parse_page self
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "algolia"
4
+ require_relative "hit"
5
+
6
+ module Relaton::Bsi
7
+ # Page of hit collection.
8
+ class HitCollection < Relaton::Core::HitCollection
9
+ DOMAIN = "https://shop.bsigroup.com"
10
+
11
+ #
12
+ # Initialize a new HitCollection object and perform search.
13
+ #
14
+ # @param ref [String] reference
15
+ # @param year [String] year
16
+ #
17
+ # @return [Relaton::Bsi::HitCollection] hit collection
18
+ #
19
+ def self.search(ref, year = nil)
20
+ new(ref, year).search
21
+ end
22
+
23
+ #
24
+ # Perform search.
25
+ # @return [self] hit collection
26
+ def search
27
+ resp = algolia_index.search ref # , facetFilters: "product_type:standard"
28
+ @array = create_hits resp[:hits]
29
+ self
30
+ end
31
+
32
+ #
33
+ # Algolia index.
34
+ #
35
+ # @return [Algolia::Search::Index] Algolia index
36
+ #
37
+
38
+ def algolia_index
39
+ @algolia_index ||= begin
40
+ config = Algolia::Search::Config.new(
41
+ application_id: "575YE157G9",
42
+ api_key: "a057b4e74099445df2eddb7940828a10",
43
+ )
44
+ client = Algolia::Search::Client.new config, logger: ::Logger.new($stderr)
45
+ client.init_index "shopify_products"
46
+ end
47
+ end
48
+
49
+ #
50
+ # Filter the search results for a BSI standard.
51
+ #
52
+ # @param [MatchData] code_parts parts of document identifier
53
+ #
54
+ # @return [self] filtered search results
55
+ #
56
+ def filter_hits!(code_parts)
57
+ hits = filter code_parts
58
+ hits = filter code_parts, skip_rest: true if hits.empty?
59
+ hits = filter code_parts, drop_amd: true if hits.empty?
60
+ @array = hits
61
+ self
62
+ end
63
+
64
+ private
65
+
66
+ #
67
+ # Create hits from search results.
68
+ #
69
+ # @param hits [Array<Hash>] search results
70
+ #
71
+ # @return [Array<Relaton::Bsi::Hit>] hits
72
+ #
73
+ def create_hits(hits) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
74
+ hits.each_with_object([]) do |h, obj|
75
+ next unless h[:meta][:global][:publishedDate]
76
+
77
+ code = h[:meta][:global][:primaryDesignator]
78
+ code = code.is_a?(Array) ? code.first : code
79
+ code.sub!(/\s?(?:LOOSELEAF|\(A5 LAMINATED\)|-\s?TC$)/, "")
80
+ obj << Hit.new(
81
+ {
82
+ code: code,
83
+ title: h[:title],
84
+ url: h[:handle],
85
+ date: h[:meta][:global][:publishedDate],
86
+ publisher: h[:meta][:global][:publisher],
87
+ status: h[:meta][:global][:status],
88
+ ics: h[:meta][:global][:icsCodesAlgoliaStringArray],
89
+ doctype: h[:product_type],
90
+ }, self
91
+ )
92
+ end.sort_by { |h| h.hit[:date] }.reverse
93
+ end
94
+
95
+ #
96
+ # Select hits that match the document identifier.
97
+ #
98
+ # @param [MatchData] code_parts parts of document identifier
99
+ # @param [Boolean] drop_amd drop amendments and corrigendums
100
+ # @param [Boolean] skip_rest skip rest suffix of document identifier
101
+ #
102
+ def filter(code_parts, drop_amd: false, skip_rest: false) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
103
+ @array.select do |i|
104
+ code = drop_amd ? i.hit[:code].sub(/\+[AC]\d+.*$/, "") : i.hit[:code]
105
+ cp = Bibliography.code_parts code
106
+ match = cp[:code] == code_parts[:code] && cp[:a] == code_parts[:a] &&
107
+ (!code_parts[:y] || cp[:y] == code_parts[:y]) &&
108
+ (skip_rest || cp[:rest] == code_parts[:rest])
109
+ i.hit[:code] = code if drop_amd && match
110
+ match
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Bsi
3
+ class ItemData < Iso::ItemData
4
+ def create_id(without_date: false)
5
+ docid = docidentifier.find(&:primary) || docidentifier.first
6
+ return unless docid
7
+
8
+ id_content = without_date ? docid.content.sub(/:\d{4}$/, "") : docid.content
9
+ self.id = id_content.gsub(/\W+/, "")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bsi
3
+ class Bibdata < Item
4
+ model ItemData
5
+ include Bib::BibdataShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bsi
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Bsi
3
+ class Docidentifier < Bib::Docidentifier
4
+ def remove_date!
5
+ content&.sub!(/:\d{4}(?:-\d{2})?/, "")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Relaton
2
+ module Bsi
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[
5
+ british-standard draft-for-development published-document privately-subscribed-standard
6
+ publicly-available-specification flex-standard international-standard technical-specification
7
+ technical-report guide international-workshop-agreement industry-technical-agreement
8
+ standard european-workshop-agreement fast-track-standard expert-commentary
9
+ ].freeze
10
+
11
+ attribute :content, :string, values: TYPES
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "doctype"
2
+
3
+ module Relaton
4
+ module Bsi
5
+ class Ext < Bib::Ext
6
+ attribute :doctype, Doctype
7
+ attribute :ics, Bib::ICS, collection: true
8
+ attribute :structuredidentifier, Iso::StructuredIdentifier, collection: true, initialize_empty: true
9
+ attribute :stagename, Iso::Stagename
10
+
11
+ xml { map_element "stagename", to: :stagename }
12
+ key_value { map_element "stagename", to: :stagename }
13
+
14
+ def get_schema_version = Relaton.schema_versions["relaton-model-bsi"]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+
4
+ module Relaton
5
+ module Bsi
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 Bsi
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
+ require_relative "item_base"
2
+
3
+ module Relaton
4
+ module Bsi
5
+ class Relation
6
+ attribute :bibitem, ItemBase
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,42 @@
1
+ require "relaton/core/processor"
2
+
3
+ module Relaton::Bsi
4
+ class Processor < Relaton::Core::Processor
5
+ def initialize
6
+ @short = :relaton_bsi
7
+ @prefix = "BSI"
8
+ @defaultprefix = %r{^(BSI|BS|PD)\s}
9
+ @idtype = "BSI"
10
+ end
11
+
12
+ # @param code [String]
13
+ # @param date [String, nil] year
14
+ # @param opts [Hash]
15
+ # @return [Relaton::Bsi::ItemData]
16
+ def get(code, date, opts)
17
+ require_relative "../bsi"
18
+ ::Relaton::Bsi::Bibliography.get(code, date, opts)
19
+ end
20
+
21
+ # @param xml [String]
22
+ # @return [Relaton::Bsi::ItemData]
23
+ def from_xml(xml)
24
+ require_relative "../bsi"
25
+ ::Relaton::Bsi::Item.from_xml xml
26
+ end
27
+
28
+ # @param hash [Hash]
29
+ # @return [Relaton::Bsi::ItemData]
30
+ def from_yaml(yaml)
31
+ require_relative "../bsi"
32
+ ::Relaton::Bsi::Item.from_yaml yaml
33
+ end
34
+
35
+ # Returns hash of XML grammar
36
+ # @return [String]
37
+ def grammar_hash
38
+ require_relative "../bsi"
39
+ @grammar_hash ||= ::Relaton::Bsi.grammar_hash
40
+ end
41
+ end
42
+ end