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,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Code component for NIST identifiers
|
|
9
|
+
# Handles number codes like series, volume, etc.
|
|
10
|
+
class Code < Lutaml::Model::Serializable
|
|
11
|
+
attribute :number, :string
|
|
12
|
+
attribute :subpart, :string
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
result = number.to_s
|
|
16
|
+
result += ".#{subpart}" if subpart
|
|
17
|
+
result
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Alias for compatibility
|
|
21
|
+
def value
|
|
22
|
+
to_s
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Backward compatibility: extract part from compound numbers like "140-2"
|
|
26
|
+
# Returns the part number if the value contains a dash, nil otherwise
|
|
27
|
+
def part
|
|
28
|
+
return nil unless number&.include?("-")
|
|
29
|
+
|
|
30
|
+
# Split by last dash to handle patterns like "4-4" (just number-part)
|
|
31
|
+
# and "4-M-5" (which would return "M-5" as part)
|
|
32
|
+
parts = number.to_s.split("-")
|
|
33
|
+
parts.last if parts.length > 1
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Edition component for NIST publications per nist-pubid-spec.md
|
|
9
|
+
# Format: <edition-type><edition-id>[.<additional-text>]
|
|
10
|
+
# Types: "-" (historical), "e" (edition), "r" (revision)
|
|
11
|
+
# Edition ID can be: number ("2") OR year ("2021")
|
|
12
|
+
# Additional text: Text AFTER "rev" prefix (WITHOUT "rev")
|
|
13
|
+
#
|
|
14
|
+
# SEMANTICS:
|
|
15
|
+
# - "e" or "edition" = edition (can be number or year or month+year)
|
|
16
|
+
# - "r" or "rev" or "revision" or "v" or "version" = revision (can be number or year or month+year)
|
|
17
|
+
# - If BOTH edition AND revision in same identifier:
|
|
18
|
+
# * Type is "e" (edition takes precedence)
|
|
19
|
+
# * ID is the edition value
|
|
20
|
+
# * additional_text is the revision part (WITHOUT "rev" prefix)
|
|
21
|
+
# * Renders with DOT separator: e2.June1908
|
|
22
|
+
#
|
|
23
|
+
# Examples:
|
|
24
|
+
# Edition.new(type: "e", id: "2").to_s # => "e2"
|
|
25
|
+
# Edition.new(type: "e", id: "2", additional_text: "June1908").to_s # => "e2.June1908"
|
|
26
|
+
# Edition.new(type: "e", id: "2", additional_text: "1908").to_s # => "e2.1908"
|
|
27
|
+
# Edition.new(type: "r", id: "1963").to_s # => "r1963"
|
|
28
|
+
# Edition.new(type: "r", id: "5").to_s # => "r5"
|
|
29
|
+
# Edition.new(type: "r", id: "5", original_prefix: " Rev. ").to_s # => "Rev. 5"
|
|
30
|
+
class Edition < Lutaml::Model::Serializable
|
|
31
|
+
attribute :type, :string # "-", "e", or "r"
|
|
32
|
+
attribute :id, :string # Edition ID (number or year)
|
|
33
|
+
attribute :additional_text, :string # Text after "rev" (WITHOUT "rev" prefix)
|
|
34
|
+
attribute :original_prefix, :string # Original format prefix for preservation (e.g., " Rev. ", " rev ", " r")
|
|
35
|
+
|
|
36
|
+
# Render edition in specified format
|
|
37
|
+
# @param format [:short, :mr, :long, :abbrev] The output format
|
|
38
|
+
# @return [String] The formatted edition representation
|
|
39
|
+
def to_s(format = :short)
|
|
40
|
+
case format
|
|
41
|
+
when :short, :mr
|
|
42
|
+
build_short_format
|
|
43
|
+
when :long
|
|
44
|
+
build_long_format
|
|
45
|
+
when :abbrev
|
|
46
|
+
build_short_format
|
|
47
|
+
else
|
|
48
|
+
build_short_format
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Identity ignores original_prefix: it records how the edition was
|
|
53
|
+
# spelled in the source ("Rev. " vs "r") for round-trip rendering
|
|
54
|
+
# only. "r1" and "Rev. 1" are the same edition.
|
|
55
|
+
def ==(other)
|
|
56
|
+
return false unless other.is_a?(self.class)
|
|
57
|
+
|
|
58
|
+
type == other.type && id == other.id &&
|
|
59
|
+
additional_text == other.additional_text
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
alias eql? ==
|
|
63
|
+
|
|
64
|
+
def hash
|
|
65
|
+
[self.class, type, id, additional_text].hash
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
# Build short format: "e2", "e2.June1908", "e2.1908", "e2.50", "r1963", "-April1909", "r1a"
|
|
71
|
+
# If original_prefix is set, preserves original format (e.g., "Rev. 5" not "r5")
|
|
72
|
+
def build_short_format
|
|
73
|
+
# For revision type, use original prefix if available (format preservation)
|
|
74
|
+
if type == "r" && original_prefix && !original_prefix.empty?
|
|
75
|
+
# Build base format with original prefix
|
|
76
|
+
result = "#{original_prefix}#{id}"
|
|
77
|
+
# Add additional text (letter suffix) if present, preserve UPPERCASE
|
|
78
|
+
if additional_text && !additional_text.empty?
|
|
79
|
+
# For letter suffixes, append uppercase letter directly: " r5A" or "r5A"
|
|
80
|
+
if additional_text.match?(/^[A-Za-z]$/)
|
|
81
|
+
result += additional_text.upcase
|
|
82
|
+
else
|
|
83
|
+
# For other additional text (years, etc.), use dot separator
|
|
84
|
+
result += ".#{additional_text}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
return result
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# For dash-year editions (type "e" with original_prefix "-"), preserve dash format
|
|
91
|
+
# Example: "-1979" for patterns like "NBS HB 130-1979"
|
|
92
|
+
if type == "e" && original_prefix == "-" && id.match?(/^\d{4}$/)
|
|
93
|
+
return "-#{id}"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
result = "#{type}#{id}"
|
|
97
|
+
|
|
98
|
+
if additional_text && !additional_text.empty?
|
|
99
|
+
# For historical editions ("-") with month names, NO dot separator
|
|
100
|
+
# Pattern: "-April1909" not "-.April1909"
|
|
101
|
+
if type == "-" && additional_text.match?(/^[A-Z][a-z]+\d{4}$/)
|
|
102
|
+
result = "-#{additional_text}"
|
|
103
|
+
# For letter suffixes (single letter like "a", "A", "b", "B", etc.), NO dot separator
|
|
104
|
+
# Use UPPERCASE for consistency: "r5A" for SP patterns like 800-53r5a
|
|
105
|
+
elsif additional_text.match?(/^[A-Za-z]$/)
|
|
106
|
+
result += additional_text.upcase # Normalize to UPPERCASE: r5A
|
|
107
|
+
else
|
|
108
|
+
# For ALL years (2-digit or 4-digit) and month+year, use DOT separator
|
|
109
|
+
# Examples: e2.50, e2.1915, e2.June1908
|
|
110
|
+
result += ".#{additional_text}"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
result
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Build long format: "Edition 2021", "Revision 5", etc.
|
|
118
|
+
def build_long_format
|
|
119
|
+
case type
|
|
120
|
+
when "e"
|
|
121
|
+
"Edition #{id}"
|
|
122
|
+
when "r"
|
|
123
|
+
"Revision #{id}"
|
|
124
|
+
when "-"
|
|
125
|
+
# Historical precedent - render as dash-number
|
|
126
|
+
"-#{id}"
|
|
127
|
+
else
|
|
128
|
+
"#{type}#{id}"
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# IssueNumber component for NIST identifiers
|
|
9
|
+
# Represents the issue/number designation (e.g., "No. 12" in "Vol. 6, No. 12")
|
|
10
|
+
class IssueNumber < Lutaml::Model::Serializable
|
|
11
|
+
attribute :number, :string
|
|
12
|
+
|
|
13
|
+
# Short form rendering: "n12"
|
|
14
|
+
# Long form rendering: "No. 12"
|
|
15
|
+
def to_s(format = :short)
|
|
16
|
+
case format
|
|
17
|
+
when :long, :full
|
|
18
|
+
"No. #{number}"
|
|
19
|
+
when :short, :mr
|
|
20
|
+
"n#{number}"
|
|
21
|
+
else
|
|
22
|
+
"n#{number}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Part component for NIST publications
|
|
9
|
+
# Format: n{NUMBER}, pt{NUMBER}, or just letter depending on type
|
|
10
|
+
#
|
|
11
|
+
# Type attribute determines rendering:
|
|
12
|
+
# - "pt" => "pt1" (SP part notation)
|
|
13
|
+
# - "n" => "n1" (CSM issue notation)
|
|
14
|
+
# - "" => "A" (letter suffix - just the letter)
|
|
15
|
+
#
|
|
16
|
+
# Examples:
|
|
17
|
+
# Part.new(type: "pt", value: "1").to_s => "pt1"
|
|
18
|
+
# Part.new(type: "n", value: "1").to_s => "n1"
|
|
19
|
+
# Part.new(type: "", value: "A").to_s => "A"
|
|
20
|
+
#
|
|
21
|
+
# Used in:
|
|
22
|
+
# - CSM: Issue number (n1)
|
|
23
|
+
# - SP: Part number (pt1)
|
|
24
|
+
# - Letter suffixes (A, B, C, etc.)
|
|
25
|
+
class Part < Lutaml::Model::Serializable
|
|
26
|
+
attribute :type, :string # "pt" for part notation, "n" for issue, "" for letter suffix
|
|
27
|
+
attribute :value, :string # Part number or letter (1, 2, A, B, etc.)
|
|
28
|
+
|
|
29
|
+
# Render part with type-specific notation
|
|
30
|
+
# @param notation [Symbol, String, nil] Optional notation override
|
|
31
|
+
# - :n_notation or "n" → use "n" prefix
|
|
32
|
+
# - :pt_notation or "pt" → use "pt" prefix
|
|
33
|
+
# - :letter_notation or "" → just the value (letter suffix)
|
|
34
|
+
# @return [String] The formatted part representation
|
|
35
|
+
def to_s(notation = nil)
|
|
36
|
+
# Handle symbol notation parameters
|
|
37
|
+
notation_to_use = if notation.is_a?(Symbol)
|
|
38
|
+
case notation
|
|
39
|
+
when :n_notation then "n"
|
|
40
|
+
when :pt_notation then "pt"
|
|
41
|
+
when :letter_notation then ""
|
|
42
|
+
else notation.to_s
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
notation
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# If notation explicitly provided, use it
|
|
49
|
+
if notation_to_use
|
|
50
|
+
return "#{notation_to_use}#{value}" unless notation_to_use.empty?
|
|
51
|
+
|
|
52
|
+
return value
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Otherwise use type attribute
|
|
56
|
+
case type
|
|
57
|
+
when "pt"
|
|
58
|
+
"pt#{value}"
|
|
59
|
+
when "n"
|
|
60
|
+
"n#{value}"
|
|
61
|
+
when ""
|
|
62
|
+
# Letter suffix - just the letter
|
|
63
|
+
value
|
|
64
|
+
else
|
|
65
|
+
# Fallback for nil or unknown types - default to "n" notation (CSM issue number)
|
|
66
|
+
"n#{value}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Alias for numeric comparison
|
|
71
|
+
def to_i
|
|
72
|
+
value.to_i
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Publisher component for NIST identifiers
|
|
9
|
+
# Handles NIST and NBS publishers
|
|
10
|
+
class Publisher < Lutaml::Model::Serializable
|
|
11
|
+
attribute :publisher, :string
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
publisher
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Alias for compatibility
|
|
18
|
+
def body
|
|
19
|
+
publisher
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require "yaml"
|
|
5
|
+
|
|
6
|
+
module Pubid
|
|
7
|
+
module Nist
|
|
8
|
+
module Components
|
|
9
|
+
# Stage component for NIST draft identifiers
|
|
10
|
+
# Combines id (i/f/1-9) with type (pd/wd/prd)
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
# Stage.new(id: "i", type: "pd").to_s(:short) # => "ipd"
|
|
14
|
+
# Stage.new(id: "f", type: "pd").to_s(:long) # => "(Final Public Draft)"
|
|
15
|
+
class Stage < Lutaml::Model::Serializable
|
|
16
|
+
attribute :id, :string # i, f, 1-9
|
|
17
|
+
attribute :type, :string # pd, wd, prd
|
|
18
|
+
|
|
19
|
+
# Load stages from V1 YAML config
|
|
20
|
+
STAGES = YAML.load_file(
|
|
21
|
+
File.join(File.dirname(__FILE__),
|
|
22
|
+
"../../../../archived-gems/pubid-nist/stages.yaml"),
|
|
23
|
+
).freeze
|
|
24
|
+
|
|
25
|
+
# Render stage in specified format
|
|
26
|
+
# @param format [:short, :mr, :long] The output format
|
|
27
|
+
# @return [String] The formatted stage representation
|
|
28
|
+
def to_s(format = :short)
|
|
29
|
+
return "" if id.nil? || type.nil?
|
|
30
|
+
|
|
31
|
+
case format
|
|
32
|
+
when :short, :mr
|
|
33
|
+
"#{id}#{type}"
|
|
34
|
+
when :long
|
|
35
|
+
"(#{STAGES['id'][id]} #{STAGES['type'][type]})"
|
|
36
|
+
else
|
|
37
|
+
"#{id}#{type}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Validate stage id and type against YAML config
|
|
42
|
+
def validate!
|
|
43
|
+
unless STAGES["id"].key?(id.to_s)
|
|
44
|
+
raise ArgumentError, "Invalid stage id: #{id.inspect}"
|
|
45
|
+
end
|
|
46
|
+
unless STAGES["type"].key?(type.to_s)
|
|
47
|
+
raise ArgumentError, "Invalid stage type: #{type.inspect}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Supplement component for NIST publications
|
|
9
|
+
# Represents supplement notation with number, year, month, or revision
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# Supplement.new(number: "2").to_s(:short) # => "sup2"
|
|
13
|
+
# Supplement.new(year: "1925").to_s(:short) # => "sup1925"
|
|
14
|
+
# Supplement.new(number: "3", year: "1926").to_s(:short) # => "sup3/1926"
|
|
15
|
+
# Supplement.new(month: "Jan", year: "1924").to_s(:short) # => "supJan1924"
|
|
16
|
+
# Supplement.new(has_revision: true).to_s(:short) # => "suprev"
|
|
17
|
+
class Supplement < Lutaml::Model::Serializable
|
|
18
|
+
attribute :number, :string # Supplement number (e.g., "2" in "supp2")
|
|
19
|
+
attribute :year, :string # Year (4 digits); range START year
|
|
20
|
+
attribute :month, :string # Month abbreviation; range START month
|
|
21
|
+
# Date ranges reuse :month/:year as the start and add the end below. A
|
|
22
|
+
# present :month_end/:year_end is what marks a value as a range, so a
|
|
23
|
+
# lone month-year supplement is just a range with no end — and :year is
|
|
24
|
+
# the single field to filter on for both.
|
|
25
|
+
attribute :month_end, :string # Date range end month
|
|
26
|
+
attribute :year_end, :string # Date range end year
|
|
27
|
+
attribute :has_revision, :boolean, default: -> {
|
|
28
|
+
false
|
|
29
|
+
} # "supprev" pattern
|
|
30
|
+
attribute :suffix, :string # General suffix for other patterns
|
|
31
|
+
|
|
32
|
+
# Build a Supplement from the flat string the parser/builder produces
|
|
33
|
+
# ("1924" year, "Jan1924" month+year, "1" number, "A" suffix, "" bare).
|
|
34
|
+
# has_revision is supplied separately. Returns a present-but-empty
|
|
35
|
+
# Supplement for an empty/nil value so callers can distinguish a bare
|
|
36
|
+
# supplement ("sup") from no supplement (nil).
|
|
37
|
+
def self.from_raw(value, has_revision: false)
|
|
38
|
+
supp = new
|
|
39
|
+
if has_revision
|
|
40
|
+
supp.has_revision = true
|
|
41
|
+
elsif value.nil? || value.to_s.empty?
|
|
42
|
+
# bare marker: present but no isolated parts
|
|
43
|
+
elsif (m = value.to_s.match(/\A([A-Za-z]{3,9})(\d{4})\z/))
|
|
44
|
+
supp.month = m[1]
|
|
45
|
+
supp.year = m[2]
|
|
46
|
+
elsif value.to_s.match?(/\A(?:18|19|20)\d{2}\z/)
|
|
47
|
+
supp.year = value.to_s
|
|
48
|
+
elsif value.to_s.match?(/\A\d+\z/)
|
|
49
|
+
supp.number = value.to_s
|
|
50
|
+
else
|
|
51
|
+
supp.suffix = value.to_s
|
|
52
|
+
end
|
|
53
|
+
supp
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Render supplement in specified format
|
|
57
|
+
# @param format [:short, :mr, :long] The output format
|
|
58
|
+
# @return [String] The formatted supplement representation
|
|
59
|
+
def to_s(format = :short)
|
|
60
|
+
return "" if number.nil? && year.nil? && month.nil? && !has_revision &&
|
|
61
|
+
suffix.nil? && month_end.nil? && year_end.nil?
|
|
62
|
+
|
|
63
|
+
case format
|
|
64
|
+
when :short, :mr
|
|
65
|
+
build_short_format
|
|
66
|
+
when :long
|
|
67
|
+
build_long_format
|
|
68
|
+
else
|
|
69
|
+
build_short_format
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# True when this supplement is a date range (start reuses month/year).
|
|
74
|
+
def range?
|
|
75
|
+
date_range?
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# The text after the "sup" marker for the simple (non-range, non-rev)
|
|
79
|
+
# forms: "1924" / "Jan1924" / "1" / "A"; "" for a bare supplement. Used
|
|
80
|
+
# by URN rendering, which handles range/revision separately.
|
|
81
|
+
def value_string
|
|
82
|
+
return "" if has_revision || date_range?
|
|
83
|
+
return suffix.to_s if suffix
|
|
84
|
+
return "#{month}#{year}" if month && year
|
|
85
|
+
return "#{number}/#{year}" if number && year
|
|
86
|
+
return year.to_s if year
|
|
87
|
+
return number.to_s if number
|
|
88
|
+
|
|
89
|
+
""
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Value equality over the isolated parts, so a structured supplement
|
|
93
|
+
# participates correctly in Identifier#== and #matches? (two supplements
|
|
94
|
+
# with the same number/year/month/range/revision are the same).
|
|
95
|
+
IDENTITY_FIELDS = %i[
|
|
96
|
+
number year month month_end year_end has_revision suffix
|
|
97
|
+
].freeze
|
|
98
|
+
|
|
99
|
+
def ==(other)
|
|
100
|
+
return false unless other.is_a?(self.class)
|
|
101
|
+
|
|
102
|
+
IDENTITY_FIELDS.all? { |f| send(f) == other.send(f) }
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
alias eql? ==
|
|
106
|
+
|
|
107
|
+
def hash
|
|
108
|
+
[self.class, *IDENTITY_FIELDS.map { |f| send(f) }].hash
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
|
|
113
|
+
# Build short format: "sup2", "sup1925", "sup3/1926", "supJan1924", "suprev"
|
|
114
|
+
# NIST/NBS canonical short form is single-p "sup" with the suffix
|
|
115
|
+
# attached directly (relaton-data-nist uses "sup2", "sup1940", "supA").
|
|
116
|
+
def build_short_format
|
|
117
|
+
return "suprev" if has_revision
|
|
118
|
+
return "sup#{suffix}" if suffix
|
|
119
|
+
return build_date_range_format if date_range?
|
|
120
|
+
return build_month_year_format if month && year
|
|
121
|
+
return build_number_year_format if number && year
|
|
122
|
+
return build_year_format if year
|
|
123
|
+
return build_number_format if number
|
|
124
|
+
|
|
125
|
+
""
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Build long format: "Supplement 2", "Supplement 1925", etc.
|
|
129
|
+
def build_long_format
|
|
130
|
+
return "Supplement with Revision" if has_revision
|
|
131
|
+
return "Supplement #{suffix}" if suffix
|
|
132
|
+
return build_long_date_range_format if date_range?
|
|
133
|
+
return build_long_month_year_format if month && year
|
|
134
|
+
return build_long_number_year_format if number && year
|
|
135
|
+
return build_long_year_format if year
|
|
136
|
+
return build_long_number_format if number
|
|
137
|
+
|
|
138
|
+
""
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# A range is marked by the presence of an END; START reuses month/year.
|
|
142
|
+
def date_range?
|
|
143
|
+
month && year && month_end && year_end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def build_date_range_format
|
|
147
|
+
"sup#{month}#{year}-#{month_end}#{year_end}"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def build_month_year_format
|
|
151
|
+
"sup#{month}#{year}"
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def build_number_year_format
|
|
155
|
+
"sup#{number}/#{year}"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def build_year_format
|
|
159
|
+
"sup#{year}"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def build_number_format
|
|
163
|
+
"sup#{number}"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def build_long_date_range_format
|
|
167
|
+
"Supplement #{month} #{year}-#{month_end} #{year_end}"
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def build_long_month_year_format
|
|
171
|
+
"Supplement #{month} #{year}"
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def build_long_number_year_format
|
|
175
|
+
"Supplement #{number}/#{year}"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def build_long_year_format
|
|
179
|
+
"Supplement #{year}"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def build_long_number_format
|
|
183
|
+
"Supplement #{number}"
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Nist
|
|
7
|
+
module Components
|
|
8
|
+
# Translation component for NIST publications
|
|
9
|
+
# Uses 3-letter ISO 639-2 language codes
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# Translation.new(code: "spa").to_s(:short) # => " spa"
|
|
13
|
+
# Translation.new(code: "por").to_s(:mr) # => ".por"
|
|
14
|
+
# Translation.new(code: "ind").to_s(:short) # => " ind"
|
|
15
|
+
class Translation < Lutaml::Model::Serializable
|
|
16
|
+
attribute :code, :string # 3-letter ISO 639-2 code: spa, por, ind, etc.
|
|
17
|
+
|
|
18
|
+
# Backward compatibility: language method returns code
|
|
19
|
+
# @return [String, nil] language code
|
|
20
|
+
def language
|
|
21
|
+
code
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Render translation in specified format
|
|
25
|
+
# @param format [:short, :mr, :long] The output format
|
|
26
|
+
# @return [String] The formatted translation representation
|
|
27
|
+
def to_s(format = :short)
|
|
28
|
+
return "" if code.nil?
|
|
29
|
+
|
|
30
|
+
case format
|
|
31
|
+
when :short, :long
|
|
32
|
+
" #{code}"
|
|
33
|
+
when :mr
|
|
34
|
+
".#{code}"
|
|
35
|
+
else
|
|
36
|
+
" #{code}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require "date"
|
|
5
|
+
|
|
6
|
+
module Pubid
|
|
7
|
+
module Nist
|
|
8
|
+
module Components
|
|
9
|
+
# Update component for NIST publications
|
|
10
|
+
# Represents errata updates with number, year, and optional month
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
# Update.new(number: 1, year: 2021, month: 2).to_s(:short) # => "/Upd1-202102"
|
|
14
|
+
# Update.new(number: 3, year: 2015).to_s(:short) # => "/Upd3-2015"
|
|
15
|
+
# Update.new(number: 1, year: 2021, month: 2).to_s(:mr) # => "-upd1-202102"
|
|
16
|
+
# Update.new(number: 1, prefix: "dash").to_s(:short) # => "-upd1" (preserves original prefix)
|
|
17
|
+
class Update < Lutaml::Model::Serializable
|
|
18
|
+
attribute :number, :string # Update number as string
|
|
19
|
+
attribute :year, :string # Year (4 digits as string)
|
|
20
|
+
attribute :month, :string # Month (01-12 as string, optional)
|
|
21
|
+
attribute :prefix, :string # Original prefix: "dash" for -upd, "slash" for /Upd (default: "slash")
|
|
22
|
+
|
|
23
|
+
# Render update in specified format
|
|
24
|
+
# @param format [:short, :mr, :long] The output format
|
|
25
|
+
# @return [String] The formatted update representation
|
|
26
|
+
def to_s(format = :short)
|
|
27
|
+
# For MR format, render -upd even without number
|
|
28
|
+
return "-upd" if format == :mr && number.nil? && year.nil?
|
|
29
|
+
# For other formats, return empty string if no number
|
|
30
|
+
return "" if number.nil?
|
|
31
|
+
|
|
32
|
+
# Use prefix attribute to determine which prefix to use
|
|
33
|
+
# If prefix is "dash", always use dash prefix regardless of format
|
|
34
|
+
# This preserves original input format (e.g., -upd vs /Upd)
|
|
35
|
+
return build_dash_format if prefix == "dash"
|
|
36
|
+
|
|
37
|
+
case format
|
|
38
|
+
when :short
|
|
39
|
+
build_short_format
|
|
40
|
+
when :mr
|
|
41
|
+
build_mr_format
|
|
42
|
+
when :long
|
|
43
|
+
build_long_format
|
|
44
|
+
else
|
|
45
|
+
build_short_format
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Build dash format: "-upd1-202102" or "-upd3-2015" or "-upd1" (no year)
|
|
52
|
+
# Used when original input used dash prefix (-upd) to preserve format
|
|
53
|
+
def build_dash_format
|
|
54
|
+
if year
|
|
55
|
+
year_month = build_year_month_string
|
|
56
|
+
"-upd#{number}-#{year_month}"
|
|
57
|
+
else
|
|
58
|
+
"-upd#{number}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Build short format: "/Upd1-202102" or "/Upd3-2015" or "/Upd1" (no year)
|
|
63
|
+
def build_short_format
|
|
64
|
+
if year
|
|
65
|
+
year_month = build_year_month_string
|
|
66
|
+
"/Upd#{number}-#{year_month}"
|
|
67
|
+
else
|
|
68
|
+
"/Upd#{number}"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Build machine-readable format: "-upd1-202102" or "-upd3-2015" or "-upd1" (no year)
|
|
73
|
+
def build_mr_format
|
|
74
|
+
if year
|
|
75
|
+
year_month = build_year_month_string
|
|
76
|
+
"-upd#{number}-#{year_month}"
|
|
77
|
+
else
|
|
78
|
+
"-upd#{number}"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Build long format: "Update 1-2021 February" or "Update 3-2015"
|
|
83
|
+
def build_long_format
|
|
84
|
+
return "Update #{number}" unless year
|
|
85
|
+
|
|
86
|
+
month_str = month ? " #{Date::MONTHNAMES[month.to_i]}" : ""
|
|
87
|
+
"Update #{number}-#{year}#{month_str}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Build year-month string: "202102" or "2015"
|
|
91
|
+
def build_year_month_string
|
|
92
|
+
return "" unless year
|
|
93
|
+
|
|
94
|
+
if month
|
|
95
|
+
"#{year}#{month.to_s.rjust(2, '0')}"
|
|
96
|
+
else
|
|
97
|
+
year.to_s
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|