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,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Un
5
+ module Wasm
6
+ class Memory
7
+ PAGE = 65_536
8
+
9
+ attr_reader :max_pages
10
+
11
+ def initialize(initial_pages:, max_pages: nil)
12
+ @pages = initial_pages
13
+ @max_pages = max_pages
14
+ @buf = String.new("\x00".b * (initial_pages * PAGE), encoding: Encoding::ASCII_8BIT)
15
+ end
16
+
17
+ def size_pages
18
+ @pages
19
+ end
20
+
21
+ def grow(delta)
22
+ new_pages = @pages + delta
23
+ return -1 if @max_pages && new_pages > @max_pages
24
+
25
+ old = @pages
26
+ @pages = new_pages
27
+ @buf << ("\x00".b * (delta * PAGE))
28
+ old
29
+ end
30
+
31
+ def read(addr, len)
32
+ bounds!(addr, len)
33
+ @buf.byteslice(addr, len)
34
+ end
35
+
36
+ def write(addr, bytes)
37
+ bytes = bytes.b
38
+ bounds!(addr, bytes.bytesize)
39
+ @buf.bytesplice(addr, bytes.bytesize, bytes)
40
+ end
41
+
42
+ def load_u8(addr)
43
+ bounds!(addr, 1)
44
+ @buf.getbyte(addr)
45
+ end
46
+
47
+ def load_i8(addr)
48
+ v = load_u8(addr)
49
+ v >= 0x80 ? v - 0x100 : v
50
+ end
51
+
52
+ def load_u16(addr)
53
+ bounds!(addr, 2)
54
+ @buf.byteslice(addr, 2).unpack1("v")
55
+ end
56
+
57
+ def load_i16(addr)
58
+ v = load_u16(addr)
59
+ v >= 0x8000 ? v - 0x10000 : v
60
+ end
61
+
62
+ def load_u32(addr)
63
+ bounds!(addr, 4)
64
+ @buf.byteslice(addr, 4).unpack1("V")
65
+ end
66
+
67
+ def load_i32(addr)
68
+ v = load_u32(addr)
69
+ v >= 0x8000_0000 ? v - 0x1_0000_0000 : v
70
+ end
71
+
72
+ def load_u64(addr)
73
+ bounds!(addr, 8)
74
+ @buf.byteslice(addr, 8).unpack1("Q<")
75
+ end
76
+
77
+ def load_i64(addr)
78
+ v = load_u64(addr)
79
+ v >= 0x8000_0000_0000_0000 ? v - 0x1_0000_0000_0000_0000 : v
80
+ end
81
+
82
+ def store_u8(addr, val)
83
+ bounds!(addr, 1)
84
+ @buf.setbyte(addr, val & 0xff)
85
+ end
86
+
87
+ def store_u16(addr, val)
88
+ bounds!(addr, 2)
89
+ @buf.bytesplice(addr, 2, [val & 0xffff].pack("v"))
90
+ end
91
+
92
+ def store_u32(addr, val)
93
+ bounds!(addr, 4)
94
+ @buf.bytesplice(addr, 4, [val & 0xffff_ffff].pack("V"))
95
+ end
96
+
97
+ def store_u64(addr, val)
98
+ bounds!(addr, 8)
99
+ @buf.bytesplice(addr, 8, [val & 0xffff_ffff_ffff_ffff].pack("Q<"))
100
+ end
101
+
102
+ private
103
+
104
+ def bounds!(addr, len)
105
+ return if addr >= 0 && addr + len <= @buf.bytesize
106
+
107
+ raise Trap, "out of bounds memory access (addr=#{addr}, len=#{len}, size=#{@buf.bytesize})"
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Un
5
+ module Wasm
6
+ FuncType = Struct.new(:params, :results)
7
+ Import = Struct.new(:mod, :field, :kind, :desc)
8
+ Export = Struct.new(:name, :kind, :index)
9
+ Global = Struct.new(:type, :mutable, :init_expr)
10
+ Element = Struct.new(:table_idx, :offset_expr, :func_indices)
11
+ Data = Struct.new(:mem_idx, :offset_expr, :bytes)
12
+ Code = Struct.new(:locals, :body)
13
+
14
+ MemoryType = Struct.new(:initial, :max)
15
+ TableType = Struct.new(:elem_type, :initial, :max)
16
+
17
+ class Module
18
+ attr_reader :types, :imports, :function_type_indices, :tables, :memories,
19
+ :globals, :exports, :elements, :code, :data, :start
20
+
21
+ def initialize
22
+ @types = []
23
+ @imports = []
24
+ @function_type_indices = []
25
+ @tables = []
26
+ @memories = []
27
+ @globals = []
28
+ @exports = []
29
+ @elements = []
30
+ @code = []
31
+ @data = []
32
+ @start = nil
33
+ end
34
+
35
+ def self.parse(bytes)
36
+ Decoder.new(bytes).decode
37
+ end
38
+
39
+ # Number of imported functions (they precede module-defined functions
40
+ # in the funcidx space).
41
+ def imported_function_count
42
+ @imports.count { |i| i.kind == :func }
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Un
5
+ module Wasm
6
+ class Trap < StandardError; end
7
+ class DecodeError < StandardError; end
8
+ class LinkError < StandardError; end
9
+ end
10
+ end
11
+ end
12
+
13
+ require_relative "wasm/memory"
14
+ require_relative "wasm/decoder"
15
+ require_relative "wasm/module"
16
+ require_relative "wasm/interpreter"
17
+ require_relative "wasm/instance"
Binary file
data/lib/relaton/un.rb ADDED
@@ -0,0 +1,28 @@
1
+ require "addressable"
2
+ require "relaton/bib"
3
+ require_relative "version"
4
+ require_relative "un/util"
5
+ require_relative "un/item_data"
6
+ require_relative "un/item"
7
+ require_relative "un/bibitem"
8
+ require_relative "un/bibdata"
9
+ require_relative "un/token_generator"
10
+ require_relative "un/parser"
11
+ require_relative "un/hit"
12
+ require_relative "un/hit_collection"
13
+ require_relative "un/bibliography"
14
+
15
+ module Relaton
16
+ module Un
17
+ class Error < StandardError; end
18
+
19
+ # Returns hash of XML reammar
20
+ # @return [String]
21
+ def self.grammar_hash
22
+ # gem_path = File.expand_path "..", __dir__
23
+ # grammars_path = File.join gem_path, "grammars", "*"
24
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
25
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,3 @@
1
1
  module Relaton
