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,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "pubid"
5
+ require "relaton/index"
6
+ require "isoics"
7
+ require "relaton/bib"
8
+ require "relaton/core"
9
+ require_relative "version"
10
+ require_relative "iso/util"
11
+ require_relative "iso/item_data"
12
+ require_relative "iso/model/item"
13
+ require_relative "iso/model/relation"
14
+ require_relative "iso/model/bibitem"
15
+ require_relative "iso/model/bibdata"
16
+ require_relative "iso/hit_collection"
17
+ require_relative "iso/bibliography"
18
+
19
+ module Relaton
20
+ module Iso
21
+ INDEXFILE = "index-v2"
22
+
23
+ def self.grammar_hash
24
+ # gem_path = File.expand_path "..", __dir__
25
+ # grammars_path = File.join gem_path, "grammars", "*"
26
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp, encoding: "UTF-8" }.join
27
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Itu
5
+ module Bibliography
6
+ extend self
7
+
8
+ # @param refid [Relaton::Itu::Pubid, String] a document reference
9
+ # @return [Relaton::Itu::HitCollection]
10
+ def search(refid)
11
+ if refid.is_a? String
12
+ warn_incorrect_ref(refid)
13
+ refid = Pubid.parse refid
14
+ end
15
+ HitCollection.new(refid).tap(&:search)
16
+ end
17
+
18
+ # @param code [String] the ITU standard Code to look up
19
+ # @param year [String] the year the standard was published (optional)
20
+ # @param opts [Hash] options
21
+ # @return [Relaton::Bib::ItemData, nil]
22
+ def get(code, year = nil, opts = {})
23
+ warn_incorrect_ref(code)
24
+ refid = Pubid.parse code
25
+ refid.year ||= year
26
+
27
+ ret = itubib_get1(refid)
28
+ return nil if ret.nil?
29
+
30
+ ret = ret.to_most_recent_reference unless refid.year || opts[:keep_year]
31
+ ret = ret.to_all_parts if opts[:all_parts]
32
+ ret
33
+ end
34
+
35
+ private
36
+
37
+ def warn_incorrect_ref(ref)
38
+ if ref =~ /(ITU[\s-]T\s\w)\.(Suppl\.|Annex)\s?(\w?\d+)/
39
+ correct_ref = "#{$~[1]} #{$~[2]} #{$~[3]}"
40
+ Util.info "Incorrect reference: `#{ref}`, the reference should be: `#{correct_ref}`"
41
+ end
42
+ end
43
+
44
+ def fetch_ref_err(refid, missed_years)
45
+ Util.info "Not found.", key: refid.to_s
46
+ if missed_years.any?
47
+ plural = missed_years.size > 1 ? "s" : ""
48
+ Util.info "There was no match for `#{refid.year}` year, though there were matches " \
49
+ "found for `#{missed_years.join('`, `')}` year#{plural}.", key: refid.to_s
50
+ end
51
+ nil
52
+ end
53
+
54
+ def search_filter(refid)
55
+ result = search(refid)
56
+ result.select do |i|
57
+ next true unless i.hit[:code]
58
+
59
+ pubid = Pubid.parse i.hit[:code]
60
+ refid.===(pubid, [:year])
61
+ end
62
+ end
63
+
64
+ def isobib_results_filter(result, refid)
65
+ missed_years = []
66
+ result.each do |r|
67
+ /\((?:\d{2}\/)?(?<pyear>\d{4})\)/ =~ r.hit[:code]
68
+ if !refid.year || refid.year == pyear
69
+ ret = r.item
70
+ return { ret: ret } if ret
71
+ end
72
+
73
+ missed_years << pyear
74
+ end
75
+ { years: missed_years }
76
+ end
77
+
78
+ def itubib_get1(refid)
79
+ result = search_filter(refid) || return
80
+ ret = isobib_results_filter(result, refid)
81
+ if ret[:ret]
82
+ Util.info "Found: `#{ret[:ret].docidentifier.first&.content}`", key: refid.to_s
83
+ ret[:ret]
84
+ else
85
+ fetch_ref_err(refid, ret[:years])
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,104 @@
1
+ require "net/http"
2
+ require "json"
3
+ require "uri"
4
+ require_relative "../itu"
5
+ require_relative "data_parser_r"
6
+
7
+ module Relaton
8
+ module Itu
9
+ class DataFetcher < Core::DataFetcher
10
+ SEARCH_URL = "https://www.itu.int/net4/ITU-T/search/GlobalSearch/RunSearch".freeze
11
+ ROWS = 100
12
+ MAX_EMPTY_PAGES = 3
13
+
14
+ def index
15
+ @index ||= Relaton::Index.find_or_create :itu, file: "index-v1.yaml"
16
+ end
17
+
18
+ def log_error(msg)
19
+ Util.error msg
20
+ end
21
+
22
+ def fetch(_source = nil)
23
+ start = 0
24
+ empty_pages = 0
25
+ loop do
26
+ results = search_request(start)
27
+ if results.empty?
28
+ empty_pages += 1
29
+ break if empty_pages >= MAX_EMPTY_PAGES
30
+
31
+ start += ROWS
32
+ next
33
+ end
34
+
35
+ empty_pages = 0
36
+ results.each do |result|
37
+ bib = DataParserR.parse(result, @errors)
38
+ write_file(bib) if bib
39
+ rescue => e # rubocop:disable Style/RescueStandardError
40
+ Util.error "#{e.message}\n#{e.backtrace}"
41
+ end
42
+
43
+ start += ROWS
44
+ end
45
+ index.save
46
+ report_errors
47
+ end
48
+
49
+ # @param bib [Relaton::Itu::ItemData]
50
+ def write_file(bib) # rubocop:disable Metrics/AbcSize
51
+ id = bib.docidentifier.find(&:primary).content
52
+ file = output_file(id)
53
+ if @files.include? file
54
+ Util.warn "File #{file} exists."
55
+ else
56
+ @files << file
57
+ end
58
+ index.add_or_update id, file
59
+ File.write file, serialize(bib), encoding: "UTF-8"
60
+ end
61
+
62
+ def to_yaml(bib)
63
+ bib.to_yaml
64
+ end
65
+
66
+ def to_xml(bib)
67
+ bib.to_xml bibdata: true
68
+ end
69
+
70
+ def to_bibxml(bib)
71
+ bib.to_rfcxml
72
+ end
73
+
74
+ private
75
+
76
+ # @param start [Integer] pagination offset
77
+ # @return [Array<Hash>] search result items
78
+ def search_request(start)
79
+ payload = {
80
+ "Input" => "*", "Start" => start, "Rows" => ROWS,
81
+ "SortBy" => "DATE_NEW", "ExactPhrase" => false,
82
+ "CollectionName" => "ITU-R Publications",
83
+ "CollectionGroup" => "Publications", "Sector" => "r",
84
+ "Criterias" => [], "Topics" => "", "ClientData" => {},
85
+ "Language" => "en", "SearchType" => "All",
86
+ }
87
+
88
+ uri = URI(SEARCH_URL)
89
+ http = Net::HTTP.new(uri.host, uri.port)
90
+ http.use_ssl = true
91
+
92
+ request = Net::HTTP::Post.new(uri)
93
+ request["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"
94
+ request["X-Requested-With"] = "XMLHttpRequest"
95
+ request["Referer"] = "https://www.itu.int/net4/itu-t/search/"
96
+ request.body = "json=#{URI.encode_www_form_component(payload.to_json)}"
97
+
98
+ response = http.request(request)
99
+ json = JSON.parse(response.body)
100
+ json["results"] || []
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,140 @@
1
+ module Relaton
2
+ module Itu
3
+ module DataParserR
4
+ extend self
5
+
6
+ TYPE_MAP = {
7
+ "ITU-R Recommendations" => "recommendation",
8
+ "ITU-R Questions" => "question",
9
+ "ITU-R Reports" => "technical-report",
10
+ "Handbooks" => "handbook",
11
+ "ITU-R Resolutions" => "resolution",
12
+ }.freeze
13
+
14
+ #
15
+ # Parse ITU-R document from search API result.
16
+ #
17
+ # @param result [Hash] single search result from the API
18
+ #
19
+ # @return [Relaton::Itu::ItemData] bibliographic item
20
+ #
21
+ def parse(result, errors = {})
22
+ @errors = errors
23
+ doctype = fetch_doctype(result)
24
+ return unless doctype
25
+
26
+ Relaton::Itu::ItemData.new(
27
+ docidentifier: fetch_docid(result), title: fetch_title(result),
28
+ date: fetch_date(result), language: ["en"],
29
+ source: fetch_source(result), script: ["Latn"],
30
+ type: "standard", ext: Relaton::Itu::Ext.new(doctype: doctype, flavor: "itu"),
31
+ )
32
+ end
33
+
34
+ # @param result [Hash]
35
+ # @return [Array<Relaton::Bib::Docidentifier>]
36
+ def fetch_docid(result)
37
+ title = result["Title"].to_s
38
+ id = title.match(/^(ITU-R\s+\S+)/)&.captures&.first
39
+ return(@errors[:docid] &&= true; []) unless id
40
+
41
+ id = id.sub(/\s*\(.*/, "")
42
+ result_ids = [Docidentifier.new(type: "ITU", content: id, primary: true)]
43
+ @errors[:docid] &&= result_ids.empty?
44
+ result_ids
45
+ end
46
+
47
+ # @param result [Hash]
48
+ # @return [Array<Relaton::Bib::Title>]
49
+ def fetch_title(result)
50
+ title = result["Title"].to_s
51
+ content = title.sub(/^[^:]+:\s*/, "").strip
52
+ content = title unless content.length > 0
53
+ r = [Relaton::Bib::Title.new(type: "main", content: content, language: "en", script: "Latn")]
54
+ @errors[:title] &&= r.empty?
55
+ r
56
+ end
57
+
58
+ # @param result [Hash]
59
+ # @return [Array<Relaton::Bib::Date>]
60
+ def fetch_date(result)
61
+ prop = property(result, "Publication date")
62
+ unless prop
63
+ @errors[:date] &&= true
64
+ return []
65
+ end
66
+
67
+ date = parse_pub_date(prop)
68
+ unless date
69
+ @errors[:date] &&= true
70
+ return []
71
+ end
72
+
73
+ r = [Relaton::Bib::Date.new(type: "published", at: date)]
74
+ @errors[:date] &&= r.empty?
75
+ r
76
+ end
77
+
78
+ # @param result [Hash]
79
+ # @return [Array<Relaton::Bib::Uri>]
80
+ def fetch_source(result)
81
+ locations = result["Locations"]
82
+ unless locations.is_a?(Array)
83
+ @errors[:source] &&= true
84
+ return []
85
+ end
86
+
87
+ pdf = locations.find { |l| l["Type"] == "pdf" }
88
+ unless pdf && pdf["RawHref"]
89
+ @errors[:source] &&= true
90
+ return []
91
+ end
92
+
93
+ r = [Relaton::Bib::Uri.new(type: "pdf", content: pdf["RawHref"])]
94
+ @errors[:source] &&= r.empty?
95
+ r
96
+ end
97
+
98
+ # @param result [Hash]
99
+ # @return [Relaton::Itu::Doctype, nil]
100
+ def fetch_doctype(result)
101
+ type_value = property(result, "Type")
102
+ mapped = TYPE_MAP[type_value]
103
+ unless mapped
104
+ @errors[:doctype] &&= true
105
+ return
106
+ end
107
+
108
+ @errors[:doctype] &&= false
109
+ Doctype.new(content: mapped)
110
+ end
111
+
112
+ private
113
+
114
+ # Find a property value from the result's Properties array.
115
+ # @param result [Hash]
116
+ # @param name [String]
117
+ # @return [String, nil]
118
+ def property(result, name)
119
+ props = result["Properties"]
120
+ return unless props.is_a?(Array)
121
+
122
+ entry = props.find { |p| p["Title"] == name }
123
+ entry&.[]("Value")
124
+ end
125
+
126
+ # Parse publication date string like "January, 2024" or "2024".
127
+ # @param value [String]
128
+ # @return [String, nil]
129
+ def parse_pub_date(value)
130
+ case value
131
+ when /(\w+),?\s+(\d{4})/
132
+ month = Date::MONTHNAMES.index($1)
133
+ month ? "#{$2}-#{format('%02d', month)}" : $2
134
+ when /(\d{4})/
135
+ $1
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Itu
5
+ # Hit.
6
+ class Hit < Relaton::Core::Hit
7
+ attr_writer :item
8
+
9
+ # Parse page.
10
+ # @return [Relaton::Itu::ItemData]
11
+ def item
12
+ @item ||= Scraper.parse_page self, imp: gi_imp
13
+ end
14
+
15
+ private
16
+
17
+ def gi_imp
18
+ @gi_imp ||= /\.Imp\d/.match?(hit[:ref].to_s)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit"
4
+
5
+ module Relaton
6
+ module Itu
7
+ # Page of hit collection.
8
+ class HitCollection < Relaton::Core::HitCollection
9
+ DOMAIN = "https://www.itu.int"
10
+ GH_ITU_R = "https://raw.githubusercontent.com/relaton/relaton-data-itu-r/refs/heads/v2/"
11
+
12
+ def search
13
+ case ref.to_ref
14
+ when /^(ITU-T|ITU-R\sRR)/
15
+ request_search
16
+ when /^ITU-R\s/
17
+ request_document
18
+ end
19
+ rescue Mechanize::ResponseCodeError, SocketError, Timeout::Error, Errno::ECONNRESET,
20
+ EOFError, Net::ProtocolError, OpenSSL::SSL::SSLError => e
21
+ raise Relaton::RequestError, "Could not access #{ref.to_ref}: #{e.message}"
22
+ end
23
+
24
+ def agent
25
+ @agent ||= Mechanize.new.tap { |agent| agent.user_agent_alias = "Mac Safari" }
26
+ end
27
+
28
+ private
29
+
30
+ def request_search
31
+ Util.info "Fetching from www.itu.int ...", key: ref.to_s
32
+ url = "#{DOMAIN}/net4/ITU-T/search/GlobalSearch/RunSearch"
33
+ data = { json: params.to_json }
34
+ resp = agent.post url, data
35
+ @array = hits JSON.parse(resp.body)
36
+ end
37
+
38
+ def request_document # rubocop:todo Metrics/MethodLength, Metrics/AbcSize
39
+ Util.info "Fetching from Relaton repository ...", key: ref.to_s
40
+ index = Relaton::Index.find_or_create :itu, url: "#{GH_ITU_R}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml"
41
+ row = index.search(ref.to_ref).max_by { |i| i[:id] }
42
+ return unless row
43
+
44
+ url = "#{GH_ITU_R}#{row[:file]}"
45
+ resp = agent.get url
46
+ return if resp.code == "404"
47
+
48
+ item = Item.from_yaml(resp.body).tap { |i| i.fetched = Date.today.to_s }
49
+ hit = Hit.new({ url: url, ref: ref }, self)
50
+ hit.item = item
51
+ @array = [hit]
52
+ end
53
+
54
+ # @return [String]
55
+ def group
56
+ @group ||= case ref.to_ref
57
+ when %r{OB|Operational Bulletin}, %r{^ITU-R\sRR}
58
+ "Publications"
59
+ when %r{^ITU-T} then "Recommendations"
60
+ end
61
+ end
62
+
63
+ # @return [Hash]
64
+ def params # rubocop:disable Metrics/MethodLength
65
+ input = ref.dup
66
+ input.year = nil
67
+ {
68
+ "Input" => input.to_s,
69
+ "Start" => 0,
70
+ "Rows" => 20,
71
+ "SortBy" => "RELEVANCE",
72
+ "ExactPhrase" => false,
73
+ "CollectionName" => "General",
74
+ "CollectionGroup" => group,
75
+ "Sector" => ref.to_ref.match(/(?<=^ITU-)\w/).to_s.downcase,
76
+ "Criterias" => [{
77
+ "Name" => "Search in",
78
+ "Criterias" => [
79
+ {
80
+ "Selected" => false,
81
+ "Value" => "",
82
+ "Label" => "Name",
83
+ "Target" => "/name_s",
84
+ "TypeName" => "CHECKBOX",
85
+ "GetCriteriaType" => 0,
86
+ },
87
+ {
88
+ "Selected" => false,
89
+ "Value" => "",
90
+ "Label" => "Short description",
91
+ "Target" => "/short_description_s",
92
+ "TypeName" => "CHECKBOX",
93
+ "GetCriteriaType" => 0,
94
+ },
95
+ {
96
+ "Selected" => false,
97
+ "Value" => "",
98
+ "Label" => "File content",
99
+ "Target" => "/file",
100
+ "TypeName" => "CHECKBOX",
101
+ "GetCriteriaType" => 0,
102
+ },
103
+ ],
104
+ "ShowCheckbox" => true,
105
+ "Selected" => false,
106
+ }],
107
+ "Topics" => "",
108
+ "ClientData" => {},
109
+ "Language" => "en",
110
+ "SearchType" => "All",
111
+ }
112
+ end
113
+
114
+ # @param data [Hash]
115
+ # @return [Array<Relaton::Itu::Hit>]
116
+ def hits(data)
117
+ data["results"].map do |h|
118
+ code = h["Media"]["Name"]
119
+ title = h["Title"]
120
+ url = "#{DOMAIN}#{h['Redirection']}"
121
+ type = h["Collection"]["Group"].downcase[0...-1]
122
+ Hit.new({ code: code, title: title, url: url, type: type }, self)
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Itu
3
+ class ItemData < Bib::ItemData
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Itu
3
+ class ApprovalStage < Lutaml::Model::Serializable
4
+ attribute :process, :string, values: %w[tap aap]
5
+ attribute :content, :string, values: %w[determined in-force a lc ac lj aj na ar ri at sg c tap]
6
+
7
+ xml do
8
+ map_attribute "process", to: :process
9
+ map_content to: :content
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Itu
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 Itu
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Itu
3
+ class Docidentifier < Bib::Docidentifier
4
+ def remove_date!
5
+ self.content = content.gsub(/\s*\((?:\d{2}\/)?\d{4}\)/, "")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Itu
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[
5
+ recommendation recommendation-supplement recommendation-amendment recommendation-corrigendum
6
+ recommendation-errata recommendation-annex focus-group implementers-guide technical-paper
7
+ technical-report joint-itu-iso-iec resolution service-publication handbook question contribution
8
+ ].freeze
9
+
10
+ attribute :content, :string, values: TYPES
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ require_relative "doctype"
2
+ require_relative "question"
3
+ require_relative "recommendation_status"
4
+ require_relative "meeting"
5
+ require_relative "meeting_date"
6
+ require_relative "structured_identifier"
7
+
8
+ module Relaton
9
+ module Itu
10
+ class Ext < Bib::Ext
11
+ attribute :doctype, Doctype
12
+ attribute :structuredidentifier, StructuredIdentifier
13
+ attribute :question, Question, collection: true
14
+ attribute :recommendationstatus, RecommendationStatus
15
+ attribute :ip_notice_received, :boolean
16
+ attribute :meeting, Meeting
17
+ attribute :meeting_place, :string
18
+ attribute :meeting_date, MeetingDate
19
+ attribute :intended_type, :string, values: %w[R C TD]
20
+ attribute :source, :string
21
+
22
+ xml do
23
+ map_element "question", to: :question
24
+ map_element "recommendationstatus", to: :recommendationstatus
25
+ map_element "ip-notice-received", to: :ip_notice_received
26
+ map_element "meeting", to: :meeting
27
+ map_element "meeting-place", to: :meeting_place
28
+ map_element "meeting-date", to: :meeting_date
29
+ map_element "intended-type", to: :intended_type
30
+ map_element "source", to: :source
31
+ end
32
+
33
+ key_value do
34
+ map_element "question", to: :question
35
+ map_element "recommendationstatus", to: :recommendationstatus
36
+ map_element "ip_notice_received", to: :ip_notice_received
37
+ map_element "meeting", to: :meeting
38
+ map_element "meeting_place", to: :meeting_place
39
+ map_element "meeting_date", to: :meeting_date
40
+ map_element "intended_type", to: :intended_type
41
+ map_element "source", to: :source
42
+ end
43
+
44
+ def get_schema_version = Relaton.schema_versions["relaton-model-itu"]
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+
4
+ module Relaton
5
+ module Itu
6
+ class Item < Bib::Item
7
+ model ItemData
8
+
9
+ attribute :docidentifier, Docidentifier, collection: true, initialize_empty: true
10
+ attribute :ext, Ext
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Itu
3
+ class Meeting < Lutaml::Model::Serializable
4
+ attribute :acronym, :string
5
+ attribute :content, :string
6
+
7
+ xml do
8
+ map_attribute "acronym", to: :acronym
9
+ map_content to: :content
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Relaton
2
+ module Itu
3
+ class MeetingDate < Lutaml::Model::Serializable
4
+ attribute :from, :string
5
+ attribute :to, :string
6
+ attribute :at, :string
7
+
8
+ xml do
9
+ map_element "from", to: :from
10
+ map_element "to", to: :to
11
+ map_element "on", to: :at
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Itu
3
+ class Question < Lutaml::Model::Serializable
4
+ attribute :identifier, :string
5
+ attribute :name, :string
6
+
7
+ xml do
8
+ map_element "identifier", to: :identifier
9
+ map_element "name", to: :name
10
+ end
11
+ end
12
+ end
13
+ end