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
|
@@ -5,7 +5,7 @@ module Pubid
|
|
|
5
5
|
module Identifiers
|
|
6
6
|
# IHO Bibliographic Publication (B series).
|
|
7
7
|
# Example: IHO B-4 2.19.0.
|
|
8
|
-
class Bibliographic <
|
|
8
|
+
class Bibliographic < Identifier
|
|
9
9
|
def self.type
|
|
10
10
|
{ key: :bibliographic, title: "Bibliographic Publication",
|
|
11
11
|
short: "B" }
|
|
@@ -5,7 +5,7 @@ module Pubid
|
|
|
5
5
|
module Identifiers
|
|
6
6
|
# IHO Publication (P series).
|
|
7
7
|
# Examples: IHO P-1 1.0.0, IHO P-1/21 1.0.0, IHO P-6-3 1.0.0.
|
|
8
|
-
class Publication <
|
|
8
|
+
class Publication < Identifier
|
|
9
9
|
def self.type
|
|
10
10
|
{ key: :publication, title: "Publication", short: "P" }
|
|
11
11
|
end
|
|
@@ -5,7 +5,7 @@ module Pubid
|
|
|
5
5
|
module Identifiers
|
|
6
6
|
# IHO Standards and Specifications (S series).
|
|
7
7
|
# Examples: IHO S-44 5.0.0, IHO S-100 Part 4a 1.0.0, IHO S-65 Ap. A 1.0.0.
|
|
8
|
-
class Standard <
|
|
8
|
+
class Standard < Identifier
|
|
9
9
|
def self.type
|
|
10
10
|
{ key: :standard, title: "Standards and Specifications", short: "S" }
|
|
11
11
|
end
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Iho
|
|
5
5
|
module Identifiers
|
|
6
|
-
autoload :Base, "#{__dir__}/identifiers/base"
|
|
7
6
|
autoload :Bibliographic, "#{__dir__}/identifiers/bibliographic"
|
|
8
7
|
autoload :CircularLetter, "#{__dir__}/identifiers/circular_letter"
|
|
9
8
|
autoload :Miscellaneous, "#{__dir__}/identifiers/miscellaneous"
|
data/lib/pubid/iho/parser.rb
CHANGED
data/lib/pubid/iho.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Iho
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -8,7 +9,7 @@ module Pubid
|
|
|
8
9
|
PREFIXES = ["IHO"].freeze
|
|
9
10
|
|
|
10
11
|
autoload :Builder, "#{__dir__}/iho/builder"
|
|
11
|
-
autoload :Identifier,
|
|
12
|
+
autoload :Identifier, "#{__dir__}/iho/identifiers/base"
|
|
12
13
|
autoload :Identifiers, "#{__dir__}/iho/identifiers"
|
|
13
14
|
autoload :Parser, "#{__dir__}/iho/parser"
|
|
14
15
|
autoload :Renderer, "#{__dir__}/iho/renderer"
|
|
@@ -17,14 +18,14 @@ module Pubid
|
|
|
17
18
|
|
|
18
19
|
# Parse an IHO identifier string into an identifier object
|
|
19
20
|
# @param identifier [String] The IHO identifier string to parse
|
|
20
|
-
# @return [Pubid::Iho::
|
|
21
|
+
# @return [Pubid::Iho::Identifier] The appropriate identifier object
|
|
21
22
|
def self.parse(identifier)
|
|
22
23
|
Identifier.parse(identifier)
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
# Per-flavor format registry: inherits global formats, overrides :human
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
28
|
+
Identifier.format_registry.register(:human, renderer: Iho::Renderer)
|
|
28
29
|
|
|
29
30
|
# Auto-discover all identifier types from the Identifiers namespace.
|
|
30
31
|
# @return [Array<Class>] identifier classes (Pubid::Identifier subclasses)
|
|
@@ -32,9 +33,9 @@ module Pubid
|
|
|
32
33
|
@identifier_types ||= Identifiers.constants
|
|
33
34
|
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
34
35
|
.select { |c| c.is_a?(Class) && c < Pubid::Identifier }
|
|
35
|
-
# Exclude the flavor base itself by identity (
|
|
36
|
+
# Exclude the flavor base itself by identity (Identifier is now an
|
|
36
37
|
# alias for Pubid::Iho::Identifier, so name-based matching misses it).
|
|
37
|
-
.reject { |c| c ==
|
|
38
|
+
.reject { |c| c == Identifier }
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
# Build typed stage index from identifier types
|
|
@@ -66,7 +67,7 @@ module Pubid
|
|
|
66
67
|
|
|
67
68
|
# Look up an identifier class by its IHO series letter (S/P/M/B/C).
|
|
68
69
|
# @param letter [String]
|
|
69
|
-
# @return [Class<
|
|
70
|
+
# @return [Class<Identifier>]
|
|
70
71
|
def self.identifier_klass_for_type_letter(letter)
|
|
71
72
|
@by_letter ||= identifier_types.to_h { |klass| [klass.type[:short], klass] }
|
|
72
73
|
@by_letter.fetch(letter.to_s)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Isbn
|
|
5
|
+
# Builds a Pubid::Isbn::Identifier from a parse tree.
|
|
6
|
+
#
|
|
7
|
+
# Validates the check digit; raises if invalid. Stores both the
|
|
8
|
+
# hyphenated form (for round-trip rendering) and the bare digits
|
|
9
|
+
# (for queries).
|
|
10
|
+
class Builder
|
|
11
|
+
INVALID_LENGTH = /^(?:\d{9}[\dX]|\d{13})$/.freeze
|
|
12
|
+
|
|
13
|
+
def self.build(parsed_data)
|
|
14
|
+
new.build(parsed_data)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build(data)
|
|
18
|
+
hyphenated = data[:body].to_s
|
|
19
|
+
raw = hyphenated.delete("-")
|
|
20
|
+
|
|
21
|
+
validate_length!(raw)
|
|
22
|
+
validate_check_digit!(raw)
|
|
23
|
+
|
|
24
|
+
Identifiers::Book.new(raw: raw, hyphenated: hyphenated.include?("-") ? hyphenated : nil)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def validate_length!(raw)
|
|
30
|
+
return if raw.match?(INVALID_LENGTH)
|
|
31
|
+
|
|
32
|
+
raise ArgumentError,
|
|
33
|
+
"ISBN must be 10 or 13 digits (got #{raw.length})"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def validate_check_digit!(raw)
|
|
37
|
+
return if CheckDigit.valid?(raw)
|
|
38
|
+
|
|
39
|
+
raise ArgumentError,
|
|
40
|
+
"ISBN check digit invalid for #{raw}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Isbn
|
|
5
|
+
# Pure-functional check digit math for ISBN-10 and ISBN-13 per ISO 2108.
|
|
6
|
+
#
|
|
7
|
+
# ISBN-10: weighted sum with weights 10..1, mod 11. Check digit 10 is
|
|
8
|
+
# rendered as "X".
|
|
9
|
+
# ISBN-13: weighted sum with alternating weights 1/3, mod 10. Check digit
|
|
10
|
+
# is 0-9.
|
|
11
|
+
class CheckDigit
|
|
12
|
+
# Compute the correct ISBN-10 check digit for a 9-digit payload.
|
|
13
|
+
# @return [String] "0".."9" or "X"
|
|
14
|
+
def self.compute_isbn10(payload)
|
|
15
|
+
raise ArgumentError, "ISBN-10 payload must be 9 digits" unless payload.to_s.match?(/\A\d{9}\z/)
|
|
16
|
+
|
|
17
|
+
sum = payload.to_s.each_char.with_index.sum { |c, i| c.to_i * (10 - i) }
|
|
18
|
+
digit = (11 - sum % 11) % 11
|
|
19
|
+
digit == 10 ? "X" : digit.to_s
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Compute the correct ISBN-13 check digit for a 12-digit payload.
|
|
23
|
+
# @return [String] "0".."9"
|
|
24
|
+
def self.compute_isbn13(payload)
|
|
25
|
+
raise ArgumentError, "ISBN-13 payload must be 12 digits" unless payload.to_s.match?(/\A\d{12}\z/)
|
|
26
|
+
|
|
27
|
+
sum = payload.to_s.each_char.with_index.sum do |c, i|
|
|
28
|
+
c.to_i * (i.even? ? 1 : 3)
|
|
29
|
+
end
|
|
30
|
+
((10 - sum % 10) % 10).to_s
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Verify the check digit on a full 10- or 13-digit ISBN string.
|
|
34
|
+
# @param full [String] 10 or 13 chars; ISBN-10 may end with X.
|
|
35
|
+
# @return [Boolean]
|
|
36
|
+
def self.valid?(full)
|
|
37
|
+
digits = full.to_s.upcase.delete("^0-9X")
|
|
38
|
+
case digits.length
|
|
39
|
+
when 10
|
|
40
|
+
payload = digits[0, 9]
|
|
41
|
+
actual = digits[9]
|
|
42
|
+
compute_isbn10(payload) == actual
|
|
43
|
+
when 13
|
|
44
|
+
payload = digits[0, 12]
|
|
45
|
+
actual = digits[12]
|
|
46
|
+
compute_isbn13(payload) == actual
|
|
47
|
+
else
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Isbn
|
|
5
|
+
class Identifier < ::Pubid::Identifier
|
|
6
|
+
# The digits-only ISBN (no hyphens), including check digit. 10 or 13 chars.
|
|
7
|
+
attribute :raw, :string
|
|
8
|
+
|
|
9
|
+
# Original hyphenated form (may be nil when the input had no hyphens).
|
|
10
|
+
# Preserved for round-trip rendering; not queryable semantics.
|
|
11
|
+
attribute :hyphenated, :string
|
|
12
|
+
|
|
13
|
+
ISBN_TYPE_MAP = {
|
|
14
|
+
"pubid:isbn:book" => "Pubid::Isbn::Identifiers::Book",
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
key_value do
|
|
18
|
+
map "_type", to: :_type, polymorphic_map: ISBN_TYPE_MAP
|
|
19
|
+
map "raw", to: :raw
|
|
20
|
+
map "hyphenated", to: :hyphenated
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
PUBLISHER = "ISBN"
|
|
24
|
+
|
|
25
|
+
# Returns :isbn10 or :isbn13.
|
|
26
|
+
def form
|
|
27
|
+
case raw.to_s.length
|
|
28
|
+
when 10 then :isbn10
|
|
29
|
+
when 13 then :isbn13
|
|
30
|
+
else raise "Invalid ISBN length: #{raw.inspect}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def check_digit
|
|
35
|
+
raw.to_s[-1]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def valid?
|
|
39
|
+
CheckDigit.valid?(raw)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def to_s(**opts)
|
|
43
|
+
render(format: :human, **opts)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.parse(identifier)
|
|
47
|
+
unless identifier.is_a?(String)
|
|
48
|
+
raise Pubid::Errors::InvalidInputError,
|
|
49
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
53
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The two guards above must stay OUTSIDE build_identifier: this method
|
|
57
|
+
# rescues ArgumentError to convert the Builder's check-digit and
|
|
58
|
+
# length validation into a parse failure, and that rescue used to
|
|
59
|
+
# swallow the guards' own ArgumentError and re-raise it as a
|
|
60
|
+
# RuntimeError - so ISBN was the one guarded flavor where an over-long
|
|
61
|
+
# input did not surface as ArgumentError.
|
|
62
|
+
build_identifier(identifier)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @raise [Pubid::Errors::ParseError] if the string is not a valid ISBN
|
|
66
|
+
def self.build_identifier(identifier)
|
|
67
|
+
parsed = Parser.parse(identifier)
|
|
68
|
+
Builder.build(parsed)
|
|
69
|
+
rescue ArgumentError => e
|
|
70
|
+
# The Builder validates length and check digit. Surface that as a parse
|
|
71
|
+
# failure, so every ISBN rejection reaches the caller as the same class
|
|
72
|
+
# a grammar rejection does.
|
|
73
|
+
raise Pubid::Errors::ParseError.new(
|
|
74
|
+
"invalid ISBN '#{identifier}': #{e.message}",
|
|
75
|
+
input: identifier, flavor: "isbn",
|
|
76
|
+
)
|
|
77
|
+
end
|
|
78
|
+
private_class_method :build_identifier
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Isbn
|
|
5
|
+
module Identifiers
|
|
6
|
+
# ISBN book identifier — supports both ISBN-10 and ISBN-13.
|
|
7
|
+
#
|
|
8
|
+
# Examples:
|
|
9
|
+
# ISBN 978-3-16-148410-0
|
|
10
|
+
# ISBN 0-306-40615-2
|
|
11
|
+
# 9783161484100
|
|
12
|
+
class Book < Identifier
|
|
13
|
+
TYPED_STAGES = [
|
|
14
|
+
Pubid::Components::TypedStage.new(
|
|
15
|
+
code: :pubisbn,
|
|
16
|
+
stage_code: :published,
|
|
17
|
+
type_code: :isbn,
|
|
18
|
+
abbr: ["ISBN"],
|
|
19
|
+
name: "ISBN",
|
|
20
|
+
harmonized_stages: [],
|
|
21
|
+
),
|
|
22
|
+
].freeze
|
|
23
|
+
|
|
24
|
+
def self.type
|
|
25
|
+
{ key: :isbn, web: :book, title: "ISBN", short: "ISBN" }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Isbn
|
|
7
|
+
# Parslet grammar for ISBN identifiers per ISO 2108.
|
|
8
|
+
#
|
|
9
|
+
# Accepts:
|
|
10
|
+
# [ISBN[ |:]] {10 or 13 digits with optional hyphens}
|
|
11
|
+
#
|
|
12
|
+
# ISBN-10 final digit may be "X" (check digit value 10). Hyphens are
|
|
13
|
+
# optional and may appear in any group position; they are preserved
|
|
14
|
+
# for round-trip rendering.
|
|
15
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
16
|
+
rule(:space) { str(" ") }
|
|
17
|
+
rule(:colon) { str(":") }
|
|
18
|
+
rule(:hyphen) { str("-") }
|
|
19
|
+
rule(:digit) { match("[0-9]") }
|
|
20
|
+
rule(:x_digit) { digit | str("X") }
|
|
21
|
+
|
|
22
|
+
rule(:isbn_prefix) do
|
|
23
|
+
(str("ISBN") >> (space | (space.maybe >> colon >> space.maybe))).maybe
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
rule(:digit_group) { digit.repeat(1) }
|
|
27
|
+
rule(:x_group) { x_digit.repeat(1) }
|
|
28
|
+
|
|
29
|
+
# Loose "ISBN-ish" token: digits or final X, separated by hyphens.
|
|
30
|
+
rule(:isbn_body) do
|
|
31
|
+
(digit_group >> (hyphen >> digit_group).repeat >>
|
|
32
|
+
(hyphen >> x_digit).maybe).as(:body) |
|
|
33
|
+
(digit.repeat(9, 12) >> x_digit.maybe).as(:body)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
rule(:identifier) { isbn_prefix >> isbn_body }
|
|
37
|
+
|
|
38
|
+
rule(:root) { identifier }
|
|
39
|
+
|
|
40
|
+
def self.parse(input)
|
|
41
|
+
new.parse(input)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Isbn
|
|
5
|
+
# Human-readable renderer for ISBN identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Preserves the original hyphenation when present; otherwise emits the
|
|
8
|
+
# bare digits. Always emits the "ISBN " prefix.
|
|
9
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
10
|
+
def render(**_opts)
|
|
11
|
+
body = @id.hyphenated || @id.raw
|
|
12
|
+
"ISBN #{body}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/pubid/isbn.rb
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pubid"
|
|
4
|
+
module Pubid
|
|
5
|
+
# ISBN flavor — bibliographic book identifier per ISO 2108.
|
|
6
|
+
#
|
|
7
|
+
# Parses both 10-digit (ISBN-10) and 13-digit (ISBN-13) forms with
|
|
8
|
+
# optional hyphenation. The check digit is validated; an invalid check
|
|
9
|
+
# digit raises on parse.
|
|
10
|
+
module Isbn
|
|
11
|
+
extend Pubid::PrefixesSupport
|
|
12
|
+
|
|
13
|
+
PREFIXES = ["ISBN"].freeze
|
|
14
|
+
|
|
15
|
+
autoload :CheckDigit, "#{__dir__}/isbn/check_digit"
|
|
16
|
+
autoload :Builder, "#{__dir__}/isbn/builder"
|
|
17
|
+
autoload :Identifier, "#{__dir__}/isbn/identifier"
|
|
18
|
+
autoload :Identifiers, "#{__dir__}/isbn/identifiers"
|
|
19
|
+
autoload :Parser, "#{__dir__}/isbn/parser"
|
|
20
|
+
autoload :Renderer, "#{__dir__}/isbn/renderer"
|
|
21
|
+
|
|
22
|
+
def self.parse(identifier)
|
|
23
|
+
Identifier.parse(identifier)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
|
|
27
|
+
Identifier.format_registry.register(:human, renderer: Isbn::Renderer)
|
|
28
|
+
|
|
29
|
+
def self.identifier_types
|
|
30
|
+
@identifier_types ||= Identifiers.constants
|
|
31
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
32
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
33
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.all_typed_stages
|
|
37
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
38
|
+
klass.const_defined?(:TYPED_STAGES) ? klass.const_get(:TYPED_STAGES) : []
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.locate_type(code)
|
|
43
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.locate_stage(abbr)
|
|
47
|
+
abbr_str = abbr.to_s.upcase
|
|
48
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Pubid::Registry.register(:isbn, Pubid::Isbn)
|
data/lib/pubid/iso/builder.rb
CHANGED
|
@@ -16,7 +16,7 @@ module Pubid
|
|
|
16
16
|
|
|
17
17
|
def locate_identifier_klass(parsed_hash)
|
|
18
18
|
# If there is a joint_identifier, we need to use a CombinedIdentifier
|
|
19
|
-
# which takes `
|
|
19
|
+
# which takes `base` and `additional_identifiers`
|
|
20
20
|
if parsed_hash[:joint_identifier]
|
|
21
21
|
return CombinedIdentifier
|
|
22
22
|
end
|
|
@@ -47,7 +47,7 @@ module Pubid
|
|
|
47
47
|
# a) It is an IS.
|
|
48
48
|
# b) It is a Directive Supplements. The "SUP" keyword may be entirely missing, and hence nil. If the base type_with_stage is a directive, then if the type_with_stage is blank, it is a directive supplement.
|
|
49
49
|
|
|
50
|
-
if parsed_hash[:type_with_stage].nil? && parsed_hash[:
|
|
50
|
+
if parsed_hash[:type_with_stage].nil? && parsed_hash[:base] && parsed_hash[:base][:type_with_stage] == "DIR"
|
|
51
51
|
# Directive Supplement without "SUP" keyword
|
|
52
52
|
parsed_hash[:type_with_stage] = "SUP"
|
|
53
53
|
end
|
|
@@ -150,12 +150,12 @@ module Pubid
|
|
|
150
150
|
|
|
151
151
|
def cast(type, value)
|
|
152
152
|
case type
|
|
153
|
-
when :
|
|
153
|
+
when :base
|
|
154
154
|
# If it has a base identifier, we need to build a supplement
|
|
155
155
|
# We assume that the base identifier is already a valid Identifier object
|
|
156
156
|
build(value)
|
|
157
157
|
|
|
158
|
-
# If there is a
|
|
158
|
+
# If there is a base, and it has a joint_identifier, we need to use a CombinedIdentifier.
|
|
159
159
|
|
|
160
160
|
when :publisher, :directives_supplement_body, :supplement_publisher
|
|
161
161
|
# value can be either a string OR a hash with publisher + copublisher
|
|
@@ -230,6 +230,11 @@ module Pubid
|
|
|
230
230
|
when :date
|
|
231
231
|
parse_date(value)
|
|
232
232
|
|
|
233
|
+
when :undated_marker
|
|
234
|
+
# ISO/IEC undated reference (e.g. "ISO 16634:--") — explicit
|
|
235
|
+
# publication-date slot with no year; round-trips via date.render.
|
|
236
|
+
{ date: Pubid::Components::Date.new(undated: true) }
|
|
237
|
+
|
|
233
238
|
when :edition
|
|
234
239
|
# value can be "Ed.2", "Ed 2", "ED1", "Edition 13", or just "Ed"
|
|
235
240
|
original_text = value.to_s
|
|
@@ -86,15 +86,17 @@ module Pubid
|
|
|
86
86
|
base_document&.copublishers
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
+
# See the note on Pubid::BundledIdentifier#to_s: `**opts` carries flags
|
|
90
|
+
# this list does not name, `annotated:` above all.
|
|
89
91
|
def to_s(lang: :en, lang_single: false, with_edition: false, format: nil,
|
|
90
|
-
stage_format_long: nil, with_date: nil)
|
|
92
|
+
stage_format_long: nil, with_date: nil, **opts)
|
|
91
93
|
parts = [base_document.to_s(lang: lang, lang_single: lang_single,
|
|
92
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)]
|
|
94
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)]
|
|
93
95
|
|
|
94
96
|
# Add each supplement with "+" separator
|
|
95
97
|
supplements.each do |supplement|
|
|
96
98
|
supplement_str = supplement.to_supplement_s(lang: lang, lang_single: lang_single,
|
|
97
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)
|
|
99
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)
|
|
98
100
|
parts << "+ #{supplement_str}"
|
|
99
101
|
end
|
|
100
102
|
|
|
@@ -4,16 +4,18 @@ module Pubid
|
|
|
4
4
|
module Iso
|
|
5
5
|
# Identifier that represents a supplement to a base identifier.
|
|
6
6
|
class CombinedIdentifier < Identifier
|
|
7
|
-
attribute :
|
|
7
|
+
attribute :base, Identifier, polymorphic: true
|
|
8
8
|
attribute :additional_identifiers, ::Pubid::Identifier,
|
|
9
9
|
polymorphic: true, collection: true
|
|
10
10
|
attribute :type, :string, default: -> { "combined_identifier" }
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
# `**opts` carries render flags this list does not name (`annotated:`),
|
|
13
|
+
# which the closed signature used to reject outright.
|
|
14
|
+
def to_s(lang: :en, lang_single: false, **opts)
|
|
13
15
|
[
|
|
14
|
-
|
|
16
|
+
base.to_s(lang: lang, lang_single: lang_single, **opts),
|
|
15
17
|
additional_identifiers.map do |id|
|
|
16
|
-
id.to_s(lang: lang, lang_single: lang_single)
|
|
18
|
+
id.to_s(lang: lang, lang_single: lang_single, **opts)
|
|
17
19
|
end,
|
|
18
20
|
].flatten.join(" | ")
|
|
19
21
|
end
|
data/lib/pubid/iso/identifier.rb
CHANGED
|
@@ -103,7 +103,7 @@ module Pubid
|
|
|
103
103
|
# The base Pubid::Identifier no longer auto-maps attributes, so each
|
|
104
104
|
# flavor's top class must declare its own key_value mapping. Subclasses
|
|
105
105
|
# merge their own blocks on top of this one (e.g. SupplementIdentifier
|
|
106
|
-
# adds
|
|
106
|
+
# adds base; Directives adds subgroup), so list every base
|
|
107
107
|
# attribute ISO serializes here once.
|
|
108
108
|
key_value do
|
|
109
109
|
map "_type", to: :_type, polymorphic_map: ISO_TYPE_MAP
|
|
@@ -117,6 +117,9 @@ module Pubid
|
|
|
117
117
|
map "year", with: { to: :year_to_kv, from: :year_from_kv }
|
|
118
118
|
map "month", with: { to: :month_to_kv, from: :month_from_kv }
|
|
119
119
|
map "day", with: { to: :day_to_kv, from: :day_from_kv }
|
|
120
|
+
# ISO/IEC undated reference (e.g. ISO 16634:--). The `false` default
|
|
121
|
+
# is omitted; only the meaningful `true` round-trips via to_hash.
|
|
122
|
+
map "undated", with: { to: :undated_to_kv, from: :undated_from_kv }
|
|
120
123
|
map "edition", to: :edition
|
|
121
124
|
map "languages", to: :languages
|
|
122
125
|
# publisher emitted only when the primary isn't the type default;
|
|
@@ -163,9 +166,14 @@ module Pubid
|
|
|
163
166
|
def stage_from_kv(model, value)
|
|
164
167
|
return if value.nil? || value.to_s.empty?
|
|
165
168
|
|
|
169
|
+
# The fallback consults the flavor-wide table. It used to call
|
|
170
|
+
# `Pubid::Iso::Scheme`, a class removed repo-wide in e3c19ea1 — so any
|
|
171
|
+
# code absent from the class's own TYPED_STAGES raised NameError
|
|
172
|
+
# instead of falling back. The IEC twin (iec/identifier.rb) was
|
|
173
|
+
# migrated at the time; ISO was missed.
|
|
166
174
|
ts = (model.class.const_defined?(:TYPED_STAGES) &&
|
|
167
175
|
model.class::TYPED_STAGES.find { |t| t.code.to_s == value.to_s }) ||
|
|
168
|
-
Pubid::Iso
|
|
176
|
+
Pubid::Iso.locate_stage_by_code(value)
|
|
169
177
|
return unless ts
|
|
170
178
|
|
|
171
179
|
# The renderer prefers `original_abbr` (the parsed surface form); without
|
|
@@ -217,6 +225,19 @@ module Pubid
|
|
|
217
225
|
def day_to_kv(model, doc) = emit_date_part(doc, "day", model.date&.day)
|
|
218
226
|
def day_from_kv(model, value) = date_for(model).day = value.to_s
|
|
219
227
|
|
|
228
|
+
# --- date undated flag (ISO/IEC undated reference, e.g. ISO 16634:--) ---
|
|
229
|
+
# The `false` default is omitted; only the meaningful `true` round-trips
|
|
230
|
+
# via to_hash / from_hash.
|
|
231
|
+
def undated_to_kv(model, doc)
|
|
232
|
+
return unless model.date&.undated?
|
|
233
|
+
|
|
234
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new("undated", true))
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def undated_from_kv(model, value)
|
|
238
|
+
date_for(model).undated = value.to_s == "true"
|
|
239
|
+
end
|
|
240
|
+
|
|
220
241
|
def emit_date_part(doc, key, val)
|
|
221
242
|
return if val.nil? || val.to_s.empty?
|
|
222
243
|
|
|
@@ -267,8 +288,13 @@ module Pubid
|
|
|
267
288
|
end
|
|
268
289
|
|
|
269
290
|
def self.parse(string, format: :auto)
|
|
291
|
+
unless string.is_a?(String)
|
|
292
|
+
raise Pubid::Errors::InvalidInputError,
|
|
293
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
294
|
+
end
|
|
295
|
+
|
|
270
296
|
if string.length > Pubid::MAX_INPUT_LENGTH
|
|
271
|
-
raise
|
|
297
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
272
298
|
end
|
|
273
299
|
|
|
274
300
|
format = Pubid::FormatDetector.detect(string) if format == :auto
|
|
@@ -280,11 +306,6 @@ module Pubid
|
|
|
280
306
|
Pubid::Parsers::MrString.parse(string)
|
|
281
307
|
else
|
|
282
308
|
parsed = Pubid::Iso::Parser.new.parse(string)
|
|
283
|
-
if parsed.nil? || parsed.empty?
|
|
284
|
-
raise Pubid::Iso::Parser::ParseError,
|
|
285
|
-
"Invalid identifier format"
|
|
286
|
-
end
|
|
287
|
-
|
|
288
309
|
Pubid::Iso::Builder.new.build(parsed)
|
|
289
310
|
end
|
|
290
311
|
end
|