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
|
@@ -4,7 +4,22 @@ module Pubid
|
|
|
4
4
|
module Astm
|
|
5
5
|
module Identifiers
|
|
6
6
|
class Adjunct < SingleIdentifier
|
|
7
|
-
|
|
7
|
+
include CodeNumber
|
|
8
|
+
|
|
9
|
+
# An adjunct carries no code at all — its whole identity is the
|
|
10
|
+
# designation ("ADJD2148"). relaton-index keys on
|
|
11
|
+
# `id.root.number.to_s`, so the designation IS the number here, the
|
|
12
|
+
# same reasoning that makes a registry slug IANA's number and a draft
|
|
13
|
+
# slug IETF's.
|
|
14
|
+
#
|
|
15
|
+
# It is stored in `number` itself rather than in a separate
|
|
16
|
+
# `designation` attribute shadowed by a `def number`. Two reasons, both
|
|
17
|
+
# from CLAUDE.md: defining a `#number` method alongside the attribute is
|
|
18
|
+
# the construct that corrupts lutaml's accessor resolution, and keeping
|
|
19
|
+
# both columns made `to_hash` emit the same string twice
|
|
20
|
+
# ({"number" => "D2148", "designation" => "D2148"}) — the duplication
|
|
21
|
+
# the BIPM note warns against. The builder assigns `number` and the
|
|
22
|
+
# renderer reads it; nothing else referenced `designation`.
|
|
8
23
|
attribute :ea_suffix, :boolean # -EA
|
|
9
24
|
attribute :dvd_suffix, :boolean # DVD
|
|
10
25
|
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Astm
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Installs the flat, index-friendly code columns on every CONCRETE ASTM
|
|
7
|
+
# identifier class.
|
|
8
|
+
#
|
|
9
|
+
# Why every concrete class and not Pubid::Astm::SingleIdentifier, which
|
|
10
|
+
# they all inherit from: `number` redefines the parent
|
|
11
|
+
# ::Pubid::Identifier's `attribute :number, Components::Code` as a plain
|
|
12
|
+
# :string (Astm::Components::Code is not a subclass of it). Declaring that
|
|
13
|
+
# on a class the concrete types INHERIT from resolves against the parent
|
|
14
|
+
# definition nondeterministically under multi-flavor load — it passes an
|
|
15
|
+
# ASTM-only run and can flip `root.number` to "" under the full suite (the
|
|
16
|
+
# IEEE lesson; see lib/pubid/ieee/identifiers/code_number.rb and
|
|
17
|
+
# CLAUDE.md).
|
|
18
|
+
#
|
|
19
|
+
# NOTE the module is included by `Standard` AND by `IsoDualPublished`,
|
|
20
|
+
# which inherits from Standard. That is deliberate, not redundant: a class
|
|
21
|
+
# that is itself inherited from must still declare the columns so its
|
|
22
|
+
# subclass holds its own snapshot rather than relying on the parent's.
|
|
23
|
+
# Every instantiable ASTM class declares them for itself.
|
|
24
|
+
#
|
|
25
|
+
# This matters because relaton-index sorts and bsearches every row on
|
|
26
|
+
# `id.root.number.to_s`, and ASTM kept identity in an
|
|
27
|
+
# Astm::Components::Code under a `code` attribute, so all 248 parseable
|
|
28
|
+
# fixture ids keyed "".
|
|
29
|
+
module CodeNumber
|
|
30
|
+
def self.included(base)
|
|
31
|
+
# Bare document number ("2938"), the relaton index key. `letter` is a
|
|
32
|
+
# sibling column, so E2938 and D2938 narrow to the same bucket and
|
|
33
|
+
# are then separated by the full hash — the IEEE prefix/number split.
|
|
34
|
+
base.attribute :number, :string
|
|
35
|
+
base.attribute :letter, :string
|
|
36
|
+
base.attribute :suffix, :string
|
|
37
|
+
base.attribute :subseries, :string
|
|
38
|
+
# Named for the RARE case with a false default, so the canonical
|
|
39
|
+
# to_hash drops it from every ordinary row.
|
|
40
|
+
base.attribute :dual_m, :boolean, default: -> { false }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# The composed document code, rebuilt on demand from the split columns.
|
|
44
|
+
# ASTM's renderer reads the individual fields (`code.letter`,
|
|
45
|
+
# `code.number`, `code.dual_m`) in several places, so the component has
|
|
46
|
+
# to keep its structure rather than collapsing to a string as ASME's
|
|
47
|
+
# does.
|
|
48
|
+
#
|
|
49
|
+
# Deliberately NOT an attribute and NOT memoised: the columns are
|
|
50
|
+
# writable (the base #exclude rebuilds through them), so a cached Code
|
|
51
|
+
# would go stale. nil when there is no number and no letter, preserving
|
|
52
|
+
# the nil-`code` branches the renderer and URN generator both test.
|
|
53
|
+
def code
|
|
54
|
+
return nil if number.nil? && letter.nil?
|
|
55
|
+
|
|
56
|
+
Components::Code.new(
|
|
57
|
+
letter: letter,
|
|
58
|
+
number: number,
|
|
59
|
+
suffix: suffix,
|
|
60
|
+
subseries: subseries,
|
|
61
|
+
dual_m: dual_m,
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Every field of the code is identity-bearing — Code#to_s renders all
|
|
66
|
+
# of them and they are all in the serialized hash — so all of them must
|
|
67
|
+
# reach the slug, or two distinct documents share a filename.
|
|
68
|
+
# CLAUDE.md's rule: a marker that only reaches `==` is not enough.
|
|
69
|
+
def mr_number_with_part
|
|
70
|
+
segments = [letter, number, suffix].compact
|
|
71
|
+
segments << "s#{subseries}" if subseries
|
|
72
|
+
segments << "m" if dual_m
|
|
73
|
+
return nil if segments.empty?
|
|
74
|
+
|
|
75
|
+
segments.join("-").downcase.gsub(/[^a-z0-9-]+/, "-")
|
|
76
|
+
.gsub(/\A-+|-+\z/, "")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -12,6 +12,22 @@ module Pubid
|
|
|
12
12
|
# Distinguishing feature: Starts with digit (typically 5xxxx series)
|
|
13
13
|
# These are ASTM's version of standards jointly developed with ISO
|
|
14
14
|
class IsoDualPublished < Standard
|
|
15
|
+
# Re-included even though Standard already does. DO NOT "clean this
|
|
16
|
+
# up" — it compiles fine without it, passes most tests, and silently
|
|
17
|
+
# reintroduces the multi-flavor `number` determinism landmine for this
|
|
18
|
+
# class alone, visible only under the full suite.
|
|
19
|
+
#
|
|
20
|
+
# Two Ruby facts make the repeat both necessary and safe:
|
|
21
|
+
# * `included(base)` fires on EVERY `include` call, so this gives
|
|
22
|
+
# IsoDualPublished its own `attribute :number` resolved against its
|
|
23
|
+
# own table rather than a snapshot inherited from Standard;
|
|
24
|
+
# * `Module#include` does NOT re-insert a module already present via
|
|
25
|
+
# a superclass, so CodeNumber keeps the ancestor position Standard
|
|
26
|
+
# gave it — still BELOW Standard. That is what lets
|
|
27
|
+
# Standard#mr_number_with_part's `super` reach CodeNumber's
|
|
28
|
+
# implementation instead of being shadowed here.
|
|
29
|
+
include CodeNumber
|
|
30
|
+
|
|
15
31
|
# Inherits all behavior from Standard:
|
|
16
32
|
# - sub_year (a, b, c)
|
|
17
33
|
# - reapproval ((2023))
|
|
@@ -4,9 +4,19 @@ module Pubid
|
|
|
4
4
|
module Astm
|
|
5
5
|
module Identifiers
|
|
6
6
|
class Manual < Base
|
|
7
|
+
include CodeNumber
|
|
8
|
+
|
|
7
9
|
attribute :edition, :string # 9TH, 2ND
|
|
8
10
|
attribute :supplement, :boolean # -SUP-
|
|
9
11
|
attribute :tp_designation, :string # TP for technical publications
|
|
12
|
+
|
|
13
|
+
# Both markers distinguish real documents that share a number —
|
|
14
|
+
# "ASTM MNL15-EB" vs "ASTM MNLTP15-EB", and "ASTM MNL20-2ND-EB" vs
|
|
15
|
+
# "ASTM MNL20-2ND-SUP-EB" — so both must reach the slug, not just the
|
|
16
|
+
# hash.
|
|
17
|
+
def mr_number_with_part
|
|
18
|
+
mr_join(tp_designation&.downcase, super, (supplement ? "sup" : nil))
|
|
19
|
+
end
|
|
10
20
|
end
|
|
11
21
|
end
|
|
12
22
|
end
|
|
@@ -4,7 +4,17 @@ module Pubid
|
|
|
4
4
|
module Astm
|
|
5
5
|
module Identifiers
|
|
6
6
|
class ResearchReport < Base
|
|
7
|
+
include CodeNumber
|
|
8
|
+
|
|
7
9
|
attribute :committee, :string # A01, C09
|
|
10
|
+
|
|
11
|
+
# Research-report numbers restart per committee, so the committee is
|
|
12
|
+
# part of the identity: "ASTM RR:A01-1001" and "ASTM RR:C09-1001" are
|
|
13
|
+
# different documents. The renderer already prints it; the slug has to
|
|
14
|
+
# carry it too or they share a filename.
|
|
15
|
+
def mr_number_with_part
|
|
16
|
+
mr_join(committee&.downcase, super)
|
|
17
|
+
end
|
|
8
18
|
end
|
|
9
19
|
end
|
|
10
20
|
end
|
|
@@ -4,9 +4,19 @@ module Pubid
|
|
|
4
4
|
module Astm
|
|
5
5
|
module Identifiers
|
|
6
6
|
class Standard < Base
|
|
7
|
+
include CodeNumber
|
|
8
|
+
|
|
7
9
|
attribute :sub_year, :string # a, b, c
|
|
8
10
|
attribute :reapproval, :string # (2023)
|
|
11
|
+
|
|
9
12
|
attribute :edition, :string # e1
|
|
13
|
+
|
|
14
|
+
# A reapproved edition is a distinct document — "ASTM C1870-18(2024)"
|
|
15
|
+
# and "ASTM C1870-18" have different hashes — so the marker has to
|
|
16
|
+
# reach the slug as well as `==`, or they share a filename.
|
|
17
|
+
def mr_number_with_part
|
|
18
|
+
mr_join(super, (reapproval ? "r#{reapproval}" : nil))
|
|
19
|
+
end
|
|
10
20
|
end
|
|
11
21
|
end
|
|
12
22
|
end
|
|
@@ -4,6 +4,7 @@ module Pubid
|
|
|
4
4
|
module Astm
|
|
5
5
|
module Identifiers
|
|
6
6
|
autoload :Base, "#{__dir__}/identifiers/base"
|
|
7
|
+
autoload :CodeNumber, "#{__dir__}/identifiers/code_number"
|
|
7
8
|
autoload :Standard, "#{__dir__}/identifiers/standard"
|
|
8
9
|
autoload :IsoDualPublished, "#{__dir__}/identifiers/iso_dual_published"
|
|
9
10
|
autoload :Manual, "#{__dir__}/identifiers/manual"
|
data/lib/pubid/astm/parser.rb
CHANGED
data/lib/pubid/astm/renderer.rb
CHANGED
|
@@ -131,7 +131,7 @@ module Pubid
|
|
|
131
131
|
def render_adjunct(id)
|
|
132
132
|
result = []
|
|
133
133
|
result << id.publisher if id.publisher && !id.ea_suffix && !id.dvd_suffix
|
|
134
|
-
result << "ADJ#{id.
|
|
134
|
+
result << "ADJ#{id.number}#{'-EA' if id.ea_suffix}#{'DVD' if id.dvd_suffix}"
|
|
135
135
|
result.compact.join(" ")
|
|
136
136
|
end
|
|
137
137
|
|
|
@@ -9,9 +9,39 @@ module Pubid
|
|
|
9
9
|
#
|
|
10
10
|
# @return [String] URN representation
|
|
11
11
|
attribute :publisher, :string, default: -> { "ASTM" }
|
|
12
|
-
|
|
12
|
+
# The document code lives on every concrete class as flat index columns
|
|
13
|
+
# (Identifiers::CodeNumber) — `number` is what relaton-index keys on. It
|
|
14
|
+
# cannot be declared here: SingleIdentifier is inherited by every ASTM
|
|
15
|
+
# type, and retyping the inherited `number` on an inherited-from class
|
|
16
|
+
# resolves nondeterministically under multi-flavor load.
|
|
13
17
|
attribute :year, :string
|
|
14
18
|
attribute :format_suffix, :string # -EB for eBook
|
|
19
|
+
|
|
20
|
+
# --- MR slug hooks -------------------------------------------------
|
|
21
|
+
#
|
|
22
|
+
# ASTM defined none, so the base hooks looked for an inherited
|
|
23
|
+
# `typed_stage`, `date` and `Components::Edition` that ASTM does not use.
|
|
24
|
+
# Two consequences, both measured on the corpus before this change:
|
|
25
|
+
# 201 of 248 ids shared the single slug "astm", and 40 of them RAISED —
|
|
26
|
+
# `mr_edition` calls `edition.number`, but ASTM's `edition` is a plain
|
|
27
|
+
# String. That is the same crash BIPM had, recorded in CLAUDE.md.
|
|
28
|
+
# `to_slug` is what consumers use as an output filename.
|
|
29
|
+
def mr_edition
|
|
30
|
+
edition&.to_s&.downcase
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# ASTM keeps its edition year in a plain `year` string, not the
|
|
34
|
+
# inherited `date`.
|
|
35
|
+
def mr_year
|
|
36
|
+
year&.to_s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# The document type is the class, not a typed_stage: without it a
|
|
40
|
+
# Manual, a DataSeries and a Standard numbered alike share a filename.
|
|
41
|
+
def mr_type
|
|
42
|
+
self.class.name.split("::").last
|
|
43
|
+
.gsub(/([a-z])([A-Z])/, '\1-\2').downcase
|
|
44
|
+
end
|
|
15
45
|
end
|
|
16
46
|
end
|
|
17
47
|
end
|
|
@@ -17,11 +17,13 @@ module Pubid
|
|
|
17
17
|
parts << identifier.code.to_s
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
number
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
# `number` is deliberately NOT emitted here. It used to be dead code —
|
|
21
|
+
# ASTM kept everything in `code` and never set the `number` inherited
|
|
22
|
+
# from ::Pubid::Identifier, so `maybe(:number)` always returned nil.
|
|
23
|
+
# Now that `number` is the real index column and `code` is composed
|
|
24
|
+
# from it, emitting both would double the segment
|
|
25
|
+
# ("urn:astm:std:D2148:2148:22"). `code` already renders the number
|
|
26
|
+
# along with the letter and the suffixes.
|
|
25
27
|
|
|
26
28
|
part = maybe(:part)
|
|
27
29
|
if part
|
data/lib/pubid/astm.rb
CHANGED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Bipm
|
|
5
|
+
# Turns the parse tree into the matching concrete identifier. Each root
|
|
6
|
+
# branch tags its subtree with a distinct key, so dispatch is a lookup on
|
|
7
|
+
# which key the parser produced.
|
|
8
|
+
class Builder
|
|
9
|
+
def self.build(parsed_data)
|
|
10
|
+
new.build(parsed_data)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def build(data)
|
|
14
|
+
if data[:committee_short]
|
|
15
|
+
build_committee(data[:committee_short], form: "short")
|
|
16
|
+
elsif data[:committee_long_en]
|
|
17
|
+
build_committee(data[:committee_long_en], form: "long", language: "E")
|
|
18
|
+
elsif data[:committee_bare]
|
|
19
|
+
# Bare MRA form: no type word, so build_committee yields nil type.
|
|
20
|
+
build_committee(data[:committee_bare], form: "short")
|
|
21
|
+
elsif data[:committee_long_fr]
|
|
22
|
+
build_committee(data[:committee_long_fr], form: "long", language: "F")
|
|
23
|
+
elsif data[:meeting_en]
|
|
24
|
+
build_meeting(data[:meeting_en])
|
|
25
|
+
elsif data[:meeting_fr]
|
|
26
|
+
build_meeting(data[:meeting_fr], language: "F")
|
|
27
|
+
elsif data.key?(:metrologia)
|
|
28
|
+
build_metrologia(data[:metrologia])
|
|
29
|
+
elsif data[:si_brochure]
|
|
30
|
+
build_si_brochure(data[:si_brochure])
|
|
31
|
+
elsif data[:si_brochure_variant]
|
|
32
|
+
build_si_brochure_variant(data[:si_brochure_variant])
|
|
33
|
+
elsif data.key?(:si_brochure_section)
|
|
34
|
+
build_si_brochure_section(data[:si_brochure_section])
|
|
35
|
+
elsif data[:mep]
|
|
36
|
+
build_mep(data[:mep])
|
|
37
|
+
elsif data[:guide]
|
|
38
|
+
build_guide(data[:guide])
|
|
39
|
+
else
|
|
40
|
+
raise "Unrecognized BIPM parse tree: #{data.inspect}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
# `group` and `language` are normalized here, so a historic committee
|
|
47
|
+
# name (CCDS) and a two-letter language code (EN/FR) never reach an
|
|
48
|
+
# attribute — the index stores only the current name and the one-letter
|
|
49
|
+
# code BIPM prints.
|
|
50
|
+
def build_committee(node, form:, language: nil)
|
|
51
|
+
Identifiers::CommitteeDocument.new(
|
|
52
|
+
group: Identifier.normalize_group(node[:group]),
|
|
53
|
+
type_code: Identifier::TYPE_WORD_TO_CODE[node[:type_word].to_s],
|
|
54
|
+
number: node[:number]&.to_s,
|
|
55
|
+
year: node[:year]&.to_s&.to_i,
|
|
56
|
+
language: Identifier.normalize_language(language || node[:language]),
|
|
57
|
+
form: form,
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def build_meeting(node, language: nil)
|
|
62
|
+
Identifiers::Meeting.new(
|
|
63
|
+
group: Identifier.normalize_group(node[:group]),
|
|
64
|
+
number: node[:number].to_s,
|
|
65
|
+
year: node[:year]&.to_s&.to_i,
|
|
66
|
+
language: Identifier.normalize_language(language || node[:language]),
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# `number` is the volume, so every article of a volume clusters into one
|
|
71
|
+
# relaton-index bucket (the IETF draft-slug / IANA registry-slug
|
|
72
|
+
# convention). It is nil only for the journal-level record, which carries
|
|
73
|
+
# no volume at all.
|
|
74
|
+
#
|
|
75
|
+
# It is deliberately redundant with `volume`, which stays because the
|
|
76
|
+
# renderer and the URN generator read it. Two limits of that redundancy,
|
|
77
|
+
# both accepted rather than engineered around (see the note above
|
|
78
|
+
# NUMBER_SOURCE_ATTRIBUTES in identifier.rb for the half that IS
|
|
79
|
+
# handled):
|
|
80
|
+
#
|
|
81
|
+
# * THE BUILDER IS THE CONSTRUCTOR OF RECORD. A caller that bypasses it
|
|
82
|
+
# — `MetrologiaArticle.new(volume: 51, …)` — gets a nil `number` and
|
|
83
|
+
# so an empty index key. Deriving it in `initialize` instead would
|
|
84
|
+
# cover that, but `#exclude` rebuilds through `self.class.new`, so it
|
|
85
|
+
# would also silently re-fill a `number` the caller just excluded.
|
|
86
|
+
# * NO SELF-HEALING ACROSS from_hash. lutaml assigns attributes AFTER
|
|
87
|
+
# `initialize`, so a legacy pre-`number` index row (one carrying only
|
|
88
|
+
# `volume`) deserializes with `number` nil and no error at all —
|
|
89
|
+
# lutaml ignores unknown keys and relaton's `id_supported?` skips its
|
|
90
|
+
# round-trip check for concrete subclasses, which every BIPM id is.
|
|
91
|
+
# relaton-data-bipm must regenerate index-v2 to gain the key. This is
|
|
92
|
+
# weaker than the IEEE `CodeNumber` mixin, which rebuilds `code_obj`
|
|
93
|
+
# from its split columns after `from_hash`.
|
|
94
|
+
def build_metrologia(node)
|
|
95
|
+
node = {} unless node.is_a?(Hash)
|
|
96
|
+
Identifiers::MetrologiaArticle.new(
|
|
97
|
+
number: node[:volume]&.to_s,
|
|
98
|
+
issue: node[:issue]&.to_s,
|
|
99
|
+
article: node[:article]&.to_s,
|
|
100
|
+
)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# The SI Brochure has no document number of its own, so the edition is
|
|
104
|
+
# the index key — it clusters the English and French records of one
|
|
105
|
+
# edition. The grammar makes `edition` mandatory here, so it is never nil.
|
|
106
|
+
def build_si_brochure(node)
|
|
107
|
+
Identifiers::SiBrochure.new(
|
|
108
|
+
number: node[:edition].to_s,
|
|
109
|
+
edition: node[:edition].to_s,
|
|
110
|
+
version: node[:version].to_s,
|
|
111
|
+
years: node[:years].to_s,
|
|
112
|
+
language: Identifier.normalize_language(node[:language]),
|
|
113
|
+
)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# The derived products (Appendix N, Concise, FAQ) carry no edition, so
|
|
117
|
+
# the variant name is their key. The grammar makes it mandatory here.
|
|
118
|
+
def build_si_brochure_variant(node)
|
|
119
|
+
variant = node[:variant].to_s
|
|
120
|
+
Identifiers::SiBrochure.new(number: variant, variant: variant)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# A bare or sectioned reference names no edition, so it gets no key: it is
|
|
124
|
+
# a partial reference that wildcards every edition. The bare form captures
|
|
125
|
+
# nothing, so the parser hands back a slice rather than a hash.
|
|
126
|
+
def build_si_brochure_section(node)
|
|
127
|
+
node = {} unless node.is_a?(Hash)
|
|
128
|
+
Identifiers::SiBrochure.new(part: node[:part]&.to_s)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# The Appendix/Annex/Part tail is the full-content spelling of the SAME
|
|
132
|
+
# document, so it stays out of the key.
|
|
133
|
+
def build_mep(node)
|
|
134
|
+
Identifiers::Mep.new(
|
|
135
|
+
**mep_codes(node),
|
|
136
|
+
appendix: node[:appendix]&.to_s,
|
|
137
|
+
annex: node[:annex]&.to_s,
|
|
138
|
+
part: node[:part]&.to_s,
|
|
139
|
+
)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# A MEP is identified by its unit code, or by the report code for the
|
|
143
|
+
# `Rapport BIPM-YYYY/NN` variant; exactly one of the two is set, and
|
|
144
|
+
# whichever it is becomes the relaton index key.
|
|
145
|
+
def mep_codes(node)
|
|
146
|
+
mep_code = node[:mep_code]&.to_s
|
|
147
|
+
report_code = node[:report_code]&.to_s
|
|
148
|
+
{ number: mep_code || report_code, mep_code: mep_code,
|
|
149
|
+
report_code: report_code }
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def build_guide(node)
|
|
153
|
+
Identifiers::Guide.new(
|
|
154
|
+
group: Identifier.normalize_group(node[:group]),
|
|
155
|
+
guide_kind: node[:guide_kind].to_s,
|
|
156
|
+
number: node[:number].to_s,
|
|
157
|
+
appendix: node[:appendix]&.to_s,
|
|
158
|
+
part: node[:part]&.to_s,
|
|
159
|
+
)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|