pubid 1.15.19 → 2.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/LICENSE.txt +1 -1
- data/README.adoc +2041 -53
- data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
- data/archived-gems/pubid-iec/stages.yaml +129 -0
- data/archived-gems/pubid-iec/update_codes.yaml +67 -0
- data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
- data/archived-gems/pubid-iso/stages.yaml +106 -0
- data/archived-gems/pubid-iso/update_codes.yaml +4 -0
- data/archived-gems/pubid-itu/i18n.yaml +13 -0
- data/archived-gems/pubid-itu/series.yaml +42 -0
- data/archived-gems/pubid-nist/publishers.yaml +6 -0
- data/archived-gems/pubid-nist/series.yaml +121 -0
- data/archived-gems/pubid-nist/stages.yaml +16 -0
- data/archived-gems/pubid-nist/update_codes.yaml +93 -0
- data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
- data/data/ccsds/update_codes.yaml +1 -0
- data/data/iec/update_codes.yaml +67 -0
- data/data/ieee/update_codes.yaml +104 -0
- data/data/iso/update_codes.yaml +21 -0
- data/data/nist/update_codes.yaml +89 -0
- data/data/plateau/update_codes.yaml +6 -0
- data/lib/pubid/amca/builder.rb +176 -0
- data/lib/pubid/amca/identifier.rb +57 -0
- data/lib/pubid/amca/identifiers/base.rb +64 -0
- data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
- data/lib/pubid/amca/identifiers/publication.rb +47 -0
- data/lib/pubid/amca/identifiers/standard.rb +22 -0
- data/lib/pubid/amca/identifiers.rb +12 -0
- data/lib/pubid/amca/parser.rb +153 -0
- data/lib/pubid/amca/scheme.rb +16 -0
- data/lib/pubid/amca/single_identifier.rb +33 -0
- data/lib/pubid/amca/urn_generator.rb +50 -0
- data/lib/pubid/amca.rb +26 -0
- data/lib/pubid/ansi/builder.rb +52 -0
- data/lib/pubid/ansi/identifier.rb +55 -0
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
- data/lib/pubid/ansi/identifiers/standard.rb +16 -0
- data/lib/pubid/ansi/identifiers.rb +11 -0
- data/lib/pubid/ansi/parser.rb +91 -0
- data/lib/pubid/ansi/scheme.rb +15 -0
- data/lib/pubid/ansi/single_identifier.rb +45 -0
- data/lib/pubid/ansi/urn_generator.rb +76 -0
- data/lib/pubid/ansi.rb +27 -0
- data/lib/pubid/api/builder.rb +85 -0
- data/lib/pubid/api/components/code.rb +9 -0
- data/lib/pubid/api/identifier.rb +68 -0
- data/lib/pubid/api/identifiers/base.rb +24 -0
- data/lib/pubid/api/identifiers/bulletin.rb +15 -0
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
- data/lib/pubid/api/identifiers/mpms.rb +44 -0
- data/lib/pubid/api/identifiers/publication.rb +15 -0
- data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
- data/lib/pubid/api/identifiers/specification.rb +15 -0
- data/lib/pubid/api/identifiers/standard.rb +15 -0
- data/lib/pubid/api/identifiers/technical_report.rb +15 -0
- data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
- data/lib/pubid/api/parser.rb +140 -0
- data/lib/pubid/api/scheme.rb +66 -0
- data/lib/pubid/api/single_identifier.rb +46 -0
- data/lib/pubid/api/urn_generator.rb +41 -0
- data/lib/pubid/api.rb +17 -0
- data/lib/pubid/ashrae/builder.rb +498 -0
- data/lib/pubid/ashrae/identifier.rb +57 -0
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
- data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
- data/lib/pubid/ashrae/identifiers/base.rb +23 -0
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
- data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
- data/lib/pubid/ashrae/identifiers.rb +16 -0
- data/lib/pubid/ashrae/parser.rb +724 -0
- data/lib/pubid/ashrae/scheme.rb +53 -0
- data/lib/pubid/ashrae/single_identifier.rb +23 -0
- data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
- data/lib/pubid/ashrae/urn_generator.rb +59 -0
- data/lib/pubid/ashrae.rb +21 -0
- data/lib/pubid/asme/builder.rb +153 -0
- data/lib/pubid/asme/components/code.rb +18 -0
- data/lib/pubid/asme/identifier.rb +61 -0
- data/lib/pubid/asme/identifiers/base.rb +70 -0
- data/lib/pubid/asme/identifiers/standard.rb +12 -0
- data/lib/pubid/asme/identifiers.rb +10 -0
- data/lib/pubid/asme/parser.rb +308 -0
- data/lib/pubid/asme/scheme.rb +37 -0
- data/lib/pubid/asme/single_identifier.rb +29 -0
- data/lib/pubid/asme/urn_generator.rb +133 -0
- data/lib/pubid/asme.rb +21 -0
- data/lib/pubid/astm/builder.rb +159 -0
- data/lib/pubid/astm/components/code.rb +33 -0
- data/lib/pubid/astm/identifier.rb +92 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
- data/lib/pubid/astm/identifiers/base.rb +13 -0
- data/lib/pubid/astm/identifiers/data_series.rb +25 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
- data/lib/pubid/astm/identifiers/manual.rb +40 -0
- data/lib/pubid/astm/identifiers/monograph.rb +25 -0
- data/lib/pubid/astm/identifiers/research_report.rb +18 -0
- data/lib/pubid/astm/identifiers/standard.rb +52 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
- data/lib/pubid/astm/parser.rb +244 -0
- data/lib/pubid/astm/scheme.rb +55 -0
- data/lib/pubid/astm/single_identifier.rb +25 -0
- data/lib/pubid/astm/urn_generator.rb +99 -0
- data/lib/pubid/astm.rb +38 -0
- data/lib/pubid/bsi/builder.rb +1483 -0
- data/lib/pubid/bsi/components/code.rb +11 -0
- data/lib/pubid/bsi/components/date.rb +11 -0
- data/lib/pubid/bsi/components/publisher.rb +11 -0
- data/lib/pubid/bsi/components/type.rb +11 -0
- data/lib/pubid/bsi/identifier.rb +87 -0
- data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
- data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/base.rb +11 -0
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
- data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
- data/lib/pubid/bsi/identifiers/disc.rb +56 -0
- data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
- data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
- data/lib/pubid/bsi/identifiers/flex.rb +61 -0
- data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
- data/lib/pubid/bsi/identifiers/index.rb +62 -0
- data/lib/pubid/bsi/identifiers/method.rb +76 -0
- data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
- data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
- data/lib/pubid/bsi/identifiers/section.rb +62 -0
- data/lib/pubid/bsi/identifiers/set.rb +46 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
- data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
- data/lib/pubid/bsi/identifiers.rb +52 -0
- data/lib/pubid/bsi/model.rb +196 -0
- data/lib/pubid/bsi/parser.rb +659 -0
- data/lib/pubid/bsi/scheme.rb +243 -0
- data/lib/pubid/bsi/single_identifier.rb +129 -0
- data/lib/pubid/bsi/urn_generator.rb +84 -0
- data/lib/pubid/bsi.rb +32 -0
- data/lib/pubid/builder/base.rb +138 -0
- data/lib/pubid/bundled_identifier.rb +126 -0
- data/lib/pubid/ccsds/builder.rb +56 -0
- data/lib/pubid/ccsds/identifier.rb +84 -0
- data/lib/pubid/ccsds/identifiers/base.rb +89 -0
- data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
- data/lib/pubid/ccsds/identifiers.rb +10 -0
- data/lib/pubid/ccsds/parser.rb +71 -0
- data/lib/pubid/ccsds/scheme.rb +57 -0
- data/lib/pubid/ccsds/single_identifier.rb +77 -0
- data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
- data/lib/pubid/ccsds/urn_generator.rb +115 -0
- data/lib/pubid/ccsds.rb +21 -0
- data/lib/pubid/cen_cenelec/builder.rb +330 -0
- data/lib/pubid/cen_cenelec/identifier.rb +52 -0
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
- data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
- data/lib/pubid/cen_cenelec/parser.rb +144 -0
- data/lib/pubid/cen_cenelec/scheme.rb +164 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
- data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
- data/lib/pubid/cen_cenelec.rb +21 -0
- data/lib/pubid/cie/builder.rb +399 -0
- data/lib/pubid/cie/components/code.rb +72 -0
- data/lib/pubid/cie/components/language.rb +58 -0
- data/lib/pubid/cie/identifier.rb +71 -0
- data/lib/pubid/cie/identifiers/bundle.rb +20 -0
- data/lib/pubid/cie/identifiers/conference.rb +32 -0
- data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
- data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
- data/lib/pubid/cie/identifiers/identical.rb +64 -0
- data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
- data/lib/pubid/cie/identifiers/standard.rb +58 -0
- data/lib/pubid/cie/identifiers/supplement.rb +45 -0
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
- data/lib/pubid/cie/identifiers.rb +17 -0
- data/lib/pubid/cie/parser.rb +347 -0
- data/lib/pubid/cie/scheme.rb +64 -0
- data/lib/pubid/cie/single_identifier.rb +30 -0
- data/lib/pubid/cie/supplement_identifier.rb +26 -0
- data/lib/pubid/cie/urn_generator.rb +123 -0
- data/lib/pubid/cie.rb +28 -0
- data/lib/pubid/components/code.rb +33 -0
- data/lib/pubid/components/date.rb +49 -0
- data/lib/pubid/components/edition.rb +32 -0
- data/lib/pubid/components/factory.rb +50 -0
- data/lib/pubid/components/language.rb +37 -0
- data/lib/pubid/components/locality.rb +10 -0
- data/lib/pubid/components/publisher.rb +36 -0
- data/lib/pubid/components/stage.rb +54 -0
- data/lib/pubid/components/type.rb +58 -0
- data/lib/pubid/components/typed_stage.rb +59 -0
- data/lib/pubid/components.rb +16 -0
- data/lib/pubid/core/pattern_doc_generator.rb +272 -0
- data/lib/pubid/core/update_codes.rb +77 -0
- data/lib/pubid/core.rb +8 -0
- data/lib/pubid/csa/builder.rb +671 -0
- data/lib/pubid/csa/components/code.rb +9 -0
- data/lib/pubid/csa/components.rb +9 -0
- data/lib/pubid/csa/composite_identifier.rb +27 -0
- data/lib/pubid/csa/identifier.rb +513 -0
- data/lib/pubid/csa/identifiers/base.rb +133 -0
- data/lib/pubid/csa/identifiers/bundled.rb +125 -0
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
- data/lib/pubid/csa/identifiers/cec.rb +129 -0
- data/lib/pubid/csa/identifiers/combined.rb +130 -0
- data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
- data/lib/pubid/csa/identifiers/package.rb +65 -0
- data/lib/pubid/csa/identifiers/series.rb +127 -0
- data/lib/pubid/csa/identifiers/standard.rb +10 -0
- data/lib/pubid/csa/identifiers.rb +17 -0
- data/lib/pubid/csa/parser.rb +445 -0
- data/lib/pubid/csa/scheme.rb +44 -0
- data/lib/pubid/csa/single_identifier.rb +30 -0
- data/lib/pubid/csa/urn_generator.rb +80 -0
- data/lib/pubid/csa/wrapper_identifier.rb +31 -0
- data/lib/pubid/csa.rb +25 -0
- data/lib/pubid/etsi/builder.rb +133 -0
- data/lib/pubid/etsi/components/code.rb +42 -0
- data/lib/pubid/etsi/components/version.rb +37 -0
- data/lib/pubid/etsi/components.rb +10 -0
- data/lib/pubid/etsi/identifier.rb +57 -0
- data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
- data/lib/pubid/etsi/identifiers/base.rb +38 -0
- data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
- data/lib/pubid/etsi/identifiers.rb +14 -0
- data/lib/pubid/etsi/parser.rb +133 -0
- data/lib/pubid/etsi/scheme.rb +42 -0
- data/lib/pubid/etsi/urn_generator.rb +76 -0
- data/lib/pubid/etsi.rb +21 -0
- data/lib/pubid/export/auditor.rb +89 -0
- data/lib/pubid/export/data_class_exporter.rb +59 -0
- data/lib/pubid/export/exporter.rb +74 -0
- data/lib/pubid/export/flavor_exporter.rb +402 -0
- data/lib/pubid/export/ieee_exporter.rb +78 -0
- data/lib/pubid/export/itu_exporter.rb +66 -0
- data/lib/pubid/export/nist_exporter.rb +64 -0
- data/lib/pubid/export/registry_exporter.rb +90 -0
- data/lib/pubid/export/result.rb +97 -0
- data/lib/pubid/export/scheme_exporter.rb +70 -0
- data/lib/pubid/export.rb +18 -0
- data/lib/pubid/format_detector.rb +16 -0
- data/lib/pubid/format_registry.rb +42 -0
- data/lib/pubid/identifier.rb +242 -0
- data/lib/pubid/identifier_metadata.rb +148 -0
- data/lib/pubid/identifier_registry.rb +198 -0
- data/lib/pubid/idf/builder.rb +82 -0
- data/lib/pubid/idf/identifier.rb +129 -0
- data/lib/pubid/idf/identifiers/amendment.rb +27 -0
- data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
- data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
- data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
- data/lib/pubid/idf/identifiers.rb +13 -0
- data/lib/pubid/idf/parser.rb +143 -0
- data/lib/pubid/idf/scheme.rb +61 -0
- data/lib/pubid/idf/single_identifier.rb +19 -0
- data/lib/pubid/idf/supplement_identifier.rb +43 -0
- data/lib/pubid/idf/urn_generator.rb +84 -0
- data/lib/pubid/idf.rb +25 -0
- data/lib/pubid/iec/builder.rb +458 -0
- data/lib/pubid/iec/components/code.rb +60 -0
- data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
- data/lib/pubid/iec/components/publisher.rb +36 -0
- data/lib/pubid/iec/components/sheet.rb +32 -0
- data/lib/pubid/iec/components/trf_info.rb +38 -0
- data/lib/pubid/iec/components/vap_suffix.rb +41 -0
- data/lib/pubid/iec/identifier.rb +256 -0
- data/lib/pubid/iec/identifiers/amendment.rb +94 -0
- data/lib/pubid/iec/identifiers/base.rb +82 -0
- data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
- data/lib/pubid/iec/identifiers/guide.rb +104 -0
- data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
- data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
- data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
- data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
- data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
- data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
- data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
- data/lib/pubid/iec/identifiers/working_document.rb +96 -0
- data/lib/pubid/iec/parser.rb +417 -0
- data/lib/pubid/iec/rendering_style.rb +113 -0
- data/lib/pubid/iec/scheme.rb +71 -0
- data/lib/pubid/iec/single_identifier.rb +80 -0
- data/lib/pubid/iec/supplement_identifier.rb +161 -0
- data/lib/pubid/iec/urn_generator.rb +79 -0
- data/lib/pubid/iec/urn_parser.rb +90 -0
- data/lib/pubid/iec.rb +85 -0
- data/lib/pubid/ieee/aiee/builder.rb +71 -0
- data/lib/pubid/ieee/aiee/identifier.rb +105 -0
- data/lib/pubid/ieee/aiee/parser.rb +130 -0
- data/lib/pubid/ieee/aiee.rb +11 -0
- data/lib/pubid/ieee/builder.rb +1237 -0
- data/lib/pubid/ieee/components/code.rb +102 -0
- data/lib/pubid/ieee/components/draft.rb +93 -0
- data/lib/pubid/ieee/components/relationship.rb +157 -0
- data/lib/pubid/ieee/components/typed_stage.rb +100 -0
- data/lib/pubid/ieee/identifier.rb +54 -0
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/base.rb +591 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
- data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
- data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
- data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
- data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
- data/lib/pubid/ieee/identifiers/standard.rb +41 -0
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
- data/lib/pubid/ieee/identifiers.rb +33 -0
- data/lib/pubid/ieee/ire/builder.rb +61 -0
- data/lib/pubid/ieee/ire/identifier.rb +58 -0
- data/lib/pubid/ieee/ire/parser.rb +91 -0
- data/lib/pubid/ieee/ire.rb +11 -0
- data/lib/pubid/ieee/nesc/builder.rb +101 -0
- data/lib/pubid/ieee/nesc/parser.rb +154 -0
- data/lib/pubid/ieee/nesc.rb +10 -0
- data/lib/pubid/ieee/parser.rb +1226 -0
- data/lib/pubid/ieee/scheme.rb +90 -0
- data/lib/pubid/ieee/typed_stages.rb +172 -0
- data/lib/pubid/ieee/urn_generator.rb +188 -0
- data/lib/pubid/ieee.rb +32 -0
- data/lib/pubid/ieee_debug.rb +31 -0
- data/lib/pubid/iho/builder.rb +37 -0
- data/lib/pubid/iho/identifier.rb +61 -0
- data/lib/pubid/iho/identifiers/base.rb +41 -0
- data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
- data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
- data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
- data/lib/pubid/iho/identifiers/publication.rb +15 -0
- data/lib/pubid/iho/identifiers/standard.rb +15 -0
- data/lib/pubid/iho/identifiers.rb +14 -0
- data/lib/pubid/iho/parser.rb +68 -0
- data/lib/pubid/iho/scheme.rb +29 -0
- data/lib/pubid/iho/urn_generator.rb +29 -0
- data/lib/pubid/iho.rb +21 -0
- data/lib/pubid/iso/builder.rb +309 -0
- data/lib/pubid/iso/bundled_identifier.rb +85 -0
- data/lib/pubid/iso/combined_identifier.rb +22 -0
- data/lib/pubid/iso/components/code.rb +36 -0
- data/lib/pubid/iso/components/publisher.rb +60 -0
- data/lib/pubid/iso/components.rb +12 -0
- data/lib/pubid/iso/format_resolver.rb +45 -0
- data/lib/pubid/iso/identifier.rb +330 -0
- data/lib/pubid/iso/identifiers/addendum.rb +104 -0
- data/lib/pubid/iso/identifiers/amendment.rb +128 -0
- data/lib/pubid/iso/identifiers/base.rb +115 -0
- data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
- data/lib/pubid/iso/identifiers/data.rb +76 -0
- data/lib/pubid/iso/identifiers/directives.rb +59 -0
- data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
- data/lib/pubid/iso/identifiers/extract.rb +30 -0
- data/lib/pubid/iso/identifiers/guide.rb +100 -0
- data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
- data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
- data/lib/pubid/iso/identifiers/pas.rb +93 -0
- data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
- data/lib/pubid/iso/identifiers/supplement.rb +87 -0
- data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
- data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
- data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
- data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
- data/lib/pubid/iso/identifiers.rb +33 -0
- data/lib/pubid/iso/parser.rb +512 -0
- data/lib/pubid/iso/rendering_style.rb +120 -0
- data/lib/pubid/iso/scheme.rb +193 -0
- data/lib/pubid/iso/single_identifier.rb +64 -0
- data/lib/pubid/iso/supplement_identifier.rb +27 -0
- data/lib/pubid/iso/urn_generator.rb +426 -0
- data/lib/pubid/iso/urn_parser.rb +437 -0
- data/lib/pubid/iso/utilities.rb +86 -0
- data/lib/pubid/iso.rb +50 -0
- data/lib/pubid/itu/builder.rb +171 -0
- data/lib/pubid/itu/components/code.rb +39 -0
- data/lib/pubid/itu/components/sector.rb +35 -0
- data/lib/pubid/itu/components/series.rb +29 -0
- data/lib/pubid/itu/i18n.rb +9 -0
- data/lib/pubid/itu/i18n.yaml +30 -0
- data/lib/pubid/itu/identifier.rb +118 -0
- data/lib/pubid/itu/identifiers/amendment.rb +43 -0
- data/lib/pubid/itu/identifiers/annex.rb +74 -0
- data/lib/pubid/itu/identifiers/base.rb +154 -0
- data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
- data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
- data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
- data/lib/pubid/itu/identifiers/supplement.rb +46 -0
- data/lib/pubid/itu/identifiers.rb +16 -0
- data/lib/pubid/itu/model.rb +111 -0
- data/lib/pubid/itu/parser.rb +225 -0
- data/lib/pubid/itu/scheme.rb +174 -0
- data/lib/pubid/itu/urn_generator.rb +105 -0
- data/lib/pubid/itu.rb +22 -0
- data/lib/pubid/jcgm/builder.rb +88 -0
- data/lib/pubid/jcgm/components/publisher.rb +20 -0
- data/lib/pubid/jcgm/components.rb +9 -0
- data/lib/pubid/jcgm/identifier.rb +54 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
- data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
- data/lib/pubid/jcgm/identifiers.rb +11 -0
- data/lib/pubid/jcgm/parser.rb +84 -0
- data/lib/pubid/jcgm/scheme.rb +60 -0
- data/lib/pubid/jcgm/single_identifier.rb +48 -0
- data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
- data/lib/pubid/jcgm/urn_generator.rb +110 -0
- data/lib/pubid/jcgm.rb +31 -0
- data/lib/pubid/jis/builder.rb +124 -0
- data/lib/pubid/jis/components/code.rb +59 -0
- data/lib/pubid/jis/components.rb +9 -0
- data/lib/pubid/jis/identifier.rb +61 -0
- data/lib/pubid/jis/identifiers/amendment.rb +16 -0
- data/lib/pubid/jis/identifiers/base.rb +72 -0
- data/lib/pubid/jis/identifiers/explanation.rb +22 -0
- data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
- data/lib/pubid/jis/identifiers/standard.rb +27 -0
- data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
- data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
- data/lib/pubid/jis/identifiers.rb +17 -0
- data/lib/pubid/jis/parser.rb +109 -0
- data/lib/pubid/jis/scheme.rb +49 -0
- data/lib/pubid/jis/single_identifier.rb +37 -0
- data/lib/pubid/jis/supplement_identifier.rb +47 -0
- data/lib/pubid/jis/urn_generator.rb +25 -0
- data/lib/pubid/jis.rb +23 -0
- data/lib/pubid/lutaml/no_store_registration.rb +30 -0
- data/lib/pubid/nist/builder.rb +2269 -0
- data/lib/pubid/nist/components/code.rb +38 -0
- data/lib/pubid/nist/components/edition.rb +134 -0
- data/lib/pubid/nist/components/issue_number.rb +28 -0
- data/lib/pubid/nist/components/part.rb +77 -0
- data/lib/pubid/nist/components/publisher.rb +24 -0
- data/lib/pubid/nist/components/stage.rb +53 -0
- data/lib/pubid/nist/components/supplement.rb +188 -0
- data/lib/pubid/nist/components/translation.rb +42 -0
- data/lib/pubid/nist/components/update.rb +103 -0
- data/lib/pubid/nist/components/version.rb +35 -0
- data/lib/pubid/nist/components/volume.rb +32 -0
- data/lib/pubid/nist/components.rb +19 -0
- data/lib/pubid/nist/configuration.rb +77 -0
- data/lib/pubid/nist/identifier.rb +62 -0
- data/lib/pubid/nist/identifiers/base.rb +578 -0
- data/lib/pubid/nist/identifiers/circular.rb +68 -0
- data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
- data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
- data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
- data/lib/pubid/nist/identifiers/handbook.rb +50 -0
- data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
- data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
- data/lib/pubid/nist/identifiers/monograph.rb +69 -0
- data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
- data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
- data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
- data/lib/pubid/nist/identifiers/report.rb +67 -0
- data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
- data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
- data/lib/pubid/nist/identifiers.rb +33 -0
- data/lib/pubid/nist/parser.rb +1117 -0
- data/lib/pubid/nist/scheme.rb +199 -0
- data/lib/pubid/nist/supplement_identifier.rb +67 -0
- data/lib/pubid/nist/urn_generator.rb +133 -0
- data/lib/pubid/nist.rb +37 -0
- data/lib/pubid/oiml/builder.rb +189 -0
- data/lib/pubid/oiml/components/code.rb +20 -0
- data/lib/pubid/oiml/components.rb +9 -0
- data/lib/pubid/oiml/identifier.rb +61 -0
- data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
- data/lib/pubid/oiml/identifiers/annex.rb +62 -0
- data/lib/pubid/oiml/identifiers/base.rb +36 -0
- data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
- data/lib/pubid/oiml/identifiers/document.rb +13 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/guide.rb +13 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
- data/lib/pubid/oiml/identifiers.rb +18 -0
- data/lib/pubid/oiml/parser.rb +173 -0
- data/lib/pubid/oiml/scheme.rb +46 -0
- data/lib/pubid/oiml/single_identifier.rb +90 -0
- data/lib/pubid/oiml/supplement_identifier.rb +43 -0
- data/lib/pubid/oiml/urn_generator.rb +64 -0
- data/lib/pubid/oiml.rb +26 -0
- data/lib/pubid/parser/common_parse_methods.rb +13 -0
- data/lib/pubid/parser/common_parse_rules.rb +56 -0
- data/lib/pubid/parser.rb +8 -0
- data/lib/pubid/parsers/base.rb +11 -0
- data/lib/pubid/parsers/mr_string.rb +93 -0
- data/lib/pubid/plateau/builder.rb +50 -0
- data/lib/pubid/plateau/identifier.rb +57 -0
- data/lib/pubid/plateau/identifiers/annex.rb +16 -0
- data/lib/pubid/plateau/identifiers/base.rb +51 -0
- data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
- data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
- data/lib/pubid/plateau/identifiers.rb +12 -0
- data/lib/pubid/plateau/parser.rb +63 -0
- data/lib/pubid/plateau/scheme.rb +45 -0
- data/lib/pubid/plateau/supplement_identifier.rb +72 -0
- data/lib/pubid/plateau/urn_generator.rb +29 -0
- data/lib/pubid/plateau.rb +26 -0
- data/lib/pubid/renderers/base.rb +53 -0
- data/lib/pubid/renderers/directives_renderer.rb +61 -0
- data/lib/pubid/renderers/guide_renderer.rb +24 -0
- data/lib/pubid/renderers/human_readable.rb +70 -0
- data/lib/pubid/renderers/iwa_renderer.rb +20 -0
- data/lib/pubid/renderers/mr_string.rb +16 -0
- data/lib/pubid/renderers/supplement_renderer.rb +36 -0
- data/lib/pubid/renderers/urn.rb +11 -0
- data/lib/pubid/renderers.rb +14 -0
- data/lib/pubid/rendering/base.rb +73 -0
- data/lib/pubid/rendering/common.rb +211 -0
- data/lib/pubid/rendering/context.rb +159 -0
- data/lib/pubid/rendering/date.rb +27 -0
- data/lib/pubid/rendering/format.rb +25 -0
- data/lib/pubid/rendering/language.rb +21 -0
- data/lib/pubid/rendering/numbering.rb +24 -0
- data/lib/pubid/rendering/publisher.rb +25 -0
- data/lib/pubid/rendering/stage.rb +38 -0
- data/lib/pubid/rendering/supplement.rb +46 -0
- data/lib/pubid/rendering.rb +16 -0
- data/lib/pubid/sae/builder.rb +32 -0
- data/lib/pubid/sae/components/code.rb +9 -0
- data/lib/pubid/sae/components/date.rb +19 -0
- data/lib/pubid/sae/components/type.rb +19 -0
- data/lib/pubid/sae/components.rb +11 -0
- data/lib/pubid/sae/identifier.rb +37 -0
- data/lib/pubid/sae/identifiers/base.rb +42 -0
- data/lib/pubid/sae/identifiers.rb +9 -0
- data/lib/pubid/sae/parser.rb +55 -0
- data/lib/pubid/sae/scheme.rb +47 -0
- data/lib/pubid/sae/urn_generator.rb +38 -0
- data/lib/pubid/sae.rb +19 -0
- data/lib/pubid/scheme.rb +219 -0
- data/lib/pubid/urn_generator/base.rb +110 -0
- data/lib/pubid/utils/string_normalizer.rb +196 -0
- data/lib/pubid/utils.rb +7 -0
- data/lib/pubid/version.rb +3 -1
- data/lib/pubid.rb +137 -13
- data/lib/tasks/docs.rake +37 -0
- data/lib/tasks/export.rake +38 -0
- data/lib/tasks/website-data.json +7488 -0
- metadata +616 -171
- data/lib/pubid/registry.rb +0 -30
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
class Identifier
|
|
6
|
+
def self.parse(input)
|
|
7
|
+
parsed = Parser.parse(input)
|
|
8
|
+
Builder.build(parsed)
|
|
9
|
+
rescue Parslet::ParseFailed => e
|
|
10
|
+
raise "Failed to parse SAE identifier: #{input}\n#{e.message}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Factory that builds a SAE identifier from a hash of primitives.
|
|
14
|
+
# SAE has only one identifier class ({Identifiers::Base}); `:type`
|
|
15
|
+
# is data (the document-type abbreviation: "J", "AS", "ARP", "AMS",
|
|
16
|
+
# "AIR", "MA") rather than a class-dispatch key.
|
|
17
|
+
def self.create(**opts)
|
|
18
|
+
Identifiers::Base.new(**coerce_create_attrs(opts))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.coerce_create_attrs(opts)
|
|
22
|
+
attrs = { publisher: (opts[:publisher] || "SAE").to_s }
|
|
23
|
+
if (v = opts[:type])
|
|
24
|
+
attrs[:type] = Pubid::Sae::Components::Type.new(abbr: v.to_s)
|
|
25
|
+
end
|
|
26
|
+
if (v = opts[:number])
|
|
27
|
+
attrs[:number] = Pubid::Components::Code.new(value: v.to_s)
|
|
28
|
+
end
|
|
29
|
+
if (v = opts[:year])
|
|
30
|
+
attrs[:date] = Pubid::Components::Date.new(year: v.to_s)
|
|
31
|
+
end
|
|
32
|
+
attrs
|
|
33
|
+
end
|
|
34
|
+
private_class_method :coerce_create_attrs
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Base SAE Identifier
|
|
7
|
+
# Handles all SAE document types (AMS, AIR, ARP, AS, MA)
|
|
8
|
+
class Base < Pubid::Identifier
|
|
9
|
+
# Generate URN for this identifier
|
|
10
|
+
#
|
|
11
|
+
# @return [String] URN representation
|
|
12
|
+
|
|
13
|
+
attribute :publisher, :string, default: -> { "SAE" }
|
|
14
|
+
attribute :type, Sae::Components::Type
|
|
15
|
+
attribute :number, Sae::Components::Code
|
|
16
|
+
attribute :date, Sae::Components::Date
|
|
17
|
+
|
|
18
|
+
def to_s
|
|
19
|
+
parts = []
|
|
20
|
+
|
|
21
|
+
# Publisher and type
|
|
22
|
+
parts << publisher if publisher
|
|
23
|
+
parts << type.to_s if type
|
|
24
|
+
|
|
25
|
+
# Number
|
|
26
|
+
parts << number.to_s if number
|
|
27
|
+
|
|
28
|
+
result = parts.join(" ")
|
|
29
|
+
|
|
30
|
+
# Date
|
|
31
|
+
result += ":#{date.year}" if date
|
|
32
|
+
|
|
33
|
+
result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def year
|
|
37
|
+
date&.year
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Sae
|
|
7
|
+
class Parser < Parslet::Parser
|
|
8
|
+
rule(:space) { str(" ") }
|
|
9
|
+
rule(:digit) { match["0-9"] }
|
|
10
|
+
rule(:digits) { digit.repeat(1) }
|
|
11
|
+
rule(:letter) { match["A-Z"] }
|
|
12
|
+
rule(:colon) { str(":") }
|
|
13
|
+
|
|
14
|
+
# Publisher
|
|
15
|
+
rule(:publisher) { str("SAE").as(:publisher) }
|
|
16
|
+
|
|
17
|
+
# Document types with optional number suffix (e.g., J300, J308A)
|
|
18
|
+
rule(:doc_type) do
|
|
19
|
+
(
|
|
20
|
+
str("AMS") | # Aerospace Material Specification
|
|
21
|
+
str("AIR") | # Aerospace Information Report
|
|
22
|
+
str("ARP") | # Aerospace Recommended Practice
|
|
23
|
+
str("AS") | # Aerospace Standard
|
|
24
|
+
str("J") | # SAE Standard (e.g., J300)
|
|
25
|
+
str("MA") # Material Advisory
|
|
26
|
+
).as(:type)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Number with optional letter prefix or suffix
|
|
30
|
+
rule(:number) do
|
|
31
|
+
((letter.repeat(1,
|
|
32
|
+
1) >> digits) | (digits >> letter.repeat(0,
|
|
33
|
+
1))).as(:number)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Year
|
|
37
|
+
rule(:year) { digit.repeat(4, 4).as(:year) }
|
|
38
|
+
|
|
39
|
+
# Date
|
|
40
|
+
rule(:date) { colon >> year }
|
|
41
|
+
|
|
42
|
+
# Main identifier
|
|
43
|
+
rule(:identifier) do
|
|
44
|
+
publisher >> space >> doc_type >> space.maybe >>
|
|
45
|
+
number >> date.maybe
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
root(:identifier)
|
|
49
|
+
|
|
50
|
+
def self.parse(input)
|
|
51
|
+
new.parse(input)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
class Scheme < Pubid::Scheme
|
|
6
|
+
class << self
|
|
7
|
+
def identifiers
|
|
8
|
+
[
|
|
9
|
+
Identifiers::Base,
|
|
10
|
+
]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def typed_stages
|
|
14
|
+
identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def locate_typed_stage_by_abbr(abbr)
|
|
18
|
+
abbr = "SAE" if abbr.nil? || abbr.to_s.empty?
|
|
19
|
+
|
|
20
|
+
typed_stage = typed_stages.detect do |ts|
|
|
21
|
+
ts.abbr.include?(abbr)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
unless typed_stage
|
|
25
|
+
raise ArgumentError,
|
|
26
|
+
"Unknown type abbreviation: '#{abbr}'"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
typed_stage
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def locate_identifier_klass_by_type_code(type_code)
|
|
33
|
+
identifier_klass = identifiers.detect do |klass|
|
|
34
|
+
klass.type[:key].to_s == type_code.to_s
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
unless identifier_klass
|
|
38
|
+
raise ArgumentError,
|
|
39
|
+
"Unknown type code: #{type_code}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
identifier_klass
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
6
|
+
def urn_type
|
|
7
|
+
return "std" unless identifier.type
|
|
8
|
+
|
|
9
|
+
identifier.type.abbr.to_s.downcase
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def urn_year
|
|
13
|
+
if identifier.date&.year
|
|
14
|
+
return identifier.date.year.to_s
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
identifier.year&.to_s
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def urn_number
|
|
21
|
+
return nil unless identifier.number
|
|
22
|
+
|
|
23
|
+
identifier.number.value.to_s
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def generate
|
|
27
|
+
parts = ["urn", "sae"]
|
|
28
|
+
parts << urn_type
|
|
29
|
+
parts << urn_number if urn_number
|
|
30
|
+
parts << urn_year if urn_year
|
|
31
|
+
|
|
32
|
+
parts[1] = identifier.publisher.to_s.downcase if identifier.publisher
|
|
33
|
+
|
|
34
|
+
parts.join(":")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/lib/pubid/sae.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
autoload :Builder, "#{__dir__}/sae/builder"
|
|
6
|
+
autoload :Components, "#{__dir__}/sae/components"
|
|
7
|
+
autoload :Identifier, "#{__dir__}/sae/identifier"
|
|
8
|
+
autoload :Identifiers, "#{__dir__}/sae/identifiers"
|
|
9
|
+
autoload :Parser, "#{__dir__}/sae/parser"
|
|
10
|
+
autoload :Scheme, "#{__dir__}/sae/scheme"
|
|
11
|
+
autoload :UrnGenerator, "#{__dir__}/sae/urn_generator"
|
|
12
|
+
|
|
13
|
+
def self.parse(input)
|
|
14
|
+
Identifier.parse(input)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Pubid::Registry.register(:sae, Pubid::Sae)
|
data/lib/pubid/scheme.rb
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
# Base Scheme class defining the standard interface for all flavor schemes.
|
|
5
|
+
#
|
|
6
|
+
# The Scheme acts as a registry for identifier types and their associated
|
|
7
|
+
# typed stages. Each flavor (ISO, IEC, IEEE, etc.) should have a Scheme that
|
|
8
|
+
# implements this interface.
|
|
9
|
+
#
|
|
10
|
+
# == Standard Interface
|
|
11
|
+
#
|
|
12
|
+
# All Scheme implementations must provide these methods:
|
|
13
|
+
#
|
|
14
|
+
# - locate_typed_stage_by_abbr(abbr) -> Find a TypedStage by abbreviation
|
|
15
|
+
# - locate_identifier_klass_by_type_code(type_code) -> Find an identifier class
|
|
16
|
+
# - typed_stages -> Get all typed stages for base identifiers
|
|
17
|
+
# - supplement_typed_stages -> Get typed stages for supplements
|
|
18
|
+
# - all_typed_stages -> Get all typed stages combined
|
|
19
|
+
# - identifiers -> Get all base identifier classes
|
|
20
|
+
# - supplement_identifiers -> Get all supplement identifier classes
|
|
21
|
+
# - all_identifier_classes -> Get all identifier classes combined
|
|
22
|
+
#
|
|
23
|
+
# == Implementation Patterns
|
|
24
|
+
#
|
|
25
|
+
# There are several valid patterns for implementing a Scheme:
|
|
26
|
+
#
|
|
27
|
+
# 1. Class-based (ISO, IEEE, JCGM, JIS, CCSDS, ASHRAE):
|
|
28
|
+
# Use class << self with class methods
|
|
29
|
+
#
|
|
30
|
+
# 2. Instance-based with constants (BSI, CEN):
|
|
31
|
+
# Use TYPED_STAGES_REGISTRY and instance methods
|
|
32
|
+
#
|
|
33
|
+
# 3. Transform-based (ITU):
|
|
34
|
+
# Use model_class and transform methods (no typed stages)
|
|
35
|
+
#
|
|
36
|
+
# 4. Data class (ETSI, Plateau):
|
|
37
|
+
# Use Lutaml::Model::Serializable as a data model
|
|
38
|
+
#
|
|
39
|
+
# 5. Inheritance-based (AMCA):
|
|
40
|
+
# Inherit from Pubid::Scheme base class
|
|
41
|
+
#
|
|
42
|
+
# == Performance
|
|
43
|
+
#
|
|
44
|
+
# All registry lookups are memoized for performance. Callers can rely on
|
|
45
|
+
# repeated calls being O(1) after the first call.
|
|
46
|
+
#
|
|
47
|
+
class Scheme
|
|
48
|
+
# Registry of identifiers for this scheme
|
|
49
|
+
attr_accessor :identifiers,
|
|
50
|
+
:stages,
|
|
51
|
+
:types,
|
|
52
|
+
:languages,
|
|
53
|
+
:publishers,
|
|
54
|
+
:supplement_identifiers
|
|
55
|
+
|
|
56
|
+
def initialize(
|
|
57
|
+
identifiers: [], stages: [], types: [], languages: [], publishers: [],
|
|
58
|
+
supplement_identifiers: []
|
|
59
|
+
)
|
|
60
|
+
@identifiers = identifiers
|
|
61
|
+
@supplement_identifiers = supplement_identifiers
|
|
62
|
+
@stages = stages
|
|
63
|
+
@types = types
|
|
64
|
+
@languages = languages
|
|
65
|
+
@publishers = publishers
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def configure
|
|
69
|
+
yield self if block_given?
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Get all typed stages for base identifiers
|
|
73
|
+
# @return [Array<TypedStage>] All typed stages from identifiers
|
|
74
|
+
# @note Memoized for performance
|
|
75
|
+
def typed_stages
|
|
76
|
+
return @typed_stages if defined?(@typed_stages)
|
|
77
|
+
|
|
78
|
+
@typed_stages = @identifiers.filter_map do |identifier_class|
|
|
79
|
+
identifier_class.const_defined?(:TYPED_STAGES) ? identifier_class.const_get(:TYPED_STAGES) : nil
|
|
80
|
+
end.flatten
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Get all typed stages for supplement identifiers
|
|
84
|
+
# @return [Array<TypedStage>] All typed stages from supplement identifiers
|
|
85
|
+
# @note Memoized for performance
|
|
86
|
+
def supplement_typed_stages
|
|
87
|
+
return @supplement_typed_stages if defined?(@supplement_typed_stages)
|
|
88
|
+
|
|
89
|
+
@supplement_typed_stages = @supplement_identifiers.filter_map do |identifier_class|
|
|
90
|
+
identifier_class.const_defined?(:TYPED_STAGES) ? identifier_class.const_get(:TYPED_STAGES) : nil
|
|
91
|
+
end.flatten
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Get all typed stages (base + supplements), sorted by abbreviation
|
|
95
|
+
# @return [Array<TypedStage>] All typed stages sorted by abbreviation
|
|
96
|
+
# @note Memoized for performance
|
|
97
|
+
def all_typed_stages
|
|
98
|
+
return @all_typed_stages if defined?(@all_typed_stages)
|
|
99
|
+
|
|
100
|
+
@all_typed_stages = (typed_stages + supplement_typed_stages).sort_by do |ts|
|
|
101
|
+
(ts.abbr.first || "").to_s
|
|
102
|
+
end.reverse
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Locate a TypedStage by abbreviation
|
|
106
|
+
# @param abbr [String, Symbol] The abbreviation to find
|
|
107
|
+
# @return [TypedStage, nil] The matching TypedStage, or nil if not found
|
|
108
|
+
# @note Uses hash-based index for O(1) lookup, falls back to linear search
|
|
109
|
+
def locate_typed_stage_by_abbr(abbr)
|
|
110
|
+
abbr = "" if abbr.nil? || abbr.to_s.strip.empty?
|
|
111
|
+
|
|
112
|
+
# Try hash-based index first (O(1))
|
|
113
|
+
typed_stage = typed_stage_index[abbr]
|
|
114
|
+
|
|
115
|
+
# Fall back to linear search if not found (for abbreviations with
|
|
116
|
+
# special formatting or edge cases)
|
|
117
|
+
typed_stage || all_typed_stages.detect do |ts|
|
|
118
|
+
ts.abbr.include?(abbr)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Locate a TypedStage by stage code
|
|
123
|
+
# @param stage_code [String, Symbol] The stage code to find
|
|
124
|
+
# @return [TypedStage, nil] The matching TypedStage, or nil if not found
|
|
125
|
+
# @note Uses linear search for stage code lookup
|
|
126
|
+
def locate_typed_stage_by_stage_code(stage_code)
|
|
127
|
+
stage_code_sym = stage_code.to_sym
|
|
128
|
+
|
|
129
|
+
all_typed_stages.detect do |ts|
|
|
130
|
+
ts.stage_code.to_sym == stage_code_sym
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Locate a TypedStage by its unique per-typed-stage code
|
|
135
|
+
# @param code [String, Symbol] The code to find (e.g. :dtr, :fdisp)
|
|
136
|
+
# @return [TypedStage, nil] The matching TypedStage, or nil if not found
|
|
137
|
+
# @note Uses linear search for code lookup
|
|
138
|
+
def locate_typed_stage_by_code(code)
|
|
139
|
+
code_sym = code.to_sym
|
|
140
|
+
|
|
141
|
+
all_typed_stages.detect do |ts|
|
|
142
|
+
ts.code&.to_sym == code_sym
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Locate a TypedStage by harmonized stage code
|
|
147
|
+
# @param harmonized_code [String] The harmonized stage code to find (e.g., "00.00", "10.00")
|
|
148
|
+
# @return [TypedStage, nil] The matching TypedStage, or nil if not found
|
|
149
|
+
# @note Uses linear search to check harmonized_stages arrays
|
|
150
|
+
def locate_typed_stage_by_harmonized_code(harmonized_code)
|
|
151
|
+
harmonized_str = harmonized_code.to_s
|
|
152
|
+
|
|
153
|
+
all_typed_stages.detect do |ts|
|
|
154
|
+
ts.harmonized_stages&.include?(harmonized_str)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Hash-based index of typed stages by abbreviation
|
|
159
|
+
# @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
|
|
160
|
+
# @note Memoized for O(1) lookup performance
|
|
161
|
+
def typed_stage_index
|
|
162
|
+
@typed_stage_index ||= build_typed_stage_index
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Get all identifier classes sorted by type key
|
|
166
|
+
# @return [Array<Class>] All identifier classes sorted by type key
|
|
167
|
+
# @note Memoized for performance
|
|
168
|
+
def all_identifier_classes
|
|
169
|
+
return @all_identifier_classes if defined?(@all_identifier_classes)
|
|
170
|
+
|
|
171
|
+
@all_identifier_classes = (@identifiers + @supplement_identifiers).sort_by do |klass|
|
|
172
|
+
(klass.type&.dig(:key) || "").to_s
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
alias all_identifier_classes_by_type_code all_identifier_classes
|
|
176
|
+
|
|
177
|
+
# Locate an identifier class by type code
|
|
178
|
+
# @param type_code [String, Symbol] The type code to find
|
|
179
|
+
# @return [Class, nil] The matching identifier class, or nil if not found
|
|
180
|
+
# @note Uses hash-based index for O(1) lookup, falls back to linear search
|
|
181
|
+
def locate_identifier_klass_by_type_code(type_code)
|
|
182
|
+
type_str = type_code.to_s
|
|
183
|
+
|
|
184
|
+
# Try hash-based index first (O(1))
|
|
185
|
+
identifier_klass = identifier_class_index[type_str]
|
|
186
|
+
|
|
187
|
+
# Fall back to linear search if not found
|
|
188
|
+
identifier_klass || all_identifier_classes.detect do |identifier_class|
|
|
189
|
+
identifier_class.type&.dig(:key)&.to_s == type_str
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Hash-based index of identifier classes by type code
|
|
194
|
+
# @return [Hash<String, Class>] index mapping type codes to identifier classes
|
|
195
|
+
# @note Memoized for O(1) lookup performance
|
|
196
|
+
def identifier_class_index
|
|
197
|
+
@identifier_class_index ||= build_identifier_class_index
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
protected
|
|
201
|
+
|
|
202
|
+
# Build hash-based index of typed stages by abbreviation
|
|
203
|
+
# @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
|
|
204
|
+
def build_typed_stage_index
|
|
205
|
+
all_typed_stages.each_with_object({}) do |ts, index|
|
|
206
|
+
ts.abbr.each { |abbr| index[abbr] = ts }
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Build hash-based index of identifier classes by type code
|
|
211
|
+
# @return [Hash<String, Class>] index mapping type codes to identifier classes
|
|
212
|
+
def build_identifier_class_index
|
|
213
|
+
all_identifier_classes.each_with_object({}) do |klass, index|
|
|
214
|
+
type_key = klass.type&.dig(:key)&.to_s
|
|
215
|
+
index[type_key] = klass if type_key
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module UrnGenerator
|
|
5
|
+
# Base class for all flavor-specific URN generators.
|
|
6
|
+
# Provides template methods for common URN parts.
|
|
7
|
+
# Flavors subclass and override only what differs.
|
|
8
|
+
class Base
|
|
9
|
+
attr_reader :identifier
|
|
10
|
+
|
|
11
|
+
def initialize(identifier)
|
|
12
|
+
@identifier = identifier
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def generate
|
|
16
|
+
parts = ["urn", urn_namespace]
|
|
17
|
+
parts << urn_publisher if urn_publisher
|
|
18
|
+
parts << urn_type if urn_type
|
|
19
|
+
parts << urn_number if urn_number
|
|
20
|
+
parts << urn_part if urn_part
|
|
21
|
+
parts << urn_subpart if urn_subpart
|
|
22
|
+
parts << urn_year if urn_year
|
|
23
|
+
parts << urn_edition if urn_edition
|
|
24
|
+
parts << urn_language if urn_language
|
|
25
|
+
parts.join(":")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Template methods — override in subclasses
|
|
29
|
+
|
|
30
|
+
def urn_namespace
|
|
31
|
+
flavor_name.downcase
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def urn_publisher
|
|
35
|
+
pub = maybe(:publisher)
|
|
36
|
+
return nil unless pub
|
|
37
|
+
|
|
38
|
+
pub.to_s.downcase
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def urn_type
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def urn_number
|
|
46
|
+
val = maybe(:number) || maybe(:code)
|
|
47
|
+
return nil unless val
|
|
48
|
+
|
|
49
|
+
val.is_a?(Components::Code) ? val.value.to_s : val.to_s
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def urn_part
|
|
53
|
+
val = maybe(:part)
|
|
54
|
+
return nil unless val
|
|
55
|
+
|
|
56
|
+
"-#{val.is_a?(Components::Code) ? val.value : val}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def urn_subpart
|
|
60
|
+
val = maybe(:subpart)
|
|
61
|
+
return nil unless val
|
|
62
|
+
|
|
63
|
+
"-#{val.is_a?(Components::Code) ? val.value : val}"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def urn_year
|
|
67
|
+
date = maybe(:date)
|
|
68
|
+
if date
|
|
69
|
+
year = date.is_a?(Components::Date) ? date.year : date.to_s
|
|
70
|
+
return year.to_s if year
|
|
71
|
+
end
|
|
72
|
+
if maybe(:year)
|
|
73
|
+
return identifier.year.to_s
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
nil
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def urn_edition
|
|
80
|
+
ed = maybe(:edition)
|
|
81
|
+
return nil unless ed
|
|
82
|
+
|
|
83
|
+
num = ed.is_a?(Components::Edition) ? ed.number : ed
|
|
84
|
+
return nil unless num
|
|
85
|
+
|
|
86
|
+
"ed.#{num}"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def urn_language
|
|
90
|
+
langs = maybe(:languages)
|
|
91
|
+
return nil unless langs&.any?
|
|
92
|
+
|
|
93
|
+
langs.map(&:code).join(",")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def maybe(method_name)
|
|
97
|
+
return nil unless identifier.class.attributes.key?(method_name)
|
|
98
|
+
|
|
99
|
+
identifier.public_send(method_name)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def flavor_name
|
|
105
|
+
parts = identifier.class.name.split("::")
|
|
106
|
+
parts[1] || "unknown"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|