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.
- checksums.yaml +4 -4
- data/{docs/README.adoc → README.adoc} +165 -38
- data/bin/console +0 -1
- data/lib/relaton/3gpp/bibdata.rb +9 -0
- data/lib/relaton/3gpp/bibitem.rb +9 -0
- data/lib/relaton/3gpp/bibliography.rb +123 -0
- data/lib/relaton/3gpp/data_fetcher.rb +303 -0
- data/lib/relaton/3gpp/docidentifier.rb +114 -0
- data/lib/relaton/3gpp/doctype.rb +9 -0
- data/lib/relaton/3gpp/ext.rb +31 -0
- data/lib/relaton/3gpp/item.rb +18 -0
- data/lib/relaton/3gpp/item_data.rb +15 -0
- data/lib/relaton/3gpp/parser.rb +400 -0
- data/lib/relaton/3gpp/processor.rb +71 -0
- data/lib/relaton/3gpp/release.rb +34 -0
- data/lib/relaton/3gpp/util.rb +8 -0
- data/lib/relaton/3gpp.rb +29 -0
- data/lib/relaton/adobe/bibdata.rb +8 -0
- data/lib/relaton/adobe/bibitem.rb +8 -0
- data/lib/relaton/adobe/bibliography.rb +92 -0
- data/lib/relaton/adobe/docidentifier.rb +49 -0
- data/lib/relaton/adobe/doctype.rb +14 -0
- data/lib/relaton/adobe/ext.rb +32 -0
- data/lib/relaton/adobe/item.rb +15 -0
- data/lib/relaton/adobe/item_base.rb +18 -0
- data/lib/relaton/adobe/item_data.rb +6 -0
- data/lib/relaton/adobe/processor.rb +45 -0
- data/lib/relaton/adobe/util.rb +8 -0
- data/lib/relaton/adobe.rb +37 -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 +49 -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 +49 -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 +264 -0
- data/lib/relaton/bib/util.rb +18 -0
- data/lib/relaton/bib/versions.json +35 -0
- data/lib/relaton/bib.rb +46 -0
- data/lib/relaton/bipm/bibliography.rb +231 -0
- data/lib/relaton/bipm/converter/asciibib.rb +64 -0
- data/lib/relaton/bipm/data_fetcher.rb +81 -0
- data/lib/relaton/bipm/data_outcomes_parser.rb +656 -0
- data/lib/relaton/bipm/id_parser.rb +278 -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 +36 -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 +172 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
- data/lib/relaton/bipm/si_brochure_parser.rb +188 -0
- data/lib/relaton/bipm/util.rb +8 -0
- data/lib/relaton/bipm.rb +38 -0
- data/lib/relaton/bsi/bibliography.rb +196 -0
- data/lib/relaton/bsi/hit.rb +28 -0
- data/lib/relaton/bsi/hit_collection.rb +113 -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 +107 -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 +43 -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 +93 -0
- data/lib/relaton/calconnect/data_fetcher.rb +174 -0
- data/lib/relaton/calconnect/docidentifier.rb +80 -0
- data/lib/relaton/calconnect/hit.rb +14 -0
- data/lib/relaton/calconnect/hit_collection.rb +92 -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 +20 -0
- data/lib/relaton/calconnect/processor.rb +72 -0
- data/lib/relaton/calconnect/scraper.rb +87 -0
- data/lib/relaton/calconnect/util.rb +8 -0
- data/lib/relaton/calconnect.rb +36 -0
- data/lib/relaton/ccsds/bibliography.rb +63 -0
- data/lib/relaton/ccsds/data/fetcher.rb +252 -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 +47 -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/docidentifier.rb +121 -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 +15 -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 +149 -0
- data/lib/relaton/cen/committees.yaml +66 -0
- data/lib/relaton/cen/hit.rb +31 -0
- data/lib/relaton/cen/hit_collection.rb +116 -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 +100 -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 +45 -0
- data/lib/relaton/cen/scraper.rb +218 -0
- data/lib/relaton/cen/util.rb +8 -0
- data/lib/relaton/cen.rb +30 -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 +540 -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 +68 -0
- data/lib/relaton/cie/scrapper.rb +52 -0
- data/lib/relaton/cie/util.rb +8 -0
- data/lib/relaton/cie.rb +29 -0
- data/lib/relaton/core/array_wrapper.rb +20 -0
- data/lib/relaton/core/data_fetcher.rb +244 -0
- data/lib/relaton/core/date_parser.rb +42 -0
- data/lib/relaton/core/governor.rb +320 -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/pacer.rb +134 -0
- data/lib/relaton/core/processor.rb +67 -0
- data/lib/relaton/core/request_error.rb +14 -0
- data/lib/relaton/core/workers_pool.rb +45 -0
- data/lib/relaton/core.rb +12 -0
- data/lib/relaton/db/registry.rb +44 -4
- data/lib/relaton/db.rb +0 -1
- data/lib/relaton/doi/crossref.rb +89 -0
- data/lib/relaton/doi/parser.rb +921 -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/easc/bibdata.rb +8 -0
- data/lib/relaton/easc/bibitem.rb +8 -0
- data/lib/relaton/easc/bibliography.rb +95 -0
- data/lib/relaton/easc/docidentifier.rb +100 -0
- data/lib/relaton/easc/doctype.rb +14 -0
- data/lib/relaton/easc/ext.rb +44 -0
- data/lib/relaton/easc/item.rb +13 -0
- data/lib/relaton/easc/item_base.rb +18 -0
- data/lib/relaton/easc/item_data.rb +6 -0
- data/lib/relaton/easc/processor.rb +46 -0
- data/lib/relaton/easc/util.rb +8 -0
- data/lib/relaton/easc.rb +35 -0
- data/lib/relaton/ecma/bibdata.rb +8 -0
- data/lib/relaton/ecma/bibitem.rb +8 -0
- data/lib/relaton/ecma/bibliography.rb +149 -0
- data/lib/relaton/ecma/data_fetcher.rb +162 -0
- data/lib/relaton/ecma/data_parser.rb +49 -0
- data/lib/relaton/ecma/docidentifier.rb +124 -0
- data/lib/relaton/ecma/edition_parser.rb +80 -0
- data/lib/relaton/ecma/ext.rb +7 -0
- data/lib/relaton/ecma/item.rb +13 -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 +39 -0
- data/lib/relaton/ecma/parser_common.rb +33 -0
- data/lib/relaton/ecma/processor.rb +69 -0
- data/lib/relaton/ecma/standard_parser.rb +134 -0
- data/lib/relaton/ecma/util.rb +8 -0
- data/lib/relaton/ecma.rb +33 -0
- data/lib/relaton/etsi/bibdata.rb +10 -0
- data/lib/relaton/etsi/bibitem.rb +10 -0
- data/lib/relaton/etsi/bibliography.rb +111 -0
- data/lib/relaton/etsi/data_fetcher.rb +167 -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 +71 -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 +26 -0
- data/lib/relaton/gb/bibdata.rb +8 -0
- data/lib/relaton/gb/bibitem.rb +8 -0
- data/lib/relaton/gb/bibliography.rb +171 -0
- data/lib/relaton/gb/ccs.rb +14 -0
- data/lib/relaton/gb/committee.rb +13 -0
- data/lib/relaton/gb/docidentifier.rb +72 -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 +49 -0
- data/lib/relaton/gb/project_number.rb +38 -0
- data/lib/relaton/gb/scraper.rb +221 -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/gost/bibdata.rb +8 -0
- data/lib/relaton/gost/bibitem.rb +8 -0
- data/lib/relaton/gost/bibliography.rb +107 -0
- data/lib/relaton/gost/docidentifier.rb +80 -0
- data/lib/relaton/gost/doctype.rb +16 -0
- data/lib/relaton/gost/ext.rb +46 -0
- data/lib/relaton/gost/item.rb +15 -0
- data/lib/relaton/gost/item_base.rb +18 -0
- data/lib/relaton/gost/item_data.rb +6 -0
- data/lib/relaton/gost/processor.rb +49 -0
- data/lib/relaton/gost/util.rb +8 -0
- data/lib/relaton/gost.rb +36 -0
- data/lib/relaton/iala/bibdata.rb +8 -0
- data/lib/relaton/iala/bibitem.rb +8 -0
- data/lib/relaton/iala/bibliography.rb +146 -0
- data/lib/relaton/iala/docidentifier.rb +89 -0
- data/lib/relaton/iala/doctype.rb +18 -0
- data/lib/relaton/iala/ext.rb +32 -0
- data/lib/relaton/iala/item.rb +21 -0
- data/lib/relaton/iala/item_base.rb +18 -0
- data/lib/relaton/iala/item_data.rb +6 -0
- data/lib/relaton/iala/processor.rb +43 -0
- data/lib/relaton/iala/relation.rb +7 -0
- data/lib/relaton/iala/util.rb +8 -0
- data/lib/relaton/iala.rb +35 -0
- data/lib/relaton/iana/bibdata.rb +8 -0
- data/lib/relaton/iana/bibitem.rb +8 -0
- data/lib/relaton/iana/bibliography.rb +100 -0
- data/lib/relaton/iana/data_fetcher.rb +101 -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 +70 -0
- data/lib/relaton/iana/util.rb +8 -0
- data/lib/relaton/iana.rb +40 -0
- data/lib/relaton/iec/bibliography.rb +283 -0
- data/lib/relaton/iec/data_fetcher.rb +222 -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 +135 -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 +74 -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 +73 -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 +771 -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 +330 -0
- data/lib/relaton/ieee/item.rb +11 -0
- data/lib/relaton/ieee/item_data.rb +7 -0
- data/lib/relaton/ieee/processor.rb +71 -0
- data/lib/relaton/ieee/rawbib_id_parser.rb +753 -0
- data/lib/relaton/ieee/util.rb +8 -0
- data/lib/relaton/ieee.rb +30 -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 +561 -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 +72 -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 +446 -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 +101 -0
- data/lib/relaton/ietf/util.rb +8 -0
- data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
- data/lib/relaton/ietf.rb +30 -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 +66 -0
- data/lib/relaton/index/pool.rb +46 -0
- data/lib/relaton/index/shard_source.rb +201 -0
- data/lib/relaton/index/type.rb +210 -0
- data/lib/relaton/index/util.rb +18 -0
- data/lib/relaton/index.rb +61 -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 +412 -0
- data/lib/relaton/iso/data_fetcher.rb +338 -0
- data/lib/relaton/iso/data_parser.rb +458 -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 +196 -0
- data/lib/relaton/iso/item_data.rb +50 -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 +146 -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 +85 -0
- data/lib/relaton/iso/scraper.rb +635 -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 +95 -0
- data/lib/relaton/itu/data_crawler_r.rb +664 -0
- data/lib/relaton/itu/data_fetcher.rb +550 -0
- data/lib/relaton/itu/data_merge_r.rb +149 -0
- data/lib/relaton/itu/data_parser_r.rb +214 -0
- data/lib/relaton/itu/data_parser_t.rb +228 -0
- data/lib/relaton/itu/family_cache.rb +177 -0
- data/lib/relaton/itu/governor.rb +56 -0
- data/lib/relaton/itu/hit.rb +28 -0
- data/lib/relaton/itu/hit_collection.rb +299 -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 +75 -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 +38 -0
- data/lib/relaton/itu/processor.rb +72 -0
- data/lib/relaton/itu/pubid.rb +199 -0
- data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
- data/lib/relaton/itu/recommendation_fields.rb +334 -0
- data/lib/relaton/itu/recommendation_parser.rb +30 -0
- data/lib/relaton/itu/scraper.rb +203 -0
- data/lib/relaton/itu/util.rb +8 -0
- data/lib/relaton/itu.rb +34 -0
- data/lib/relaton/jcgm/bibdata.rb +8 -0
- data/lib/relaton/jcgm/bibitem.rb +8 -0
- data/lib/relaton/jcgm/bibliography.rb +97 -0
- data/lib/relaton/jcgm/data_fetcher.rb +81 -0
- data/lib/relaton/jcgm/docidentifier.rb +102 -0
- data/lib/relaton/jcgm/doctype.rb +12 -0
- data/lib/relaton/jcgm/ext.rb +23 -0
- data/lib/relaton/jcgm/item.rb +20 -0
- data/lib/relaton/jcgm/item_base.rb +18 -0
- data/lib/relaton/jcgm/item_data.rb +6 -0
- data/lib/relaton/jcgm/meetings_parser.rb +175 -0
- data/lib/relaton/jcgm/processor.rb +71 -0
- data/lib/relaton/jcgm/relation.rb +9 -0
- data/lib/relaton/jcgm/structured_identifier.rb +40 -0
- data/lib/relaton/jcgm/util.rb +8 -0
- data/lib/relaton/jcgm.rb +24 -0
- data/lib/relaton/jis/bibdata.rb +8 -0
- data/lib/relaton/jis/bibitem.rb +8 -0
- data/lib/relaton/jis/bibliography.rb +73 -0
- data/lib/relaton/jis/data_fetcher.rb +183 -0
- data/lib/relaton/jis/docidentifier.rb +120 -0
- data/lib/relaton/jis/doctype.rb +9 -0
- data/lib/relaton/jis/ext.rb +13 -0
- data/lib/relaton/jis/hit.rb +88 -0
- data/lib/relaton/jis/hit_collection.rb +128 -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 +32 -0
- data/lib/relaton/logger/channels/gh_issue.rb +143 -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 +134 -0
- data/lib/relaton/nist/date.rb +7 -0
- data/lib/relaton/nist/docidentifier.rb +165 -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 +19 -0
- data/lib/relaton/nist/item_base.rb +16 -0
- data/lib/relaton/nist/item_data.rb +6 -0
- data/lib/relaton/nist/mods_parser.rb +302 -0
- data/lib/relaton/nist/processor.rb +69 -0
- data/lib/relaton/nist/pubs_export.rb +69 -0
- data/lib/relaton/nist/relation.rb +10 -0
- data/lib/relaton/nist/scraper.rb +293 -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 +201 -0
- data/lib/relaton/oasis/browser_agent.rb +71 -0
- data/lib/relaton/oasis/data_fetcher.rb +130 -0
- data/lib/relaton/oasis/data_parser.rb +305 -0
- data/lib/relaton/oasis/data_parser_utils.rb +330 -0
- data/lib/relaton/oasis/data_part_parser.rb +239 -0
- data/lib/relaton/oasis/docidentifier.rb +54 -0
- data/lib/relaton/oasis/doctype.rb +7 -0
- data/lib/relaton/oasis/ext.rb +19 -0
- data/lib/relaton/oasis/item.rb +14 -0
- data/lib/relaton/oasis/item_data.rb +6 -0
- data/lib/relaton/oasis/processor.rb +74 -0
- data/lib/relaton/oasis/util.rb +8 -0
- data/lib/relaton/oasis.rb +41 -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 +131 -0
- data/lib/relaton/ogc/docidentifier.rb +111 -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 +111 -0
- data/lib/relaton/ogc/item.rb +13 -0
- data/lib/relaton/ogc/item_data.rb +6 -0
- data/lib/relaton/ogc/processor.rb +59 -0
- data/lib/relaton/ogc/scraper.rb +225 -0
- data/lib/relaton/ogc/util.rb +8 -0
- data/lib/relaton/ogc.rb +30 -0
- data/lib/relaton/oiml/bibdata.rb +8 -0
- data/lib/relaton/oiml/bibitem.rb +8 -0
- data/lib/relaton/oiml/bibliography.rb +169 -0
- data/lib/relaton/oiml/docidentifier.rb +48 -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/docidentifier.rb +67 -0
- data/lib/relaton/omg/ext.rb +7 -0
- data/lib/relaton/omg/item.rb +9 -0
- data/lib/relaton/omg/item_data.rb +6 -0
- data/lib/relaton/omg/processor.rb +35 -0
- data/lib/relaton/omg/scraper.rb +186 -0
- data/lib/relaton/omg/util.rb +8 -0
- data/lib/relaton/omg.rb +25 -0
- data/lib/relaton/plateau/bibdata.rb +8 -0
- data/lib/relaton/plateau/bibitem.rb +8 -0
- data/lib/relaton/plateau/bibliography.rb +31 -0
- data/lib/relaton/plateau/data_fetcher.rb +176 -0
- data/lib/relaton/plateau/doctype.rb +7 -0
- data/lib/relaton/plateau/ext.rb +23 -0
- data/lib/relaton/plateau/handbook_parser.rb +102 -0
- data/lib/relaton/plateau/hit.rb +21 -0
- data/lib/relaton/plateau/hit_collection.rb +79 -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 +51 -0
- data/lib/relaton/plateau/technical_report_parser.rb +98 -0
- data/lib/relaton/plateau/util.rb +8 -0
- data/lib/relaton/plateau.rb +29 -0
- data/lib/relaton/sdo/config.rb +34 -0
- data/lib/relaton/sdo/fetcher.rb +52 -0
- data/lib/relaton/sdo/logo.rb +95 -0
- data/lib/relaton/sdo/name.rb +26 -0
- data/lib/relaton/sdo/organization.rb +71 -0
- data/lib/relaton/sdo/store.rb +49 -0
- data/lib/relaton/sdo.rb +29 -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 +174 -0
- data/lib/relaton/w3c/data_fetcher.rb +487 -0
- data/lib/relaton/w3c/data_parser.rb +379 -0
- data/lib/relaton/w3c/docidentifier.rb +48 -0
- data/lib/relaton/w3c/doctype.rb +7 -0
- data/lib/relaton/w3c/ext.rb +11 -0
- data/lib/relaton/w3c/governor.rb +32 -0
- data/lib/relaton/w3c/item.rb +15 -0
- data/lib/relaton/w3c/item_data.rb +6 -0
- data/lib/relaton/w3c/processor.rb +49 -0
- data/lib/relaton/w3c/pubid.rb +85 -0
- data/lib/relaton/w3c/safe_realize.rb +148 -0
- data/lib/relaton/w3c/util.rb +8 -0
- data/lib/relaton/w3c.rb +36 -0
- data/lib/relaton/xsf/bibdata.rb +8 -0
- data/lib/relaton/xsf/bibitem.rb +8 -0
- data/lib/relaton/xsf/bibliography.rb +84 -0
- data/lib/relaton/xsf/data_fetcher.rb +106 -0
- data/lib/relaton/xsf/docidentifier.rb +46 -0
- data/lib/relaton/xsf/hit.rb +17 -0
- data/lib/relaton/xsf/hit_collection.rb +52 -0
- data/lib/relaton/xsf/item.rb +13 -0
- data/lib/relaton/xsf/item_data.rb +6 -0
- data/lib/relaton/xsf/processor.rb +51 -0
- data/lib/relaton/xsf/util.rb +9 -0
- data/lib/relaton/xsf.rb +34 -0
- data/lib/relaton-core.rb +1 -0
- data/lib/relaton.rb +85 -0
- metadata +775 -161
- 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,65 @@
|
|
|
1
|
+
require "relaton/core/processor"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Doi
|
|
5
|
+
class Processor < Core::Processor
|
|
6
|
+
attr_reader :idtype
|
|
7
|
+
|
|
8
|
+
def initialize # rubocop:disable Lint/MissingSuper
|
|
9
|
+
@short = :relaton_doi
|
|
10
|
+
@prefix = "DOI"
|
|
11
|
+
@defaultprefix = %r{^doi:}
|
|
12
|
+
@idtype = "DOI"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @param code [String] DOI
|
|
16
|
+
# @param date [String, nil] year
|
|
17
|
+
# @param opts [Hash]
|
|
18
|
+
# @return [RelatonBib::BibliographicItem]
|
|
19
|
+
def get(code, _date, _opts)
|
|
20
|
+
require_relative "../doi"
|
|
21
|
+
Crossref.get(code)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# @param [String] source source name
|
|
26
|
+
# @param [Hash] opts
|
|
27
|
+
# @option opts [String] :output directory to output documents
|
|
28
|
+
# @option opts [String] :format
|
|
29
|
+
#
|
|
30
|
+
def fetch_data(_source, _opts)
|
|
31
|
+
Util.info "This processor does not support fetching data by source name. Use `get` method with DOI instead."
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param xml [String]
|
|
35
|
+
# @return [Bib::ItemData]
|
|
36
|
+
def from_xml(xml)
|
|
37
|
+
require_relative "../doi"
|
|
38
|
+
Bib::Item.from_xml xml
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param yaml [String]
|
|
42
|
+
# @return [Bib::ItemData]
|
|
43
|
+
def from_yaml(yaml)
|
|
44
|
+
require_relative "../doi"
|
|
45
|
+
Bib::Item.from_yaml yaml
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns hash of XML grammar
|
|
49
|
+
# @return [String]
|
|
50
|
+
def grammar_hash
|
|
51
|
+
require_relative "../doi"
|
|
52
|
+
@grammar_hash ||= ::Relaton::Doi.grammar_hash
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def remove_index_file
|
|
56
|
+
require_relative "../doi" # defines Util — needed when called cold
|
|
57
|
+
Util.info "This processor does not support index file. No action taken."
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns number of threads
|
|
61
|
+
# @return [Integer]
|
|
62
|
+
def threads = 2
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
data/lib/relaton/doi.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "relaton/bipm"
|
|
4
|
+
require "relaton/ietf"
|
|
5
|
+
require "relaton/ieee"
|
|
6
|
+
require "relaton/nist"
|
|
7
|
+
require_relative "version"
|
|
8
|
+
require_relative "doi/util"
|
|
9
|
+
require_relative "doi/parser"
|
|
10
|
+
require_relative "doi/crossref"
|
|
11
|
+
|
|
12
|
+
module Relaton
|
|
13
|
+
module Doi
|
|
14
|
+
extend self
|
|
15
|
+
|
|
16
|
+
def grammar_hash
|
|
17
|
+
Digest::MD5.hexdigest Relaton::VERSION
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require "net/http"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Easc
|
|
5
|
+
# Index-backed retrieval for the EASC flavor (no scraping). Mirrors
|
|
6
|
+
# Relaton::Oiml::Bibliography: it parses the reference with
|
|
7
|
+
# Pubid::Easc, narrows the pre-built `relaton-data-easc` index by
|
|
8
|
+
# number, fetches the matching per-document YAML over Net::HTTP, and
|
|
9
|
+
# deserializes it into a Relaton::Easc::Item.
|
|
10
|
+
module Bibliography
|
|
11
|
+
ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-easc/main/".freeze
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
#
|
|
15
|
+
# Search for an EASC publication by its identifier.
|
|
16
|
+
#
|
|
17
|
+
# @param text [String, Pubid::Easc::Identifier] the EASC reference to
|
|
18
|
+
# look up (e.g. "ПМГ 03-2025", "РМГ 151-2025", or the Latin
|
|
19
|
+
# transliteration "PMG 03-2025")
|
|
20
|
+
# @param year [String, nil] the edition year (optional; usually embedded
|
|
21
|
+
# in the reference)
|
|
22
|
+
# @param _opts [Hash] options (unused)
|
|
23
|
+
#
|
|
24
|
+
# @return [Relaton::Easc::Item, nil] the publication or nil if not found
|
|
25
|
+
#
|
|
26
|
+
def search(text, year = nil, _opts = {})
|
|
27
|
+
pubid = text.is_a?(String) ? ::Pubid::Easc.parse(text) : text
|
|
28
|
+
Util.info "Fetching from Relaton repository ...", key: pubid.to_s
|
|
29
|
+
# Pass the pubid so Relaton::Index narrows candidates by number via
|
|
30
|
+
# binary search before applying the block. Every row's `:id` is a
|
|
31
|
+
# Pubid::Easc::Identifier (deserialized via the `pubid_class` passed to
|
|
32
|
+
# #index), so the block compares pubids and picks the latest edition.
|
|
33
|
+
row = index.search(pubid) { |r| pubid_match?(r[:id], pubid, year) }
|
|
34
|
+
.max_by { |r| r[:id].year.to_i }
|
|
35
|
+
unless row
|
|
36
|
+
Util.info "Not found.", key: pubid.to_s
|
|
37
|
+
return
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
uri = URI("#{ENDPOINT}#{row[:file]}")
|
|
41
|
+
resp = Net::HTTP.get_response uri
|
|
42
|
+
unless resp.code == "200"
|
|
43
|
+
raise Relaton::RequestError, "Could not access #{uri}: HTTP #{resp.code}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
item = Relaton::Easc::Item.from_yaml resp.body
|
|
47
|
+
Util.info "Found: `#{item.docidentifier.first&.content}`", key: pubid.to_s
|
|
48
|
+
item.tap { |i| i.fetched = Date.today.to_s }
|
|
49
|
+
rescue SocketError, Errno::EINVAL, Errno::ECONNRESET, EOFError,
|
|
50
|
+
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
|
|
51
|
+
Net::ProtocolError, Net::ReadTimeout, OpenSSL::SSL::SSLError,
|
|
52
|
+
Errno::ETIMEDOUT => e
|
|
53
|
+
raise Relaton::RequestError, "Could not access #{uri}: #{e.message}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Fetch an EASC publication. EASC citations are always dated
|
|
58
|
+
# (e.g. "ПМГ 03-2025"), so there is no undated/most-recent handling to
|
|
59
|
+
# mirror from the ISO/OIML fetchers — `get` just returns what `search`
|
|
60
|
+
# resolves.
|
|
61
|
+
#
|
|
62
|
+
# @see #search
|
|
63
|
+
#
|
|
64
|
+
def get(ref, year = nil, opts = {})
|
|
65
|
+
search(ref, year, opts)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def index
|
|
71
|
+
Relaton::Index.find_or_create(
|
|
72
|
+
:easc,
|
|
73
|
+
url: "#{ENDPOINT}#{INDEXFILE}.zip",
|
|
74
|
+
file: "#{INDEXFILE}.yaml",
|
|
75
|
+
pubid_class: ::Pubid::Easc::Identifier,
|
|
76
|
+
)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Both `row_id` and `query` are Pubid::Easc::Identifier instances. A row
|
|
80
|
+
# matches when its series, defense variant, and number are equal (so a
|
|
81
|
+
# ПМГ never matches a РМГ, and the «В» defense variant never matches the
|
|
82
|
+
# plain series). Year is nil-tolerant: an unqualified query finds the
|
|
83
|
+
# latest edition (selected by `max_by` in #search); the `year` argument
|
|
84
|
+
# lets a caller pin an edition the reference string omitted.
|
|
85
|
+
def pubid_match?(row_id, query, year)
|
|
86
|
+
wanted_year = (query.year || year)&.to_s
|
|
87
|
+
row_id.series == query.series &&
|
|
88
|
+
row_id.variant.to_s == query.variant.to_s &&
|
|
89
|
+
row_id.number.to_s == query.number.to_s &&
|
|
90
|
+
(wanted_year.nil? || row_id.year.to_s == wanted_year)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Easc
|
|
3
|
+
# Structured EASC document identifier. The docid string is the canonical
|
|
4
|
+
# citation form (e.g. "ПМГ 03-2025", "РМГ 151-2025"), parsed into a
|
|
5
|
+
# `Pubid::Easc::Identifier` kept in `@pubid` while the lutaml `content`
|
|
6
|
+
# attribute stays a plain string for serialization.
|
|
7
|
+
#
|
|
8
|
+
# Parsing is **soft**: `content=` lazily requires pubid and rescues
|
|
9
|
+
# `LoadError`/`StandardError`, so a missing gem or non-EASC content leaves
|
|
10
|
+
# `@pubid` nil rather than raising.
|
|
11
|
+
#
|
|
12
|
+
# This was an empty subclass, which meant it inherited
|
|
13
|
+
# `Bib::Docidentifier`'s abstract `remove_part!` / `remove_date!` /
|
|
14
|
+
# `to_all_parts!`. `Bib::ItemData` broadcasts all three to every
|
|
15
|
+
# docidentifier, so `#to_all_parts` and `#to_most_recent_reference` raised
|
|
16
|
+
# `NotImplementedError` on **every** EASC item — and it descends from
|
|
17
|
+
# `ScriptError`, so a caller's `rescue => e` did not catch it.
|
|
18
|
+
class Docidentifier < Bib::Docidentifier
|
|
19
|
+
attr_reader :pubid
|
|
20
|
+
|
|
21
|
+
# Capture the inherited content setter before overriding #content=, so
|
|
22
|
+
# #refresh_content! can write the re-rendered string back WITHOUT
|
|
23
|
+
# re-parsing (a re-parse would rebuild @pubid and discard in-place
|
|
24
|
+
# mutations such as `all_parts = true`).
|
|
25
|
+
alias_method :store_content, :content=
|
|
26
|
+
|
|
27
|
+
def initialize(attrs = {}, options = {})
|
|
28
|
+
pubid = attrs.is_a?(Hash) ? attrs.delete(:pubid) : nil
|
|
29
|
+
attrs[:content] ||= pubid.to_s if pubid
|
|
30
|
+
super
|
|
31
|
+
@pubid = pubid if pubid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def content=(value)
|
|
35
|
+
super
|
|
36
|
+
return unless value
|
|
37
|
+
|
|
38
|
+
@pubid = begin
|
|
39
|
+
require "pubid"
|
|
40
|
+
::Pubid::Easc.parse(value)
|
|
41
|
+
rescue LoadError, StandardError
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# `Pubid::Easc::Identifier` models publisher/series/variant/number/year,
|
|
47
|
+
# so the mapping is EASC-specific:
|
|
48
|
+
#
|
|
49
|
+
# - **`remove_date!` → clears `year`.** EASC carries no separate date
|
|
50
|
+
# component; the year is the edition discriminator, so clearing it
|
|
51
|
+
# yields the undated ("most recent") reference: `ПМГ 03-2025` →
|
|
52
|
+
# `ПМГ 03`.
|
|
53
|
+
# - **`remove_part!` → clears the (unused) `part`/`subpart`.** EASC models
|
|
54
|
+
# no part, so this is a no-op for the rendered string; implemented so it
|
|
55
|
+
# never raises, and it starts working if pubid-easc ever adds one.
|
|
56
|
+
# - **`to_all_parts!` → both, then wraps `@pubid` in pubid's `AllParts`.**
|
|
57
|
+
# `content` stays the plain stripped id — EASC's own renderer has no
|
|
58
|
+
# "(all parts)" marker, and `content` is cached from the pre-wrap
|
|
59
|
+
# pubid on purpose. `#pubid` itself, read directly, now answers
|
|
60
|
+
# `all_parts? == true` and renders WITH pubid's generic marker
|
|
61
|
+
# (`#to_s`), since it's the wrapper.
|
|
62
|
+
#
|
|
63
|
+
# All three no-op safely when `@pubid` is nil.
|
|
64
|
+
|
|
65
|
+
def remove_part!
|
|
66
|
+
clear_attr!(:part)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def remove_date!
|
|
70
|
+
clear_attr!(:year)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def to_all_parts!
|
|
74
|
+
return if !@pubid || @pubid.all_parts?
|
|
75
|
+
|
|
76
|
+
# `#exclude` (no args) rebuilds a full independent copy — `remove_part!`
|
|
77
|
+
# / `remove_date!` mutate `@pubid` in place, so a bare reference here
|
|
78
|
+
# would lose the original year to that mutation too.
|
|
79
|
+
original = @pubid.exclude
|
|
80
|
+
remove_part!
|
|
81
|
+
remove_date!
|
|
82
|
+
@pubid = original.to_all_parts
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
def clear_attr!(attr)
|
|
88
|
+
return unless @pubid && @pubid.respond_to?("#{attr}=")
|
|
89
|
+
|
|
90
|
+
@pubid.public_send("#{attr}=", nil)
|
|
91
|
+
@pubid.subpart = nil if attr == :part && @pubid.respond_to?(:subpart=)
|
|
92
|
+
refresh_content!
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def refresh_content!
|
|
96
|
+
store_content(@pubid.to_s) if @pubid
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Easc
|
|
3
|
+
# EASC document types. Two series, both issued by the Eurasian
|
|
4
|
+
# Economic Standards Council:
|
|
5
|
+
# * PMG — ПМГ (Правила по межгосударственной стандартизации)
|
|
6
|
+
# * RMG — РМГ (Рекомендации по межгосударственной стандартизации)
|
|
7
|
+
class Doctype < Bib::Doctype
|
|
8
|
+
TYPES = %w[
|
|
9
|
+
pmg
|
|
10
|
+
rmg
|
|
11
|
+
].freeze
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Easc
|
|
3
|
+
# EASC bibliographic item extension. Adds EASC-specific structured
|
|
4
|
+
# metadata on top of the shared Relaton::Bib::Ext so the fields
|
|
5
|
+
# round-trip through both XML and YAML without per-repo merge hacks.
|
|
6
|
+
#
|
|
7
|
+
# Fields:
|
|
8
|
+
# * urn — urn:easc:<series>:...
|
|
9
|
+
# * webpage — mgscatalog.by detail URL
|
|
10
|
+
# * session — МГС council session that adopted the doc
|
|
11
|
+
# (e.g. "67МГС", "19МГС")
|
|
12
|
+
# * developer — Разработчик (e.g. "Российская Федерация")
|
|
13
|
+
# * joining_states — country codes of states that joined
|
|
14
|
+
# (collection: e.g. ["АРМ", "БЕИ", "КАЗ"])
|
|
15
|
+
# * assigned_to — Закреплен за (e.g. "МТК 536 Методология...")
|
|
16
|
+
class Ext < Bib::Ext
|
|
17
|
+
attribute :doctype, Doctype
|
|
18
|
+
attribute :urn, :string
|
|
19
|
+
attribute :webpage, :string
|
|
20
|
+
attribute :session, :string
|
|
21
|
+
attribute :developer, :string
|
|
22
|
+
attribute :joining_states, :string, collection: true, initialize_empty: true
|
|
23
|
+
attribute :assigned_to, :string
|
|
24
|
+
|
|
25
|
+
xml do
|
|
26
|
+
map_element "urn", to: :urn
|
|
27
|
+
map_element "webpage", to: :webpage
|
|
28
|
+
map_element "session", to: :session
|
|
29
|
+
map_element "developer", to: :developer
|
|
30
|
+
map_element "joining_states", to: :joining_states
|
|
31
|
+
map_element "assigned_to", to: :assigned_to
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
key_value do
|
|
35
|
+
map_element "urn", to: :urn
|
|
36
|
+
map_element "webpage", to: :webpage
|
|
37
|
+
map_element "session", to: :session
|
|
38
|
+
map_element "developer", to: :developer
|
|
39
|
+
map_element "joining_states", to: :joining_states
|
|
40
|
+
map_element "assigned_to", to: :assigned_to
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Easc
|
|
3
|
+
# EASC bibliographic item. Re-declares +ext+ to use the typed Ext
|
|
4
|
+
# subclass so EASC-specific fields round-trip natively.
|
|
5
|
+
class Item < Bib::Item
|
|
6
|
+
model ItemData
|
|
7
|
+
|
|
8
|
+
attribute :ext, Ext
|
|
9
|
+
attribute :docidentifier, Docidentifier, collection: true,
|
|
10
|
+
initialize_empty: true
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Easc
|
|
3
|
+
class ItemBase < Lutaml::Model::Serializable
|
|
4
|
+
include Bib::NamespaceHelper
|
|
5
|
+
|
|
6
|
+
attr_accessor :type
|
|
7
|
+
|
|
8
|
+
model ItemData
|
|
9
|
+
|
|
10
|
+
instance_exec(&Bib::ItemShared::ATTRIBUTES)
|
|
11
|
+
|
|
12
|
+
xml do
|
|
13
|
+
map_attribute "type", to: :type
|
|
14
|
+
instance_exec(&Bib::ItemShared::XML_BODY)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "relaton/core/processor"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Easc
|
|
5
|
+
# Relaton processor for the EASC flavor. Registered by
|
|
6
|
+
# Relaton::Db::Registry when the unified gem loads (see
|
|
7
|
+
# lib/relaton/db/registry.rb). Supports `relaton fetch easc ...`
|
|
8
|
+
# once the relaton-data-easc dataset is installed.
|
|
9
|
+
class Processor < Core::Processor
|
|
10
|
+
attr_reader :idtype
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@short = :relaton_easc
|
|
14
|
+
@prefix = "EASC"
|
|
15
|
+
# Both Cyrillic and Latin series prefixes route here.
|
|
16
|
+
@defaultprefix = %r{^(?:ПМГ|РМГ|PMG|RMG)\b}
|
|
17
|
+
@idtype = "EASC"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def get(code, date, opts)
|
|
21
|
+
require_relative "../easc"
|
|
22
|
+
Bibliography.get(code, date, opts)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def from_xml(xml)
|
|
26
|
+
require_relative "../easc"
|
|
27
|
+
Item.from_xml xml
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def from_yaml(yaml)
|
|
31
|
+
require_relative "../easc"
|
|
32
|
+
Item.from_yaml(yaml)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def grammar_hash
|
|
36
|
+
require_relative "../easc"
|
|
37
|
+
@grammar_hash ||= ::Relaton::Easc.grammar_hash
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def remove_index_file
|
|
41
|
+
require_relative "../easc"
|
|
42
|
+
Relaton::Index.find_or_create(:easc, url: true, file: "#{INDEXFILE}.yaml").remove_file
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/relaton/easc.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "relaton/bib"
|
|
4
|
+
require "relaton/index"
|
|
5
|
+
require "relaton/version"
|
|
6
|
+
require "pubid"
|
|
7
|
+
|
|
8
|
+
# Relaton::Easc is the EASC (Евразийский экономический совет /
|
|
9
|
+
# Eurasian Economic Standards Council) flavor of the unified relaton
|
|
10
|
+
# gem. Adds typed Ext fields (urn, webpage, session, developer,
|
|
11
|
+
# joining_states) so they round-trip natively through YAML and XML
|
|
12
|
+
# without per-repo merge hacks.
|
|
13
|
+
module Relaton
|
|
14
|
+
module Easc
|
|
15
|
+
INDEXFILE = "index-v2".freeze
|
|
16
|
+
|
|
17
|
+
class Error < StandardError; end
|
|
18
|
+
|
|
19
|
+
autoload :Doctype, "relaton/easc/doctype"
|
|
20
|
+
autoload :Ext, "relaton/easc/ext"
|
|
21
|
+
autoload :ItemData, "relaton/easc/item_data"
|
|
22
|
+
autoload :ItemBase, "relaton/easc/item_base"
|
|
23
|
+
autoload :Item, "relaton/easc/item"
|
|
24
|
+
autoload :Bibitem, "relaton/easc/bibitem"
|
|
25
|
+
autoload :Bibdata, "relaton/easc/bibdata"
|
|
26
|
+
autoload :Docidentifier, "relaton/easc/docidentifier"
|
|
27
|
+
autoload :Util, "relaton/easc/util"
|
|
28
|
+
autoload :Bibliography, "relaton/easc/bibliography"
|
|
29
|
+
autoload :Processor, "relaton/easc/processor"
|
|
30
|
+
|
|
31
|
+
def self.grammar_hash
|
|
32
|
+
Digest::MD5.hexdigest Relaton::VERSION
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# frozen_string_literal:true
|
|
2
|
+
|
|
3
|
+
require "mechanize"
|
|
4
|
+
|
|
5
|
+
module Relaton
|
|
6
|
+
module Ecma
|
|
7
|
+
# ECMA bibliography module
|
|
8
|
+
module Bibliography
|
|
9
|
+
ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-ecma/refs/heads/v2/"
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
# @return [Relaton::Index::Type]
|
|
13
|
+
def index
|
|
14
|
+
Relaton::Index.find_or_create(
|
|
15
|
+
:ECMA, url: "#{ENDPOINT}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml",
|
|
16
|
+
pubid_class: ::Pubid::Ecma::Identifier
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Search the index for a reference.
|
|
22
|
+
#
|
|
23
|
+
# **The pubid is passed to `Index::Type#search`, not the string.**
|
|
24
|
+
# `search_candidates` narrows only when the argument is not a `String`,
|
|
25
|
+
# and a block alone never narrows — so the plain string this used to
|
|
26
|
+
# pass disabled the binary search however the index was built.
|
|
27
|
+
# `pubid_class:` on the index alone fixes nothing; both had to change
|
|
28
|
+
# together.
|
|
29
|
+
#
|
|
30
|
+
# A reference pubid cannot parse finds nothing. There is deliberately no
|
|
31
|
+
# substring-scan fallback here (the OGC idiom): an ECMA id renders as
|
|
32
|
+
# `ECMA-262 ed17`, so a substring scan would answer a truncated
|
|
33
|
+
# reference like `ECMA-26` with every ECMA-26x document — an ambiguous
|
|
34
|
+
# answer is worse than none. By the same trade-off, a reference must now
|
|
35
|
+
# parse WHOLE: the old regex was unanchored at the end, so
|
|
36
|
+
# `ECMA-6 (draft)` silently resolved to ECMA-6 and now does not. See
|
|
37
|
+
# lib/relaton/ecma/CLAUDE.md for the measured table.
|
|
38
|
+
#
|
|
39
|
+
# The rows are selected with pubid's subset match `pubid === row`, the
|
|
40
|
+
# default of `Index::Type#search`. An `edition` or a `volume` that the
|
|
41
|
+
# reference omits matches any value, so a bare `ECMA-269` reaches the
|
|
42
|
+
# edition rows. pubid declares `part` strict for ECMA, so a bare
|
|
43
|
+
# `ECMA-418` does not match `ECMA-418-1`. The class must be identical,
|
|
44
|
+
# which keeps `ECMA-100` and `ECMA TR/100` apart.
|
|
45
|
+
#
|
|
46
|
+
# @param ref [String] the ECMA reference (e.g. "ECMA-6", "ECMA-269 ed3 vol2")
|
|
47
|
+
#
|
|
48
|
+
# @return [Array<Hash>] matching index rows
|
|
49
|
+
#
|
|
50
|
+
def search(ref)
|
|
51
|
+
pubid = parse_ref ref
|
|
52
|
+
return [] unless pubid
|
|
53
|
+
|
|
54
|
+
index.search(pubid)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Parse a user reference into a `Pubid::Ecma::Identifier`, or nil.
|
|
59
|
+
#
|
|
60
|
+
# `Pubid::Ecma` takes the space form (`ECMA 6`) as well as the hyphen
|
|
61
|
+
# one, and parses the ` ed<N>` / ` vol<N>` suffixes the old bespoke
|
|
62
|
+
# regex accepted, so every reference shape the flavor has to handle
|
|
63
|
+
# parses without normalization here.
|
|
64
|
+
#
|
|
65
|
+
# @param ref [String]
|
|
66
|
+
# @return [Pubid::Ecma::Identifier, nil]
|
|
67
|
+
#
|
|
68
|
+
# An unrecognized reference **raises**; like ISO, ETSI and 3GPP we let it
|
|
69
|
+
# propagate. relaton-cli rescues `Pubid::Errors::Error` and renders
|
|
70
|
+
# `"..." is not a recognized standards identifier`
|
|
71
|
+
# (`gems/relaton-cli/lib/relaton/cli/command.rb:324`), and `Db#fetch`
|
|
72
|
+
# logs it through the `StandardError` arm at `lib/relaton/db.rb:122`.
|
|
73
|
+
# Rescuing here would collapse "this identifier is malformed" into "no
|
|
74
|
+
# such document", leaving a caller unable to tell them apart.
|
|
75
|
+
def parse_ref(ref)
|
|
76
|
+
::Pubid::Ecma::Identifier.parse ref.to_s.strip
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @param code [String] the ECMA standard Code to look up (e..g "ECMA-6")
|
|
80
|
+
# @param year [String] not used
|
|
81
|
+
# @param opts [Hash] not used
|
|
82
|
+
# @return [Relaton::Ecma::ItemData] Relaton of reference
|
|
83
|
+
def get(code, _year = nil, _opts = {})
|
|
84
|
+
Util.info "Fetching from Relaton repository ...", key: code
|
|
85
|
+
result = fetch_doc(code)
|
|
86
|
+
if result
|
|
87
|
+
Util.info "Found: `#{result.docidentifier.first.content}`", key: code
|
|
88
|
+
else
|
|
89
|
+
Util.info "Not found.", key: code
|
|
90
|
+
end
|
|
91
|
+
result
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
#
|
|
97
|
+
# The index row for a reference: latest edition, then lowest volume.
|
|
98
|
+
#
|
|
99
|
+
# That is the selection order the bespoke `compare_edition_volume` +
|
|
100
|
+
# `min` implemented, kept deliberately — but the edition is now compared
|
|
101
|
+
# segment-wise as INTEGERS. Comparing the rendered strings made "9" beat
|
|
102
|
+
# "17" and "5" beat "5.1", so 5 of the 421 document families returned an
|
|
103
|
+
# older document than the reference asked for: ECMA-262 answered ed9
|
|
104
|
+
# (2018-06) where ed17 (2026-06) exists, ECMA-74 ed9 (2005-12) where
|
|
105
|
+
# ed22 (2025-12) exists, and likewise 402, 328 and 109.
|
|
106
|
+
#
|
|
107
|
+
# `r[:file]` breaks the tie, because the index sort is not stable.
|
|
108
|
+
#
|
|
109
|
+
# @param ref [String]
|
|
110
|
+
# @return [Hash, nil]
|
|
111
|
+
#
|
|
112
|
+
def best_match(ref)
|
|
113
|
+
search(ref).max_by { |r| [edition_key(r[:id].edition), -r[:id].volume.to_i, r[:file]] }
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# Order key for an ECMA edition: its dot-separated segments as integers.
|
|
118
|
+
#
|
|
119
|
+
# `[]` for an absent edition, which therefore sorts below every present
|
|
120
|
+
# one — right for the 64 edition-less rows (mementos, a few reports),
|
|
121
|
+
# none of which shares a document with an edition-bearing row.
|
|
122
|
+
#
|
|
123
|
+
# @param edition [String, nil]
|
|
124
|
+
# @return [Array<Integer>]
|
|
125
|
+
#
|
|
126
|
+
def edition_key(edition)
|
|
127
|
+
edition.to_s.split(".").map(&:to_i)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def fetch_doc(code)
|
|
131
|
+
row = best_match code
|
|
132
|
+
return unless row
|
|
133
|
+
|
|
134
|
+
url = "#{ENDPOINT}#{row[:file]}"
|
|
135
|
+
resp = Mechanize.new.get(url)
|
|
136
|
+
Item.from_yaml(resp.body).tap { |item| item.fetched = Date.today.to_s }
|
|
137
|
+
rescue Mechanize::ResponseCodeError => e
|
|
138
|
+
return if e.response_code == "404"
|
|
139
|
+
|
|
140
|
+
raise Relaton::RequestError, "No document found for #{code} reference. #{e.message}"
|
|
141
|
+
rescue Mechanize::RedirectLimitReachedError, Timeout::Error,
|
|
142
|
+
Mechanize::UnauthorizedError, Mechanize::UnsupportedSchemeError,
|
|
143
|
+
Mechanize::ResponseReadError, Mechanize::ChunkedTerminationError => e
|
|
144
|
+
raise Relaton::RequestError, "No document found for #{code} reference. #{e.message}"
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|