relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.2

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 (702) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +165 -38
  3. data/bin/console +0 -1
  4. data/lib/relaton/3gpp/bibdata.rb +9 -0
  5. data/lib/relaton/3gpp/bibitem.rb +9 -0
  6. data/lib/relaton/3gpp/bibliography.rb +123 -0
  7. data/lib/relaton/3gpp/data_fetcher.rb +303 -0
  8. data/lib/relaton/3gpp/docidentifier.rb +114 -0
  9. data/lib/relaton/3gpp/doctype.rb +9 -0
  10. data/lib/relaton/3gpp/ext.rb +31 -0
  11. data/lib/relaton/3gpp/item.rb +18 -0
  12. data/lib/relaton/3gpp/item_data.rb +15 -0
  13. data/lib/relaton/3gpp/parser.rb +400 -0
  14. data/lib/relaton/3gpp/processor.rb +71 -0
  15. data/lib/relaton/3gpp/release.rb +34 -0
  16. data/lib/relaton/3gpp/util.rb +8 -0
  17. data/lib/relaton/3gpp.rb +29 -0
  18. data/lib/relaton/adobe/bibdata.rb +8 -0
  19. data/lib/relaton/adobe/bibitem.rb +8 -0
  20. data/lib/relaton/adobe/bibliography.rb +92 -0
  21. data/lib/relaton/adobe/docidentifier.rb +49 -0
  22. data/lib/relaton/adobe/doctype.rb +14 -0
  23. data/lib/relaton/adobe/ext.rb +32 -0
  24. data/lib/relaton/adobe/item.rb +15 -0
  25. data/lib/relaton/adobe/item_base.rb +18 -0
  26. data/lib/relaton/adobe/item_data.rb +6 -0
  27. data/lib/relaton/adobe/processor.rb +45 -0
  28. data/lib/relaton/adobe/util.rb +8 -0
  29. data/lib/relaton/adobe.rb +37 -0
  30. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  31. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  32. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  33. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  34. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  35. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  36. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  37. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  38. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  39. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  40. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  41. data/lib/relaton/bib/item_data.rb +229 -0
  42. data/lib/relaton/bib/model/abstract.rb +16 -0
  43. data/lib/relaton/bib/model/address.rb +22 -0
  44. data/lib/relaton/bib/model/affiliation.rb +16 -0
  45. data/lib/relaton/bib/model/bibdata.rb +11 -0
  46. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  47. data/lib/relaton/bib/model/bibitem.rb +11 -0
  48. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  49. data/lib/relaton/bib/model/contact.rb +18 -0
  50. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  51. data/lib/relaton/bib/model/contributor.rb +29 -0
  52. data/lib/relaton/bib/model/copyright.rb +27 -0
  53. data/lib/relaton/bib/model/date.rb +31 -0
  54. data/lib/relaton/bib/model/depiction.rb +16 -0
  55. data/lib/relaton/bib/model/docidentifier.rb +49 -0
  56. data/lib/relaton/bib/model/doctype.rb +14 -0
  57. data/lib/relaton/bib/model/edition.rb +14 -0
  58. data/lib/relaton/bib/model/ext.rb +39 -0
  59. data/lib/relaton/bib/model/extent.rb +16 -0
  60. data/lib/relaton/bib/model/formattedref.rb +43 -0
  61. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  62. data/lib/relaton/bib/model/fullname.rb +11 -0
  63. data/lib/relaton/bib/model/ics.rb +49 -0
  64. data/lib/relaton/bib/model/image.rb +28 -0
  65. data/lib/relaton/bib/model/item.rb +96 -0
  66. data/lib/relaton/bib/model/item_base.rb +20 -0
  67. data/lib/relaton/bib/model/item_shared.rb +88 -0
  68. data/lib/relaton/bib/model/keyword.rb +30 -0
  69. data/lib/relaton/bib/model/locality.rb +18 -0
  70. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  71. data/lib/relaton/bib/model/localized_string.rb +48 -0
  72. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  73. data/lib/relaton/bib/model/logo.rb +14 -0
  74. data/lib/relaton/bib/model/medium.rb +22 -0
  75. data/lib/relaton/bib/model/note.rb +16 -0
  76. data/lib/relaton/bib/model/organization.rb +13 -0
  77. data/lib/relaton/bib/model/organization_type.rb +42 -0
  78. data/lib/relaton/bib/model/person.rb +36 -0
  79. data/lib/relaton/bib/model/phone.rb +14 -0
  80. data/lib/relaton/bib/model/place.rb +33 -0
  81. data/lib/relaton/bib/model/price.rb +14 -0
  82. data/lib/relaton/bib/model/relation.rb +43 -0
  83. data/lib/relaton/bib/model/series.rb +34 -0
  84. data/lib/relaton/bib/model/size.rb +23 -0
  85. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  86. data/lib/relaton/bib/model/status.rb +27 -0
  87. data/lib/relaton/bib/model/structured_identifier.rb +49 -0
  88. data/lib/relaton/bib/model/subdivision.rb +16 -0
  89. data/lib/relaton/bib/model/title.rb +56 -0
  90. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  91. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  92. data/lib/relaton/bib/model/uri.rb +18 -0
  93. data/lib/relaton/bib/model/validity.rb +16 -0
  94. data/lib/relaton/bib/model/version.rb +43 -0
  95. data/lib/relaton/bib/namespace_helper.rb +21 -0
  96. data/lib/relaton/bib/sanitizer.rb +264 -0
  97. data/lib/relaton/bib/util.rb +18 -0
  98. data/lib/relaton/bib/versions.json +35 -0
  99. data/lib/relaton/bib.rb +46 -0
  100. data/lib/relaton/bipm/bibliography.rb +231 -0
  101. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  102. data/lib/relaton/bipm/data_fetcher.rb +81 -0
  103. data/lib/relaton/bipm/data_outcomes_parser.rb +656 -0
  104. data/lib/relaton/bipm/id_parser.rb +278 -0
  105. data/lib/relaton/bipm/item_data.rb +47 -0
  106. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  107. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  108. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  109. data/lib/relaton/bipm/model/doctype.rb +12 -0
  110. data/lib/relaton/bipm/model/ext.rb +38 -0
  111. data/lib/relaton/bipm/model/item.rb +11 -0
  112. data/lib/relaton/bipm/model/structured_identifier.rb +36 -0
  113. data/lib/relaton/bipm/processor.rb +69 -0
  114. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  115. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +172 -0
  116. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  117. data/lib/relaton/bipm/si_brochure_parser.rb +188 -0
  118. data/lib/relaton/bipm/util.rb +8 -0
  119. data/lib/relaton/bipm.rb +38 -0
  120. data/lib/relaton/bsi/bibliography.rb +196 -0
  121. data/lib/relaton/bsi/hit.rb +28 -0
  122. data/lib/relaton/bsi/hit_collection.rb +113 -0
  123. data/lib/relaton/bsi/item_data.rb +13 -0
  124. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  125. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  126. data/lib/relaton/bsi/model/docidentifier.rb +107 -0
  127. data/lib/relaton/bsi/model/doctype.rb +14 -0
  128. data/lib/relaton/bsi/model/ext.rb +17 -0
  129. data/lib/relaton/bsi/model/item.rb +17 -0
  130. data/lib/relaton/bsi/model/item_base.rb +22 -0
  131. data/lib/relaton/bsi/model/relation.rb +9 -0
  132. data/lib/relaton/bsi/processor.rb +43 -0
  133. data/lib/relaton/bsi/schema.json +24882 -0
  134. data/lib/relaton/bsi/scraper.rb +288 -0
  135. data/lib/relaton/bsi/util.rb +8 -0
  136. data/lib/relaton/bsi.rb +25 -0
  137. data/lib/relaton/calconnect/bibliography.rb +93 -0
  138. data/lib/relaton/calconnect/data_fetcher.rb +174 -0
  139. data/lib/relaton/calconnect/docidentifier.rb +80 -0
  140. data/lib/relaton/calconnect/hit.rb +14 -0
  141. data/lib/relaton/calconnect/hit_collection.rb +92 -0
  142. data/lib/relaton/calconnect/item_data.rb +12 -0
  143. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  144. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  145. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  146. data/lib/relaton/calconnect/model/ext.rb +11 -0
  147. data/lib/relaton/calconnect/model/item.rb +20 -0
  148. data/lib/relaton/calconnect/processor.rb +72 -0
  149. data/lib/relaton/calconnect/scraper.rb +87 -0
  150. data/lib/relaton/calconnect/util.rb +8 -0
  151. data/lib/relaton/calconnect.rb +36 -0
  152. data/lib/relaton/ccsds/bibliography.rb +63 -0
  153. data/lib/relaton/ccsds/data/fetcher.rb +252 -0
  154. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  155. data/lib/relaton/ccsds/data/parser.rb +194 -0
  156. data/lib/relaton/ccsds/hit.rb +24 -0
  157. data/lib/relaton/ccsds/hit_collection.rb +47 -0
  158. data/lib/relaton/ccsds/item_data.rb +9 -0
  159. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  160. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  161. data/lib/relaton/ccsds/model/docidentifier.rb +121 -0
  162. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  163. data/lib/relaton/ccsds/model/ext.rb +19 -0
  164. data/lib/relaton/ccsds/model/item.rb +15 -0
  165. data/lib/relaton/ccsds/processor.rb +68 -0
  166. data/lib/relaton/ccsds/util.rb +10 -0
  167. data/lib/relaton/ccsds.rb +33 -0
  168. data/lib/relaton/cen/bibliography.rb +149 -0
  169. data/lib/relaton/cen/committees.yaml +66 -0
  170. data/lib/relaton/cen/hit.rb +31 -0
  171. data/lib/relaton/cen/hit_collection.rb +116 -0
  172. data/lib/relaton/cen/item_data.rb +7 -0
  173. data/lib/relaton/cen/model/bibdata.rb +8 -0
  174. data/lib/relaton/cen/model/bibitem.rb +8 -0
  175. data/lib/relaton/cen/model/docidentifier.rb +100 -0
  176. data/lib/relaton/cen/model/ext.rb +11 -0
  177. data/lib/relaton/cen/model/item.rb +14 -0
  178. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  179. data/lib/relaton/cen/processor.rb +45 -0
  180. data/lib/relaton/cen/scraper.rb +218 -0
  181. data/lib/relaton/cen/util.rb +8 -0
  182. data/lib/relaton/cen.rb +30 -0
  183. data/lib/relaton/cie/bibdata.rb +8 -0
  184. data/lib/relaton/cie/bibitem.rb +8 -0
  185. data/lib/relaton/cie/bibliography.rb +31 -0
  186. data/lib/relaton/cie/data_fetcher.rb +540 -0
  187. data/lib/relaton/cie/ext.rb +7 -0
  188. data/lib/relaton/cie/item.rb +11 -0
  189. data/lib/relaton/cie/item_data.rb +6 -0
  190. data/lib/relaton/cie/processor.rb +68 -0
  191. data/lib/relaton/cie/scrapper.rb +52 -0
  192. data/lib/relaton/cie/util.rb +8 -0
  193. data/lib/relaton/cie.rb +29 -0
  194. data/lib/relaton/core/array_wrapper.rb +20 -0
  195. data/lib/relaton/core/data_fetcher.rb +244 -0
  196. data/lib/relaton/core/date_parser.rb +42 -0
  197. data/lib/relaton/core/governor.rb +320 -0
  198. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  199. data/lib/relaton/core/hit.rb +49 -0
  200. data/lib/relaton/core/hit_collection.rb +118 -0
  201. data/lib/relaton/core/pacer.rb +134 -0
  202. data/lib/relaton/core/processor.rb +67 -0
  203. data/lib/relaton/core/request_error.rb +14 -0
  204. data/lib/relaton/core/workers_pool.rb +45 -0
  205. data/lib/relaton/core.rb +12 -0
  206. data/lib/relaton/db/registry.rb +44 -4
  207. data/lib/relaton/db.rb +0 -1
  208. data/lib/relaton/doi/crossref.rb +89 -0
  209. data/lib/relaton/doi/parser.rb +921 -0
  210. data/lib/relaton/doi/processor.rb +65 -0
  211. data/lib/relaton/doi/util.rb +8 -0
  212. data/lib/relaton/doi.rb +20 -0
  213. data/lib/relaton/easc/bibdata.rb +8 -0
  214. data/lib/relaton/easc/bibitem.rb +8 -0
  215. data/lib/relaton/easc/bibliography.rb +95 -0
  216. data/lib/relaton/easc/docidentifier.rb +100 -0
  217. data/lib/relaton/easc/doctype.rb +14 -0
  218. data/lib/relaton/easc/ext.rb +44 -0
  219. data/lib/relaton/easc/item.rb +13 -0
  220. data/lib/relaton/easc/item_base.rb +18 -0
  221. data/lib/relaton/easc/item_data.rb +6 -0
  222. data/lib/relaton/easc/processor.rb +46 -0
  223. data/lib/relaton/easc/util.rb +8 -0
  224. data/lib/relaton/easc.rb +35 -0
  225. data/lib/relaton/ecma/bibdata.rb +8 -0
  226. data/lib/relaton/ecma/bibitem.rb +8 -0
  227. data/lib/relaton/ecma/bibliography.rb +149 -0
  228. data/lib/relaton/ecma/data_fetcher.rb +162 -0
  229. data/lib/relaton/ecma/data_parser.rb +49 -0
  230. data/lib/relaton/ecma/docidentifier.rb +124 -0
  231. data/lib/relaton/ecma/edition_parser.rb +80 -0
  232. data/lib/relaton/ecma/ext.rb +7 -0
  233. data/lib/relaton/ecma/item.rb +13 -0
  234. data/lib/relaton/ecma/item_data.rb +6 -0
  235. data/lib/relaton/ecma/memento_parser.rb +60 -0
  236. data/lib/relaton/ecma/page_fetcher.rb +39 -0
  237. data/lib/relaton/ecma/parser_common.rb +33 -0
  238. data/lib/relaton/ecma/processor.rb +69 -0
  239. data/lib/relaton/ecma/standard_parser.rb +134 -0
  240. data/lib/relaton/ecma/util.rb +8 -0
  241. data/lib/relaton/ecma.rb +33 -0
  242. data/lib/relaton/etsi/bibdata.rb +10 -0
  243. data/lib/relaton/etsi/bibitem.rb +10 -0
  244. data/lib/relaton/etsi/bibliography.rb +111 -0
  245. data/lib/relaton/etsi/data_fetcher.rb +167 -0
  246. data/lib/relaton/etsi/data_parser.rb +208 -0
  247. data/lib/relaton/etsi/doctype.rb +30 -0
  248. data/lib/relaton/etsi/ext.rb +31 -0
  249. data/lib/relaton/etsi/item.rb +15 -0
  250. data/lib/relaton/etsi/item_data.rb +6 -0
  251. data/lib/relaton/etsi/processor.rb +71 -0
  252. data/lib/relaton/etsi/pubid.rb +37 -0
  253. data/lib/relaton/etsi/status.rb +13 -0
  254. data/lib/relaton/etsi/util.rb +8 -0
  255. data/lib/relaton/etsi.rb +26 -0
  256. data/lib/relaton/gb/bibdata.rb +8 -0
  257. data/lib/relaton/gb/bibitem.rb +8 -0
  258. data/lib/relaton/gb/bibliography.rb +171 -0
  259. data/lib/relaton/gb/ccs.rb +14 -0
  260. data/lib/relaton/gb/committee.rb +13 -0
  261. data/lib/relaton/gb/docidentifier.rb +72 -0
  262. data/lib/relaton/gb/doctype.rb +9 -0
  263. data/lib/relaton/gb/ext.rb +36 -0
  264. data/lib/relaton/gb/gb_scraper.rb +61 -0
  265. data/lib/relaton/gb/gb_type.rb +20 -0
  266. data/lib/relaton/gb/hit.rb +48 -0
  267. data/lib/relaton/gb/hit_collection.rb +19 -0
  268. data/lib/relaton/gb/item.rb +13 -0
  269. data/lib/relaton/gb/item_data.rb +6 -0
  270. data/lib/relaton/gb/processor.rb +49 -0
  271. data/lib/relaton/gb/project_number.rb +38 -0
  272. data/lib/relaton/gb/scraper.rb +221 -0
  273. data/lib/relaton/gb/sec_scraper.rb +92 -0
  274. data/lib/relaton/gb/stage_name.rb +13 -0
  275. data/lib/relaton/gb/structured_identifier.rb +26 -0
  276. data/lib/relaton/gb/t_scraper.rb +126 -0
  277. data/lib/relaton/gb/util.rb +8 -0
  278. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  279. data/lib/relaton/gb.rb +33 -0
  280. data/lib/relaton/gost/bibdata.rb +8 -0
  281. data/lib/relaton/gost/bibitem.rb +8 -0
  282. data/lib/relaton/gost/bibliography.rb +107 -0
  283. data/lib/relaton/gost/docidentifier.rb +80 -0
  284. data/lib/relaton/gost/doctype.rb +16 -0
  285. data/lib/relaton/gost/ext.rb +46 -0
  286. data/lib/relaton/gost/item.rb +15 -0
  287. data/lib/relaton/gost/item_base.rb +18 -0
  288. data/lib/relaton/gost/item_data.rb +6 -0
  289. data/lib/relaton/gost/processor.rb +49 -0
  290. data/lib/relaton/gost/util.rb +8 -0
  291. data/lib/relaton/gost.rb +36 -0
  292. data/lib/relaton/iala/bibdata.rb +8 -0
  293. data/lib/relaton/iala/bibitem.rb +8 -0
  294. data/lib/relaton/iala/bibliography.rb +146 -0
  295. data/lib/relaton/iala/docidentifier.rb +89 -0
  296. data/lib/relaton/iala/doctype.rb +18 -0
  297. data/lib/relaton/iala/ext.rb +32 -0
  298. data/lib/relaton/iala/item.rb +21 -0
  299. data/lib/relaton/iala/item_base.rb +18 -0
  300. data/lib/relaton/iala/item_data.rb +6 -0
  301. data/lib/relaton/iala/processor.rb +43 -0
  302. data/lib/relaton/iala/relation.rb +7 -0
  303. data/lib/relaton/iala/util.rb +8 -0
  304. data/lib/relaton/iala.rb +35 -0
  305. data/lib/relaton/iana/bibdata.rb +8 -0
  306. data/lib/relaton/iana/bibitem.rb +8 -0
  307. data/lib/relaton/iana/bibliography.rb +100 -0
  308. data/lib/relaton/iana/data_fetcher.rb +101 -0
  309. data/lib/relaton/iana/item.rb +7 -0
  310. data/lib/relaton/iana/item_data.rb +6 -0
  311. data/lib/relaton/iana/parser.rb +146 -0
  312. data/lib/relaton/iana/processor.rb +70 -0
  313. data/lib/relaton/iana/util.rb +8 -0
  314. data/lib/relaton/iana.rb +40 -0
  315. data/lib/relaton/iec/bibliography.rb +283 -0
  316. data/lib/relaton/iec/data_fetcher.rb +222 -0
  317. data/lib/relaton/iec/data_parser.rb +391 -0
  318. data/lib/relaton/iec/hit.rb +26 -0
  319. data/lib/relaton/iec/hit_collection.rb +138 -0
  320. data/lib/relaton/iec/item_data.rb +7 -0
  321. data/lib/relaton/iec/model/bibdata.rb +8 -0
  322. data/lib/relaton/iec/model/bibitem.rb +8 -0
  323. data/lib/relaton/iec/model/docidentifier.rb +135 -0
  324. data/lib/relaton/iec/model/doctype.rb +12 -0
  325. data/lib/relaton/iec/model/ext.rb +53 -0
  326. data/lib/relaton/iec/model/item.rb +20 -0
  327. data/lib/relaton/iec/model/item_base.rb +12 -0
  328. data/lib/relaton/iec/model/relation.rb +7 -0
  329. data/lib/relaton/iec/model/stage_name.rb +13 -0
  330. data/lib/relaton/iec/processor.rb +74 -0
  331. data/lib/relaton/iec/statuses.yml +199 -0
  332. data/lib/relaton/iec/util.rb +8 -0
  333. data/lib/relaton/iec.rb +98 -0
  334. data/lib/relaton/ieee/balloting_group.rb +13 -0
  335. data/lib/relaton/ieee/bibdata.rb +8 -0
  336. data/lib/relaton/ieee/bibitem.rb +8 -0
  337. data/lib/relaton/ieee/bibliography.rb +73 -0
  338. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  339. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  340. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  341. data/lib/relaton/ieee/data_fetcher.rb +771 -0
  342. data/lib/relaton/ieee/doctype.rb +9 -0
  343. data/lib/relaton/ieee/editorial_group.rb +19 -0
  344. data/lib/relaton/ieee/ext.rb +36 -0
  345. data/lib/relaton/ieee/idams_parser.rb +330 -0
  346. data/lib/relaton/ieee/item.rb +11 -0
  347. data/lib/relaton/ieee/item_data.rb +7 -0
  348. data/lib/relaton/ieee/processor.rb +71 -0
  349. data/lib/relaton/ieee/rawbib_id_parser.rb +753 -0
  350. data/lib/relaton/ieee/util.rb +8 -0
  351. data/lib/relaton/ieee.rb +30 -0
  352. data/lib/relaton/ietf/bibdata.rb +8 -0
  353. data/lib/relaton/ietf/bibitem.rb +8 -0
  354. data/lib/relaton/ietf/bibliography.rb +35 -0
  355. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  356. data/lib/relaton/ietf/data_fetcher.rb +561 -0
  357. data/lib/relaton/ietf/doctype.rb +9 -0
  358. data/lib/relaton/ietf/ext.rb +63 -0
  359. data/lib/relaton/ietf/item.rb +16 -0
  360. data/lib/relaton/ietf/item_base.rb +18 -0
  361. data/lib/relaton/ietf/item_data.rb +6 -0
  362. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  363. data/lib/relaton/ietf/processor.rb +72 -0
  364. data/lib/relaton/ietf/relation.rb +9 -0
  365. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  366. data/lib/relaton/ietf/rfc/author.rb +21 -0
  367. data/lib/relaton/ietf/rfc/entry.rb +446 -0
  368. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  369. data/lib/relaton/ietf/rfc/format.rb +19 -0
  370. data/lib/relaton/ietf/rfc/index.rb +46 -0
  371. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  372. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  373. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  374. data/lib/relaton/ietf/scraper.rb +101 -0
  375. data/lib/relaton/ietf/util.rb +8 -0
  376. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  377. data/lib/relaton/ietf.rb +30 -0
  378. data/lib/relaton/iho/bibdata.rb +8 -0
  379. data/lib/relaton/iho/bibitem.rb +8 -0
  380. data/lib/relaton/iho/bibliography.rb +114 -0
  381. data/lib/relaton/iho/comment_period.rb +13 -0
  382. data/lib/relaton/iho/docidentifier.rb +31 -0
  383. data/lib/relaton/iho/doctype.rb +10 -0
  384. data/lib/relaton/iho/ext.rb +20 -0
  385. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  386. data/lib/relaton/iho/item.rb +20 -0
  387. data/lib/relaton/iho/item_base.rb +18 -0
  388. data/lib/relaton/iho/item_data.rb +6 -0
  389. data/lib/relaton/iho/processor.rb +54 -0
  390. data/lib/relaton/iho/relation.rb +9 -0
  391. data/lib/relaton/iho/structured_identifier.rb +20 -0
  392. data/lib/relaton/iho/util.rb +8 -0
  393. data/lib/relaton/iho.rb +27 -0
  394. data/lib/relaton/index/config.rb +52 -0
  395. data/lib/relaton/index/file_io.rb +305 -0
  396. data/lib/relaton/index/file_storage.rb +66 -0
  397. data/lib/relaton/index/pool.rb +46 -0
  398. data/lib/relaton/index/shard_source.rb +201 -0
  399. data/lib/relaton/index/type.rb +210 -0
  400. data/lib/relaton/index/util.rb +18 -0
  401. data/lib/relaton/index.rb +61 -0
  402. data/lib/relaton/isbn/isbn.rb +61 -0
  403. data/lib/relaton/isbn/open_library.rb +43 -0
  404. data/lib/relaton/isbn/parser.rb +88 -0
  405. data/lib/relaton/isbn/processor.rb +48 -0
  406. data/lib/relaton/isbn/util.rb +8 -0
  407. data/lib/relaton/isbn.rb +19 -0
  408. data/lib/relaton/iso/bibliography.rb +412 -0
  409. data/lib/relaton/iso/data_fetcher.rb +338 -0
  410. data/lib/relaton/iso/data_parser.rb +458 -0
  411. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  412. data/lib/relaton/iso/hit.rb +57 -0
  413. data/lib/relaton/iso/hit_collection.rb +196 -0
  414. data/lib/relaton/iso/item_data.rb +50 -0
  415. data/lib/relaton/iso/model/bibdata.rb +10 -0
  416. data/lib/relaton/iso/model/bibitem.rb +8 -0
  417. data/lib/relaton/iso/model/contributor.rb +6 -0
  418. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  419. data/lib/relaton/iso/model/docidentifier.rb +146 -0
  420. data/lib/relaton/iso/model/doctype.rb +13 -0
  421. data/lib/relaton/iso/model/ext.rb +35 -0
  422. data/lib/relaton/iso/model/item.rb +17 -0
  423. data/lib/relaton/iso/model/item_base.rb +22 -0
  424. data/lib/relaton/iso/model/organization.rb +9 -0
  425. data/lib/relaton/iso/model/project_number.rb +22 -0
  426. data/lib/relaton/iso/model/relation.rb +9 -0
  427. data/lib/relaton/iso/model/stagename.rb +14 -0
  428. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  429. data/lib/relaton/iso/processor.rb +85 -0
  430. data/lib/relaton/iso/scraper.rb +635 -0
  431. data/lib/relaton/iso/type/pubid.rb +50 -0
  432. data/lib/relaton/iso/util.rb +8 -0
  433. data/lib/relaton/iso.rb +30 -0
  434. data/lib/relaton/itu/bibliography.rb +95 -0
  435. data/lib/relaton/itu/data_crawler_r.rb +664 -0
  436. data/lib/relaton/itu/data_fetcher.rb +550 -0
  437. data/lib/relaton/itu/data_merge_r.rb +149 -0
  438. data/lib/relaton/itu/data_parser_r.rb +214 -0
  439. data/lib/relaton/itu/data_parser_t.rb +228 -0
  440. data/lib/relaton/itu/family_cache.rb +177 -0
  441. data/lib/relaton/itu/governor.rb +56 -0
  442. data/lib/relaton/itu/hit.rb +28 -0
  443. data/lib/relaton/itu/hit_collection.rb +299 -0
  444. data/lib/relaton/itu/item_data.rb +6 -0
  445. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  446. data/lib/relaton/itu/model/bibdata.rb +8 -0
  447. data/lib/relaton/itu/model/bibitem.rb +8 -0
  448. data/lib/relaton/itu/model/docidentifier.rb +75 -0
  449. data/lib/relaton/itu/model/doctype.rb +13 -0
  450. data/lib/relaton/itu/model/ext.rb +47 -0
  451. data/lib/relaton/itu/model/item.rb +13 -0
  452. data/lib/relaton/itu/model/meeting.rb +13 -0
  453. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  454. data/lib/relaton/itu/model/question.rb +13 -0
  455. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  456. data/lib/relaton/itu/model/structured_identifier.rb +38 -0
  457. data/lib/relaton/itu/processor.rb +72 -0
  458. data/lib/relaton/itu/pubid.rb +199 -0
  459. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  460. data/lib/relaton/itu/recommendation_fields.rb +334 -0
  461. data/lib/relaton/itu/recommendation_parser.rb +30 -0
  462. data/lib/relaton/itu/scraper.rb +203 -0
  463. data/lib/relaton/itu/util.rb +8 -0
  464. data/lib/relaton/itu.rb +34 -0
  465. data/lib/relaton/jcgm/bibdata.rb +8 -0
  466. data/lib/relaton/jcgm/bibitem.rb +8 -0
  467. data/lib/relaton/jcgm/bibliography.rb +97 -0
  468. data/lib/relaton/jcgm/data_fetcher.rb +81 -0
  469. data/lib/relaton/jcgm/docidentifier.rb +102 -0
  470. data/lib/relaton/jcgm/doctype.rb +12 -0
  471. data/lib/relaton/jcgm/ext.rb +23 -0
  472. data/lib/relaton/jcgm/item.rb +20 -0
  473. data/lib/relaton/jcgm/item_base.rb +18 -0
  474. data/lib/relaton/jcgm/item_data.rb +6 -0
  475. data/lib/relaton/jcgm/meetings_parser.rb +175 -0
  476. data/lib/relaton/jcgm/processor.rb +71 -0
  477. data/lib/relaton/jcgm/relation.rb +9 -0
  478. data/lib/relaton/jcgm/structured_identifier.rb +40 -0
  479. data/lib/relaton/jcgm/util.rb +8 -0
  480. data/lib/relaton/jcgm.rb +24 -0
  481. data/lib/relaton/jis/bibdata.rb +8 -0
  482. data/lib/relaton/jis/bibitem.rb +8 -0
  483. data/lib/relaton/jis/bibliography.rb +73 -0
  484. data/lib/relaton/jis/data_fetcher.rb +183 -0
  485. data/lib/relaton/jis/docidentifier.rb +120 -0
  486. data/lib/relaton/jis/doctype.rb +9 -0
  487. data/lib/relaton/jis/ext.rb +13 -0
  488. data/lib/relaton/jis/hit.rb +88 -0
  489. data/lib/relaton/jis/hit_collection.rb +128 -0
  490. data/lib/relaton/jis/item.rb +22 -0
  491. data/lib/relaton/jis/item_base.rb +26 -0
  492. data/lib/relaton/jis/item_data.rb +8 -0
  493. data/lib/relaton/jis/processor.rb +55 -0
  494. data/lib/relaton/jis/relation.rb +11 -0
  495. data/lib/relaton/jis/scraper.rb +232 -0
  496. data/lib/relaton/jis/structured_identifier.rb +13 -0
  497. data/lib/relaton/jis/util.rb +8 -0
  498. data/lib/relaton/jis.rb +32 -0
  499. data/lib/relaton/logger/channels/gh_issue.rb +143 -0
  500. data/lib/relaton/logger/config.rb +34 -0
  501. data/lib/relaton/logger/formatter_json.rb +8 -0
  502. data/lib/relaton/logger/formatter_string.rb +12 -0
  503. data/lib/relaton/logger/log.rb +64 -0
  504. data/lib/relaton/logger/log_device.rb +27 -0
  505. data/lib/relaton/logger/pool.rb +24 -0
  506. data/lib/relaton/logger.rb +18 -0
  507. data/lib/relaton/nist/bibdata.rb +8 -0
  508. data/lib/relaton/nist/bibitem.rb +8 -0
  509. data/lib/relaton/nist/bibliography.rb +191 -0
  510. data/lib/relaton/nist/comment_period.rb +15 -0
  511. data/lib/relaton/nist/data_fetcher.rb +134 -0
  512. data/lib/relaton/nist/date.rb +7 -0
  513. data/lib/relaton/nist/docidentifier.rb +165 -0
  514. data/lib/relaton/nist/doctype.rb +7 -0
  515. data/lib/relaton/nist/ext.rb +16 -0
  516. data/lib/relaton/nist/hit.rb +18 -0
  517. data/lib/relaton/nist/hit_collection.rb +362 -0
  518. data/lib/relaton/nist/item.rb +19 -0
  519. data/lib/relaton/nist/item_base.rb +16 -0
  520. data/lib/relaton/nist/item_data.rb +6 -0
  521. data/lib/relaton/nist/mods_parser.rb +302 -0
  522. data/lib/relaton/nist/processor.rb +69 -0
  523. data/lib/relaton/nist/pubs_export.rb +69 -0
  524. data/lib/relaton/nist/relation.rb +10 -0
  525. data/lib/relaton/nist/scraper.rb +293 -0
  526. data/lib/relaton/nist/series.yaml +49 -0
  527. data/lib/relaton/nist/util.rb +8 -0
  528. data/lib/relaton/nist.rb +34 -0
  529. data/lib/relaton/oasis/bibdata.rb +8 -0
  530. data/lib/relaton/oasis/bibitem.rb +8 -0
  531. data/lib/relaton/oasis/bibliography.rb +201 -0
  532. data/lib/relaton/oasis/browser_agent.rb +71 -0
  533. data/lib/relaton/oasis/data_fetcher.rb +130 -0
  534. data/lib/relaton/oasis/data_parser.rb +305 -0
  535. data/lib/relaton/oasis/data_parser_utils.rb +330 -0
  536. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  537. data/lib/relaton/oasis/docidentifier.rb +54 -0
  538. data/lib/relaton/oasis/doctype.rb +7 -0
  539. data/lib/relaton/oasis/ext.rb +19 -0
  540. data/lib/relaton/oasis/item.rb +14 -0
  541. data/lib/relaton/oasis/item_data.rb +6 -0
  542. data/lib/relaton/oasis/processor.rb +74 -0
  543. data/lib/relaton/oasis/util.rb +8 -0
  544. data/lib/relaton/oasis.rb +41 -0
  545. data/lib/relaton/ogc/bibdata.rb +8 -0
  546. data/lib/relaton/ogc/bibitem.rb +8 -0
  547. data/lib/relaton/ogc/bibliography.rb +64 -0
  548. data/lib/relaton/ogc/data_fetcher.rb +131 -0
  549. data/lib/relaton/ogc/docidentifier.rb +111 -0
  550. data/lib/relaton/ogc/doctype.rb +12 -0
  551. data/lib/relaton/ogc/ext.rb +15 -0
  552. data/lib/relaton/ogc/hit.rb +18 -0
  553. data/lib/relaton/ogc/hit_collection.rb +111 -0
  554. data/lib/relaton/ogc/item.rb +13 -0
  555. data/lib/relaton/ogc/item_data.rb +6 -0
  556. data/lib/relaton/ogc/processor.rb +59 -0
  557. data/lib/relaton/ogc/scraper.rb +225 -0
  558. data/lib/relaton/ogc/util.rb +8 -0
  559. data/lib/relaton/ogc.rb +30 -0
  560. data/lib/relaton/oiml/bibdata.rb +8 -0
  561. data/lib/relaton/oiml/bibitem.rb +8 -0
  562. data/lib/relaton/oiml/bibliography.rb +169 -0
  563. data/lib/relaton/oiml/docidentifier.rb +48 -0
  564. data/lib/relaton/oiml/doctype.rb +13 -0
  565. data/lib/relaton/oiml/ext.rb +42 -0
  566. data/lib/relaton/oiml/item.rb +20 -0
  567. data/lib/relaton/oiml/item_base.rb +18 -0
  568. data/lib/relaton/oiml/item_data.rb +6 -0
  569. data/lib/relaton/oiml/processor.rb +54 -0
  570. data/lib/relaton/oiml/relation.rb +9 -0
  571. data/lib/relaton/oiml/util.rb +8 -0
  572. data/lib/relaton/oiml.rb +24 -0
  573. data/lib/relaton/omg/bibdata.rb +8 -0
  574. data/lib/relaton/omg/bibitem.rb +8 -0
  575. data/lib/relaton/omg/bibliography.rb +31 -0
  576. data/lib/relaton/omg/docidentifier.rb +67 -0
  577. data/lib/relaton/omg/ext.rb +7 -0
  578. data/lib/relaton/omg/item.rb +9 -0
  579. data/lib/relaton/omg/item_data.rb +6 -0
  580. data/lib/relaton/omg/processor.rb +35 -0
  581. data/lib/relaton/omg/scraper.rb +186 -0
  582. data/lib/relaton/omg/util.rb +8 -0
  583. data/lib/relaton/omg.rb +25 -0
  584. data/lib/relaton/plateau/bibdata.rb +8 -0
  585. data/lib/relaton/plateau/bibitem.rb +8 -0
  586. data/lib/relaton/plateau/bibliography.rb +31 -0
  587. data/lib/relaton/plateau/data_fetcher.rb +176 -0
  588. data/lib/relaton/plateau/doctype.rb +7 -0
  589. data/lib/relaton/plateau/ext.rb +23 -0
  590. data/lib/relaton/plateau/handbook_parser.rb +102 -0
  591. data/lib/relaton/plateau/hit.rb +21 -0
  592. data/lib/relaton/plateau/hit_collection.rb +79 -0
  593. data/lib/relaton/plateau/item.rb +12 -0
  594. data/lib/relaton/plateau/item_data.rb +6 -0
  595. data/lib/relaton/plateau/parser.rb +101 -0
  596. data/lib/relaton/plateau/processor.rb +51 -0
  597. data/lib/relaton/plateau/technical_report_parser.rb +98 -0
  598. data/lib/relaton/plateau/util.rb +8 -0
  599. data/lib/relaton/plateau.rb +29 -0
  600. data/lib/relaton/sdo/config.rb +34 -0
  601. data/lib/relaton/sdo/fetcher.rb +52 -0
  602. data/lib/relaton/sdo/logo.rb +95 -0
  603. data/lib/relaton/sdo/name.rb +26 -0
  604. data/lib/relaton/sdo/organization.rb +71 -0
  605. data/lib/relaton/sdo/store.rb +49 -0
  606. data/lib/relaton/sdo.rb +29 -0
  607. data/lib/relaton/un/bibdata.rb +8 -0
  608. data/lib/relaton/un/bibitem.rb +8 -0
  609. data/lib/relaton/un/bibliography.rb +48 -0
  610. data/lib/relaton/un/doctype.rb +10 -0
  611. data/lib/relaton/un/ext.rb +30 -0
  612. data/lib/relaton/un/hit.rb +56 -0
  613. data/lib/relaton/un/hit_collection.rb +61 -0
  614. data/lib/relaton/un/item.rb +11 -0
  615. data/lib/relaton/un/item_data.rb +6 -0
  616. data/lib/relaton/un/parser.rb +108 -0
  617. data/lib/relaton/un/processor.rb +38 -0
  618. data/lib/relaton/un/session.rb +25 -0
  619. data/lib/relaton/un/token_generator.rb +105 -0
  620. data/lib/relaton/un/util.rb +8 -0
  621. data/lib/relaton/un/wasm/decoder.rb +434 -0
  622. data/lib/relaton/un/wasm/instance.rb +101 -0
  623. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  624. data/lib/relaton/un/wasm/memory.rb +112 -0
  625. data/lib/relaton/un/wasm/module.rb +47 -0
  626. data/lib/relaton/un/wasm.rb +17 -0
  627. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  628. data/lib/relaton/un.rb +28 -0
  629. data/lib/relaton/version.rb +1 -1
  630. data/lib/relaton/w3c/bibdata.rb +8 -0
  631. data/lib/relaton/w3c/bibitem.rb +8 -0
  632. data/lib/relaton/w3c/bibliography.rb +174 -0
  633. data/lib/relaton/w3c/data_fetcher.rb +487 -0
  634. data/lib/relaton/w3c/data_parser.rb +379 -0
  635. data/lib/relaton/w3c/docidentifier.rb +48 -0
  636. data/lib/relaton/w3c/doctype.rb +7 -0
  637. data/lib/relaton/w3c/ext.rb +11 -0
  638. data/lib/relaton/w3c/governor.rb +32 -0
  639. data/lib/relaton/w3c/item.rb +15 -0
  640. data/lib/relaton/w3c/item_data.rb +6 -0
  641. data/lib/relaton/w3c/processor.rb +49 -0
  642. data/lib/relaton/w3c/pubid.rb +85 -0
  643. data/lib/relaton/w3c/safe_realize.rb +148 -0
  644. data/lib/relaton/w3c/util.rb +8 -0
  645. data/lib/relaton/w3c.rb +36 -0
  646. data/lib/relaton/xsf/bibdata.rb +8 -0
  647. data/lib/relaton/xsf/bibitem.rb +8 -0
  648. data/lib/relaton/xsf/bibliography.rb +84 -0
  649. data/lib/relaton/xsf/data_fetcher.rb +106 -0
  650. data/lib/relaton/xsf/docidentifier.rb +46 -0
  651. data/lib/relaton/xsf/hit.rb +17 -0
  652. data/lib/relaton/xsf/hit_collection.rb +52 -0
  653. data/lib/relaton/xsf/item.rb +13 -0
  654. data/lib/relaton/xsf/item_data.rb +6 -0
  655. data/lib/relaton/xsf/processor.rb +51 -0
  656. data/lib/relaton/xsf/util.rb +9 -0
  657. data/lib/relaton/xsf.rb +34 -0
  658. data/lib/relaton-core.rb +1 -0
  659. data/lib/relaton.rb +85 -0
  660. metadata +775 -161
  661. data/.github/workflows/rake.yml +0 -14
  662. data/.github/workflows/release.yml +0 -24
  663. data/.github/workflows/rubocop.yml +0 -48
  664. data/.gitignore +0 -12
  665. data/.rspec +0 -3
  666. data/CLAUDE.md +0 -78
  667. data/Gemfile +0 -29
  668. data/Rakefile +0 -6
  669. data/docs/CHANGELOG.adoc +0 -16
  670. data/docs/VERSIONING_POLICY.adoc +0 -38
  671. data/docs/navigation.adoc +0 -6
  672. data/lib/relaton/db/version.rb +0 -5
  673. data/relaton.gemspec +0 -72
  674. data/spec/relaton/config_spec.rb +0 -10
  675. data/spec/relaton/db_cache_spec.rb +0 -51
  676. data/spec/relaton/db_spec.rb +0 -567
  677. data/spec/relaton/registry_spec.rb +0 -178
  678. data/spec/relaton/util_spec.rb +0 -3
  679. data/spec/relaton_meta_spec.rb +0 -25
  680. data/spec/relaton_spec.rb +0 -800
  681. data/spec/spec_helper.rb +0 -45
  682. data/spec/support/gb_t_20223_2006.xml +0 -33
  683. data/spec/support/iso_111111119115_1.xml +0 -0
  684. data/spec/support/iso_19115_1.xml +0 -115
  685. data/spec/support/iso_19115_2.xml +0 -95
  686. data/spec/support/rfc_8341.xml +0 -46
  687. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  688. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  689. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  690. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  691. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  692. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  693. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  694. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  695. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  696. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  697. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  698. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  699. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  700. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  701. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  702. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,330 @@
