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
|
@@ -8,6 +8,31 @@ module Pubid
|
|
|
8
8
|
attribute :typed_stage, ::Pubid::Components::TypedStage,
|
|
9
9
|
default: -> { self.class.published_typed_stage }
|
|
10
10
|
|
|
11
|
+
# number/part/subpart are mapped HERE, not on Iec::Identifier, and the
|
|
12
|
+
# placement is the whole design.
|
|
13
|
+
#
|
|
14
|
+
# The four wrapper identifiers — FragmentIdentifier,
|
|
15
|
+
# ConsolidatedIdentifier, VapIdentifier and SheetIdentifier — inherit
|
|
16
|
+
# from Iec::Identifier DIRECTLY and override `number`/`part`/`subpart` as
|
|
17
|
+
# readers that delegate to what they wrap. A map on the shared parent
|
|
18
|
+
# would therefore serialize
|
|
19
|
+
# the delegated value twice: once at the wrapper's top level and again
|
|
20
|
+
# inside "base"/"identifiers". SingleIdentifier is the seam that excludes
|
|
21
|
+
# exactly those four while covering both classes that own a number of
|
|
22
|
+
# their own (Identifiers::Base and SupplementIdentifier).
|
|
23
|
+
#
|
|
24
|
+
# That is a structural exclusion, not a denylist of no-op converters that
|
|
25
|
+
# a later key can be forgotten from — which is how `month`/`day` came to
|
|
26
|
+
# leak (see DelegatedFieldSuppression).
|
|
27
|
+
#
|
|
28
|
+
# The values are plain strings, so no converter is needed: lutaml writes
|
|
29
|
+
# the scalar, and ::Pubid::Identifier#to_hash drops a nil.
|
|
30
|
+
key_value do
|
|
31
|
+
map "number", to: :number
|
|
32
|
+
map "part", to: :part
|
|
33
|
+
map "subpart", to: :subpart
|
|
34
|
+
end
|
|
35
|
+
|
|
11
36
|
# Generate URN for this identifier
|
|
12
37
|
#
|
|
13
38
|
# @return [String] URN representation
|
|
@@ -28,16 +53,14 @@ module Pubid
|
|
|
28
53
|
publisher.body
|
|
29
54
|
end
|
|
30
55
|
|
|
31
|
-
#
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
end
|
|
40
|
-
end
|
|
56
|
+
# IEC house style separates the publisher from the typed-stage
|
|
57
|
+
# abbreviation with a SPACE, for every type and whether or not there
|
|
58
|
+
# are copublishers: "IEC CD 60038", "IEC PNW 1000-1:2023". The slash
|
|
59
|
+
# stays the copublisher separator only. The slash input spelling
|
|
60
|
+
# ("IEC/CD 60038") is still accepted by the parser; only rendering
|
|
61
|
+
# normalises. See issue #360 item 2.
|
|
62
|
+
abbr = typed_stage&.abbreviation.to_s
|
|
63
|
+
pub_string += " #{abbr}" unless abbr.empty?
|
|
41
64
|
|
|
42
65
|
pub_string
|
|
43
66
|
end
|
|
@@ -48,7 +71,7 @@ module Pubid
|
|
|
48
71
|
(part ? "-#{part}" : ""),
|
|
49
72
|
(subpart ? "-#{subpart}" : ""),
|
|
50
73
|
(stage_iteration ? ".#{stage_iteration}" : ""),
|
|
51
|
-
(date ? ":#{date.
|
|
74
|
+
(date ? ":#{date.render}" : ""),
|
|
52
75
|
].join
|
|
53
76
|
end
|
|
54
77
|
|
|
@@ -4,7 +4,7 @@ module Pubid
|
|
|
4
4
|
module Iec
|
|
5
5
|
# Identifier that represents a supplement to a base identifier.
|
|
6
6
|
class SupplementIdentifier < SingleIdentifier
|
|
7
|
-
attribute :
|
|
7
|
+
attribute :base, Identifier, polymorphic: true
|
|
8
8
|
|
|
9
9
|
# Serialize the supplemented document under "base". The supplement's own
|
|
10
10
|
# number/date/stage come from the inherited common maps; route the nested
|
|
@@ -15,10 +15,10 @@ module Pubid
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def base_to_kv(model, doc)
|
|
18
|
-
base = model.
|
|
18
|
+
base = model.base
|
|
19
19
|
return unless base
|
|
20
20
|
|
|
21
|
-
# `
|
|
21
|
+
# `base` synthesises a base for a supplement that has none
|
|
22
22
|
# (e.g. a bare "+AMD1:2008" nested in a consolidation): a fake doc whose
|
|
23
23
|
# number equals the supplement's own. It renders nothing and the getter
|
|
24
24
|
# recreates it identically on load, so don't persist it. A standalone
|
|
@@ -34,7 +34,7 @@ module Pubid
|
|
|
34
34
|
return unless value
|
|
35
35
|
|
|
36
36
|
base = ::Pubid::Iec::Identifier.from_hash(value)
|
|
37
|
-
model.
|
|
37
|
+
model.base = base
|
|
38
38
|
|
|
39
39
|
# A base of the exact SingleIdentifier class is the synthetic self-base
|
|
40
40
|
# of a standalone supplement ("IEC/FDAM 60038-1"); a real attached base
|
|
@@ -55,18 +55,18 @@ module Pubid
|
|
|
55
55
|
@supplement_number = @number
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
# Override
|
|
59
|
-
def
|
|
60
|
-
@
|
|
58
|
+
# Override base getter to ensure it's always created for standalone supplements
|
|
59
|
+
def base
|
|
60
|
+
@base || ensure_base
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
# Override number getter to trigger swap for standalone supplements
|
|
64
64
|
def number
|
|
65
|
-
# Guard against recursion in
|
|
65
|
+
# Guard against recursion in ensure_base
|
|
66
66
|
return @number if @ensuring_base
|
|
67
67
|
|
|
68
68
|
# For standalone supplements, trigger base creation first
|
|
69
|
-
|
|
69
|
+
ensure_base if @synthetic_base.nil? && publisher && part
|
|
70
70
|
|
|
71
71
|
if @synthetic_base
|
|
72
72
|
@supplement_number || @number
|
|
@@ -85,7 +85,7 @@ module Pubid
|
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
-
# Delegate publisher and copublishers to
|
|
88
|
+
# Delegate publisher and copublishers to base whenever there is
|
|
89
89
|
# a base (a supplement carries the publisher of the document it
|
|
90
90
|
# supplements). Checking base first — rather than `@publisher || base` — is
|
|
91
91
|
# required now that the publisher attribute has an IEC default, which would
|
|
@@ -93,20 +93,20 @@ module Pubid
|
|
|
93
93
|
def publisher
|
|
94
94
|
return @publisher if @ensuring_base
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
base ? base.publisher : @publisher
|
|
97
97
|
end
|
|
98
98
|
|
|
99
99
|
def copublishers
|
|
100
100
|
return @copublishers if @ensuring_base
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
base ? base.copublishers : @copublishers
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
# Ensure we have a
|
|
105
|
+
# Ensure we have a base for standalone supplements
|
|
106
106
|
# Creates a synthetic base identifier from supplement attributes if needed
|
|
107
|
-
# Returns the
|
|
108
|
-
def
|
|
109
|
-
return @
|
|
107
|
+
# Returns the base
|
|
108
|
+
def ensure_base
|
|
109
|
+
return @base if @base
|
|
110
110
|
|
|
111
111
|
# Guard flag to prevent recursion in number getter
|
|
112
112
|
@ensuring_base = true
|
|
@@ -140,14 +140,14 @@ module Pubid
|
|
|
140
140
|
stage_code: :undated,
|
|
141
141
|
)
|
|
142
142
|
|
|
143
|
-
@
|
|
143
|
+
@base = base
|
|
144
144
|
|
|
145
145
|
# Store the supplement number for getter override
|
|
146
|
-
# The original number is the base number (moved to
|
|
146
|
+
# The original number is the base number (moved to base)
|
|
147
147
|
# The original part is the supplement number (what we want to return)
|
|
148
148
|
@supplement_number = supplement_number
|
|
149
149
|
|
|
150
|
-
@
|
|
150
|
+
@base
|
|
151
151
|
ensure
|
|
152
152
|
@ensuring_base = false
|
|
153
153
|
end
|
|
@@ -160,6 +160,19 @@ module Pubid
|
|
|
160
160
|
def to_s(**opts)
|
|
161
161
|
render(format: :human, **opts)
|
|
162
162
|
end
|
|
163
|
+
|
|
164
|
+
# MR supplement suffix: `/{type}.{number}.{year}` (e.g. "/amd.1.2016").
|
|
165
|
+
# The MrString renderer recurses into `base` and appends this so the
|
|
166
|
+
# full supplement chain round-trips losslessly (issue #142).
|
|
167
|
+
def mr_supplement_suffix
|
|
168
|
+
segments = []
|
|
169
|
+
segments << mr_type if mr_type
|
|
170
|
+
segments << number&.to_s if number
|
|
171
|
+
segments << date&.year&.to_s if date&.year
|
|
172
|
+
return nil if segments.empty?
|
|
173
|
+
|
|
174
|
+
segments.join(".")
|
|
175
|
+
end
|
|
163
176
|
end
|
|
164
177
|
end
|
|
165
178
|
end
|
|
@@ -2,77 +2,243 @@
|
|
|
2
2
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Iec
|
|
5
|
-
# Generates IEC URNs in the
|
|
6
|
-
#
|
|
5
|
+
# Generates IEC URNs in the positional format used as ground truth by
|
|
6
|
+
# relaton-data-iec:
|
|
7
7
|
#
|
|
8
|
-
# urn:iec:std:{
|
|
8
|
+
# urn:iec:std:{authority}:{number}[-{part}[-{subpart}]]
|
|
9
|
+
# :{date}:{stage-or-type}:{deliverable}:{language}{adjuncts}
|
|
9
10
|
#
|
|
10
|
-
# e.g. +urn:iec:std:iec:60050-102:2007
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
11
|
+
# e.g. +urn:iec:std:iec:60050-102:2007:::+. Absent trailing slots are
|
|
12
|
+
# emitted as empty fields. The all-parts series URN is the one exception:
|
|
13
|
+
# a bare series omits the language slot (8 fields).
|
|
14
|
+
#
|
|
15
|
+
# This used to be a port of relaton-iec's +code_to_urn+, which regex-scraped
|
|
16
|
+
# +identifier.to_s+. Three defects followed from reading the printed form:
|
|
17
|
+
# the stage was folded into the authority slot (+urn:iec:std:iec-np:...+),
|
|
18
|
+
# the edition was never emitted, and the regex was unanchored, so any type
|
|
19
|
+
# token outside its hard-coded list consumed the publisher instead
|
|
20
|
+
# (+IEC/DTS 62271-1+ became +urn:iec:std:dts:62271-1::::+, and every
|
|
21
|
+
# +IECEE TRF ...+ keyed +urn:iec:std:trf:...+). The generator now reads the
|
|
22
|
+
# identifier's own components. The slot ORDER is unchanged, because the
|
|
23
|
+
# published corpus uses it. See issue #360 item 4.
|
|
15
24
|
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
URN_CONTEXT = Rendering::RenderingContext.urn.freeze
|
|
26
|
+
private_constant :URN_CONTEXT
|
|
27
|
+
|
|
28
|
+
# Type codes that occupy the type slot. `is` and `trf` render empty
|
|
29
|
+
# there, as they always have. `tec` and `wp` never appear in the corpus
|
|
30
|
+
# but the legacy grammar accepted them, so they stay recognised.
|
|
31
|
+
TYPE_SLOT_CODES = %w[tr ts pas srd guide tec wp].freeze
|
|
32
|
+
|
|
33
|
+
# Deliverable markers occupying the deliverable slot. "ser" reaches this
|
|
34
|
+
# list as a spelled-out VAP code ("IEC 60034:2026 SER"), which is not the
|
|
35
|
+
# same thing as the `all_parts` series form handled below.
|
|
36
|
+
DELIVERABLES = %w[cmv csv exv prv rlv ser].freeze
|
|
37
|
+
|
|
38
|
+
# Supplement classes that contribute an adjunct, and the token each one
|
|
39
|
+
# writes into it.
|
|
40
|
+
ADJUNCT_TOKENS = {
|
|
41
|
+
"Amendment" => "amd",
|
|
42
|
+
"Corrigendum" => "cor",
|
|
43
|
+
"InterpretationSheet" => "ish",
|
|
44
|
+
}.freeze
|
|
18
45
|
|
|
19
46
|
def generate
|
|
20
|
-
|
|
47
|
+
doc = document
|
|
48
|
+
return nil if doc.nil?
|
|
21
49
|
|
|
22
|
-
|
|
50
|
+
num = number_segment(doc)
|
|
51
|
+
return nil if num.nil? || num.empty?
|
|
52
|
+
|
|
53
|
+
slots = ["urn", "iec", "std", authority(doc), num,
|
|
54
|
+
date_slot(doc), stage_or_type_slot(doc), deliverable_slot]
|
|
55
|
+
adjuncts = adjunct_slots(identifier)
|
|
56
|
+
language = language_slot
|
|
57
|
+
slots << language unless bare_series?(slots, adjuncts, language)
|
|
58
|
+
|
|
59
|
+
(slots + adjuncts).join(":").downcase
|
|
23
60
|
end
|
|
24
61
|
|
|
25
62
|
private
|
|
26
63
|
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
def
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
# The document the URN names: the origin standard, with every amendment,
|
|
65
|
+
# corrigendum, consolidation, VAP and fragment layer peeled off. Those
|
|
66
|
+
# layers are what the adjunct and deliverable slots record.
|
|
67
|
+
#
|
|
68
|
+
# A CISPR test report form carries no number of its own — the document it
|
|
69
|
+
# reports on sits in `cispr_identifier`, and that is what the URN has
|
|
70
|
+
# always named.
|
|
71
|
+
def document
|
|
72
|
+
doc = identifier.respond_to?(:root) ? identifier.root : identifier
|
|
73
|
+
return doc if doc.nil? || number_segment(doc)
|
|
74
|
+
|
|
75
|
+
maybe_of(doc, :cispr_identifier) || doc
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# A publisher body may carry a space ("IEC CA", "IECQ CS", "IECQ OD").
|
|
79
|
+
# The published corpus records only the last token for those
|
|
80
|
+
# (+urn:iec:std:ca:01:2017:::+), which is what the old whitespace-
|
|
81
|
+
# splitting regex produced. Keeping that spelling is what keeps those
|
|
82
|
+
# rows byte-identical; correcting it to "iec-ca" would need a data
|
|
83
|
+
# migration first.
|
|
84
|
+
def authority(doc)
|
|
85
|
+
publishers = [doc.publisher] + Array(doc.copublishers)
|
|
86
|
+
publishers.compact.map { |p| p.body.to_s.split(/\s+/).last.to_s }
|
|
87
|
+
.reject(&:empty?).join("-")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def number_segment(doc)
|
|
91
|
+
return nil unless doc.respond_to?(:number) && doc.number
|
|
92
|
+
|
|
93
|
+
segment = [doc.number, maybe_of(doc, :part), maybe_of(doc, :subpart)]
|
|
94
|
+
.compact.map(&:to_s).reject(&:empty?).join("-")
|
|
95
|
+
return nil if segment.empty?
|
|
96
|
+
|
|
97
|
+
# A few document numbers are multi-word ("DIR 1 IEC SUP"). A URN
|
|
98
|
+
# carries no spaces, so they become hyphens.
|
|
99
|
+
segment.gsub(/\s+/, "-")
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# `Components::Date#render` under a URN context deliberately drops the
|
|
103
|
+
# month, which is the ISO convention. IEC keeps the precision it was
|
|
104
|
+
# given ("IEC CA 01:2025-10" keys ...:2025-10:...), so this reads the
|
|
105
|
+
# printed form.
|
|
106
|
+
def date_slot(doc)
|
|
107
|
+
maybe_of(doc, :date).to_s
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# The stage slot and the type slot are the same slot, and a draft of a
|
|
111
|
+
# typed document has both. Both are kept, type first
|
|
112
|
+
# ("ts-stage-50.00"), because the harmonized codes are shared across
|
|
113
|
+
# types: dropping the type would make a draft TS, a draft TR and a draft
|
|
114
|
+
# International Standard collide, and `parse_urn` would resolve every one
|
|
115
|
+
# of them to an International Standard.
|
|
116
|
+
def stage_or_type_slot(doc)
|
|
117
|
+
type = type_token(doc)
|
|
118
|
+
stage = stage_token(doc)
|
|
119
|
+
|
|
120
|
+
return type if stage.nil?
|
|
121
|
+
|
|
122
|
+
[type, stage].reject { |t| t.nil? || t.empty? }.join("-")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def type_token(doc)
|
|
126
|
+
ts = maybe_of(doc, :typed_stage)
|
|
127
|
+
code = ts&.type_code.to_s.downcase
|
|
128
|
+
TYPE_SLOT_CODES.include?(code) ? code : ""
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# nil when the document is published (or carries no stage at all), so the
|
|
132
|
+
# slot keeps holding the bare type token for every published row.
|
|
133
|
+
def stage_token(doc)
|
|
134
|
+
stage = maybe_of(doc, :typed_stage)&.to_stage || maybe_of(doc, :stage)
|
|
135
|
+
harmonized = stage&.harmonized_stages&.first.to_s
|
|
136
|
+
return nil if harmonized.empty?
|
|
137
|
+
return nil if published_stage?(stage)
|
|
138
|
+
|
|
139
|
+
"stage-#{harmonized}"
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def published_stage?(stage)
|
|
143
|
+
stage.stage_code.to_s == "published"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# A deliverable code owns the slot; the edition takes it only when there
|
|
147
|
+
# is none.
|
|
148
|
+
def deliverable_slot
|
|
149
|
+
return "ser" if maybe_of(identifier, :all_parts)
|
|
150
|
+
|
|
151
|
+
vap = vap_codes
|
|
152
|
+
return vap unless vap.empty?
|
|
153
|
+
|
|
154
|
+
edition = maybe_of(identifier, :edition)
|
|
155
|
+
return "" unless edition&.number
|
|
156
|
+
|
|
157
|
+
edition.render(context: URN_CONTEXT).to_s
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# A deliverable sits on the VAP layer, which is not always the outermost
|
|
161
|
+
# one: "IEC 60079-10-1:2020 CMV/COR1:2021" is a corrigendum wrapping the
|
|
162
|
+
# CMV, so the codes have to be looked for down the chain.
|
|
163
|
+
def vap_codes
|
|
164
|
+
codes = find_down(:vap)
|
|
165
|
+
return "" unless codes
|
|
166
|
+
|
|
167
|
+
Array(codes).map { |c| c.to_s.downcase }
|
|
168
|
+
.select { |c| DELIVERABLES.include?(c) }.join("-")
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# First non-empty value of `attribute` from the outermost identifier
|
|
172
|
+
# inwards.
|
|
173
|
+
def find_down(attribute)
|
|
174
|
+
id = identifier
|
|
175
|
+
while id
|
|
176
|
+
value = maybe_of(id, attribute)
|
|
177
|
+
return value unless value.nil? ||
|
|
178
|
+
(value.respond_to?(:empty?) && value.empty?)
|
|
179
|
+
|
|
180
|
+
id = maybe_of(id, :base) ||
|
|
181
|
+
Array(maybe_of(id, :identifiers)).first
|
|
182
|
+
end
|
|
183
|
+
nil
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def language_slot
|
|
187
|
+
langs = maybe_of(identifier, :languages)
|
|
188
|
+
return "" unless langs&.any?
|
|
189
|
+
|
|
190
|
+
langs.map { |l| l.code.to_s }.join("-")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# A bare, undated, stage- and language-less all-parts series drops the
|
|
194
|
+
# trailing empty language slot, matching the canonical relaton-data-iec
|
|
195
|
+
# form urn:iec:std:iec:80000:::ser. A dated series, or one carrying a
|
|
196
|
+
# stage, keeps the slot.
|
|
197
|
+
def bare_series?(slots, adjuncts, language)
|
|
198
|
+
slots.last == "ser" && slots[5, 2].all? { |s| s.to_s.empty? } &&
|
|
199
|
+
adjuncts.empty? && language.empty?
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Walks the identifier tree for the amendment / corrigendum /
|
|
203
|
+
# interpretation-sheet layers, innermost first. A member of a
|
|
204
|
+
# consolidated identifier carries the "plus" relation marker, which the
|
|
205
|
+
# printed form spells "+".
|
|
206
|
+
def adjunct_slots(id)
|
|
207
|
+
return [] if id.nil?
|
|
208
|
+
|
|
209
|
+
case id.class.name.split("::").last
|
|
210
|
+
when "ConsolidatedIdentifier"
|
|
211
|
+
members = Array(id.identifiers)
|
|
212
|
+
adjunct_slots(members.first) +
|
|
213
|
+
members.drop(1).flat_map { |m| adjunct_fields(m, plus: true) }
|
|
214
|
+
when *ADJUNCT_TOKENS.keys
|
|
215
|
+
adjunct_slots(id.base) + adjunct_fields(id, plus: false)
|
|
216
|
+
else
|
|
217
|
+
adjunct_slots(id.respond_to?(:base) ? id.base : nil)
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def adjunct_fields(id, plus:)
|
|
222
|
+
token = ADJUNCT_TOKENS[id.class.name.split("::").last]
|
|
223
|
+
return adjunct_slots(id.respond_to?(:base) ? id.base : nil) unless token
|
|
224
|
+
|
|
225
|
+
[plus ? "plus" : "", token, id.number.to_s,
|
|
226
|
+
maybe_of(id, :date)&.render(context: URN_CONTEXT).to_s]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Not every IEC class declares every attribute, and a wrapper may not
|
|
230
|
+
# declare one its base does. The `respond_to?` guard covers the missing
|
|
231
|
+
# attribute; the rescue covers an attribute that exists but nil-chases
|
|
232
|
+
# while resolving — `SupplementIdentifier#number` runs `ensure_base` and
|
|
233
|
+
# reads through a base that may not be built yet. It is deliberately
|
|
234
|
+
# narrow: a broader rescue would swallow a real bug into a silently
|
|
235
|
+
# empty URN slot instead of failing loudly.
|
|
236
|
+
def maybe_of(id, attribute)
|
|
237
|
+
return nil unless id.respond_to?(attribute)
|
|
238
|
+
|
|
239
|
+
id.public_send(attribute)
|
|
240
|
+
rescue NoMethodError
|
|
241
|
+
nil
|
|
76
242
|
end
|
|
77
243
|
end
|
|
78
244
|
end
|
data/lib/pubid/iec/urn_parser.rb
CHANGED
|
@@ -31,16 +31,24 @@ module Pubid
|
|
|
31
31
|
# @return [Identifier] parsed identifier
|
|
32
32
|
def parse_urn(urn)
|
|
33
33
|
unless urn.start_with?("urn:iec:std:")
|
|
34
|
-
raise Errors::ParseError, "Invalid IEC URN: #{urn}"
|
|
34
|
+
raise Pubid::UrnParser::Errors::ParseError, "Invalid IEC URN: #{urn}"
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
code, lang, all_parts = urn_to_code(urn)
|
|
38
|
-
|
|
38
|
+
unless code
|
|
39
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
40
|
+
"Invalid IEC URN: #{urn}"
|
|
41
|
+
end
|
|
39
42
|
|
|
40
43
|
id = Pubid::Iec::Identifier.parse(code)
|
|
41
44
|
id.all_parts = true if all_parts && id.class.attributes.key?(:all_parts)
|
|
45
|
+
# The language slot joins codes with a hyphen ("en-fr"). Building one
|
|
46
|
+
# Language from the whole field gave a single bogus language that
|
|
47
|
+
# rendered as "(en-fr)".
|
|
42
48
|
if lang && !lang.empty? && id.class.attributes.key?(:languages)
|
|
43
|
-
id.languages =
|
|
49
|
+
id.languages = lang.split("-").map do |code|
|
|
50
|
+
::Pubid::Components::Language.new(code: code)
|
|
51
|
+
end
|
|
44
52
|
end
|
|
45
53
|
id
|
|
46
54
|
end
|
|
@@ -57,7 +65,8 @@ module Pubid
|
|
|
57
65
|
all_parts = false
|
|
58
66
|
|
|
59
67
|
code = head.gsub("-", "/")
|
|
60
|
-
|
|
68
|
+
type_code = type_slot_to_code(type)
|
|
69
|
+
code += " #{type_code}" unless type_code.empty?
|
|
61
70
|
code += " #{num}"
|
|
62
71
|
code += ":#{date}" unless date.nil? || date.empty?
|
|
63
72
|
code += adjunct_to_code(fields[9..])
|
|
@@ -67,6 +76,8 @@ module Pubid
|
|
|
67
76
|
# part or date, so to_s renders "IEC NNNN (all parts)").
|
|
68
77
|
if deliv&.casecmp("SER")&.zero?
|
|
69
78
|
all_parts = true
|
|
79
|
+
elsif (edition = edition_slot_to_code(deliv))
|
|
80
|
+
code += " #{edition}"
|
|
70
81
|
elsif deliv && !deliv.empty?
|
|
71
82
|
code += " #{deliv}"
|
|
72
83
|
end
|
|
@@ -74,6 +85,33 @@ module Pubid
|
|
|
74
85
|
[code, lang&.downcase, all_parts]
|
|
75
86
|
end
|
|
76
87
|
|
|
88
|
+
# The type slot holds either the legacy type token ("TS"), a stage
|
|
89
|
+
# ("STAGE-10.20"), or both ("TS-STAGE-50.00"). A stage is written back as
|
|
90
|
+
# the abbreviation the grammar accepts, resolved from the registry by
|
|
91
|
+
# type code and harmonized code — so the round trip is exact in both
|
|
92
|
+
# directions. See issue #360 item 4.
|
|
93
|
+
def type_slot_to_code(type)
|
|
94
|
+
return "" if type.nil? || type.empty?
|
|
95
|
+
|
|
96
|
+
match = /\A(?:([A-Z]+)-)?STAGE-([\d.]+)\z/.match(type)
|
|
97
|
+
return type unless match
|
|
98
|
+
|
|
99
|
+
type_code = (match[1] || "IS").downcase
|
|
100
|
+
stage = Pubid::Iec.all_typed_stages.find do |s|
|
|
101
|
+
s.type_code.to_s == type_code &&
|
|
102
|
+
s.harmonized_stages&.first.to_s == match[2]
|
|
103
|
+
end
|
|
104
|
+
return "" unless stage
|
|
105
|
+
|
|
106
|
+
stage.abbr.first.to_s
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# "ED-7" in the deliverable slot is an edition, not a deliverable code.
|
|
110
|
+
def edition_slot_to_code(deliv)
|
|
111
|
+
match = /\AED-(.+)\z/.match(deliv.to_s)
|
|
112
|
+
match && "ED#{match[1]}"
|
|
113
|
+
end
|
|
114
|
+
|
|
77
115
|
# Port of Relaton::Iec.ajanct_to_code — recursively rebuilds amd/cor/ish
|
|
78
116
|
# adjuncts from (relation, type, number, date) quartets. A "PLUS"
|
|
79
117
|
# relation token (the consolidated "+" marker) yields "+"; otherwise "/".
|
data/lib/pubid/iec.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Iec
|
|
5
6
|
autoload :Components, "#{__dir__}/iec/components"
|
|
@@ -23,12 +24,7 @@ module Pubid
|
|
|
23
24
|
autoload :Renderer, "#{__dir__}/iec/renderer"
|
|
24
25
|
|
|
25
26
|
def self.parse(identifier_string)
|
|
26
|
-
|
|
27
|
-
raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
parsed = Parser.new.parse(identifier_string)
|
|
31
|
-
Builder.new.build(parsed)
|
|
27
|
+
Identifier.parse(identifier_string)
|
|
32
28
|
end
|
|
33
29
|
|
|
34
30
|
def self.parse_urn(urn)
|
|
@@ -23,7 +23,7 @@ module Pubid
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# Extract code
|
|
26
|
-
code_str =
|
|
26
|
+
code_str = extract_number(parsed[:number])
|
|
27
27
|
if code_str
|
|
28
28
|
attributes[:code] = Components::Code.parse(code_str)
|
|
29
29
|
end
|
|
@@ -36,9 +36,11 @@ module Pubid
|
|
|
36
36
|
month_str = extract_value(parsed[:month])
|
|
37
37
|
attributes[:month] = month_str if month_str
|
|
38
38
|
|
|
39
|
-
# Extract separator (for rendering
|
|
39
|
+
# Extract the long-form date separator ("," or ".") for rendering.
|
|
40
|
+
# Named `date_separator` on the identifier to avoid colliding with the
|
|
41
|
+
# CodeNumber code-part `separator`.
|
|
40
42
|
separator_str = extract_value(parsed[:separator])
|
|
41
|
-
attributes[:
|
|
43
|
+
attributes[:date_separator] = separator_str if separator_str
|
|
42
44
|
|
|
43
45
|
# Set original format based on parsed data
|
|
44
46
|
attributes[:original_format] = if separator_str || month_str
|
|
@@ -53,6 +55,18 @@ module Pubid
|
|
|
53
55
|
|
|
54
56
|
private
|
|
55
57
|
|
|
58
|
+
# Extract the number, flattening a "431 (105)" main-number/parenthetical
|
|
59
|
+
# subtree into a plain string. Without this, a Hash node leaks its raw
|
|
60
|
+
# Parslet inspect form (e.g. `{main_number: "431"@8, ...}`) into `to_s`.
|
|
61
|
+
def extract_number(value)
|
|
62
|
+
return extract_value(value) unless value.is_a?(Hash)
|
|
63
|
+
|
|
64
|
+
main = extract_value(value[:main_number])
|
|
65
|
+
paren = value[:parenthetical]
|
|
66
|
+
alt = paren.is_a?(Hash) ? extract_value(paren[:alt_number]) : nil
|
|
67
|
+
alt ? "#{main} (#{alt})" : main
|
|
68
|
+
end
|
|
69
|
+
|
|
56
70
|
def extract_value(value)
|
|
57
71
|
return nil if value.nil?
|
|
58
72
|
return nil if value.is_a?(Array) && value.empty?
|