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,71 @@
|
|
|
1
|
+
require_relative "identifiers/international_standard"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
require_relative "identifiers/technical_specification"
|
|
4
|
+
require_relative "identifiers/technical_report"
|
|
5
|
+
require_relative "identifiers/publicly_available_specification"
|
|
6
|
+
require_relative "identifiers/guide"
|
|
7
|
+
require_relative "identifiers/amendment"
|
|
8
|
+
require_relative "identifiers/corrigendum"
|
|
9
|
+
require_relative "identifiers/fragment_identifier"
|
|
10
|
+
|
|
11
|
+
module Pubid
|
|
12
|
+
module Iec
|
|
13
|
+
class Scheme < Pubid::Scheme
|
|
14
|
+
class << self
|
|
15
|
+
def identifiers
|
|
16
|
+
[
|
|
17
|
+
Identifiers::InternationalStandard,
|
|
18
|
+
Identifiers::TechnicalSpecification,
|
|
19
|
+
Identifiers::TechnicalReport,
|
|
20
|
+
Identifiers::PubliclyAvailableSpecification,
|
|
21
|
+
Identifiers::Guide,
|
|
22
|
+
]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def supplement_identifiers
|
|
26
|
+
[
|
|
27
|
+
Identifiers::Amendment,
|
|
28
|
+
Identifiers::Corrigendum,
|
|
29
|
+
Identifiers::FragmentIdentifier,
|
|
30
|
+
]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def typed_stages
|
|
34
|
+
identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def supplement_typed_stages
|
|
38
|
+
supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def locate_typed_stage_by_abbr(abbr)
|
|
42
|
+
abbr = "" if abbr.nil?
|
|
43
|
+
|
|
44
|
+
typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
|
|
45
|
+
ts.abbr.include?(abbr)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
unless typed_stage
|
|
49
|
+
raise ArgumentError,
|
|
50
|
+
"Unknown type abbreviation: '#{abbr}'"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
typed_stage
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def locate_identifier_klass_by_type_code(type_code)
|
|
57
|
+
identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
|
|
58
|
+
klass.type[:key].to_s == type_code.to_s
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
unless identifier_klass
|
|
62
|
+
raise ArgumentError,
|
|
63
|
+
"Unknown type code: #{type_code}"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
identifier_klass
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require_relative "identifier"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
require_relative "../components/typed_stage"
|
|
4
|
+
require_relative "urn_generator"
|
|
5
|
+
|
|
6
|
+
module Pubid
|
|
7
|
+
module Iec
|
|
8
|
+
class SingleIdentifier < Identifier
|
|
9
|
+
attribute :typed_stage, Components::TypedStage
|
|
10
|
+
|
|
11
|
+
# Generate URN for this identifier
|
|
12
|
+
#
|
|
13
|
+
# @return [String] URN representation
|
|
14
|
+
|
|
15
|
+
def to_s(lang: :en, lang_single: false, with_edition: false)
|
|
16
|
+
[].tap do |parts|
|
|
17
|
+
parts << publisher_portion(lang: lang)
|
|
18
|
+
parts << number_portion(lang_single: lang_single)
|
|
19
|
+
parts << edition_portion(lang: lang) if with_edition
|
|
20
|
+
end.compact.join(" ").tap do |s|
|
|
21
|
+
s << language_portion(lang_single: lang_single) if languages&.any?
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def publisher_portion(lang: :en)
|
|
26
|
+
# IEC identifiers can have copublishers (e.g., IEC/IEEE, ISO/IEC)
|
|
27
|
+
|
|
28
|
+
# Build publisher string
|
|
29
|
+
pub_string = if copublishers&.any?
|
|
30
|
+
# Has copublishers: "IEC/IEEE" or "ISO/IEC"
|
|
31
|
+
([publisher] + copublishers).map(&:body).join("/")
|
|
32
|
+
else
|
|
33
|
+
# No copublishers: just "IEC"
|
|
34
|
+
publisher.body
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Add type abbreviation if present
|
|
38
|
+
if typed_stage && !typed_stage.abbreviation.empty?
|
|
39
|
+
abbr = typed_stage.abbreviation
|
|
40
|
+
# For copublishers or empty abbr, use space; otherwise use slash
|
|
41
|
+
pub_string += if copublishers&.any? || abbr == ""
|
|
42
|
+
(abbr == "" ? "" : " #{abbr}")
|
|
43
|
+
else
|
|
44
|
+
"/#{abbr}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
pub_string
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def number_portion(lang_single: false)
|
|
52
|
+
[
|
|
53
|
+
(number ? number.to_s : ""),
|
|
54
|
+
(part ? "-#{part}" : ""),
|
|
55
|
+
(subpart ? "-#{subpart}" : ""),
|
|
56
|
+
(stage_iteration ? ".#{stage_iteration}" : ""),
|
|
57
|
+
(date ? ":#{date.year}" : ""),
|
|
58
|
+
].join
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def language_portion(lang_single: false)
|
|
62
|
+
return "" unless languages&.any?
|
|
63
|
+
|
|
64
|
+
[
|
|
65
|
+
"(",
|
|
66
|
+
languages.map do |lang|
|
|
67
|
+
lang.to_s(lang_single: lang_single)
|
|
68
|
+
end.join(lang_single ? "/" : ","),
|
|
69
|
+
")",
|
|
70
|
+
].join
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def edition_portion(lang: :en)
|
|
74
|
+
return nil unless edition&.number
|
|
75
|
+
|
|
76
|
+
"ED#{edition.number}"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
require_relative "identifier"
|
|
2
|
+
require_relative "single_identifier"
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Iec
|
|
7
|
+
# Identifier that represents a supplement to a base identifier.
|
|
8
|
+
class SupplementIdentifier < SingleIdentifier
|
|
9
|
+
attribute :base_identifier, Identifier, polymorphic: true
|
|
10
|
+
|
|
11
|
+
# Override base_identifier getter to ensure it's always created for standalone supplements
|
|
12
|
+
def base_identifier
|
|
13
|
+
@base_identifier || ensure_base_identifier
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Override number getter to trigger swap for standalone supplements
|
|
17
|
+
def number
|
|
18
|
+
# Guard against recursion in ensure_base_identifier
|
|
19
|
+
return @number if @ensuring_base
|
|
20
|
+
|
|
21
|
+
# For standalone supplements, trigger base creation first
|
|
22
|
+
ensure_base_identifier if @synthetic_base.nil? && publisher && part
|
|
23
|
+
|
|
24
|
+
if @synthetic_base
|
|
25
|
+
@supplement_number || @number
|
|
26
|
+
else
|
|
27
|
+
super
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Override part getter for standalone supplements (part becomes nil after swap)
|
|
32
|
+
def part
|
|
33
|
+
# For standalone supplements with synthetic base, part is nil (moved to number)
|
|
34
|
+
if @synthetic_base
|
|
35
|
+
nil
|
|
36
|
+
else
|
|
37
|
+
super
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Delegate publisher and copublishers to base_identifier if not set
|
|
42
|
+
def publisher
|
|
43
|
+
return @publisher if @ensuring_base
|
|
44
|
+
|
|
45
|
+
@publisher || base_identifier&.publisher
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def copublishers
|
|
49
|
+
return @copublishers if @ensuring_base
|
|
50
|
+
|
|
51
|
+
@copublishers || base_identifier&.copublishers
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Ensure we have a base_identifier for standalone supplements
|
|
55
|
+
# Creates a synthetic base identifier from supplement attributes if needed
|
|
56
|
+
# Returns the base_identifier
|
|
57
|
+
def ensure_base_identifier
|
|
58
|
+
return @base_identifier if @base_identifier
|
|
59
|
+
|
|
60
|
+
# Guard flag to prevent recursion in number getter
|
|
61
|
+
@ensuring_base = true
|
|
62
|
+
|
|
63
|
+
# For standalone supplements like "IEC/FDAM 60038-1"
|
|
64
|
+
# The supplement number is in the `part` attribute, while `number` is the base number
|
|
65
|
+
# We need to create a synthetic base and use part as the supplement number
|
|
66
|
+
return nil unless publisher && (number || part)
|
|
67
|
+
|
|
68
|
+
# Capture original values BEFORE marking as synthetic
|
|
69
|
+
# (otherwise our getters will return swapped values)
|
|
70
|
+
base_number = number
|
|
71
|
+
supplement_number = part
|
|
72
|
+
|
|
73
|
+
# NOW mark that this is a synthetic base (after capturing values)
|
|
74
|
+
@synthetic_base = true
|
|
75
|
+
|
|
76
|
+
# Use SingleIdentifier which has typed_stage attribute
|
|
77
|
+
base = SingleIdentifier.new
|
|
78
|
+
base.publisher = publisher
|
|
79
|
+
base.number = base_number if base_number
|
|
80
|
+
base.part = nil # Base doesn't have part - part is the supplement number
|
|
81
|
+
base.subpart = subpart if subpart
|
|
82
|
+
base.date = date if date
|
|
83
|
+
|
|
84
|
+
# Create typed_stage for the base - use "IS" (International Standard) type
|
|
85
|
+
# not the supplement type
|
|
86
|
+
require_relative "../components/typed_stage"
|
|
87
|
+
base.typed_stage = Pubid::Components::TypedStage.new(
|
|
88
|
+
abbr: ["IS"],
|
|
89
|
+
type_code: :is,
|
|
90
|
+
stage_code: :undated,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@base_identifier = base
|
|
94
|
+
|
|
95
|
+
# Store the supplement number for getter override
|
|
96
|
+
# The original number is the base number (moved to base_identifier)
|
|
97
|
+
# The original part is the supplement number (what we want to return)
|
|
98
|
+
@supplement_number = supplement_number
|
|
99
|
+
|
|
100
|
+
@base_identifier
|
|
101
|
+
ensure
|
|
102
|
+
@ensuring_base = false
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Check if this supplement has a synthetic base (created for standalone format)
|
|
106
|
+
def synthetic_base?
|
|
107
|
+
@synthetic_base ||= false
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def to_s(lang: :en, lang_single: false, with_edition: false)
|
|
111
|
+
# Ensure we have a base_identifier for standalone supplements
|
|
112
|
+
ensure_base_identifier
|
|
113
|
+
|
|
114
|
+
# For standalone supplements (synthetic base), use standalone format
|
|
115
|
+
# IEC/FDAM 60038-1, not IEC/IS 60038/FDAM1
|
|
116
|
+
if synthetic_base?
|
|
117
|
+
parts = []
|
|
118
|
+
|
|
119
|
+
# Publisher portion
|
|
120
|
+
if publisher
|
|
121
|
+
parts << publisher.body
|
|
122
|
+
parts << "/#{copublishers.map(&:body).join('/')}" if copublishers&.any?
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Supplement type and number with part (use base number)
|
|
126
|
+
abbr = typed_stage.abbr.first
|
|
127
|
+
number_str = base_identifier.number.to_s
|
|
128
|
+
number_str += "-#{number}" if number # supplement number
|
|
129
|
+
number_str += "-#{subpart}" if subpart
|
|
130
|
+
parts << "#{abbr} #{number_str}"
|
|
131
|
+
|
|
132
|
+
result = parts.join("/")
|
|
133
|
+
result += ":#{date.year}" if date
|
|
134
|
+
result += " #{edition}" if edition&.number
|
|
135
|
+
result
|
|
136
|
+
elsif base_identifier
|
|
137
|
+
# Normal supplement with real base identifier
|
|
138
|
+
# Format: "IEC 60050-102:2007/AMD1:2017"
|
|
139
|
+
parts = []
|
|
140
|
+
parts << base_identifier.to_s(lang: lang, lang_single: lang_single,
|
|
141
|
+
with_edition: with_edition)
|
|
142
|
+
|
|
143
|
+
# Supplement notation
|
|
144
|
+
# Use uppercase abbreviation without space: /AMD1, /COR1
|
|
145
|
+
abbr = typed_stage.abbr.first.upcase
|
|
146
|
+
supp_part = "/#{abbr}#{number}"
|
|
147
|
+
supp_part += ":#{date.year}" if date
|
|
148
|
+
parts << supp_part
|
|
149
|
+
|
|
150
|
+
# Add edition if present
|
|
151
|
+
parts << " #{edition}" if edition&.number
|
|
152
|
+
|
|
153
|
+
parts.join
|
|
154
|
+
else
|
|
155
|
+
# Fallback - shouldn't happen
|
|
156
|
+
super
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iec
|
|
5
|
+
# Generates IEC URNs in the legacy positional format used as ground truth
|
|
6
|
+
# by relaton-data-iec:
|
|
7
|
+
#
|
|
8
|
+
# urn:iec:std:{publisher}:{number}[-{part}]:{date}:{type}:{deliverable}:{language}[:{adjuncts}]
|
|
9
|
+
#
|
|
10
|
+
# e.g. +urn:iec:std:iec:60050-102:2007:::+ (type after date; trailing empty
|
|
11
|
+
# type/deliverable/language slots). This is a port of relaton-iec's
|
|
12
|
+
# +Relaton::Iec.code_to_urn+ operating on +identifier.to_s+, which
|
|
13
|
+
# round-trips faithfully. The all-parts series URN is the one exception: it
|
|
14
|
+
# omits the language slot (8 fields), so it has a dedicated branch.
|
|
15
|
+
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
16
|
+
# Deliverable markers occupying the positional deliverable slot.
|
|
17
|
+
DELIVERABLES = /cmv|csv|exv|prv|rlv|ser/.freeze
|
|
18
|
+
|
|
19
|
+
def generate
|
|
20
|
+
return series_urn if identifier.respond_to?(:all_parts) && identifier.all_parts
|
|
21
|
+
|
|
22
|
+
code_to_urn(identifier.to_s, urn_language)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
# Hyphen-joined language codes (e.g. "en-fr"), or nil when unset.
|
|
28
|
+
def urn_language
|
|
29
|
+
return nil unless identifier.respond_to?(:languages)
|
|
30
|
+
|
|
31
|
+
langs = identifier.languages
|
|
32
|
+
return nil unless langs&.any?
|
|
33
|
+
|
|
34
|
+
langs.map(&:code).join("-")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# The all-parts series URN drops the language slot and carries no part or
|
|
38
|
+
# date: urn:iec:std:iec:80000:::ser.
|
|
39
|
+
def series_urn
|
|
40
|
+
code = identifier.to_s.sub(/\s*\(all parts\)\s*\z/, "")
|
|
41
|
+
m = code.downcase.match(/(?<head>\S+)\s+(?<pnum>[\d-]+)/)
|
|
42
|
+
head = m[:head].split("/").join("-")
|
|
43
|
+
["urn", "iec", "std", head, m[:pnum], "", "", "ser"].join(":")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Port of Relaton::Iec.code_to_urn.
|
|
47
|
+
def code_to_urn(code, lang = nil)
|
|
48
|
+
rest = code.downcase.sub(%r{
|
|
49
|
+
(?<head>[^\s]+)\s
|
|
50
|
+
(?<type>is|ts|tr|pas|srd|guide|tec|wp)?(?(<type>)\s)
|
|
51
|
+
(?<pnum>[\d-]+)\s?
|
|
52
|
+
(?<_dd>:)?(?(<_dd>)(?<date>[\d-]+)\s?)
|
|
53
|
+
}x, "")
|
|
54
|
+
m = $~
|
|
55
|
+
return unless m && m[:head] && m[:pnum]
|
|
56
|
+
|
|
57
|
+
deliv = DELIVERABLES.match(code.downcase).to_s
|
|
58
|
+
urn = ["urn", "iec", "std", m[:head].split("/").join("-"), m[:pnum],
|
|
59
|
+
m[:date], m[:type], deliv, lang]
|
|
60
|
+
(urn + adjunct_to_urn(rest)).join(":")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Port of Relaton::Iec.ajunct_to_urn — recursively emits amd/cor/ish
|
|
64
|
+
# adjuncts, prefixing "plus" for the "+" (consolidated) relation.
|
|
65
|
+
def adjunct_to_urn(rest)
|
|
66
|
+
r = rest.sub(%r{
|
|
67
|
+
(?<pl>\+|/)(?(<pl>)(?<adjunct>(?:amd|cor|ish))(?<adjnum>\d+)\s?)
|
|
68
|
+
(?<_d2>:)?(?(<_d2>)(?<adjdt>[\d-]+)\s?)
|
|
69
|
+
}x, "")
|
|
70
|
+
m = $~ || {}
|
|
71
|
+
return [] unless m[:adjunct]
|
|
72
|
+
|
|
73
|
+
plus = "plus" if m[:pl] == "+"
|
|
74
|
+
urn = [plus, m[:adjunct], m[:adjnum], m[:adjdt]]
|
|
75
|
+
urn + adjunct_to_urn(r)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iec
|
|
5
|
+
# Parses IEC URNs in the legacy positional format (relaton-data-iec ground
|
|
6
|
+
# truth):
|
|
7
|
+
#
|
|
8
|
+
# urn:iec:std:{publisher}:{number}[-{part}]:{date}:{type}:{deliverable}:{language}[:{adjuncts}]
|
|
9
|
+
#
|
|
10
|
+
# Examples:
|
|
11
|
+
# - urn:iec:std:iec:60050:2011:::
|
|
12
|
+
# - urn:iec:std:iec:62547:2013:tr:: (type after date)
|
|
13
|
+
# - urn:iec:std:iec:60050-102:2007:::::amd:1:2017
|
|
14
|
+
# - urn:iec:std:iec:60034-16-3:1996:ts::fr (deliverable empty, language fr)
|
|
15
|
+
# - urn:iec:std:iec:80000:::ser (all-parts series)
|
|
16
|
+
#
|
|
17
|
+
# This is a port of relaton-iec's +urn_to_code+: the positional fields are
|
|
18
|
+
# reassembled into a code string which is then run through the text parser
|
|
19
|
+
# (+Identifier.parse+), so there is a single source of truth for building
|
|
20
|
+
# the identifier object.
|
|
21
|
+
class UrnParser
|
|
22
|
+
# Parse IEC URN string
|
|
23
|
+
# @param urn [String] URN string to parse
|
|
24
|
+
# @return [Identifier] parsed identifier
|
|
25
|
+
def self.parse(urn)
|
|
26
|
+
new.parse_urn(urn)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Parse URN string into identifier
|
|
30
|
+
# @param urn [String] URN string
|
|
31
|
+
# @return [Identifier] parsed identifier
|
|
32
|
+
def parse_urn(urn)
|
|
33
|
+
unless urn.start_with?("urn:iec:std:")
|
|
34
|
+
raise Errors::ParseError, "Invalid IEC URN: #{urn}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
code, lang, all_parts = urn_to_code(urn)
|
|
38
|
+
raise Errors::ParseError, "Invalid IEC URN: #{urn}" unless code
|
|
39
|
+
|
|
40
|
+
id = Pubid::Iec::Identifier.parse(code)
|
|
41
|
+
id.all_parts = true if all_parts && id.respond_to?(:all_parts=)
|
|
42
|
+
if lang && !lang.empty? && id.respond_to?(:languages=)
|
|
43
|
+
id.languages = [::Pubid::Components::Language.new(code: lang)]
|
|
44
|
+
end
|
|
45
|
+
id
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# Port of Relaton::Iec.urn_to_code. Reassembles the positional URN fields
|
|
51
|
+
# into a text code string. Returns [code, language, all_parts].
|
|
52
|
+
def urn_to_code(urn)
|
|
53
|
+
fields = urn.upcase.split(":")
|
|
54
|
+
return if fields.size < 5
|
|
55
|
+
|
|
56
|
+
head, num, date, type, deliv, lang = fields[3, 8]
|
|
57
|
+
all_parts = false
|
|
58
|
+
|
|
59
|
+
code = head.gsub("-", "/")
|
|
60
|
+
code += " #{type}" unless type.nil? || type.empty?
|
|
61
|
+
code += " #{num}"
|
|
62
|
+
code += ":#{date}" unless date.nil? || date.empty?
|
|
63
|
+
code += adjunct_to_code(fields[9..])
|
|
64
|
+
|
|
65
|
+
# "ser" marks an all-parts series rather than a deliverable suffix; it
|
|
66
|
+
# is signalled out-of-band (the code built from a series URN carries no
|
|
67
|
+
# part or date, so to_s renders "IEC NNNN (all parts)").
|
|
68
|
+
if deliv && deliv.casecmp("SER").zero?
|
|
69
|
+
all_parts = true
|
|
70
|
+
elsif deliv && !deliv.empty?
|
|
71
|
+
code += " #{deliv}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
[code, lang&.downcase, all_parts]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Port of Relaton::Iec.ajanct_to_code — recursively rebuilds amd/cor/ish
|
|
78
|
+
# adjuncts from (relation, type, number, date) quartets. A "PLUS"
|
|
79
|
+
# relation token (the consolidated "+" marker) yields "+"; otherwise "/".
|
|
80
|
+
def adjunct_to_code(fields)
|
|
81
|
+
return "" if fields.nil? || fields.empty?
|
|
82
|
+
|
|
83
|
+
rel, type, num, date = fields[0..3]
|
|
84
|
+
code = (rel.empty? ? "/" : "+") + type + num
|
|
85
|
+
code += ":#{date}" unless date.nil? || date.empty?
|
|
86
|
+
code + adjunct_to_code(fields[4..])
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
data/lib/pubid/iec.rb
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iec
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Require scheme first
|
|
9
|
+
require_relative "scheme"
|
|
10
|
+
|
|
11
|
+
# Require all identifier classes
|
|
12
|
+
require_relative "iec/identifiers/international_standard"
|
|
13
|
+
require_relative "iec/identifiers/technical_report"
|
|
14
|
+
require_relative "iec/identifiers/technical_specification"
|
|
15
|
+
require_relative "iec/identifiers/publicly_available_specification"
|
|
16
|
+
require_relative "iec/identifiers/guide"
|
|
17
|
+
require_relative "iec/identifiers/test_report_form"
|
|
18
|
+
require_relative "iec/identifiers/interpretation_sheet"
|
|
19
|
+
require_relative "iec/identifiers/systems_reference_document"
|
|
20
|
+
require_relative "iec/identifiers/working_document"
|
|
21
|
+
require_relative "iec/identifiers/amendment"
|
|
22
|
+
require_relative "iec/identifiers/corrigendum"
|
|
23
|
+
|
|
24
|
+
# Wrapper identifier types
|
|
25
|
+
require_relative "iec/identifiers/vap_identifier"
|
|
26
|
+
require_relative "iec/identifiers/sheet_identifier"
|
|
27
|
+
require_relative "iec/identifiers/consolidated_identifier"
|
|
28
|
+
require_relative "iec/identifiers/fragment_identifier"
|
|
29
|
+
|
|
30
|
+
# Additional document types
|
|
31
|
+
require_relative "iec/identifiers/component_specification"
|
|
32
|
+
require_relative "iec/identifiers/operational_document"
|
|
33
|
+
require_relative "iec/identifiers/societal_technology_trend_report"
|
|
34
|
+
require_relative "iec/identifiers/white_paper"
|
|
35
|
+
|
|
36
|
+
module Pubid
|
|
37
|
+
module Iec
|
|
38
|
+
# Primary document types (not supplements)
|
|
39
|
+
IDENTIFIER_TYPES = [
|
|
40
|
+
Identifiers::InternationalStandard,
|
|
41
|
+
Identifiers::TechnicalReport,
|
|
42
|
+
Identifiers::TechnicalSpecification,
|
|
43
|
+
Identifiers::PubliclyAvailableSpecification,
|
|
44
|
+
Identifiers::Guide,
|
|
45
|
+
Identifiers::TestReportForm,
|
|
46
|
+
Identifiers::InterpretationSheet,
|
|
47
|
+
Identifiers::SystemsReferenceDocument,
|
|
48
|
+
Identifiers::WorkingDocument,
|
|
49
|
+
].freeze
|
|
50
|
+
|
|
51
|
+
# Supplement types (can appear with / notation)
|
|
52
|
+
SUPPLEMENT_IDENTIFIER_TYPES = [
|
|
53
|
+
Identifiers::Amendment,
|
|
54
|
+
Identifiers::Corrigendum,
|
|
55
|
+
Identifiers::InterpretationSheet, # ISH can act as supplement (/ISH1:1996)
|
|
56
|
+
Identifiers::FragmentIdentifier, # FRAG wraps amendments/corrigenda
|
|
57
|
+
].freeze
|
|
58
|
+
|
|
59
|
+
# Create the Scheme registry with all identifier types
|
|
60
|
+
Scheme = Pubid::Scheme.new(
|
|
61
|
+
identifiers: IDENTIFIER_TYPES,
|
|
62
|
+
supplement_identifiers: SUPPLEMENT_IDENTIFIER_TYPES,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Main entry point for IEC identifiers
|
|
66
|
+
def self.parse(identifier_string)
|
|
67
|
+
parsed = Parser.new.parse(identifier_string)
|
|
68
|
+
Builder.new(Scheme).build(parsed)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Parse an IEC URN string
|
|
72
|
+
# @param urn [String] the URN string to parse
|
|
73
|
+
# @return [Identifier] the parsed identifier
|
|
74
|
+
# @raise [Errors::ParseError] if URN is invalid
|
|
75
|
+
def self.parse_urn(urn)
|
|
76
|
+
UrnParser.parse(urn)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
require_relative "iec/urn_parser"
|
|
82
|
+
require_relative "iec/builder"
|
|
83
|
+
require_relative "iec/parser"
|
|
84
|
+
|
|
85
|
+
Pubid::Registry.register(:iec, Pubid::Iec)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Ieee
|
|
5
|
+
module Aiee
|
|
6
|
+
# Builder for AIEE identifiers
|
|
7
|
+
class Builder
|
|
8
|
+
def build(parsed)
|
|
9
|
+
attributes = {}
|
|
10
|
+
|
|
11
|
+
# Extract and normalize publisher
|
|
12
|
+
# All AIEE variants (AIEE, A.I.E.E., A. I. E. E., IEEE-AIEE) normalize to "AIEE"
|
|
13
|
+
attributes[:publisher] = "AIEE"
|
|
14
|
+
|
|
15
|
+
# Extract and normalize type
|
|
16
|
+
type_str = extract_value(parsed[:type])
|
|
17
|
+
# Normalize compound types like "Standard No." to "No"
|
|
18
|
+
# Also normalize "Standard No" (without dot) to "No"
|
|
19
|
+
attributes[:type] = if type_str&.start_with?("Standard")
|
|
20
|
+
"No"
|
|
21
|
+
else
|
|
22
|
+
type_str
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Extract code
|
|
26
|
+
code_str = extract_value(parsed[:number])
|
|
27
|
+
if code_str
|
|
28
|
+
attributes[:code] = Components::Code.parse(code_str)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Extract year (convert to string for consistency)
|
|
32
|
+
year_str = extract_value(parsed[:year])
|
|
33
|
+
attributes[:year] = year_str&.to_s
|
|
34
|
+
|
|
35
|
+
# Extract month
|
|
36
|
+
month_str = extract_value(parsed[:month])
|
|
37
|
+
attributes[:month] = month_str if month_str
|
|
38
|
+
|
|
39
|
+
# Extract separator (for rendering distinction)
|
|
40
|
+
separator_str = extract_value(parsed[:separator])
|
|
41
|
+
attributes[:separator] = separator_str if separator_str
|
|
42
|
+
|
|
43
|
+
# Set original format based on parsed data
|
|
44
|
+
attributes[:original_format] = if separator_str || month_str
|
|
45
|
+
"long"
|
|
46
|
+
else
|
|
47
|
+
"short"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Create identifier
|
|
51
|
+
Identifier.new(**attributes)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def extract_value(value)
|
|
57
|
+
return nil if value.nil?
|
|
58
|
+
return nil if value.is_a?(Array) && value.empty?
|
|
59
|
+
|
|
60
|
+
if value.is_a?(Array)
|
|
61
|
+
joined = value.join
|
|
62
|
+
return joined.length.positive? ? joined : nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
str_value = value.to_s.strip
|
|
66
|
+
str_value.length.positive? ? str_value : nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|