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,288 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "graphql/client"
4
+ require "graphql/client/http"
5
+
6
+ Encoding.default_internal = Encoding::UTF_8
7
+ Encoding.default_external = Encoding::UTF_8
8
+
9
+ module Relaton::Bsi
10
+ # Scraper.
11
+ module Scraper
12
+ HTTP = GraphQL::Client::HTTP.new "https://shop-bsi.myshopify.com/api/2021-04/graphql.json" do
13
+ def headers(_context)
14
+ { "x-shopify-storefront-access-token": "c935c196c0b7d1d86bfb5139006cfd46" }
15
+ end
16
+ end
17
+
18
+ Schema = GraphQL::Client.load_schema File.join(__dir__, "schema.json")
19
+
20
+ Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
21
+
22
+ Product = Client.parse <<~'GRAPHQL'
23
+ fragment ProductFragment on Product {
24
+ createdAt
25
+ publishedAt
26
+ updatedAt
27
+ productType
28
+ committee: metafield(namespace: "global", key: "committee") {
29
+ value
30
+ }
31
+ designated: metafield(namespace: "global", key: "designatedStandard") {
32
+ value
33
+ }
34
+ packContents: metafield(namespace: "global", key: "packContents") {
35
+ value
36
+ }
37
+ summary: metafield(namespace: "global", key: "summary") {
38
+ value
39
+ }
40
+ corrigendumHandle: metafield(namespace: "global", key: "corrigendumHandle") {
41
+ value
42
+ }
43
+ variants(first: 250) {
44
+ edges {
45
+ node {
46
+ version: metafield(namespace: "global", key: "version") {
47
+ value
48
+ }
49
+ isbn: metafield(namespace: "global", key: "isbn") {
50
+ value
51
+ }
52
+ }
53
+ }
54
+ }
55
+ description
56
+ }
57
+ GRAPHQL
58
+
59
+ Query = Client.parse <<~GRAPHQL
60
+ query GetProducts($h0: String!) {
61
+ productByHandle(handle: $h0) {
62
+ ...Relaton::Bsi::Scraper::Product::ProductFragment
63
+ }
64
+ }
65
+ GRAPHQL
66
+
67
+ class << self
68
+ # Parse page.
69
+ # @param hit [Relaton::Bsi::Hit]
70
+ # @return [Relaton::Bsi::IetemData]
71
+ def parse_page(hit) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
72
+ # doc = hit.hit_collection.agent.get hit.hit[:url]
73
+ result = Client.query(Query::GetProducts, variables: { h0: hit.hit[:url] })
74
+ data = result.data.product_by_handle.to_h
75
+ item = Relaton::Bsi::ItemData.new(
76
+ fetched: Date.today.to_s,
77
+ type: "standard",
78
+ docidentifier: fetch_docid(hit.hit[:code], data),
79
+ docnumber: hit.hit[:code].match(/\d+/).to_s,
80
+ language: ["en"],
81
+ script: ["Latn"],
82
+ title: fetch_titles(hit.hit[:title]),
83
+ status: fetch_status(hit.hit[:status]),
84
+ date: fetch_dates(hit),
85
+ contributor: fetch_contributors(hit, data),
86
+ abstract: fetch_abstract(data),
87
+ copyright: fetch_copyright(hit),
88
+ source: fetch_link(hit.hit[:url]),
89
+ # relation: fetch_relations(doc),
90
+ place: [Relaton::Bib::Place.new(city: "London")],
91
+ ext: fetch_ext(hit, data),
92
+ )
93
+ item.create_id
94
+ item
95
+ end
96
+
97
+ private
98
+
99
+ def fetch_ext(hit, data)
100
+ Ext.new(
101
+ doctype: fetch_doctype(hit),
102
+ flavor: "bsi",
103
+ ics: fetch_ics(hit.hit[:ics]),
104
+ structuredidentifier: fetch_structuredid(hit),
105
+ )
106
+ end
107
+
108
+ # @param ics [Array<String>]
109
+ # @return [Array<Relaton::Bib::ICS>]
110
+ def fetch_ics(ics)
111
+ ics.map do |s|
112
+ code, = s.split
113
+ Relaton::Bib::ICS.new(code: code, text: Isoics.fetch(code).description)
114
+ end
115
+ end
116
+
117
+ # Fetch abstracts.
118
+ # @param data [Hash]
119
+ # @return [Array<Relaton::Bib::Abstract>]
120
+ def fetch_abstract(data)
121
+ return [] unless data["description"]
122
+
123
+ [Relaton::Bib::Abstract.new(content: data["description"], language: "en", script: "Latn")]
124
+ end
125
+
126
+ # Fetch docid.
127
+ # @param docid [String]
128
+ # @param data [Hash]
129
+ # @return [Array<Relaton::Bib::Docidentifier>]
130
+ def fetch_docid(docid, data) # rubocop:disable Metrics/AbcSize
131
+ ids = [{ type: "BSI", content: docid, primary: true }]
132
+ if data.any? && data["variants"]["edges"][0]["node"]["isbn"]
133
+ isbn = data["variants"]["edges"][0]["node"]["isbn"]["value"]
134
+ ids << { type: "ISBN", content: isbn }
135
+ end
136
+ ids.map do |did|
137
+ Relaton::Bsi::Docidentifier.new(**did)
138
+ end
139
+ end
140
+
141
+ # Fetch status.
142
+ # @param status [String]
143
+ # @return [Relaton::Bib::Status, nil]
144
+ def fetch_status(status)
145
+ return unless status
146
+
147
+ stage = Relaton::Bib::Status::Stage.new(content: status)
148
+ Relaton::Bib::Status.new(stage: stage)
149
+ end
150
+
151
+ # @param hit [Relaton::Bsi::Hit]
152
+ # @return [Relaton::Iso::StructuredIdentifier]
153
+ def fetch_structuredid(hit)
154
+ content, origyr = hit.hit[:code].split(":")
155
+ project_number = Relaton::Iso::ProjectNumber.new(content: content, origyr: origyr)
156
+ Relaton::Iso::StructuredIdentifier.new project_number: project_number
157
+ end
158
+
159
+ # Fetch relations.
160
+ # @param doc [Mechanize::Page]
161
+ # @return [Array<Hash>]
162
+ # def fetch_relations(doc)
163
+ # doc.xpath("//tr[th='Replaces']/td/a").map do |r|
164
+ # fref = RelatonBib::FormattedRef.new(content: r.text, language: "en", script: "Latn")
165
+ # link = fetch_link r[:href]
166
+ # bibitem = BsiBibliographicItem.new(formattedref: fref, type: "standard", link: link)
167
+ # { type: "complements", bibitem: bibitem }
168
+ # end
169
+ # end
170
+
171
+ # Fetch titles.
172
+ # @param title [String]
173
+ # @return [Array<Relaton::Bib::Title>]
174
+ def fetch_titles(title)
175
+ titles = split_title(title).map do |t|
176
+ Relaton::Bib::Title.new(**t, language: "en", script: "Latn")
177
+ end
178
+ titles << Relaton::Bib::Title.new(type: "main", content: title, language: "en", script: "Latn")
179
+ end
180
+
181
+ def split_title(title)
182
+ ttls = title.split(/\s(?:-|\u2014)\s/) # if ttls.size == 1
183
+ case ttls.size
184
+ when 0, 1 then [{ type: "title-main", content: ttls.first }]
185
+ else intro_or_part ttls
186
+ end
187
+ end
188
+
189
+ # @param ttls [Array<String>]
190
+ # @return [Array<Hash>]
191
+ def intro_or_part(ttls)
192
+ titles = [{ type: "title-intro", content: ttls[0] }, { type: "title-main", content: ttls[1] }]
193
+ parts = ttls.slice(2..-1)
194
+ titles << { type: "title-part", content: parts.join(" -- ") } if parts.any?
195
+ titles
196
+ end
197
+
198
+ #
199
+ # Fetch doctype.
200
+ #
201
+ # @param [Relaton::Bsi::Hit] hit hit
202
+ #
203
+ # @return [Relaton::Bsi::Doctype] doctype
204
+ #
205
+ def fetch_doctype(hit)
206
+ Doctype.new(content: doctype(hit))
207
+ end
208
+
209
+ def doctype(hit)
210
+ case hit.hit[:code]
211
+ when /(^|\s)Flex\s/ then "flex-standard"
212
+ when /(^|\s)PAS\s/ then "publicly-available-specification"
213
+ else hit.hit[:doctype]
214
+ end
215
+ end
216
+
217
+ # Fetch dates
218
+ # @param hit [Relaton::Bsi:Hit]
219
+ # @return [Array<Relaton::Bib::Date>]
220
+ def fetch_dates(hit)
221
+ [Relaton::Bib::Date.new(type: "published", at: hit.hit[:date])]
222
+ end
223
+
224
+ # Fetch contributors
225
+ # @param hit [Relaton::Bsi::Hit]
226
+ # @param data [Hash]
227
+ # @return [Array<Relaton::Bib::Contributor>]
228
+ def fetch_contributors(hit, data)
229
+ contribs = [create_contributor({ type: "publisher" }, owner_entity(hit))]
230
+
231
+ wg = data["committee"]&.fetch("value")
232
+ if wg
233
+ subdivision = Relaton::Bib::Subdivision.new(
234
+ type: "technical-committee",
235
+ name: [Relaton::Bib::TypedLocalizedString.new(content: wg)],
236
+ )
237
+ org = bsi_org(subdivision: [subdivision])
238
+ desc = Relaton::Bib::LocalizedMarkedUpString.new(content: "committee")
239
+ role = Relaton::Bib::Contributor::Role.new(type: "author", description: [desc])
240
+ contribs << Relaton::Bib::Contributor.new(role: [role], organization: org)
241
+ end
242
+ contribs
243
+ end
244
+
245
+ def create_contributor(role, org)
246
+ role = Relaton::Bib::Contributor::Role.new(**role)
247
+ Relaton::Bib::Contributor.new(role: [role], organization: org)
248
+ end
249
+
250
+ # Fetch links.
251
+ # @param path [String]
252
+ # @return [Array<Relaton::Bib::Uri>]
253
+ def fetch_link(path)
254
+ url = "#{HitCollection::DOMAIN}/products/#{path}"
255
+ [Relaton::Bib::Uri.new(type: "src", content: url)]
256
+ end
257
+
258
+ # Fetch copyright.
259
+ # @param hit [Relaton::Bsi::Hit]
260
+ # @return [Array<Relaton::Bib::Copyright>]
261
+ def fetch_copyright(hit)
262
+ owner = Relaton::Bib::ContributionInfo.new organization: owner_entity(hit)
263
+ from = Date.parse(hit.hit[:date]).year.to_s
264
+ [Relaton::Bib::Copyright.new(owner: [owner], from: from)]
265
+ end
266
+
267
+ # @param hit [Relaton::Bsi::Hit]
268
+ # @return [Relaton::Bib::Organization]
269
+ def owner_entity(hit)
270
+ case hit.hit[:publisher]
271
+ when "BSI" then bsi_org
272
+ else
273
+ name = Relaton::Bib::TypedLocalizedString.new(content: hit.hit[:publisher])
274
+ Relaton::Bib::Organization.new(name: [name])
275
+ end
276
+ end
277
+
278
+ def bsi_org(subdivision: [])
279
+ abbre = Relaton::Bib::LocalizedString.new(content: "BSI", language: "en", script: "Latn")
280
+ name = Relaton::Bib::TypedLocalizedString.new(
281
+ content: "British Standards Institution", language: "en", script: "Latn"
282
+ )
283
+ uri = Relaton::Bib::Uri.new(content: "https://www.bsigroup.com/")
284
+ Relaton::Bib::Organization.new abbreviation: abbre, name: [name], uri: [uri], subdivision: subdivision
285
+ end
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bsi
3
+ module Util
4
+ extend Bib::Util
5
+ PROGNAME = "relaton-bsi".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ require "relaton/iso"
2
+ require_relative "version"
3
+ require_relative "bsi/util"
4
+ require_relative "bsi/item_data"
5
+ require_relative "bsi/model/item"
6
+ require_relative "bsi/model/relation"
7
+ require_relative "bsi/model/bibitem"
8
+ require_relative "bsi/model/bibdata"
9
+ require_relative "bsi/scraper"
10
+ require_relative "bsi/hit_collection"
11
+ require_relative "bsi/hit"
12
+ require_relative "bsi/bibliography"
13
+
14
+ module Relaton
15
+ module Bsi
16
+ # Returns hash of XML greammar
17
+ # @return [String]
18
+ def self.grammar_hash
19
+ # gem_path = File.expand_path "..", __dir__
20
+ # grammars_path = File.join gem_path, "grammars", "*"
21
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
22
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,95 @@
1
+ require "mechanize"
2
+
3
+ module Relaton::Calconnect
4
+ class Bibliography
5
+ class << self
6
+ # @param text [String]
7
+ # @return [RelatonCalconnect::HitCollection]
8
+ def search(text, year = nil, _opts = {})
9
+ HitCollection.new text, year
10
+ rescue Mechanize::ResponseCodeError, SocketError, Errno::ECONNREFUSED
11
+ raise Relaton::RequestError, "Could not access https://standards.calconnect.org"
12
+ end
13
+
14
+ # @param ref [String] the OGC standard Code to look up (e..g "8200")
15
+ # @param year [String] the year the standard was published (optional)
16
+ #
17
+ # @param opts [Hash] options
18
+ # @option opts [TrueClass, FalseClass] :all_parts restricted to all parts
19
+ # if all-parts reference is required
20
+ # @option opts [TrueClass, FalseClass] :bibdata
21
+ #
22
+ # @return [RelatonCalconnect::CcBibliographicItem]
23
+ def get(ref, year = nil, opts = {}) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
24
+ code = ref
25
+
26
+ if year.nil?
27
+ /^(?<code1>[^\s]+(?:\s\w+)?\s[\d-]+):?(?<year1>\d{4})?/ =~ ref
28
+ unless code1.nil?
29
+ code = code1
30
+ year = year1
31
+ end
32
+ end
33
+
34
+ Util.info "Fetching from Relaton repository ...", key: ref
35
+ result = search(code, year, opts) || (return nil)
36
+ ret = bib_results_filter(result, year)
37
+ if ret[:ret]
38
+ Util.info "Found: `#{ret[:ret].docidentifier.first.content}`", key: ref
39
+ ret[:ret]
40
+ else
41
+ Util.info "Not found.", key: ref
42
+ fetch_ref_err(code, year, ret[:years])
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # Sort through the results from RelatonNist, fetching them three at a time,
49
+ # and return the first result that matches the code,
50
+ # matches the year (if provided), and which # has a title (amendments do not).
51
+ # Only expects the first page of results to be populated.
52
+ # Does not match corrigenda etc (e.g. ISO 3166-1:2006/Cor 1:2007)
53
+ # If no match, returns any years which caused mismatch, for error reporting
54
+ #
55
+ # @param result
56
+ # @param opts [Hash] options
57
+ #
58
+ # @return [Hash]
59
+ def bib_results_filter(result, year)
60
+ missed_years = Set.new
61
+ result.each do |r|
62
+ item = r.item
63
+ item.fetched = Date.today.to_s
64
+ return { ret: item } if !year
65
+
66
+ /:(?<id_year>\d{4})$/ =~ r.hit[:id]
67
+ return { ret: item } if year.to_i == id_year.to_i
68
+
69
+ missed_years << id_year.to_i if id_year
70
+
71
+ item.date.select { |d| d.type == "published" }.each do |d|
72
+ return { ret: item } if year.to_i == d.at.to_date.year
73
+
74
+ missed_years << d.at.to_date.year
75
+ end
76
+ end
77
+ { years: missed_years }
78
+ end
79
+
80
+ # @param code [Strig]
81
+ # @param year [String]
82
+ # @param missed_years [Array<Strig>]
83
+ def fetch_ref_err(code, year, missed_years)
84
+ # id = year ? "`#{code}` year `#{year}`" : code
85
+ # Util.info "WARNING: No match found online for #{id}. " \
86
+ # "The code must be exactly like it is on the standards website."
87
+ unless missed_years.empty?
88
+ Util.info "There was no match for `#{year}`, though there " \
89
+ "were matches found for `#{missed_years.join('`, `')}`."
90
+ end
91
+ nil
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal:true
2
+
3
+ require "json"
4
+ require "mechanize"
5
+ require "relaton/core"
6
+ require "relaton/index"
7
+ require_relative "scraper"
8
+ require_relative "util"
9
+
10
+ module Relaton::Calconnect
11
+ #
12
+ # Relaton-calconnect data fetcher
13
+ #
14
+ class DataFetcher < Relaton::Core::DataFetcher
15
+ ENDPOINT = "https://standards.calconnect.org/cc/index.json"
16
+
17
+ def etagfile
18
+ @etagfile ||= File.join @output, "etag.txt"
19
+ end
20
+
21
+ def index
22
+ @index = Relaton::Index.find_or_create :CC, file: "index-v1.yaml"
23
+ end
24
+
25
+ def log_error(msg)
26
+ Util.error msg
27
+ end
28
+
29
+ def agent
30
+ @agent ||= Mechanize.new
31
+ end
32
+
33
+ #
34
+ # fetch data form server and save it to file.
35
+ #
36
+ def fetch(_source = nil) # rubocop:disable Metrics/AbcSize
37
+ agent.request_headers["If-None-Match"] = etag if etag
38
+ resp = agent.get(ENDPOINT)
39
+ # 304 Not Modified — nothing changed since the last fetch
40
+ return if resp.code == "304"
41
+
42
+ data = JSON.parse resp.body
43
+ all_success = true
44
+ Array(data["documents"]).each { |doc| all_success &&= parse_page doc }
45
+ self.etag = resp.response["etag"] if all_success
46
+ index.save
47
+ report_errors
48
+ end
49
+
50
+ private
51
+
52
+ #
53
+ # Parse document and write it to file
54
+ #
55
+ # @param [Hash] doc
56
+ #
57
+ def parse_page(doc)
58
+ bib = Scraper.new(@errors).parse_page doc
59
+ write_doc doc["id"], bib
60
+ true
61
+ rescue StandardError => e
62
+ Util.warn "Document: #{doc['id']}"
63
+ Util.warn e.message
64
+ Util.warn e.backtrace[0..5].join("\n")
65
+ false
66
+ end
67
+
68
+ def write_doc(slug, bib) # rubocop:disable Metrics/MethodLength
69
+ file = output_file slug
70
+ if @files.include? file
71
+ Util.warn "#{file} exist"
72
+ else
73
+ @files << file
74
+ end
75
+ index.add_or_update primary_docid(bib), file
76
+ File.write file, serialize(bib), encoding: "UTF-8"
77
+ end
78
+
79
+ # Index entries are keyed by the canonical doc identifier
80
+ # (e.g. "CC/DIR 10005:2019"), not the upstream slug used for filenames.
81
+ def primary_docid(bib)
82
+ docid = bib.docidentifier.find(&:primary) || bib.docidentifier.first
83
+ docid.content
84
+ end
85
+
86
+ def to_yaml(bib) = bib.to_yaml
87
+ def to_xml(bib) = bib.to_xml(bibdata: true)
88
+ def to_bibxml(bib) = bib.to_rfcxml
89
+
90
+ #
91
+ # Read ETag from file
92
+ #
93
+ # @return [String, NilClass]
94
+ def etag
95
+ @etag ||= File.exist?(etagfile) ? File.read(etagfile, encoding: "UTF-8") : nil
96
+ end
97
+
98
+ #
99
+ # Save ETag to file
100
+ #
101
+ # @param tag [String]
102
+ def etag=(e_tag)
103
+ File.write etagfile, e_tag, encoding: "UTF-8"
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,14 @@
1
+ require "mechanize"
2
+
3
+ module Relaton::Calconnect
4
+ class Hit < Relaton::Core::Hit
5
+ # Parse page.
6
+ # @return [Relaton::Calconnect::ItemData]
7
+ def item
8
+ @item ||= begin
9
+ url = "#{HitCollection::GHURL}#{@hit[:file]}"
10
+ Item.from_yaml Mechanize.new.get(url).body
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,84 @@
1
+ require "yaml"
2
+ require "fileutils"
3
+
4
+ module Relaton::Calconnect
5
+ class HitCollection < Relaton::Core::HitCollection
6
+ # ENDPOINT = "https://standards.calconnect.org/relaton/index.yaml".freeze
7
+ # ENDPOINT = "http://127.0.0.1:4000/relaton/index.yaml".freeze
8
+ # DATADIR = File.expand_path ".relaton/calconnect", Dir.home
9
+ # DATAFILE = File.expand_path "bibliography.yml", DATADIR
10
+ # ETAGFILE = File.expand_path "etag.txt", DATADIR
11
+ GHURL = "https://raw.githubusercontent.com/relaton/relaton-data-calconnect/refs/heads/v2/".freeze
12
+
13
+ # @param ref [Strig]
14
+ # @param year [String]
15
+ # @param opts [Hash]
16
+ def initialize(ref, year = nil)
17
+ super
18
+ # @array = from_yaml(ref).sort_by do |hit|
19
+ # hit.hit["revdate"] ? Date.parse(hit.hit["revdate"]) : Date.new
20
+ # end.reverse
21
+ index = Relaton::Index.find_or_create :CC, url: "#{GHURL}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml"
22
+ @array = index.search(ref).map do |row|
23
+ Hit.new(row, self)
24
+ end
25
+ end
26
+
27
+ # private
28
+
29
+ #
30
+ # Fetch data from yaml
31
+ #
32
+ # @param docid [String]
33
+ #
34
+ # @return [Array<RelatonBib::Hit>]
35
+ #
36
+ # def from_yaml(docid, **_opts)
37
+ # data["root"]["items"].select do |doc|
38
+ # doc["docid"] && doc["docid"]["id"].include?(docid)
39
+ # end.map { |h| Hit.new(h, self) }
40
+ # end
41
+
42
+ #
43
+ # Fetches YAML data
44
+ #
45
+ # @return [Hash]
46
+ # def data
47
+ # FileUtils.mkdir_p DATADIR
48
+ # ctime = File.ctime DATAFILE if File.exist? DATAFILE
49
+ # fetch_data if !ctime || ctime.to_date < Date.today
50
+ # @data ||= YAML.safe_load File.read(DATAFILE, encoding: "UTF-8")
51
+ # end
52
+
53
+ #
54
+ # fetch data from server and save it to file.
55
+ #
56
+ # def fetch_data
57
+ # resp = Faraday.new(ENDPOINT, headers: { "If-None-Match" => etag }).get
58
+ # # return if there aren't any changes since last fetching
59
+ # return unless resp.status == 200
60
+
61
+ # self.etag = resp[:etag]
62
+ # @data = YAML.safe_load resp.body
63
+ # File.write DATAFILE, @data.to_yaml, encoding: "UTF-8"
64
+ # end
65
+
66
+ #
67
+ # Read ETag from file
68
+ #
69
+ # @return [String, NilClass]
70
+ # def etag
71
+ # @etag ||= if File.exist? ETAGFILE
72
+ # File.read ETAGFILE, encoding: "UTF-8"
73
+ # end
74
+ # end
75
+
76
+ #
77
+ # Save ETag to file
78
+ #
79
+ # @param tag [String]
80
+ # def etag=(e_tag)
81
+ # File.write ETAGFILE, e_tag, encoding: "UTF-8"
82
+ # end
83
+ end
84
+ end
@@ -0,0 +1,12 @@
1
+ module Relaton
2
+ module Calconnect
3
+ class ItemData < Relaton::Bib::ItemData
4
+ def create_id(without_date: false)
5
+ docid = docidentifier.find(&:primary) || docidentifier.first
6
+ return unless docid
7
+
8
+ self.id = docid.content.gsub(/\W+/, "")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Calconnect
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 Calconnect
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Relaton
2
+ module Calconnect
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %W[
5
+ directive guide specification standard report administrative amendment technical\scorrigendum advisory
6
+ ].freeze
7
+
8
+ attribute :type, :string, values: TYPES
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "doctype"
2
+
3
+ module Relaton
4
+ module Calconnect
5
+ class Ext < Bib::Ext
6
+ attribute :doctype, Doctype
7
+
8
+ def get_schema_version = Relaton.schema_versions["relaton-model-cc"]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ require "relaton/bib"
2
+ require_relative "../item_data"
3
+ require_relative "ext"
4
+
5
+ module Relaton
6
+ module Calconnect
7
+ class Item < Bib::Item
8
+ model ItemData
9
+
10
+ attribute :ext, Ext
11
+ end
12
+ end
13
+ end