1
+ require "mechanize"
2
+ require_relative "browser_agent"
3
+
4
+ module Relaton
5
+ module Oasis
6
+ # Common methods for document and part parsers.
7
+ module DataParserUtils
8
+ RETRIABLE_PAGE_ERRORS = [
9
+ Errno::ETIMEDOUT,
10
+ Net::OpenTimeout,
11
+ Ferrum::TimeoutError,
12
+ Ferrum::PendingConnectionsError,
13
+ Ferrum::StatusError,
14
+ ].freeze
15
+ #
16
+ # Parse contributor.
17
+ #
18
+ # @return [Array<Bib::Contributor>] contributors
19
+ #
20
+ def parse_contributor
21
+ result = publisher_oasis + parse_authorizer +
22
+ parse_editorialgroup_contributor +
23
+ parse_chairs + parse_editors
24
+ @errors[:contributor] &&= result.empty?
25
+ result
26
+ end
27
+
28
+ def publisher_oasis
29
+ org = Bib::Organization.new(
30
+ name: [Bib::TypedLocalizedString.new(content: "OASIS")],
31
+ uri: [Bib::Uri.new(type: "uri", content: "https://www.oasis-open.org/")],
32
+ )
33
+ role = [
34
+ Bib::Contributor::Role.new(
35
+ type: "authorizer",
36
+ description: [Bib::LocalizedMarkedUpString.new(
37
+ content: "Standards Development Organization",
38
+ )],
39
+ ),
40
+ Bib::Contributor::Role.new(type: "publisher"),
41
+ ]
42
+ [Bib::Contributor.new(organization: org, role: role)]
43
+ end
44
+
45
+ def parse_editors_from_text # rubocop:disable Metrics/MethodLength
46
+ result = if text
47
+ text.match(/(?<=Edited\sby\s)[^.]+/).to_s
48
+ .split(/,?\sand\s|,\s/).map do |c|
49
+ role = [Bib::Contributor::Role.new(type: "editor")]
50
+ Bib::Contributor.new(role: role,
51
+ person: create_person(c))
52
+ end
53
+ else
54
+ []
55
+ end
56
+ @errors[:editors] &&= result.empty?
57
+ result
58
+ end
59
+
60
+ def page
61
+ return @page if defined? @page
62
+
63
+ @page = nil
64
+ return @page unless link_node && link_node[:href].match?(/\.html$/)
65
+
66
+ if @agent
67
+ doc = retry_page(link_node[:href], @agent)
68
+ @page = doc if doc && @agent.last_status == 200
69
+ else
70
+ # No injected agent (e.g. unit tests with VCR cassettes): fall back
71
+ # to a Mechanize request — VCR can intercept it.
72
+ agent = Mechanize.new
73
+ agent.agent.allowed_error_codes = [403, 404, 503]
74
+ resp = retry_page(link_node[:href], agent)
75
+ @page = resp if resp && resp.code == "200"
76
+ end
77
+ end
78
+
79
+ #
80
+ # Retry to get page.
81
+ #
82
+ # @param [String] url page URL
83
+ # @param [#get] agent HTTP client responding to #get(url)
84
+ # @param [Integer] retries number of retries
85
+ #
86
+ # @return [Nokogiri::HTML::Document, Mechanize::Page, nil] page or nil
87
+ #
88
+ def retry_page(url, agent, retries = 3)
89
+ sleep 1 # to avoid 429 error
90
+ agent.get url
91
+ rescue *RETRIABLE_PAGE_ERRORS => e
92
+ retry if (retries -= 1).positive?
93
+ Util.error "Failed to get page `#{url}`\n#{e.message}"
94
+ nil
95
+ end
96
+
97
+ def parse_chairs # rubocop:disable Metrics/MethodLength
98
+ result = if page
99
+ xpath = "//p[preceding-sibling::p" \
100
+ "[starts-with(., 'Chair')]]" \
101
+ "[following-sibling::p" \
102
+ "[starts-with(., 'Editor')]]"
103
+ page.xpath(xpath).map do |p|
104
+ create_contribution_info(p, "editor", ["Chair"])
105
+ end.compact
106
+ else
107
+ []
108
+ end
109
+ @errors[:chairs] &&= result.empty?
110
+ result
111
+ end
112
+
113
+ def parse_editors # rubocop:disable Metrics/MethodLength
114
+ result = if page
115
+ xpath = "//p[contains(@class, 'Contributor')]" \
116
+ "[preceding-sibling::p" \
117
+ "[starts-with(., 'Editor')]]" \
118
+ "[following-sibling::p" \
119
+ "[contains(@class, 'Title')]]"
120
+ page.xpath(xpath).map do |p|
121
+ create_contribution_info(p, "editor")
122
+ end.compact
123
+ else
124
+ parse_editors_from_text
125
+ end
126
+ @errors[:editors] &&= result.empty?
127
+ result
128
+ end
129
+
130
+ def create_contribution_info(person_node, type, description = [])
131
+ name = person_node.text.match(/^[^(]+/).to_s.strip
132
+ return nil if name.empty? || !name.match?(/\A\p{L}/) ||
133
+ name.match?(%r{\A(?:https?://|urn:)})
134
+
135
+ email, org = person_node.xpath ".//a[@href]"
136
+ entity = create_person name, email, org
137
+ desc = description.map { |d| Bib::LocalizedMarkedUpString.new(content: d) }
138
+ role = Bib::Contributor::Role.new(type: type, description: desc)
139
+ Bib::Contributor.new(role: [role], person: entity)
140
+ end
141
+
142
+ def create_person(name, email = nil, org = nil)
143
+ forename, surname = name.split
144
+ fn = Bib::FullNameType::Forename.new(content: forename, language: "en",
145
+ script: "Latn")
146
+ sn = Bib::LocalizedString.new(content: surname, language: "en",
147
+ script: "Latn")
148
+ fullname = Bib::FullName.new(surname: sn, forename: [fn])
149
+ Bib::Person.new(name: fullname, email: person_email(email),
150
+ affiliation: person_affiliation(org))
151
+ end
152
+
153
+ def person_email(email)
154
+ return [] unless email
155
+
156
+ href = email[:href]
157
+ if href.start_with?("mailto:")
158
+ [href.split(":")[1]]
159
+ elsif (cf_email = email.at(".//span[@data-cfemail]"))
160
+ decoded = decode_cf_email(cf_email["data-cfemail"])
161
+ return [] if decoded.empty?
162
+
163
+ # Cloudflare obfuscates ASCII email characters in the data-cfemail
164
+ # span but leaves non-ASCII characters (e.g. the Latin "fl" ligature
165
+ # U+FB02) as plain text outside the span. Concatenate any sibling
166
+ # text and NFKC-normalize so ligatures become their ASCII equivalent.
167
+ prefix = cf_email.xpath("./preceding-sibling::node()").map(&:text).join
168
+ suffix = cf_email.xpath("./following-sibling::node()").map(&:text).join
169
+ [(prefix + decoded + suffix).unicode_normalize(:nfkc)]
170
+ else
171
+ []
172
+ end
173
+ end
174
+
175
+ def decode_cf_email(encoded)
176
+ bytes = [encoded].pack("H*").bytes
177
+ key = bytes.first
178
+ bytes[1..].map { |b| (b ^ key).chr }.join
179
+ end
180
+
181
+ def person_affiliation(org)
182
+ return [] unless org
183
+
184
+ org_name = org.text.gsub(/[\r\n]+/, " ")
185
+ organization = Bib::Organization.new(
186
+ name: [Bib::TypedLocalizedString.new(content: org_name)],
187
+ uri: [Bib::Uri.new(type: "uri", content: org[:href])],
188
+ )
189
+ [Bib::Affiliation.new(organization: organization)]
190
+ end
191
+
192
+ #
193
+ # Parse document identifier specification.
194
+ #
195
+ # @param [String] num document number
196
+ #
197
+ # @return [String] document identifier with specification if needed
198
+ #
199
+ def parse_spec(num)
200
+ case text
201
+ when /OASIS Project Specification (\d+)/ then "#{num}-PS#{$1}"
202
+ when /Committee Specification (\d+)/ then "#{num}-CS#{$1}"
203
+ else num
204
+ end
205
+ end
206
+
207
+ #
208
+ # Parse document identifier part.
209
+ #
210
+ # @param [String] docid document identifier
211
+ #
212
+ # @return [String] document identifier with part if needed
213
+ #
214
+ def parse_part(docid)
215
+ return docid if docid.match?(/(?:Part|Pt)\d+/i)
216
+
217
+ case title
218
+ when /Part\s(\d+)/ then "#{docid}-Pt#{$1}"
219
+ else docid
220
+ end
221
+ end
222
+
223
+ #
224
+ # Parse document identifier errata.
225
+ #
226
+ # @param [String] id document identifier
227
+ #
228
+ # @return [String] document identifier with errata if needed
229
+ #
230
+ def parse_errata(id)
231
+ return id.sub("errata", "Errata") if id.match?(/errata\d+/i)
232
+
233
+ case title
234
+ when /Plus\sErrata\s(\d+)/ then "#{id}-plus-Errata#{$1}"
235
+ when /Errata\s(\d+)/ then "#{id}-Errata#{$1}"
236
+ else id
237
+ end
238
+ end
239
+
240
+ #
241
+ # Parse document identifier.
242
+ #
243
+ # @return [Array<Relaton::Oasis::Docidentifier>] document identifier
244
+ #
245
+ def parse_docid
246
+ id = "OASIS #{parse_docnumber}"
247
+ docid = Docidentifier.new(type: "OASIS", content: id, primary: true)
248
+ record_unparseable_id docid
249
+ result = [docid]
250
+ @errors[:docid] &&= result.empty?
251
+ result
252
+ end
253
+
254
+ #
255
+ # Surface an id pubid could not parse through the shared error-reporting
256
+ # machinery, so the crawl's "Error fetching documents" GitHub issue names
257
+ # it instead of dropping it silently in the action log.
258
+ #
259
+ # `Core::DataFetcher#report_errors` logs a **String** value verbatim as
260
+ # the message (a boolean means "this field failed for every record" and
261
+ # takes its message from the key), and the parsers share the fetcher's own
262
+ # `@errors` hash, so an entry written here reaches the issue unchanged.
263
+ #
264
+ # **Why here and not only in the fetcher.** W3C, 3GPP and ISO record this
265
+ # at index time, where the output file is known. OASIS records it at build
266
+ # time as well, because this is the one place EVERY id is built — the part
267
+ # ids that only ever become a relation's `formattedref`
268
+ # (`DataParser#parse_relation`, `DataPartParser#parse_relation`) never
269
+ # reach `DataFetcher#save_doc`, so an index-time hook alone cannot see
270
+ # them. `DataFetcher#add_to_index` keys its own entry on the same id
271
+ # string, so a document that IS saved reports once, through the fetcher's
272
+ # message, which additionally names the file.
273
+ #
274
+ # The docidentifier is returned either way: the document is still written,
275
+ # it is only left out of the index — `Relaton::Index` rejects the WHOLE
276
+ # index if a single row fails to deserialize.
277
+ #
278
+ # @param docid [Relaton::Oasis::Docidentifier] the id just built
279
+ #
280
+ def record_unparseable_id(docid)
281
+ return if docid.pubid
282
+
283
+ content = docid.content.to_s
284
+ @errors[content] = "Unparseable primary id `#{content}` was not indexed"
285
+ end
286
+
287
+ #
288
+ # Parse document type.
289
+ #
290
+ # @return [Doctype] document type
291
+ #
292
+ def parse_doctype
293
+ type = case text
294
+ when /OASIS Project Specification/, /Committee Specification/
295
+ "specification"
296
+ when /Technical Memorandum/ then "memorandum"
297
+ when /Technical Resolution/ then "resolution"
298
+ else "standard"
299
+ end
300
+ result = Doctype.new(content: type)
301
+ @errors[:doctype] &&= result.nil?
302
+ result
303
+ end
304
+
305
+ #
306
+ # Parse technology area.
307
+ #
308
+ # @return [Array<String>] technology areas
309
+ #
310
+ def parse_technology_area(node)
311
+ xpath = "./summary/div/div" \
312
+ "/ul[@class='technology-areas__list']/li/a"
313
+ result = node.xpath(xpath).map do |ta|
314
+ ta.text.strip.gsub(/\s/, "-")
315
+ .sub("development", "Development")
316
+ end
317
+ @errors[:technology_area] &&= result.empty?
318
+ result
319
+ end
320
+
321
+ def create_ext
322
+ Ext.new(
323
+ doctype: parse_doctype,
324
+ flavor: "oasis",
325
+ technology_area: parse_technology_area,
326
+ )
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,239 @@
1
+ module Relaton
2
+ module Oasis
3
+ # Parser for OASIS part document.
4
+ class DataPartParser
5
+ include DataParserUtils
6
+
7
+ #
8
+ # Initialize parser.
9
+ #
10
+ # @param [Nokogiri::HTML::Element] node document node
11
+ #
12
+ def initialize(node, errors = {}, agent: nil)
13
+ @node = node
14
+ @errors = errors
15
+ @agent = agent
16
+ end
17
+
18
+ def text
19
+ return @text if @text
20
+
21
+ sibling_xpath = "./strong/following-sibling::text()" \
22
+ "|./span[strong]/following-sibling::text()"
23
+ if @node.at(sibling_xpath)
24
+ nodes_xpath = "./strong/following-sibling::node()" \
25
+ "|./span[strong]/following-sibling::node()"
26
+ @text = @node.xpath(nodes_xpath).text.strip
27
+ else
28
+ @text = @node.xpath("./following-sibling::p[1][em]").text.strip
29
+ end
30
+ end
31
+
32
+ def title
33
+ return @title if @title
34
+
35
+ xpath = "./span[@class='citationTitle' " \
36
+ "or @class='citeTitle']|./em|./i"
37
+ t = @node.at(xpath)
38
+ @title = if t
39
+ t.text
40
+ else
41
+ m = text.match(/(?<content>.+)\s(?:Edited|\d{2}\s\w+\d{4})/)
42
+ m ? m[:content] : text
43
+ end.strip
44
+ end
45
+
46
+ #
47
+ # Parse document.
48
+ #
49
+ # @return [ItemData] bibliographic item data
50
+ #
51
+ def parse # rubocop:disable Metrics/MethodLength
52
+ ItemData.new(
53
+ type: "standard",
54
+ title: parse_title,
55
+ docidentifier: parse_docid,
56
+ source: parse_link,
57
+ docnumber: parse_docnumber,
58
+ date: parse_date,
59
+ abstract: parse_abstract,
60
+ language: ["en"],
61
+ script: ["Latn"],
62
+ relation: parse_relation,
63
+ contributor: parse_contributor,
64
+ ext: create_ext,
65
+ )
66
+ end
67
+
68
+ #
69
+ # Parse title.
70
+ #
71
+ # @return [Array<Bib::Title>] title
72
+ #
73
+ def parse_title
74
+ result = [Bib::Title.new(type: "main", content: title,
75
+ language: "en", script: "Latn")]
76
+ @errors[:part_title] &&= result.empty?
77
+ result
78
+ end
79
+
80
+ #
81
+ # Parse document number.
82
+ #
83
+ # @return [String] document number
84
+ #
85
+ def parse_docnumber
86
+ ref = @node.at("./span/strong|./strong|./b/span")
87
+ num = ref.text.match(/[^\[\]]+/).to_s
88
+ id = parse_errata(num)
89
+ # some part refs need "Pt" to distinguish from root doc
90
+ id += "-Pt" if %w[CMIS-v1.1 DocBook-5.0 XACML-V3.0 mqtt-v3.1.1
91
+ OData-JSON-Format-v4.0].include?(id)
92
+ result = parse_part parse_spec id
93
+ @errors[:part_docnumber] &&= result.nil?
94
+ result
95
+ end
96
+
97
+ #
98
+ # Parse link.
99
+ #
100
+ # @return [Array<Bib::Uri>] link
101
+ #
102
+ def parse_link
103
+ result = [Bib::Uri.new(type: "src", content: link_node[:href])]
104
+ @errors[:part_link] &&= result.empty?
105
+ result
106
+ end
107
+
108
+ #
109
+ # Parse date.
110
+ #
111
+ # @return [Array<Bib::Date>] bibliographic dates
112
+ #
113
+ def parse_date
114
+ match = text.match(/(?<on>\d{1,2}\s\w+\s\d{4})/)
115
+ result = match ? [Bib::Date.new(at: Date.parse(match[:on]).to_s, type: "issued")] : []
116
+ @errors[:part_date] &&= result.empty?
117
+ result
118
+ end
119
+
120
+ def parse_abstract # rubocop:disable Metrics/MethodLength
121
+ result = if page
122
+ xpath = "//p[preceding-sibling::p" \
123
+ "[starts-with(., 'Abstract')]][1]"
124
+ page.xpath(xpath).map do |p|
125
+ cnt = p.text.gsub(/[\r\n]+/, " ").strip
126
+ Bib::Abstract.new(
127
+ content: cnt, language: "en", script: "Latn",
128
+ )
129
+ end
130
+ else
131
+ []
132
+ end
133
+ @errors[:part_abstract] &&= result.empty?
134
+ result
135
+ end
136
+
137
+ #
138
+ # Parse editorial group as contributors.
139
+ #
140
+ # @return [Array<Bib::Contributor>] editorial group contributors
141
+ #
142
+ def parse_editorialgroup_contributor # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
143
+ result = if page
144
+ xpath = "//p[preceding-sibling::p" \
145
+ "[starts-with(., 'Technical')]][1]//a"
146
+ tcs = page.xpath(xpath)
147
+ if tcs.empty?
148
+ []
149
+ else
150
+ subdivisions = tcs.map do |a|
151
+ name = [Bib::TypedLocalizedString.new(
152
+ content: a.text.strip,
153
+ )]
154
+ Bib::Subdivision.new(
155
+ type: "technical-committee", name: name,
156
+ )
157
+ end
158
+ org = Bib::Organization.new(
159
+ name: [Bib::TypedLocalizedString.new(
160
+ content: "OASIS",
161
+ )],
162
+ subdivision: subdivisions,
163
+ )
164
+ desc = [Bib::LocalizedMarkedUpString.new(
165
+ content: "committee",
166
+ )]
167
+ role = Bib::Contributor::Role.new(
168
+ type: "author", description: desc,
169
+ )
170
+ [Bib::Contributor.new(organization: org,
171
+ role: [role])]
172
+ end
173
+ else
174
+ []
175
+ end
176
+ @errors[:part_editorialgroup_contributor] &&= result.empty?
177
+ result
178
+ end
179
+
180
+ #
181
+ # Parse relation.
182
+ #
183
+ # @return [Array<Bib::Relation>] document relations
184
+ #
185
+ def parse_relation
186
+ parser = DataParser.new(@node.at("./ancestor::details"), @errors, agent: @agent)
187
+ fref = parser.parse_docid[0].content
188
+ bib = ItemData.new(formattedref: Bib::Formattedref.new(content: fref))
189
+ result = [Bib::Relation.new(type: "partOf", bibitem: bib)]
190
+ @errors[:part_relation] &&= result.empty?
191
+ result
192
+ end
193
+
194
+ def parse_authorizer # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
195
+ result = if page
196
+ xpath = "//p[preceding-sibling::p" \
197
+ "[starts-with(., 'Technical')]][1]//a"
198
+ page.xpath(xpath).map do |a|
199
+ org_name = a.text.gsub(/[\r\n]+/, " ").strip
200
+ org = Bib::Organization.new(
201
+ name: [Bib::TypedLocalizedString.new(
202
+ content: org_name,
203
+ )],
204
+ uri: [Bib::Uri.new(type: "uri",
205
+ content: a[:href])],
206
+ )
207
+ desc = [Bib::LocalizedMarkedUpString.new(
208
+ content: "Committee",
209
+ )]
210
+ role = Bib::Contributor::Role.new(
211
+ type: "authorizer", description: desc,
212
+ )
213
+ Bib::Contributor.new(organization: org,
214
+ role: [role])
215
+ end
216
+ else
217
+ []
218
+ end
219
+ @errors[:part_authorizer] &&= result.empty?
220
+ result
221
+ end
222
+
223
+ def link_node
224
+ @link_node = @node.at("./a|./following-sibling::p[1]/a")
225
+ end
226
+
227
+ #
228
+ # Parse technology area.
229
+ #
230
+ # @return [Array<String>] technology areas
231
+ #
232
+ def parse_technology_area
233
+ result = super(@node.at("./ancestor::details"))
234
+ @errors[:part_technology_area] &&= result.empty?
235
+ result
236
+ end
237
+ end
238
+ end
239
+ end
@@ -0,0 +1,54 @@
1
+ module Relaton
2
+ module Oasis
3
+ # Structured OASIS document identifier. The docid string is the printed
4
+ # form, which carries the "OASIS " publisher token
5
+ # (e.g. "OASIS OSLC-CoreShapes-3.0-PS01-Pt8"), and it is parsed into a
6
+ # `Pubid::Oasis::Identifier` kept in `@pubid` while the lutaml `content`
7
+ # attribute stays a plain string for serialization.
8
+ #
9
+ # Parsing is **soft**: `content=` lazily requires pubid and rescues
10
+ # `LoadError`/`StandardError`, so a missing pubid gem or non-OASIS content
11
+ # leaves `@pubid` nil rather than raising. A reference without the publisher
12
+ # token ("amqp-core") is not an OASIS printed id, so it leaves `@pubid` nil
13
+ # too; `DataFetcher` always builds the token-carrying form.
14
+ #
15
+ # ## Why the three mutators stay no-ops
16
+ #
17
+ # `Pubid::Oasis::Renderer` echoes the verbatim slug held in `original`, so
18
+ # clearing `part`, `version` or `stage` cannot change the printed id — the
19
+ # mutation would be invisible, and rewriting `original` would invent a
20
+ # reference form OASIS does not publish. OASIS slugs are free-form with an
21
+ # inconsistent internal structure, and no OASIS citation drops a part or a
22
+ # version; there is no "all parts" or "most recent" spelling to render.
23
+ #
24
+ # So this class deliberately does NOT override `remove_part!`,
25
+ # `remove_date!` or `to_all_parts!`. Since `dfbd26c72` the `Bib::Docidentifier`
26
+ # defaults are no-ops rather than `NotImplementedError` raises, so
27
+ # `Bib::ItemData#to_all_parts` and `#to_most_recent_reference` return the
28
+ # item unchanged instead of blowing up. That is the honest OASIS answer.
29
+ # (Contrast `Relaton::Ogc::Docidentifier`, whose components really do
30
+ # render, so its mutators re-render the content.)
31
+ class Docidentifier < Bib::Docidentifier
32
+ attr_reader :pubid
33
+
34
+ def initialize(attrs = {}, options = {})
35
+ pubid = attrs.is_a?(Hash) ? attrs.delete(:pubid) : nil
36
+ attrs[:content] ||= pubid.to_s if pubid
37
+ super
38
+ @pubid = pubid if pubid
39
+ end
40
+
41
+ def content=(value)
42
+ super
43
+ return unless value
44
+
45
+ @pubid = begin
46
+ require "pubid"
47
+ ::Pubid::Oasis::Identifier.parse(value.to_s)
48
+ rescue LoadError, StandardError
49
+ nil
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ module Relaton
2
+ module Oasis
3
+ class Doctype < Bib::Doctype
4
+ attribute :content, :string, values: %w[specification memorandum resolution standard]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ require_relative "doctype"
2
+
3
+ module Relaton
4
+ module Oasis
5
+ class Ext < Bib::Ext
6
+ attribute :doctype, Doctype
7
+ attribute :technology_area, :string, collection: true, values: %w[
8
+ Cloud Content-Technologies Cybersecurity e-Business eGov/Legal Emergency-Management
9
+ Energy Information-Modeling IoT Lifecycle-Integration Localization Messaging
10
+ Privacy/Identity Security SOA Web-Services Software-Development Virtualization
11
+ ]
12
+
13
+ xml { map_element "technology-area", to: :technology_area }
14
+ key_value { map "technology_area", to: :technology_area }
15
+
16
+ def get_schema_version = Relaton.schema_versions["relaton-model-oasis"]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+
4
+ module Relaton
5
+ module Oasis
6
+ class Item < Bib::Item
7
+ model ItemData
8
+
9
+ attribute :docidentifier, Docidentifier, collection: true,
10
+ initialize_empty: true
11
+ attribute :ext, Ext
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Oasis
3
+ class ItemData < Bib::ItemData
4
+ end
5
+ end
6
+ end