pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.11
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/README.adoc +33 -11
- data/conformance/pending.yaml +4 -0
- data/data/bipm/update_codes.yaml +9 -0
- data/data/iec/update_codes.yaml +3 -0
- data/data/ieee/update_codes.yaml +107 -1
- data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
- data/data/nist/update_codes.yaml +8 -0
- data/lib/pubid/adobe/builder.rb +52 -0
- data/lib/pubid/adobe/identifier.rb +47 -0
- data/lib/pubid/adobe/identifiers/publication.rb +31 -0
- data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
- data/lib/pubid/adobe/identifiers.rb +10 -0
- data/lib/pubid/adobe/parser.rb +136 -0
- data/lib/pubid/adobe/renderer.rb +39 -0
- data/lib/pubid/adobe/urn_generator.rb +42 -0
- data/lib/pubid/adobe/urn_parser.rb +69 -0
- data/lib/pubid/adobe.rb +61 -0
- data/lib/pubid/amca/builder.rb +4 -4
- data/lib/pubid/amca/identifier.rb +1 -3
- data/lib/pubid/amca/identifiers/base.rb +50 -33
- data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
- data/lib/pubid/amca/identifiers/publication.rb +14 -10
- data/lib/pubid/amca/identifiers/standard.rb +3 -1
- data/lib/pubid/amca/identifiers.rb +0 -1
- data/lib/pubid/amca/parser.rb +1 -1
- data/lib/pubid/amca/renderer.rb +4 -4
- data/lib/pubid/amca/single_identifier.rb +1 -1
- data/lib/pubid/amca/urn_generator.rb +2 -2
- data/lib/pubid/amca.rb +5 -4
- data/lib/pubid/ansi/builder.rb +2 -2
- data/lib/pubid/ansi/identifier.rb +18 -0
- data/lib/pubid/ansi/parser.rb +1 -1
- data/lib/pubid/ansi/renderer.rb +2 -2
- data/lib/pubid/ansi.rb +5 -5
- data/lib/pubid/api/builder.rb +16 -2
- data/lib/pubid/api/identifier.rb +25 -4
- data/lib/pubid/api/identifiers/mpms.rb +10 -8
- data/lib/pubid/api/parser.rb +1 -1
- data/lib/pubid/api/renderer.rb +16 -7
- data/lib/pubid/api/single_identifier.rb +5 -12
- data/lib/pubid/api.rb +1 -0
- data/lib/pubid/ashrae/builder.rb +53 -32
- data/lib/pubid/ashrae/identifier.rb +3 -4
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
- data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
- data/lib/pubid/ashrae/identifiers/base.rb +94 -12
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
- data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
- data/lib/pubid/ashrae/identifiers.rb +0 -1
- data/lib/pubid/ashrae/parser.rb +37 -17
- data/lib/pubid/ashrae/renderer.rb +20 -20
- data/lib/pubid/ashrae/single_identifier.rb +1 -1
- data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
- data/lib/pubid/ashrae/urn_generator.rb +8 -2
- data/lib/pubid/ashrae.rb +10 -4
- data/lib/pubid/asme/builder.rb +11 -2
- data/lib/pubid/asme/identifier.rb +9 -0
- data/lib/pubid/asme/identifiers/standard.rb +86 -2
- data/lib/pubid/asme/parser.rb +1 -1
- data/lib/pubid/asme/renderer.rb +3 -3
- data/lib/pubid/asme/single_identifier.rb +8 -1
- data/lib/pubid/asme/urn_generator.rb +2 -2
- data/lib/pubid/asme.rb +1 -0
- data/lib/pubid/astm/builder.rb +10 -3
- data/lib/pubid/astm/identifier.rb +9 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
- data/lib/pubid/astm/identifiers/code_number.rb +81 -0
- data/lib/pubid/astm/identifiers/data_series.rb +2 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
- data/lib/pubid/astm/identifiers/manual.rb +10 -0
- data/lib/pubid/astm/identifiers/monograph.rb +2 -0
- data/lib/pubid/astm/identifiers/research_report.rb +10 -0
- data/lib/pubid/astm/identifiers/standard.rb +10 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
- data/lib/pubid/astm/identifiers.rb +1 -0
- data/lib/pubid/astm/parser.rb +1 -1
- data/lib/pubid/astm/renderer.rb +1 -1
- data/lib/pubid/astm/single_identifier.rb +31 -1
- data/lib/pubid/astm/urn_generator.rb +7 -5
- data/lib/pubid/astm.rb +1 -0
- data/lib/pubid/bipm/builder.rb +163 -0
- data/lib/pubid/bipm/identifier.rb +285 -0
- data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
- data/lib/pubid/bipm/identifiers/guide.rb +35 -0
- data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
- data/lib/pubid/bipm/identifiers/mep.rb +33 -0
- data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
- data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
- data/lib/pubid/bipm/identifiers.rb +15 -0
- data/lib/pubid/bipm/parser.rb +237 -0
- data/lib/pubid/bipm/renderer.rb +118 -0
- data/lib/pubid/bipm/urn_generator.rb +58 -0
- data/lib/pubid/bipm/urn_parser.rb +60 -0
- data/lib/pubid/bipm.rb +92 -0
- data/lib/pubid/bsi/builder.rb +62 -52
- data/lib/pubid/bsi/identifier.rb +0 -1
- data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
- data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
- data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
- data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
- data/lib/pubid/bsi/identifiers/set.rb +11 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
- data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
- data/lib/pubid/bsi/parser.rb +1 -1
- data/lib/pubid/bsi/renderer.rb +71 -59
- data/lib/pubid/bsi/single_identifier.rb +64 -7
- data/lib/pubid/bsi/urn_generator.rb +11 -2
- data/lib/pubid/bsi.rb +7 -1
- data/lib/pubid/builder/base.rb +23 -11
- data/lib/pubid/bundled_identifier.rb +19 -9
- data/lib/pubid/calconnect/builder.rb +38 -0
- data/lib/pubid/calconnect/identifier.rb +121 -0
- data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
- data/lib/pubid/calconnect/identifiers.rb +9 -0
- data/lib/pubid/calconnect/parser.rb +54 -0
- data/lib/pubid/calconnect/renderer.rb +36 -0
- data/lib/pubid/calconnect/urn_generator.rb +33 -0
- data/lib/pubid/calconnect/urn_parser.rb +34 -0
- data/lib/pubid/calconnect.rb +83 -0
- data/lib/pubid/ccsds/builder.rb +1 -1
- data/lib/pubid/ccsds/identifier.rb +10 -3
- data/lib/pubid/ccsds/identifiers/base.rb +4 -2
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/ccsds/parser.rb +1 -1
- data/lib/pubid/ccsds/single_identifier.rb +2 -2
- data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
- data/lib/pubid/ccsds/urn_generator.rb +3 -3
- data/lib/pubid/ccsds.rb +1 -0
- data/lib/pubid/cen_cenelec/builder.rb +131 -72
- data/lib/pubid/cen_cenelec/identifier.rb +115 -3
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
- data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
- data/lib/pubid/cen_cenelec/parser.rb +1 -1
- data/lib/pubid/cen_cenelec/renderer.rb +55 -60
- data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
- data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
- data/lib/pubid/cen_cenelec.rb +104 -82
- data/lib/pubid/cie/builder.rb +149 -24
- data/lib/pubid/cie/identifier.rb +13 -4
- data/lib/pubid/cie/identifiers/bundle.rb +35 -5
- data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
- data/lib/pubid/cie/identifiers/conference.rb +11 -6
- data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
- data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
- data/lib/pubid/cie/identifiers/identical.rb +9 -9
- data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
- data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
- data/lib/pubid/cie/identifiers/standard.rb +43 -8
- data/lib/pubid/cie/identifiers/supplement.rb +27 -25
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
- data/lib/pubid/cie/identifiers.rb +2 -0
- data/lib/pubid/cie/parser.rb +55 -6
- data/lib/pubid/cie/single_identifier.rb +40 -1
- data/lib/pubid/cie/supplement_identifier.rb +29 -16
- data/lib/pubid/cie/urn_generator.rb +11 -8
- data/lib/pubid/cie.rb +7 -2
- data/lib/pubid/components/date.rb +21 -5
- data/lib/pubid/conformance/checks.rb +72 -0
- data/lib/pubid/conformance/corpus/case.rb +55 -0
- data/lib/pubid/conformance/corpus.rb +36 -0
- data/lib/pubid/conformance/generator.rb +212 -0
- data/lib/pubid/conformance/pending.rb +63 -0
- data/lib/pubid/conformance/runner.rb +153 -0
- data/lib/pubid/conformance.rb +55 -0
- data/lib/pubid/core.rb +2 -0
- data/lib/pubid/csa/builder.rb +48 -48
- data/lib/pubid/csa/composite_identifier.rb +18 -7
- data/lib/pubid/csa/identifier.rb +187 -80
- data/lib/pubid/csa/identifiers/bundled.rb +25 -9
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
- data/lib/pubid/csa/identifiers/cec.rb +44 -4
- data/lib/pubid/csa/identifiers/combined.rb +97 -69
- data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
- data/lib/pubid/csa/identifiers/package.rb +4 -4
- data/lib/pubid/csa/parser.rb +12 -8
- data/lib/pubid/csa/renderer.rb +13 -5
- data/lib/pubid/csa/single_identifier.rb +93 -4
- data/lib/pubid/csa/urn_generator.rb +9 -2
- data/lib/pubid/csa/wrapper_identifier.rb +43 -10
- data/lib/pubid/csa.rb +7 -1
- data/lib/pubid/doi/builder.rb +18 -0
- data/lib/pubid/doi/identifier.rb +49 -0
- data/lib/pubid/doi/identifiers/resource.rb +30 -0
- data/lib/pubid/doi/identifiers.rb +9 -0
- data/lib/pubid/doi/parser.rb +52 -0
- data/lib/pubid/doi/renderer.rb +13 -0
- data/lib/pubid/doi.rb +56 -0
- data/lib/pubid/easc/builder.rb +55 -0
- data/lib/pubid/easc/identifier.rb +59 -0
- data/lib/pubid/easc/identifiers/pmg.rb +20 -0
- data/lib/pubid/easc/identifiers/rmg.rb +19 -0
- data/lib/pubid/easc/identifiers.rb +10 -0
- data/lib/pubid/easc/parser.rb +88 -0
- data/lib/pubid/easc/renderer.rb +48 -0
- data/lib/pubid/easc/urn_generator.rb +46 -0
- data/lib/pubid/easc/urn_parser.rb +57 -0
- data/lib/pubid/easc.rb +53 -0
- data/lib/pubid/ecma/builder.rb +45 -0
- data/lib/pubid/ecma/identifier.rb +147 -0
- data/lib/pubid/ecma/identifiers/memento.rb +30 -0
- data/lib/pubid/ecma/identifiers/standard.rb +31 -0
- data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
- data/lib/pubid/ecma/identifiers.rb +11 -0
- data/lib/pubid/ecma/parser.rb +76 -0
- data/lib/pubid/ecma/renderer.rb +67 -0
- data/lib/pubid/ecma/urn_generator.rb +46 -0
- data/lib/pubid/ecma/urn_parser.rb +51 -0
- data/lib/pubid/ecma.rb +68 -0
- data/lib/pubid/errors.rb +80 -0
- data/lib/pubid/etsi/builder.rb +13 -4
- data/lib/pubid/etsi/identifier.rb +1 -3
- data/lib/pubid/etsi/identifiers/base.rb +43 -11
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
- data/lib/pubid/etsi/identifiers.rb +0 -1
- data/lib/pubid/etsi/parser.rb +9 -3
- data/lib/pubid/etsi/renderer.rb +8 -2
- data/lib/pubid/etsi.rb +6 -5
- data/lib/pubid/evs/builder.rb +26 -0
- data/lib/pubid/evs/identifier.rb +37 -0
- data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
- data/lib/pubid/evs/identifiers.rb +9 -0
- data/lib/pubid/evs/parser.rb +27 -0
- data/lib/pubid/evs/renderer.rb +30 -0
- data/lib/pubid/evs/urn_generator.rb +30 -0
- data/lib/pubid/evs/urn_parser.rb +80 -0
- data/lib/pubid/evs.rb +90 -0
- data/lib/pubid/export/exporter.rb +2 -1
- data/lib/pubid/export/flavor_exporter.rb +18 -3
- data/lib/pubid/export.rb +1 -0
- data/lib/pubid/format_detector.rb +1 -0
- data/lib/pubid/gb/builder.rb +45 -0
- data/lib/pubid/gb/identifier.rb +67 -0
- data/lib/pubid/gb/identifiers/standard.rb +34 -0
- data/lib/pubid/gb/identifiers.rb +9 -0
- data/lib/pubid/gb/parser.rb +63 -0
- data/lib/pubid/gb/renderer.rb +35 -0
- data/lib/pubid/gb.rb +88 -0
- data/lib/pubid/gost/builder.rb +185 -0
- data/lib/pubid/gost/identifier.rb +47 -0
- data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
- data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
- data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
- data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
- data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
- data/lib/pubid/gost/identifiers.rb +13 -0
- data/lib/pubid/gost/parser.rb +105 -0
- data/lib/pubid/gost/renderer.rb +48 -0
- data/lib/pubid/gost/urn_generator.rb +46 -0
- data/lib/pubid/gost/urn_parser.rb +52 -0
- data/lib/pubid/gost.rb +50 -0
- data/lib/pubid/iala/builder.rb +22 -27
- data/lib/pubid/iala/identifier.rb +36 -8
- data/lib/pubid/iala/identifiers/advice.rb +1 -1
- data/lib/pubid/iala/identifiers/annex.rb +10 -10
- data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
- data/lib/pubid/iala/identifiers/guideline.rb +3 -1
- data/lib/pubid/iala/identifiers/letter.rb +1 -1
- data/lib/pubid/iala/identifiers/manual.rb +3 -1
- data/lib/pubid/iala/identifiers/model_course.rb +3 -1
- data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
- data/lib/pubid/iala/identifiers/report.rb +1 -1
- data/lib/pubid/iala/identifiers/resolution.rb +1 -1
- data/lib/pubid/iala/identifiers/standard.rb +3 -1
- data/lib/pubid/iala/identifiers.rb +0 -1
- data/lib/pubid/iala/parser.rb +10 -2
- data/lib/pubid/iala/renderer.rb +1 -1
- data/lib/pubid/iala/urn_generator.rb +1 -1
- data/lib/pubid/iala/urn_parser.rb +24 -3
- data/lib/pubid/iala.rb +5 -4
- data/lib/pubid/iana/builder.rb +22 -0
- data/lib/pubid/iana/identifier.rb +140 -0
- data/lib/pubid/iana/identifiers/registry.rb +69 -0
- data/lib/pubid/iana/identifiers.rb +9 -0
- data/lib/pubid/iana/parser.rb +38 -0
- data/lib/pubid/iana/renderer.rb +32 -0
- data/lib/pubid/iana/urn_generator.rb +19 -0
- data/lib/pubid/iana/urn_parser.rb +24 -0
- data/lib/pubid/iana.rb +70 -0
- data/lib/pubid/identifier.rb +797 -26
- data/lib/pubid/identifier_metadata.rb +1 -0
- data/lib/pubid/idf/builder.rb +4 -4
- data/lib/pubid/idf/identifier.rb +18 -9
- data/lib/pubid/idf/parser.rb +3 -3
- data/lib/pubid/idf/renderer.rb +5 -5
- data/lib/pubid/idf/supplement_identifier.rb +3 -3
- data/lib/pubid/idf/urn_generator.rb +1 -1
- data/lib/pubid/idf.rb +7 -1
- data/lib/pubid/iec/builder.rb +49 -32
- data/lib/pubid/iec/components.rb +0 -1
- data/lib/pubid/iec/identifier.rb +112 -77
- data/lib/pubid/iec/identifiers/amendment.rb +6 -2
- data/lib/pubid/iec/identifiers/base.rb +2 -2
- data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
- data/lib/pubid/iec/identifiers/guide.rb +0 -16
- data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
- data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
- data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
- data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
- data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
- data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
- data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
- data/lib/pubid/iec/identifiers/working_document.rb +24 -10
- data/lib/pubid/iec/identifiers.rb +1 -0
- data/lib/pubid/iec/parser.rb +53 -28
- data/lib/pubid/iec/renderer.rb +31 -18
- data/lib/pubid/iec/single_identifier.rb +34 -11
- data/lib/pubid/iec/supplement_identifier.rb +32 -19
- data/lib/pubid/iec/urn_generator.rb +227 -61
- data/lib/pubid/iec/urn_parser.rb +42 -4
- data/lib/pubid/iec.rb +2 -6
- data/lib/pubid/ieee/aiee/builder.rb +17 -3
- data/lib/pubid/ieee/aiee/identifier.rb +46 -62
- data/lib/pubid/ieee/aiee/parser.rb +1 -1
- data/lib/pubid/ieee/builder.rb +386 -69
- data/lib/pubid/ieee/compaction.rb +121 -0
- data/lib/pubid/ieee/components/draft.rb +47 -7
- data/lib/pubid/ieee/identifier.rb +1 -3
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
- data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
- data/lib/pubid/ieee/identifiers/base.rb +148 -18
- data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
- data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
- data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
- data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
- data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
- data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
- data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
- data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
- data/lib/pubid/ieee/identifiers/standard.rb +4 -1
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
- data/lib/pubid/ieee/identifiers.rb +2 -1
- data/lib/pubid/ieee/ire/builder.rb +7 -6
- data/lib/pubid/ieee/ire/identifier.rb +48 -33
- data/lib/pubid/ieee/ire/parser.rb +1 -1
- data/lib/pubid/ieee/nesc/builder.rb +33 -20
- data/lib/pubid/ieee/nesc/parser.rb +16 -15
- data/lib/pubid/ieee/parser.rb +462 -44
- data/lib/pubid/ieee/pre_parser.rb +1 -1
- data/lib/pubid/ieee/renderer.rb +158 -57
- data/lib/pubid/ieee/typed_stages.rb +12 -1
- data/lib/pubid/ieee/urn_generator.rb +35 -8
- data/lib/pubid/ieee.rb +63 -4
- data/lib/pubid/ieee_debug.rb +1 -0
- data/lib/pubid/ietf/builder.rb +78 -0
- data/lib/pubid/ietf/identifier.rb +5 -0
- data/lib/pubid/ietf/identifiers/base.rb +72 -0
- data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
- data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
- data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
- data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
- data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
- data/lib/pubid/ietf/identifiers/std.rb +36 -0
- data/lib/pubid/ietf/identifiers.rb +14 -0
- data/lib/pubid/ietf/parser.rb +61 -0
- data/lib/pubid/ietf/renderer.rb +64 -0
- data/lib/pubid/ietf/urn_generator.rb +37 -0
- data/lib/pubid/ietf/urn_parser.rb +43 -0
- data/lib/pubid/ietf.rb +86 -0
- data/lib/pubid/iho/identifier.rb +1 -3
- data/lib/pubid/iho/identifiers/base.rb +11 -10
- data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
- data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
- data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
- data/lib/pubid/iho/identifiers/publication.rb +1 -1
- data/lib/pubid/iho/identifiers/standard.rb +1 -1
- data/lib/pubid/iho/identifiers.rb +0 -1
- data/lib/pubid/iho/parser.rb +1 -1
- data/lib/pubid/iho.rb +8 -7
- data/lib/pubid/isbn/builder.rb +44 -0
- data/lib/pubid/isbn/check_digit.rb +53 -0
- data/lib/pubid/isbn/identifier.rb +81 -0
- data/lib/pubid/isbn/identifiers/book.rb +30 -0
- data/lib/pubid/isbn/identifiers.rb +9 -0
- data/lib/pubid/isbn/parser.rb +45 -0
- data/lib/pubid/isbn/renderer.rb +16 -0
- data/lib/pubid/isbn.rb +53 -0
- data/lib/pubid/iso/builder.rb +9 -4
- data/lib/pubid/iso/bundled_identifier.rb +5 -3
- data/lib/pubid/iso/combined_identifier.rb +6 -4
- data/lib/pubid/iso/identifier.rb +29 -8
- data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
- data/lib/pubid/iso/normalizer.rb +2 -2
- data/lib/pubid/iso/parser.rb +17 -13
- data/lib/pubid/iso/supplement_identifier.rb +19 -6
- data/lib/pubid/iso/urn_generator.rb +4 -1
- data/lib/pubid/iso/urn_parser.rb +1 -1
- data/lib/pubid/iso.rb +7 -1
- data/lib/pubid/itu/builder.rb +230 -29
- data/lib/pubid/itu/components/code.rb +48 -5
- data/lib/pubid/itu/components/designation.rb +35 -0
- data/lib/pubid/itu/components.rb +1 -0
- data/lib/pubid/itu/identifier.rb +1 -3
- data/lib/pubid/itu/identifiers/addendum.rb +15 -0
- data/lib/pubid/itu/identifiers/amendment.rb +7 -29
- data/lib/pubid/itu/identifiers/annex.rb +13 -2
- data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
- data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
- data/lib/pubid/itu/identifiers/base.rb +357 -25
- data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
- data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
- data/lib/pubid/itu/identifiers/errata.rb +15 -0
- data/lib/pubid/itu/identifiers/handbook.rb +38 -0
- data/lib/pubid/itu/identifiers/question.rb +63 -0
- data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
- data/lib/pubid/itu/identifiers/report.rb +39 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
- data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
- data/lib/pubid/itu/identifiers/supplement.rb +119 -14
- data/lib/pubid/itu/identifiers.rb +10 -1
- data/lib/pubid/itu/model.rb +1 -1
- data/lib/pubid/itu/parser.rb +481 -27
- data/lib/pubid/itu/urn_generator.rb +36 -6
- data/lib/pubid/itu/urn_parser.rb +8 -0
- data/lib/pubid/itu.rb +12 -3
- data/lib/pubid/jcgm/builder.rb +24 -14
- data/lib/pubid/jcgm/identifier.rb +10 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
- data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
- data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
- data/lib/pubid/jcgm/identifiers.rb +2 -0
- data/lib/pubid/jcgm/parser.rb +74 -7
- data/lib/pubid/jcgm/renderer.rb +33 -12
- data/lib/pubid/jcgm/single_identifier.rb +84 -6
- data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
- data/lib/pubid/jcgm/urn_generator.rb +21 -13
- data/lib/pubid/jcgm/urn_parser.rb +164 -10
- data/lib/pubid/jcgm.rb +10 -0
- data/lib/pubid/jis/identifier.rb +62 -3
- data/lib/pubid/jis/parser.rb +1 -1
- data/lib/pubid/jis.rb +1 -0
- data/lib/pubid/nist/builder.rb +29 -9
- data/lib/pubid/nist/caster.rb +7 -45
- data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
- data/lib/pubid/nist/components/stage.rb +2 -2
- data/lib/pubid/nist/components/supplement.rb +5 -2
- data/lib/pubid/nist/configuration.rb +6 -2
- data/lib/pubid/nist/identifier.rb +1 -3
- data/lib/pubid/nist/identifiers/base.rb +133 -39
- data/lib/pubid/nist/identifiers/circular.rb +10 -3
- data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
- data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
- data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
- data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
- data/lib/pubid/nist/identifiers/handbook.rb +10 -3
- data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
- data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
- data/lib/pubid/nist/identifiers/monograph.rb +15 -8
- data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
- data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
- data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
- data/lib/pubid/nist/identifiers/report.rb +15 -7
- data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
- data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
- data/lib/pubid/nist/identifiers.rb +0 -1
- data/lib/pubid/nist/parser.rb +27 -4
- data/lib/pubid/nist/preprocessor.rb +15 -0
- data/lib/pubid/nist/router.rb +2 -2
- data/lib/pubid/nist/series/ir.rb +0 -3
- data/lib/pubid/nist/supplement_identifier.rb +24 -9
- data/lib/pubid/nist.rb +19 -13
- data/lib/pubid/oasis/builder.rb +79 -0
- data/lib/pubid/oasis/identifier.rb +160 -0
- data/lib/pubid/oasis/identifiers/standard.rb +29 -0
- data/lib/pubid/oasis/identifiers.rb +9 -0
- data/lib/pubid/oasis/parser.rb +34 -0
- data/lib/pubid/oasis/renderer.rb +29 -0
- data/lib/pubid/oasis/urn_generator.rb +25 -0
- data/lib/pubid/oasis/urn_parser.rb +22 -0
- data/lib/pubid/oasis.rb +80 -0
- data/lib/pubid/ogc/builder.rb +33 -0
- data/lib/pubid/ogc/identifier.rb +81 -0
- data/lib/pubid/ogc/identifiers/document.rb +26 -0
- data/lib/pubid/ogc/identifiers.rb +10 -0
- data/lib/pubid/ogc/parser.rb +40 -0
- data/lib/pubid/ogc/renderer.rb +33 -0
- data/lib/pubid/ogc/urn_generator.rb +14 -0
- data/lib/pubid/ogc/urn_parser.rb +22 -0
- data/lib/pubid/ogc.rb +72 -0
- data/lib/pubid/oiml/builder.rb +36 -8
- data/lib/pubid/oiml/identifier.rb +9 -1
- data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
- data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
- data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
- data/lib/pubid/oiml/identifiers/document.rb +2 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
- data/lib/pubid/oiml/identifiers/guide.rb +2 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
- data/lib/pubid/oiml/identifiers.rb +1 -0
- data/lib/pubid/oiml/parser.rb +12 -13
- data/lib/pubid/oiml/renderer.rb +13 -13
- data/lib/pubid/oiml/single_identifier.rb +41 -37
- data/lib/pubid/oiml/supplement_identifier.rb +36 -9
- data/lib/pubid/oiml/urn_parser.rb +23 -6
- data/lib/pubid/oiml.rb +10 -0
- data/lib/pubid/omg/builder.rb +20 -0
- data/lib/pubid/omg/identifier.rb +61 -0
- data/lib/pubid/omg/identifiers/specification.rb +32 -0
- data/lib/pubid/omg/identifiers.rb +9 -0
- data/lib/pubid/omg/parser.rb +93 -0
- data/lib/pubid/omg/renderer.rb +31 -0
- data/lib/pubid/omg.rb +52 -0
- data/lib/pubid/parser/grammar.rb +74 -0
- data/lib/pubid/parser.rb +2 -0
- data/lib/pubid/parsers/mr_string.rb +120 -7
- data/lib/pubid/plateau/builder.rb +8 -4
- data/lib/pubid/plateau/identifier.rb +1 -3
- data/lib/pubid/plateau/identifiers/base.rb +1 -6
- data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
- data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
- data/lib/pubid/plateau/identifiers.rb +0 -1
- data/lib/pubid/plateau/parser.rb +16 -6
- data/lib/pubid/plateau/renderer.rb +1 -1
- data/lib/pubid/plateau/supplement_identifier.rb +11 -11
- data/lib/pubid/plateau.rb +14 -4
- data/lib/pubid/prefixes_support.rb +1 -0
- data/lib/pubid/renderers/annotator.rb +233 -0
- data/lib/pubid/renderers/base.rb +13 -0
- data/lib/pubid/renderers/directives_renderer.rb +3 -3
- data/lib/pubid/renderers/human_readable.rb +6 -4
- data/lib/pubid/renderers/mr_string.rb +54 -6
- data/lib/pubid/renderers/supplement_renderer.rb +1 -1
- data/lib/pubid/renderers.rb +1 -0
- data/lib/pubid/rendering/numbering.rb +25 -7
- data/lib/pubid/rendering/supplement.rb +4 -4
- data/lib/pubid/rendering.rb +1 -0
- data/lib/pubid/sae/builder.rb +1 -1
- data/lib/pubid/sae/identifier.rb +1 -3
- data/lib/pubid/sae/identifiers/base.rb +19 -9
- data/lib/pubid/sae/identifiers.rb +0 -1
- data/lib/pubid/sae/parser.rb +1 -1
- data/lib/pubid/sae.rb +4 -3
- data/lib/pubid/schema/declaration.rb +33 -0
- data/lib/pubid/schema/error.rb +14 -0
- data/lib/pubid/schema/identifier_type.rb +23 -0
- data/lib/pubid/schema/loader.rb +117 -0
- data/lib/pubid/schema/typed_stage.rb +24 -0
- data/lib/pubid/schema.rb +25 -0
- data/lib/pubid/tgpp/builder.rb +41 -0
- data/lib/pubid/tgpp/identifier.rb +107 -0
- data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
- data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
- data/lib/pubid/tgpp/identifiers.rb +11 -0
- data/lib/pubid/tgpp/parser.rb +78 -0
- data/lib/pubid/tgpp/renderer.rb +52 -0
- data/lib/pubid/tgpp/urn_generator.rb +39 -0
- data/lib/pubid/tgpp/urn_parser.rb +30 -0
- data/lib/pubid/tgpp.rb +84 -0
- data/lib/pubid/type_resolver.rb +74 -0
- data/lib/pubid/un/builder.rb +42 -0
- data/lib/pubid/un/identifier.rb +40 -0
- data/lib/pubid/un/identifiers/document.rb +24 -0
- data/lib/pubid/un/identifiers.rb +9 -0
- data/lib/pubid/un/parser.rb +25 -0
- data/lib/pubid/un/renderer.rb +11 -0
- data/lib/pubid/un.rb +47 -0
- data/lib/pubid/urn_parser/errors.rb +8 -1
- data/lib/pubid/urn_parser.rb +1 -0
- data/lib/pubid/utils.rb +1 -0
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid/w3c/builder.rb +55 -0
- data/lib/pubid/w3c/identifier.rb +130 -0
- data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
- data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
- data/lib/pubid/w3c/identifiers/note.rb +30 -0
- data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/standard.rb +12 -0
- data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
- data/lib/pubid/w3c/identifiers.rb +25 -0
- data/lib/pubid/w3c/parser.rb +43 -0
- data/lib/pubid/w3c/renderer.rb +35 -0
- data/lib/pubid/w3c/urn_generator.rb +18 -0
- data/lib/pubid/w3c/urn_parser.rb +36 -0
- data/lib/pubid/w3c.rb +68 -0
- data/lib/pubid/xsf/builder.rb +17 -0
- data/lib/pubid/xsf/identifier.rb +66 -0
- data/lib/pubid/xsf/identifiers/xep.rb +31 -0
- data/lib/pubid/xsf/identifiers.rb +9 -0
- data/lib/pubid/xsf/parser.rb +38 -0
- data/lib/pubid/xsf/renderer.rb +23 -0
- data/lib/pubid/xsf/urn_generator.rb +13 -0
- data/lib/pubid/xsf/urn_parser.rb +18 -0
- data/lib/pubid/xsf.rb +82 -0
- data/lib/pubid.rb +424 -22
- data/lib/tasks/conformance.rake +34 -0
- data/lib/tasks/docs.rake +3 -3
- data/lib/tasks/schema.rake +88 -0
- data/schema/core/joint_prefixes.yaml +24 -0
- data/schema/iec.yaml +1017 -0
- data/schema/iso.yaml +1586 -0
- data/schema/schema.schema.yaml +96 -0
- metadata +241 -19
- data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
- data/archived-gems/pubid-iec/stages.yaml +0 -129
- data/archived-gems/pubid-iec/update_codes.yaml +0 -67
- data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
- data/archived-gems/pubid-iso/stages.yaml +0 -106
- data/archived-gems/pubid-iso/update_codes.yaml +0 -4
- data/archived-gems/pubid-itu/i18n.yaml +0 -13
- data/archived-gems/pubid-itu/series.yaml +0 -42
- data/archived-gems/pubid-nist/publishers.yaml +0 -6
- data/archived-gems/pubid-nist/update_codes.yaml +0 -93
- data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
- data/lib/pubid/cie/components/code.rb +0 -80
- data/lib/pubid/iala/identifiers/base.rb +0 -14
- data/lib/pubid/iec/components/code.rb +0 -36
- /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
data/lib/pubid/builder/base.rb
CHANGED
|
@@ -125,9 +125,11 @@ module Pubid
|
|
|
125
125
|
|
|
126
126
|
def parse_date(value)
|
|
127
127
|
value = value.to_s
|
|
128
|
-
if value.match?(/^\d{4}(-\d{2})
|
|
129
|
-
year, month = value.split("-")
|
|
130
|
-
Pubid::Components::Date.new(year: year,
|
|
128
|
+
if value.match?(/^\d{4}(-\d{2}){0,2}$/)
|
|
129
|
+
year, month, day = value.split("-")
|
|
130
|
+
Pubid::Components::Date.new(year: year,
|
|
131
|
+
month: month || nil,
|
|
132
|
+
day: day || nil)
|
|
131
133
|
elsif value.is_a?(Integer) || (value.is_a?(String) && value.match?(/^\d{4}$/))
|
|
132
134
|
Pubid::Components::Date.new(year: value)
|
|
133
135
|
else
|
|
@@ -135,11 +137,14 @@ module Pubid
|
|
|
135
137
|
end
|
|
136
138
|
end
|
|
137
139
|
|
|
138
|
-
# Splits a compound document number ("1234", "1234-1", "1234-1-2")
|
|
139
|
-
#
|
|
140
|
-
#
|
|
141
|
-
#
|
|
142
|
-
|
|
140
|
+
# Splits a compound document number ("1234", "1234-1", "1234-1-2") into
|
|
141
|
+
# number/part/subpart. Each piece is wrapped in +code_class+ when the
|
|
142
|
+
# flavor declares those attributes as a Components::Code (ISO), and kept
|
|
143
|
+
# as a plain string when +code_class+ is nil (IEC and the other retyped
|
|
144
|
+
# flavors). Flavor-specific dash/slash normalization lives in
|
|
145
|
+
# +normalize_number_with_part+; legacy year extraction (e.g. ISO
|
|
146
|
+
# "4037-1979") lives in +extract_legacy_year+.
|
|
147
|
+
def parse_number_with_part(value, code_class: nil)
|
|
143
148
|
normalized = normalize_number_with_part(value)
|
|
144
149
|
parts = normalized.split("-").reject(&:empty?)
|
|
145
150
|
number = parts.shift
|
|
@@ -151,12 +156,19 @@ module Pubid
|
|
|
151
156
|
|
|
152
157
|
part = convert_roman_to_integer(part) if part
|
|
153
158
|
|
|
154
|
-
code_hash = { number:
|
|
155
|
-
code_hash[:part] =
|
|
156
|
-
code_hash[:subpart] =
|
|
159
|
+
code_hash = { number: wrap_component(number, code_class) }
|
|
160
|
+
code_hash[:part] = wrap_component(part, code_class) if part
|
|
161
|
+
code_hash[:subpart] = wrap_component(subpart, code_class) if subpart
|
|
157
162
|
code_hash
|
|
158
163
|
end
|
|
159
164
|
|
|
165
|
+
# A nil +code_class+ means the flavor holds number/part/subpart as plain
|
|
166
|
+
# strings — the `number` retype tranches — so keep the raw scalar. ISO
|
|
167
|
+
# still passes its Components::Code and is unaffected.
|
|
168
|
+
def wrap_component(value, code_class)
|
|
169
|
+
code_class ? code_class.new(value: value) : value
|
|
170
|
+
end
|
|
171
|
+
|
|
160
172
|
# Hook: normalize the raw number_with_part string before splitting.
|
|
161
173
|
# Override in subclasses for flavor-specific dash/slash/space handling.
|
|
162
174
|
def normalize_number_with_part(value)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
# Identifier that represents a combined bundle of documents using the + operator.
|
|
5
6
|
# Examples:
|
|
@@ -45,22 +46,27 @@ module Pubid
|
|
|
45
46
|
base_document&.typed_stage
|
|
46
47
|
end
|
|
47
48
|
|
|
49
|
+
# `**opts` carries render flags this method does not name — `annotated:`
|
|
50
|
+
# above all. Without it the closed keyword list raised
|
|
51
|
+
# `ArgumentError: unknown keyword: :annotated` for every bundled
|
|
52
|
+
# identifier, which is worse than a missing span: a wrapper is exactly the
|
|
53
|
+
# shape a consumer renders.
|
|
48
54
|
def to_s(lang: :en, lang_single: false, with_edition: false, format: nil,
|
|
49
|
-
stage_format_long: nil, with_date: nil)
|
|
55
|
+
stage_format_long: nil, with_date: nil, **opts)
|
|
50
56
|
result = base_document.to_s(lang: lang, lang_single: lang_single,
|
|
51
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)
|
|
57
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)
|
|
52
58
|
|
|
53
59
|
supplements.each do |supplement|
|
|
54
60
|
# ISO DirectivesSupplement always uses " + " (space before)
|
|
55
|
-
# CEN-style supplements (AC, A) without
|
|
56
|
-
# Other ISO supplements with
|
|
61
|
+
# CEN-style supplements (AC, A) without base use "+" (no space before)
|
|
62
|
+
# Other ISO supplements with base use " + " (space before)
|
|
57
63
|
if supplement.class.name&.include?("DirectivesSupplement") ||
|
|
58
|
-
(supplement.class.attributes.key?(:
|
|
64
|
+
(supplement.class.attributes.key?(:base) && !supplement.base.nil?)
|
|
59
65
|
result += " + #{supplement.to_s(lang: lang, lang_single: lang_single,
|
|
60
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)}"
|
|
66
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)}"
|
|
61
67
|
else
|
|
62
68
|
result += "+#{supplement.to_s(lang: lang, lang_single: lang_single,
|
|
63
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)}"
|
|
69
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)}"
|
|
64
70
|
end
|
|
65
71
|
end
|
|
66
72
|
|
|
@@ -102,9 +108,13 @@ stage_format_long: nil, with_date: nil)
|
|
|
102
108
|
parts << supplement.date.year.to_s
|
|
103
109
|
end
|
|
104
110
|
|
|
105
|
-
# Add supplement number if present
|
|
111
|
+
# Add supplement number if present. `supplement` is polymorphic and
|
|
112
|
+
# `number` is a Components::Code on ::Pubid::Identifier but a plain
|
|
113
|
+
# :string in a growing number of flavors, so read through either.
|
|
106
114
|
if supplement.number
|
|
107
|
-
|
|
115
|
+
number = supplement.number
|
|
116
|
+
value = number.respond_to?(:value) ? number.value : number
|
|
117
|
+
parts << "v#{value}"
|
|
108
118
|
end
|
|
109
119
|
end
|
|
110
120
|
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
# Builds a CalConnect identifier object from a Parslet parse tree. There is
|
|
6
|
+
# a single concrete type (Identifiers::Standard), so no type dispatch.
|
|
7
|
+
class Builder
|
|
8
|
+
def self.build(parsed_data)
|
|
9
|
+
new.build(parsed_data)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def build(data)
|
|
13
|
+
Identifiers::Standard.new(
|
|
14
|
+
series: data[:series]&.to_s,
|
|
15
|
+
number: data[:number].to_s,
|
|
16
|
+
date: build_date(data),
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# Publication date as a Pubid::Components::Date, or nil for a partial
|
|
23
|
+
# reference that omits the trailing ":YYYY" (relaton matches such refs by
|
|
24
|
+
# excluding the date). Digits are kept as strings verbatim (already
|
|
25
|
+
# zero-padded in the source, e.g. "07"/"23"); month/day are nil for the
|
|
26
|
+
# common year-only form.
|
|
27
|
+
def build_date(data)
|
|
28
|
+
return nil if data[:year].nil?
|
|
29
|
+
|
|
30
|
+
::Pubid::Components::Date.new(
|
|
31
|
+
year: data[:year].to_s,
|
|
32
|
+
month: data[:month]&.to_s,
|
|
33
|
+
day: data[:day]&.to_s,
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
# Base class for every CalConnect identifier AND the flavor's parse entry
|
|
6
|
+
# point — mirrors Pubid::Jis::Identifier. Concrete identifiers under
|
|
7
|
+
# Pubid::Calconnect::Identifiers descend from this class, so a parsed
|
|
8
|
+
# CalConnect id is an instance of Pubid::Calconnect::Identifier and
|
|
9
|
+
# relaton-index can pass this class as `pubid_class` for from_hash/to_hash.
|
|
10
|
+
class Identifier < ::Pubid::Identifier
|
|
11
|
+
# `number` is a CalConnect-specific plain string (preserves leading zeros
|
|
12
|
+
# like "0514" and the sub-part separator, "0812-1"/"0707.1"), so it
|
|
13
|
+
# overrides the inherited Components::Code type. The publication date uses
|
|
14
|
+
# the shared Pubid::Components::Date (inherited attribute): `year` is
|
|
15
|
+
# always present, `month`/`day` only for the rare full-date form
|
|
16
|
+
# ("CC/WD 51017:2024-07-23").
|
|
17
|
+
attribute :series, :string # Optional series letter/token (A, WD, DIR, …)
|
|
18
|
+
attribute :number, :string
|
|
19
|
+
attribute :date, ::Pubid::Components::Date
|
|
20
|
+
|
|
21
|
+
# Polymorphic type map for lutaml::Model key_value (de)serialization,
|
|
22
|
+
# mapping the concrete class's polymorphic_name to its class name so a
|
|
23
|
+
# stored hash rebuilds the correct identifier type via from_hash.
|
|
24
|
+
CALCONNECT_TYPE_MAP = {
|
|
25
|
+
"pubid:calconnect:standard" => "Pubid::Calconnect::Identifiers::Standard",
|
|
26
|
+
}.freeze
|
|
27
|
+
|
|
28
|
+
# The date serializes FLAT as year/month/day string keys (nils omitted),
|
|
29
|
+
# mirroring lib/pubid/iso/identifier.rb — not as a nested "date" object —
|
|
30
|
+
# so the index row stays a shallow hash and round-trips exactly.
|
|
31
|
+
key_value do
|
|
32
|
+
map "_type", to: :_type, polymorphic_map: CALCONNECT_TYPE_MAP
|
|
33
|
+
map "series", to: :series
|
|
34
|
+
map "number", to: :number
|
|
35
|
+
map "year", with: { to: :year_to_kv, from: :year_from_kv }
|
|
36
|
+
map "month", with: { to: :month_to_kv, from: :month_from_kv }
|
|
37
|
+
map "day", with: { to: :day_to_kv, from: :day_from_kv }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Publisher is always "CC". A plain constant (not a `publisher` method) so
|
|
41
|
+
# it doesn't shadow the inherited lutaml `publisher` attribute, which
|
|
42
|
+
# would otherwise fail serialization type validation.
|
|
43
|
+
PUBLISHER = "CC"
|
|
44
|
+
|
|
45
|
+
attr_reader :with_publisher
|
|
46
|
+
|
|
47
|
+
# Render the publication date, e.g. "2018" or "2024-07-23". Shared by the
|
|
48
|
+
# renderer and the URN generator so they always agree.
|
|
49
|
+
# Pubid::Components::Date#to_s yields the year alone, or the zero-padded
|
|
50
|
+
# "YYYY-MM-DD" when month/day are present.
|
|
51
|
+
def date_string
|
|
52
|
+
date&.to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Basic string representation. Delegates to the human renderer. The
|
|
56
|
+
# printed CalConnect id carries the "CC" publisher token by default; pass
|
|
57
|
+
# with_publisher: false to drop it (and the series slash).
|
|
58
|
+
def to_s(**opts)
|
|
59
|
+
render(format: :human, **opts)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Capture the with_publisher flag on EVERY render call (default true), so
|
|
63
|
+
# it can never leak across calls. The base `render` only forwards
|
|
64
|
+
# `:with_edition` to the renderer, so the flag is threaded via this
|
|
65
|
+
# per-call instance write (the renderer reads `id.with_publisher`).
|
|
66
|
+
def render(format: :human, with_publisher: true, **opts)
|
|
67
|
+
@with_publisher = with_publisher
|
|
68
|
+
super(format: format, **opts)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# --- date serialized flat as year/month/day (mirrors ISO) ---
|
|
72
|
+
def year_to_kv(model, doc)
|
|
73
|
+
emit_date_part(doc, "year", model.date&.year)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def month_to_kv(model, doc)
|
|
77
|
+
emit_date_part(doc, "month", model.date&.month)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def day_to_kv(model, doc)
|
|
81
|
+
emit_date_part(doc, "day", model.date&.day)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def year_from_kv(model, value) = date_for(model).year = value.to_s
|
|
85
|
+
def month_from_kv(model, value) = date_for(model).month = value.to_s
|
|
86
|
+
def day_from_kv(model, value) = date_for(model).day = value.to_s
|
|
87
|
+
|
|
88
|
+
def emit_date_part(doc, key, val)
|
|
89
|
+
return if val.nil? || val.to_s.empty?
|
|
90
|
+
|
|
91
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new(key, val.to_s))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def date_for(model)
|
|
95
|
+
model.date ||= ::Pubid::Components::Date.new
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# from_hash is the shared polymorphic dispatch on Pubid::Identifier.
|
|
99
|
+
# CALCONNECT_TYPE_MAP remains as the key_value polymorphic_map.
|
|
100
|
+
|
|
101
|
+
# Parse a CalConnect identifier string into an identifier object.
|
|
102
|
+
# @param identifier [String] The CalConnect identifier string to parse
|
|
103
|
+
# @return [Identifier] The appropriate identifier object
|
|
104
|
+
# @raise [Pubid::Errors::InvalidInputError]
|
|
105
|
+
# If the input exceeds the maximum length
|
|
106
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
107
|
+
def self.parse(identifier)
|
|
108
|
+
unless identifier.is_a?(String)
|
|
109
|
+
raise Pubid::Errors::InvalidInputError,
|
|
110
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
114
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Builder.build(Parser.parse(identifier))
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
module Identifiers
|
|
6
|
+
# The sole CalConnect document type. Its polymorphic_name resolves
|
|
7
|
+
# automatically to "pubid:calconnect:standard".
|
|
8
|
+
class Standard < Identifier
|
|
9
|
+
TYPED_STAGES = [
|
|
10
|
+
Pubid::Components::TypedStage.new(
|
|
11
|
+
code: :pubcc,
|
|
12
|
+
stage_code: :published,
|
|
13
|
+
type_code: :cc,
|
|
14
|
+
abbr: ["CC"],
|
|
15
|
+
name: "CalConnect Standard",
|
|
16
|
+
harmonized_stages: [],
|
|
17
|
+
),
|
|
18
|
+
].freeze
|
|
19
|
+
|
|
20
|
+
def self.type
|
|
21
|
+
{ key: :cc,
|
|
22
|
+
web: :standard,
|
|
23
|
+
title: "CalConnect Standard",
|
|
24
|
+
short: "CC" }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Calconnect
|
|
7
|
+
# Parslet grammar for CalConnect identifiers.
|
|
8
|
+
#
|
|
9
|
+
# Shape: CC[/<series>] <number>:<date>
|
|
10
|
+
# CC 18011:2018
|
|
11
|
+
# CC/DIR 10006:2019
|
|
12
|
+
# CC/Adv 0707.1:2007 (dot sub-part)
|
|
13
|
+
# CC/A 0812-1:2008 (dash sub-part)
|
|
14
|
+
# CC/WD 51017:2024-07-23 (full ISO date)
|
|
15
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
16
|
+
rule(:digit) { match["0-9"] }
|
|
17
|
+
rule(:digits) { digit.repeat(1) }
|
|
18
|
+
|
|
19
|
+
# Publisher token
|
|
20
|
+
rule(:publisher) { str("CC") }
|
|
21
|
+
|
|
22
|
+
# Series token — an open [A-Za-z]+ set (A, WD, R, S, CD, DIR, Adv, FDS, …)
|
|
23
|
+
rule(:series) { match["A-Za-z"].repeat(1).as(:series) }
|
|
24
|
+
|
|
25
|
+
# Number — digits, preserving leading zeros, with at most one dot- or
|
|
26
|
+
# dash-delimited sub-part ("0707.1", "0812-1"). Kept as a string.
|
|
27
|
+
rule(:number) do
|
|
28
|
+
(digits >> ((str(".") | str("-")) >> digits).maybe).as(:number)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Date after the colon: a year, optionally a full "YYYY-MM-DD". The colon
|
|
32
|
+
# hard-delimits number from date, and month+day only appear together, so
|
|
33
|
+
# the split is unambiguous.
|
|
34
|
+
rule(:date) do
|
|
35
|
+
digits.as(:year) >>
|
|
36
|
+
(str("-") >> digits.as(:month) >> str("-") >> digits.as(:day)).maybe
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
rule(:identifier) do
|
|
40
|
+
publisher >>
|
|
41
|
+
(str("/") >> series).maybe >>
|
|
42
|
+
str(" ") >>
|
|
43
|
+
number >>
|
|
44
|
+
(str(":") >> date).maybe
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
rule(:root) { identifier }
|
|
48
|
+
|
|
49
|
+
def self.parse(input)
|
|
50
|
+
new.parse(input)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
# Human-readable renderer for CalConnect identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces the canonical printed form, e.g.:
|
|
8
|
+
# "CC 18011:2018"
|
|
9
|
+
# "CC/DIR 10006:2019"
|
|
10
|
+
# "CC/WD 51017:2024-07-23"
|
|
11
|
+
# "DIR 10006:2019" (only when with_publisher: false)
|
|
12
|
+
#
|
|
13
|
+
# Registered as the `:human` format in the CalConnect format registry and
|
|
14
|
+
# invoked via `render(format: :human)`.
|
|
15
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
16
|
+
PUBLISHER = "CC"
|
|
17
|
+
|
|
18
|
+
def render(**_opts)
|
|
19
|
+
id = @id
|
|
20
|
+
prefix = if with_publisher?(id)
|
|
21
|
+
id.series ? "#{PUBLISHER}/#{id.series} " : "#{PUBLISHER} "
|
|
22
|
+
else
|
|
23
|
+
id.series ? "#{id.series} " : ""
|
|
24
|
+
end
|
|
25
|
+
date = id.date_string
|
|
26
|
+
"#{prefix}#{id.number}#{":#{date}" if date}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def with_publisher?(id)
|
|
32
|
+
id.respond_to?(:with_publisher) && id.with_publisher != false
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
# Emits CalConnect URNs of the form
|
|
6
|
+
# urn:calconnect[:<series>]:<number>:<date>
|
|
7
|
+
# e.g. "urn:calconnect:DIR:10006:2019", "urn:calconnect:18011:2018",
|
|
8
|
+
# "urn:calconnect:WD:51017:2024-07-23".
|
|
9
|
+
#
|
|
10
|
+
# The series keeps its printed case (JIS keeps its code case likewise) so a
|
|
11
|
+
# URN reconstructs the human form losslessly — mirror in urn_parser.rb.
|
|
12
|
+
#
|
|
13
|
+
# NOTE: a *partial* (date-less) reference has NO round-trippable URN form.
|
|
14
|
+
# Both `series` and `date` are optional, and UrnParser reads the trailing
|
|
15
|
+
# segments positionally, so a date-less URN like "urn:calconnect:11001"
|
|
16
|
+
# (or "urn:calconnect:DIR:10006") is ambiguous with a series-less dated URN
|
|
17
|
+
# and does not parse back. Partial refs are matched by pubid `#exclude`,
|
|
18
|
+
# not by URN, so this generator simply omits the missing segment rather
|
|
19
|
+
# than emitting an empty ":" — callers must not rely on URN round-trip for
|
|
20
|
+
# a partial id.
|
|
21
|
+
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
22
|
+
def generate
|
|
23
|
+
# series and date_string are nil for a series-less or partial
|
|
24
|
+
# (date-less) id; compact drops them so no empty ":" segment appears.
|
|
25
|
+
parts = [
|
|
26
|
+
"urn", "calconnect",
|
|
27
|
+
identifier.series, identifier.number.to_s, identifier.date_string
|
|
28
|
+
]
|
|
29
|
+
parts.compact.join(":")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Calconnect
|
|
5
|
+
# Parses CalConnect URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits: urn:calconnect[:<series>]:<number>:<date>
|
|
8
|
+
# urn:calconnect:18011:2018 → CC 18011:2018
|
|
9
|
+
# urn:calconnect:DIR:10006:2019 → CC/DIR 10006:2019
|
|
10
|
+
# urn:calconnect:WD:51017:2024-07-23 → CC/WD 51017:2024-07-23
|
|
11
|
+
#
|
|
12
|
+
# The date segment (year or full "YYYY-MM-DD") never contains a colon, so
|
|
13
|
+
# it is a single trailing part; the number precedes it, and an optional
|
|
14
|
+
# series precedes the number.
|
|
15
|
+
#
|
|
16
|
+
# This positional pop assumes a *dated* URN (the form UrnGenerator emits for
|
|
17
|
+
# a full id). A partial (date-less) reference has no round-trippable URN —
|
|
18
|
+
# see UrnGenerator — so this parser is only guaranteed for URNs produced
|
|
19
|
+
# from a full id; a date-less URN misaligns the pops and will not parse.
|
|
20
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
21
|
+
def parse_urn(urn)
|
|
22
|
+
parts = split_parts(strip_namespace(urn))
|
|
23
|
+
date = parts.pop
|
|
24
|
+
number = parts.pop
|
|
25
|
+
series = parts.pop
|
|
26
|
+
|
|
27
|
+
text = +"CC"
|
|
28
|
+
text << "/#{series}" if series
|
|
29
|
+
text << " #{number}:#{date}"
|
|
30
|
+
flavor_parse(text)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pubid"
|
|
4
|
+
module Pubid
|
|
5
|
+
# CalConnect (The Calendaring and Scheduling Consortium) flavor.
|
|
6
|
+
#
|
|
7
|
+
# Parses/renders the "CC …" numbering, e.g. "CC 18011:2018",
|
|
8
|
+
# "CC/DIR 10006:2019", "CC/Adv 0707.1:2007". Modeled on Pubid::Jis: a single
|
|
9
|
+
# flat identifier type (Identifiers::Standard) with no supplement layer.
|
|
10
|
+
module Calconnect
|
|
11
|
+
extend Pubid::PrefixesSupport
|
|
12
|
+
|
|
13
|
+
# Sole CalConnect publisher/leading token. Series letters (A, WD, R, S, CD,
|
|
14
|
+
# DIR, Adv, FDS) follow "CC/" and never lead a reference, so they are
|
|
15
|
+
# excluded per the PrefixesSupport inclusion policy.
|
|
16
|
+
PREFIXES = ["CC"].freeze
|
|
17
|
+
|
|
18
|
+
autoload :Builder, "#{__dir__}/calconnect/builder"
|
|
19
|
+
autoload :Identifier, "#{__dir__}/calconnect/identifier"
|
|
20
|
+
autoload :Identifiers, "#{__dir__}/calconnect/identifiers"
|
|
21
|
+
autoload :Parser, "#{__dir__}/calconnect/parser"
|
|
22
|
+
autoload :Renderer, "#{__dir__}/calconnect/renderer"
|
|
23
|
+
autoload :UrnGenerator, "#{__dir__}/calconnect/urn_generator"
|
|
24
|
+
autoload :UrnParser, "#{__dir__}/calconnect/urn_parser"
|
|
25
|
+
|
|
26
|
+
# Parse a CalConnect identifier string
|
|
27
|
+
def self.parse(identifier)
|
|
28
|
+
unless identifier.is_a?(String)
|
|
29
|
+
raise Pubid::Errors::InvalidInputError,
|
|
30
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
34
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Identifier.parse(identifier)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
41
|
+
Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
|
|
42
|
+
Identifier.format_registry.register(:human, renderer: Calconnect::Renderer)
|
|
43
|
+
|
|
44
|
+
# Auto-discover all identifier types from the Identifiers namespace
|
|
45
|
+
# @return [Array<Class>] identifier classes that define a self.type Hash
|
|
46
|
+
def self.identifier_types
|
|
47
|
+
@identifier_types ||= Identifiers.constants
|
|
48
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
49
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
50
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Build typed stage index from identifier types
|
|
54
|
+
# @return [Array<Pubid::Components::TypedStage>] all typed stages
|
|
55
|
+
def self.all_typed_stages
|
|
56
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
57
|
+
if klass.const_defined?(:TYPED_STAGES)
|
|
58
|
+
klass.const_get(:TYPED_STAGES)
|
|
59
|
+
else
|
|
60
|
+
[]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Lookup: type code -> identifier class
|
|
66
|
+
# @param code [String, Symbol] the type key to find
|
|
67
|
+
# @return [Class, nil] the matching identifier class
|
|
68
|
+
def self.locate_type(code)
|
|
69
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Lookup: abbreviation -> typed stage
|
|
73
|
+
# @param abbr [String, Symbol] the abbreviation to find
|
|
74
|
+
# @return [Pubid::Components::TypedStage, nil] the matching typed stage
|
|
75
|
+
def self.locate_stage(abbr)
|
|
76
|
+
abbr_str = abbr.to_s.upcase
|
|
77
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Register CalConnect flavor with the registry
|
|
83
|
+
Pubid::Registry.register(:calconnect, Pubid::Calconnect)
|
data/lib/pubid/ccsds/builder.rb
CHANGED
|
@@ -47,7 +47,7 @@ module Pubid
|
|
|
47
47
|
# If multiple corrigenda exist, we build the last one wrapping the base
|
|
48
48
|
corr_numbers.reduce(base) do |current_base, cor_num|
|
|
49
49
|
Identifiers::Corrigendum.new(
|
|
50
|
-
|
|
50
|
+
base: current_base,
|
|
51
51
|
number: cor_num,
|
|
52
52
|
)
|
|
53
53
|
end
|
|
@@ -10,7 +10,7 @@ module Pubid
|
|
|
10
10
|
#
|
|
11
11
|
# Keeping the root abstract (it is never itself a serialized type, so it is
|
|
12
12
|
# absent from CCSDS_TYPE_MAP) is what breaks the polymorphic recursion a
|
|
13
|
-
# supplement's `
|
|
13
|
+
# supplement's `base` would otherwise hit if it pointed at a
|
|
14
14
|
# concrete type that is also its own superclass.
|
|
15
15
|
class Identifier < ::Pubid::Identifier
|
|
16
16
|
# CCSDS stores every code component as a plain string (the Builder passes
|
|
@@ -54,12 +54,19 @@ module Pubid
|
|
|
54
54
|
|
|
55
55
|
# Parse a CCSDS identifier string into the appropriate identifier object.
|
|
56
56
|
def self.parse(identifier)
|
|
57
|
+
unless identifier.is_a?(String)
|
|
58
|
+
raise Pubid::Errors::InvalidInputError,
|
|
59
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
63
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
64
|
+
end
|
|
65
|
+
|
|
57
66
|
# Apply legacy update_codes normalization first
|
|
58
67
|
normalized = Core::UpdateCodes.apply(identifier, :ccsds)
|
|
59
68
|
parsed = Pubid::Ccsds::Parser.parse(normalized)
|
|
60
69
|
Pubid::Ccsds::Builder.build(parsed)
|
|
61
|
-
rescue Parslet::ParseFailed => e
|
|
62
|
-
raise "Failed to parse CCSDS identifier '#{identifier}': #{e.message}"
|
|
63
70
|
end
|
|
64
71
|
|
|
65
72
|
# from_hash is the shared polymorphic dispatch on Pubid::Identifier.
|
|
@@ -24,14 +24,16 @@ module Pubid
|
|
|
24
24
|
{ key: :base, web: :base, title: "Base Standard", short: nil }
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
# Composes its string by hand rather than going through `render`, so
|
|
28
|
+
# the annotation hook has to be applied on the way out.
|
|
29
|
+
def to_s(**opts)
|
|
28
30
|
result = "#{publisher} #{number}"
|
|
29
31
|
result += ".#{part}" if part
|
|
30
32
|
result += "-#{type}" if type
|
|
31
33
|
result += "-#{edition}" if edition
|
|
32
34
|
result += "-#{suffix}" if suffix
|
|
33
35
|
result += " - #{language} Translated" if language
|
|
34
|
-
result
|
|
36
|
+
annotate_plain_render(result, **opts)
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
end
|
|
@@ -24,15 +24,15 @@ module Pubid
|
|
|
24
24
|
# The corrigendum sequence number is stored in the inherited `number`
|
|
25
25
|
# attribute (mirroring ISO), so it serializes via Base's key_value as
|
|
26
26
|
# { _type, number: '1', base: {...} } with no corrigendum-specific map.
|
|
27
|
-
def to_s
|
|
28
|
-
base_str =
|
|
29
|
-
"#{base_str} Cor. #{number}"
|
|
27
|
+
def to_s(**opts)
|
|
28
|
+
base_str = base.to_s
|
|
29
|
+
annotate_plain_render("#{base_str} Cor. #{number}", **opts)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def ==(other)
|
|
33
33
|
return false unless other.is_a?(Corrigendum)
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
base == other.base && number == other.number
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|
data/lib/pubid/ccsds/parser.rb
CHANGED
|
@@ -19,7 +19,7 @@ module Pubid
|
|
|
19
19
|
attribute :type, Components::Type
|
|
20
20
|
attribute :typed_stage, Components::TypedStage
|
|
21
21
|
|
|
22
|
-
def to_s(lang: :en, lang_single: false)
|
|
22
|
+
def to_s(lang: :en, lang_single: false, **opts)
|
|
23
23
|
result = ""
|
|
24
24
|
|
|
25
25
|
# Publisher
|
|
@@ -47,7 +47,7 @@ module Pubid
|
|
|
47
47
|
# Language (optional)
|
|
48
48
|
result += " - #{language.code} Translated" if language
|
|
49
49
|
|
|
50
|
-
result
|
|
50
|
+
annotate_plain_render(result, **opts)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def <=>(other)
|