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,134 @@
1
+ module Relaton
2
+ module Ecma
3
+ class StandardParser
4
+ include ParserCommon
5
+
6
+ ATTRS = %i[docidentifier title date source abstract relation edition ext].freeze
7
+
8
+ # @param [Nokogiri::XML::Element] hit document hit
9
+ # @param [Mechanize::Page] doc fetched document page
10
+ # @param [Hash] errors error tracking hash
11
+ def initialize(hit:, doc:, errors: {})
12
+ @hit = hit
13
+ @doc = doc
14
+ @errors = errors
15
+ end
16
+
17
+ # @return [Hash] bibliographic item attributes
18
+ def to_bib_hash
19
+ bib = default_bib_hash
20
+ ATTRS.each { |a| bib[a] = send "fetch_#{a}" }
21
+ bib
22
+ end
23
+
24
+ # @return [Array] precomputed translation sources
25
+ def translation_source
26
+ @translation_source ||= parse_translation_source
27
+ end
28
+
29
+ # @return [Array<Relaton::Bib::Docidentifier>]
30
+ def fetch_docidentifier
31
+ result = super(@hit.text)
32
+ @errors[:standard_docidentifier] &&= result.empty?
33
+ result
34
+ end
35
+
36
+ # @return [Array<Relaton::Bib::Title>]
37
+ def fetch_title
38
+ result = @doc.xpath('//p[@class="ecma-item-short-description"]').map do |t|
39
+ Bib::Title.new(content: t.text.strip, language: "en", script: "Latn")
40
+ end
41
+ @errors[:standard_title] &&= result.empty?
42
+ result
43
+ end
44
+
45
+ # @return [Array<Relaton::Bib::LocalizedMarkedUpString>]
46
+ def fetch_abstract
47
+ content = @doc.xpath('//div[@class="ecma-item-content"]/p').map do |a|
48
+ a.text.strip.squeeze(" ").gsub("\r\n", "")
49
+ end.join "\n"
50
+ return [] if content.empty?
51
+
52
+ result = [Bib::Abstract.new(content: content, language: "en", script: "Latn")]
53
+ @errors[:standard_abstract] &&= result.empty?
54
+ result
55
+ end
56
+
57
+ # @return [Array<Relaton::Bib::Date>]
58
+ def fetch_date
59
+ result = @doc.xpath('//p[@class="ecma-item-edition"]').map do |d|
60
+ date = d.text.split(", ").last
61
+ Bib::Date.new type: "published", at: date
62
+ end
63
+ @errors[:standard_date] &&= result.empty?
64
+ result
65
+ end
66
+
67
+ # @return [Array<Relaton::Bib::Uri>]
68
+ def fetch_source # rubocop:disable Metrics/AbcSize
69
+ source = []
70
+ source << Bib::Uri.new(type: "src", content: @hit[:href]) if @hit[:href]
71
+ ref = @doc.at('//div[@class="ecma-item-content-wrapper"]/span/a',
72
+ '//div[@class="ecma-item-content-wrapper"]/a')
73
+ source << Bib::Uri.new(type: "pdf", content: ref[:href]) if ref
74
+ result = source + edition_translation_source(fetch_edition_content)
75
+ @errors[:standard_source] &&= result.empty?
76
+ result
77
+ end
78
+
79
+ # @return [Array<Relaton::Bib::Relation>]
80
+ def fetch_relation # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
81
+ edition_parser = EditionParser.new(doc: @doc, bib: {}, errors: @errors)
82
+ result = @doc.xpath("//ul[@class='ecma-item-archives']/li").filter_map do |rel|
83
+ ref, ed, date, vol = edition_parser.edition_id_parts rel.at("span").text
84
+ next if ed.nil? || ed.empty?
85
+
86
+ docid = Bib::Docidentifier.new(type: "ECMA", content: ref, primary: true)
87
+ source = rel.xpath("span/a").map { |l| Bib::Uri.new type: "pdf", content: l[:href] }
88
+ edition = Bib::Edition.new content: ed
89
+ extent = edition_parser.create_extent(vol)
90
+ @errors[:standard_relation_extent] &&= extent.nil?
91
+ bibitem = ItemData.new(
92
+ docidentifier: [docid], formattedref: Bib::Formattedref.new(content: ref), date: date, edition: edition,
93
+ source: source, extent: extent
94
+ )
95
+ Bib::Relation.new(type: "updates", bibitem: bibitem)
96
+ end
97
+ @errors[:standard_relation] &&= result.empty?
98
+ result
99
+ end
100
+
101
+ # @return [Relaton::Bib::Edition, nil]
102
+ def fetch_edition
103
+ cnt = fetch_edition_content
104
+ result = Bib::Edition.new(content: cnt) if cnt && !cnt.empty?
105
+ @errors[:standard_edition] &&= result.nil?
106
+ result
107
+ end
108
+
109
+ private
110
+
111
+ def fetch_edition_content
112
+ @doc.at('//p[@class="ecma-item-edition"]')&.text&.match(/^\d+(?=(?:st|nd|th|rd))/)&.to_s
113
+ end
114
+
115
+ def edition_translation_source(edition)
116
+ translation_source.select { |s| s[:ed] == edition }.map { |s| s[:source] }
117
+ end
118
+
119
+ def parse_translation_source
120
+ return [] unless @doc
121
+
122
+ @doc.xpath("//h2[.='Translations']/following-sibling::ul/li").map do |l|
123
+ a = l.at("span/a")
124
+ id = l.at("span").text
125
+ %r{\w+[\d-]+,\s(?<lang>\w+)\sversion,\s(?<ed>[\d.]+)(?:st|nd|rd|th)\sedition} =~ id
126
+ case lang
127
+ when "Japanese"
128
+ { ed: ed, source: Bib::Uri.new(type: "pdf", language: "ja", script: "Jpan", content: a[:href]) }
129
+ end
130
+ end.compact
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Ecma
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-ecma".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ require "relaton/index"
2
+ require "relaton/bib"
3
+ require_relative "version"
4
+ require_relative "ecma/util"
5
+ require_relative "ecma/item_data"
6
+ require_relative "ecma/item"
7
+ require_relative "ecma/bibitem"
8
+ require_relative "ecma/bibdata"
9
+ require_relative "ecma/bibliography"
10
+
11
+ module Relaton
12
+ module Ecma
13
+ INDEXFILE = "index-v1"
14
+
15
+ # Returns hash of XML reammar
16
+ # @return [String]
17
+ def self.grammar_hash
18
+ # gem_path = File.expand_path "..", __dir__
19
+ # grammars_path = File.join gem_path, "grammars", "*"
20
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
21
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "item"
2
+
3
+ module Relaton
4
+ module Etsi
5
+ class Bibdata < Item
6
+ model ItemData
7
+ include Bib::BibdataShared
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "item"
2
+
3
+ module Relaton
4
+ module Etsi
5
+ class Bibitem < Item
6
+ model ItemData
7
+ include Bib::BibitemShared
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Etsi
5
+ # Methods for search IANA standards.
6
+ module Bibliography
7
+ SOURCE = "https://raw.githubusercontent.com/relaton/relaton-data-etsi/refs/heads/v2/"
8
+
9
+ # @param text [String]
10
+ # @return [Relaton::Etsi::ItemData, nil]
11
+ def search(text) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
12
+ index = Relaton::Index.find_or_create :etsi, url: "#{SOURCE}index-v1.zip", file: INDEX_FILE
13
+ row = index.search(text).min_by { |r| r[:id] }
14
+ return unless row
15
+
16
+ url = "#{SOURCE}#{row[:file]}"
17
+ resp = Net::HTTP.get_response URI(url)
18
+ return unless resp.code == "200"
19
+
20
+ Item.from_yaml(resp.body).tap { |item| item.fetched = Date.today.to_s }
21
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
22
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
23
+ Net::ProtocolError, Errno::ETIMEDOUT => e
24
+ raise Relaton::RequestError, e.message
25
+ end
26
+
27
+ # @param ref [String] the ETSI standard Code to look up
28
+ # @param year [String, nil] year
29
+ # @param opts [Hash] options
30
+ # @return [Relaton::Etsi::ItemData, nil]
31
+ def get(ref, _year = nil, _opts = {})
32
+ Util.info "Fetching from Relaton repository ...", key: ref
33
+ result = search(ref)
34
+ unless result
35
+ Util.info "Not found.", key: ref
36
+ return
37
+ end
38
+
39
+ Util.info "Found: `#{result.docidentifier[0].content}`", key: ref
40
+ result
41
+ end
42
+
43
+ extend Bibliography
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,128 @@
1
+ require "date"
2
+ require "json"
3
+ require "mechanize"
4
+ require "relaton/core"
5
+ require "relaton/index"
6
+ require_relative "../etsi"
7
+ require_relative "data_parser"
8
+
9
+ module Relaton
10
+ module Etsi
11
+ class DataFetcher < Core::DataFetcher
12
+ PAGE_SIZE = 50
13
+
14
+ SOURCEURL = "https://www.etsi.org/custom/standardssearch/data.php?format=json&includeScope=1&" \
15
+ "page=%<page>s&search=&title=1&etsiNumber=1&content=1&version=0&onApproval=1&published=1&" \
16
+ "withdrawn=1&historical=1&isCurrent=1&superseded=1&startDate=1988-01-15&endDate=%<date>s&" \
17
+ "harmonized=0&keyword=&TB=&stdType=&frequency=&mandate=&collection=&sort=1&x=%<timestamp>s".freeze
18
+
19
+ def index
20
+ @index ||= Relaton::Index.find_or_create :etsi, file: INDEX_FILE
21
+ end
22
+
23
+ def log_error(msg)
24
+ Util.error msg
25
+ end
26
+
27
+ #
28
+ # Fetch all ETSI documents from the ETSI website.
29
+ #
30
+ # @param [Object] _source unused, required by superclass interface
31
+ #
32
+ def fetch(_source = nil)
33
+ first_page = fetch_page(1)
34
+ process_records(first_page)
35
+ fetch_remaining_pages(first_page)
36
+ index.save
37
+ report_errors
38
+ end
39
+
40
+ def fetch_remaining_pages(first_page)
41
+ total = first_page.first ? first_page.first["total_count"].to_i : 0
42
+ total_pages = (total / PAGE_SIZE.to_f).ceil
43
+ (2..total_pages).each do |page|
44
+ records = fetch_page(page)
45
+ break if records.empty?
46
+
47
+ process_records(records)
48
+ end
49
+ end
50
+
51
+ def fetch_page(page)
52
+ date = Time.now.to_date + 1
53
+ timestamp = (Time.now.to_f * 1000).to_i
54
+ url = format(SOURCEURL, page: page, date: date, timestamp: timestamp)
55
+ JSON.parse(fetch_with_retry(url))
56
+ end
57
+
58
+ def process_records(records)
59
+ records.each do |record|
60
+ save DataParser.new(normalize(record), @errors).parse
61
+ end
62
+ end
63
+
64
+ def normalize(record)
65
+ {
66
+ "ETSI deliverable" => record["ETSI_DELIVERABLE"],
67
+ "title" => record["TITLE"],
68
+ "Details link" => "https://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=#{record['wki_id']}",
69
+ "PDF link" => "https://www.etsi.org/deliver/#{record['EDSpathname']}#{record['EDSPDFfilename']}",
70
+ "Status" => derive_status(record),
71
+ "Keywords" => record["Keywords"].to_s,
72
+ "Technical body" => record["TB"],
73
+ "Scope" => record["Scope"],
74
+ }
75
+ end
76
+
77
+ def derive_status(record)
78
+ return "Withdrawn" if record["ACTION_TYPE"] == "WD"
79
+
80
+ code = record["STATUS_CODE"].to_i
81
+ return "On Approval" if code < 12
82
+ return "Historical" if code == 13
83
+
84
+ "Published"
85
+ end
86
+
87
+ NETWORK_ERRORS = [
88
+ Mechanize::Error, Net::OpenTimeout, Net::ReadTimeout,
89
+ SocketError, Errno::ECONNRESET
90
+ ].freeze
91
+
92
+ def fetch_with_retry(url, retries: 3, delay: 2) # rubocop:disable Metrics/MethodLength
93
+ attempt = 0
94
+ begin
95
+ Mechanize.new.get(url).body
96
+ rescue *NETWORK_ERRORS => e
97
+ attempt += 1
98
+ if attempt <= retries
99
+ Util.info "Fetch failed (#{e.message}), " \
100
+ "retrying (#{attempt}/#{retries})..."
101
+ sleep delay * attempt
102
+ retry
103
+ end
104
+ raise
105
+ end
106
+ end
107
+
108
+ def save(bib)
109
+ id = bib.docidentifier.first.content
110
+ file = output_file id
111
+ File.write file, serialize(bib), encoding: "UTF-8"
112
+ index.add_or_update id, file
113
+ end
114
+
115
+ def to_yaml(bib)
116
+ bib.to_yaml
117
+ end
118
+
119
+ def to_xml(bib)
120
+ bib.to_xml bibdata: true
121
+ end
122
+
123
+ def to_bibxml(bib)
124
+ bib.to_rfcxml
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,208 @@
1
+ require_relative "pubid"
2
+ module Relaton
3
+ module Etsi
4
+ class DataParser
5
+ ATTRS = %i[
6
+ title docnumber source date docidentifier version status contributor
7
+ keyword ext abstract language script
8
+ ].freeze
9
+
10
+ def initialize(row, errors = {})
11
+ @row = row
12
+ @errors = errors
13
+ end
14
+
15
+ def parse
16
+ args = ATTRS.to_h { |attr| [attr, send(attr)] }
17
+ ItemData.new(type: "standard", **args)
18
+ end
19
+
20
+ def pubid
21
+ return @pubid if defined?(@pubid)
22
+
23
+ unless @row["ETSI deliverable"]
24
+ @errors[:pubid] &&= true
25
+ @pubid = nil
26
+ return @pubid
27
+ end
28
+
29
+ @errors[:pubid] &&= false
30
+ @pubid = PubId.parse(@row["ETSI deliverable"])
31
+ end
32
+
33
+ def title
34
+ result = if @row["title"]
35
+ [Bib::Title.new(
36
+ content: @row["title"], language: "en", script: "Latn",
37
+ )]
38
+ else
39
+ []
40
+ end
41
+ @errors[:title] &&= result.empty?
42
+ result
43
+ end
44
+
45
+ def docnumber
46
+ @row["ETSI deliverable"]
47
+ end
48
+
49
+ def source
50
+ urls = []
51
+ if @row["Details link"]
52
+ urls << Bib::Uri.new(content: @row["Details link"], type: "src")
53
+ end
54
+ if @row["PDF link"]
55
+ urls << Bib::Uri.new(content: @row["PDF link"], type: "pdf")
56
+ end
57
+ @errors[:source] &&= urls.empty?
58
+ urls
59
+ end
60
+
61
+ def date
62
+ result = if pubid&.date
63
+ [Bib::Date.new(type: "published", at: pubid.date)]
64
+ else
65
+ []
66
+ end
67
+ @errors[:date] &&= result.empty?
68
+ result
69
+ end
70
+
71
+ def docidentifier
72
+ result = if @row["ETSI deliverable"]
73
+ [Bib::Docidentifier.new(
74
+ content: @row["ETSI deliverable"],
75
+ type: "ETSI",
76
+ primary: true,
77
+ )]
78
+ else
79
+ []
80
+ end
81
+ @errors[:docidentifier] &&= result.empty?
82
+ result
83
+ end
84
+
85
+ def version
86
+ return [] unless pubid&.version
87
+
88
+ [Bib::Version.new(draft: pubid.version)]
89
+ end
90
+
91
+ def status
92
+ unless @row["Status"]
93
+ @errors[:status] &&= true
94
+ return
95
+ end
96
+
97
+ stage = @row["Status"]
98
+ if stage == "On Approval"
99
+ stage = "#{pubid&.type} approval"
100
+ end
101
+ @errors[:status] &&= false
102
+ Status.new(stage: stage)
103
+ end
104
+
105
+ def contributor
106
+ contribs = [publisher_contributor]
107
+ contribs << committee_contributor if @row["Technical body"]
108
+ contribs
109
+ end
110
+
111
+ def publisher_contributor
112
+ org = Bib::Organization.new(
113
+ name: [etsi_org_name], abbreviation: etsi_abbreviation,
114
+ )
115
+ role = Bib::Contributor::Role.new(type: "publisher")
116
+ Bib::Contributor.new(organization: org, role: [role])
117
+ end
118
+
119
+ def etsi_org_name
120
+ Bib::TypedLocalizedString.new(
121
+ content: "European Telecommunications Standards Institute",
122
+ language: "en",
123
+ script: "Latn",
124
+ )
125
+ end
126
+
127
+ def etsi_abbreviation
128
+ Bib::LocalizedString.new(
129
+ content: "ETSI",
130
+ language: "en",
131
+ script: "Latn",
132
+ )
133
+ end
134
+
135
+ def committee_contributor
136
+ desc = Bib::LocalizedMarkedUpString.new(content: "committee")
137
+ role = Bib::Contributor::Role.new(
138
+ type: "author", description: [desc],
139
+ )
140
+ Bib::Contributor.new(organization: committee_org, role: [role])
141
+ end
142
+
143
+ def committee_org
144
+ Bib::Organization.new(
145
+ name: [etsi_name],
146
+ abbreviation: etsi_abbreviation,
147
+ subdivision: [technical_committee_subdivision],
148
+ )
149
+ end
150
+
151
+ def etsi_name
152
+ Bib::TypedLocalizedString.new(
153
+ content: "European Telecommunications Standards Institute",
154
+ )
155
+ end
156
+
157
+ def technical_committee_subdivision
158
+ Bib::Subdivision.new(
159
+ name: [Bib::TypedLocalizedString.new(
160
+ content: @row["Technical body"],
161
+ )],
162
+ type: "technical-committee",
163
+ )
164
+ end
165
+
166
+ def keyword
167
+ unless @row["Keywords"]
168
+ @errors[:keyword] &&= true
169
+ return []
170
+ end
171
+
172
+ result = @row["Keywords"].split(",").map do |kw|
173
+ Bib::Keyword.new(vocab: Bib::LocalizedString.new(content: kw.strip, language: "en", script: "Latn"))
174
+ end
175
+ @errors[:keyword] &&= result.empty?
176
+ result
177
+ end
178
+
179
+ def ext
180
+ Ext.new(doctype: doctype, flavor: "etsi")
181
+ end
182
+
183
+ def doctype
184
+ return unless pubid
185
+
186
+ Doctype.create_from_abbreviation pubid.type
187
+ end
188
+
189
+ def abstract
190
+ result = if @row["Scope"]
191
+ [Bib::Abstract.new(content: @row["Scope"], language: "en", script: "Latn")]
192
+ else
193
+ []
194
+ end
195
+ @errors[:abstract] &&= result.empty?
196
+ result
197
+ end
198
+
199
+ def language
200
+ ["en"]
201
+ end
202
+
203
+ def script
204
+ ["Latn"]
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,30 @@
1
+ module Relaton
2
+ module Etsi
3
+ class Doctype < Bib::Doctype
4
+ DOCTYPES = {
5
+ "EN" => "European Standard",
6
+ "ES" => "ETSI Standard",
7
+ "EG" => "ETSI Guide",
8
+ "TS" => "Technical Specification",
9
+ "GS" => "Group Specification",
10
+ "GR" => "Group Report",
11
+ "TR" => "Technical Report",
12
+ "ETR" => "ETSI Technical Report",
13
+ "GTS" => "GSM Technical Specification",
14
+ "SR" => "Special Report",
15
+ "TCRTR" => "Technical Committee Reference Technical Report",
16
+ "TBR" => "Technical Basis for Regulation",
17
+ "ETS" => "European Telecommunication Standard",
18
+ "I-ETS" => "Interim European Telecommunication Standard",
19
+ "NET" => "Norme Européenne de Télécommunication",
20
+ }.freeze
21
+
22
+ attribute :abbreviation, :string, values: DOCTYPES.keys
23
+ attribute :content, :string, values: DOCTYPES.values
24
+
25
+ def self.create_from_abbreviation(abbreviation)
26
+ new(content: DOCTYPES[abbreviation], abbreviation: abbreviation)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "doctype"
2
+
3
+ module Relaton
4
+ module Etsi
5
+ class Ext < Bib::Ext
6
+ attribute :doctype, Doctype
7
+ attribute :marker, :string, values: %w[Current Superseded]
8
+ attribute :frequency, :string, collection: true
9
+ attribute :mandate, :string, collection: true
10
+ attribute :custom_collection, :string, values: %W[
11
+ HSs\scited\sin\sOJ HSs\snot\syet\scited\sin\sOJ HSs\sRED\scited\sin\sOJ HSs\sEMC\scited\sin\sOJ
12
+ ]
13
+
14
+ xml do
15
+ map_element "marker", to: :marker
16
+ map_element "frequency", to: :frequency
17
+ map_element "mandate", to: :mandate
18
+ map_element "custom-collection", to: :custom_collection
19
+ end
20
+
21
+ key_value do
22
+ map_element "marker", to: :marker
23
+ map_element "frequency", to: :frequency
24
+ map_element "mandate", to: :mandate
25
+ map_element "custom_collection", to: :custom_collection
26
+ end
27
+
28
+ def get_schema_version = Relaton.schema_versions["relaton-model-etsi"]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ require "relaton/bib"
2
+ require_relative "item_data"
3
+ require_relative "ext"
4
+ require_relative "status"
5
+
6
+ module Relaton
7
+ module Etsi
8
+ class Item < Bib::Item
9
+ model ItemData
10
+
11
+ attribute :ext, Ext
12
+ attribute :status, Status
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Etsi
3
+ class ItemData < Bib::ItemData
4
+ end
5
+ end
6
+ end