relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{docs/README.adoc → README.adoc} +109 -38
- data/lib/relaton/3gpp/bibdata.rb +9 -0
- data/lib/relaton/3gpp/bibitem.rb +9 -0
- data/lib/relaton/3gpp/bibliography.rb +48 -0
- data/lib/relaton/3gpp/data_fetcher.rb +255 -0
- data/lib/relaton/3gpp/doctype.rb +9 -0
- data/lib/relaton/3gpp/ext.rb +31 -0
- data/lib/relaton/3gpp/item.rb +12 -0
- data/lib/relaton/3gpp/item_data.rb +15 -0
- data/lib/relaton/3gpp/parser.rb +400 -0
- data/lib/relaton/3gpp/processor.rb +68 -0
- data/lib/relaton/3gpp/release.rb +34 -0
- data/lib/relaton/3gpp/util.rb +8 -0
- data/lib/relaton/3gpp.rb +25 -0
- data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
- data/lib/relaton/bib/converter/asciibib.rb +13 -0
- data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
- data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
- data/lib/relaton/bib/converter/bibtex.rb +23 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
- data/lib/relaton/bib/converter/bibxml.rb +51 -0
- data/lib/relaton/bib/hash_parser_v1.rb +767 -0
- data/lib/relaton/bib/item_data.rb +229 -0
- data/lib/relaton/bib/model/abstract.rb +16 -0
- data/lib/relaton/bib/model/address.rb +22 -0
- data/lib/relaton/bib/model/affiliation.rb +16 -0
- data/lib/relaton/bib/model/bibdata.rb +11 -0
- data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
- data/lib/relaton/bib/model/bibitem.rb +11 -0
- data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
- data/lib/relaton/bib/model/contact.rb +18 -0
- data/lib/relaton/bib/model/contribution_info.rb +15 -0
- data/lib/relaton/bib/model/contributor.rb +29 -0
- data/lib/relaton/bib/model/copyright.rb +27 -0
- data/lib/relaton/bib/model/date.rb +31 -0
- data/lib/relaton/bib/model/depiction.rb +16 -0
- data/lib/relaton/bib/model/docidentifier.rb +34 -0
- data/lib/relaton/bib/model/doctype.rb +14 -0
- data/lib/relaton/bib/model/edition.rb +14 -0
- data/lib/relaton/bib/model/ext.rb +39 -0
- data/lib/relaton/bib/model/extent.rb +16 -0
- data/lib/relaton/bib/model/formattedref.rb +43 -0
- data/lib/relaton/bib/model/full_name_type.rb +64 -0
- data/lib/relaton/bib/model/fullname.rb +11 -0
- data/lib/relaton/bib/model/ics.rb +49 -0
- data/lib/relaton/bib/model/image.rb +28 -0
- data/lib/relaton/bib/model/item.rb +96 -0
- data/lib/relaton/bib/model/item_base.rb +20 -0
- data/lib/relaton/bib/model/item_shared.rb +88 -0
- data/lib/relaton/bib/model/keyword.rb +30 -0
- data/lib/relaton/bib/model/locality.rb +18 -0
- data/lib/relaton/bib/model/locality_stack.rb +14 -0
- data/lib/relaton/bib/model/localized_string.rb +48 -0
- data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
- data/lib/relaton/bib/model/logo.rb +14 -0
- data/lib/relaton/bib/model/medium.rb +22 -0
- data/lib/relaton/bib/model/note.rb +16 -0
- data/lib/relaton/bib/model/organization.rb +13 -0
- data/lib/relaton/bib/model/organization_type.rb +42 -0
- data/lib/relaton/bib/model/person.rb +36 -0
- data/lib/relaton/bib/model/phone.rb +14 -0
- data/lib/relaton/bib/model/place.rb +33 -0
- data/lib/relaton/bib/model/price.rb +14 -0
- data/lib/relaton/bib/model/relation.rb +43 -0
- data/lib/relaton/bib/model/series.rb +34 -0
- data/lib/relaton/bib/model/size.rb +23 -0
- data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
- data/lib/relaton/bib/model/status.rb +27 -0
- data/lib/relaton/bib/model/structured_identifier.rb +48 -0
- data/lib/relaton/bib/model/subdivision.rb +16 -0
- data/lib/relaton/bib/model/title.rb +56 -0
- data/lib/relaton/bib/model/type/plain_date.rb +16 -0
- data/lib/relaton/bib/model/type/string_date.rb +48 -0
- data/lib/relaton/bib/model/uri.rb +18 -0
- data/lib/relaton/bib/model/validity.rb +16 -0
- data/lib/relaton/bib/model/version.rb +43 -0
- data/lib/relaton/bib/namespace_helper.rb +21 -0
- data/lib/relaton/bib/sanitizer.rb +68 -0
- data/lib/relaton/bib/util.rb +18 -0
- data/lib/relaton/bib/versions.json +35 -0
- data/lib/relaton/bib.rb +48 -0
- data/lib/relaton/bipm/bibliography.rb +82 -0
- data/lib/relaton/bipm/converter/asciibib.rb +64 -0
- data/lib/relaton/bipm/data_fetcher.rb +57 -0
- data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
- data/lib/relaton/bipm/id_parser.rb +277 -0
- data/lib/relaton/bipm/item_data.rb +47 -0
- data/lib/relaton/bipm/model/bibdata.rb +9 -0
- data/lib/relaton/bipm/model/bibitem.rb +9 -0
- data/lib/relaton/bipm/model/comment_period.rb +13 -0
- data/lib/relaton/bipm/model/doctype.rb +12 -0
- data/lib/relaton/bipm/model/ext.rb +38 -0
- data/lib/relaton/bipm/model/item.rb +11 -0
- data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
- data/lib/relaton/bipm/processor.rb +69 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
- data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
- data/lib/relaton/bipm/util.rb +8 -0
- data/lib/relaton/bipm.rb +32 -0
- data/lib/relaton/bsi/bibliography.rb +124 -0
- data/lib/relaton/bsi/hit.rb +14 -0
- data/lib/relaton/bsi/hit_collection.rb +114 -0
- data/lib/relaton/bsi/item_data.rb +13 -0
- data/lib/relaton/bsi/model/bibdata.rb +8 -0
- data/lib/relaton/bsi/model/bibitem.rb +8 -0
- data/lib/relaton/bsi/model/docidentifier.rb +9 -0
- data/lib/relaton/bsi/model/doctype.rb +14 -0
- data/lib/relaton/bsi/model/ext.rb +17 -0
- data/lib/relaton/bsi/model/item.rb +17 -0
- data/lib/relaton/bsi/model/item_base.rb +22 -0
- data/lib/relaton/bsi/model/relation.rb +9 -0
- data/lib/relaton/bsi/processor.rb +42 -0
- data/lib/relaton/bsi/schema.json +24882 -0
- data/lib/relaton/bsi/scraper.rb +288 -0
- data/lib/relaton/bsi/util.rb +8 -0
- data/lib/relaton/bsi.rb +25 -0
- data/lib/relaton/calconnect/bibliography.rb +95 -0
- data/lib/relaton/calconnect/data_fetcher.rb +106 -0
- data/lib/relaton/calconnect/hit.rb +14 -0
- data/lib/relaton/calconnect/hit_collection.rb +84 -0
- data/lib/relaton/calconnect/item_data.rb +12 -0
- data/lib/relaton/calconnect/model/bibdata.rb +8 -0
- data/lib/relaton/calconnect/model/bibitem.rb +8 -0
- data/lib/relaton/calconnect/model/doctype.rb +11 -0
- data/lib/relaton/calconnect/model/ext.rb +11 -0
- data/lib/relaton/calconnect/model/item.rb +13 -0
- data/lib/relaton/calconnect/processor.rb +66 -0
- data/lib/relaton/calconnect/scraper.rb +87 -0
- data/lib/relaton/calconnect/util.rb +8 -0
- data/lib/relaton/calconnect.rb +26 -0
- data/lib/relaton/ccsds/bibliography.rb +63 -0
- data/lib/relaton/ccsds/data/fetcher.rb +247 -0
- data/lib/relaton/ccsds/data/iso_references.rb +30 -0
- data/lib/relaton/ccsds/data/parser.rb +194 -0
- data/lib/relaton/ccsds/hit.rb +24 -0
- data/lib/relaton/ccsds/hit_collection.rb +42 -0
- data/lib/relaton/ccsds/item_data.rb +9 -0
- data/lib/relaton/ccsds/model/bibdata.rb +8 -0
- data/lib/relaton/ccsds/model/bibitem.rb +8 -0
- data/lib/relaton/ccsds/model/doctype.rb +9 -0
- data/lib/relaton/ccsds/model/ext.rb +19 -0
- data/lib/relaton/ccsds/model/item.rb +13 -0
- data/lib/relaton/ccsds/processor.rb +68 -0
- data/lib/relaton/ccsds/util.rb +10 -0
- data/lib/relaton/ccsds.rb +33 -0
- data/lib/relaton/cen/bibliography.rb +121 -0
- data/lib/relaton/cen/committees.yaml +66 -0
- data/lib/relaton/cen/hit.rb +16 -0
- data/lib/relaton/cen/hit_collection.rb +68 -0
- data/lib/relaton/cen/item_data.rb +7 -0
- data/lib/relaton/cen/model/bibdata.rb +8 -0
- data/lib/relaton/cen/model/bibitem.rb +8 -0
- data/lib/relaton/cen/model/docidentifier.rb +9 -0
- data/lib/relaton/cen/model/ext.rb +11 -0
- data/lib/relaton/cen/model/item.rb +14 -0
- data/lib/relaton/cen/model/structured_identifier.rb +9 -0
- data/lib/relaton/cen/processor.rb +40 -0
- data/lib/relaton/cen/scraper.rb +210 -0
- data/lib/relaton/cen/util.rb +8 -0
- data/lib/relaton/cen.rb +29 -0
- data/lib/relaton/cie/bibdata.rb +8 -0
- data/lib/relaton/cie/bibitem.rb +8 -0
- data/lib/relaton/cie/bibliography.rb +31 -0
- data/lib/relaton/cie/data_fetcher.rb +355 -0
- data/lib/relaton/cie/ext.rb +7 -0
- data/lib/relaton/cie/item.rb +11 -0
- data/lib/relaton/cie/item_data.rb +6 -0
- data/lib/relaton/cie/processor.rb +66 -0
- data/lib/relaton/cie/scrapper.rb +39 -0
- data/lib/relaton/cie/util.rb +8 -0
- data/lib/relaton/cie.rb +28 -0
- data/lib/relaton/core/array_wrapper.rb +20 -0
- data/lib/relaton/core/data_fetcher.rb +97 -0
- data/lib/relaton/core/date_parser.rb +42 -0
- data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
- data/lib/relaton/core/hit.rb +49 -0
- data/lib/relaton/core/hit_collection.rb +118 -0
- data/lib/relaton/core/processor.rb +48 -0
- data/lib/relaton/core/workers_pool.rb +45 -0
- data/lib/relaton/core.rb +9 -0
- data/lib/relaton/db/registry.rb +4 -4
- data/lib/relaton/db.rb +0 -1
- data/lib/relaton/doi/crossref.rb +72 -0
- data/lib/relaton/doi/parser.rb +827 -0
- data/lib/relaton/doi/processor.rb +65 -0
- data/lib/relaton/doi/util.rb +8 -0
- data/lib/relaton/doi.rb +20 -0
- data/lib/relaton/ecma/bibdata.rb +8 -0
- data/lib/relaton/ecma/bibitem.rb +8 -0
- data/lib/relaton/ecma/bibliography.rb +81 -0
- data/lib/relaton/ecma/data_fetcher.rb +103 -0
- data/lib/relaton/ecma/data_parser.rb +49 -0
- data/lib/relaton/ecma/edition_parser.rb +80 -0
- data/lib/relaton/ecma/ext.rb +7 -0
- data/lib/relaton/ecma/item.rb +11 -0
- data/lib/relaton/ecma/item_data.rb +6 -0
- data/lib/relaton/ecma/memento_parser.rb +60 -0
- data/lib/relaton/ecma/page_fetcher.rb +27 -0
- data/lib/relaton/ecma/parser_common.rb +33 -0
- data/lib/relaton/ecma/processor.rb +66 -0
- data/lib/relaton/ecma/standard_parser.rb +134 -0
- data/lib/relaton/ecma/util.rb +8 -0
- data/lib/relaton/ecma.rb +24 -0
- data/lib/relaton/etsi/bibdata.rb +10 -0
- data/lib/relaton/etsi/bibitem.rb +10 -0
- data/lib/relaton/etsi/bibliography.rb +46 -0
- data/lib/relaton/etsi/data_fetcher.rb +128 -0
- data/lib/relaton/etsi/data_parser.rb +208 -0
- data/lib/relaton/etsi/doctype.rb +30 -0
- data/lib/relaton/etsi/ext.rb +31 -0
- data/lib/relaton/etsi/item.rb +15 -0
- data/lib/relaton/etsi/item_data.rb +6 -0
- data/lib/relaton/etsi/processor.rb +69 -0
- data/lib/relaton/etsi/pubid.rb +37 -0
- data/lib/relaton/etsi/status.rb +13 -0
- data/lib/relaton/etsi/util.rb +8 -0
- data/lib/relaton/etsi.rb +25 -0
- data/lib/relaton/gb/bibdata.rb +8 -0
- data/lib/relaton/gb/bibitem.rb +8 -0
- data/lib/relaton/gb/bibliography.rb +145 -0
- data/lib/relaton/gb/ccs.rb +14 -0
- data/lib/relaton/gb/committee.rb +13 -0
- data/lib/relaton/gb/docidentifier.rb +23 -0
- data/lib/relaton/gb/doctype.rb +9 -0
- data/lib/relaton/gb/ext.rb +36 -0
- data/lib/relaton/gb/gb_scraper.rb +61 -0
- data/lib/relaton/gb/gb_type.rb +20 -0
- data/lib/relaton/gb/hit.rb +48 -0
- data/lib/relaton/gb/hit_collection.rb +19 -0
- data/lib/relaton/gb/item.rb +13 -0
- data/lib/relaton/gb/item_data.rb +6 -0
- data/lib/relaton/gb/processor.rb +46 -0
- data/lib/relaton/gb/project_number.rb +38 -0
- data/lib/relaton/gb/scraper.rb +204 -0
- data/lib/relaton/gb/sec_scraper.rb +92 -0
- data/lib/relaton/gb/stage_name.rb +13 -0
- data/lib/relaton/gb/structured_identifier.rb +26 -0
- data/lib/relaton/gb/t_scraper.rb +126 -0
- data/lib/relaton/gb/util.rb +8 -0
- data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
- data/lib/relaton/gb.rb +33 -0
- data/lib/relaton/iana/bibdata.rb +8 -0
- data/lib/relaton/iana/bibitem.rb +8 -0
- data/lib/relaton/iana/bibliography.rb +47 -0
- data/lib/relaton/iana/data_fetcher.rb +71 -0
- data/lib/relaton/iana/item.rb +7 -0
- data/lib/relaton/iana/item_data.rb +6 -0
- data/lib/relaton/iana/parser.rb +146 -0
- data/lib/relaton/iana/processor.rb +68 -0
- data/lib/relaton/iana/util.rb +8 -0
- data/lib/relaton/iana.rb +29 -0
- data/lib/relaton/iec/bibliography.rb +283 -0
- data/lib/relaton/iec/data_fetcher.rb +216 -0
- data/lib/relaton/iec/data_parser.rb +391 -0
- data/lib/relaton/iec/hit.rb +26 -0
- data/lib/relaton/iec/hit_collection.rb +138 -0
- data/lib/relaton/iec/item_data.rb +7 -0
- data/lib/relaton/iec/model/bibdata.rb +8 -0
- data/lib/relaton/iec/model/bibitem.rb +8 -0
- data/lib/relaton/iec/model/docidentifier.rb +131 -0
- data/lib/relaton/iec/model/doctype.rb +12 -0
- data/lib/relaton/iec/model/ext.rb +53 -0
- data/lib/relaton/iec/model/item.rb +20 -0
- data/lib/relaton/iec/model/item_base.rb +12 -0
- data/lib/relaton/iec/model/relation.rb +7 -0
- data/lib/relaton/iec/model/stage_name.rb +13 -0
- data/lib/relaton/iec/processor.rb +73 -0
- data/lib/relaton/iec/statuses.yml +199 -0
- data/lib/relaton/iec/util.rb +8 -0
- data/lib/relaton/iec.rb +98 -0
- data/lib/relaton/ieee/balloting_group.rb +13 -0
- data/lib/relaton/ieee/bibdata.rb +8 -0
- data/lib/relaton/ieee/bibitem.rb +8 -0
- data/lib/relaton/ieee/bibliography.rb +51 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml.rb +20 -0
- data/lib/relaton/ieee/data_fetcher.rb +630 -0
- data/lib/relaton/ieee/doctype.rb +9 -0
- data/lib/relaton/ieee/editorial_group.rb +19 -0
- data/lib/relaton/ieee/ext.rb +36 -0
- data/lib/relaton/ieee/idams_parser.rb +323 -0
- data/lib/relaton/ieee/item.rb +11 -0
- data/lib/relaton/ieee/item_data.rb +7 -0
- data/lib/relaton/ieee/processor.rb +68 -0
- data/lib/relaton/ieee/pub_id.rb +161 -0
- data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
- data/lib/relaton/ieee/util.rb +8 -0
- data/lib/relaton/ieee.rb +29 -0
- data/lib/relaton/ietf/bibdata.rb +8 -0
- data/lib/relaton/ietf/bibitem.rb +8 -0
- data/lib/relaton/ietf/bibliography.rb +35 -0
- data/lib/relaton/ietf/bibxml_parser.rb +232 -0
- data/lib/relaton/ietf/data_fetcher.rb +278 -0
- data/lib/relaton/ietf/doctype.rb +9 -0
- data/lib/relaton/ietf/ext.rb +63 -0
- data/lib/relaton/ietf/item.rb +16 -0
- data/lib/relaton/ietf/item_base.rb +18 -0
- data/lib/relaton/ietf/item_data.rb +6 -0
- data/lib/relaton/ietf/processing_instructions.rb +79 -0
- data/lib/relaton/ietf/processor.rb +68 -0
- data/lib/relaton/ietf/relation.rb +9 -0
- data/lib/relaton/ietf/rfc/abstract.rb +19 -0
- data/lib/relaton/ietf/rfc/author.rb +21 -0
- data/lib/relaton/ietf/rfc/entry.rb +410 -0
- data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
- data/lib/relaton/ietf/rfc/format.rb +19 -0
- data/lib/relaton/ietf/rfc/index.rb +46 -0
- data/lib/relaton/ietf/rfc/is_also.rb +21 -0
- data/lib/relaton/ietf/rfc/keywords.rb +19 -0
- data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
- data/lib/relaton/ietf/scraper.rb +68 -0
- data/lib/relaton/ietf/util.rb +8 -0
- data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
- data/lib/relaton/ietf.rb +27 -0
- data/lib/relaton/iho/bibdata.rb +8 -0
- data/lib/relaton/iho/bibitem.rb +8 -0
- data/lib/relaton/iho/bibliography.rb +114 -0
- data/lib/relaton/iho/comment_period.rb +13 -0
- data/lib/relaton/iho/docidentifier.rb +31 -0
- data/lib/relaton/iho/doctype.rb +10 -0
- data/lib/relaton/iho/ext.rb +20 -0
- data/lib/relaton/iho/hash_parser_v1.rb +144 -0
- data/lib/relaton/iho/item.rb +20 -0
- data/lib/relaton/iho/item_base.rb +18 -0
- data/lib/relaton/iho/item_data.rb +6 -0
- data/lib/relaton/iho/processor.rb +54 -0
- data/lib/relaton/iho/relation.rb +9 -0
- data/lib/relaton/iho/structured_identifier.rb +20 -0
- data/lib/relaton/iho/util.rb +8 -0
- data/lib/relaton/iho.rb +27 -0
- data/lib/relaton/index/config.rb +52 -0
- data/lib/relaton/index/file_io.rb +305 -0
- data/lib/relaton/index/file_storage.rb +61 -0
- data/lib/relaton/index/id_number.rb +30 -0
- data/lib/relaton/index/pool.rb +41 -0
- data/lib/relaton/index/type.rb +159 -0
- data/lib/relaton/index/util.rb +18 -0
- data/lib/relaton/index.rb +60 -0
- data/lib/relaton/isbn/isbn.rb +61 -0
- data/lib/relaton/isbn/open_library.rb +43 -0
- data/lib/relaton/isbn/parser.rb +88 -0
- data/lib/relaton/isbn/processor.rb +48 -0
- data/lib/relaton/isbn/util.rb +8 -0
- data/lib/relaton/isbn.rb +19 -0
- data/lib/relaton/iso/bibliography.rb +407 -0
- data/lib/relaton/iso/data_fetcher.rb +338 -0
- data/lib/relaton/iso/data_parser.rb +444 -0
- data/lib/relaton/iso/hash_parser_v1.rb +177 -0
- data/lib/relaton/iso/hit.rb +57 -0
- data/lib/relaton/iso/hit_collection.rb +184 -0
- data/lib/relaton/iso/item_data.rb +28 -0
- data/lib/relaton/iso/model/bibdata.rb +10 -0
- data/lib/relaton/iso/model/bibitem.rb +8 -0
- data/lib/relaton/iso/model/contributor.rb +6 -0
- data/lib/relaton/iso/model/contributor_info.rb +9 -0
- data/lib/relaton/iso/model/docidentifier.rb +134 -0
- data/lib/relaton/iso/model/doctype.rb +13 -0
- data/lib/relaton/iso/model/ext.rb +35 -0
- data/lib/relaton/iso/model/item.rb +17 -0
- data/lib/relaton/iso/model/item_base.rb +22 -0
- data/lib/relaton/iso/model/organization.rb +9 -0
- data/lib/relaton/iso/model/project_number.rb +22 -0
- data/lib/relaton/iso/model/relation.rb +9 -0
- data/lib/relaton/iso/model/stagename.rb +14 -0
- data/lib/relaton/iso/model/structured_identifier.rb +31 -0
- data/lib/relaton/iso/processor.rb +84 -0
- data/lib/relaton/iso/scraper.rb +619 -0
- data/lib/relaton/iso/type/pubid.rb +50 -0
- data/lib/relaton/iso/util.rb +8 -0
- data/lib/relaton/iso.rb +30 -0
- data/lib/relaton/itu/bibliography.rb +90 -0
- data/lib/relaton/itu/data_fetcher.rb +104 -0
- data/lib/relaton/itu/data_parser_r.rb +140 -0
- data/lib/relaton/itu/hit.rb +22 -0
- data/lib/relaton/itu/hit_collection.rb +127 -0
- data/lib/relaton/itu/item_data.rb +6 -0
- data/lib/relaton/itu/model/approval_stage.rb +13 -0
- data/lib/relaton/itu/model/bibdata.rb +8 -0
- data/lib/relaton/itu/model/bibitem.rb +8 -0
- data/lib/relaton/itu/model/docidentifier.rb +9 -0
- data/lib/relaton/itu/model/doctype.rb +13 -0
- data/lib/relaton/itu/model/ext.rb +47 -0
- data/lib/relaton/itu/model/item.rb +13 -0
- data/lib/relaton/itu/model/meeting.rb +13 -0
- data/lib/relaton/itu/model/meeting_date.rb +15 -0
- data/lib/relaton/itu/model/question.rb +13 -0
- data/lib/relaton/itu/model/recommendation_status.rb +11 -0
- data/lib/relaton/itu/model/structured_identifier.rb +19 -0
- data/lib/relaton/itu/processor.rb +66 -0
- data/lib/relaton/itu/pubid.rb +177 -0
- data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
- data/lib/relaton/itu/recommendation_parser.rb +161 -0
- data/lib/relaton/itu/scraper.rb +193 -0
- data/lib/relaton/itu/util.rb +8 -0
- data/lib/relaton/itu.rb +33 -0
- data/lib/relaton/jis/bibdata.rb +8 -0
- data/lib/relaton/jis/bibitem.rb +8 -0
- data/lib/relaton/jis/bibliography.rb +75 -0
- data/lib/relaton/jis/data_fetcher.rb +181 -0
- data/lib/relaton/jis/docidentifier.rb +21 -0
- data/lib/relaton/jis/doctype.rb +9 -0
- data/lib/relaton/jis/ext.rb +13 -0
- data/lib/relaton/jis/hit.rb +93 -0
- data/lib/relaton/jis/hit_collection.rb +127 -0
- data/lib/relaton/jis/item.rb +22 -0
- data/lib/relaton/jis/item_base.rb +26 -0
- data/lib/relaton/jis/item_data.rb +8 -0
- data/lib/relaton/jis/processor.rb +55 -0
- data/lib/relaton/jis/relation.rb +11 -0
- data/lib/relaton/jis/scraper.rb +232 -0
- data/lib/relaton/jis/structured_identifier.rb +13 -0
- data/lib/relaton/jis/util.rb +8 -0
- data/lib/relaton/jis.rb +33 -0
- data/lib/relaton/logger/channels/gh_issue.rb +78 -0
- data/lib/relaton/logger/config.rb +34 -0
- data/lib/relaton/logger/formatter_json.rb +8 -0
- data/lib/relaton/logger/formatter_string.rb +12 -0
- data/lib/relaton/logger/log.rb +64 -0
- data/lib/relaton/logger/log_device.rb +27 -0
- data/lib/relaton/logger/pool.rb +24 -0
- data/lib/relaton/logger.rb +18 -0
- data/lib/relaton/nist/bibdata.rb +8 -0
- data/lib/relaton/nist/bibitem.rb +8 -0
- data/lib/relaton/nist/bibliography.rb +191 -0
- data/lib/relaton/nist/comment_period.rb +15 -0
- data/lib/relaton/nist/data_fetcher.rb +84 -0
- data/lib/relaton/nist/date.rb +7 -0
- data/lib/relaton/nist/doctype.rb +7 -0
- data/lib/relaton/nist/ext.rb +16 -0
- data/lib/relaton/nist/hit.rb +18 -0
- data/lib/relaton/nist/hit_collection.rb +362 -0
- data/lib/relaton/nist/item.rb +17 -0
- data/lib/relaton/nist/item_data.rb +6 -0
- data/lib/relaton/nist/mods_parser.rb +276 -0
- data/lib/relaton/nist/processor.rb +68 -0
- data/lib/relaton/nist/pubs_export.rb +69 -0
- data/lib/relaton/nist/relation.rb +7 -0
- data/lib/relaton/nist/scraper.rb +290 -0
- data/lib/relaton/nist/series.yaml +49 -0
- data/lib/relaton/nist/util.rb +8 -0
- data/lib/relaton/nist.rb +34 -0
- data/lib/relaton/oasis/bibdata.rb +8 -0
- data/lib/relaton/oasis/bibitem.rb +8 -0
- data/lib/relaton/oasis/bibliography.rb +60 -0
- data/lib/relaton/oasis/browser_agent.rb +71 -0
- data/lib/relaton/oasis/data_fetcher.rb +94 -0
- data/lib/relaton/oasis/data_parser.rb +305 -0
- data/lib/relaton/oasis/data_parser_utils.rb +296 -0
- data/lib/relaton/oasis/data_part_parser.rb +239 -0
- data/lib/relaton/oasis/doctype.rb +7 -0
- data/lib/relaton/oasis/ext.rb +19 -0
- data/lib/relaton/oasis/item.rb +11 -0
- data/lib/relaton/oasis/item_data.rb +6 -0
- data/lib/relaton/oasis/processor.rb +68 -0
- data/lib/relaton/oasis/util.rb +8 -0
- data/lib/relaton/oasis.rb +28 -0
- data/lib/relaton/ogc/bibdata.rb +8 -0
- data/lib/relaton/ogc/bibitem.rb +8 -0
- data/lib/relaton/ogc/bibliography.rb +64 -0
- data/lib/relaton/ogc/data_fetcher.rb +110 -0
- data/lib/relaton/ogc/docidentifier.rb +6 -0
- data/lib/relaton/ogc/doctype.rb +12 -0
- data/lib/relaton/ogc/ext.rb +15 -0
- data/lib/relaton/ogc/hit.rb +18 -0
- data/lib/relaton/ogc/hit_collection.rb +36 -0
- data/lib/relaton/ogc/item.rb +13 -0
- data/lib/relaton/ogc/item_data.rb +6 -0
- data/lib/relaton/ogc/processor.rb +58 -0
- data/lib/relaton/ogc/scraper.rb +225 -0
- data/lib/relaton/ogc/util.rb +8 -0
- data/lib/relaton/ogc.rb +26 -0
- data/lib/relaton/oiml/bibdata.rb +8 -0
- data/lib/relaton/oiml/bibitem.rb +8 -0
- data/lib/relaton/oiml/bibliography.rb +94 -0
- data/lib/relaton/oiml/docidentifier.rb +33 -0
- data/lib/relaton/oiml/doctype.rb +13 -0
- data/lib/relaton/oiml/ext.rb +42 -0
- data/lib/relaton/oiml/item.rb +20 -0
- data/lib/relaton/oiml/item_base.rb +18 -0
- data/lib/relaton/oiml/item_data.rb +6 -0
- data/lib/relaton/oiml/processor.rb +54 -0
- data/lib/relaton/oiml/relation.rb +9 -0
- data/lib/relaton/oiml/util.rb +8 -0
- data/lib/relaton/oiml.rb +24 -0
- data/lib/relaton/omg/bibdata.rb +8 -0
- data/lib/relaton/omg/bibitem.rb +8 -0
- data/lib/relaton/omg/bibliography.rb +31 -0
- data/lib/relaton/omg/ext.rb +7 -0
- data/lib/relaton/omg/item.rb +8 -0
- data/lib/relaton/omg/item_data.rb +6 -0
- data/lib/relaton/omg/processor.rb +34 -0
- data/lib/relaton/omg/scraper.rb +141 -0
- data/lib/relaton/omg/util.rb +8 -0
- data/lib/relaton/omg.rb +24 -0
- data/lib/relaton/plateau/bibdata.rb +8 -0
- data/lib/relaton/plateau/bibitem.rb +8 -0
- data/lib/relaton/plateau/bibliography.rb +24 -0
- data/lib/relaton/plateau/data_fetcher.rb +153 -0
- data/lib/relaton/plateau/doctype.rb +7 -0
- data/lib/relaton/plateau/ext.rb +23 -0
- data/lib/relaton/plateau/handbook_parser.rb +95 -0
- data/lib/relaton/plateau/hit.rb +13 -0
- data/lib/relaton/plateau/hit_collection.rb +59 -0
- data/lib/relaton/plateau/item.rb +12 -0
- data/lib/relaton/plateau/item_data.rb +6 -0
- data/lib/relaton/plateau/parser.rb +101 -0
- data/lib/relaton/plateau/processor.rb +49 -0
- data/lib/relaton/plateau/technical_report_parser.rb +91 -0
- data/lib/relaton/plateau/util.rb +8 -0
- data/lib/relaton/plateau.rb +28 -0
- data/lib/relaton/un/bibdata.rb +8 -0
- data/lib/relaton/un/bibitem.rb +8 -0
- data/lib/relaton/un/bibliography.rb +48 -0
- data/lib/relaton/un/doctype.rb +10 -0
- data/lib/relaton/un/ext.rb +30 -0
- data/lib/relaton/un/hit.rb +56 -0
- data/lib/relaton/un/hit_collection.rb +61 -0
- data/lib/relaton/un/item.rb +11 -0
- data/lib/relaton/un/item_data.rb +6 -0
- data/lib/relaton/un/parser.rb +108 -0
- data/lib/relaton/un/processor.rb +38 -0
- data/lib/relaton/un/session.rb +25 -0
- data/lib/relaton/un/token_generator.rb +105 -0
- data/lib/relaton/un/util.rb +8 -0
- data/lib/relaton/un/wasm/decoder.rb +434 -0
- data/lib/relaton/un/wasm/instance.rb +101 -0
- data/lib/relaton/un/wasm/interpreter.rb +613 -0
- data/lib/relaton/un/wasm/memory.rb +112 -0
- data/lib/relaton/un/wasm/module.rb +47 -0
- data/lib/relaton/un/wasm.rb +17 -0
- data/lib/relaton/un/wasm_v_bg.wasm +0 -0
- data/lib/relaton/un.rb +28 -0
- data/lib/relaton/version.rb +1 -1
- data/lib/relaton/w3c/bibdata.rb +8 -0
- data/lib/relaton/w3c/bibitem.rb +8 -0
- data/lib/relaton/w3c/bibliography.rb +54 -0
- data/lib/relaton/w3c/data_fetcher.rb +309 -0
- data/lib/relaton/w3c/data_parser.rb +379 -0
- data/lib/relaton/w3c/doctype.rb +7 -0
- data/lib/relaton/w3c/ext.rb +11 -0
- data/lib/relaton/w3c/item.rb +12 -0
- data/lib/relaton/w3c/item_data.rb +6 -0
- data/lib/relaton/w3c/processor.rb +49 -0
- data/lib/relaton/w3c/pubid.rb +73 -0
- data/lib/relaton/w3c/safe_realize.rb +59 -0
- data/lib/relaton/w3c/util.rb +8 -0
- data/lib/relaton/w3c.rb +25 -0
- data/lib/relaton/xsf/bibdata.rb +8 -0
- data/lib/relaton/xsf/bibitem.rb +8 -0
- data/lib/relaton/xsf/bibliography.rb +24 -0
- data/lib/relaton/xsf/data_fetcher.rb +56 -0
- data/lib/relaton/xsf/hit.rb +17 -0
- data/lib/relaton/xsf/hit_collection.rb +24 -0
- data/lib/relaton/xsf/item.rb +7 -0
- data/lib/relaton/xsf/item_data.rb +6 -0
- data/lib/relaton/xsf/processor.rb +50 -0
- data/lib/relaton/xsf/util.rb +9 -0
- data/lib/relaton/xsf.rb +30 -0
- data/lib/relaton-core.rb +1 -0
- data/lib/relaton.rb +43 -0
- metadata +673 -170
- data/.github/workflows/rake.yml +0 -14
- data/.github/workflows/release.yml +0 -24
- data/.github/workflows/rubocop.yml +0 -48
- data/.gitignore +0 -12
- data/.rspec +0 -3
- data/CLAUDE.md +0 -78
- data/Gemfile +0 -29
- data/Rakefile +0 -6
- data/docs/CHANGELOG.adoc +0 -16
- data/docs/VERSIONING_POLICY.adoc +0 -38
- data/docs/navigation.adoc +0 -6
- data/lib/relaton/db/version.rb +0 -5
- data/relaton.gemspec +0 -72
- data/spec/relaton/config_spec.rb +0 -10
- data/spec/relaton/db_cache_spec.rb +0 -51
- data/spec/relaton/db_spec.rb +0 -567
- data/spec/relaton/registry_spec.rb +0 -178
- data/spec/relaton/util_spec.rb +0 -3
- data/spec/relaton_meta_spec.rb +0 -25
- data/spec/relaton_spec.rb +0 -800
- data/spec/spec_helper.rb +0 -45
- data/spec/support/gb_t_20223_2006.xml +0 -33
- data/spec/support/iso_111111119115_1.xml +0 -0
- data/spec/support/iso_19115_1.xml +0 -115
- data/spec/support/iso_19115_2.xml +0 -95
- data/spec/support/rfc_8341.xml +0 -46
- data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
- data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
- data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
- data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
- data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
- data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
- data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
- data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
- data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
- data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
- data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
- data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
- data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Un
|
|
5
|
+
module Wasm
|
|
6
|
+
class Memory
|
|
7
|
+
PAGE = 65_536
|
|
8
|
+
|
|
9
|
+
attr_reader :max_pages
|
|
10
|
+
|
|
11
|
+
def initialize(initial_pages:, max_pages: nil)
|
|
12
|
+
@pages = initial_pages
|
|
13
|
+
@max_pages = max_pages
|
|
14
|
+
@buf = String.new("\x00".b * (initial_pages * PAGE), encoding: Encoding::ASCII_8BIT)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def size_pages
|
|
18
|
+
@pages
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def grow(delta)
|
|
22
|
+
new_pages = @pages + delta
|
|
23
|
+
return -1 if @max_pages && new_pages > @max_pages
|
|
24
|
+
|
|
25
|
+
old = @pages
|
|
26
|
+
@pages = new_pages
|
|
27
|
+
@buf << ("\x00".b * (delta * PAGE))
|
|
28
|
+
old
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def read(addr, len)
|
|
32
|
+
bounds!(addr, len)
|
|
33
|
+
@buf.byteslice(addr, len)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def write(addr, bytes)
|
|
37
|
+
bytes = bytes.b
|
|
38
|
+
bounds!(addr, bytes.bytesize)
|
|
39
|
+
@buf.bytesplice(addr, bytes.bytesize, bytes)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def load_u8(addr)
|
|
43
|
+
bounds!(addr, 1)
|
|
44
|
+
@buf.getbyte(addr)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def load_i8(addr)
|
|
48
|
+
v = load_u8(addr)
|
|
49
|
+
v >= 0x80 ? v - 0x100 : v
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def load_u16(addr)
|
|
53
|
+
bounds!(addr, 2)
|
|
54
|
+
@buf.byteslice(addr, 2).unpack1("v")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def load_i16(addr)
|
|
58
|
+
v = load_u16(addr)
|
|
59
|
+
v >= 0x8000 ? v - 0x10000 : v
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def load_u32(addr)
|
|
63
|
+
bounds!(addr, 4)
|
|
64
|
+
@buf.byteslice(addr, 4).unpack1("V")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def load_i32(addr)
|
|
68
|
+
v = load_u32(addr)
|
|
69
|
+
v >= 0x8000_0000 ? v - 0x1_0000_0000 : v
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def load_u64(addr)
|
|
73
|
+
bounds!(addr, 8)
|
|
74
|
+
@buf.byteslice(addr, 8).unpack1("Q<")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def load_i64(addr)
|
|
78
|
+
v = load_u64(addr)
|
|
79
|
+
v >= 0x8000_0000_0000_0000 ? v - 0x1_0000_0000_0000_0000 : v
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def store_u8(addr, val)
|
|
83
|
+
bounds!(addr, 1)
|
|
84
|
+
@buf.setbyte(addr, val & 0xff)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def store_u16(addr, val)
|
|
88
|
+
bounds!(addr, 2)
|
|
89
|
+
@buf.bytesplice(addr, 2, [val & 0xffff].pack("v"))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def store_u32(addr, val)
|
|
93
|
+
bounds!(addr, 4)
|
|
94
|
+
@buf.bytesplice(addr, 4, [val & 0xffff_ffff].pack("V"))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def store_u64(addr, val)
|
|
98
|
+
bounds!(addr, 8)
|
|
99
|
+
@buf.bytesplice(addr, 8, [val & 0xffff_ffff_ffff_ffff].pack("Q<"))
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def bounds!(addr, len)
|
|
105
|
+
return if addr >= 0 && addr + len <= @buf.bytesize
|
|
106
|
+
|
|
107
|
+
raise Trap, "out of bounds memory access (addr=#{addr}, len=#{len}, size=#{@buf.bytesize})"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Un
|
|
5
|
+
module Wasm
|
|
6
|
+
FuncType = Struct.new(:params, :results)
|
|
7
|
+
Import = Struct.new(:mod, :field, :kind, :desc)
|
|
8
|
+
Export = Struct.new(:name, :kind, :index)
|
|
9
|
+
Global = Struct.new(:type, :mutable, :init_expr)
|
|
10
|
+
Element = Struct.new(:table_idx, :offset_expr, :func_indices)
|
|
11
|
+
Data = Struct.new(:mem_idx, :offset_expr, :bytes)
|
|
12
|
+
Code = Struct.new(:locals, :body)
|
|
13
|
+
|
|
14
|
+
MemoryType = Struct.new(:initial, :max)
|
|
15
|
+
TableType = Struct.new(:elem_type, :initial, :max)
|
|
16
|
+
|
|
17
|
+
class Module
|
|
18
|
+
attr_reader :types, :imports, :function_type_indices, :tables, :memories,
|
|
19
|
+
:globals, :exports, :elements, :code, :data, :start
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
@types = []
|
|
23
|
+
@imports = []
|
|
24
|
+
@function_type_indices = []
|
|
25
|
+
@tables = []
|
|
26
|
+
@memories = []
|
|
27
|
+
@globals = []
|
|
28
|
+
@exports = []
|
|
29
|
+
@elements = []
|
|
30
|
+
@code = []
|
|
31
|
+
@data = []
|
|
32
|
+
@start = nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.parse(bytes)
|
|
36
|
+
Decoder.new(bytes).decode
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Number of imported functions (they precede module-defined functions
|
|
40
|
+
# in the funcidx space).
|
|
41
|
+
def imported_function_count
|
|
42
|
+
@imports.count { |i| i.kind == :func }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Un
|
|
5
|
+
module Wasm
|
|
6
|
+
class Trap < StandardError; end
|
|
7
|
+
class DecodeError < StandardError; end
|
|
8
|
+
class LinkError < StandardError; end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require_relative "wasm/memory"
|
|
14
|
+
require_relative "wasm/decoder"
|
|
15
|
+
require_relative "wasm/module"
|
|
16
|
+
require_relative "wasm/interpreter"
|
|
17
|
+
require_relative "wasm/instance"
|
|
Binary file
|
data/lib/relaton/un.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require "addressable"
|
|
2
|
+
require "relaton/bib"
|
|
3
|
+
require_relative "version"
|
|
4
|
+
require_relative "un/util"
|
|
5
|
+
require_relative "un/item_data"
|
|
6
|
+
require_relative "un/item"
|
|
7
|
+
require_relative "un/bibitem"
|
|
8
|
+
require_relative "un/bibdata"
|
|
9
|
+
require_relative "un/token_generator"
|
|
10
|
+
require_relative "un/parser"
|
|
11
|
+
require_relative "un/hit"
|
|
12
|
+
require_relative "un/hit_collection"
|
|
13
|
+
require_relative "un/bibliography"
|
|
14
|
+
|
|
15
|
+
module Relaton
|
|
16
|
+
module Un
|
|
17
|
+
class Error < StandardError; end
|
|
18
|
+
|
|
19
|
+
# Returns hash of XML reammar
|
|
20
|
+
# @return [String]
|
|
21
|
+
def self.grammar_hash
|
|
22
|
+
# gem_path = File.expand_path "..", __dir__
|
|
23
|
+
# grammars_path = File.join gem_path, "grammars", "*"
|
|
24
|
+
# grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
|
|
25
|
+
Digest::MD5.hexdigest Relaton::VERSION # grammars
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/relaton/version.rb
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "net/http"
|
|
4
|
+
require "relaton/bib/hash_parser_v1"
|
|
5
|
+
require_relative "pubid"
|
|
6
|
+
|
|
7
|
+
module Relaton
|
|
8
|
+
module W3c
|
|
9
|
+
# Class methods for search W3C standards.
|
|
10
|
+
class Bibliography
|
|
11
|
+
SOURCE = "https://raw.githubusercontent.com/relaton/relaton-data-w3c/v2/"
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
# @param text [String]
|
|
15
|
+
# @return [Relaton::W3c::ItemData]
|
|
16
|
+
def search(text) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
17
|
+
pubid = PubId.parse text.sub(/^W3C\s/, "")
|
|
18
|
+
index = Relaton::Index.find_or_create(
|
|
19
|
+
:W3C, url: "#{SOURCE}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml", id_keys: PubId::PARTS,
|
|
20
|
+
)
|
|
21
|
+
row = index.search { |r| pubid == r[:id] }.sort_by { |r| (r[:id][:date] || r[:id][:year]).to_i }.last
|
|
22
|
+
return unless row
|
|
23
|
+
|
|
24
|
+
url = "#{SOURCE}#{row[:file]}"
|
|
25
|
+
resp = Net::HTTP.get_response(URI.parse(url))
|
|
26
|
+
return unless resp.code == "200"
|
|
27
|
+
|
|
28
|
+
Item.from_yaml(resp.body).tap { |i| i.fetched = Date.today.to_s }
|
|
29
|
+
rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
|
|
30
|
+
EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
|
|
31
|
+
Net::ProtocolError, Errno::ETIMEDOUT => e
|
|
32
|
+
raise Relaton::RequestError, "Could not access #{url}: #{e.message}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param ref [String] the W3C standard Code to look up
|
|
36
|
+
# @param year [String, NilClass] not used
|
|
37
|
+
# @param opts [Hash] options
|
|
38
|
+
# @return [Relaton::W3c::ItemData]
|
|
39
|
+
def get(ref, _year = nil, _opts = {})
|
|
40
|
+
Util.info "Fetching from Relaton repository ...", key: ref
|
|
41
|
+
result = search(ref)
|
|
42
|
+
unless result
|
|
43
|
+
Util.info "Not found.", key: ref
|
|
44
|
+
return
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
found = result.docidentifier.first.content
|
|
48
|
+
Util.info "Found: `#{found}`", key: ref
|
|
49
|
+
result
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
require "relaton/core"
|
|
2
|
+
require "w3c_api"
|
|
3
|
+
require_relative "../w3c"
|
|
4
|
+
require_relative "safe_realize"
|
|
5
|
+
require_relative "data_parser"
|
|
6
|
+
require_relative "pubid"
|
|
7
|
+
|
|
8
|
+
module Relaton
|
|
9
|
+
module W3c
|
|
10
|
+
class DataFetcher < Core::DataFetcher
|
|
11
|
+
include Relaton::W3c::SafeRealize
|
|
12
|
+
|
|
13
|
+
# Raised when pagination over the specifications index stops before the
|
|
14
|
+
# last page (e.g. a page fetch fails after retries, or the API reports
|
|
15
|
+
# more pages than were reached). It aborts the whole crawl so a truncated
|
|
16
|
+
# dataset is never saved or committed — see #fetch and #enqueue_specs.
|
|
17
|
+
class CrawlIncompleteError < StandardError; end
|
|
18
|
+
|
|
19
|
+
# Conservative default: too many parallel workers burst the per-spec
|
|
20
|
+
# version-history requests fast enough to trip the W3C API rate limiter
|
|
21
|
+
# (429s), which is what silently truncated the dataset before the crawl
|
|
22
|
+
# learned to abort on incomplete pagination. Raise it via the env var on
|
|
23
|
+
# a faster/shallower run; lower it further if 429s still appear.
|
|
24
|
+
DEFAULT_CONCURRENCY = 4
|
|
25
|
+
|
|
26
|
+
# How many times #fetch_specifications_page retries a transient failure
|
|
27
|
+
# (rate-limit/connection) before giving up and aborting the crawl.
|
|
28
|
+
PAGE_FETCH_ATTEMPTS = 3
|
|
29
|
+
|
|
30
|
+
# Number of fetch_spec worker threads. Tunable via env var so CI or
|
|
31
|
+
# local runs can dial it up for speed or down to lighten load on
|
|
32
|
+
# api.w3.org (or for debugging).
|
|
33
|
+
def self.concurrency
|
|
34
|
+
(ENV["RELATON_W3C_FETCH_CONCURRENCY"] || DEFAULT_CONCURRENCY).to_i
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Whether to crawl each specification's version history (version_history,
|
|
38
|
+
# predecessor_versions, successor_versions). Enabled by default for a
|
|
39
|
+
# complete dataset. Set RELATON_W3C_FETCH_VERSIONS=false for a faster,
|
|
40
|
+
# shallower crawl that emits only the top-level specifications and skips
|
|
41
|
+
# the per-spec version fan-out (the bulk of the API requests).
|
|
42
|
+
def self.fetch_versions?
|
|
43
|
+
val = ENV["RELATON_W3C_FETCH_VERSIONS"]
|
|
44
|
+
return true if val.nil? || val.empty?
|
|
45
|
+
|
|
46
|
+
!%w[0 false no off].include?(val.strip.downcase)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def initialize(*args)
|
|
50
|
+
super
|
|
51
|
+
@mutex = Mutex.new
|
|
52
|
+
@interrupted = false
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def index
|
|
56
|
+
@index ||= Relaton::Index.find_or_create(:W3C, file: "#{INDEXFILE}.yaml")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def log_error(msg)
|
|
60
|
+
Util.error msg
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def client
|
|
64
|
+
@client ||= W3cApi::Client.new
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# Parse documents in parallel. The crawler is heavily I/O-bound on
|
|
69
|
+
# api.w3.org round-trips (~30-50k requests per run), so a small thread
|
|
70
|
+
# pool gives a near-linear speedup. Pagination still happens serially:
|
|
71
|
+
# each page's `next?` flag gates whether the next page is requested.
|
|
72
|
+
#
|
|
73
|
+
# A SIGINT (Ctrl-C) is handled gracefully: the producer stops queuing and
|
|
74
|
+
# the workers stop processing after their in-flight spec, then the index
|
|
75
|
+
# of everything fetched so far is saved rather than the run being lost.
|
|
76
|
+
#
|
|
77
|
+
def fetch(_source = nil)
|
|
78
|
+
n_workers = self.class.concurrency
|
|
79
|
+
queue = SizedQueue.new(n_workers * 4)
|
|
80
|
+
workers = Array.new(n_workers) { spawn_worker(queue) }
|
|
81
|
+
|
|
82
|
+
with_interrupt_handler do
|
|
83
|
+
# The poison pills + join run in `ensure` so an exception raised while
|
|
84
|
+
# enqueuing (e.g. CrawlIncompleteError) still unblocks the producer
|
|
85
|
+
# and drains the workers instead of deadlocking on queue.pop.
|
|
86
|
+
begin
|
|
87
|
+
enqueue_specs(queue)
|
|
88
|
+
ensure
|
|
89
|
+
n_workers.times { queue << nil } # poison pills
|
|
90
|
+
workers.each(&:join)
|
|
91
|
+
end
|
|
92
|
+
Util.warn "Crawl interrupted — saving progress collected so far." if @interrupted
|
|
93
|
+
index.save
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
report_errors
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# Page through the specifications index, feeding each spec (paired with
|
|
101
|
+
# its embedded page) to the worker queue. Returns early when interrupted.
|
|
102
|
+
#
|
|
103
|
+
# embed: true inlines each specification's full payload into the index
|
|
104
|
+
# page's `_embedded` block, so a spec link realizes from that page in
|
|
105
|
+
# memory instead of making its own HTTP request — one request per page
|
|
106
|
+
# rather than one per specification. The page is queued alongside each
|
|
107
|
+
# link so the worker can hand it back to realize as the parent_resource.
|
|
108
|
+
#
|
|
109
|
+
def enqueue_specs(queue)
|
|
110
|
+
specs = client.specifications(embed: true)
|
|
111
|
+
expected_pages = specs.pages
|
|
112
|
+
last_page = nil
|
|
113
|
+
loop do
|
|
114
|
+
page = specs
|
|
115
|
+
page.links.specifications.each do |spec|
|
|
116
|
+
break if @interrupted
|
|
117
|
+
|
|
118
|
+
queue << [spec, page]
|
|
119
|
+
end
|
|
120
|
+
break if @interrupted
|
|
121
|
+
|
|
122
|
+
last_page = page.page
|
|
123
|
+
break unless page.next?
|
|
124
|
+
|
|
125
|
+
# Fetch the next page through the client's fetch path rather than
|
|
126
|
+
# realizing the `next` link: only fetch populates the page's
|
|
127
|
+
# embedded_data, so this keeps embed working past page 1. Realizing
|
|
128
|
+
# the `next` link drops `_embedded` and forces a per-spec HTTP
|
|
129
|
+
# request for every specification on every later page.
|
|
130
|
+
next_page = fetch_specifications_page(page.page + 1)
|
|
131
|
+
# A nil here means the page fetch failed after retries (not the end
|
|
132
|
+
# of the list — that is `!page.next?` above). Aborting rather than
|
|
133
|
+
# `break`ing prevents a rate-limit blip from silently truncating the
|
|
134
|
+
# dataset: a partial crawl must never be saved/committed.
|
|
135
|
+
unless next_page
|
|
136
|
+
raise CrawlIncompleteError,
|
|
137
|
+
"specifications pagination stopped at page #{page.page}: " \
|
|
138
|
+
"failed to fetch page #{page.page + 1}"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
specs = next_page
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
return if @interrupted
|
|
145
|
+
|
|
146
|
+
guard_complete_pagination(last_page, expected_pages)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Defense in depth: even when no page fetch raised, make sure pagination
|
|
150
|
+
# actually reached the last page the API advertised. Catches truncation
|
|
151
|
+
# modes other than a failed fetch (e.g. a `next` link that goes missing).
|
|
152
|
+
# Only enforced when the index reported a positive page count.
|
|
153
|
+
def guard_complete_pagination(last_page, expected_pages)
|
|
154
|
+
return unless expected_pages.is_a?(Integer) && expected_pages.positive?
|
|
155
|
+
return unless last_page.is_a?(Integer) && last_page < expected_pages
|
|
156
|
+
|
|
157
|
+
raise CrawlIncompleteError,
|
|
158
|
+
"specifications pagination ended at page #{last_page} of " \
|
|
159
|
+
"#{expected_pages}; refusing to save a partial dataset"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def fetch_spec(unrealized_spec, page = nil)
|
|
163
|
+
# When `page` came from an embed:true fetch, realizing against it as the
|
|
164
|
+
# parent_resource serves the spec from embedded data (no HTTP request).
|
|
165
|
+
spec = realize(unrealized_spec, parent_resource: page)
|
|
166
|
+
return unless spec
|
|
167
|
+
|
|
168
|
+
local_errors = Hash.new(true)
|
|
169
|
+
save_doc DataParser.parse(spec, local_errors)
|
|
170
|
+
|
|
171
|
+
fetch_versions(spec) if self.class.fetch_versions?
|
|
172
|
+
|
|
173
|
+
@mutex.synchronize { local_errors.each { |k, v| @errors[k] &&= v } }
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# Crawl a specification's version history: its dated editions plus the
|
|
178
|
+
# predecessor/successor version chains. Each entry is a separate HTTP
|
|
179
|
+
# request, so this is the bulk of a run and can be skipped via
|
|
180
|
+
# RELATON_W3C_FETCH_VERSIONS=false (see .fetch_versions?).
|
|
181
|
+
#
|
|
182
|
+
def fetch_versions(spec)
|
|
183
|
+
if spec.links.respond_to?(:version_history) && spec.links.version_history
|
|
184
|
+
version_history = realize spec.links.version_history
|
|
185
|
+
version_history&.links&.spec_versions&.each { |version| parse_and_save version }
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
if spec.links.respond_to?(:predecessor_versions) && spec.links.predecessor_versions
|
|
189
|
+
predecessor_versions = realize spec.links.predecessor_versions
|
|
190
|
+
predecessor_versions&.links&.predecessor_versions&.each { |version| parse_and_save version }
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
return unless spec.links.respond_to?(:successor_versions) && spec.links.successor_versions
|
|
194
|
+
|
|
195
|
+
successor_versions = realize spec.links.successor_versions
|
|
196
|
+
successor_versions&.links&.successor_versions&.each { |version| parse_and_save version }
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
#
|
|
200
|
+
# Save document to file
|
|
201
|
+
#
|
|
202
|
+
# @param [Relaton::W3c::ItemData, nil] bib bibliographic item
|
|
203
|
+
#
|
|
204
|
+
def save_doc(bib, warn_duplicate: true)
|
|
205
|
+
return unless bib
|
|
206
|
+
|
|
207
|
+
file = file_name(bib.docnumber)
|
|
208
|
+
@mutex.synchronize do
|
|
209
|
+
if @files.include?(file)
|
|
210
|
+
Util.warn "File #{file} already exists. Document: #{bib.docnumber}" if warn_duplicate
|
|
211
|
+
else
|
|
212
|
+
pubid = PubId.parse bib.docnumber
|
|
213
|
+
index.add_or_update pubid.to_hash, file
|
|
214
|
+
@files << file
|
|
215
|
+
end
|
|
216
|
+
File.write file, serialize(bib), encoding: "UTF-8"
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def to_xml(bib)
|
|
221
|
+
bib.to_xml(bibdata: true)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def to_yaml(bib)
|
|
225
|
+
bib.to_yaml
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def to_bibxml(bib)
|
|
229
|
+
bib.to_xml
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Generate file name
|
|
234
|
+
#
|
|
235
|
+
# @param [String] id document id
|
|
236
|
+
#
|
|
237
|
+
# @return [String] file name
|
|
238
|
+
#
|
|
239
|
+
def file_name(id)
|
|
240
|
+
name = id.sub(/^W3C\s/, "").gsub(/[\s,:\/+]/, "_").squeeze("_").downcase
|
|
241
|
+
File.join @output, "#{name}.#{@ext}"
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
private
|
|
245
|
+
|
|
246
|
+
# Install a SIGINT handler for the duration of the crawl so Ctrl-C sets
|
|
247
|
+
# the @interrupted flag (observed by the producer loop and the workers)
|
|
248
|
+
# instead of killing the process mid-write. The trap body is kept minimal
|
|
249
|
+
# (no I/O or locking) because trap context is restricted; the user-facing
|
|
250
|
+
# notice is printed from the main thread once the crawl winds down. The
|
|
251
|
+
# previous handler is restored on the way out so the trap doesn't leak
|
|
252
|
+
# into the host process.
|
|
253
|
+
def with_interrupt_handler
|
|
254
|
+
previous = Signal.trap("INT") { @interrupted = true }
|
|
255
|
+
yield
|
|
256
|
+
ensure
|
|
257
|
+
Signal.trap("INT", previous || "DEFAULT")
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# Fetch one page of the specifications index with embed enabled. Goes
|
|
261
|
+
# through the client (the register's fetch path) so the page's
|
|
262
|
+
# embedded_data is populated. Transient 403/5xx/connection failures are
|
|
263
|
+
# already retried upstream (w3c_api/lutaml-hal), but losing an index page
|
|
264
|
+
# drops every spec on it, so retry a few more times here with backoff to
|
|
265
|
+
# ride out a brief rate-limit window. Returns nil only once the attempts
|
|
266
|
+
# are exhausted; the caller turns that into a CrawlIncompleteError so the
|
|
267
|
+
# crawl aborts instead of committing a truncated dataset.
|
|
268
|
+
def fetch_specifications_page(number)
|
|
269
|
+
attempt = 0
|
|
270
|
+
begin
|
|
271
|
+
attempt += 1
|
|
272
|
+
client.specifications(embed: true, page: number)
|
|
273
|
+
rescue Lutaml::Hal::Error, Faraday::Error => e
|
|
274
|
+
log_error "Failed to fetch specifications page #{number} " \
|
|
275
|
+
"(attempt #{attempt}/#{PAGE_FETCH_ATTEMPTS}): " \
|
|
276
|
+
"#{e.class}: #{e.message}"
|
|
277
|
+
if attempt < PAGE_FETCH_ATTEMPTS
|
|
278
|
+
sleep(2**attempt)
|
|
279
|
+
retry
|
|
280
|
+
end
|
|
281
|
+
nil
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def spawn_worker(queue)
|
|
286
|
+
Thread.new do
|
|
287
|
+
while (item = queue.pop)
|
|
288
|
+
# Once interrupted, drain the queue without processing so the
|
|
289
|
+
# producer unblocks and the pool reaches its poison pills quickly.
|
|
290
|
+
next if @interrupted
|
|
291
|
+
|
|
292
|
+
spec, page = item
|
|
293
|
+
begin
|
|
294
|
+
fetch_spec spec, page
|
|
295
|
+
rescue StandardError => e
|
|
296
|
+
log_error "fetch_spec failed: #{e.class}: #{e.message}\n" \
|
|
297
|
+
"#{e.backtrace.first(5).join("\n")}"
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def parse_and_save(version)
|
|
304
|
+
realized = realize version
|
|
305
|
+
save_doc DataParser.parse(realized) if realized
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|