relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{docs/README.adoc → README.adoc} +109 -38
- data/lib/relaton/3gpp/bibdata.rb +9 -0
- data/lib/relaton/3gpp/bibitem.rb +9 -0
- data/lib/relaton/3gpp/bibliography.rb +48 -0
- data/lib/relaton/3gpp/data_fetcher.rb +255 -0
- data/lib/relaton/3gpp/doctype.rb +9 -0
- data/lib/relaton/3gpp/ext.rb +31 -0
- data/lib/relaton/3gpp/item.rb +12 -0
- data/lib/relaton/3gpp/item_data.rb +15 -0
- data/lib/relaton/3gpp/parser.rb +400 -0
- data/lib/relaton/3gpp/processor.rb +68 -0
- data/lib/relaton/3gpp/release.rb +34 -0
- data/lib/relaton/3gpp/util.rb +8 -0
- data/lib/relaton/3gpp.rb +25 -0
- data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
- data/lib/relaton/bib/converter/asciibib.rb +13 -0
- data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
- data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
- data/lib/relaton/bib/converter/bibtex.rb +23 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
- data/lib/relaton/bib/converter/bibxml.rb +51 -0
- data/lib/relaton/bib/hash_parser_v1.rb +767 -0
- data/lib/relaton/bib/item_data.rb +229 -0
- data/lib/relaton/bib/model/abstract.rb +16 -0
- data/lib/relaton/bib/model/address.rb +22 -0
- data/lib/relaton/bib/model/affiliation.rb +16 -0
- data/lib/relaton/bib/model/bibdata.rb +11 -0
- data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
- data/lib/relaton/bib/model/bibitem.rb +11 -0
- data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
- data/lib/relaton/bib/model/contact.rb +18 -0
- data/lib/relaton/bib/model/contribution_info.rb +15 -0
- data/lib/relaton/bib/model/contributor.rb +29 -0
- data/lib/relaton/bib/model/copyright.rb +27 -0
- data/lib/relaton/bib/model/date.rb +31 -0
- data/lib/relaton/bib/model/depiction.rb +16 -0
- data/lib/relaton/bib/model/docidentifier.rb +34 -0
- data/lib/relaton/bib/model/doctype.rb +14 -0
- data/lib/relaton/bib/model/edition.rb +14 -0
- data/lib/relaton/bib/model/ext.rb +39 -0
- data/lib/relaton/bib/model/extent.rb +16 -0
- data/lib/relaton/bib/model/formattedref.rb +43 -0
- data/lib/relaton/bib/model/full_name_type.rb +64 -0
- data/lib/relaton/bib/model/fullname.rb +11 -0
- data/lib/relaton/bib/model/ics.rb +49 -0
- data/lib/relaton/bib/model/image.rb +28 -0
- data/lib/relaton/bib/model/item.rb +96 -0
- data/lib/relaton/bib/model/item_base.rb +20 -0
- data/lib/relaton/bib/model/item_shared.rb +88 -0
- data/lib/relaton/bib/model/keyword.rb +30 -0
- data/lib/relaton/bib/model/locality.rb +18 -0
- data/lib/relaton/bib/model/locality_stack.rb +14 -0
- data/lib/relaton/bib/model/localized_string.rb +48 -0
- data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
- data/lib/relaton/bib/model/logo.rb +14 -0
- data/lib/relaton/bib/model/medium.rb +22 -0
- data/lib/relaton/bib/model/note.rb +16 -0
- data/lib/relaton/bib/model/organization.rb +13 -0
- data/lib/relaton/bib/model/organization_type.rb +42 -0
- data/lib/relaton/bib/model/person.rb +36 -0
- data/lib/relaton/bib/model/phone.rb +14 -0
- data/lib/relaton/bib/model/place.rb +33 -0
- data/lib/relaton/bib/model/price.rb +14 -0
- data/lib/relaton/bib/model/relation.rb +43 -0
- data/lib/relaton/bib/model/series.rb +34 -0
- data/lib/relaton/bib/model/size.rb +23 -0
- data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
- data/lib/relaton/bib/model/status.rb +27 -0
- data/lib/relaton/bib/model/structured_identifier.rb +48 -0
- data/lib/relaton/bib/model/subdivision.rb +16 -0
- data/lib/relaton/bib/model/title.rb +56 -0
- data/lib/relaton/bib/model/type/plain_date.rb +16 -0
- data/lib/relaton/bib/model/type/string_date.rb +48 -0
- data/lib/relaton/bib/model/uri.rb +18 -0
- data/lib/relaton/bib/model/validity.rb +16 -0
- data/lib/relaton/bib/model/version.rb +43 -0
- data/lib/relaton/bib/namespace_helper.rb +21 -0
- data/lib/relaton/bib/sanitizer.rb +68 -0
- data/lib/relaton/bib/util.rb +18 -0
- data/lib/relaton/bib/versions.json +35 -0
- data/lib/relaton/bib.rb +48 -0
- data/lib/relaton/bipm/bibliography.rb +82 -0
- data/lib/relaton/bipm/converter/asciibib.rb +64 -0
- data/lib/relaton/bipm/data_fetcher.rb +57 -0
- data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
- data/lib/relaton/bipm/id_parser.rb +277 -0
- data/lib/relaton/bipm/item_data.rb +47 -0
- data/lib/relaton/bipm/model/bibdata.rb +9 -0
- data/lib/relaton/bipm/model/bibitem.rb +9 -0
- data/lib/relaton/bipm/model/comment_period.rb +13 -0
- data/lib/relaton/bipm/model/doctype.rb +12 -0
- data/lib/relaton/bipm/model/ext.rb +38 -0
- data/lib/relaton/bipm/model/item.rb +11 -0
- data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
- data/lib/relaton/bipm/processor.rb +69 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
- data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
- data/lib/relaton/bipm/util.rb +8 -0
- data/lib/relaton/bipm.rb +32 -0
- data/lib/relaton/bsi/bibliography.rb +124 -0
- data/lib/relaton/bsi/hit.rb +14 -0
- data/lib/relaton/bsi/hit_collection.rb +114 -0
- data/lib/relaton/bsi/item_data.rb +13 -0
- data/lib/relaton/bsi/model/bibdata.rb +8 -0
- data/lib/relaton/bsi/model/bibitem.rb +8 -0
- data/lib/relaton/bsi/model/docidentifier.rb +9 -0
- data/lib/relaton/bsi/model/doctype.rb +14 -0
- data/lib/relaton/bsi/model/ext.rb +17 -0
- data/lib/relaton/bsi/model/item.rb +17 -0
- data/lib/relaton/bsi/model/item_base.rb +22 -0
- data/lib/relaton/bsi/model/relation.rb +9 -0
- data/lib/relaton/bsi/processor.rb +42 -0
- data/lib/relaton/bsi/schema.json +24882 -0
- data/lib/relaton/bsi/scraper.rb +288 -0
- data/lib/relaton/bsi/util.rb +8 -0
- data/lib/relaton/bsi.rb +25 -0
- data/lib/relaton/calconnect/bibliography.rb +95 -0
- data/lib/relaton/calconnect/data_fetcher.rb +106 -0
- data/lib/relaton/calconnect/hit.rb +14 -0
- data/lib/relaton/calconnect/hit_collection.rb +84 -0
- data/lib/relaton/calconnect/item_data.rb +12 -0
- data/lib/relaton/calconnect/model/bibdata.rb +8 -0
- data/lib/relaton/calconnect/model/bibitem.rb +8 -0
- data/lib/relaton/calconnect/model/doctype.rb +11 -0
- data/lib/relaton/calconnect/model/ext.rb +11 -0
- data/lib/relaton/calconnect/model/item.rb +13 -0
- data/lib/relaton/calconnect/processor.rb +66 -0
- data/lib/relaton/calconnect/scraper.rb +87 -0
- data/lib/relaton/calconnect/util.rb +8 -0
- data/lib/relaton/calconnect.rb +26 -0
- data/lib/relaton/ccsds/bibliography.rb +63 -0
- data/lib/relaton/ccsds/data/fetcher.rb +247 -0
- data/lib/relaton/ccsds/data/iso_references.rb +30 -0
- data/lib/relaton/ccsds/data/parser.rb +194 -0
- data/lib/relaton/ccsds/hit.rb +24 -0
- data/lib/relaton/ccsds/hit_collection.rb +42 -0
- data/lib/relaton/ccsds/item_data.rb +9 -0
- data/lib/relaton/ccsds/model/bibdata.rb +8 -0
- data/lib/relaton/ccsds/model/bibitem.rb +8 -0
- data/lib/relaton/ccsds/model/doctype.rb +9 -0
- data/lib/relaton/ccsds/model/ext.rb +19 -0
- data/lib/relaton/ccsds/model/item.rb +13 -0
- data/lib/relaton/ccsds/processor.rb +68 -0
- data/lib/relaton/ccsds/util.rb +10 -0
- data/lib/relaton/ccsds.rb +33 -0
- data/lib/relaton/cen/bibliography.rb +121 -0
- data/lib/relaton/cen/committees.yaml +66 -0
- data/lib/relaton/cen/hit.rb +16 -0
- data/lib/relaton/cen/hit_collection.rb +68 -0
- data/lib/relaton/cen/item_data.rb +7 -0
- data/lib/relaton/cen/model/bibdata.rb +8 -0
- data/lib/relaton/cen/model/bibitem.rb +8 -0
- data/lib/relaton/cen/model/docidentifier.rb +9 -0
- data/lib/relaton/cen/model/ext.rb +11 -0
- data/lib/relaton/cen/model/item.rb +14 -0
- data/lib/relaton/cen/model/structured_identifier.rb +9 -0
- data/lib/relaton/cen/processor.rb +40 -0
- data/lib/relaton/cen/scraper.rb +210 -0
- data/lib/relaton/cen/util.rb +8 -0
- data/lib/relaton/cen.rb +29 -0
- data/lib/relaton/cie/bibdata.rb +8 -0
- data/lib/relaton/cie/bibitem.rb +8 -0
- data/lib/relaton/cie/bibliography.rb +31 -0
- data/lib/relaton/cie/data_fetcher.rb +355 -0
- data/lib/relaton/cie/ext.rb +7 -0
- data/lib/relaton/cie/item.rb +11 -0
- data/lib/relaton/cie/item_data.rb +6 -0
- data/lib/relaton/cie/processor.rb +66 -0
- data/lib/relaton/cie/scrapper.rb +39 -0
- data/lib/relaton/cie/util.rb +8 -0
- data/lib/relaton/cie.rb +28 -0
- data/lib/relaton/core/array_wrapper.rb +20 -0
- data/lib/relaton/core/data_fetcher.rb +97 -0
- data/lib/relaton/core/date_parser.rb +42 -0
- data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
- data/lib/relaton/core/hit.rb +49 -0
- data/lib/relaton/core/hit_collection.rb +118 -0
- data/lib/relaton/core/processor.rb +48 -0
- data/lib/relaton/core/workers_pool.rb +45 -0
- data/lib/relaton/core.rb +9 -0
- data/lib/relaton/db/registry.rb +4 -4
- data/lib/relaton/db.rb +0 -1
- data/lib/relaton/doi/crossref.rb +72 -0
- data/lib/relaton/doi/parser.rb +827 -0
- data/lib/relaton/doi/processor.rb +65 -0
- data/lib/relaton/doi/util.rb +8 -0
- data/lib/relaton/doi.rb +20 -0
- data/lib/relaton/ecma/bibdata.rb +8 -0
- data/lib/relaton/ecma/bibitem.rb +8 -0
- data/lib/relaton/ecma/bibliography.rb +81 -0
- data/lib/relaton/ecma/data_fetcher.rb +103 -0
- data/lib/relaton/ecma/data_parser.rb +49 -0
- data/lib/relaton/ecma/edition_parser.rb +80 -0
- data/lib/relaton/ecma/ext.rb +7 -0
- data/lib/relaton/ecma/item.rb +11 -0
- data/lib/relaton/ecma/item_data.rb +6 -0
- data/lib/relaton/ecma/memento_parser.rb +60 -0
- data/lib/relaton/ecma/page_fetcher.rb +27 -0
- data/lib/relaton/ecma/parser_common.rb +33 -0
- data/lib/relaton/ecma/processor.rb +66 -0
- data/lib/relaton/ecma/standard_parser.rb +134 -0
- data/lib/relaton/ecma/util.rb +8 -0
- data/lib/relaton/ecma.rb +24 -0
- data/lib/relaton/etsi/bibdata.rb +10 -0
- data/lib/relaton/etsi/bibitem.rb +10 -0
- data/lib/relaton/etsi/bibliography.rb +46 -0
- data/lib/relaton/etsi/data_fetcher.rb +128 -0
- data/lib/relaton/etsi/data_parser.rb +208 -0
- data/lib/relaton/etsi/doctype.rb +30 -0
- data/lib/relaton/etsi/ext.rb +31 -0
- data/lib/relaton/etsi/item.rb +15 -0
- data/lib/relaton/etsi/item_data.rb +6 -0
- data/lib/relaton/etsi/processor.rb +69 -0
- data/lib/relaton/etsi/pubid.rb +37 -0
- data/lib/relaton/etsi/status.rb +13 -0
- data/lib/relaton/etsi/util.rb +8 -0
- data/lib/relaton/etsi.rb +25 -0
- data/lib/relaton/gb/bibdata.rb +8 -0
- data/lib/relaton/gb/bibitem.rb +8 -0
- data/lib/relaton/gb/bibliography.rb +145 -0
- data/lib/relaton/gb/ccs.rb +14 -0
- data/lib/relaton/gb/committee.rb +13 -0
- data/lib/relaton/gb/docidentifier.rb +23 -0
- data/lib/relaton/gb/doctype.rb +9 -0
- data/lib/relaton/gb/ext.rb +36 -0
- data/lib/relaton/gb/gb_scraper.rb +61 -0
- data/lib/relaton/gb/gb_type.rb +20 -0
- data/lib/relaton/gb/hit.rb +48 -0
- data/lib/relaton/gb/hit_collection.rb +19 -0
- data/lib/relaton/gb/item.rb +13 -0
- data/lib/relaton/gb/item_data.rb +6 -0
- data/lib/relaton/gb/processor.rb +46 -0
- data/lib/relaton/gb/project_number.rb +38 -0
- data/lib/relaton/gb/scraper.rb +204 -0
- data/lib/relaton/gb/sec_scraper.rb +92 -0
- data/lib/relaton/gb/stage_name.rb +13 -0
- data/lib/relaton/gb/structured_identifier.rb +26 -0
- data/lib/relaton/gb/t_scraper.rb +126 -0
- data/lib/relaton/gb/util.rb +8 -0
- data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
- data/lib/relaton/gb.rb +33 -0
- data/lib/relaton/iana/bibdata.rb +8 -0
- data/lib/relaton/iana/bibitem.rb +8 -0
- data/lib/relaton/iana/bibliography.rb +47 -0
- data/lib/relaton/iana/data_fetcher.rb +71 -0
- data/lib/relaton/iana/item.rb +7 -0
- data/lib/relaton/iana/item_data.rb +6 -0
- data/lib/relaton/iana/parser.rb +146 -0
- data/lib/relaton/iana/processor.rb +68 -0
- data/lib/relaton/iana/util.rb +8 -0
- data/lib/relaton/iana.rb +29 -0
- data/lib/relaton/iec/bibliography.rb +283 -0
- data/lib/relaton/iec/data_fetcher.rb +216 -0
- data/lib/relaton/iec/data_parser.rb +391 -0
- data/lib/relaton/iec/hit.rb +26 -0
- data/lib/relaton/iec/hit_collection.rb +138 -0
- data/lib/relaton/iec/item_data.rb +7 -0
- data/lib/relaton/iec/model/bibdata.rb +8 -0
- data/lib/relaton/iec/model/bibitem.rb +8 -0
- data/lib/relaton/iec/model/docidentifier.rb +131 -0
- data/lib/relaton/iec/model/doctype.rb +12 -0
- data/lib/relaton/iec/model/ext.rb +53 -0
- data/lib/relaton/iec/model/item.rb +20 -0
- data/lib/relaton/iec/model/item_base.rb +12 -0
- data/lib/relaton/iec/model/relation.rb +7 -0
- data/lib/relaton/iec/model/stage_name.rb +13 -0
- data/lib/relaton/iec/processor.rb +73 -0
- data/lib/relaton/iec/statuses.yml +199 -0
- data/lib/relaton/iec/util.rb +8 -0
- data/lib/relaton/iec.rb +98 -0
- data/lib/relaton/ieee/balloting_group.rb +13 -0
- data/lib/relaton/ieee/bibdata.rb +8 -0
- data/lib/relaton/ieee/bibitem.rb +8 -0
- data/lib/relaton/ieee/bibliography.rb +51 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml.rb +20 -0
- data/lib/relaton/ieee/data_fetcher.rb +630 -0
- data/lib/relaton/ieee/doctype.rb +9 -0
- data/lib/relaton/ieee/editorial_group.rb +19 -0
- data/lib/relaton/ieee/ext.rb +36 -0
- data/lib/relaton/ieee/idams_parser.rb +323 -0
- data/lib/relaton/ieee/item.rb +11 -0
- data/lib/relaton/ieee/item_data.rb +7 -0
- data/lib/relaton/ieee/processor.rb +68 -0
- data/lib/relaton/ieee/pub_id.rb +161 -0
- data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
- data/lib/relaton/ieee/util.rb +8 -0
- data/lib/relaton/ieee.rb +29 -0
- data/lib/relaton/ietf/bibdata.rb +8 -0
- data/lib/relaton/ietf/bibitem.rb +8 -0
- data/lib/relaton/ietf/bibliography.rb +35 -0
- data/lib/relaton/ietf/bibxml_parser.rb +232 -0
- data/lib/relaton/ietf/data_fetcher.rb +278 -0
- data/lib/relaton/ietf/doctype.rb +9 -0
- data/lib/relaton/ietf/ext.rb +63 -0
- data/lib/relaton/ietf/item.rb +16 -0
- data/lib/relaton/ietf/item_base.rb +18 -0
- data/lib/relaton/ietf/item_data.rb +6 -0
- data/lib/relaton/ietf/processing_instructions.rb +79 -0
- data/lib/relaton/ietf/processor.rb +68 -0
- data/lib/relaton/ietf/relation.rb +9 -0
- data/lib/relaton/ietf/rfc/abstract.rb +19 -0
- data/lib/relaton/ietf/rfc/author.rb +21 -0
- data/lib/relaton/ietf/rfc/entry.rb +410 -0
- data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
- data/lib/relaton/ietf/rfc/format.rb +19 -0
- data/lib/relaton/ietf/rfc/index.rb +46 -0
- data/lib/relaton/ietf/rfc/is_also.rb +21 -0
- data/lib/relaton/ietf/rfc/keywords.rb +19 -0
- data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
- data/lib/relaton/ietf/scraper.rb +68 -0
- data/lib/relaton/ietf/util.rb +8 -0
- data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
- data/lib/relaton/ietf.rb +27 -0
- data/lib/relaton/iho/bibdata.rb +8 -0
- data/lib/relaton/iho/bibitem.rb +8 -0
- data/lib/relaton/iho/bibliography.rb +114 -0
- data/lib/relaton/iho/comment_period.rb +13 -0
- data/lib/relaton/iho/docidentifier.rb +31 -0
- data/lib/relaton/iho/doctype.rb +10 -0
- data/lib/relaton/iho/ext.rb +20 -0
- data/lib/relaton/iho/hash_parser_v1.rb +144 -0
- data/lib/relaton/iho/item.rb +20 -0
- data/lib/relaton/iho/item_base.rb +18 -0
- data/lib/relaton/iho/item_data.rb +6 -0
- data/lib/relaton/iho/processor.rb +54 -0
- data/lib/relaton/iho/relation.rb +9 -0
- data/lib/relaton/iho/structured_identifier.rb +20 -0
- data/lib/relaton/iho/util.rb +8 -0
- data/lib/relaton/iho.rb +27 -0
- data/lib/relaton/index/config.rb +52 -0
- data/lib/relaton/index/file_io.rb +305 -0
- data/lib/relaton/index/file_storage.rb +61 -0
- data/lib/relaton/index/id_number.rb +30 -0
- data/lib/relaton/index/pool.rb +41 -0
- data/lib/relaton/index/type.rb +159 -0
- data/lib/relaton/index/util.rb +18 -0
- data/lib/relaton/index.rb +60 -0
- data/lib/relaton/isbn/isbn.rb +61 -0
- data/lib/relaton/isbn/open_library.rb +43 -0
- data/lib/relaton/isbn/parser.rb +88 -0
- data/lib/relaton/isbn/processor.rb +48 -0
- data/lib/relaton/isbn/util.rb +8 -0
- data/lib/relaton/isbn.rb +19 -0
- data/lib/relaton/iso/bibliography.rb +407 -0
- data/lib/relaton/iso/data_fetcher.rb +338 -0
- data/lib/relaton/iso/data_parser.rb +444 -0
- data/lib/relaton/iso/hash_parser_v1.rb +177 -0
- data/lib/relaton/iso/hit.rb +57 -0
- data/lib/relaton/iso/hit_collection.rb +184 -0
- data/lib/relaton/iso/item_data.rb +28 -0
- data/lib/relaton/iso/model/bibdata.rb +10 -0
- data/lib/relaton/iso/model/bibitem.rb +8 -0
- data/lib/relaton/iso/model/contributor.rb +6 -0
- data/lib/relaton/iso/model/contributor_info.rb +9 -0
- data/lib/relaton/iso/model/docidentifier.rb +134 -0
- data/lib/relaton/iso/model/doctype.rb +13 -0
- data/lib/relaton/iso/model/ext.rb +35 -0
- data/lib/relaton/iso/model/item.rb +17 -0
- data/lib/relaton/iso/model/item_base.rb +22 -0
- data/lib/relaton/iso/model/organization.rb +9 -0
- data/lib/relaton/iso/model/project_number.rb +22 -0
- data/lib/relaton/iso/model/relation.rb +9 -0
- data/lib/relaton/iso/model/stagename.rb +14 -0
- data/lib/relaton/iso/model/structured_identifier.rb +31 -0
- data/lib/relaton/iso/processor.rb +84 -0
- data/lib/relaton/iso/scraper.rb +619 -0
- data/lib/relaton/iso/type/pubid.rb +50 -0
- data/lib/relaton/iso/util.rb +8 -0
- data/lib/relaton/iso.rb +30 -0
- data/lib/relaton/itu/bibliography.rb +90 -0
- data/lib/relaton/itu/data_fetcher.rb +104 -0
- data/lib/relaton/itu/data_parser_r.rb +140 -0
- data/lib/relaton/itu/hit.rb +22 -0
- data/lib/relaton/itu/hit_collection.rb +127 -0
- data/lib/relaton/itu/item_data.rb +6 -0
- data/lib/relaton/itu/model/approval_stage.rb +13 -0
- data/lib/relaton/itu/model/bibdata.rb +8 -0
- data/lib/relaton/itu/model/bibitem.rb +8 -0
- data/lib/relaton/itu/model/docidentifier.rb +9 -0
- data/lib/relaton/itu/model/doctype.rb +13 -0
- data/lib/relaton/itu/model/ext.rb +47 -0
- data/lib/relaton/itu/model/item.rb +13 -0
- data/lib/relaton/itu/model/meeting.rb +13 -0
- data/lib/relaton/itu/model/meeting_date.rb +15 -0
- data/lib/relaton/itu/model/question.rb +13 -0
- data/lib/relaton/itu/model/recommendation_status.rb +11 -0
- data/lib/relaton/itu/model/structured_identifier.rb +19 -0
- data/lib/relaton/itu/processor.rb +66 -0
- data/lib/relaton/itu/pubid.rb +177 -0
- data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
- data/lib/relaton/itu/recommendation_parser.rb +161 -0
- data/lib/relaton/itu/scraper.rb +193 -0
- data/lib/relaton/itu/util.rb +8 -0
- data/lib/relaton/itu.rb +33 -0
- data/lib/relaton/jis/bibdata.rb +8 -0
- data/lib/relaton/jis/bibitem.rb +8 -0
- data/lib/relaton/jis/bibliography.rb +75 -0
- data/lib/relaton/jis/data_fetcher.rb +181 -0
- data/lib/relaton/jis/docidentifier.rb +21 -0
- data/lib/relaton/jis/doctype.rb +9 -0
- data/lib/relaton/jis/ext.rb +13 -0
- data/lib/relaton/jis/hit.rb +93 -0
- data/lib/relaton/jis/hit_collection.rb +127 -0
- data/lib/relaton/jis/item.rb +22 -0
- data/lib/relaton/jis/item_base.rb +26 -0
- data/lib/relaton/jis/item_data.rb +8 -0
- data/lib/relaton/jis/processor.rb +55 -0
- data/lib/relaton/jis/relation.rb +11 -0
- data/lib/relaton/jis/scraper.rb +232 -0
- data/lib/relaton/jis/structured_identifier.rb +13 -0
- data/lib/relaton/jis/util.rb +8 -0
- data/lib/relaton/jis.rb +33 -0
- data/lib/relaton/logger/channels/gh_issue.rb +78 -0
- data/lib/relaton/logger/config.rb +34 -0
- data/lib/relaton/logger/formatter_json.rb +8 -0
- data/lib/relaton/logger/formatter_string.rb +12 -0
- data/lib/relaton/logger/log.rb +64 -0
- data/lib/relaton/logger/log_device.rb +27 -0
- data/lib/relaton/logger/pool.rb +24 -0
- data/lib/relaton/logger.rb +18 -0
- data/lib/relaton/nist/bibdata.rb +8 -0
- data/lib/relaton/nist/bibitem.rb +8 -0
- data/lib/relaton/nist/bibliography.rb +191 -0
- data/lib/relaton/nist/comment_period.rb +15 -0
- data/lib/relaton/nist/data_fetcher.rb +84 -0
- data/lib/relaton/nist/date.rb +7 -0
- data/lib/relaton/nist/doctype.rb +7 -0
- data/lib/relaton/nist/ext.rb +16 -0
- data/lib/relaton/nist/hit.rb +18 -0
- data/lib/relaton/nist/hit_collection.rb +362 -0
- data/lib/relaton/nist/item.rb +17 -0
- data/lib/relaton/nist/item_data.rb +6 -0
- data/lib/relaton/nist/mods_parser.rb +276 -0
- data/lib/relaton/nist/processor.rb +68 -0
- data/lib/relaton/nist/pubs_export.rb +69 -0
- data/lib/relaton/nist/relation.rb +7 -0
- data/lib/relaton/nist/scraper.rb +290 -0
- data/lib/relaton/nist/series.yaml +49 -0
- data/lib/relaton/nist/util.rb +8 -0
- data/lib/relaton/nist.rb +34 -0
- data/lib/relaton/oasis/bibdata.rb +8 -0
- data/lib/relaton/oasis/bibitem.rb +8 -0
- data/lib/relaton/oasis/bibliography.rb +60 -0
- data/lib/relaton/oasis/browser_agent.rb +71 -0
- data/lib/relaton/oasis/data_fetcher.rb +94 -0
- data/lib/relaton/oasis/data_parser.rb +305 -0
- data/lib/relaton/oasis/data_parser_utils.rb +296 -0
- data/lib/relaton/oasis/data_part_parser.rb +239 -0
- data/lib/relaton/oasis/doctype.rb +7 -0
- data/lib/relaton/oasis/ext.rb +19 -0
- data/lib/relaton/oasis/item.rb +11 -0
- data/lib/relaton/oasis/item_data.rb +6 -0
- data/lib/relaton/oasis/processor.rb +68 -0
- data/lib/relaton/oasis/util.rb +8 -0
- data/lib/relaton/oasis.rb +28 -0
- data/lib/relaton/ogc/bibdata.rb +8 -0
- data/lib/relaton/ogc/bibitem.rb +8 -0
- data/lib/relaton/ogc/bibliography.rb +64 -0
- data/lib/relaton/ogc/data_fetcher.rb +110 -0
- data/lib/relaton/ogc/docidentifier.rb +6 -0
- data/lib/relaton/ogc/doctype.rb +12 -0
- data/lib/relaton/ogc/ext.rb +15 -0
- data/lib/relaton/ogc/hit.rb +18 -0
- data/lib/relaton/ogc/hit_collection.rb +36 -0
- data/lib/relaton/ogc/item.rb +13 -0
- data/lib/relaton/ogc/item_data.rb +6 -0
- data/lib/relaton/ogc/processor.rb +58 -0
- data/lib/relaton/ogc/scraper.rb +225 -0
- data/lib/relaton/ogc/util.rb +8 -0
- data/lib/relaton/ogc.rb +26 -0
- data/lib/relaton/oiml/bibdata.rb +8 -0
- data/lib/relaton/oiml/bibitem.rb +8 -0
- data/lib/relaton/oiml/bibliography.rb +94 -0
- data/lib/relaton/oiml/docidentifier.rb +33 -0
- data/lib/relaton/oiml/doctype.rb +13 -0
- data/lib/relaton/oiml/ext.rb +42 -0
- data/lib/relaton/oiml/item.rb +20 -0
- data/lib/relaton/oiml/item_base.rb +18 -0
- data/lib/relaton/oiml/item_data.rb +6 -0
- data/lib/relaton/oiml/processor.rb +54 -0
- data/lib/relaton/oiml/relation.rb +9 -0
- data/lib/relaton/oiml/util.rb +8 -0
- data/lib/relaton/oiml.rb +24 -0
- data/lib/relaton/omg/bibdata.rb +8 -0
- data/lib/relaton/omg/bibitem.rb +8 -0
- data/lib/relaton/omg/bibliography.rb +31 -0
- data/lib/relaton/omg/ext.rb +7 -0
- data/lib/relaton/omg/item.rb +8 -0
- data/lib/relaton/omg/item_data.rb +6 -0
- data/lib/relaton/omg/processor.rb +34 -0
- data/lib/relaton/omg/scraper.rb +141 -0
- data/lib/relaton/omg/util.rb +8 -0
- data/lib/relaton/omg.rb +24 -0
- data/lib/relaton/plateau/bibdata.rb +8 -0
- data/lib/relaton/plateau/bibitem.rb +8 -0
- data/lib/relaton/plateau/bibliography.rb +24 -0
- data/lib/relaton/plateau/data_fetcher.rb +153 -0
- data/lib/relaton/plateau/doctype.rb +7 -0
- data/lib/relaton/plateau/ext.rb +23 -0
- data/lib/relaton/plateau/handbook_parser.rb +95 -0
- data/lib/relaton/plateau/hit.rb +13 -0
- data/lib/relaton/plateau/hit_collection.rb +59 -0
- data/lib/relaton/plateau/item.rb +12 -0
- data/lib/relaton/plateau/item_data.rb +6 -0
- data/lib/relaton/plateau/parser.rb +101 -0
- data/lib/relaton/plateau/processor.rb +49 -0
- data/lib/relaton/plateau/technical_report_parser.rb +91 -0
- data/lib/relaton/plateau/util.rb +8 -0
- data/lib/relaton/plateau.rb +28 -0
- data/lib/relaton/un/bibdata.rb +8 -0
- data/lib/relaton/un/bibitem.rb +8 -0
- data/lib/relaton/un/bibliography.rb +48 -0
- data/lib/relaton/un/doctype.rb +10 -0
- data/lib/relaton/un/ext.rb +30 -0
- data/lib/relaton/un/hit.rb +56 -0
- data/lib/relaton/un/hit_collection.rb +61 -0
- data/lib/relaton/un/item.rb +11 -0
- data/lib/relaton/un/item_data.rb +6 -0
- data/lib/relaton/un/parser.rb +108 -0
- data/lib/relaton/un/processor.rb +38 -0
- data/lib/relaton/un/session.rb +25 -0
- data/lib/relaton/un/token_generator.rb +105 -0
- data/lib/relaton/un/util.rb +8 -0
- data/lib/relaton/un/wasm/decoder.rb +434 -0
- data/lib/relaton/un/wasm/instance.rb +101 -0
- data/lib/relaton/un/wasm/interpreter.rb +613 -0
- data/lib/relaton/un/wasm/memory.rb +112 -0
- data/lib/relaton/un/wasm/module.rb +47 -0
- data/lib/relaton/un/wasm.rb +17 -0
- data/lib/relaton/un/wasm_v_bg.wasm +0 -0
- data/lib/relaton/un.rb +28 -0
- data/lib/relaton/version.rb +1 -1
- data/lib/relaton/w3c/bibdata.rb +8 -0
- data/lib/relaton/w3c/bibitem.rb +8 -0
- data/lib/relaton/w3c/bibliography.rb +54 -0
- data/lib/relaton/w3c/data_fetcher.rb +309 -0
- data/lib/relaton/w3c/data_parser.rb +379 -0
- data/lib/relaton/w3c/doctype.rb +7 -0
- data/lib/relaton/w3c/ext.rb +11 -0
- data/lib/relaton/w3c/item.rb +12 -0
- data/lib/relaton/w3c/item_data.rb +6 -0
- data/lib/relaton/w3c/processor.rb +49 -0
- data/lib/relaton/w3c/pubid.rb +73 -0
- data/lib/relaton/w3c/safe_realize.rb +59 -0
- data/lib/relaton/w3c/util.rb +8 -0
- data/lib/relaton/w3c.rb +25 -0
- data/lib/relaton/xsf/bibdata.rb +8 -0
- data/lib/relaton/xsf/bibitem.rb +8 -0
- data/lib/relaton/xsf/bibliography.rb +24 -0
- data/lib/relaton/xsf/data_fetcher.rb +56 -0
- data/lib/relaton/xsf/hit.rb +17 -0
- data/lib/relaton/xsf/hit_collection.rb +24 -0
- data/lib/relaton/xsf/item.rb +7 -0
- data/lib/relaton/xsf/item_data.rb +6 -0
- data/lib/relaton/xsf/processor.rb +50 -0
- data/lib/relaton/xsf/util.rb +9 -0
- data/lib/relaton/xsf.rb +30 -0
- data/lib/relaton-core.rb +1 -0
- data/lib/relaton.rb +43 -0
- metadata +673 -170
- data/.github/workflows/rake.yml +0 -14
- data/.github/workflows/release.yml +0 -24
- data/.github/workflows/rubocop.yml +0 -48
- data/.gitignore +0 -12
- data/.rspec +0 -3
- data/CLAUDE.md +0 -78
- data/Gemfile +0 -29
- data/Rakefile +0 -6
- data/docs/CHANGELOG.adoc +0 -16
- data/docs/VERSIONING_POLICY.adoc +0 -38
- data/docs/navigation.adoc +0 -6
- data/lib/relaton/db/version.rb +0 -5
- data/relaton.gemspec +0 -72
- data/spec/relaton/config_spec.rb +0 -10
- data/spec/relaton/db_cache_spec.rb +0 -51
- data/spec/relaton/db_spec.rb +0 -567
- data/spec/relaton/registry_spec.rb +0 -178
- data/spec/relaton/util_spec.rb +0 -3
- data/spec/relaton_meta_spec.rb +0 -25
- data/spec/relaton_spec.rb +0 -800
- data/spec/spec_helper.rb +0 -45
- data/spec/support/gb_t_20223_2006.xml +0 -33
- data/spec/support/iso_111111119115_1.xml +0 -0
- data/spec/support/iso_19115_1.xml +0 -115
- data/spec/support/iso_19115_2.xml +0 -95
- data/spec/support/rfc_8341.xml +0 -46
- data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
- data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
- data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
- data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
- data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
- data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
- data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
- data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
- data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
- data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
- data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
- data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
- data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Ietf
|
|
3
|
+
module BibXMLParser # rubocop:disable Metrics/ModuleLength
|
|
4
|
+
extend self
|
|
5
|
+
|
|
6
|
+
def parse(xml)
|
|
7
|
+
reference = Rfcxml::V3::Reference.from_xml(xml)
|
|
8
|
+
FromRfcxml.new(reference).transform
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def parse_rfc(xml)
|
|
12
|
+
rfc = Rfcxml::V3::Rfc.from_xml(xml)
|
|
13
|
+
FromRfc.new(rfc).transform
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def pubid_type(id)
|
|
17
|
+
pref = id.match(/^(\S+)/)[1]
|
|
18
|
+
case pref
|
|
19
|
+
when "BCP", "FYI", "STD", "RFC" then "RFC"
|
|
20
|
+
when "I-D" then "Internet-Draft"
|
|
21
|
+
else "IETF"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def full_name_org(name) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
26
|
+
case name
|
|
27
|
+
when "ISO"
|
|
28
|
+
build_org(name, "International Organization for Standardization")
|
|
29
|
+
when "IAB"
|
|
30
|
+
build_org(name, "Internet Architecture Board")
|
|
31
|
+
when "IESG"
|
|
32
|
+
build_org(name, "Internet Engineering Steering Group")
|
|
33
|
+
when "IANA"
|
|
34
|
+
build_org(name, "Internet Assigned Numbers Authority")
|
|
35
|
+
when "International Organization for Standardization"
|
|
36
|
+
build_org("ISO", name)
|
|
37
|
+
when "Federal Networking Council", "Internet Architecture Board", "Internet Activities Board",
|
|
38
|
+
"Defense Advanced Research Projects Agency", "National Science Foundation",
|
|
39
|
+
"National Research Council", "National Bureau of Standards",
|
|
40
|
+
"Internet Engineering Steering Group"
|
|
41
|
+
abbr = name.split.map { |w| w[0] if w[0] == w[0].upcase }.join
|
|
42
|
+
build_org(abbr, name)
|
|
43
|
+
when "IETF Secretariat"
|
|
44
|
+
build_org("IETF", name)
|
|
45
|
+
when "Audio-Video Transport Working Group", /North American Directory Forum/, "EARN Staff",
|
|
46
|
+
"Vietnamese Standardization Working Group", "ACM SIGUCCS", "ESCC X.500/X.400 Task Force",
|
|
47
|
+
"Sun Microsystems", "NetBIOS Working Group in the Defense Advanced Research Projects Agency",
|
|
48
|
+
"End-to-End Services Task Force", "Network Technical Advisory Group", "Bolt Beranek",
|
|
49
|
+
"Newman Laboratories", "Gateway Algorithms and Data Structures Task Force",
|
|
50
|
+
"Network Information Center. Stanford Research Institute", "RFC Editor",
|
|
51
|
+
"Information Sciences Institute University of Southern California", "IAB and IESG",
|
|
52
|
+
"RARE WG-MSG Task Force 88", "KOI8-U Working Group", "The Internet Society",
|
|
53
|
+
"IAB Advisory Committee", "ISOC Board of Trustees", "Mitra", "RFC Editor, et al."
|
|
54
|
+
build_org(nil, name)
|
|
55
|
+
when "Internet Assigned Numbers Authority (IANA)"
|
|
56
|
+
build_org("IANA", "Internet Assigned Numbers Authority (IANA)")
|
|
57
|
+
when "ESnet Site Coordinating Comittee (ESCC)"
|
|
58
|
+
build_org("ESCC", "ESnet Site Coordinating Comittee (ESCC)")
|
|
59
|
+
when "Energy Sciences Network (ESnet)"
|
|
60
|
+
build_org("ESnet", "Energy Sciences Network (ESnet)")
|
|
61
|
+
when "International Telegraph and Telephone Consultative Committee of the International Telecommunication Union"
|
|
62
|
+
build_org("CCITT", name)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def build_org(abbr, name)
|
|
67
|
+
args = { name: [Bib::TypedLocalizedString.new(content: name, language: "en")] }
|
|
68
|
+
args[:abbreviation] = Bib::LocalizedString.new(content: abbr, language: "en") if abbr && !abbr.empty?
|
|
69
|
+
Bib::Organization.new(**args)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# Parse name, surname, and initials from full name
|
|
74
|
+
#
|
|
75
|
+
# @param [String] fname full name
|
|
76
|
+
# @param [String, nil] sname surname
|
|
77
|
+
# @param [String, nil] inits
|
|
78
|
+
#
|
|
79
|
+
# @return [Array<String, nil>] surname, initials, forename
|
|
80
|
+
#
|
|
81
|
+
def parse_surname_initials(fname, sname, inits) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
82
|
+
regex = /(?:(?<name>\w{3,})\s)?(?<inits>(?:[A-Z]{1,2}(?:\.[\s-]?|\s))+)?/
|
|
83
|
+
match = fname&.match(regex)
|
|
84
|
+
surname = sname || fname&.sub(regex, "")&.strip
|
|
85
|
+
initials = inits || (match && match[:inits]&.strip)
|
|
86
|
+
[surname, initials, (match && match[:name])]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class FromRfcxml < Bib::Converter::BibXml::FromRfcxml # rubocop:disable Metrics/ClassLength
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
def pubid_type(id)
|
|
93
|
+
BibXMLParser.pubid_type(id)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def contributor # rubocop:disable Metrics/MethodLength
|
|
97
|
+
contribs = []
|
|
98
|
+
unless @reference.anchor&.match?(/^I-D/)
|
|
99
|
+
org = BibXMLParser.build_org("IETF", "Internet Engineering Task Force")
|
|
100
|
+
contribs << Bib::Contributor.new(
|
|
101
|
+
organization: org,
|
|
102
|
+
role: [Bib::Contributor::Role.new(type: "publisher")],
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
contribs + super
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def person(author)
|
|
109
|
+
return unless author.fullname && author.fullname != "None"
|
|
110
|
+
return if BibXMLParser.full_name_org(author.fullname)
|
|
111
|
+
|
|
112
|
+
super
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def organization(author)
|
|
116
|
+
if author.fullname
|
|
117
|
+
org = BibXMLParser.full_name_org(author.fullname)
|
|
118
|
+
return org if org
|
|
119
|
+
end
|
|
120
|
+
super
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def person_name(author) # rubocop:disable Metrics/MethodLength
|
|
124
|
+
fname = author.fullname
|
|
125
|
+
surname, inits, forename = BibXMLParser.parse_surname_initials(
|
|
126
|
+
fname, author.surname, author.initials
|
|
127
|
+
)
|
|
128
|
+
fnames = []
|
|
129
|
+
if forename
|
|
130
|
+
fnames << Bib::FullNameType::Forename.new(
|
|
131
|
+
content: forename, language: "en", script: "Latn",
|
|
132
|
+
)
|
|
133
|
+
end
|
|
134
|
+
if inits
|
|
135
|
+
inits.split(/\.-?\s?|\s/).each do |i|
|
|
136
|
+
fnames << Bib::FullNameType::Forename.new(
|
|
137
|
+
initial: i, language: "en", script: "Latn",
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
Bib::FullName.new(
|
|
142
|
+
completename: Bib::LocalizedString.new(content: fname, language: "en"),
|
|
143
|
+
formatted_initials: inits ? Bib::LocalizedString.new(content: inits, language: "en") : nil,
|
|
144
|
+
surname: Bib::LocalizedString.new(content: surname, language: "en"),
|
|
145
|
+
forename: fnames,
|
|
146
|
+
)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
class FromRfc < FromRfcxml # rubocop:disable Metrics/ClassLength
|
|
151
|
+
def transform # rubocop:disable Metrics/MethodLength
|
|
152
|
+
namespace::ItemData.new(
|
|
153
|
+
docnumber: doc_name&.sub(/^\w+\./, ""),
|
|
154
|
+
type: "standard",
|
|
155
|
+
docidentifier: docidentifiers,
|
|
156
|
+
status: status,
|
|
157
|
+
language: ["en"],
|
|
158
|
+
script: ["Latn"],
|
|
159
|
+
source: source,
|
|
160
|
+
title: title,
|
|
161
|
+
abstract: abstract,
|
|
162
|
+
contributor: contributor + workgroup_contributors,
|
|
163
|
+
date: date,
|
|
164
|
+
series: series,
|
|
165
|
+
keyword: keyword,
|
|
166
|
+
ext: ext,
|
|
167
|
+
)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
private
|
|
171
|
+
|
|
172
|
+
def doc_name = @reference.doc_name
|
|
173
|
+
|
|
174
|
+
def docidentifiers
|
|
175
|
+
ids = []
|
|
176
|
+
if doc_name
|
|
177
|
+
ids << Bib::Docidentifier.new(type: "Internet-Draft", content: doc_name, primary: true)
|
|
178
|
+
ids << Bib::Docidentifier.new(type: "IETF", content: doc_name, scope: "docName")
|
|
179
|
+
end
|
|
180
|
+
ids + docid_from_series_info
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def source = []
|
|
184
|
+
|
|
185
|
+
def contributor # rubocop:disable Metrics/MethodLength
|
|
186
|
+
contribs = []
|
|
187
|
+
org = BibXMLParser.build_org("IETF", "Internet Engineering Task Force")
|
|
188
|
+
contribs << Bib::Contributor.new(
|
|
189
|
+
organization: org,
|
|
190
|
+
role: [Bib::Contributor::Role.new(type: "publisher")],
|
|
191
|
+
)
|
|
192
|
+
contribs + Bib::Converter::BibXml::FromRfcxml.instance_method(:contributor).bind_call(self)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def doctype
|
|
196
|
+
namespace::Doctype.new(content: "rfc")
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def series
|
|
200
|
+
front_si = @reference.front.series_info || []
|
|
201
|
+
front_si.filter_map do |si|
|
|
202
|
+
next if si.name == "DOI" || si.stream || si.status
|
|
203
|
+
|
|
204
|
+
t = Bib::Title.new(content: si.name, language: "en", script: "Latn")
|
|
205
|
+
Bib::Series.new(title: [t], number: si.value, type: "main")
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def status
|
|
210
|
+
si = @reference.front.series_info&.find(&:status)
|
|
211
|
+
return unless si
|
|
212
|
+
|
|
213
|
+
stage = Bib::Status::Stage.new(content: si.status)
|
|
214
|
+
Bib::Status.new(stage: stage)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def versioned_internet_draft_id
|
|
218
|
+
internet_draft_series_info(@reference.front)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def docid_from_series_info
|
|
222
|
+
front_si = @reference.front.series_info || []
|
|
223
|
+
front_si.each_with_object([]) do |s, acc|
|
|
224
|
+
next unless s.name.casecmp("doi").zero?
|
|
225
|
+
|
|
226
|
+
acc << Bib::Docidentifier.new(type: "DOI", content: s.value)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
require "etc"
|
|
2
|
+
require "parallel"
|
|
3
|
+
require "relaton/core"
|
|
4
|
+
require_relative "../ietf"
|
|
5
|
+
require_relative "bibxml_parser"
|
|
6
|
+
require_relative "rfc/index"
|
|
7
|
+
require_relative "rfc/entry"
|
|
8
|
+
require_relative "wg_name_resolver"
|
|
9
|
+
|
|
10
|
+
module Relaton
|
|
11
|
+
module Ietf
|
|
12
|
+
class DataFetcher < Core::DataFetcher
|
|
13
|
+
#
|
|
14
|
+
# Fetch documents
|
|
15
|
+
#
|
|
16
|
+
def fetch(source)
|
|
17
|
+
@source = source
|
|
18
|
+
case source
|
|
19
|
+
when "ietf-rfcsubseries" then fetch_ieft_rfcsubseries
|
|
20
|
+
when "ietf-internet-drafts" then fetch_ieft_internet_drafts
|
|
21
|
+
when "ietf-rfc-entries" then fetch_ieft_rfcs
|
|
22
|
+
end
|
|
23
|
+
index.save
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def index
|
|
29
|
+
@index ||= Relaton::Index.find_or_create :IETF, file: "#{INDEXFILE}.yaml"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Fetches ietf-rfcsubseries documents
|
|
34
|
+
#
|
|
35
|
+
def fetch_ieft_rfcsubseries
|
|
36
|
+
idx = Rfc::Index.from_xml(rfc_index)
|
|
37
|
+
rfc_map = (idx.rfc_entries || []).each_with_object({}) do |entry, h|
|
|
38
|
+
h[entry.doc_id] = entry
|
|
39
|
+
end
|
|
40
|
+
idx.subseries_entries.each do |entry|
|
|
41
|
+
save_doc entry.to_item(rfc_map, wg_names: wg_names)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Fetches ietf-internet-drafts documents.
|
|
47
|
+
#
|
|
48
|
+
# Each work unit (one series, or one singleton XML) is processed
|
|
49
|
+
# end-to-end in a worker process: parse → link relations → serialize →
|
|
50
|
+
# write. Workers return Marshal-friendly index entries; the parent
|
|
51
|
+
# collects them and updates `Relaton::Index` and the duplicate-check set
|
|
52
|
+
# serially. Set `RELATON_IETF_PARALLEL_WORKERS=0` to force serial
|
|
53
|
+
# execution (useful for tests and debugging).
|
|
54
|
+
#
|
|
55
|
+
def fetch_ieft_internet_drafts
|
|
56
|
+
series_groups, singleton_paths = group_draft_paths
|
|
57
|
+
|
|
58
|
+
series_results = parallelize(series_groups.to_a) do |(series, paths_info)|
|
|
59
|
+
process_series(series, paths_info)
|
|
60
|
+
end.flatten(1)
|
|
61
|
+
|
|
62
|
+
singleton_results = parallelize(singleton_paths) do |path|
|
|
63
|
+
process_singleton(path)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
(series_results + singleton_results).compact.each { |r| record_index_entry(r) }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# Run `block` once per item, in parallel worker processes when configured.
|
|
71
|
+
# `Parallel.map(items, in_processes: 0)` runs synchronously in the
|
|
72
|
+
# current process, which keeps tests deterministic and lets mocks work.
|
|
73
|
+
#
|
|
74
|
+
def parallelize(items, &block)
|
|
75
|
+
Parallel.map(items, in_processes: worker_count, &block)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def worker_count
|
|
79
|
+
ENV.fetch("RELATON_IETF_PARALLEL_WORKERS", Etc.nprocessors.to_s).to_i
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
# Filename-only scan: group versioned drafts by normalized series stem;
|
|
84
|
+
# everything else (non-versioned, non-`D.draft-`) goes to singletons.
|
|
85
|
+
# No XML parsing happens here — workers do that.
|
|
86
|
+
#
|
|
87
|
+
# @return [Array(Hash, Array<String>)]
|
|
88
|
+
# series_groups: { normalized_series => [{path, ver, ref}, ...] }
|
|
89
|
+
# singleton_paths: [path, ...]
|
|
90
|
+
#
|
|
91
|
+
def group_draft_paths
|
|
92
|
+
series_groups = {}
|
|
93
|
+
singleton_paths = []
|
|
94
|
+
Dir["bibxml-ids/*.xml"].each do |path|
|
|
95
|
+
file = File.basename(path, ".xml")
|
|
96
|
+
is_draft = file.include?("D.draft-")
|
|
97
|
+
ver = is_draft ? file[/(\d+)$/, 1] : nil
|
|
98
|
+
ref = file.sub(/^reference\.I-D\./, "").downcase
|
|
99
|
+
stem_match = is_draft && ver ? /^(draft-.+)-(\d{2})$/.match(ref) : nil
|
|
100
|
+
if stem_match
|
|
101
|
+
series = stem_match[1].gsub(/[.\s\/:-]+/, "-")
|
|
102
|
+
(series_groups[series] ||= []) << { path: path, ver: ver, ref: ref }
|
|
103
|
+
else
|
|
104
|
+
singleton_paths << path
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
[series_groups, singleton_paths]
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# Worker: parse all files in a series, sort by version, append
|
|
112
|
+
# immediate-neighbor relations (skipped for bibxml), write each version
|
|
113
|
+
# and the un-versioned aggregator doc. Returns an array of index entries
|
|
114
|
+
# for the parent.
|
|
115
|
+
#
|
|
116
|
+
def process_series(series, paths_info)
|
|
117
|
+
sorted = paths_info.sort_by { |p| p[:ver].to_i }.map do |p|
|
|
118
|
+
bib = BibXMLParser.parse(File.read(p[:path], encoding: "UTF-8"))
|
|
119
|
+
bib.version = [Bib::Version.new(draft: p[:ver])]
|
|
120
|
+
p.merge(bib: bib, source: bib.source)
|
|
121
|
+
end
|
|
122
|
+
link_neighbor_relations(sorted) if @format != "bibxml"
|
|
123
|
+
|
|
124
|
+
results = sorted.map { |entry| serialize_and_write(entry[:bib]) }
|
|
125
|
+
results << serialize_and_write(build_unversioned_doc(series, sorted)) if @format != "bibxml"
|
|
126
|
+
results.compact
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
#
|
|
130
|
+
# Worker: parse + serialize + write a single non-grouped XML.
|
|
131
|
+
#
|
|
132
|
+
def process_singleton(path)
|
|
133
|
+
file = File.basename(path, ".xml")
|
|
134
|
+
is_draft = file.include?("D.draft-")
|
|
135
|
+
ver = is_draft ? file[/(\d+)$/, 1] : nil
|
|
136
|
+
bib = BibXMLParser.parse(File.read(path, encoding: "UTF-8"))
|
|
137
|
+
bib.version = [Bib::Version.new(draft: ver)] if ver
|
|
138
|
+
serialize_and_write(bib)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
# Append immediate-neighbor `updates` / `updatedBy` relations in memory.
|
|
143
|
+
# Single-version series get no relations (no neighbors).
|
|
144
|
+
#
|
|
145
|
+
def link_neighbor_relations(sorted)
|
|
146
|
+
sorted.each_with_index do |entry, i|
|
|
147
|
+
if i.positive?
|
|
148
|
+
prev = sorted[i - 1]
|
|
149
|
+
entry[:bib].relation << version_relation({ ref: prev[:ref], source: prev[:source] }, "updates")
|
|
150
|
+
end
|
|
151
|
+
if i < sorted.size - 1
|
|
152
|
+
nxt = sorted[i + 1]
|
|
153
|
+
entry[:bib].relation << version_relation({ ref: nxt[:ref], source: nxt[:source] }, "updatedBy")
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
#
|
|
159
|
+
# Build (but do not write) the un-versioned series aggregator doc with
|
|
160
|
+
# `includes` relations to every version. Uses the latest version's
|
|
161
|
+
# title/abstract from memory.
|
|
162
|
+
#
|
|
163
|
+
# @return [Relaton::Ietf::ItemData, nil]
|
|
164
|
+
#
|
|
165
|
+
def build_unversioned_doc(series, sorted)
|
|
166
|
+
if sorted.empty?
|
|
167
|
+
Util.warn "No versions found for #{series}"
|
|
168
|
+
return nil
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
last_v = sorted.last[:bib]
|
|
172
|
+
docid = Bib::Docidentifier.new(type: "Internet-Draft", content: series, primary: true)
|
|
173
|
+
rel = sorted.map { |e| version_relation({ ref: e[:ref], source: e[:source] }, "includes") }
|
|
174
|
+
ItemData.new(
|
|
175
|
+
title: last_v.title, abstract: last_v.abstract, formattedref: Bib::Formattedref.new(content: series),
|
|
176
|
+
docidentifier: [docid], relation: rel
|
|
177
|
+
)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
#
|
|
181
|
+
# Create bibitem relation
|
|
182
|
+
#
|
|
183
|
+
# @param [Hash] ver version reference, { ref:, source: }
|
|
184
|
+
# @param [String] type relation type
|
|
185
|
+
#
|
|
186
|
+
# @return [Relaton::Ietf::Relation] relation
|
|
187
|
+
#
|
|
188
|
+
def version_relation(ver, type)
|
|
189
|
+
docid = Bib::Docidentifier.new(type: "Internet-Draft", content: ver[:ref], primary: true)
|
|
190
|
+
bibitem = ItemData.new(formattedref: Bib::Formattedref.new(content: ver[:ref]), docidentifier: [docid], source: ver[:source])
|
|
191
|
+
Relaton::Ietf::Relation.new(type: type, bibitem: bibitem)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
#
|
|
195
|
+
# Fetches ietf-rfc-entries documents
|
|
196
|
+
#
|
|
197
|
+
def fetch_ieft_rfcs
|
|
198
|
+
idx = Rfc::Index.from_xml(rfc_index)
|
|
199
|
+
idx.rfc_entries.each do |entry|
|
|
200
|
+
save_doc entry.to_item(nil, wg_names: wg_names)
|
|
201
|
+
rescue StandardError => e
|
|
202
|
+
Util.error "Error parsing #{entry.doc_id}: #{e.message}\n" \
|
|
203
|
+
"#{e.backtrace[0..5].join("\n")}"
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
# Get RFC index
|
|
209
|
+
#
|
|
210
|
+
# @return [Nokogiri::XML::Document] RFC index
|
|
211
|
+
#
|
|
212
|
+
def rfc_index
|
|
213
|
+
uri = URI "https://www.rfc-editor.org/rfc-index.xml"
|
|
214
|
+
Net::HTTP.get(uri)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def wg_names
|
|
218
|
+
@wg_names ||= WgNameResolver.fetch
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# Save document to file (sequential path: serialize, write, index).
|
|
223
|
+
# Used by the rfcsubseries / rfc-entries fetchers; the I-D fetcher splits
|
|
224
|
+
# this into worker-safe `serialize_and_write` plus parent-only
|
|
225
|
+
# `record_index_entry` so the index is touched only in the main process.
|
|
226
|
+
#
|
|
227
|
+
# @param [Relaton::Ietf::Rfc::Entry, nil] entry
|
|
228
|
+
# @param [Boolean] check_duplicate check for duplicate
|
|
229
|
+
#
|
|
230
|
+
def save_doc(entry, check_duplicate: true)
|
|
231
|
+
result = serialize_and_write(entry)
|
|
232
|
+
record_index_entry(result, check_duplicate: check_duplicate) if result
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
#
|
|
236
|
+
# Worker-safe: serialize, compute output filename, write to disk, return
|
|
237
|
+
# a Marshal-friendly hash with the docid+file pair the parent needs to
|
|
238
|
+
# update `Relaton::Index` and `@files`. Does NOT touch instance state
|
|
239
|
+
# that has to stay consistent across workers (`@files`, the index).
|
|
240
|
+
#
|
|
241
|
+
# @param [#to_yaml, #to_xml, #to_rfcxml, nil] entry
|
|
242
|
+
# @return [Hash, nil]
|
|
243
|
+
#
|
|
244
|
+
def serialize_and_write(entry) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
245
|
+
return nil unless entry
|
|
246
|
+
|
|
247
|
+
content = case @format
|
|
248
|
+
when "xml" then entry.to_xml(bibdata: true)
|
|
249
|
+
when "yaml" then entry.to_yaml
|
|
250
|
+
when "bibxml" then entry.to_rfcxml
|
|
251
|
+
else entry.send("to_#{@format}")
|
|
252
|
+
end
|
|
253
|
+
id = if entry.respond_to?(:docidentifier)
|
|
254
|
+
entry.docidentifier.detect { |i| i.type == "Internet-Draft" && i.primary }&.content
|
|
255
|
+
end
|
|
256
|
+
id ||= entry.docnumber || entry.formattedref.content
|
|
257
|
+
file = output_file(id)
|
|
258
|
+
File.write file, content, encoding: "UTF-8"
|
|
259
|
+
primary = entry.docidentifier.detect(&:primary) || entry.docidentifier.first
|
|
260
|
+
{ docnumber: entry.docnumber, file: file, index_id: primary.content }
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
#
|
|
264
|
+
# Parent-only: dedupe-check `@files` and update `Relaton::Index`. Called
|
|
265
|
+
# serially after workers return so index updates are race-free.
|
|
266
|
+
#
|
|
267
|
+
def record_index_entry(result, check_duplicate: true)
|
|
268
|
+
if check_duplicate && @files.include?(result[:file])
|
|
269
|
+
Util.warn "File #{result[:file]} already exists. Document: #{result[:docnumber]}"
|
|
270
|
+
elsif check_duplicate
|
|
271
|
+
@files << result[:file]
|
|
272
|
+
end
|
|
273
|
+
index.add_or_update result[:index_id], result[:file]
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require_relative "doctype"
|
|
2
|
+
require_relative "processing_instructions"
|
|
3
|
+
|
|
4
|
+
module Relaton
|
|
5
|
+
module Ietf
|
|
6
|
+
class Ext < Bib::Ext
|
|
7
|
+
attribute :doctype, Doctype
|
|
8
|
+
attribute :area, :string, collection: true, values: %W[
|
|
9
|
+
apt gen int ops rtg sec tsv Applications\sand\sReal-Time General
|
|
10
|
+
Internet Operations\sand\sManagement Routing Security Transport
|
|
11
|
+
]
|
|
12
|
+
attribute :stream, :string, values: %w[IAB IETF Independent IRTF Legacy Editorial]
|
|
13
|
+
attribute :ipr, :string
|
|
14
|
+
attribute :pi, ProcessingInstructions
|
|
15
|
+
attribute :consensus, :string
|
|
16
|
+
attribute :index_include, :string
|
|
17
|
+
attribute :ipr_extract, :string
|
|
18
|
+
attribute :sort_refs, :string
|
|
19
|
+
attribute :sym_refs, :string
|
|
20
|
+
attribute :toc_include, :string
|
|
21
|
+
attribute :toc_depth, :string
|
|
22
|
+
attribute :show_on_front_page, :string
|
|
23
|
+
|
|
24
|
+
xml do
|
|
25
|
+
map_element "area", to: :area
|
|
26
|
+
map_element "stream", to: :stream
|
|
27
|
+
map_element "ipr", to: :ipr
|
|
28
|
+
map_element "pi", to: :pi
|
|
29
|
+
map_element "consensus", to: :consensus
|
|
30
|
+
map_element "indexInclude", to: :index_include
|
|
31
|
+
map_element "iprExtract", to: :ipr_extract
|
|
32
|
+
map_element "sortRefs", to: :sort_refs
|
|
33
|
+
map_element "symRefs", to: :sym_refs
|
|
34
|
+
map_element "tocInclude", to: :toc_include
|
|
35
|
+
map_element "tocDepth", to: :toc_depth
|
|
36
|
+
map_element "showOnFrontPage", to: :show_on_front_page
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
key_value do
|
|
40
|
+
map_element "schema_version", to: :schema_version, render_default: true
|
|
41
|
+
map_element "doctype", to: :doctype
|
|
42
|
+
map_element "subdoctype", to: :subdoctype
|
|
43
|
+
map_element "flavor", to: :flavor
|
|
44
|
+
map_element "ics", to: :ics
|
|
45
|
+
map_element "structuredidentifier", to: :structuredidentifier
|
|
46
|
+
map_element "area", to: :area
|
|
47
|
+
map_element "stream", to: :stream
|
|
48
|
+
map_element "ipr", to: :ipr
|
|
49
|
+
map_element "pi", to: :pi
|
|
50
|
+
map_element "consensus", to: :consensus
|
|
51
|
+
map_element "index_include", to: :index_include
|
|
52
|
+
map_element "ipr_extract", to: :ipr_extract
|
|
53
|
+
map_element "sort_refs", to: :sort_refs
|
|
54
|
+
map_element "sym_refs", to: :sym_refs
|
|
55
|
+
map_element "toc_include", to: :toc_include
|
|
56
|
+
map_element "toc_depth", to: :toc_depth
|
|
57
|
+
map_element "show_on_front_page", to: :show_on_front_page
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def get_schema_version = Relaton.schema_versions["relaton-model-ietf"]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require_relative "ext"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Ietf
|
|
5
|
+
class Item < Bib::Item
|
|
6
|
+
model ItemData
|
|
7
|
+
|
|
8
|
+
attribute :ext, Ext
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require_relative "relation"
|
|
14
|
+
|
|
15
|
+
Relaton::Ietf::Item.attribute :relation, Relaton::Ietf::Relation,
|
|
16
|
+
collection: true, initialize_empty: true
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Ietf
|
|
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
|