pubid 2.0.0.pre.alpha.9 → 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/lib/pubid/adobe/identifier.rb +1 -3
- data/lib/pubid/adobe/parser.rb +10 -2
- data/lib/pubid/adobe.rb +1 -0
- data/lib/pubid/amca/builder.rb +2 -2
- data/lib/pubid/amca/identifiers/base.rb +49 -27
- data/lib/pubid/amca/identifiers/interpretation.rb +17 -9
- data/lib/pubid/amca/identifiers/publication.rb +13 -9
- data/lib/pubid/amca/identifiers/standard.rb +2 -0
- data/lib/pubid/amca/parser.rb +1 -1
- data/lib/pubid/amca/renderer.rb +4 -4
- data/lib/pubid/amca/urn_generator.rb +2 -2
- data/lib/pubid/amca.rb +2 -1
- 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 +31 -10
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +6 -0
- data/lib/pubid/ashrae/identifiers/addendum.rb +8 -0
- data/lib/pubid/ashrae/identifiers/base.rb +81 -5
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +7 -0
- 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/parser.rb +23 -8
- data/lib/pubid/ashrae/renderer.rb +6 -6
- data/lib/pubid/ashrae/supplement_identifier.rb +17 -2
- data/lib/pubid/ashrae/urn_generator.rb +8 -2
- data/lib/pubid/ashrae.rb +7 -1
- 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 +66 -10
- data/lib/pubid/bipm/identifier.rb +134 -9
- data/lib/pubid/bipm/identifiers/committee_document.rb +12 -0
- data/lib/pubid/bipm/identifiers/guide.rb +11 -0
- data/lib/pubid/bipm/identifiers/meeting.rb +12 -0
- data/lib/pubid/bipm/identifiers/mep.rb +12 -0
- data/lib/pubid/bipm/identifiers/metrologia_article.rb +24 -0
- data/lib/pubid/bipm/identifiers/si_brochure.rb +13 -0
- data/lib/pubid/bipm/parser.rb +65 -12
- data/lib/pubid/bipm/renderer.rb +8 -0
- data/lib/pubid/bipm/urn_parser.rb +11 -3
- data/lib/pubid/bipm.rb +7 -1
- data/lib/pubid/bsi/builder.rb +48 -38
- 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/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/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/parser.rb +1 -1
- data/lib/pubid/bsi/renderer.rb +63 -51
- data/lib/pubid/bsi/single_identifier.rb +16 -7
- data/lib/pubid/bsi/urn_generator.rb +11 -2
- data/lib/pubid/bsi.rb +7 -1
- data/lib/pubid/builder/base.rb +18 -8
- data/lib/pubid/bundled_identifier.rb +16 -6
- data/lib/pubid/calconnect/identifier.rb +9 -5
- data/lib/pubid/calconnect/parser.rb +1 -1
- data/lib/pubid/calconnect.rb +7 -1
- data/lib/pubid/ccsds/identifier.rb +9 -2
- data/lib/pubid/ccsds/identifiers/base.rb +4 -2
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/ccsds/parser.rb +1 -1
- data/lib/pubid/ccsds/single_identifier.rb +2 -2
- data/lib/pubid/ccsds.rb +1 -0
- data/lib/pubid/cen_cenelec/builder.rb +101 -76
- 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 -20
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
- 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 +28 -10
- data/lib/pubid/cie/builder.rb +10 -0
- data/lib/pubid/cie/identifier.rb +6 -1
- data/lib/pubid/cie/identifiers/bundle.rb +4 -2
- data/lib/pubid/cie/identifiers/conference.rb +2 -2
- data/lib/pubid/cie/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/cie/identifiers/dual_published.rb +2 -2
- data/lib/pubid/cie/identifiers/identical.rb +2 -2
- data/lib/pubid/cie/identifiers/joint_published.rb +2 -2
- data/lib/pubid/cie/identifiers/proceedings.rb +8 -6
- data/lib/pubid/cie/identifiers/standard.rb +22 -13
- data/lib/pubid/cie/identifiers/supplement.rb +2 -2
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +2 -2
- data/lib/pubid/cie/parser.rb +1 -1
- data/lib/pubid/cie.rb +7 -1
- 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 +47 -47
- data/lib/pubid/csa/composite_identifier.rb +14 -19
- data/lib/pubid/csa/identifier.rb +143 -81
- data/lib/pubid/csa/identifiers/bundled.rb +23 -13
- 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 +95 -73
- data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
- data/lib/pubid/csa/identifiers/package.rb +2 -2
- data/lib/pubid/csa/parser.rb +6 -2
- 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 +39 -23
- data/lib/pubid/csa.rb +7 -1
- data/lib/pubid/doi/identifier.rb +6 -3
- data/lib/pubid/doi/parser.rb +1 -1
- data/lib/pubid/doi.rb +1 -0
- data/lib/pubid/easc/identifier.rb +0 -2
- data/lib/pubid/easc/parser.rb +10 -2
- data/lib/pubid/easc.rb +1 -0
- data/lib/pubid/ecma/builder.rb +23 -9
- data/lib/pubid/ecma/identifier.rb +81 -10
- data/lib/pubid/ecma/parser.rb +39 -4
- data/lib/pubid/ecma/renderer.rb +29 -8
- data/lib/pubid/ecma/urn_generator.rb +34 -13
- data/lib/pubid/ecma/urn_parser.rb +30 -14
- data/lib/pubid/ecma.rb +1 -0
- data/lib/pubid/errors.rb +80 -0
- data/lib/pubid/etsi/builder.rb +6 -1
- data/lib/pubid/etsi/identifiers/base.rb +34 -20
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +120 -41
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +10 -0
- data/lib/pubid/etsi/parser.rb +1 -1
- data/lib/pubid/etsi.rb +1 -0
- 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.rb +1 -0
- data/lib/pubid/format_detector.rb +1 -0
- data/lib/pubid/gb/identifier.rb +6 -3
- data/lib/pubid/gb/parser.rb +1 -1
- data/lib/pubid/gb.rb +1 -0
- data/lib/pubid/gost/builder.rb +46 -9
- data/lib/pubid/gost/identifier.rb +0 -2
- data/lib/pubid/gost/identifiers/foreign_reference.rb +1 -1
- data/lib/pubid/gost/parser.rb +10 -2
- data/lib/pubid/gost.rb +1 -0
- data/lib/pubid/iala/identifier.rb +9 -6
- data/lib/pubid/iala/parser.rb +10 -2
- data/lib/pubid/iala/urn_parser.rb +6 -2
- data/lib/pubid/iala.rb +1 -0
- data/lib/pubid/iana/builder.rb +3 -1
- data/lib/pubid/iana/identifier.rb +74 -6
- data/lib/pubid/iana/identifiers/registry.rb +36 -0
- data/lib/pubid/iana/parser.rb +1 -1
- data/lib/pubid/iana/renderer.rb +3 -0
- data/lib/pubid/iana/urn_generator.rb +5 -1
- data/lib/pubid/iana.rb +1 -0
- data/lib/pubid/identifier.rb +594 -10
- data/lib/pubid/identifier_metadata.rb +1 -0
- data/lib/pubid/idf/builder.rb +3 -3
- data/lib/pubid/idf/identifier.rb +18 -9
- data/lib/pubid/idf/parser.rb +1 -1
- data/lib/pubid/idf/renderer.rb +4 -4
- data/lib/pubid/idf/urn_generator.rb +1 -1
- data/lib/pubid/idf.rb +7 -1
- data/lib/pubid/iec/builder.rb +14 -7
- data/lib/pubid/iec/components.rb +0 -1
- data/lib/pubid/iec/identifier.rb +73 -83
- data/lib/pubid/iec/identifiers/amendment.rb +6 -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/corrigendum.rb +2 -2
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +2 -4
- data/lib/pubid/iec/identifiers/guide.rb +0 -16
- data/lib/pubid/iec/identifiers/international_standard.rb +15 -2
- 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/societal_technology_trend_report.rb +0 -10
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
- data/lib/pubid/iec/identifiers/technical_report.rb +0 -17
- data/lib/pubid/iec/identifiers/technical_specification.rb +0 -17
- 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/white_paper.rb +0 -10
- data/lib/pubid/iec/identifiers/working_document.rb +24 -10
- data/lib/pubid/iec/parser.rb +2 -18
- data/lib/pubid/iec/renderer.rb +13 -10
- data/lib/pubid/iec/single_identifier.rb +33 -10
- data/lib/pubid/iec/urn_generator.rb +227 -61
- data/lib/pubid/iec/urn_parser.rb +42 -4
- data/lib/pubid/iec.rb +1 -0
- data/lib/pubid/ieee/aiee/identifier.rb +2 -2
- data/lib/pubid/ieee/aiee/parser.rb +1 -1
- data/lib/pubid/ieee/builder.rb +45 -1
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +32 -0
- data/lib/pubid/ieee/identifiers/base.rb +42 -5
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +21 -0
- data/lib/pubid/ieee/identifiers/dual_published.rb +55 -0
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +23 -0
- data/lib/pubid/ieee/identifiers/joint_development.rb +11 -7
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +57 -5
- data/lib/pubid/ieee/identifiers/nesc/base.rb +2 -2
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +2 -2
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +2 -2
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +2 -2
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +2 -2
- data/lib/pubid/ieee/ire/identifier.rb +2 -2
- data/lib/pubid/ieee/ire/parser.rb +1 -1
- data/lib/pubid/ieee/nesc/parser.rb +1 -1
- data/lib/pubid/ieee/parser.rb +1 -1
- data/lib/pubid/ieee/renderer.rb +5 -1
- data/lib/pubid/ieee/urn_generator.rb +32 -3
- data/lib/pubid/ieee.rb +7 -1
- data/lib/pubid/ieee_debug.rb +1 -0
- data/lib/pubid/ietf/builder.rb +24 -8
- data/lib/pubid/ietf/identifiers/base.rb +25 -28
- data/lib/pubid/ietf/identifiers/bcp.rb +11 -0
- data/lib/pubid/ietf/identifiers/fyi.rb +11 -0
- data/lib/pubid/ietf/identifiers/internet_draft.rb +18 -2
- data/lib/pubid/ietf/identifiers/rfc.rb +2 -0
- data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
- data/lib/pubid/ietf/identifiers/std.rb +11 -0
- data/lib/pubid/ietf/identifiers.rb +1 -0
- data/lib/pubid/ietf/parser.rb +27 -9
- data/lib/pubid/ietf/renderer.rb +44 -6
- data/lib/pubid/ietf/urn_generator.rb +20 -6
- data/lib/pubid/ietf/urn_parser.rb +10 -2
- data/lib/pubid/ietf.rb +12 -2
- data/lib/pubid/iho/identifiers/base.rb +10 -3
- data/lib/pubid/iho/parser.rb +1 -1
- data/lib/pubid/iho.rb +1 -0
- data/lib/pubid/isbn/identifier.rb +25 -7
- data/lib/pubid/isbn/parser.rb +1 -1
- data/lib/pubid/isbn.rb +1 -0
- data/lib/pubid/iso/bundled_identifier.rb +5 -3
- data/lib/pubid/iso/combined_identifier.rb +5 -3
- data/lib/pubid/iso/identifier.rb +12 -7
- data/lib/pubid/iso/identifiers/directives_supplement.rb +4 -4
- data/lib/pubid/iso/parser.rb +1 -1
- data/lib/pubid/iso.rb +7 -1
- data/lib/pubid/itu/identifiers/addendum.rb +2 -2
- data/lib/pubid/itu/identifiers/amendment.rb +2 -2
- data/lib/pubid/itu/identifiers/base.rb +19 -5
- data/lib/pubid/itu/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/itu/identifiers/errata.rb +2 -2
- data/lib/pubid/itu/identifiers/supplement.rb +2 -2
- data/lib/pubid/itu/parser.rb +1 -1
- data/lib/pubid/itu.rb +1 -0
- data/lib/pubid/jcgm/builder.rb +1 -1
- data/lib/pubid/jcgm/identifier.rb +10 -0
- data/lib/pubid/jcgm/identifiers/meeting.rb +1 -1
- data/lib/pubid/jcgm/parser.rb +10 -3
- data/lib/pubid/jcgm/renderer.rb +10 -3
- data/lib/pubid/jcgm/single_identifier.rb +24 -15
- data/lib/pubid/jcgm/urn_generator.rb +1 -1
- data/lib/pubid/jcgm/urn_parser.rb +156 -14
- data/lib/pubid/jcgm.rb +10 -0
- data/lib/pubid/jis/identifier.rb +10 -3
- data/lib/pubid/jis/parser.rb +1 -1
- data/lib/pubid/jis.rb +1 -0
- data/lib/pubid/nist/components/stage.rb +2 -2
- data/lib/pubid/nist/configuration.rb +6 -8
- data/lib/pubid/nist/identifiers/base.rb +12 -2
- data/lib/pubid/nist/identifiers/circular.rb +9 -2
- data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +7 -1
- data/lib/pubid/nist/identifiers/crpl_report.rb +7 -1
- data/lib/pubid/nist/identifiers/handbook.rb +9 -2
- data/lib/pubid/nist/identifiers/internal_report.rb +12 -5
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +14 -6
- data/lib/pubid/nist/identifiers/monograph.rb +14 -7
- data/lib/pubid/nist/identifiers/report.rb +14 -6
- data/lib/pubid/nist/parser.rb +1 -1
- data/lib/pubid/nist/supplement_identifier.rb +16 -1
- data/lib/pubid/nist.rb +7 -1
- data/lib/pubid/oasis/builder.rb +12 -10
- data/lib/pubid/oasis/identifier.rb +89 -11
- data/lib/pubid/oasis/parser.rb +1 -1
- data/lib/pubid/oasis.rb +7 -1
- data/lib/pubid/ogc/identifier.rb +9 -5
- data/lib/pubid/ogc/parser.rb +1 -1
- data/lib/pubid/ogc.rb +1 -0
- data/lib/pubid/oiml/builder.rb +5 -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 +1 -1
- data/lib/pubid/oiml/single_identifier.rb +26 -42
- data/lib/pubid/oiml/supplement_identifier.rb +27 -0
- data/lib/pubid/oiml.rb +7 -1
- data/lib/pubid/omg/builder.rb +1 -0
- data/lib/pubid/omg/identifier.rb +20 -3
- data/lib/pubid/omg/parser.rb +64 -11
- data/lib/pubid/omg/renderer.rb +13 -1
- data/lib/pubid/omg.rb +2 -1
- data/lib/pubid/parser/grammar.rb +74 -0
- data/lib/pubid/parser.rb +2 -0
- data/lib/pubid/parsers/mr_string.rb +19 -0
- data/lib/pubid/plateau/parser.rb +1 -1
- data/lib/pubid/plateau.rb +10 -0
- 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 +3 -3
- data/lib/pubid/renderers/mr_string.rb +15 -9
- data/lib/pubid/renderers.rb +1 -0
- data/lib/pubid/rendering/numbering.rb +25 -7
- data/lib/pubid/rendering.rb +1 -0
- data/lib/pubid/sae/identifiers/base.rb +9 -2
- data/lib/pubid/sae/parser.rb +1 -1
- data/lib/pubid/sae.rb +1 -0
- 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 +1 -1
- data/lib/pubid/tgpp/identifier.rb +21 -5
- data/lib/pubid/tgpp/identifiers/technical_report.rb +2 -2
- data/lib/pubid/tgpp/identifiers/technical_specification.rb +2 -2
- data/lib/pubid/tgpp/parser.rb +22 -6
- data/lib/pubid/tgpp/renderer.rb +21 -5
- data/lib/pubid/tgpp/urn_generator.rb +27 -8
- data/lib/pubid/tgpp/urn_parser.rb +8 -6
- data/lib/pubid/tgpp.rb +7 -1
- data/lib/pubid/type_resolver.rb +16 -1
- data/lib/pubid/un/identifier.rb +6 -3
- data/lib/pubid/un/parser.rb +1 -1
- data/lib/pubid/un.rb +1 -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 +5 -5
- data/lib/pubid/w3c/identifier.rb +38 -9
- data/lib/pubid/w3c/parser.rb +1 -1
- data/lib/pubid/w3c/renderer.rb +1 -1
- data/lib/pubid/w3c/urn_generator.rb +2 -2
- data/lib/pubid/w3c.rb +1 -0
- data/lib/pubid/xsf/identifier.rb +9 -5
- data/lib/pubid/xsf/parser.rb +17 -4
- data/lib/pubid/xsf.rb +7 -1
- data/lib/pubid.rb +399 -21
- 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 +38 -17
- 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/series.yaml +0 -121
- 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/iec/components/code.rb +0 -36
- /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
data/lib/pubid/gost/builder.rb
CHANGED
|
@@ -120,23 +120,60 @@ module Pubid
|
|
|
120
120
|
[m[1], m[2]]
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
-
#
|
|
124
|
-
#
|
|
125
|
-
# parse, or nil if none recognize the string.
|
|
123
|
+
# Route a foreign adopted identifier to its owning flavor, then
|
|
124
|
+
# fall back to trying every other flavor as a parser. Returns the
|
|
125
|
+
# first successful parse, or nil if none recognize the string.
|
|
126
|
+
#
|
|
127
|
+
# The prefix route is what makes this deterministic: Registry
|
|
128
|
+
# insertion order is module-load order, which belongs to the host
|
|
129
|
+
# application (a script that references Pubid::Ieee before
|
|
130
|
+
# Pubid::Astm registers IEEE first, and IEEE's grammar accepts
|
|
131
|
+
# "ASTM D129-18" as a publisher token plus an IEEE code), so a
|
|
132
|
+
# first-success loop over insertion order routed the same GOST
|
|
133
|
+
# adoption to different flavors per process. The fallback loop
|
|
134
|
+
# iterates sorted flavor names for the same reason.
|
|
126
135
|
def parse_foreign(raw)
|
|
127
136
|
::Pubid.eager_load_flavors!
|
|
128
|
-
|
|
137
|
+
|
|
138
|
+
owner = prefix_owner(raw)
|
|
139
|
+
parsed = owner && parse_quietly(owner, raw)
|
|
140
|
+
return parsed if parsed
|
|
141
|
+
|
|
142
|
+
try_each_flavor(raw)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def parse_quietly(mod, raw)
|
|
146
|
+
mod.parse(raw)
|
|
147
|
+
rescue StandardError
|
|
148
|
+
nil
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def try_each_flavor(raw)
|
|
152
|
+
::Pubid::Registry.flavor_names.sort.each do |name|
|
|
153
|
+
mod = ::Pubid::Registry.get(name)
|
|
129
154
|
next if mod == ::Pubid::Gost
|
|
130
155
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
rescue StandardError
|
|
134
|
-
next
|
|
135
|
-
end
|
|
156
|
+
parsed = parse_quietly(mod, raw)
|
|
157
|
+
return parsed if parsed
|
|
136
158
|
end
|
|
137
159
|
nil
|
|
138
160
|
end
|
|
139
161
|
|
|
162
|
+
# The single flavor owning the longest registered prefix that the
|
|
163
|
+
# string starts with; nil when no prefix matches or the prefix is
|
|
164
|
+
# jointly owned (joint forms go through the fallback loop, where
|
|
165
|
+
# every owner parses them correctly).
|
|
166
|
+
def prefix_owner(raw)
|
|
167
|
+
index = ::Pubid.prefix_flavors
|
|
168
|
+
match = index.keys
|
|
169
|
+
.select { |p| raw.start_with?("#{p} ") || raw == p }
|
|
170
|
+
.max_by(&:length)
|
|
171
|
+
return nil unless match
|
|
172
|
+
|
|
173
|
+
owners = index[match]
|
|
174
|
+
owners.one? ? ::Pubid::Registry.get(owners.first) : nil
|
|
175
|
+
end
|
|
176
|
+
|
|
140
177
|
def stringify(value)
|
|
141
178
|
return nil if value.nil?
|
|
142
179
|
|
|
@@ -15,8 +15,6 @@ module Pubid
|
|
|
15
15
|
def self.parse(identifier)
|
|
16
16
|
parsed = Parser.parse(identifier)
|
|
17
17
|
Builder.build(parsed)
|
|
18
|
-
rescue Parslet::ParseFailed => e
|
|
19
|
-
raise "Failed to parse GOST identifier '#{identifier}': #{e.message}"
|
|
20
18
|
end
|
|
21
19
|
|
|
22
20
|
attribute :publisher, :string, default: "GOST"
|
data/lib/pubid/gost/parser.rb
CHANGED
|
@@ -26,7 +26,7 @@ module Pubid
|
|
|
26
26
|
#
|
|
27
27
|
# The builder interprets prefix_text (splits copublisher vs subtype,
|
|
28
28
|
# normalizes Cyrillic to Latin) and raw (splits number vs year).
|
|
29
|
-
class Parser <
|
|
29
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
30
30
|
include ::Pubid::Parser::CommonParseRules
|
|
31
31
|
|
|
32
32
|
root :identifier
|
|
@@ -88,7 +88,15 @@ module Pubid
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def self.parse(string)
|
|
91
|
-
|
|
91
|
+
unless string.is_a?(String)
|
|
92
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
93
|
+
::Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
if string.length > ::Pubid::MAX_INPUT_LENGTH
|
|
97
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
98
|
+
::Pubid::INPUT_TOO_LONG_MESSAGE
|
|
99
|
+
end
|
|
92
100
|
|
|
93
101
|
new.parse(string.strip)
|
|
94
102
|
end
|
data/lib/pubid/gost.rb
CHANGED
|
@@ -15,15 +15,18 @@ module Pubid
|
|
|
15
15
|
# R1016:ed2.0(F)
|
|
16
16
|
# C0103-1 Ed 3.0
|
|
17
17
|
class Identifier < ::Pubid::Identifier
|
|
18
|
-
# Parse an IALA identifier
|
|
18
|
+
# Parse an IALA identifier — human form ("IALA G1199 Ed 1.0") or
|
|
19
|
+
# MRN URN ("urn:mrn:iala:pub:g1199:ed1.0") — into an identifier.
|
|
19
20
|
# @param identifier [String]
|
|
20
21
|
# @return [Pubid::Iala::Identifier]
|
|
21
|
-
# @raise [
|
|
22
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
22
23
|
def self.parse(identifier)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if FormatDetector.detect(identifier) == :urn
|
|
25
|
+
UrnParser.parse(identifier)
|
|
26
|
+
else
|
|
27
|
+
parsed = Parser.parse(identifier)
|
|
28
|
+
Builder.build(parsed)
|
|
29
|
+
end
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
attribute :publisher, :string, default: "IALA"
|
data/lib/pubid/iala/parser.rb
CHANGED
|
@@ -15,7 +15,7 @@ module Pubid
|
|
|
15
15
|
# R1016:ed2.0(F)
|
|
16
16
|
# C0103-1
|
|
17
17
|
# C0103-1 Ed 3.0
|
|
18
|
-
class Parser <
|
|
18
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
19
19
|
include ::Pubid::Parser::CommonParseRules
|
|
20
20
|
|
|
21
21
|
root :identifier
|
|
@@ -121,7 +121,15 @@ module Pubid
|
|
|
121
121
|
# @param string [String]
|
|
122
122
|
# @return [Hash]
|
|
123
123
|
def self.parse(string)
|
|
124
|
-
|
|
124
|
+
unless string.is_a?(String)
|
|
125
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
126
|
+
::Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
if string.length > ::Pubid::MAX_INPUT_LENGTH
|
|
130
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
131
|
+
::Pubid::INPUT_TOO_LONG_MESSAGE
|
|
132
|
+
end
|
|
125
133
|
|
|
126
134
|
new.parse(string.strip)
|
|
127
135
|
end
|
|
@@ -37,8 +37,12 @@ module Pubid
|
|
|
37
37
|
# generator's casing so URN round-trip is exact.
|
|
38
38
|
annex_letter = Regexp.last_match(2)&.upcase
|
|
39
39
|
annex_form = annex_letter ? "ANNEX" : "Annex"
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
# Edition marker: case-insensitive with an optional separator dot.
|
|
41
|
+
# Both variants occur in published documents (R1026 prints
|
|
42
|
+
# "Ed1.0" and "ed.1.0"); each parses to the canonical edition
|
|
43
|
+
# value and re-renders as lowercase "ed<x.x>".
|
|
44
|
+
when /\Aed\.?/i
|
|
45
|
+
edition = seg.sub(/\Aed\.?/i, "")
|
|
42
46
|
when /\A[a-z]\z/i
|
|
43
47
|
language = seg.upcase
|
|
44
48
|
end
|
data/lib/pubid/iala.rb
CHANGED
data/lib/pubid/iana/builder.rb
CHANGED
|
@@ -10,8 +10,10 @@ module Pubid
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def build(data)
|
|
13
|
+
# The top-level slug is stored as `number` — it is the relaton-index
|
|
14
|
+
# key; `Identifier#registry` reads it back.
|
|
13
15
|
Identifiers::Registry.new(
|
|
14
|
-
|
|
16
|
+
number: data[:registry].to_s,
|
|
15
17
|
sub_registry: data[:sub_registry]&.to_s,
|
|
16
18
|
)
|
|
17
19
|
end
|
|
@@ -9,9 +9,12 @@ module Pubid
|
|
|
9
9
|
# IANA entries are protocol registries, not numbered standards: the value is
|
|
10
10
|
# a hierarchical registry slug (`registry` before the single "/", optional
|
|
11
11
|
# `sub_registry` after it). Both are kept verbatim.
|
|
12
|
+
#
|
|
13
|
+
# The top-level slug is stored as `number` on the concrete leaf
|
|
14
|
+
# (Identifiers::Registry) so it can serve as the relaton-index key; see the
|
|
15
|
+
# long comment there for why the attribute lives on the leaf. `registry` is
|
|
16
|
+
# a derived reader over it, so it is NOT a serialized key.
|
|
12
17
|
class Identifier < ::Pubid::Identifier
|
|
13
|
-
# The registry slug (e.g. "_6lowpan-parameters"). Required.
|
|
14
|
-
attribute :registry, :string
|
|
15
18
|
# The sub-registry slug (e.g. "lowpan_nhc"). nil for top registries; a nil
|
|
16
19
|
# default means it is dropped from the serialized hash when absent.
|
|
17
20
|
attribute :sub_registry, :string
|
|
@@ -23,9 +26,12 @@ module Pubid
|
|
|
23
26
|
"pubid:iana:registry" => "Pubid::Iana::Identifiers::Registry",
|
|
24
27
|
}.freeze
|
|
25
28
|
|
|
29
|
+
# Identifiers::Registry merges its own block mapping `number` on top of
|
|
30
|
+
# this one. `number` is intentionally absent here: mapping it on the class
|
|
31
|
+
# the leaf inherits from would re-declare the parent's Components::Code
|
|
32
|
+
# attribute (see Identifiers::Registry).
|
|
26
33
|
key_value do
|
|
27
34
|
map "_type", to: :_type, polymorphic_map: IANA_TYPE_MAP
|
|
28
|
-
map "registry", to: :registry
|
|
29
35
|
map "sub_registry", to: :sub_registry
|
|
30
36
|
end
|
|
31
37
|
|
|
@@ -38,6 +44,14 @@ module Pubid
|
|
|
38
44
|
# dropped so callers can recover the bare index-key slug.
|
|
39
45
|
attr_reader :with_publisher
|
|
40
46
|
|
|
47
|
+
# The top-level registry slug. Derived from `number`, which is where it is
|
|
48
|
+
# stored — a plain method is safe because `registry` is no longer a lutaml
|
|
49
|
+
# attribute, so no generated accessor competes with it (the same shape as
|
|
50
|
+
# Pubid::Ietf::Identifiers::Bcp#series).
|
|
51
|
+
def registry
|
|
52
|
+
number
|
|
53
|
+
end
|
|
54
|
+
|
|
41
55
|
# The rendered registry code, e.g. "_6lowpan-parameters/lowpan_nhc".
|
|
42
56
|
def code
|
|
43
57
|
sub_registry ? "#{registry}/#{sub_registry}" : registry
|
|
@@ -51,6 +65,57 @@ module Pubid
|
|
|
51
65
|
render(format: :human, **opts)
|
|
52
66
|
end
|
|
53
67
|
|
|
68
|
+
# --- Machine-readable slug -------------------------------------------
|
|
69
|
+
# The shared MrString renderer composes publisher/type/number/... from the
|
|
70
|
+
# inherited attributes, none of which IANA populates: `publisher` is a
|
|
71
|
+
# constant rather than an attribute (see PUBLISHER above) and the builder
|
|
72
|
+
# sets no typed_stage. Without these two overrides every IANA identifier
|
|
73
|
+
# rendered the empty MR string, so all of them collided on `to_mr_string`
|
|
74
|
+
# and `to_slug` (issue #142) — and `to_slug` is used as a filename.
|
|
75
|
+
#
|
|
76
|
+
# Verified over the 3405 published relaton-data-iana rows: the resulting
|
|
77
|
+
# slugs are all distinct and stay inside the documented [a-z0-9._-] MR
|
|
78
|
+
# charset. Note that IANA slugs legitimately contain "_", which is MR's
|
|
79
|
+
# supplement separator, so an IANA MR is not re-parseable by
|
|
80
|
+
# Pubid::Parsers::MrString; uniqueness and filename-safety are what these
|
|
81
|
+
# buy, not MR round-tripping.
|
|
82
|
+
def mr_publisher
|
|
83
|
+
PUBLISHER.downcase
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def mr_number_with_part
|
|
87
|
+
[number, sub_registry].compact.join(".").downcase
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# The guard below has to cover this surface too: without it a nil number
|
|
91
|
+
# renders the bare publisher token "iana" for every affected row, i.e. one
|
|
92
|
+
# filename shared by all of them.
|
|
93
|
+
def to_mr_string
|
|
94
|
+
require_number!
|
|
95
|
+
super
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# The top-level slug moved from a `registry` key into `number` with no
|
|
99
|
+
# alias, so a row serialized before that change deserializes with a nil
|
|
100
|
+
# number and NO error: lutaml ignores unknown keys, and relaton's
|
|
101
|
+
# Index::FileIO#id_supported? skips its round-trip check for concrete
|
|
102
|
+
# subclasses (every IANA id is an Identifiers::Registry). Failing loudly
|
|
103
|
+
# at render time is the only thing that surfaces a stale index.
|
|
104
|
+
#
|
|
105
|
+
# It is called from all three identity surfaces — to_s (via Renderer),
|
|
106
|
+
# to_urn (via UrnGenerator) and to_mr_string — because guarding only one
|
|
107
|
+
# still lets every stale row collide on the other two ("urn:iana:",
|
|
108
|
+
# "iana"), which is the silent overwrite this whole change exists to
|
|
109
|
+
# prevent.
|
|
110
|
+
def require_number!
|
|
111
|
+
return unless number.nil? || number.to_s.empty?
|
|
112
|
+
|
|
113
|
+
raise ArgumentError,
|
|
114
|
+
"Cannot render #{self.class} with an empty number " \
|
|
115
|
+
"(a pre-`number` index row stored the registry slug under " \
|
|
116
|
+
"`registry`; regenerate the index)"
|
|
117
|
+
end
|
|
118
|
+
|
|
54
119
|
# from_hash is the shared polymorphic dispatch on Pubid::Identifier;
|
|
55
120
|
# IANA_TYPE_MAP remains as the key_value polymorphic_map.
|
|
56
121
|
|
|
@@ -58,14 +123,17 @@ module Pubid
|
|
|
58
123
|
# @param identifier [String] The IANA identifier string to parse
|
|
59
124
|
# @return [Identifier] The appropriate identifier object
|
|
60
125
|
def self.parse(identifier)
|
|
126
|
+
unless identifier.is_a?(String)
|
|
127
|
+
raise Pubid::Errors::InvalidInputError,
|
|
128
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
129
|
+
end
|
|
130
|
+
|
|
61
131
|
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
62
|
-
raise
|
|
132
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
63
133
|
end
|
|
64
134
|
|
|
65
135
|
parsed = Parser.parse(identifier)
|
|
66
136
|
Builder.build(parsed)
|
|
67
|
-
rescue Parslet::ParseFailed => e
|
|
68
|
-
raise "Failed to parse IANA identifier '#{identifier}': #{e.message}"
|
|
69
137
|
end
|
|
70
138
|
end
|
|
71
139
|
end
|
|
@@ -11,6 +11,42 @@ module Pubid
|
|
|
11
11
|
# IANA _6lowpan-parameters
|
|
12
12
|
# IANA _6lowpan-parameters/lowpan_nhc
|
|
13
13
|
class Registry < Identifier
|
|
14
|
+
# The top-level registry slug ("_6lowpan-parameters"), and the index
|
|
15
|
+
# key: relaton-index bsearches on `id.root.number.to_s`, and every IANA
|
|
16
|
+
# identifier is its own root (the flavor has no wrapper or supplement
|
|
17
|
+
# types), so an empty key silently defeats the search for every row.
|
|
18
|
+
#
|
|
19
|
+
# An IANA identifier carries no numeric document number — digits only
|
|
20
|
+
# ever appear glued inside a slug token (`sip-parameters-13`,
|
|
21
|
+
# `idna-tables-11.0.0`), never as a separable component — so the slug
|
|
22
|
+
# itself is the key, exactly as an Internet-Draft's slug is
|
|
23
|
+
# (lib/pubid/ietf/identifiers/serialization.rb). Keying on the TOP-LEVEL
|
|
24
|
+
# slug rather than the full `registry/sub_registry` code means a
|
|
25
|
+
# registry and all of its sub-registries cluster into one bucket, the
|
|
26
|
+
# analogue of a draft clustering with its versions.
|
|
27
|
+
#
|
|
28
|
+
# WHY THIS IS DECLARED HERE AND NOT ON Pubid::Iana::Identifier:
|
|
29
|
+
# it redefines the parent ::Pubid::Identifier's
|
|
30
|
+
# `attribute :number, Components::Code` as a plain :string. Declaring
|
|
31
|
+
# that on a class the concrete type INHERITS from resolves against the
|
|
32
|
+
# parent definition nondeterministically under multi-flavor load — it
|
|
33
|
+
# passes an IANA-only run and can flip `root.number` to "" under the
|
|
34
|
+
# full suite (the IEEE/IETF lesson; see
|
|
35
|
+
# lib/pubid/ieee/identifiers/code_number.rb and CLAUDE.md). Declaring it
|
|
36
|
+
# directly on the leaf removes the ambiguity at the point of use.
|
|
37
|
+
# For the same reason, never define a `#number` *method* — it would
|
|
38
|
+
# collide with lutaml's generated accessor.
|
|
39
|
+
# spec/pubid/iana/root_number_spec.rb guards this and must run under the
|
|
40
|
+
# FULL suite to be meaningful.
|
|
41
|
+
attribute :number, :string
|
|
42
|
+
|
|
43
|
+
# Merged by lutaml with the base's key_value block, which maps `_type`
|
|
44
|
+
# and `sub_registry`. `registry` is deliberately NOT stored — it is the
|
|
45
|
+
# same string as `number`, and the base exposes it as a derived reader.
|
|
46
|
+
key_value do
|
|
47
|
+
map "number", to: :number
|
|
48
|
+
end
|
|
49
|
+
|
|
14
50
|
# IANA registries carry no revision/stage lifecycle; a single published
|
|
15
51
|
# typed stage keeps parity with the other flavors' type registries.
|
|
16
52
|
TYPED_STAGES = [
|
data/lib/pubid/iana/parser.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Pubid
|
|
|
12
12
|
#
|
|
13
13
|
# Slugs use only [a-zA-Z0-9._-] and contain at most one "/", so a plain
|
|
14
14
|
# character-class repeat parses them; there is no ReDoS surface.
|
|
15
|
-
class Parser <
|
|
15
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
16
16
|
# A single registry slug: letters, digits, dot, underscore, hyphen.
|
|
17
17
|
rule(:slug) { match['a-zA-Z0-9._\-'].repeat(1) }
|
|
18
18
|
|
data/lib/pubid/iana/renderer.rb
CHANGED
|
@@ -15,6 +15,9 @@ module Pubid
|
|
|
15
15
|
|
|
16
16
|
def render(**_opts)
|
|
17
17
|
id = @id
|
|
18
|
+
# A stale (pre-`number`) row must not render as a bare "IANA " or
|
|
19
|
+
# "IANA /lowpan_nhc"; see Identifier#require_number!.
|
|
20
|
+
id.require_number!
|
|
18
21
|
code = id.code
|
|
19
22
|
with_publisher?(id) ? "#{PUBLISHER} #{code}" : code
|
|
20
23
|
end
|
|
@@ -6,7 +6,11 @@ module Pubid
|
|
|
6
6
|
# (charset is [a-zA-Z0-9._-]), so the two levels split unambiguously.
|
|
7
7
|
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
8
8
|
def generate
|
|
9
|
-
|
|
9
|
+
# A stale (pre-`number`) row would otherwise emit the bare "urn:iana:"
|
|
10
|
+
# for every affected id; see Identifier#require_number!.
|
|
11
|
+
identifier.require_number!
|
|
12
|
+
# `number` holds the top-level registry slug (Identifiers::Registry).
|
|
13
|
+
parts = ["urn", "iana", identifier.number]
|
|
10
14
|
parts << identifier.sub_registry if identifier.sub_registry
|
|
11
15
|
parts.join(":")
|
|
12
16
|
end
|