relaton 2.1.0 → 3.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +109 -38
  3. data/lib/relaton/3gpp/bibdata.rb +9 -0
  4. data/lib/relaton/3gpp/bibitem.rb +9 -0
  5. data/lib/relaton/3gpp/bibliography.rb +48 -0
  6. data/lib/relaton/3gpp/data_fetcher.rb +255 -0
  7. data/lib/relaton/3gpp/doctype.rb +9 -0
  8. data/lib/relaton/3gpp/ext.rb +31 -0
  9. data/lib/relaton/3gpp/item.rb +12 -0
  10. data/lib/relaton/3gpp/item_data.rb +15 -0
  11. data/lib/relaton/3gpp/parser.rb +400 -0
  12. data/lib/relaton/3gpp/processor.rb +68 -0
  13. data/lib/relaton/3gpp/release.rb +34 -0
  14. data/lib/relaton/3gpp/util.rb +8 -0
  15. data/lib/relaton/3gpp.rb +25 -0
  16. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  17. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  18. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  19. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  20. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  21. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  22. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  23. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  24. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  25. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  26. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  27. data/lib/relaton/bib/item_data.rb +229 -0
  28. data/lib/relaton/bib/model/abstract.rb +16 -0
  29. data/lib/relaton/bib/model/address.rb +22 -0
  30. data/lib/relaton/bib/model/affiliation.rb +16 -0
  31. data/lib/relaton/bib/model/bibdata.rb +11 -0
  32. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  33. data/lib/relaton/bib/model/bibitem.rb +11 -0
  34. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  35. data/lib/relaton/bib/model/contact.rb +18 -0
  36. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  37. data/lib/relaton/bib/model/contributor.rb +29 -0
  38. data/lib/relaton/bib/model/copyright.rb +27 -0
  39. data/lib/relaton/bib/model/date.rb +31 -0
  40. data/lib/relaton/bib/model/depiction.rb +16 -0
  41. data/lib/relaton/bib/model/docidentifier.rb +34 -0
  42. data/lib/relaton/bib/model/doctype.rb +14 -0
  43. data/lib/relaton/bib/model/edition.rb +14 -0
  44. data/lib/relaton/bib/model/ext.rb +39 -0
  45. data/lib/relaton/bib/model/extent.rb +16 -0
  46. data/lib/relaton/bib/model/formattedref.rb +43 -0
  47. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  48. data/lib/relaton/bib/model/fullname.rb +11 -0
  49. data/lib/relaton/bib/model/ics.rb +49 -0
  50. data/lib/relaton/bib/model/image.rb +28 -0
  51. data/lib/relaton/bib/model/item.rb +96 -0
  52. data/lib/relaton/bib/model/item_base.rb +20 -0
  53. data/lib/relaton/bib/model/item_shared.rb +88 -0
  54. data/lib/relaton/bib/model/keyword.rb +30 -0
  55. data/lib/relaton/bib/model/locality.rb +18 -0
  56. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  57. data/lib/relaton/bib/model/localized_string.rb +48 -0
  58. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  59. data/lib/relaton/bib/model/logo.rb +14 -0
  60. data/lib/relaton/bib/model/medium.rb +22 -0
  61. data/lib/relaton/bib/model/note.rb +16 -0
  62. data/lib/relaton/bib/model/organization.rb +13 -0
  63. data/lib/relaton/bib/model/organization_type.rb +42 -0
  64. data/lib/relaton/bib/model/person.rb +36 -0
  65. data/lib/relaton/bib/model/phone.rb +14 -0
  66. data/lib/relaton/bib/model/place.rb +33 -0
  67. data/lib/relaton/bib/model/price.rb +14 -0
  68. data/lib/relaton/bib/model/relation.rb +43 -0
  69. data/lib/relaton/bib/model/series.rb +34 -0
  70. data/lib/relaton/bib/model/size.rb +23 -0
  71. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  72. data/lib/relaton/bib/model/status.rb +27 -0
  73. data/lib/relaton/bib/model/structured_identifier.rb +48 -0
  74. data/lib/relaton/bib/model/subdivision.rb +16 -0
  75. data/lib/relaton/bib/model/title.rb +56 -0
  76. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  77. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  78. data/lib/relaton/bib/model/uri.rb +18 -0
  79. data/lib/relaton/bib/model/validity.rb +16 -0
  80. data/lib/relaton/bib/model/version.rb +43 -0
  81. data/lib/relaton/bib/namespace_helper.rb +21 -0
  82. data/lib/relaton/bib/sanitizer.rb +68 -0
  83. data/lib/relaton/bib/util.rb +18 -0
  84. data/lib/relaton/bib/versions.json +35 -0
  85. data/lib/relaton/bib.rb +48 -0
  86. data/lib/relaton/bipm/bibliography.rb +82 -0
  87. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  88. data/lib/relaton/bipm/data_fetcher.rb +57 -0
  89. data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
  90. data/lib/relaton/bipm/id_parser.rb +277 -0
  91. data/lib/relaton/bipm/item_data.rb +47 -0
  92. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  93. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  94. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  95. data/lib/relaton/bipm/model/doctype.rb +12 -0
  96. data/lib/relaton/bipm/model/ext.rb +38 -0
  97. data/lib/relaton/bipm/model/item.rb +11 -0
  98. data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
  99. data/lib/relaton/bipm/processor.rb +69 -0
  100. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  101. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
  102. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  103. data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
  104. data/lib/relaton/bipm/util.rb +8 -0
  105. data/lib/relaton/bipm.rb +32 -0
  106. data/lib/relaton/bsi/bibliography.rb +124 -0
  107. data/lib/relaton/bsi/hit.rb +14 -0
  108. data/lib/relaton/bsi/hit_collection.rb +114 -0
  109. data/lib/relaton/bsi/item_data.rb +13 -0
  110. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  111. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  112. data/lib/relaton/bsi/model/docidentifier.rb +9 -0
  113. data/lib/relaton/bsi/model/doctype.rb +14 -0
  114. data/lib/relaton/bsi/model/ext.rb +17 -0
  115. data/lib/relaton/bsi/model/item.rb +17 -0
  116. data/lib/relaton/bsi/model/item_base.rb +22 -0
  117. data/lib/relaton/bsi/model/relation.rb +9 -0
  118. data/lib/relaton/bsi/processor.rb +42 -0
  119. data/lib/relaton/bsi/schema.json +24882 -0
  120. data/lib/relaton/bsi/scraper.rb +288 -0
  121. data/lib/relaton/bsi/util.rb +8 -0
  122. data/lib/relaton/bsi.rb +25 -0
  123. data/lib/relaton/calconnect/bibliography.rb +95 -0
  124. data/lib/relaton/calconnect/data_fetcher.rb +106 -0
  125. data/lib/relaton/calconnect/hit.rb +14 -0
  126. data/lib/relaton/calconnect/hit_collection.rb +84 -0
  127. data/lib/relaton/calconnect/item_data.rb +12 -0
  128. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  129. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  130. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  131. data/lib/relaton/calconnect/model/ext.rb +11 -0
  132. data/lib/relaton/calconnect/model/item.rb +13 -0
  133. data/lib/relaton/calconnect/processor.rb +66 -0
  134. data/lib/relaton/calconnect/scraper.rb +87 -0
  135. data/lib/relaton/calconnect/util.rb +8 -0
  136. data/lib/relaton/calconnect.rb +26 -0
  137. data/lib/relaton/ccsds/bibliography.rb +63 -0
  138. data/lib/relaton/ccsds/data/fetcher.rb +247 -0
  139. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  140. data/lib/relaton/ccsds/data/parser.rb +194 -0
  141. data/lib/relaton/ccsds/hit.rb +24 -0
  142. data/lib/relaton/ccsds/hit_collection.rb +42 -0
  143. data/lib/relaton/ccsds/item_data.rb +9 -0
  144. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  145. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  146. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  147. data/lib/relaton/ccsds/model/ext.rb +19 -0
  148. data/lib/relaton/ccsds/model/item.rb +13 -0
  149. data/lib/relaton/ccsds/processor.rb +68 -0
  150. data/lib/relaton/ccsds/util.rb +10 -0
  151. data/lib/relaton/ccsds.rb +33 -0
  152. data/lib/relaton/cen/bibliography.rb +121 -0
  153. data/lib/relaton/cen/committees.yaml +66 -0
  154. data/lib/relaton/cen/hit.rb +16 -0
  155. data/lib/relaton/cen/hit_collection.rb +68 -0
  156. data/lib/relaton/cen/item_data.rb +7 -0
  157. data/lib/relaton/cen/model/bibdata.rb +8 -0
  158. data/lib/relaton/cen/model/bibitem.rb +8 -0
  159. data/lib/relaton/cen/model/docidentifier.rb +9 -0
  160. data/lib/relaton/cen/model/ext.rb +11 -0
  161. data/lib/relaton/cen/model/item.rb +14 -0
  162. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  163. data/lib/relaton/cen/processor.rb +40 -0
  164. data/lib/relaton/cen/scraper.rb +210 -0
  165. data/lib/relaton/cen/util.rb +8 -0
  166. data/lib/relaton/cen.rb +29 -0
  167. data/lib/relaton/cie/bibdata.rb +8 -0
  168. data/lib/relaton/cie/bibitem.rb +8 -0
  169. data/lib/relaton/cie/bibliography.rb +31 -0
  170. data/lib/relaton/cie/data_fetcher.rb +355 -0
  171. data/lib/relaton/cie/ext.rb +7 -0
  172. data/lib/relaton/cie/item.rb +11 -0
  173. data/lib/relaton/cie/item_data.rb +6 -0
  174. data/lib/relaton/cie/processor.rb +66 -0
  175. data/lib/relaton/cie/scrapper.rb +39 -0
  176. data/lib/relaton/cie/util.rb +8 -0
  177. data/lib/relaton/cie.rb +28 -0
  178. data/lib/relaton/core/array_wrapper.rb +20 -0
  179. data/lib/relaton/core/data_fetcher.rb +97 -0
  180. data/lib/relaton/core/date_parser.rb +42 -0
  181. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  182. data/lib/relaton/core/hit.rb +49 -0
  183. data/lib/relaton/core/hit_collection.rb +118 -0
  184. data/lib/relaton/core/processor.rb +48 -0
  185. data/lib/relaton/core/workers_pool.rb +45 -0
  186. data/lib/relaton/core.rb +9 -0
  187. data/lib/relaton/db/cache.rb +232 -0
  188. data/lib/relaton/db/config.rb +24 -0
  189. data/lib/relaton/db/registry.rb +119 -0
  190. data/lib/relaton/db/util.rb +9 -0
  191. data/lib/relaton/db/workers_pool.rb +22 -0
  192. data/lib/relaton/db.rb +20 -206
  193. data/lib/relaton/doi/crossref.rb +72 -0
  194. data/lib/relaton/doi/parser.rb +827 -0
  195. data/lib/relaton/doi/processor.rb +65 -0
  196. data/lib/relaton/doi/util.rb +8 -0
  197. data/lib/relaton/doi.rb +20 -0
  198. data/lib/relaton/ecma/bibdata.rb +8 -0
  199. data/lib/relaton/ecma/bibitem.rb +8 -0
  200. data/lib/relaton/ecma/bibliography.rb +81 -0
  201. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  202. data/lib/relaton/ecma/data_parser.rb +49 -0
  203. data/lib/relaton/ecma/edition_parser.rb +80 -0
  204. data/lib/relaton/ecma/ext.rb +7 -0
  205. data/lib/relaton/ecma/item.rb +11 -0
  206. data/lib/relaton/ecma/item_data.rb +6 -0
  207. data/lib/relaton/ecma/memento_parser.rb +60 -0
  208. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  209. data/lib/relaton/ecma/parser_common.rb +33 -0
  210. data/lib/relaton/ecma/processor.rb +66 -0
  211. data/lib/relaton/ecma/standard_parser.rb +134 -0
  212. data/lib/relaton/ecma/util.rb +8 -0
  213. data/lib/relaton/ecma.rb +24 -0
  214. data/lib/relaton/etsi/bibdata.rb +10 -0
  215. data/lib/relaton/etsi/bibitem.rb +10 -0
  216. data/lib/relaton/etsi/bibliography.rb +46 -0
  217. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  218. data/lib/relaton/etsi/data_parser.rb +208 -0
  219. data/lib/relaton/etsi/doctype.rb +30 -0
  220. data/lib/relaton/etsi/ext.rb +31 -0
  221. data/lib/relaton/etsi/item.rb +15 -0
  222. data/lib/relaton/etsi/item_data.rb +6 -0
  223. data/lib/relaton/etsi/processor.rb +69 -0
  224. data/lib/relaton/etsi/pubid.rb +37 -0
  225. data/lib/relaton/etsi/status.rb +13 -0
  226. data/lib/relaton/etsi/util.rb +8 -0
  227. data/lib/relaton/etsi.rb +25 -0
  228. data/lib/relaton/gb/bibdata.rb +8 -0
  229. data/lib/relaton/gb/bibitem.rb +8 -0
  230. data/lib/relaton/gb/bibliography.rb +145 -0
  231. data/lib/relaton/gb/ccs.rb +14 -0
  232. data/lib/relaton/gb/committee.rb +13 -0
  233. data/lib/relaton/gb/docidentifier.rb +23 -0
  234. data/lib/relaton/gb/doctype.rb +9 -0
  235. data/lib/relaton/gb/ext.rb +36 -0
  236. data/lib/relaton/gb/gb_scraper.rb +61 -0
  237. data/lib/relaton/gb/gb_type.rb +20 -0
  238. data/lib/relaton/gb/hit.rb +48 -0
  239. data/lib/relaton/gb/hit_collection.rb +19 -0
  240. data/lib/relaton/gb/item.rb +13 -0
  241. data/lib/relaton/gb/item_data.rb +6 -0
  242. data/lib/relaton/gb/processor.rb +46 -0
  243. data/lib/relaton/gb/project_number.rb +38 -0
  244. data/lib/relaton/gb/scraper.rb +204 -0
  245. data/lib/relaton/gb/sec_scraper.rb +92 -0
  246. data/lib/relaton/gb/stage_name.rb +13 -0
  247. data/lib/relaton/gb/structured_identifier.rb +26 -0
  248. data/lib/relaton/gb/t_scraper.rb +126 -0
  249. data/lib/relaton/gb/util.rb +8 -0
  250. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  251. data/lib/relaton/gb.rb +33 -0
  252. data/lib/relaton/iana/bibdata.rb +8 -0
  253. data/lib/relaton/iana/bibitem.rb +8 -0
  254. data/lib/relaton/iana/bibliography.rb +47 -0
  255. data/lib/relaton/iana/data_fetcher.rb +71 -0
  256. data/lib/relaton/iana/item.rb +7 -0
  257. data/lib/relaton/iana/item_data.rb +6 -0
  258. data/lib/relaton/iana/parser.rb +146 -0
  259. data/lib/relaton/iana/processor.rb +68 -0
  260. data/lib/relaton/iana/util.rb +8 -0
  261. data/lib/relaton/iana.rb +29 -0
  262. data/lib/relaton/iec/bibliography.rb +283 -0
  263. data/lib/relaton/iec/data_fetcher.rb +216 -0
  264. data/lib/relaton/iec/data_parser.rb +391 -0
  265. data/lib/relaton/iec/hit.rb +26 -0
  266. data/lib/relaton/iec/hit_collection.rb +138 -0
  267. data/lib/relaton/iec/item_data.rb +7 -0
  268. data/lib/relaton/iec/model/bibdata.rb +8 -0
  269. data/lib/relaton/iec/model/bibitem.rb +8 -0
  270. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  271. data/lib/relaton/iec/model/doctype.rb +12 -0
  272. data/lib/relaton/iec/model/ext.rb +53 -0
  273. data/lib/relaton/iec/model/item.rb +20 -0
  274. data/lib/relaton/iec/model/item_base.rb +12 -0
  275. data/lib/relaton/iec/model/relation.rb +7 -0
  276. data/lib/relaton/iec/model/stage_name.rb +13 -0
  277. data/lib/relaton/iec/processor.rb +73 -0
  278. data/lib/relaton/iec/statuses.yml +199 -0
  279. data/lib/relaton/iec/util.rb +8 -0
  280. data/lib/relaton/iec.rb +98 -0
  281. data/lib/relaton/ieee/balloting_group.rb +13 -0
  282. data/lib/relaton/ieee/bibdata.rb +8 -0
  283. data/lib/relaton/ieee/bibitem.rb +8 -0
  284. data/lib/relaton/ieee/bibliography.rb +51 -0
  285. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  286. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  287. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  288. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  289. data/lib/relaton/ieee/doctype.rb +9 -0
  290. data/lib/relaton/ieee/editorial_group.rb +19 -0
  291. data/lib/relaton/ieee/ext.rb +36 -0
  292. data/lib/relaton/ieee/idams_parser.rb +323 -0
  293. data/lib/relaton/ieee/item.rb +11 -0
  294. data/lib/relaton/ieee/item_data.rb +7 -0
  295. data/lib/relaton/ieee/processor.rb +68 -0
  296. data/lib/relaton/ieee/pub_id.rb +161 -0
  297. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  298. data/lib/relaton/ieee/util.rb +8 -0
  299. data/lib/relaton/ieee.rb +29 -0
  300. data/lib/relaton/ietf/bibdata.rb +8 -0
  301. data/lib/relaton/ietf/bibitem.rb +8 -0
  302. data/lib/relaton/ietf/bibliography.rb +35 -0
  303. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  304. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  305. data/lib/relaton/ietf/doctype.rb +9 -0
  306. data/lib/relaton/ietf/ext.rb +63 -0
  307. data/lib/relaton/ietf/item.rb +16 -0
  308. data/lib/relaton/ietf/item_base.rb +18 -0
  309. data/lib/relaton/ietf/item_data.rb +6 -0
  310. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  311. data/lib/relaton/ietf/processor.rb +68 -0
  312. data/lib/relaton/ietf/relation.rb +9 -0
  313. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  314. data/lib/relaton/ietf/rfc/author.rb +21 -0
  315. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  316. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  317. data/lib/relaton/ietf/rfc/format.rb +19 -0
  318. data/lib/relaton/ietf/rfc/index.rb +46 -0
  319. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  320. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  321. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  322. data/lib/relaton/ietf/scraper.rb +68 -0
  323. data/lib/relaton/ietf/util.rb +8 -0
  324. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  325. data/lib/relaton/ietf.rb +27 -0
  326. data/lib/relaton/iho/bibdata.rb +8 -0
  327. data/lib/relaton/iho/bibitem.rb +8 -0
  328. data/lib/relaton/iho/bibliography.rb +114 -0
  329. data/lib/relaton/iho/comment_period.rb +13 -0
  330. data/lib/relaton/iho/docidentifier.rb +31 -0
  331. data/lib/relaton/iho/doctype.rb +10 -0
  332. data/lib/relaton/iho/ext.rb +20 -0
  333. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  334. data/lib/relaton/iho/item.rb +20 -0
  335. data/lib/relaton/iho/item_base.rb +18 -0
  336. data/lib/relaton/iho/item_data.rb +6 -0
  337. data/lib/relaton/iho/processor.rb +54 -0
  338. data/lib/relaton/iho/relation.rb +9 -0
  339. data/lib/relaton/iho/structured_identifier.rb +20 -0
  340. data/lib/relaton/iho/util.rb +8 -0
  341. data/lib/relaton/iho.rb +27 -0
  342. data/lib/relaton/index/config.rb +52 -0
  343. data/lib/relaton/index/file_io.rb +305 -0
  344. data/lib/relaton/index/file_storage.rb +61 -0
  345. data/lib/relaton/index/id_number.rb +30 -0
  346. data/lib/relaton/index/pool.rb +41 -0
  347. data/lib/relaton/index/type.rb +159 -0
  348. data/lib/relaton/index/util.rb +18 -0
  349. data/lib/relaton/index.rb +60 -0
  350. data/lib/relaton/isbn/isbn.rb +61 -0
  351. data/lib/relaton/isbn/open_library.rb +43 -0
  352. data/lib/relaton/isbn/parser.rb +88 -0
  353. data/lib/relaton/isbn/processor.rb +48 -0
  354. data/lib/relaton/isbn/util.rb +8 -0
  355. data/lib/relaton/isbn.rb +19 -0
  356. data/lib/relaton/iso/bibliography.rb +407 -0
  357. data/lib/relaton/iso/data_fetcher.rb +338 -0
  358. data/lib/relaton/iso/data_parser.rb +444 -0
  359. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  360. data/lib/relaton/iso/hit.rb +57 -0
  361. data/lib/relaton/iso/hit_collection.rb +184 -0
  362. data/lib/relaton/iso/item_data.rb +28 -0
  363. data/lib/relaton/iso/model/bibdata.rb +10 -0
  364. data/lib/relaton/iso/model/bibitem.rb +8 -0
  365. data/lib/relaton/iso/model/contributor.rb +6 -0
  366. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  367. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  368. data/lib/relaton/iso/model/doctype.rb +13 -0
  369. data/lib/relaton/iso/model/ext.rb +35 -0
  370. data/lib/relaton/iso/model/item.rb +17 -0
  371. data/lib/relaton/iso/model/item_base.rb +22 -0
  372. data/lib/relaton/iso/model/organization.rb +9 -0
  373. data/lib/relaton/iso/model/project_number.rb +22 -0
  374. data/lib/relaton/iso/model/relation.rb +9 -0
  375. data/lib/relaton/iso/model/stagename.rb +14 -0
  376. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  377. data/lib/relaton/iso/processor.rb +84 -0
  378. data/lib/relaton/iso/scraper.rb +619 -0
  379. data/lib/relaton/iso/type/pubid.rb +50 -0
  380. data/lib/relaton/iso/util.rb +8 -0
  381. data/lib/relaton/iso.rb +30 -0
  382. data/lib/relaton/itu/bibliography.rb +90 -0
  383. data/lib/relaton/itu/data_fetcher.rb +104 -0
  384. data/lib/relaton/itu/data_parser_r.rb +140 -0
  385. data/lib/relaton/itu/hit.rb +22 -0
  386. data/lib/relaton/itu/hit_collection.rb +127 -0
  387. data/lib/relaton/itu/item_data.rb +6 -0
  388. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  389. data/lib/relaton/itu/model/bibdata.rb +8 -0
  390. data/lib/relaton/itu/model/bibitem.rb +8 -0
  391. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  392. data/lib/relaton/itu/model/doctype.rb +13 -0
  393. data/lib/relaton/itu/model/ext.rb +47 -0
  394. data/lib/relaton/itu/model/item.rb +13 -0
  395. data/lib/relaton/itu/model/meeting.rb +13 -0
  396. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  397. data/lib/relaton/itu/model/question.rb +13 -0
  398. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  399. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  400. data/lib/relaton/itu/processor.rb +66 -0
  401. data/lib/relaton/itu/pubid.rb +177 -0
  402. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  403. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  404. data/lib/relaton/itu/scraper.rb +193 -0
  405. data/lib/relaton/itu/util.rb +8 -0
  406. data/lib/relaton/itu.rb +33 -0
  407. data/lib/relaton/jis/bibdata.rb +8 -0
  408. data/lib/relaton/jis/bibitem.rb +8 -0
  409. data/lib/relaton/jis/bibliography.rb +75 -0
  410. data/lib/relaton/jis/data_fetcher.rb +181 -0
  411. data/lib/relaton/jis/docidentifier.rb +21 -0
  412. data/lib/relaton/jis/doctype.rb +9 -0
  413. data/lib/relaton/jis/ext.rb +13 -0
  414. data/lib/relaton/jis/hit.rb +93 -0
  415. data/lib/relaton/jis/hit_collection.rb +127 -0
  416. data/lib/relaton/jis/item.rb +22 -0
  417. data/lib/relaton/jis/item_base.rb +26 -0
  418. data/lib/relaton/jis/item_data.rb +8 -0
  419. data/lib/relaton/jis/processor.rb +55 -0
  420. data/lib/relaton/jis/relation.rb +11 -0
  421. data/lib/relaton/jis/scraper.rb +232 -0
  422. data/lib/relaton/jis/structured_identifier.rb +13 -0
  423. data/lib/relaton/jis/util.rb +8 -0
  424. data/lib/relaton/jis.rb +33 -0
  425. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  426. data/lib/relaton/logger/config.rb +34 -0
  427. data/lib/relaton/logger/formatter_json.rb +8 -0
  428. data/lib/relaton/logger/formatter_string.rb +12 -0
  429. data/lib/relaton/logger/log.rb +64 -0
  430. data/lib/relaton/logger/log_device.rb +27 -0
  431. data/lib/relaton/logger/pool.rb +24 -0
  432. data/lib/relaton/logger.rb +18 -0
  433. data/lib/relaton/nist/bibdata.rb +8 -0
  434. data/lib/relaton/nist/bibitem.rb +8 -0
  435. data/lib/relaton/nist/bibliography.rb +191 -0
  436. data/lib/relaton/nist/comment_period.rb +15 -0
  437. data/lib/relaton/nist/data_fetcher.rb +84 -0
  438. data/lib/relaton/nist/date.rb +7 -0
  439. data/lib/relaton/nist/doctype.rb +7 -0
  440. data/lib/relaton/nist/ext.rb +16 -0
  441. data/lib/relaton/nist/hit.rb +18 -0
  442. data/lib/relaton/nist/hit_collection.rb +362 -0
  443. data/lib/relaton/nist/item.rb +17 -0
  444. data/lib/relaton/nist/item_data.rb +6 -0
  445. data/lib/relaton/nist/mods_parser.rb +276 -0
  446. data/lib/relaton/nist/processor.rb +68 -0
  447. data/lib/relaton/nist/pubs_export.rb +69 -0
  448. data/lib/relaton/nist/relation.rb +7 -0
  449. data/lib/relaton/nist/scraper.rb +290 -0
  450. data/lib/relaton/nist/series.yaml +49 -0
  451. data/lib/relaton/nist/util.rb +8 -0
  452. data/lib/relaton/nist.rb +34 -0
  453. data/lib/relaton/oasis/bibdata.rb +8 -0
  454. data/lib/relaton/oasis/bibitem.rb +8 -0
  455. data/lib/relaton/oasis/bibliography.rb +60 -0
  456. data/lib/relaton/oasis/browser_agent.rb +71 -0
  457. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  458. data/lib/relaton/oasis/data_parser.rb +305 -0
  459. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  460. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  461. data/lib/relaton/oasis/doctype.rb +7 -0
  462. data/lib/relaton/oasis/ext.rb +19 -0
  463. data/lib/relaton/oasis/item.rb +11 -0
  464. data/lib/relaton/oasis/item_data.rb +6 -0
  465. data/lib/relaton/oasis/processor.rb +68 -0
  466. data/lib/relaton/oasis/util.rb +8 -0
  467. data/lib/relaton/oasis.rb +28 -0
  468. data/lib/relaton/ogc/bibdata.rb +8 -0
  469. data/lib/relaton/ogc/bibitem.rb +8 -0
  470. data/lib/relaton/ogc/bibliography.rb +64 -0
  471. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  472. data/lib/relaton/ogc/docidentifier.rb +6 -0
  473. data/lib/relaton/ogc/doctype.rb +12 -0
  474. data/lib/relaton/ogc/ext.rb +15 -0
  475. data/lib/relaton/ogc/hit.rb +18 -0
  476. data/lib/relaton/ogc/hit_collection.rb +36 -0
  477. data/lib/relaton/ogc/item.rb +13 -0
  478. data/lib/relaton/ogc/item_data.rb +6 -0
  479. data/lib/relaton/ogc/processor.rb +58 -0
  480. data/lib/relaton/ogc/scraper.rb +225 -0
  481. data/lib/relaton/ogc/util.rb +8 -0
  482. data/lib/relaton/ogc.rb +26 -0
  483. data/lib/relaton/oiml/bibdata.rb +8 -0
  484. data/lib/relaton/oiml/bibitem.rb +8 -0
  485. data/lib/relaton/oiml/bibliography.rb +94 -0
  486. data/lib/relaton/oiml/docidentifier.rb +33 -0
  487. data/lib/relaton/oiml/doctype.rb +13 -0
  488. data/lib/relaton/oiml/ext.rb +42 -0
  489. data/lib/relaton/oiml/item.rb +20 -0
  490. data/lib/relaton/oiml/item_base.rb +18 -0
  491. data/lib/relaton/oiml/item_data.rb +6 -0
  492. data/lib/relaton/oiml/processor.rb +54 -0
  493. data/lib/relaton/oiml/relation.rb +9 -0
  494. data/lib/relaton/oiml/util.rb +8 -0
  495. data/lib/relaton/oiml.rb +24 -0
  496. data/lib/relaton/omg/bibdata.rb +8 -0
  497. data/lib/relaton/omg/bibitem.rb +8 -0
  498. data/lib/relaton/omg/bibliography.rb +31 -0
  499. data/lib/relaton/omg/ext.rb +7 -0
  500. data/lib/relaton/omg/item.rb +8 -0
  501. data/lib/relaton/omg/item_data.rb +6 -0
  502. data/lib/relaton/omg/processor.rb +34 -0
  503. data/lib/relaton/omg/scraper.rb +141 -0
  504. data/lib/relaton/omg/util.rb +8 -0
  505. data/lib/relaton/omg.rb +24 -0
  506. data/lib/relaton/plateau/bibdata.rb +8 -0
  507. data/lib/relaton/plateau/bibitem.rb +8 -0
  508. data/lib/relaton/plateau/bibliography.rb +24 -0
  509. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  510. data/lib/relaton/plateau/doctype.rb +7 -0
  511. data/lib/relaton/plateau/ext.rb +23 -0
  512. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  513. data/lib/relaton/plateau/hit.rb +13 -0
  514. data/lib/relaton/plateau/hit_collection.rb +59 -0
  515. data/lib/relaton/plateau/item.rb +12 -0
  516. data/lib/relaton/plateau/item_data.rb +6 -0
  517. data/lib/relaton/plateau/parser.rb +101 -0
  518. data/lib/relaton/plateau/processor.rb +49 -0
  519. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  520. data/lib/relaton/plateau/util.rb +8 -0
  521. data/lib/relaton/plateau.rb +28 -0
  522. data/lib/relaton/un/bibdata.rb +8 -0
  523. data/lib/relaton/un/bibitem.rb +8 -0
  524. data/lib/relaton/un/bibliography.rb +48 -0
  525. data/lib/relaton/un/doctype.rb +10 -0
  526. data/lib/relaton/un/ext.rb +30 -0
  527. data/lib/relaton/un/hit.rb +56 -0
  528. data/lib/relaton/un/hit_collection.rb +61 -0
  529. data/lib/relaton/un/item.rb +11 -0
  530. data/lib/relaton/un/item_data.rb +6 -0
  531. data/lib/relaton/un/parser.rb +108 -0
  532. data/lib/relaton/un/processor.rb +38 -0
  533. data/lib/relaton/un/session.rb +25 -0
  534. data/lib/relaton/un/token_generator.rb +105 -0
  535. data/lib/relaton/un/util.rb +8 -0
  536. data/lib/relaton/un/wasm/decoder.rb +434 -0
  537. data/lib/relaton/un/wasm/instance.rb +101 -0
  538. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  539. data/lib/relaton/un/wasm/memory.rb +112 -0
  540. data/lib/relaton/un/wasm/module.rb +47 -0
  541. data/lib/relaton/un/wasm.rb +17 -0
  542. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  543. data/lib/relaton/un.rb +28 -0
  544. data/lib/relaton/version.rb +1 -1
  545. data/lib/relaton/w3c/bibdata.rb +8 -0
  546. data/lib/relaton/w3c/bibitem.rb +8 -0
  547. data/lib/relaton/w3c/bibliography.rb +54 -0
  548. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  549. data/lib/relaton/w3c/data_parser.rb +379 -0
  550. data/lib/relaton/w3c/doctype.rb +7 -0
  551. data/lib/relaton/w3c/ext.rb +11 -0
  552. data/lib/relaton/w3c/item.rb +12 -0
  553. data/lib/relaton/w3c/item_data.rb +6 -0
  554. data/lib/relaton/w3c/processor.rb +49 -0
  555. data/lib/relaton/w3c/pubid.rb +73 -0
  556. data/lib/relaton/w3c/safe_realize.rb +59 -0
  557. data/lib/relaton/w3c/util.rb +8 -0
  558. data/lib/relaton/w3c.rb +25 -0
  559. data/lib/relaton/xsf/bibdata.rb +8 -0
  560. data/lib/relaton/xsf/bibitem.rb +8 -0
  561. data/lib/relaton/xsf/bibliography.rb +24 -0
  562. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  563. data/lib/relaton/xsf/hit.rb +17 -0
  564. data/lib/relaton/xsf/hit_collection.rb +24 -0
  565. data/lib/relaton/xsf/item.rb +7 -0
  566. data/lib/relaton/xsf/item_data.rb +6 -0
  567. data/lib/relaton/xsf/processor.rb +50 -0
  568. data/lib/relaton/xsf/util.rb +9 -0
  569. data/lib/relaton/xsf.rb +30 -0
  570. data/lib/relaton-core.rb +1 -0
  571. data/lib/relaton.rb +44 -9
  572. metadata +708 -150
  573. data/.github/workflows/rake.yml +0 -14
  574. data/.github/workflows/release.yml +0 -24
  575. data/.github/workflows/rubocop.yml +0 -48
  576. data/.gitignore +0 -12
  577. data/.rspec +0 -3
  578. data/.rubocop.yml +0 -12
  579. data/CLAUDE.md +0 -70
  580. data/Gemfile +0 -21
  581. data/Rakefile +0 -6
  582. data/docs/CHANGELOG.adoc +0 -16
  583. data/docs/VERSIONING_POLICY.adoc +0 -38
  584. data/docs/navigation.adoc +0 -6
  585. data/lib/relaton/config.rb +0 -24
  586. data/lib/relaton/db_cache.rb +0 -230
  587. data/lib/relaton/registry.rb +0 -118
  588. data/lib/relaton/util.rb +0 -7
  589. data/lib/relaton/workers_pool.rb +0 -21
  590. data/relaton.gemspec +0 -61
  591. data/spec/relaton/config_spec.rb +0 -10
  592. data/spec/relaton/db_cache_spec.rb +0 -51
  593. data/spec/relaton/db_spec.rb +0 -556
  594. data/spec/relaton/registry_spec.rb +0 -178
  595. data/spec/relaton/util_spec.rb +0 -3
  596. data/spec/relaton_spec.rb +0 -725
  597. data/spec/spec_helper.rb +0 -45
  598. data/spec/support/gb_t_20223_2006.xml +0 -33
  599. data/spec/support/iso_111111119115_1.xml +0 -0
  600. data/spec/support/iso_19115_1.xml +0 -115
  601. data/spec/support/iso_19115_2.xml +0 -95
  602. data/spec/support/rfc_8341.xml +0 -46
  603. data/spec/vcr_cassetes/3gpp_tr_00_01u_umts_3_0_0.yml +0 -12720
  604. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  605. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -143
  606. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -199
  607. data/spec/vcr_cassetes/cie_001_1980.yml +0 -401
  608. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1513
  609. data/spec/vcr_cassetes/doi_10_6028_nist_ir_8245.yml +0 -86
  610. data/spec/vcr_cassetes/ecma_6.yml +0 -112
  611. data/spec/vcr_cassetes/en_10160_1999.yml +0 -13624
  612. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -733
  613. data/spec/vcr_cassetes/ieee_528_2019.yml +0 -2786
  614. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  615. data/spec/vcr_cassetes/iso_19115_1.yml +0 -13177
  616. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -369
  617. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -13177
  618. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -229
  619. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -148
  620. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -364
  621. data/spec/vcr_cassetes/iso_combined_included.yml +0 -364
  622. data/spec/vcr_cassetes/iso_dis.yml +0 -157
  623. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -371
  624. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  625. data/spec/vcr_cassetes/rfc_8341.yml +0 -1272
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Itu
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-itu".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ require "mechanize"
2
+ require "parslet"
3
+ require "digest/md5"
4
+ require "relaton/index"
5
+ require "relaton/bib"
6
+ require "relaton/core"
7
+ require_relative "version"
8
+ require_relative "itu/util"
9
+ require_relative "itu/item_data"
10
+ require_relative "itu/model/item"
11
+ require_relative "itu/model/bibitem"
12
+ require_relative "itu/model/bibdata"
13
+ require_relative "itu/pubid"
14
+ require_relative "itu/scraper"
15
+ require_relative "itu/hit_collection"
16
+ require_relative "itu/bibliography"
17
+
18
+ module Relaton
19
+ module Itu
20
+ INDEXFILE = "index-v1"
21
+
22
+ class Error < StandardError; end
23
+
24
+ # Returns hash of XML reammar
25
+ # @return [String]
26
+ def self.grammar_hash
27
+ # gem_path = File.expand_path "..", __dir__
28
+ # grammars_path = File.join gem_path, "grammars", "*"
29
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
30
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Jis
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 Jis
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Jis
5
+ module Bibliography
6
+ extend self
7
+
8
+ #
9
+ # Search JIS by reference, returning the full candidate collection.
10
+ #
11
+ # The reference is parsed into a {Pubid::Jis::Identifier} and matched
12
+ # against the pubid-based `index-v2` via {HitCollection}. Candidates share
13
+ # the reference's series and number (a supplement is filed under its base
14
+ # number), so an edition and its amendments are returned together.
15
+ #
16
+ # @param [String] code JIS document code
17
+ # @param [String, nil] year JIS document year
18
+ #
19
+ # @return [Relaton::Jis::HitCollection, nil] search result, or nil when
20
+ # the reference cannot be parsed
21
+ #
22
+ def search(code, year = nil)
23
+ pubid = ::Pubid::Jis::Identifier.parse code
24
+ pubid.year ||= year.to_i if year
25
+ HitCollection.new pubid
26
+ rescue StandardError => e
27
+ Util.warn "Unable to parse `#{code}` with pubid: #{e.message}"
28
+ nil
29
+ end
30
+
31
+ #
32
+ # Get JIS document by reference
33
+ #
34
+ # @param [String] ref JIS document reference
35
+ # @param [String, nil] year JIS document year
36
+ # @param [Hash] opts options
37
+ # @option opts [Boolean] :all_parts return all parts of document
38
+ #
39
+ # @return [Relaton::Jis::Item, nil] JIS document
40
+ #
41
+ def get(ref, year = nil, opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
42
+ code = ref.sub(/\s\((all parts|規格群)\)/, "")
43
+ opts[:all_parts] ||= !$1.nil?
44
+ Util.info "Fetching from webdesk.jsa.or.jp ...", key: ref
45
+ hits = search(code, year)
46
+ unless hits
47
+ hint [], ref, year
48
+ return
49
+ end
50
+ result = opts[:all_parts] ? hits.find_all_parts : hits.find
51
+ if result.is_a? Bib::ItemData
52
+ Util.info "Found: `#{result.docidentifier[0].content}`", key: ref
53
+ return result
54
+ end
55
+ hint result, ref, year
56
+ end
57
+
58
+ #
59
+ # Log hint message
60
+ #
61
+ # @param [Array] result search result (missed edition years)
62
+ # @param [String] ref reference to search
63
+ # @param [String, nil] year year to search
64
+ #
65
+ def hint(result, ref, year)
66
+ Util.info "Not found.", key: ref
67
+ if result&.any?
68
+ Util.info "TIP: No match for edition year `#{year}`, but " \
69
+ "matches exist for `#{result.uniq.join('`, `')}`.", key: ref
70
+ end
71
+ nil
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../jis"
4
+ require_relative "scraper"
5
+
6
+ module Relaton
7
+ module Jis
8
+ class DataFetcher < Core::DataFetcher
9
+ URL = "https://webdesk.jsa.or.jp/books/"
10
+
11
+ def initialize(output, format)
12
+ super
13
+ @queue = SizedQueue.new 10
14
+ @threads = create_thread_pool 5
15
+ @mutex = Mutex.new
16
+ end
17
+
18
+ def log_error(msg)
19
+ Util.error msg
20
+ end
21
+
22
+ def index
23
+ @index ||= Relaton::Index.find_or_create :jis, file: "#{INDEXFILE}.yaml"
24
+ end
25
+
26
+ # Pubid-based index built in parallel with the legacy string index. The
27
+ # pool keys by type, so requesting a second :jis index with a different
28
+ # file evicts the v1 Type from the pool, but we keep our own reference in
29
+ # @index, so both stay live for the duration of the crawl.
30
+ def index_v2
31
+ @index_v2 ||= Relaton::Index.find_or_create(
32
+ :jis, file: "#{INDEXFILE_V2}.yaml", pubid_class: ::Pubid::Jis::Identifier
33
+ )
34
+ end
35
+
36
+ # Parse a primary docidentifier string into a pubid identifier; nil (with
37
+ # a warning) if pubid can't parse it, so a single bad id never aborts the
38
+ # crawl or corrupts index-v2.
39
+ def pubid(id)
40
+ ::Pubid::Jis::Identifier.parse id
41
+ rescue StandardError => e
42
+ Util.warn "Failed to parse `#{id}` with pubid: #{e.message}"
43
+ nil
44
+ end
45
+
46
+ def to_yaml(bib)
47
+ Item.to_yaml bib
48
+ end
49
+
50
+ def to_xml(bib)
51
+ Bibdata.to_xml bib
52
+ end
53
+
54
+ def to_bibxml(bib)
55
+ bib.to_rfcxml
56
+ end
57
+
58
+ def create_thread_pool(size)
59
+ Array.new(size) do
60
+ Thread.new do
61
+ until (url = @queue.shift) == :END
62
+ fetch_doc url
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ def fetch_doc(url) # rubocop:disable Metrics/MethodLength
69
+ attempts = 0
70
+ begin
71
+ bib = Scraper.new(url, @errors).fetch
72
+ rescue StandardError => e
73
+ attempts += 1
74
+ if attempts < 5
75
+ sleep 2
76
+ retry
77
+ else
78
+ Util.warn "URL: #{url}"
79
+ Util.warn "#{e.message}\n#{e.backtrace[0..6].join("\n")}"
80
+ end
81
+ else
82
+ save_doc bib, url
83
+ end
84
+ end
85
+
86
+ def fetch(_source = nil)
87
+ return unless initial_post
88
+
89
+ resp = agent.get "#{URL}W11M0070/index"
90
+ parse_page resp
91
+ index.save
92
+ index_v2.save
93
+ report_errors
94
+ end
95
+
96
+ def initial_post
97
+ return true if @initial_time && Time.now - @initial_time < 600
98
+
99
+ body = { record: 0, dantai: "JIS", searchtype2: 1,
100
+ status_1: 1, status_2: 2 } # rubocop:disable Naming/VariableNumber
101
+ resp = agent.post "#{URL}W11M0270/index", body
102
+ disp = JSON.parse resp.body
103
+ @initial_time = Time.now
104
+ disp["status"] || Util.warn("No results found for JIS")
105
+ end
106
+
107
+ def agent
108
+ @agent ||= Mechanize.new
109
+ end
110
+
111
+ def parse_page(resp)
112
+ while resp
113
+ xpath = '//div[@class="blockGenaral"]/a'
114
+ resp.xpath(xpath).each { |a| @queue << a[:href] }
115
+ offset = parse_offset resp
116
+ break if offset >= count
117
+
118
+ resp = get_next_page(offset)
119
+ end
120
+ end_threads_and_wait
121
+ end
122
+
123
+ def parse_offset(resp) # rubocop:disable Metrics/AbcSize
124
+ if resp.at('//*[@id="btnPaging"]') # first page
125
+ xpath = '//script[contains(.,"var count =")]'
126
+ @count = resp.at(xpath).text.match(/var count = (\d+);/)[1]
127
+ resp.at("//*[@id='offset']")[:value].to_i
128
+ else
129
+ script = resp.at("//script").text
130
+ script.match(/\("offset"\)\.value = '(\d+)'/)[1].to_i
131
+ end
132
+ end
133
+
134
+ def end_threads_and_wait
135
+ @threads.size.times { @queue << :END }
136
+ @queue.close
137
+ @threads.each(&:join)
138
+ end
139
+
140
+ def count
141
+ @count.to_i
142
+ end
143
+
144
+ def get_next_page(offset) # rubocop:disable Metrics/MethodLength
145
+ attempts = 0
146
+ begin
147
+ if initial_post
148
+ url = "#{URL}W11M0070/getAddList"
149
+ agent.post url, search_type: "JIS", offset: offset
150
+ end
151
+ rescue StandardError => e
152
+ attempts += 1
153
+ if attempts < 5
154
+ sleep 2
155
+ retry
156
+ else
157
+ Util.warn "#{e.message}\n#{e.backtrace[0..6].join("\n")}"
158
+ end
159
+ end
160
+ end
161
+
162
+ def save_doc(bib, url) # rubocop:disable Metrics/MethodLength
163
+ return unless bib
164
+
165
+ id = bib.docidentifier.find(&:primary).content
166
+ file = output_file id
167
+ @mutex.synchronize do
168
+ if @files.include?(file)
169
+ Util.warn "File #{file} already exists. Duplication URL: #{url}"
170
+ else
171
+ @files << file
172
+ File.write file, serialize(bib), encoding: "UTF-8"
173
+ index.add_or_update id, file
174
+ pid = pubid id
175
+ index_v2.add_or_update pid, file if pid
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Jis
5
+ class Docidentifier < Bib::Docidentifier
6
+ def remove_part!
7
+ content&.sub!(/-\d+/, "")
8
+ end
9
+
10
+ def remove_date!
11
+ content&.sub!(/:\d{4}/, "")
12
+ end
13
+
14
+ def to_all_parts!
15
+ remove_part!
16
+ remove_date!
17
+ self.content = "#{content} (all parts)" if content
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Jis
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[japanese-industrial-standard technical-report technical-specification amendment].freeze
5
+
6
+ attribute :type, :string, values: TYPES
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "doctype"
2
+ require_relative "structured_identifier"
3
+
4
+ module Relaton
5
+ module Jis
6
+ class Ext < Iso::Ext
7
+ attribute :doctype, Doctype
8
+ attribute :structuredidentifier, StructuredIdentifier
9
+
10
+ def get_schema_version = Relaton.schema_versions["relaton-model-jis"]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Jis
5
+ class Hit < Core::Hit
6
+ #
7
+ # Create new hit
8
+ #
9
+ # @param [Hash] hit found hit
10
+ # @param [Relaton::Jis::HitCollection] collection hit collection
11
+ #
12
+ # @return [Relaton::Jis::Hit] new hit
13
+ #
14
+ def self.create(hit, collection)
15
+ new hit, collection
16
+ end
17
+
18
+ #
19
+ # Check if the hit matches the collection's reference.
20
+ #
21
+ # The candidate must be the same document type (so a plain standard query
22
+ # never matches its amendments) and share series and number. Part is
23
+ # compared only when the reference names a specific part and `all_parts`
24
+ # is off. Year is filtered separately by {HitCollection}.
25
+ #
26
+ # @param [Boolean] all_parts match any part of the document
27
+ #
28
+ # @return [Boolean] true if the hit matches
29
+ #
30
+ def matches?(all_parts: false)
31
+ cand = pubid
32
+ return false unless cand && same_document?(cand)
33
+ return true if all_parts || reference_partless?
34
+
35
+ Array(cand.parts).map(&:to_s) == reference_parts
36
+ end
37
+
38
+ #
39
+ # The hit's pubid identifier. `index-v2` rows are already deserialized to
40
+ # {Pubid::Jis::Identifier} via `pubid_class`; a Hash or String id is
41
+ # converted for robustness.
42
+ #
43
+ # @return [Pubid::Jis::Identifier, nil] identifier, or nil when it cannot
44
+ # be built
45
+ #
46
+ def pubid
47
+ return @pubid if defined? @pubid
48
+
49
+ id = hit[:id]
50
+ @pubid = case id
51
+ when Hash then ::Pubid::Jis::Identifier.from_hash id
52
+ when String then ::Pubid::Jis::Identifier.parse id
53
+ else id
54
+ end
55
+ rescue StandardError
56
+ Util.warn "Unable to create an identifier from `#{hit[:id]}`"
57
+ @pubid = nil
58
+ end
59
+
60
+ # @return [Relaton::Jis::Item]
61
+ def item
62
+ @item ||= begin
63
+ url = "#{HitCollection::GH_URL}#{hit[:file]}"
64
+ resp = Net::HTTP.get_response URI(url)
65
+ item = Item.from_yaml resp.body
66
+ item.fetched = Date.today.to_s
67
+ item
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def reference
74
+ hit_collection.pubid
75
+ end
76
+
77
+ # Same document type, series and number as the reference.
78
+ def same_document?(cand)
79
+ cand.instance_of?(reference.class) &&
80
+ cand.series == reference.series &&
81
+ cand.number.to_s == reference.number.to_s
82
+ end
83
+
84
+ def reference_partless?
85
+ reference.parts.nil? || reference.parts.empty?
86
+ end
87
+
88
+ def reference_parts
89
+ Array(reference.parts).map(&:to_s)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit"
4
+
5
+ module Relaton
6
+ module Jis
7
+ class HitCollection < Core::HitCollection
8
+ GH_URL = "https://raw.githubusercontent.com/relaton/relaton-data-jis/v2/"
9
+
10
+ #
11
+ # Initialize hit collection.
12
+ #
13
+ # Searches the pubid-based `index-v2` for every entry sharing the
14
+ # reference's series and number (a supplement is filed under its base
15
+ # number, so editions and amendments come back together). Narrowing to a
16
+ # specific type/year/part happens later in {#find}.
17
+ #
18
+ # @param [Pubid::Jis::Identifier] pubid parsed reference
19
+ #
20
+ def initialize(pubid)
21
+ super(pubid, pubid.year&.to_s)
22
+ @array = index.search(pubid) { |row| same_base? row[:id] }
23
+ .map { |row| Hit.new row, self }
24
+ .sort_by { |hit| hit.pubid.to_s }
25
+ end
26
+
27
+ # @return [Pubid::Jis::Identifier] parsed reference
28
+ def pubid
29
+ ref
30
+ end
31
+
32
+ #
33
+ # Find the best hit for the reference.
34
+ #
35
+ # @return [Relaton::Bib::ItemData, Array<Integer>] the matching item, or
36
+ # the list of available edition years when none match the requested year
37
+ #
38
+ def find
39
+ if pubid.year
40
+ find_by_year pubid.year
41
+ else
42
+ find_all_years
43
+ end
44
+ end
45
+
46
+ def find_by_year(ref_year)
47
+ missed_years = []
48
+ @array.each do |hit|
49
+ next unless hit.matches?
50
+
51
+ return hit.item if hit.pubid.year.to_s == ref_year.to_s
52
+
53
+ missed_years << hit.pubid.year
54
+ end
55
+ missed_years
56
+ end
57
+
58
+ # The main item is the latest edition of the requested type; every other
59
+ # candidate sharing the series and number (older editions, amendments,
60
+ # explanations) is attached as an `instanceOf` relation.
61
+ def find_all_years
62
+ editions = @array.select(&:matches?)
63
+ return [] if editions.empty?
64
+
65
+ item = editions.max_by { |hit| hit.pubid.year.to_i }.item
66
+ attach_relations item.to_most_recent_reference,
67
+ item.docidentifier.first.content
68
+ end
69
+
70
+ # The lowest-numbered part becomes the all-parts umbrella; every candidate
71
+ # sharing the series and number is attached as an `instanceOf` relation.
72
+ def find_all_parts
73
+ parts = @array.select { |hit| hit.matches? all_parts: true }
74
+ lowest = parts.min_by { |hit| hit.pubid.parts.first.to_i }
75
+ item = lowest.item.to_all_parts
76
+ attach_relations item, item.docidentifier.first.content
77
+ end
78
+
79
+ # Attach every candidate except `skip_id` to `umbrella` as an `instanceOf`
80
+ # relation and return the umbrella.
81
+ def attach_relations(umbrella, skip_id)
82
+ @array.each do |hit|
83
+ next if hit.pubid.to_s == skip_id
84
+
85
+ umbrella.relation << create_relation(hit)
86
+ end
87
+ umbrella
88
+ end
89
+
90
+ def create_relation(hit)
91
+ id = hit.pubid.to_s
92
+ docid = Docidentifier.new content: id, type: "JIS", primary: true
93
+ bibitem = ItemData.new(
94
+ formattedref: Bib::Formattedref.new(content: id),
95
+ docidentifier: [docid],
96
+ )
97
+ Relation.new type: "instanceOf", bibitem: bibitem
98
+ end
99
+
100
+ # Index of pubid identifiers (`index-v2`), deserialized via `pubid_class`.
101
+ def index
102
+ @index ||= Relaton::Index.find_or_create(
103
+ :jis,
104
+ url: "#{GH_URL}#{INDEXFILE_V2}.zip",
105
+ file: "#{INDEXFILE_V2}.yaml",
106
+ pubid_class: ::Pubid::Jis::Identifier,
107
+ )
108
+ end
109
+
110
+ private
111
+
112
+ # Broad candidate filter: same series and number as the reference. For a
113
+ # supplement (amendment/corrigendum/explanation) the document series and
114
+ # number live on `base`, so compare against that.
115
+ def same_base?(candidate)
116
+ cand = base_of candidate
117
+ ours = base_of pubid
118
+ cand.series == ours.series && cand.number.to_s == ours.number.to_s
119
+ end
120
+
121
+ def base_of(identifier)
122
+ supplement = identifier.respond_to?(:base) && identifier.base
123
+ supplement || identifier
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+ require_relative "item_data"
4
+
5
+ module Relaton
6
+ module Jis
7
+ class Relation < Bib::Relation
8
+ end
9
+
10
+ class Item < Iso::Item
11
+ model ItemData
12
+
13
+ attribute :docidentifier, Docidentifier,
14
+ collection: true, initialize_empty: true
15
+ attribute :relation, Relation,
16
+ collection: true, initialize_empty: true
17
+ attribute :ext, Ext
18
+ end
19
+ end
20
+ end
21
+
22
+ require_relative "relation"
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "docidentifier"
4
+
5
+ module Relaton
6
+ module Jis
7
+ class ItemBase < Lutaml::Model::Serializable
8
+ include Bib::NamespaceHelper
9
+
10
+ attr_accessor :type
11
+
12
+ model ItemData
13
+
14
+ instance_exec(&Bib::ItemShared::ATTRIBUTES)
15
+ attribute :docidentifier, Docidentifier,
16
+ collection: true, initialize_empty: true
17
+ attribute :relation, Relation,
18
+ collection: true, initialize_empty: true
19
+
20
+ xml do
21
+ map_attribute "type", to: :type
22
+ instance_exec(&Bib::ItemShared::XML_BODY)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Jis
5
+ class ItemData < Bib::ItemData
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "relaton/core/processor"
4
+
5
+ module Relaton
6
+ module Jis
7
+ class Processor < Relaton::Core::Processor
8
+ attr_reader :idtype
9
+
10
+ def initialize # rubocop:disable Lint/MissingSuper
11
+ @short = :relaton_jis
12
+ @prefix = "JIS"
13
+ @defaultprefix = %r{^(JIS|TR)\s}
14
+ @idtype = "JIS"
15
+ @datasets = %w[jis-webdesk]
16
+ end
17
+
18
+ def get(code, date, opts)
19
+ require_relative "../jis"
20
+ Bibliography.get(code, date, opts)
21
+ end
22
+
23
+ def fetch_data(_source, opts)
24
+ require_relative "data_fetcher"
25
+ DataFetcher.fetch(**opts)
26
+ end
27
+
28
+ def from_xml(xml)
29
+ require_relative "../jis"
30
+ Item.from_xml xml
31
+ end
32
+
33
+ def from_yaml(yaml)
34
+ require_relative "../jis"
35
+ Item.from_yaml yaml
36
+ end
37
+
38
+ def grammar_hash
39
+ require_relative "../jis"
40
+ Digest::MD5.hexdigest Relaton::VERSION
41
+ end
42
+
43
+ def threads
44
+ 3
45
+ end
46
+
47
+ def remove_index_file
48
+ require_relative "../jis"
49
+ Relaton::Index.find_or_create(
50
+ :jis, url: true, file: "#{INDEXFILE_V2}.yaml"
51
+ ).remove_file
52
+ end
53
+ end
54
+ end
55
+ end