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
|
@@ -7,8 +7,13 @@ module Pubid
|
|
|
7
7
|
# Represents corrections to published standards
|
|
8
8
|
# Example: IEEE Std 535-2013/Cor. 1-2017
|
|
9
9
|
class Corrigendum < SupplementIdentifier
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
# The corrigendum's own ordinal (`number`) and `year` — uniform names,
|
|
11
|
+
# not `cor_number`/`cor_year`. `number` is a plain string redefining the
|
|
12
|
+
# inherited Components::Code (leaf-safe, like the standards); `year` is
|
|
13
|
+
# the inherited base :string. `root.number` still returns the *base*
|
|
14
|
+
# document number, so the index key is unaffected.
|
|
15
|
+
attribute :number, :string
|
|
16
|
+
# `year` inherited from the base.
|
|
12
17
|
|
|
13
18
|
# TYPED_STAGES for corrigendum
|
|
14
19
|
# Corrigendum uses "Cor" abbreviation
|
|
@@ -19,6 +24,16 @@ module Pubid
|
|
|
19
24
|
stage_code: "published",
|
|
20
25
|
),
|
|
21
26
|
].freeze
|
|
27
|
+
|
|
28
|
+
# MR supplement suffix: `cor.{number}.{year}` (e.g. "/cor.1.2017").
|
|
29
|
+
# The MrString renderer recurses into `base` and appends this so the
|
|
30
|
+
# full IEEE corrigendum round-trips losslessly (issue #142).
|
|
31
|
+
def mr_supplement_suffix
|
|
32
|
+
segments = ["cor"]
|
|
33
|
+
segments << number.to_s if number
|
|
34
|
+
segments << year.to_s if year
|
|
35
|
+
segments.join(".")
|
|
36
|
+
end
|
|
22
37
|
end
|
|
23
38
|
end
|
|
24
39
|
end
|
|
@@ -6,11 +6,32 @@ module Pubid
|
|
|
6
6
|
# CSA dual published identifier
|
|
7
7
|
# Represents IEEE/CSA dual published standards
|
|
8
8
|
# Example: IEEE Std 844.1-2017/CSA C22.2 No. 293.1-17
|
|
9
|
-
class CsaDualPublished <
|
|
10
|
-
attribute :ieee_identifier,
|
|
9
|
+
class CsaDualPublished < Identifier
|
|
10
|
+
attribute :ieee_identifier, Identifier
|
|
11
11
|
# CSA identifier is stored as-is (not a Lutaml model type)
|
|
12
12
|
attr_accessor :csa_identifier
|
|
13
13
|
|
|
14
|
+
# `csa_identifier` is a real constructor parameter even though it is
|
|
15
|
+
# not a lutaml attribute, so the unknown-key contract must let it
|
|
16
|
+
# through — and the constructor must actually assign it.
|
|
17
|
+
def self.extra_init_keys
|
|
18
|
+
super + %i[csa_identifier]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Walk to the IEEE designation for the relaton-index key: this wrapper
|
|
22
|
+
# names one document by an IEEE and a CSA number and holds neither
|
|
23
|
+
# itself, so `root.number` was "".
|
|
24
|
+
def root
|
|
25
|
+
ieee_identifier ? ieee_identifier.root : self
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Carry the number onto the URN and the MR slug as well as #root — see
|
|
29
|
+
# AdoptedStandard#code_obj. `#code` below delegates already, but the
|
|
30
|
+
# URN generator and the MR renderer both read `code_obj`.
|
|
31
|
+
def code_obj
|
|
32
|
+
ieee_identifier&.code_obj
|
|
33
|
+
end
|
|
34
|
+
|
|
14
35
|
# Delegate common attributes to ieee_identifier
|
|
15
36
|
def publisher
|
|
16
37
|
ieee_identifier.publisher
|
|
@@ -33,7 +54,7 @@ module Pubid
|
|
|
33
54
|
end
|
|
34
55
|
|
|
35
56
|
def self.parse(string)
|
|
36
|
-
|
|
57
|
+
Identifier.parse(string)
|
|
37
58
|
end
|
|
38
59
|
end
|
|
39
60
|
end
|
|
@@ -5,9 +5,9 @@ module Pubid
|
|
|
5
5
|
module Identifiers
|
|
6
6
|
# Dual Identifier - wraps two identifiers connected with "and"
|
|
7
7
|
# Example: "ANSI C37.61-1973 and IEEE Std 321-1973"
|
|
8
|
-
class DualIdentifier <
|
|
9
|
-
attribute :first_identifier,
|
|
10
|
-
attribute :second_identifier,
|
|
8
|
+
class DualIdentifier < Identifier
|
|
9
|
+
attribute :first_identifier, Identifier, polymorphic: true
|
|
10
|
+
attribute :second_identifier, Identifier, polymorphic: true
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -7,17 +7,72 @@ module Pubid
|
|
|
7
7
|
# Document jointly published by two organizations
|
|
8
8
|
# Example: "ANSI C37.61-1973 and IEEE Std 321-1973"
|
|
9
9
|
# This means the document was published together by both organizations
|
|
10
|
-
class DualPublished <
|
|
10
|
+
class DualPublished < Identifier
|
|
11
11
|
# First organization's identifier
|
|
12
|
-
attribute :first_identifier,
|
|
12
|
+
attribute :first_identifier, Identifier, polymorphic: true
|
|
13
13
|
|
|
14
14
|
# Second organization's identifier
|
|
15
|
-
attribute :second_identifier,
|
|
15
|
+
attribute :second_identifier, Identifier, polymorphic: true
|
|
16
16
|
|
|
17
17
|
def publisher
|
|
18
18
|
# Return array of both publishers
|
|
19
19
|
[first_identifier&.publisher, second_identifier&.publisher].compact
|
|
20
20
|
end
|
|
21
|
+
|
|
22
|
+
# `publisher` above is DERIVED from the two member identifiers (the
|
|
23
|
+
# serialized source of truth), so it must not be serialized itself.
|
|
24
|
+
# Emitting it breaks the canonical round-trip exactly as it did on
|
|
25
|
+
# Identifiers::AdoptedStandard and Identifiers::JointDevelopment: the
|
|
26
|
+
# derived value is default-omitted on the parse path (the attribute is
|
|
27
|
+
# unset), but re-emitted once from_hash materializes the attribute
|
|
28
|
+
# default, because the override then returns the members' publishers
|
|
29
|
+
# rather than the "IEEE" default. Worse here, it is an ARRAY, so the
|
|
30
|
+
# re-emitted value was the literal string `["IEEE", "IEEE"]`.
|
|
31
|
+
#
|
|
32
|
+
# This made all 25 DualPublished ids in the fixture corpus fail
|
|
33
|
+
# `from_hash(to_hash) == to_hash` — the gate relaton's index build
|
|
34
|
+
# uses, which SKIPS a document that fails it. Dropping the key is
|
|
35
|
+
# lossless: first_identifier and second_identifier rebuild it.
|
|
36
|
+
#
|
|
37
|
+
# A top-level to_hash delete is sufficient because DualPublished is
|
|
38
|
+
# only ever a top-level wrapper, never a nested `base` (where lutaml's
|
|
39
|
+
# own transform would bypass this override).
|
|
40
|
+
def to_hash(*args)
|
|
41
|
+
hash = super
|
|
42
|
+
hash.delete("publisher") if hash.is_a?(::Hash)
|
|
43
|
+
hash
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# A dual-published document is one document under two designations, and
|
|
47
|
+
# this wrapper carries neither number itself — so `root.number`, the key
|
|
48
|
+
# relaton-index sorts and bsearches on, was "". Walk to the first
|
|
49
|
+
# designation, which is the one the printed reference leads with.
|
|
50
|
+
def root
|
|
51
|
+
first_identifier ? first_identifier.root : self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Carry the number onto the URN and the MR slug as well as #root — see
|
|
55
|
+
# AdoptedStandard#code_obj for why all three surfaces need it.
|
|
56
|
+
def code_obj
|
|
57
|
+
first_identifier&.code_obj
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# See AdoptedStandard#mr_year — without it the 1989 and the 1993
|
|
61
|
+
# printings of "IEEE Std 960 and IEEE Std 1177" shared one slug.
|
|
62
|
+
def mr_year
|
|
63
|
+
(year || first_identifier&.year)&.to_s
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# `#publisher` above returns an ARRAY, and the inherited `mr_publisher`
|
|
67
|
+
# is `publisher&.to_s&.downcase` — so the MR slug contained a literal
|
|
68
|
+
# Ruby array (`["ieee", "asme"]`, brackets, quotes, comma and space
|
|
69
|
+
# included) and `to_slug` is an output FILENAME. Join the two instead,
|
|
70
|
+
# keeping both publishers in the slug: they are equally part of this
|
|
71
|
+
# document's identity, so by the project rule both must reach it.
|
|
72
|
+
def mr_publisher
|
|
73
|
+
names = Array(publisher).map { |p| p.to_s.downcase }.reject(&:empty?)
|
|
74
|
+
names.empty? ? nil : names.join("-")
|
|
75
|
+
end
|
|
21
76
|
end
|
|
22
77
|
end
|
|
23
78
|
end
|
|
@@ -3,15 +3,112 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Ieee
|
|
5
5
|
module Identifiers
|
|
6
|
-
# IEC/IEEE Copublished Identifier -
|
|
6
|
+
# IEC/IEEE Copublished Identifier - standards copublished by IEC and IEEE.
|
|
7
7
|
# Example: "IEC/IEEE 60079-30-2/D5 IEC:2013 (10/07)"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
#
|
|
9
|
+
# The printed IEC/IEEE number is stored as split index columns rather than
|
|
10
|
+
# a verbatim string: `number` (bare-digit narrowing key), `parts` (matched
|
|
11
|
+
# within the bucket), `separators` (per-part `.`/`-`, since a single code
|
|
12
|
+
# mixes them, e.g. `60076.57-1202`), and the trailing publication `year`
|
|
13
|
+
# (inherited from the base; attached with `year_sep`, always `-` in
|
|
14
|
+
# practice). The verbatim `copublished_number` is reconstructed from these
|
|
15
|
+
# for rendering — see #copublished_number — so it is NOT serialized.
|
|
16
|
+
class IecIeeeCopublished < Identifier
|
|
17
|
+
attribute :number, :string
|
|
18
|
+
attribute :parts, :string, collection: true, default: -> { [] }
|
|
19
|
+
attribute :separators, :string, collection: true, default: -> { [] }
|
|
20
|
+
attribute :year_sep, :string, default: -> { "-" }
|
|
21
|
+
# `year` is inherited from the base (:string).
|
|
22
|
+
|
|
23
|
+
attribute :iec_identifier, Identifier, polymorphic: true
|
|
24
|
+
attribute :ieee_identifier, Identifier, polymorphic: true
|
|
12
25
|
attribute :draft_info, :string # Draft information like "/D5"
|
|
13
26
|
attribute :iec_year, :string # IEC year like "2013"
|
|
14
27
|
attribute :date_info, :string # Date information like "(10/07)"
|
|
28
|
+
|
|
29
|
+
# The printed IEC/IEEE number, rebuilt losslessly from the split
|
|
30
|
+
# columns (the renderer/urn read this). Not stored — number/parts/
|
|
31
|
+
# separators/year fully describe it, so the verbatim string never
|
|
32
|
+
# bloats an index row.
|
|
33
|
+
# @param mark [String] IEEE trademark symbol, spliced in after the
|
|
34
|
+
# number and its parts and before the publication year (IEEE prints
|
|
35
|
+
# it there); "" for the ordinary, unmarked rendering.
|
|
36
|
+
def copublished_number(mark = "")
|
|
37
|
+
return nil if number.to_s.empty?
|
|
38
|
+
|
|
39
|
+
code = marked_code(mark)
|
|
40
|
+
code += "#{year_sep}#{year}" if year
|
|
41
|
+
code
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# The dotted/dashed parts portion, each part with its own separator.
|
|
45
|
+
def parts_suffix
|
|
46
|
+
separators.zip(parts).map { |sep, part| "#{sep}#{part}" }.join
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# A stage word printed ahead of the number (`FDIS 60079-30-2`,
|
|
50
|
+
# `CD2 P62704-5 ED1`, `TS P61869-105 ED1`). The lookahead — the next
|
|
51
|
+
# token must start like a document number — is what stops this eating a
|
|
52
|
+
# number that merely begins with a letter.
|
|
53
|
+
STAGE_PREFIX = /\A[A-Z]+\d*\s+(?=P?\d)/
|
|
54
|
+
|
|
55
|
+
# Inside the number token, the printed code stops early at:
|
|
56
|
+
#
|
|
57
|
+
# * a colon-attached publication year (`62582-2:2022`);
|
|
58
|
+
# * a dash/dot-attached 19xx/20xx year (`62395.1-2024 Redline`) — only
|
|
59
|
+
# one a descriptive tail stranded inside the code gets here, since
|
|
60
|
+
# #peel_copublished_year moves a genuinely trailing year into the
|
|
61
|
+
# `year` attribute. The 19/20 prefix keeps a part that merely looks
|
|
62
|
+
# like a year (`60076.57-1202`) from matching;
|
|
63
|
+
# * a glued parenthetical (`62704-1(E)`), which is a language marker
|
|
64
|
+
# rather than part of the number.
|
|
65
|
+
CODE_END = /:\d{4}|[-.](?:19|20)\d{2}\z|\(/
|
|
66
|
+
|
|
67
|
+
# `number` + #parts_suffix with the mark spliced at the end of the code
|
|
68
|
+
# proper.
|
|
69
|
+
#
|
|
70
|
+
# Some copublished references carry an edition, a colon year, a stage
|
|
71
|
+
# word or a "- Redline" tail that the parser keeps inside
|
|
72
|
+
# `number`/`parts` rather than in dedicated attributes; appending the
|
|
73
|
+
# mark after all of it would print
|
|
74
|
+
# `IEC/IEEE 60076-16 Edition 2.0 2018-09™` instead of
|
|
75
|
+
# `IEC/IEEE 60076-16™ Edition 2.0 2018-09`. Scanning the whole printed
|
|
76
|
+
# code (not just the suffix) matters because the split point varies —
|
|
77
|
+
# `60802 Edition 1` lands in `number`, `-16 Edition 2` in `parts`.
|
|
78
|
+
#
|
|
79
|
+
# With the flag off `mark` is "" and this returns the code unchanged, so
|
|
80
|
+
# the plain rendering is byte-identical by construction.
|
|
81
|
+
def marked_code(mark)
|
|
82
|
+
code = "#{number}#{parts_suffix}"
|
|
83
|
+
return code if mark.to_s.empty?
|
|
84
|
+
|
|
85
|
+
at = code_end_index(code)
|
|
86
|
+
"#{code[0...at]}#{mark}#{code[at..]}"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Index at which the printed code ends and descriptive text begins.
|
|
90
|
+
#
|
|
91
|
+
# The number is the first whitespace-delimited token after any stage
|
|
92
|
+
# word, so the code can never run past that token's end — which is what
|
|
93
|
+
# keeps the mark off a trailing edition/date phrase even when no
|
|
94
|
+
# CODE_END boundary matches inside the token.
|
|
95
|
+
def code_end_index(code)
|
|
96
|
+
start = code[STAGE_PREFIX]&.length || 0
|
|
97
|
+
token_end = code.index(" ", start) || code.length
|
|
98
|
+
boundary = code[start...token_end].index(CODE_END)
|
|
99
|
+
boundary ? start + boundary : token_end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# The base IEEE #exclude already nils year/month/day; also reset the
|
|
103
|
+
# year separator (a format sibling of the scalar year, per the CSA
|
|
104
|
+
# lesson) so a date-less reference matches a `:`-dated form too.
|
|
105
|
+
def exclude(*args)
|
|
106
|
+
result = super
|
|
107
|
+
if args.intersect?(%i[year date]) && result.respond_to?(:year_sep=)
|
|
108
|
+
result.year_sep = "-"
|
|
109
|
+
end
|
|
110
|
+
result
|
|
111
|
+
end
|
|
15
112
|
end
|
|
16
113
|
end
|
|
17
114
|
end
|
|
@@ -7,7 +7,31 @@ module Pubid
|
|
|
7
7
|
# Represents an interpretation sheet or clarification
|
|
8
8
|
# Example: IEEE Std 1076/INT-1991, IEEE Std 1003.1-1988/INT
|
|
9
9
|
class InterpretationIdentifier < SupplementIdentifier
|
|
10
|
-
|
|
10
|
+
# Uniform `year` (the interpretation year), not `int_year` — inherited
|
|
11
|
+
# from the base, so no attribute is declared here.
|
|
12
|
+
|
|
13
|
+
# The interpreted standard's code must reach the URN. Before this
|
|
14
|
+
# change the flat-parsed form kept its number in the wrapper's own
|
|
15
|
+
# `code_obj` (the builder never built a base), so the URN carried it by
|
|
16
|
+
# accident; now that the number lives on `base` where it belongs, the
|
|
17
|
+
# URN generator has to be pointed at it or the URN silently loses the
|
|
18
|
+
# document number. `code_obj` is a plain attr_accessor, not a lutaml
|
|
19
|
+
# attribute, so overriding it as a method is safe.
|
|
20
|
+
def code_obj
|
|
21
|
+
super || base&.code_obj
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# MR supplement suffix: `int.{year}` — mirrors Corrigendum/Amendment.
|
|
25
|
+
# Without it the MrString renderer slugs an interpretation FLAT off
|
|
26
|
+
# attributes a supplement does not have, instead of recursing into
|
|
27
|
+
# `base`, so every interpretation of every standard collapsed onto
|
|
28
|
+
# "ieee.std.{year}" with no document number at all — and `to_slug` is
|
|
29
|
+
# an output FILENAME.
|
|
30
|
+
def mr_supplement_suffix
|
|
31
|
+
segments = ["int"]
|
|
32
|
+
segments << year.to_s if year
|
|
33
|
+
segments.join(".")
|
|
34
|
+
end
|
|
11
35
|
|
|
12
36
|
# TYPED_STAGES for interpretation
|
|
13
37
|
# Interpretation uses "INT" abbreviation
|
|
@@ -29,18 +29,27 @@ module Pubid
|
|
|
29
29
|
# - "P" prefix means IEEE project (any stage)
|
|
30
30
|
# - ISO stages and IEEE drafts can coexist but are not equivalent
|
|
31
31
|
# - Format conversion preserves semantic meaning within each system
|
|
32
|
-
class JointDevelopment <
|
|
32
|
+
class JointDevelopment < Identifier
|
|
33
|
+
# Split index columns (number/prefix/parts/separator) instead of a
|
|
34
|
+
# `code` string, like every IEEE leaf — see CodeNumber. Rendering reads
|
|
35
|
+
# `code` (base #code → code_obj), which CodeNumber rebuilds from the
|
|
36
|
+
# split fields, so to_ieee_format / to_iso_format are unaffected.
|
|
37
|
+
include CodeNumber
|
|
38
|
+
|
|
33
39
|
attribute :publishers, :string, collection: true
|
|
34
40
|
attribute :lead_party, :string # "IEEE", "ISO", "IEC", etc.
|
|
35
|
-
attribute :code, :string
|
|
36
41
|
attribute :typed_stage, Components::TypedStage
|
|
37
42
|
attribute :year, :string
|
|
38
43
|
attribute :iso_stage, :string # For ISO stage if present
|
|
39
44
|
attribute :ieee_draft, :string # For IEEE P/D notation if present
|
|
40
45
|
|
|
41
|
-
|
|
46
|
+
# Accepts keyword args or a single positional hash (the base
|
|
47
|
+
# #exclude/matching rebuild passes the latter) — see
|
|
48
|
+
# Identifier#initialize.
|
|
49
|
+
def initialize(args = {}, **kwargs)
|
|
50
|
+
args = args.merge(kwargs) unless kwargs.empty?
|
|
42
51
|
# Call super FIRST to initialize Lutaml::Model attributes
|
|
43
|
-
super
|
|
52
|
+
super(args)
|
|
44
53
|
|
|
45
54
|
# Then handle typed_stage
|
|
46
55
|
if args[:typed_stage].is_a?(Components::TypedStage)
|
|
@@ -82,16 +91,30 @@ module Pubid
|
|
|
82
91
|
# JointDevelopment has its own dual-format logic (IEEE vs ISO)
|
|
83
92
|
# that doesn't go through the format registry renderer.
|
|
84
93
|
# @param format [Symbol] :ieee or :iso (defaults to canonical_format)
|
|
94
|
+
# @param trademark [Boolean] append the IEEE trademark symbol (™/®)
|
|
85
95
|
# @return [String] formatted identifier
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
# `**_opts` absorbs render flags this list does not name (`annotated:`),
|
|
97
|
+
# which the closed keyword list used to reject outright.
|
|
98
|
+
def to_s(format: canonical_format, trademark: false, **opts)
|
|
99
|
+
# The mark goes after the code number, before the draft and the year
|
|
100
|
+
# ("ISO/IEC/IEEE P26511™/D8-2018"), so it is threaded into the
|
|
101
|
+
# format builders rather than appended to the finished string.
|
|
102
|
+
mark = if trademark
|
|
103
|
+
Pubid::Ieee.trademark_symbol_for(code&.number,
|
|
104
|
+
code&.prefix,
|
|
105
|
+
publishers: publishers)
|
|
106
|
+
else
|
|
107
|
+
""
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
result = case format
|
|
111
|
+
when :iso
|
|
112
|
+
to_iso_format(mark)
|
|
113
|
+
else
|
|
114
|
+
to_ieee_format(mark)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
annotate_plain_render(result, **opts)
|
|
95
118
|
end
|
|
96
119
|
|
|
97
120
|
private
|
|
@@ -99,7 +122,7 @@ module Pubid
|
|
|
99
122
|
# Convert to ISO format representation
|
|
100
123
|
# ISO/IEC/IEEE FDIS 26511:2018
|
|
101
124
|
# @return [String] ISO format string
|
|
102
|
-
def to_iso_format
|
|
125
|
+
def to_iso_format(mark = "")
|
|
103
126
|
parts = []
|
|
104
127
|
|
|
105
128
|
# Publishers (slash-separated)
|
|
@@ -117,6 +140,7 @@ module Pubid
|
|
|
117
140
|
|
|
118
141
|
# Code (NO P prefix in ISO format, NO draft notation)
|
|
119
142
|
code_str = code.to_s.gsub(/^P/, "")
|
|
143
|
+
code_str += mark unless code_str.empty?
|
|
120
144
|
parts << code_str if code_str && !code_str.empty?
|
|
121
145
|
|
|
122
146
|
# Join with space and add year with colon
|
|
@@ -129,7 +153,7 @@ module Pubid
|
|
|
129
153
|
# Convert to IEEE format representation
|
|
130
154
|
# ISO/IEC/IEEE P26511/D8-2018
|
|
131
155
|
# @return [String] IEEE format string
|
|
132
|
-
def to_ieee_format
|
|
156
|
+
def to_ieee_format(mark = "")
|
|
133
157
|
parts = []
|
|
134
158
|
|
|
135
159
|
# Publishers (slash-separated)
|
|
@@ -143,6 +167,9 @@ module Pubid
|
|
|
143
167
|
code_str = "P#{code_str}"
|
|
144
168
|
end
|
|
145
169
|
|
|
170
|
+
# Mark after the number, before the draft and the year
|
|
171
|
+
code_str += mark unless code_str.empty?
|
|
172
|
+
|
|
146
173
|
# Add IEEE draft notation if available (e.g., /D8)
|
|
147
174
|
if ieee_draft
|
|
148
175
|
code_str += "/#{ieee_draft}"
|
|
@@ -159,6 +186,12 @@ module Pubid
|
|
|
159
186
|
result
|
|
160
187
|
end
|
|
161
188
|
|
|
189
|
+
# Public again: these override base accessors and MUST be public — lutaml
|
|
190
|
+
# serialization calls `public_send(:publisher)`, so leaving them under the
|
|
191
|
+
# `private` above made JointDevelopment#to_hash raise (it could not be
|
|
192
|
+
# serialized or round-tripped / indexed at all).
|
|
193
|
+
public
|
|
194
|
+
|
|
162
195
|
# Override to ensure proper publisher handling
|
|
163
196
|
def publisher
|
|
164
197
|
publishers&.first || super
|
|
@@ -168,6 +201,22 @@ module Pubid
|
|
|
168
201
|
def copublisher
|
|
169
202
|
publishers&.drop(1) || super
|
|
170
203
|
end
|
|
204
|
+
|
|
205
|
+
# `publisher`/`copublisher` are *derived* from `publishers` (the source
|
|
206
|
+
# of truth, which IS serialized). Emitting them too breaks the canonical
|
|
207
|
+
# round-trip: the derived `publisher` is default-omitted on the parse
|
|
208
|
+
# path but re-emitted after from_hash (the override returns
|
|
209
|
+
# publishers.first, not the default). Drop both — publishers rebuilds
|
|
210
|
+
# them. (JointDevelopment is a top-level root, never nested, so a
|
|
211
|
+
# to_hash-level drop is sufficient.)
|
|
212
|
+
def to_hash(*args)
|
|
213
|
+
hash = super
|
|
214
|
+
if hash.is_a?(::Hash)
|
|
215
|
+
hash.delete("publisher")
|
|
216
|
+
hash.delete("copublisher")
|
|
217
|
+
end
|
|
218
|
+
hash
|
|
219
|
+
end
|
|
171
220
|
end
|
|
172
221
|
end
|
|
173
222
|
end
|
|
@@ -8,13 +8,42 @@ module Pubid
|
|
|
8
8
|
# Examples:
|
|
9
9
|
# - "IEEE Std 1299/C62.22.1-1996" (same document, two numbers)
|
|
10
10
|
# - "IEEE Std 960-1989, Std 1177-1989" (same document, two numbers)
|
|
11
|
-
class MultiNumberedIdentifier <
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
attr_accessor
|
|
11
|
+
class MultiNumberedIdentifier < Identifier
|
|
12
|
+
# Both designations are real lutaml attributes.
|
|
13
|
+
#
|
|
14
|
+
# They used to be `attr_accessor`s, which lutaml cannot see — so
|
|
15
|
+
# `to_hash` emitted {"_type" => "pubid:ieee:multi-numbered-identifier"}
|
|
16
|
+
# and NOTHING else, `from_hash` could not rebuild either member, and
|
|
17
|
+
# `#exclude` (which iterates self.class.attributes) skipped them. The
|
|
18
|
+
# whole identity was dropped. That is the CSA container defect recorded
|
|
19
|
+
# in CLAUDE.md, and the fix is the same: make the members attributes.
|
|
20
|
+
#
|
|
21
|
+
# The type is the CROSS-FLAVOR ::Pubid::Identifier, not IEEE's own:
|
|
22
|
+
# `polymorphic: true` widens only to subclasses, and the second
|
|
23
|
+
# designation may belong to another body — the same reason
|
|
24
|
+
# AdoptedStandard's members carry that type.
|
|
25
|
+
attribute :primary_identifier, ::Pubid::Identifier, polymorphic: true
|
|
26
|
+
attribute :secondary_identifier, ::Pubid::Identifier, polymorphic: true
|
|
15
27
|
|
|
16
|
-
#
|
|
17
|
-
|
|
28
|
+
# One document under two numbers, neither of them held here, so
|
|
29
|
+
# `root.number` was "". Walk to the primary designation.
|
|
30
|
+
def root
|
|
31
|
+
primary_identifier ? primary_identifier.root : self
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Carry the number onto the URN and the MR slug as well as #root — see
|
|
35
|
+
# AdoptedStandard#code_obj.
|
|
36
|
+
def code_obj
|
|
37
|
+
primary_identifier&.code_obj
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# See AdoptedStandard#mr_year. `year` below already delegates, so this
|
|
41
|
+
# only stringifies — it is kept explicit so the hook survives if that
|
|
42
|
+
# delegation is ever removed in favour of the URN generator's
|
|
43
|
+
# `year_component` root fallback.
|
|
44
|
+
def mr_year
|
|
45
|
+
year&.to_s
|
|
46
|
+
end
|
|
18
47
|
|
|
19
48
|
def publisher
|
|
20
49
|
primary_identifier&.publisher
|
|
@@ -27,6 +56,29 @@ module Pubid
|
|
|
27
56
|
def year
|
|
28
57
|
primary_identifier&.year
|
|
29
58
|
end
|
|
59
|
+
|
|
60
|
+
# `publisher` and `year` are DERIVED from primary_identifier — and,
|
|
61
|
+
# since that member became a serialized attribute above, the derived
|
|
62
|
+
# values are now re-emitted after from_hash materializes the attribute
|
|
63
|
+
# defaults, while the parse path omits them as unset. That asymmetry
|
|
64
|
+
# breaks `from_hash(to_hash) == to_hash`, the gate relaton's index
|
|
65
|
+
# build uses to decide whether to keep a document.
|
|
66
|
+
#
|
|
67
|
+
# It is latent rather than live for the one corpus id (its primary is
|
|
68
|
+
# IEEE-published with no year, so both derived values match their
|
|
69
|
+
# defaults and are dropped anyway), but the class documents that its
|
|
70
|
+
# members may belong to another body — and a synthetic AIEE primary
|
|
71
|
+
# reproduces it immediately. Dropping the keys is lossless:
|
|
72
|
+
# primary_identifier rebuilds both. Same treatment as
|
|
73
|
+
# AdoptedStandard#to_hash and DualPublished#to_hash.
|
|
74
|
+
def to_hash(*args)
|
|
75
|
+
hash = super
|
|
76
|
+
return hash unless hash.is_a?(::Hash)
|
|
77
|
+
|
|
78
|
+
hash.delete("publisher")
|
|
79
|
+
hash.delete("year")
|
|
80
|
+
hash
|
|
81
|
+
end
|
|
30
82
|
end
|
|
31
83
|
end
|
|
32
84
|
end
|