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,49 @@
|
|
|
1
|
+
require "weakref"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Core
|
|
5
|
+
class Hit
|
|
6
|
+
# @return [RelatonBib::HitCollection]
|
|
7
|
+
attr_accessor :hit_collection
|
|
8
|
+
|
|
9
|
+
# @return [Array<Hash>]
|
|
10
|
+
attr_reader :hit
|
|
11
|
+
|
|
12
|
+
# @param hit [Hash]
|
|
13
|
+
# @param hit_collection [RelatonBib::HitCollection]
|
|
14
|
+
def initialize(hit, hit_collection = nil)
|
|
15
|
+
@hit = hit
|
|
16
|
+
@hit_collection = WeakRef.new hit_collection if hit_collection
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [String]
|
|
20
|
+
def to_s
|
|
21
|
+
inspect
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [String]
|
|
25
|
+
def inspect
|
|
26
|
+
"<#{self.class}:#{format('%<id>#.14x', id: object_id << 1)} " \
|
|
27
|
+
"@reference=\"#{@hit_collection&.ref}\" " \
|
|
28
|
+
"@fetched=\"#{fetched?}\" " \
|
|
29
|
+
"@docidentifier=\"#{@hit[:code]}\">"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [RelatonBib::ItemData]
|
|
33
|
+
def item
|
|
34
|
+
raise "Not implemented"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def fetched?
|
|
38
|
+
!@item.nil?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param opts [Hash]
|
|
42
|
+
# @option opts [Boolean] :bibdata
|
|
43
|
+
# @return [String] XML
|
|
44
|
+
def to_xml(**opts)
|
|
45
|
+
item.to_xml(**opts)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require "forwardable"
|
|
2
|
+
require "nokogiri"
|
|
3
|
+
require "weakref"
|
|
4
|
+
require_relative "hit"
|
|
5
|
+
|
|
6
|
+
module Relaton
|
|
7
|
+
module Core
|
|
8
|
+
class HitCollection
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
def_delegators :@array, :<<, :[], :first, :empty?, :any?, :size, :each, :each_slice, :reduce, :map
|
|
12
|
+
|
|
13
|
+
# @return [TrueClass, FalseClass]
|
|
14
|
+
attr_reader :fetched
|
|
15
|
+
|
|
16
|
+
# @return [String]
|
|
17
|
+
attr_reader :ref
|
|
18
|
+
|
|
19
|
+
# @return [String]
|
|
20
|
+
attr_reader :year
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# @param ref [String, Pubid] reference to search
|
|
24
|
+
# @param year [String, nil] year of publication
|
|
25
|
+
#
|
|
26
|
+
def initialize(ref, year = nil)
|
|
27
|
+
@array = []
|
|
28
|
+
@ref = ref
|
|
29
|
+
@year = year
|
|
30
|
+
@fetched = false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Fetches hits from the data source
|
|
35
|
+
#
|
|
36
|
+
# @return [self] self object
|
|
37
|
+
#
|
|
38
|
+
def fetch
|
|
39
|
+
workers = WorkersPool.new 4
|
|
40
|
+
workers.worker(&:item)
|
|
41
|
+
each do |hit|
|
|
42
|
+
workers << hit
|
|
43
|
+
end
|
|
44
|
+
workers.end
|
|
45
|
+
workers.result
|
|
46
|
+
@fetched = true
|
|
47
|
+
self
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Renders the collection as XML
|
|
52
|
+
#
|
|
53
|
+
# @param opts [Hash] options
|
|
54
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
|
55
|
+
# @option opts [Boolean] :bibdata render bibdata if true
|
|
56
|
+
# @option opts [String, Symbol] :lang language
|
|
57
|
+
#
|
|
58
|
+
# @return [String] XML representation of the collection
|
|
59
|
+
#
|
|
60
|
+
def to_xml(**opts)
|
|
61
|
+
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
|
|
62
|
+
xml.documents do
|
|
63
|
+
@array.each do |hit|
|
|
64
|
+
xml << hit.to_xml(**opts)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
builder.to_xml
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# Selects matching hits and returns a new collection
|
|
73
|
+
#
|
|
74
|
+
# @param [Proc] &block proc to select hits
|
|
75
|
+
#
|
|
76
|
+
# @return [RelatonBib::HitCollection] new hit collection
|
|
77
|
+
#
|
|
78
|
+
def select!(&block)
|
|
79
|
+
@array.select!(&block)
|
|
80
|
+
self
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def select(&block)
|
|
84
|
+
array = @array.select(&block)
|
|
85
|
+
self.class.new(@ref, @year).tap do |hc|
|
|
86
|
+
new_array = array.map do |hit|
|
|
87
|
+
hit.dup.tap { |h| h.hit_collection = WeakRef.new(hc) }
|
|
88
|
+
end
|
|
89
|
+
hc.instance_variable_set(:@array, new_array)
|
|
90
|
+
hc.instance_variable_set(:@fetched, @fetched)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def reduce!(sum, &block)
|
|
95
|
+
@array = @array.reduce sum, &block
|
|
96
|
+
self
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# Returns String representation of the collection
|
|
101
|
+
#
|
|
102
|
+
# @return [String] String representation of the collection
|
|
103
|
+
#
|
|
104
|
+
def to_s
|
|
105
|
+
inspect
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Returns String representation of the collection
|
|
110
|
+
#
|
|
111
|
+
# @return [String] String representation of the collection
|
|
112
|
+
#
|
|
113
|
+
def inspect
|
|
114
|
+
"<#{self.class}:#{format('%#.14x', object_id << 1)} @ref=#{@ref} @fetched=#{@fetched}>"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Core
|
|
5
|
+
#
|
|
6
|
+
# A process-wide, thread-safe request pacer: the whole worker pool between
|
|
7
|
+
# them starts **at most one request per `gap` seconds**.
|
|
8
|
+
#
|
|
9
|
+
# It exists because the two natural alternatives are both wrong for a
|
|
10
|
+
# crawler that has to be polite to one host:
|
|
11
|
+
#
|
|
12
|
+
# * `sleep delay` before each request (what `Relaton::Itu::DataCrawlerR`
|
|
13
|
+
# did) **adds** the delay to the server's own latency. At ITU's measured
|
|
14
|
+
# ~1.1 s response time a 1 s delay yields one request every ~2.1 s, so a
|
|
15
|
+
# ~7k-request crawl spends ~2 h of a ~4 h run doing nothing at all — and
|
|
16
|
+
# the crawl is pinned to one thread, because the pacing *is* the loop.
|
|
17
|
+
# * a per-worker gap (`Relaton::Cie::DataFetcher::Pacing`) lets N workers
|
|
18
|
+
# issue N requests per gap. That is right for CIE, where the point is to
|
|
19
|
+
# let one struggling worker slow itself without dragging the others down,
|
|
20
|
+
# and wrong here, where the budget belongs to the host.
|
|
21
|
+
#
|
|
22
|
+
# This reserves a *slot* instead: each caller takes the next free instant on
|
|
23
|
+
# a shared timeline and sleeps only until it arrives. The server's latency
|
|
24
|
+
# therefore counts toward the gap rather than being added on top, so the
|
|
25
|
+
# rate the host sees is exactly `1 / gap` no matter how many workers there
|
|
26
|
+
# are — and workers exist only to hide latency, never to raise the rate.
|
|
27
|
+
#
|
|
28
|
+
# The mutex is held for the reservation and **never across the sleep**, so a
|
|
29
|
+
# waiting worker cannot stop another from reserving.
|
|
30
|
+
#
|
|
31
|
+
# Idle time does not bank up slots: a reservation never starts earlier than
|
|
32
|
+
# "now", so a stall elsewhere in the crawl (a governor cooldown, a slow
|
|
33
|
+
# merge) cannot be repaid afterwards as a burst — which is exactly the burst
|
|
34
|
+
# that would re-trip the limiter that caused the stall.
|
|
35
|
+
#
|
|
36
|
+
# `clock:` and `sleeper:` are injectable so specs exercise the arithmetic
|
|
37
|
+
# without wall-clock waits (mirroring `Relaton::Core::Governor`).
|
|
38
|
+
#
|
|
39
|
+
class Pacer
|
|
40
|
+
# How the gap is spent.
|
|
41
|
+
#
|
|
42
|
+
# :slot (default) the gap is the minimum interval between request
|
|
43
|
+
# *starts*, shared by the pool, so the host's own latency counts
|
|
44
|
+
# toward it. Peak rate 1/gap regardless of worker count.
|
|
45
|
+
# :fixed sleep the whole gap before every request, whatever else is
|
|
46
|
+
# happening. This is what a plain `sleep delay` loop did, kept
|
|
47
|
+
# as a rollback knob: with one worker it reproduces the old
|
|
48
|
+
# request pattern exactly — one request per (gap + latency).
|
|
49
|
+
DEFAULT_MODE = :slot
|
|
50
|
+
|
|
51
|
+
# @param gap [Numeric] minimum seconds between request *starts*. Zero
|
|
52
|
+
# disables pacing entirely (used by specs and by cassette replay).
|
|
53
|
+
# @param mode [Symbol] :slot or :fixed, see DEFAULT_MODE
|
|
54
|
+
# @param clock [#call, nil] returns monotonic seconds
|
|
55
|
+
# @param sleeper [#call, nil] receives seconds to sleep
|
|
56
|
+
def initialize(gap:, mode: DEFAULT_MODE, clock: nil, sleeper: nil)
|
|
57
|
+
@clock = clock || -> { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
|
|
58
|
+
@sleeper = sleeper || ->(secs) { sleep secs }
|
|
59
|
+
@mutex = Mutex.new
|
|
60
|
+
@gap = coerce_gap(gap)
|
|
61
|
+
@mode = mode == :fixed ? :fixed : DEFAULT_MODE
|
|
62
|
+
@next = nil
|
|
63
|
+
@requests = 0
|
|
64
|
+
@slept = 0.0
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
attr_reader :gap, :mode
|
|
68
|
+
|
|
69
|
+
# @return [Integer] requests paced so far, for the run summary
|
|
70
|
+
def requests
|
|
71
|
+
@mutex.synchronize { @requests }
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @return [Float] total seconds spent waiting, for the run summary
|
|
75
|
+
def slept
|
|
76
|
+
@mutex.synchronize { @slept }
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @param secs [Numeric] the new minimum gap; takes effect on the next
|
|
80
|
+
# reservation. A negative value is clamped to zero.
|
|
81
|
+
def gap=(secs)
|
|
82
|
+
@mutex.synchronize { @gap = coerce_gap(secs) }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Clear the timeline and the counters, so the next caller goes out
|
|
86
|
+
# immediately. For specs, and for a crawl starting a fresh phase.
|
|
87
|
+
def reset!
|
|
88
|
+
@mutex.synchronize do
|
|
89
|
+
@next = nil
|
|
90
|
+
@requests = 0
|
|
91
|
+
@slept = 0.0
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
#
|
|
96
|
+
# Reserve the next slot and block until it arrives.
|
|
97
|
+
#
|
|
98
|
+
# @return [Float] seconds actually slept (0.0 when the slot was already
|
|
99
|
+
# due, which is the common case once the host is slower than the gap)
|
|
100
|
+
#
|
|
101
|
+
def wait
|
|
102
|
+
delay = @mode == :fixed ? @mutex.synchronize { @gap } : (reserve - @clock.call)
|
|
103
|
+
@mutex.synchronize { @requests += 1 }
|
|
104
|
+
return 0.0 unless delay.positive?
|
|
105
|
+
|
|
106
|
+
@sleeper.call delay
|
|
107
|
+
@mutex.synchronize { @slept += delay }
|
|
108
|
+
delay
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
|
|
113
|
+
# Claim the next instant on the shared timeline and advance it. Held under
|
|
114
|
+
# the lock; the waiting happens outside.
|
|
115
|
+
#
|
|
116
|
+
# @return [Float] the instant this caller may start its request
|
|
117
|
+
def reserve
|
|
118
|
+
@mutex.synchronize do
|
|
119
|
+
now = @clock.call
|
|
120
|
+
# `max(now)` is what stops an idle stretch from banking up slots: the
|
|
121
|
+
# timeline catches up to the present rather than paying out a burst.
|
|
122
|
+
@next = @next.nil? || @next < now ? now : @next
|
|
123
|
+
reserved = @next
|
|
124
|
+
@next += @gap
|
|
125
|
+
reserved
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def coerce_gap(secs)
|
|
130
|
+
[secs.to_f, 0.0].max
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Core
|
|
3
|
+
class Processor
|
|
4
|
+
# @rerurn [Symbol]
|
|
5
|
+
attr_reader :short
|
|
6
|
+
|
|
7
|
+
# @return [String]
|
|
8
|
+
attr_reader :prefix, :idtype
|
|
9
|
+
|
|
10
|
+
# @return [Regexp]
|
|
11
|
+
attr_reader :defaultprefix
|
|
12
|
+
|
|
13
|
+
# @return [Array<String>]
|
|
14
|
+
attr_reader :datasets
|
|
15
|
+
|
|
16
|
+
# Global document-ID prefixes this flavor owns, e.g. BSI => %w[BS BSI DD …].
|
|
17
|
+
# The source of truth is **pubid**: a flavor sets @pubid_flavor to its Pubid
|
|
18
|
+
# module name (e.g. :Iso) in #initialize, and the prefixes are read from
|
|
19
|
+
# `Pubid::<Flavor>.prefixes` — the SDO's own leading identifier tokens,
|
|
20
|
+
# including non-obvious ones (BSI `DD`) and joint forms (`ISO/IEC`). Flavors
|
|
21
|
+
# with no pubid backing fall back to the single canonical @prefix. Loaded
|
|
22
|
+
# lazily (pubid is only required on first call) and memoized. Feeds the
|
|
23
|
+
# global prefix register (Relaton.prefix_flavor). (relaton-db#103)
|
|
24
|
+
#
|
|
25
|
+
# @return [Array<String>]
|
|
26
|
+
def prefixes
|
|
27
|
+
@prefixes ||= if @pubid_flavor
|
|
28
|
+
require "pubid"
|
|
29
|
+
::Pubid.const_get(@pubid_flavor).prefixes
|
|
30
|
+
else
|
|
31
|
+
Array(prefix)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def initialize
|
|
36
|
+
raise "This is an abstract class!"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get(_code, _date, _opts)
|
|
40
|
+
raise "This is an abstract class!"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def fetch_data(_source, _opts)
|
|
44
|
+
raise "This is an abstract class!"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def from_xml(_xml)
|
|
48
|
+
raise "This is an abstract class!"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def from_yaml(_hash)
|
|
52
|
+
raise "This is an abstract class!"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def grammar_hash
|
|
56
|
+
raise "This is an abstract class!"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Retuns default number of workers. Should be overraded by childred classes if need.
|
|
60
|
+
#
|
|
61
|
+
# @return [Integer] nuber of wokrers
|
|
62
|
+
def threads
|
|
63
|
+
10
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
# Transport failure while fetching remote data; `Relaton::Db#net_retry`
|
|
3
|
+
# retries it. It depends on nothing, so `relaton/index` requires this file
|
|
4
|
+
# alone and does not load the rest of `relaton/core`.
|
|
5
|
+
#
|
|
6
|
+
# The class is named `Relaton::RequestError`, not `Relaton::Core::...`: an
|
|
7
|
+
# error raised without a message uses the class name as its message, and
|
|
8
|
+
# relaton-cli prints that message.
|
|
9
|
+
class RequestError < StandardError; end
|
|
10
|
+
|
|
11
|
+
module Core
|
|
12
|
+
RequestError = Relaton::RequestError
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Core
|
|
5
|
+
# Workers poll.
|
|
6
|
+
class WorkersPool
|
|
7
|
+
attr_accessor :nb_hits
|
|
8
|
+
|
|
9
|
+
def initialize(num_workers = 2)
|
|
10
|
+
@num_workers = num_workers < 2 ? 2 : num_workers
|
|
11
|
+
@queue = SizedQueue.new(num_workers * 2)
|
|
12
|
+
@result = []
|
|
13
|
+
@nb_hits = 0
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def worker(&block)
|
|
17
|
+
@threads = Array.new @num_workers do
|
|
18
|
+
Thread.new do
|
|
19
|
+
until (item = @queue.pop) == :END
|
|
20
|
+
@result << yield(item) if block
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def result
|
|
27
|
+
@threads.each(&:join)
|
|
28
|
+
@result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def <<(item)
|
|
32
|
+
@queue << item
|
|
33
|
+
self
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def end
|
|
37
|
+
@num_workers.times { @queue << :END }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def size
|
|
41
|
+
@result.size
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/relaton/core.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "relaton/logger"
|
|
2
|
+
require_relative "version"
|
|
3
|
+
require_relative "core/request_error"
|
|
4
|
+
require_relative "core/array_wrapper"
|
|
5
|
+
require_relative "core/hash_keys_sybolizer"
|
|
6
|
+
require_relative "core/date_parser"
|
|
7
|
+
require_relative "core/processor"
|
|
8
|
+
require_relative "core/data_fetcher"
|
|
9
|
+
require_relative "core/hit_collection"
|
|
10
|
+
require_relative "core/workers_pool"
|
|
11
|
+
require_relative "core/pacer"
|
|
12
|
+
require_relative "core/governor"
|
data/lib/relaton/db/registry.rb
CHANGED
|
@@ -11,6 +11,8 @@ module Relaton
|
|
|
11
11
|
relaton/bsi relaton/cen relaton/iana relaton/3gpp
|
|
12
12
|
relaton/oasis relaton/doi relaton/jis relaton/xsf
|
|
13
13
|
relaton/ccsds relaton/etsi relaton/isbn relaton/plateau
|
|
14
|
+
relaton/oiml relaton/jcgm relaton/easc relaton/gost relaton/adobe
|
|
15
|
+
relaton/iala
|
|
14
16
|
].freeze
|
|
15
17
|
|
|
16
18
|
include Singleton
|
|
@@ -24,10 +26,9 @@ module Relaton
|
|
|
24
26
|
|
|
25
27
|
def register_gems
|
|
26
28
|
SUPPORTED_GEMS.each do |b|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
require b
|
|
29
|
+
# Load ONLY the lightweight processor file; its heavy flavor code is
|
|
30
|
+
# lazy-required inside the processor's methods. This keeps
|
|
31
|
+
# `require "relaton"` from eagerly loading every flavor at start.
|
|
31
32
|
require "#{b}/processor"
|
|
32
33
|
register Kernel.const_get "#{gem_to_module_path(b)}::Processor"
|
|
33
34
|
rescue LoadError => e
|
|
@@ -107,8 +108,47 @@ module Relaton
|
|
|
107
108
|
nil
|
|
108
109
|
end
|
|
109
110
|
|
|
111
|
+
#
|
|
112
|
+
# Global prefix register (relaton-db#103): all processors that own the
|
|
113
|
+
# given global prefix, matched case-insensitively and exactly (unlike
|
|
114
|
+
# #class_by_ref, which matches a prefix at the start of a full reference).
|
|
115
|
+
# Ordered by registration order (SUPPORTED_GEMS), so results are
|
|
116
|
+
# deterministic. Lazy: never dereferences a flavor constant.
|
|
117
|
+
#
|
|
118
|
+
# @param prefix [String]
|
|
119
|
+
# @return [Array<Relaton::Core::Processor>]
|
|
120
|
+
#
|
|
121
|
+
def processors_by_prefix(prefix)
|
|
122
|
+
key = prefix.to_s.strip.upcase
|
|
123
|
+
processors.values.select do |processor|
|
|
124
|
+
processor.prefixes.any? { |pref| pref.upcase == key }
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Flavor modules (e.g. Relaton::Iso) that own the given global prefix.
|
|
130
|
+
# NOTE: dereferencing the returned module forces that flavor's lazy load.
|
|
131
|
+
# Callers that must stay lazy should use #processors_by_prefix instead.
|
|
132
|
+
#
|
|
133
|
+
# @param prefix [String]
|
|
134
|
+
# @return [Array<Module>]
|
|
135
|
+
#
|
|
136
|
+
def flavors_by_prefix(prefix)
|
|
137
|
+
processors_by_prefix(prefix).map { |processor| flavor_module(processor) }
|
|
138
|
+
end
|
|
139
|
+
|
|
110
140
|
private
|
|
111
141
|
|
|
142
|
+
# The flavor namespace for a processor: the module enclosing its class.
|
|
143
|
+
# Relaton::Iso::Processor -> Relaton::Iso. Derived from the class name so
|
|
144
|
+
# there's no @short string-munging and no 3gpp special case.
|
|
145
|
+
#
|
|
146
|
+
# @param processor [Relaton::Core::Processor]
|
|
147
|
+
# @return [Module]
|
|
148
|
+
def flavor_module(processor)
|
|
149
|
+
Object.const_get processor.class.name.split("::")[0..-2].join("::")
|
|
150
|
+
end
|
|
151
|
+
|
|
112
152
|
def gem_to_module_path(gem_name)
|
|
113
153
|
gem_name.split("/").map do |part|
|
|
114
154
|
part.capitalize.sub("3gpp", "ThreeGpp")
|
data/lib/relaton/db.rb
CHANGED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require "mechanize"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Doi
|
|
5
|
+
module Crossref
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
USER_AGENT = "Relaton::Doi (https://www.relaton.org/guides/doi/; mailto:open.source@ribose.com)"
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Get a document by DOI from the CrossRef API.
|
|
12
|
+
#
|
|
13
|
+
# @param [String] doi The DOI.
|
|
14
|
+
#
|
|
15
|
+
# @return [RelatonBib::BibliographicItem, RelatonIetf::IetfBibliographicItem,
|
|
16
|
+
# RelatonBipm::BipmBibliographicItem, RelatonIeee::IeeeBibliographicItem,
|
|
17
|
+
# RelatonNist::NistBibliographicItem] The bibitem.
|
|
18
|
+
#
|
|
19
|
+
def get(doi)
|
|
20
|
+
Util.info "Fetching from search.crossref.org ...", key: doi
|
|
21
|
+
id = doi.sub(%r{^doi:}, "")
|
|
22
|
+
message = get_by_id id
|
|
23
|
+
if message
|
|
24
|
+
Util.info "Found: `#{message['DOI']}`", key: doi
|
|
25
|
+
Parser.parse message
|
|
26
|
+
else
|
|
27
|
+
Util.info "Not found.", key: doi
|
|
28
|
+
nil
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Get a document by DOI from the CrossRef API.
|
|
34
|
+
#
|
|
35
|
+
# @param [String] id The DOI.
|
|
36
|
+
#
|
|
37
|
+
# @return [Hash] The document.
|
|
38
|
+
#
|
|
39
|
+
def get_by_id(id) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
40
|
+
n = 0
|
|
41
|
+
url = "https://api.crossref.org/works/#{CGI.escape(id)}"
|
|
42
|
+
loop do
|
|
43
|
+
resp = agent.get url
|
|
44
|
+
work = JSON.parse resp.body
|
|
45
|
+
return work["message"] if work["status"] == "ok"
|
|
46
|
+
|
|
47
|
+
if n > 1
|
|
48
|
+
raise Relaton::RequestError, "Crossref error: #{resp.body}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
n += 1
|
|
52
|
+
sleep backoff(resp.response, n)
|
|
53
|
+
rescue Mechanize::ResponseCodeError => e
|
|
54
|
+
return nil if e.response_code == "404"
|
|
55
|
+
|
|
56
|
+
if n > 1
|
|
57
|
+
raise Relaton::RequestError, "Crossref error: #{e.page.body}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
n += 1
|
|
61
|
+
sleep backoff(e.page.response, n)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# Seconds to wait before retry n. Crossref sends X-Rate-Limit-Interval as
|
|
67
|
+
# "1s", but a throttled response can carry no rate-limit headers at all —
|
|
68
|
+
# the 429s seen here had only Date/Content-Length/Connection. Without the
|
|
69
|
+
# floor that degenerates to `sleep 0`, i.e. hammering the endpoint that
|
|
70
|
+
# just asked us to slow down.
|
|
71
|
+
#
|
|
72
|
+
# @param [Hash, nil] headers The response headers.
|
|
73
|
+
# @param [Integer] num The attempt number.
|
|
74
|
+
#
|
|
75
|
+
# @return [Integer] Delay in seconds, at least 1.
|
|
76
|
+
#
|
|
77
|
+
def backoff(headers, num)
|
|
78
|
+
interval = headers.to_h["x-rate-limit-interval"].to_s[/\d+/].to_i
|
|
79
|
+
[interval, 1].max * num
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def agent
|
|
83
|
+
@agent ||= Mechanize.new do |a|
|
|
84
|
+
a.user_agent = USER_AGENT
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|