pubid 1.15.18 → 2.0.0.pre.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/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 +87 -0
- data/data/plateau/update_codes.yaml +6 -0
- data/lib/pubid/amca/builder.rb +176 -0
- data/lib/pubid/amca/identifier.rb +18 -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 +13 -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 +21 -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 +18 -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 +15 -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 +15 -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 +27 -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 +16 -0
- data/lib/pubid/ccsds/identifiers/base.rb +78 -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 +74 -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 +15 -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 +18 -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/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 +55 -0
- data/lib/pubid/components.rb +15 -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 +457 -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 +14 -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 +235 -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 +69 -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 +457 -0
- data/lib/pubid/iec/components/code.rb +59 -0
- data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
- data/lib/pubid/iec/components/publisher.rb +35 -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 +21 -0
- data/lib/pubid/iec/identifiers/amendment.rb +94 -0
- data/lib/pubid/iec/identifiers/base.rb +78 -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 +86 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -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 +66 -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 +77 -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 +412 -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 +193 -0
- data/lib/pubid/iec/urn_parser.rb +289 -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 +13 -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 +19 -0
- data/lib/pubid/iho/identifiers/base.rb +41 -0
- data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
- data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
- data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
- data/lib/pubid/iho/identifiers/publication.rb +19 -0
- data/lib/pubid/iho/identifiers/standard.rb +19 -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 +305 -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 +69 -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 +510 -0
- data/lib/pubid/iso/rendering_style.rb +120 -0
- data/lib/pubid/iso/scheme.rb +187 -0
- data/lib/pubid/iso/single_identifier.rb +61 -0
- data/lib/pubid/iso/supplement_identifier.rb +27 -0
- data/lib/pubid/iso/urn_generator.rb +412 -0
- data/lib/pubid/iso/urn_parser.rb +423 -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 +53 -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 +11 -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 +18 -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 +2100 -0
- data/lib/pubid/nist/components/code.rb +38 -0
- data/lib/pubid/nist/components/edition.rb +118 -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 +121 -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/identifiers/base.rb +499 -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 +135 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -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 +68 -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 +1084 -0
- data/lib/pubid/nist/scheme.rb +199 -0
- data/lib/pubid/nist/supplement_identifier.rb +83 -0
- data/lib/pubid/nist/urn_generator.rb +127 -0
- data/lib/pubid/nist.rb +36 -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 +11 -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/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 +25 -0
- data/lib/pubid/renderers/base.rb +19 -0
- data/lib/pubid/renderers/directives_renderer.rb +62 -0
- data/lib/pubid/renderers/guide_renderer.rb +20 -0
- data/lib/pubid/renderers/human_readable.rb +58 -0
- data/lib/pubid/renderers/iwa_renderer.rb +16 -0
- data/lib/pubid/renderers/mr_string.rb +16 -0
- data/lib/pubid/renderers/supplement_renderer.rb +33 -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 +156 -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 +14 -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 +207 -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 +613 -171
- data/lib/pubid/registry.rb +0 -30
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
require_relative "../components/publisher"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
require_relative "../components/code"
|
|
4
|
+
require_relative "../components/date"
|
|
5
|
+
|
|
6
|
+
module Pubid
|
|
7
|
+
module Iec
|
|
8
|
+
class Builder < Pubid::Builder::Base
|
|
9
|
+
def initialize(scheme)
|
|
10
|
+
@scheme = scheme
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def locate_identifier_klass(parsed_hash)
|
|
14
|
+
# Check for working programme
|
|
15
|
+
if parsed_hash[:wp_stage]
|
|
16
|
+
require_relative "identifiers/working_document"
|
|
17
|
+
return Identifiers::WorkingDocument
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Check for working document
|
|
21
|
+
if parsed_hash[:technical_committee] && parsed_hash[:wd_number]
|
|
22
|
+
require_relative "identifiers/working_document"
|
|
23
|
+
return Identifiers::WorkingDocument
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Check the `:type_with_stage` to determine the identifier class
|
|
27
|
+
# :type_with_stage will be nil if it is an IS.
|
|
28
|
+
typed_stage = locate_typed_stage(parsed_hash[:type_with_stage])
|
|
29
|
+
|
|
30
|
+
@scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def build(parsed_hash)
|
|
34
|
+
# Handle sheet_supplement_identifier pattern:
|
|
35
|
+
# {base_identifier: {...}, sheet_number: ..., sheet_year: ..., type_with_stage: "COR", number_with_part: "1", date: "1995"}
|
|
36
|
+
# This is a Corrigendum/Amendment wrapping a SheetIdentifier
|
|
37
|
+
if parsed_hash[:base_identifier] && (parsed_hash[:sheet_number] || parsed_hash[:sheet_year]) && parsed_hash[:type_with_stage]
|
|
38
|
+
# Extract sheet info first
|
|
39
|
+
sheet_number = parsed_hash.delete(:sheet_number)
|
|
40
|
+
sheet_year = parsed_hash.delete(:sheet_year)
|
|
41
|
+
|
|
42
|
+
# Build the base identifier (IEC 60695-2-1 with /1:1994 -> SheetIdentifier)
|
|
43
|
+
base_parsed = parsed_hash[:base_identifier].dup
|
|
44
|
+
base_parsed[:sheet_number] = sheet_number
|
|
45
|
+
base_parsed[:sheet_year] = sheet_year if sheet_year
|
|
46
|
+
sheet_id = wrap_with_sheet(build(base_parsed), sheet_number,
|
|
47
|
+
sheet_year)
|
|
48
|
+
|
|
49
|
+
# Now build the supplement on top of the sheet
|
|
50
|
+
# We need to preserve the supplement data and create a wrapper
|
|
51
|
+
supplement_type = parsed_hash.delete(:type_with_stage)
|
|
52
|
+
supplement_number = parsed_hash.delete(:number_with_part)
|
|
53
|
+
supplement_date = parsed_hash.delete(:date)
|
|
54
|
+
supplement_edition = parsed_hash.delete(:edition)
|
|
55
|
+
|
|
56
|
+
# Locate the supplement identifier class
|
|
57
|
+
typed_stage = locate_typed_stage(supplement_type)
|
|
58
|
+
identifier_class = @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
|
|
59
|
+
|
|
60
|
+
# Create the supplement identifier
|
|
61
|
+
supplement = identifier_class.new
|
|
62
|
+
supp_attrs = identifier_class.attributes
|
|
63
|
+
if supp_attrs.key?(:number)
|
|
64
|
+
supplement.number = Components::Code.new(value: supplement_number.to_s)
|
|
65
|
+
end
|
|
66
|
+
if supplement_date && supp_attrs.key?(:date)
|
|
67
|
+
supplement.date = cast(:date, supplement_date)
|
|
68
|
+
end
|
|
69
|
+
if supplement_edition && supp_attrs.key?(:edition)
|
|
70
|
+
supplement.edition = cast(:edition, supplement_edition)
|
|
71
|
+
end
|
|
72
|
+
supplement.typed_stage = typed_stage
|
|
73
|
+
|
|
74
|
+
# Wrap the sheet with the supplement
|
|
75
|
+
return wrap_with_supplement(sheet_id, supplement)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Handle sheet_identifier pattern: {base_identifier: {...}, sheet_number: ..., sheet_year: ...}
|
|
79
|
+
if parsed_hash[:base_identifier] && (parsed_hash[:sheet_number] || parsed_hash[:sheet_year])
|
|
80
|
+
# Build the base identifier first
|
|
81
|
+
base_id = build(parsed_hash[:base_identifier])
|
|
82
|
+
# Wrap with SheetIdentifier
|
|
83
|
+
sheet_number = parsed_hash.delete(:sheet_number)
|
|
84
|
+
sheet_year = parsed_hash.delete(:sheet_year)
|
|
85
|
+
return wrap_with_sheet(base_id, sheet_number, sheet_year)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Extract FRAG/FRAGC indicator if present
|
|
89
|
+
frag_abbrs = Pubid::Iec::Identifiers::FragmentIdentifier::TYPED_STAGES
|
|
90
|
+
.flat_map(&:abbr)
|
|
91
|
+
is_fragment = frag_abbrs.include?(parsed_hash[:type_with_stage]) ||
|
|
92
|
+
parsed_hash[:type_with_stage] == "FRAGC"
|
|
93
|
+
fragment_typed_stage = nil
|
|
94
|
+
fragment_number = nil
|
|
95
|
+
fragment_edition = nil
|
|
96
|
+
|
|
97
|
+
if is_fragment
|
|
98
|
+
# For FRAG typed stages, look up the fragment's own typed stage
|
|
99
|
+
begin
|
|
100
|
+
fragment_typed_stage = @scheme.locate_typed_stage_by_abbr(
|
|
101
|
+
parsed_hash[:type_with_stage].to_s,
|
|
102
|
+
)
|
|
103
|
+
rescue ArgumentError
|
|
104
|
+
# FRAGC is a rendering notation, not a typed stage abbreviation
|
|
105
|
+
fragment_typed_stage = @scheme.locate_typed_stage_by_abbr("FRAG")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# For FRAG/FRAGC, we need to build the base Amendment/Corrigendum
|
|
109
|
+
# then wrap it with FragmentIdentifier
|
|
110
|
+
if parsed_hash[:number_with_part]
|
|
111
|
+
fragment_number = parsed_hash[:number_with_part].to_s
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Extract edition for fragment
|
|
115
|
+
fragment_edition = parsed_hash.delete(:edition)
|
|
116
|
+
|
|
117
|
+
# Build the base identifier (Amendment/Corrigendum) directly
|
|
118
|
+
if parsed_hash[:base_identifier]
|
|
119
|
+
base_id = build(parsed_hash[:base_identifier])
|
|
120
|
+
return wrap_with_fragment(base_id, fragment_number,
|
|
121
|
+
fragment_edition, fragment_typed_stage)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Check for TRF with CISPR - build embedded identifier
|
|
126
|
+
trf_org = parsed_hash.delete(:trf_org)
|
|
127
|
+
if trf_org && parsed_hash[:number_with_part]
|
|
128
|
+
# Build CISPR identifier without year
|
|
129
|
+
cispr_number = parsed_hash.delete(:number_with_part)
|
|
130
|
+
cispr_id = Identifiers::InternationalStandard.new(
|
|
131
|
+
publisher: Components::Publisher.new(body: "CISPR"),
|
|
132
|
+
)
|
|
133
|
+
# Set number via cast
|
|
134
|
+
number_components = cast(:number_with_part, cispr_number)
|
|
135
|
+
attrs = cispr_id.class.attributes
|
|
136
|
+
number_components.each_pair do |k, v|
|
|
137
|
+
cispr_id.public_send("#{k}=", v) if attrs.key?(k.to_sym)
|
|
138
|
+
end
|
|
139
|
+
parsed_hash[:cispr_identifier] = cispr_id
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Extract and store wrapper data before building
|
|
143
|
+
consolidated_supplements_data = parsed_hash.delete(:consolidated_supplements)
|
|
144
|
+
vap_suffix_data = parsed_hash.delete(:vap_suffix)
|
|
145
|
+
# Note: sheet_number and sheet_year are now handled in sheet_identifier check above
|
|
146
|
+
fragment_type_data = parsed_hash.delete(:fragment_type)
|
|
147
|
+
fragment_number_data = parsed_hash.delete(:fragment_number)
|
|
148
|
+
|
|
149
|
+
# Instantiate the identifier based on the typed stage
|
|
150
|
+
identifier = locate_identifier_klass(parsed_hash).new
|
|
151
|
+
|
|
152
|
+
# For French GUIDE entries: "Guide IEC 51:1999"
|
|
153
|
+
if type_with_stage_fr = parsed_hash.delete(:type_with_stage_fr)
|
|
154
|
+
parsed_hash[:type_with_stage] = type_with_stage_fr
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
assign_attributes(identifier, parsed_hash)
|
|
158
|
+
|
|
159
|
+
# Detect rendering style from parsed abbreviation
|
|
160
|
+
if identifier.class.attributes.key?(:rendering_style) && identifier.typed_stage
|
|
161
|
+
require_relative "rendering_style"
|
|
162
|
+
ts = identifier.typed_stage
|
|
163
|
+
|
|
164
|
+
# Detect IEC format from parsed abbreviation
|
|
165
|
+
# IEC uses space to indicate long form: "Amd 1", "Cor 1"
|
|
166
|
+
# No space indicates short form: "AMD1", "COR1"
|
|
167
|
+
stage_format_long = if ts.long_abbr && ts.original_abbr&.include?(" ")
|
|
168
|
+
true # Long form has space: "Amd 1", "Cor 1"
|
|
169
|
+
elsif ts.short_abbr && ts.original_abbr && !ts.original_abbr.include?(" ")
|
|
170
|
+
false # Short form: "AMD1", "COR1", "CDV", "FDIS"
|
|
171
|
+
else
|
|
172
|
+
false # Default to short/canonical
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Detect language code format from parsed languages
|
|
176
|
+
langs = if identifier.class.attributes.key?(:languages)
|
|
177
|
+
identifier.languages
|
|
178
|
+
end
|
|
179
|
+
with_language_code = if langs&.any?
|
|
180
|
+
# Check if original_code was single-char (E, F, R, A, S, D)
|
|
181
|
+
first_lang = langs.first
|
|
182
|
+
if first_lang.is_a?(Components::Language) && first_lang.original_code && first_lang.original_code.length == 1
|
|
183
|
+
:single
|
|
184
|
+
else
|
|
185
|
+
:iso # 2-char codes (en, fr, ru, ar, es, de)
|
|
186
|
+
end
|
|
187
|
+
else
|
|
188
|
+
:none
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# with_date is always true for base identifiers (show the date if present)
|
|
192
|
+
# Only supplements might have undated references
|
|
193
|
+
with_date = true
|
|
194
|
+
|
|
195
|
+
# Create custom rendering style based on parsed format
|
|
196
|
+
identifier.rendering_style = RenderingStyle.new(
|
|
197
|
+
with_language_code: with_language_code,
|
|
198
|
+
stage_format_long: stage_format_long,
|
|
199
|
+
with_date: with_date,
|
|
200
|
+
)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# After building base identifier, apply wrappers
|
|
204
|
+
if fragment_type_data && fragment_number_data
|
|
205
|
+
frag_ts = @scheme.locate_typed_stage_by_abbr("FRAG")
|
|
206
|
+
identifier = wrap_with_fragment(identifier, fragment_number_data.to_s,
|
|
207
|
+
nil, frag_ts)
|
|
208
|
+
end
|
|
209
|
+
# Note: sheet wrapping is now handled earlier in build method for sheet_identifier pattern
|
|
210
|
+
if consolidated_supplements_data
|
|
211
|
+
identifier = wrap_with_consolidated(identifier,
|
|
212
|
+
consolidated_supplements_data)
|
|
213
|
+
end
|
|
214
|
+
if vap_suffix_data
|
|
215
|
+
identifier = wrap_with_vap(identifier,
|
|
216
|
+
vap_suffix_data)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
identifier
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def handle_key(identifier, key, value)
|
|
223
|
+
if key == :joint_identifier
|
|
224
|
+
identifier.additional_identifiers ||= []
|
|
225
|
+
identifier.additional_identifiers << value
|
|
226
|
+
true
|
|
227
|
+
else
|
|
228
|
+
false
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# Wrap identifier with FragmentIdentifier for /FRAGN notation
|
|
233
|
+
def wrap_with_fragment(base_identifier, fragment_number,
|
|
234
|
+
edition_data = nil, typed_stage = nil)
|
|
235
|
+
require_relative "identifiers/fragment_identifier"
|
|
236
|
+
|
|
237
|
+
fragment = Identifiers::FragmentIdentifier.new(
|
|
238
|
+
base_identifier: base_identifier,
|
|
239
|
+
fragment_number: fragment_number,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# Set typed stage if provided
|
|
243
|
+
fragment.typed_stage = typed_stage if typed_stage
|
|
244
|
+
|
|
245
|
+
# Set edition if provided
|
|
246
|
+
if edition_data
|
|
247
|
+
fragment.edition = cast(:edition, edition_data)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
fragment
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Wrap identifier with SheetIdentifier for /N:YEAR notation
|
|
254
|
+
def wrap_with_sheet(base_identifier, sheet_number, sheet_year)
|
|
255
|
+
require_relative "identifiers/sheet_identifier"
|
|
256
|
+
|
|
257
|
+
# Only pass year if it's present
|
|
258
|
+
year_value = sheet_year&.to_s
|
|
259
|
+
|
|
260
|
+
Identifiers::SheetIdentifier.new(
|
|
261
|
+
base_identifier: base_identifier,
|
|
262
|
+
sheet_number: sheet_number.to_s,
|
|
263
|
+
year: year_value,
|
|
264
|
+
)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Wrap base identifier with supplement (Amendment/Corrigendum)
|
|
268
|
+
def wrap_with_supplement(base_identifier, supplement)
|
|
269
|
+
supplement.base_identifier = base_identifier
|
|
270
|
+
supplement
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Wrap identifier with ConsolidatedIdentifier for +AMD chains
|
|
274
|
+
def wrap_with_consolidated(base_identifier, supplements_data)
|
|
275
|
+
require_relative "identifiers/consolidated_identifier"
|
|
276
|
+
require_relative "identifiers/amendment"
|
|
277
|
+
require_relative "identifiers/corrigendum"
|
|
278
|
+
|
|
279
|
+
supplements = supplements_data.filter_map do |supp|
|
|
280
|
+
type = supp[:supplement_type].to_s
|
|
281
|
+
number = supp[:supplement_number].to_s
|
|
282
|
+
year = supp[:supplement_year]
|
|
283
|
+
|
|
284
|
+
# Only create Date component if year is present
|
|
285
|
+
date_component = year ? Pubid::Components::Date.new(year: year.to_s) : nil
|
|
286
|
+
|
|
287
|
+
if type == "AMD"
|
|
288
|
+
Identifiers::Amendment.new(
|
|
289
|
+
number: Components::Code.new(value: number),
|
|
290
|
+
date: date_component,
|
|
291
|
+
)
|
|
292
|
+
elsif type == "COR"
|
|
293
|
+
Identifiers::Corrigendum.new(
|
|
294
|
+
number: Components::Code.new(value: number),
|
|
295
|
+
date: date_component,
|
|
296
|
+
)
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
Identifiers::ConsolidatedIdentifier.new(
|
|
301
|
+
identifiers: [base_identifier] + supplements,
|
|
302
|
+
)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Wrap identifier with VapIdentifier for CSV/CMV/RLV/SER suffix
|
|
306
|
+
def wrap_with_vap(base_identifier, vap_suffix_data)
|
|
307
|
+
require_relative "identifiers/vap_identifier"
|
|
308
|
+
require_relative "identifiers/consolidated_identifier"
|
|
309
|
+
require_relative "components/vap_suffix"
|
|
310
|
+
|
|
311
|
+
vap_suffix = Components::VapSuffix.new(code: vap_suffix_data.to_s)
|
|
312
|
+
|
|
313
|
+
# Extract edition - need to go deep for ConsolidatedIdentifier
|
|
314
|
+
edition = nil
|
|
315
|
+
if base_identifier.is_a?(Identifiers::ConsolidatedIdentifier)
|
|
316
|
+
# Edition is on the first identifier (base document)
|
|
317
|
+
base_first = base_identifier.identifiers.first
|
|
318
|
+
if base_first && base_first.class.attributes.key?(:edition)
|
|
319
|
+
edition = base_first.edition
|
|
320
|
+
base_first.edition = nil
|
|
321
|
+
end
|
|
322
|
+
elsif base_identifier.class.attributes.key?(:edition)
|
|
323
|
+
edition = base_identifier.edition
|
|
324
|
+
base_identifier.edition = nil
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
Identifiers::VapIdentifier.new(
|
|
328
|
+
base_identifier: base_identifier,
|
|
329
|
+
vap_suffix: vap_suffix,
|
|
330
|
+
edition: edition,
|
|
331
|
+
)
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def convert_roman_to_integer(roman_numeral)
|
|
335
|
+
return roman_numeral if roman_numeral.to_s.upcase == "X"
|
|
336
|
+
|
|
337
|
+
super
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def cast(type, value)
|
|
341
|
+
case type
|
|
342
|
+
when :base_identifier
|
|
343
|
+
# If it has a base identifier, we need to build a supplement
|
|
344
|
+
# We assume that the base identifier is already a valid Identifier object
|
|
345
|
+
build(value)
|
|
346
|
+
|
|
347
|
+
when :publisher
|
|
348
|
+
Components::Publisher.new(body: value)
|
|
349
|
+
|
|
350
|
+
when :copublishers
|
|
351
|
+
if value.nil? || value.empty?
|
|
352
|
+
nil
|
|
353
|
+
else
|
|
354
|
+
value.map do |copublisher|
|
|
355
|
+
Components::Publisher.new(body: copublisher[:copublisher])
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
when :technical_committee, :wd_number, :wd_stage, :wd_language, :wp_stage, :wp_type
|
|
360
|
+
# Working document/programme fields - just return as string
|
|
361
|
+
value.to_s
|
|
362
|
+
|
|
363
|
+
when :cispr_identifier
|
|
364
|
+
# CISPR identifier object for TRF
|
|
365
|
+
value
|
|
366
|
+
|
|
367
|
+
when :number
|
|
368
|
+
# Plain number for sub-org identifiers (CA, IECQ CS, IECQ OD)
|
|
369
|
+
# Just return as Code component
|
|
370
|
+
{ number: Components::Code.new(value: value.to_s) }
|
|
371
|
+
|
|
372
|
+
when :number_with_part
|
|
373
|
+
# "60038" (no part)
|
|
374
|
+
# or "60038-1" ('1' is part)
|
|
375
|
+
# or "60038-1-2" ('1' is part, '2' is subpart)
|
|
376
|
+
# or "29110-5-1-1" ('5' is part, '1-1' is subpart)
|
|
377
|
+
|
|
378
|
+
# Split the number into parts
|
|
379
|
+
normalized_value = value.to_s.tr(Parser::DASH_CHARS.join, "-")
|
|
380
|
+
|
|
381
|
+
parts = normalized_value.split("-")
|
|
382
|
+
number = parts.shift # The first part is always the number
|
|
383
|
+
part = parts.shift # The second part is the part, if present
|
|
384
|
+
subpart = parts.any? ? parts.join("-") : nil # The remaining parts form the subpart, if present
|
|
385
|
+
|
|
386
|
+
part = convert_roman_to_integer(part)
|
|
387
|
+
|
|
388
|
+
code_hash = { number: Components::Code.new(value: number) }
|
|
389
|
+
|
|
390
|
+
if part
|
|
391
|
+
code_hash[:part] = Components::Code.new(value: part)
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
if subpart
|
|
395
|
+
code_hash[:subpart] = Components::Code.new(value: subpart)
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
code_hash
|
|
399
|
+
|
|
400
|
+
when :type_with_stage
|
|
401
|
+
# "WD"
|
|
402
|
+
# "TS"
|
|
403
|
+
# "Guide"
|
|
404
|
+
# FRAG typed stages are handled in the is_fragment check above
|
|
405
|
+
|
|
406
|
+
iteration = value.to_s.match(/(\d+)$/)
|
|
407
|
+
value = value.to_s.sub(iteration.to_s, "")
|
|
408
|
+
typed_stage = locate_typed_stage(value || "")
|
|
409
|
+
|
|
410
|
+
## IMPORTANT!!
|
|
411
|
+
# Always use TypedStage in an Identifier or separate Type and Stage.
|
|
412
|
+
{
|
|
413
|
+
stage: typed_stage.to_stage,
|
|
414
|
+
type: typed_stage.to_type,
|
|
415
|
+
typed_stage: typed_stage,
|
|
416
|
+
}
|
|
417
|
+
when :stage_iteration
|
|
418
|
+
# "1" or "2"
|
|
419
|
+
Components::Code.new(value: value.to_s)
|
|
420
|
+
|
|
421
|
+
when :date
|
|
422
|
+
parse_date(value)
|
|
423
|
+
|
|
424
|
+
when :edition
|
|
425
|
+
Pubid::Components::Edition.new(number: value)
|
|
426
|
+
|
|
427
|
+
when :sheet_number
|
|
428
|
+
value.to_s
|
|
429
|
+
|
|
430
|
+
when :sheet_year
|
|
431
|
+
value.to_s
|
|
432
|
+
|
|
433
|
+
when :languages
|
|
434
|
+
parse_languages(value)
|
|
435
|
+
|
|
436
|
+
when :all_parts
|
|
437
|
+
Pubid::Components::Locality.new(all_parts: true)
|
|
438
|
+
|
|
439
|
+
when :database
|
|
440
|
+
# Database flag - return true if DB suffix present
|
|
441
|
+
true
|
|
442
|
+
|
|
443
|
+
# Handle joint identifiers with ISO
|
|
444
|
+
when :joint_identifier
|
|
445
|
+
case value[:publisher]
|
|
446
|
+
when "ISO"
|
|
447
|
+
require_relative "../iso/builder"
|
|
448
|
+
Iso::Builder.new(Iso::Scheme).build(value)
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
else
|
|
452
|
+
raise ArgumentError, "Unknown parameter type: #{type}"
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require "lutaml/model"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Pubid
|
|
5
|
+
module Iec
|
|
6
|
+
module Components
|
|
7
|
+
class Code < Lutaml::Model::Serializable
|
|
8
|
+
attribute :prefix, :string, default: -> {}
|
|
9
|
+
attribute :number, :string
|
|
10
|
+
attribute :part, :string, default: -> {}
|
|
11
|
+
|
|
12
|
+
def initialize(value: nil, number: nil, prefix: nil, part: nil)
|
|
13
|
+
# Support both 'value' (for convenience) and 'number' (explicit)
|
|
14
|
+
@number = value || number
|
|
15
|
+
@prefix = prefix
|
|
16
|
+
@part = part
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_s
|
|
20
|
+
result = ""
|
|
21
|
+
result += "#{prefix} " if prefix
|
|
22
|
+
result += number
|
|
23
|
+
result += "-#{part}" if part
|
|
24
|
+
result
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def full_code
|
|
28
|
+
to_s
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Parse IEC code formats:
|
|
32
|
+
# - "60034" (just number)
|
|
33
|
+
# - "60034-1" (number with part)
|
|
34
|
+
# - "TR 61000" (with prefix)
|
|
35
|
+
# - "TS 62443" (with prefix)
|
|
36
|
+
def self.parse(string)
|
|
37
|
+
parts = string.strip.split(" ", 2)
|
|
38
|
+
|
|
39
|
+
if parts.size == 2
|
|
40
|
+
# Has prefix: "TR 61000-1-2"
|
|
41
|
+
prefix = parts[0]
|
|
42
|
+
number_part = parts[1]
|
|
43
|
+
else
|
|
44
|
+
# No prefix: "60034-1"
|
|
45
|
+
prefix = nil
|
|
46
|
+
number_part = parts[0]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Split number and part
|
|
50
|
+
number_parts = number_part.split("-", 2)
|
|
51
|
+
number = number_parts[0]
|
|
52
|
+
part = number_parts[1]
|
|
53
|
+
|
|
54
|
+
new(prefix: prefix, number: number, part: part)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require "lutaml/model"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Pubid
|
|
5
|
+
module Iec
|
|
6
|
+
module Components
|
|
7
|
+
# Individual Amendment within a consolidated chain
|
|
8
|
+
# Single Responsibility: Represents a single amendment with number and year
|
|
9
|
+
class Amendment < Lutaml::Model::Serializable
|
|
10
|
+
attribute :number, :string
|
|
11
|
+
attribute :year, :string, default: -> {}
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
result = "AMD#{number}"
|
|
15
|
+
result += ":#{year}" if year
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Consolidated Amendment component for chained amendments
|
|
21
|
+
# Single Responsibility: Represents multiple amendments combined with + notation
|
|
22
|
+
# Example: +AMD1:2020+AMD2:2022
|
|
23
|
+
class ConsolidatedAmendment < Lutaml::Model::Serializable
|
|
24
|
+
attribute :amendments, Amendment, collection: true
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
amendments.map { |amd| "+#{amd}" }.join
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Parse consolidated amendment string like "+AMD1:2020+AMD2:2022"
|
|
31
|
+
# Each amendment has number and optional year
|
|
32
|
+
def self.parse(string)
|
|
33
|
+
amendment_parts = string.split("+").reject(&:empty?)
|
|
34
|
+
|
|
35
|
+
amendments = amendment_parts.filter_map do |part|
|
|
36
|
+
# Parse "AMD1:2020" format
|
|
37
|
+
if part =~ /AMD(\d+):(\d{4})/
|
|
38
|
+
Amendment.new(number: $1, year: $2)
|
|
39
|
+
elsif part =~ /AMD(\d+)/
|
|
40
|
+
Amendment.new(number: $1)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
new(amendments: amendments)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Check if this consolidated amendment is empty
|
|
48
|
+
def empty?
|
|
49
|
+
amendments.nil? || amendments.empty?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Count of amendments in the chain
|
|
53
|
+
def count
|
|
54
|
+
amendments&.size || 0
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "lutaml/model"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Pubid
|
|
5
|
+
module Iec
|
|
6
|
+
module Components
|
|
7
|
+
class Publisher < Lutaml::Model::Serializable
|
|
8
|
+
PUBLISHERS = {
|
|
9
|
+
"IEC" => "International Electrotechnical Commission",
|
|
10
|
+
"ISO/IEC" => "ISO/IEC Joint Technical Committee",
|
|
11
|
+
"CISPR" => "International Special Committee on Radio Interference",
|
|
12
|
+
"IECEE" => "IEC System of Conformity Assessment Schemes for Electrotechnical Equipment and Components",
|
|
13
|
+
"IECEx" => "IEC System for Certification to Standards Relating to Equipment for Use in Explosive Atmospheres",
|
|
14
|
+
"IECQ" => "IEC Quality Assessment System for Electronic Components",
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
attribute :body, :string
|
|
18
|
+
|
|
19
|
+
def validate!
|
|
20
|
+
unless PUBLISHERS.key?(body)
|
|
21
|
+
raise ArgumentError, "Unknown IEC publisher: #{body}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_s
|
|
26
|
+
body
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def full_name
|
|
30
|
+
PUBLISHERS[body]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require "lutaml/model"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Pubid
|
|
5
|
+
module Iec
|
|
6
|
+
module Components
|
|
7
|
+
# Sheet component for IEC sheet notation
|
|
8
|
+
# Single Responsibility: Represents sheet number in IEC identifiers
|
|
9
|
+
# Example: IEC 60695-2-1/1:1994 (where /1 is the sheet)
|
|
10
|
+
class Sheet < Lutaml::Model::Serializable
|
|
11
|
+
attribute :number, :string
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
"/#{number}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Parse sheet notation from string like "/1" or "1"
|
|
18
|
+
def self.parse(string)
|
|
19
|
+
number = string.to_s.gsub("/", "")
|
|
20
|
+
new(number: number)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Check if sheet number is valid (should be numeric)
|
|
24
|
+
def validate!
|
|
25
|
+
unless number.to_s.match?(/^\d+$/)
|
|
26
|
+
raise ArgumentError, "Sheet number must be numeric: #{number}"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require "lutaml/model"
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Pubid
|
|
5
|
+
module Iec
|
|
6
|
+
module Components
|
|
7
|
+
# TRF Info component for Test Report Form specific metadata
|
|
8
|
+
# Single Responsibility: Represents TRF-specific publishing information
|
|
9
|
+
# Example: IECEE TRF or IECEx TRF publications
|
|
10
|
+
class TrfInfo < Lutaml::Model::Serializable
|
|
11
|
+
attribute :publisher, :string, default: -> {}
|
|
12
|
+
attribute :series, :string, default: -> {}
|
|
13
|
+
attribute :version, :string, default: -> {}
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
parts = []
|
|
17
|
+
parts << publisher if publisher
|
|
18
|
+
parts << series if series
|
|
19
|
+
parts << "Ver.#{version}" if version
|
|
20
|
+
parts.join(" ")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Check if TRF info is empty (no data)
|
|
24
|
+
def empty?
|
|
25
|
+
publisher.nil? && series.nil? && version.nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Validate that at least publisher or series is present
|
|
29
|
+
def validate!
|
|
30
|
+
if empty?
|
|
31
|
+
raise ArgumentError,
|
|
32
|
+
"TrfInfo must have at least publisher or series"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|