2
- VERSION = "2.2.0.pre.alpha.1".freeze
2
+ VERSION = "3.0.0.pre.alpha.1".freeze
3
3
  end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module W3c
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 W3c
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "relaton/bib/hash_parser_v1"
5
+ require_relative "pubid"
6
+
7
+ module Relaton
8
+ module W3c
9
+ # Class methods for search W3C standards.
10
+ class Bibliography
11
+ SOURCE = "https://raw.githubusercontent.com/relaton/relaton-data-w3c/v2/"
12
+
13
+ class << self
14
+ # @param text [String]
15
+ # @return [Relaton::W3c::ItemData]
16
+ def search(text) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
17
+ pubid = PubId.parse text.sub(/^W3C\s/, "")
18
+ index = Relaton::Index.find_or_create(
19
+ :W3C, url: "#{SOURCE}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml", id_keys: PubId::PARTS,
20
+ )
21
+ row = index.search { |r| pubid == r[:id] }.sort_by { |r| (r[:id][:date] || r[:id][:year]).to_i }.last
22
+ return unless row
23
+
24
+ url = "#{SOURCE}#{row[:file]}"
25
+ resp = Net::HTTP.get_response(URI.parse(url))
26
+ return unless resp.code == "200"
27
+
28
+ Item.from_yaml(resp.body).tap { |i| i.fetched = Date.today.to_s }
29
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
30
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
31
+ Net::ProtocolError, Errno::ETIMEDOUT => e
32
+ raise Relaton::RequestError, "Could not access #{url}: #{e.message}"
33
+ end
34
+
35
+ # @param ref [String] the W3C standard Code to look up
36
+ # @param year [String, NilClass] not used
37
+ # @param opts [Hash] options
38
+ # @return [Relaton::W3c::ItemData]
39
+ def get(ref, _year = nil, _opts = {})
40
+ Util.info "Fetching from Relaton repository ...", key: ref
41
+ result = search(ref)
42
+ unless result
43
+ Util.info "Not found.", key: ref
44
+ return
45
+ end
46
+
47
+ found = result.docidentifier.first.content
48
+ Util.info "Found: `#{found}`", key: ref
49
+ result
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,309 @@
1
+ require "relaton/core"
2
+ require "w3c_api"
3
+ require_relative "../w3c"
4
+ require_relative "safe_realize"
5
+ require_relative "data_parser"
6
+ require_relative "pubid"
7
+
8
+ module Relaton
9
+ module W3c
10
+ class DataFetcher < Core::DataFetcher
11
+ include Relaton::W3c::SafeRealize
12
+
13
+ # Raised when pagination over the specifications index stops before the
14
+ # last page (e.g. a page fetch fails after retries, or the API reports
15
+ # more pages than were reached). It aborts the whole crawl so a truncated
16
+ # dataset is never saved or committed — see #fetch and #enqueue_specs.
17
+ class CrawlIncompleteError < StandardError; end
18
+
19
+ # Conservative default: too many parallel workers burst the per-spec
20
+ # version-history requests fast enough to trip the W3C API rate limiter
21
+ # (429s), which is what silently truncated the dataset before the crawl
22
+ # learned to abort on incomplete pagination. Raise it via the env var on
23
+ # a faster/shallower run; lower it further if 429s still appear.
24
+ DEFAULT_CONCURRENCY = 4
25
+
26
+ # How many times #fetch_specifications_page retries a transient failure
27
+ # (rate-limit/connection) before giving up and aborting the crawl.
28
+ PAGE_FETCH_ATTEMPTS = 3
29
+
30
+ # Number of fetch_spec worker threads. Tunable via env var so CI or
31
+ # local runs can dial it up for speed or down to lighten load on
32
+ # api.w3.org (or for debugging).
33
+ def self.concurrency
34
+ (ENV["RELATON_W3C_FETCH_CONCURRENCY"] || DEFAULT_CONCURRENCY).to_i
35
+ end
36
+
37
+ # Whether to crawl each specification's version history (version_history,
38
+ # predecessor_versions, successor_versions). Enabled by default for a
39
+ # complete dataset. Set RELATON_W3C_FETCH_VERSIONS=false for a faster,
40
+ # shallower crawl that emits only the top-level specifications and skips
41
+ # the per-spec version fan-out (the bulk of the API requests).
42
+ def self.fetch_versions?
43
+ val = ENV["RELATON_W3C_FETCH_VERSIONS"]
44
+ return true if val.nil? || val.empty?
45
+
46
+ !%w[0 false no off].include?(val.strip.downcase)
47
+ end
48
+
49
+ def initialize(*args)
50
+ super
51
+ @mutex = Mutex.new
52
+ @interrupted = false
53
+ end
54
+
55
+ def index
56
+ @index ||= Relaton::Index.find_or_create(:W3C, file: "#{INDEXFILE}.yaml")
57
+ end
58
+
59
+ def log_error(msg)
60
+ Util.error msg
61
+ end
62
+
63
+ def client
64
+ @client ||= W3cApi::Client.new
65
+ end
66
+
67
+ #
68
+ # Parse documents in parallel. The crawler is heavily I/O-bound on
69
+ # api.w3.org round-trips (~30-50k requests per run), so a small thread
70
+ # pool gives a near-linear speedup. Pagination still happens serially:
71
+ # each page's `next?` flag gates whether the next page is requested.
72
+ #
73
+ # A SIGINT (Ctrl-C) is handled gracefully: the producer stops queuing and
74
+ # the workers stop processing after their in-flight spec, then the index
75
+ # of everything fetched so far is saved rather than the run being lost.
76
+ #
77
+ def fetch(_source = nil)
78
+ n_workers = self.class.concurrency
79
+ queue = SizedQueue.new(n_workers * 4)
80
+ workers = Array.new(n_workers) { spawn_worker(queue) }
81
+
82
+ with_interrupt_handler do
83
+ # The poison pills + join run in `ensure` so an exception raised while
84
+ # enqueuing (e.g. CrawlIncompleteError) still unblocks the producer
85
+ # and drains the workers instead of deadlocking on queue.pop.
86
+ begin
87
+ enqueue_specs(queue)
88
+ ensure
89
+ n_workers.times { queue << nil } # poison pills
90
+ workers.each(&:join)
91
+ end
92
+ Util.warn "Crawl interrupted — saving progress collected so far." if @interrupted
93
+ index.save
94
+ end
95
+
96
+ report_errors
97
+ end
98
+
99
+ #
100
+ # Page through the specifications index, feeding each spec (paired with
101
+ # its embedded page) to the worker queue. Returns early when interrupted.
102
+ #
103
+ # embed: true inlines each specification's full payload into the index
104
+ # page's `_embedded` block, so a spec link realizes from that page in
105
+ # memory instead of making its own HTTP request — one request per page
106
+ # rather than one per specification. The page is queued alongside each
107
+ # link so the worker can hand it back to realize as the parent_resource.
108
+ #
109
+ def enqueue_specs(queue)
110
+ specs = client.specifications(embed: true)
111
+ expected_pages = specs.pages
112
+ last_page = nil
113
+ loop do
114
+ page = specs
115
+ page.links.specifications.each do |spec|
116
+ break if @interrupted
117
+
118
+ queue << [spec, page]
119
+ end
120
+ break if @interrupted
121
+
122
+ last_page = page.page
123
+ break unless page.next?
124
+
125
+ # Fetch the next page through the client's fetch path rather than
126
+ # realizing the `next` link: only fetch populates the page's
127
+ # embedded_data, so this keeps embed working past page 1. Realizing
128
+ # the `next` link drops `_embedded` and forces a per-spec HTTP
129
+ # request for every specification on every later page.
130
+ next_page = fetch_specifications_page(page.page + 1)
131
+ # A nil here means the page fetch failed after retries (not the end
132
+ # of the list — that is `!page.next?` above). Aborting rather than
133
+ # `break`ing prevents a rate-limit blip from silently truncating the
134
+ # dataset: a partial crawl must never be saved/committed.
135
+ unless next_page
136
+ raise CrawlIncompleteError,
137
+ "specifications pagination stopped at page #{page.page}: " \
138
+ "failed to fetch page #{page.page + 1}"
139
+ end
140
+
141
+ specs = next_page
142
+ end
143
+
144
+ return if @interrupted
145
+
146
+ guard_complete_pagination(last_page, expected_pages)
147
+ end
148
+
149
+ # Defense in depth: even when no page fetch raised, make sure pagination
150
+ # actually reached the last page the API advertised. Catches truncation
151
+ # modes other than a failed fetch (e.g. a `next` link that goes missing).
152
+ # Only enforced when the index reported a positive page count.
153
+ def guard_complete_pagination(last_page, expected_pages)
154
+ return unless expected_pages.is_a?(Integer) && expected_pages.positive?
155
+ return unless last_page.is_a?(Integer) && last_page < expected_pages
156
+
157
+ raise CrawlIncompleteError,
158
+ "specifications pagination ended at page #{last_page} of " \
159
+ "#{expected_pages}; refusing to save a partial dataset"
160
+ end
161
+
162
+ def fetch_spec(unrealized_spec, page = nil)
163
+ # When `page` came from an embed:true fetch, realizing against it as the
164
+ # parent_resource serves the spec from embedded data (no HTTP request).
165
+ spec = realize(unrealized_spec, parent_resource: page)
166
+ return unless spec
167
+
168
+ local_errors = Hash.new(true)
169
+ save_doc DataParser.parse(spec, local_errors)
170
+
171
+ fetch_versions(spec) if self.class.fetch_versions?
172
+
173
+ @mutex.synchronize { local_errors.each { |k, v| @errors[k] &&= v } }
174
+ end
175
+
176
+ #
177
+ # Crawl a specification's version history: its dated editions plus the
178
+ # predecessor/successor version chains. Each entry is a separate HTTP
179
+ # request, so this is the bulk of a run and can be skipped via
180
+ # RELATON_W3C_FETCH_VERSIONS=false (see .fetch_versions?).
181
+ #
182
+ def fetch_versions(spec)
183
+ if spec.links.respond_to?(:version_history) && spec.links.version_history
184
+ version_history = realize spec.links.version_history
185
+ version_history&.links&.spec_versions&.each { |version| parse_and_save version }
186
+ end
187
+
188
+ if spec.links.respond_to?(:predecessor_versions) && spec.links.predecessor_versions
189
+ predecessor_versions = realize spec.links.predecessor_versions
190
+ predecessor_versions&.links&.predecessor_versions&.each { |version| parse_and_save version }
191
+ end
192
+
193
+ return unless spec.links.respond_to?(:successor_versions) && spec.links.successor_versions
194
+
195
+ successor_versions = realize spec.links.successor_versions
196
+ successor_versions&.links&.successor_versions&.each { |version| parse_and_save version }
197
+ end
198
+
199
+ #
200
+ # Save document to file
201
+ #
202
+ # @param [Relaton::W3c::ItemData, nil] bib bibliographic item
203
+ #
204
+ def save_doc(bib, warn_duplicate: true)
205
+ return unless bib
206
+
207
+ file = file_name(bib.docnumber)
208
+ @mutex.synchronize do
209
+ if @files.include?(file)
210
+ Util.warn "File #{file} already exists. Document: #{bib.docnumber}" if warn_duplicate
211
+ else
212
+ pubid = PubId.parse bib.docnumber
213
+ index.add_or_update pubid.to_hash, file
214
+ @files << file
215
+ end
216
+ File.write file, serialize(bib), encoding: "UTF-8"
217
+ end
218
+ end
219
+
220
+ def to_xml(bib)
221
+ bib.to_xml(bibdata: true)
222
+ end
223
+
224
+ def to_yaml(bib)
225
+ bib.to_yaml
226
+ end
227
+
228
+ def to_bibxml(bib)
229
+ bib.to_xml
230
+ end
231
+
232
+ #
233
+ # Generate file name
234
+ #
235
+ # @param [String] id document id
236
+ #
237
+ # @return [String] file name
238
+ #
239
+ def file_name(id)
240
+ name = id.sub(/^W3C\s/, "").gsub(/[\s,:\/+]/, "_").squeeze("_").downcase
241
+ File.join @output, "#{name}.#{@ext}"
242
+ end
243
+
244
+ private
245
+
246
+ # Install a SIGINT handler for the duration of the crawl so Ctrl-C sets
247
+ # the @interrupted flag (observed by the producer loop and the workers)
248
+ # instead of killing the process mid-write. The trap body is kept minimal
249
+ # (no I/O or locking) because trap context is restricted; the user-facing
250
+ # notice is printed from the main thread once the crawl winds down. The
251
+ # previous handler is restored on the way out so the trap doesn't leak
252
+ # into the host process.
253
+ def with_interrupt_handler
254
+ previous = Signal.trap("INT") { @interrupted = true }
255
+ yield
256
+ ensure
257
+ Signal.trap("INT", previous || "DEFAULT")
258
+ end
259
+
260
+ # Fetch one page of the specifications index with embed enabled. Goes
261
+ # through the client (the register's fetch path) so the page's
262
+ # embedded_data is populated. Transient 403/5xx/connection failures are
263
+ # already retried upstream (w3c_api/lutaml-hal), but losing an index page
264
+ # drops every spec on it, so retry a few more times here with backoff to
265
+ # ride out a brief rate-limit window. Returns nil only once the attempts
266
+ # are exhausted; the caller turns that into a CrawlIncompleteError so the
267
+ # crawl aborts instead of committing a truncated dataset.
268
+ def fetch_specifications_page(number)
269
+ attempt = 0
270
+ begin
271
+ attempt += 1
272
+ client.specifications(embed: true, page: number)
273
+ rescue Lutaml::Hal::Error, Faraday::Error => e
274
+ log_error "Failed to fetch specifications page #{number} " \
275
+ "(attempt #{attempt}/#{PAGE_FETCH_ATTEMPTS}): " \
276
+ "#{e.class}: #{e.message}"
277
+ if attempt < PAGE_FETCH_ATTEMPTS
278
+ sleep(2**attempt)
279
+ retry
280
+ end
281
+ nil
282
+ end
283
+ end
284
+
285
+ def spawn_worker(queue)
286
+ Thread.new do
287
+ while (item = queue.pop)
288
+ # Once interrupted, drain the queue without processing so the
289
+ # producer unblocks and the pool reaches its poison pills quickly.
290
+ next if @interrupted
291
+
292
+ spec, page = item
293
+ begin
294
+ fetch_spec spec, page
295
+ rescue StandardError => e
296
+ log_error "fetch_spec failed: #{e.class}: #{e.message}\n" \
297
+ "#{e.backtrace.first(5).join("\n")}"
298
+ end
299
+ end
300
+ end
301
+ end
302
+
303
+ def parse_and_save(version)
304
+ realized = realize version
305
+ save_doc DataParser.parse(realized) if realized
306
+ end
307
+ end
308
+ end
309
+ end