pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4
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 +5 -1
- data/data/nist/update_codes.yaml +25 -0
- data/lib/pubid/amca/builder.rb +2 -2
- data/lib/pubid/amca/identifier.rb +4 -55
- data/lib/pubid/amca/identifiers/base.rb +58 -47
- data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
- data/lib/pubid/amca/identifiers/publication.rb +0 -17
- data/lib/pubid/amca/identifiers/standard.rb +0 -4
- data/lib/pubid/amca/renderer.rb +82 -0
- data/lib/pubid/amca/single_identifier.rb +0 -23
- data/lib/pubid/amca/urn_generator.rb +2 -1
- data/lib/pubid/amca/urn_parser.rb +28 -0
- data/lib/pubid/amca.rb +42 -1
- data/lib/pubid/ansi/builder.rb +5 -3
- data/lib/pubid/ansi/identifier.rb +1 -43
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
- data/lib/pubid/ansi/identifiers/standard.rb +2 -3
- data/lib/pubid/ansi/renderer.rb +53 -0
- data/lib/pubid/ansi/single_identifier.rb +2 -31
- data/lib/pubid/ansi/urn_generator.rb +3 -38
- data/lib/pubid/ansi/urn_parser.rb +23 -0
- data/lib/pubid/ansi.rb +38 -3
- data/lib/pubid/api/builder.rb +33 -74
- data/lib/pubid/api/identifier.rb +5 -52
- data/lib/pubid/api/identifiers/base.rb +2 -14
- data/lib/pubid/api/identifiers/bulletin.rb +0 -2
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
- data/lib/pubid/api/identifiers/mpms.rb +0 -20
- data/lib/pubid/api/identifiers/publication.rb +0 -2
- data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
- data/lib/pubid/api/identifiers/specification.rb +0 -2
- data/lib/pubid/api/identifiers/standard.rb +0 -2
- data/lib/pubid/api/identifiers/technical_report.rb +0 -2
- data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
- data/lib/pubid/api/identifiers.rb +18 -0
- data/lib/pubid/api/renderer.rb +89 -0
- data/lib/pubid/api/single_identifier.rb +5 -20
- data/lib/pubid/api/urn_generator.rb +0 -18
- data/lib/pubid/api/urn_parser.rb +35 -0
- data/lib/pubid/api.rb +51 -5
- data/lib/pubid/ashrae/builder.rb +3 -3
- data/lib/pubid/ashrae/identifier.rb +7 -55
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
- data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
- data/lib/pubid/ashrae/identifiers/base.rb +29 -15
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
- data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
- data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
- data/lib/pubid/ashrae/parser.rb +4 -0
- data/lib/pubid/ashrae/renderer.rb +117 -0
- data/lib/pubid/ashrae/single_identifier.rb +0 -13
- data/lib/pubid/ashrae/urn_generator.rb +0 -8
- data/lib/pubid/ashrae/urn_parser.rb +27 -0
- data/lib/pubid/ashrae.rb +46 -1
- data/lib/pubid/asme/components/code.rb +10 -2
- data/lib/pubid/asme/identifier.rb +0 -46
- data/lib/pubid/asme/identifiers/base.rb +0 -60
- data/lib/pubid/asme/renderer.rb +66 -0
- data/lib/pubid/asme/single_identifier.rb +3 -1
- data/lib/pubid/asme/urn_parser.rb +31 -0
- data/lib/pubid/asme.rb +42 -1
- data/lib/pubid/astm/components/code.rb +9 -0
- data/lib/pubid/{jis → astm}/components.rb +1 -1
- data/lib/pubid/astm/identifier.rb +0 -77
- data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
- data/lib/pubid/astm/identifiers/data_series.rb +0 -14
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
- data/lib/pubid/astm/identifiers/manual.rb +0 -27
- data/lib/pubid/astm/identifiers/monograph.rb +0 -14
- data/lib/pubid/astm/identifiers/research_report.rb +0 -7
- data/lib/pubid/astm/identifiers/standard.rb +0 -39
- data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
- data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
- data/lib/pubid/astm/identifiers.rb +18 -0
- data/lib/pubid/astm/renderer.rb +172 -0
- data/lib/pubid/astm/single_identifier.rb +3 -11
- data/lib/pubid/astm/urn_parser.rb +30 -0
- data/lib/pubid/astm.rb +39 -27
- data/lib/pubid/bsi/builder.rb +21 -12
- data/lib/pubid/bsi/identifier.rb +5 -85
- data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
- data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
- data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
- data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
- data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
- data/lib/pubid/bsi/identifiers/disc.rb +0 -29
- data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
- data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
- data/lib/pubid/bsi/identifiers/flex.rb +0 -35
- data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
- data/lib/pubid/bsi/identifiers/index.rb +0 -32
- data/lib/pubid/bsi/identifiers/method.rb +0 -41
- data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
- data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
- data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
- data/lib/pubid/bsi/identifiers/section.rb +0 -30
- data/lib/pubid/bsi/identifiers/set.rb +3 -20
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
- data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
- data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
- data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
- data/lib/pubid/bsi/identifiers.rb +0 -1
- data/lib/pubid/bsi/renderer.rb +1050 -0
- data/lib/pubid/bsi/single_identifier.rb +33 -78
- data/lib/pubid/bsi/urn_generator.rb +2 -3
- data/lib/pubid/bsi/urn_parser.rb +52 -0
- data/lib/pubid/bsi.rb +232 -2
- data/lib/pubid/builder/base.rb +57 -10
- data/lib/pubid/bundled_identifier.rb +0 -1
- data/lib/pubid/ccsds/builder.rb +4 -3
- data/lib/pubid/ccsds/identifier.rb +53 -68
- data/lib/pubid/ccsds/identifiers/base.rb +11 -61
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
- data/lib/pubid/ccsds/parser.rb +4 -2
- data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
- data/lib/pubid/ccsds/urn_generator.rb +3 -3
- data/lib/pubid/ccsds/urn_parser.rb +20 -0
- data/lib/pubid/ccsds.rb +39 -1
- data/lib/pubid/cen_cenelec/builder.rb +12 -14
- data/lib/pubid/cen_cenelec/identifier.rb +11 -40
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
- data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
- data/lib/pubid/cen_cenelec/renderer.rb +261 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
- data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
- data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
- data/lib/pubid/cen_cenelec.rb +172 -1
- data/lib/pubid/cie/components/code.rb +8 -0
- data/lib/pubid/cie/identifier.rb +10 -57
- data/lib/pubid/cie/single_identifier.rb +4 -4
- data/lib/pubid/cie/urn_parser.rb +28 -0
- data/lib/pubid/cie.rb +47 -1
- data/lib/pubid/components/adoption.rb +104 -0
- data/lib/pubid/components/code.rb +22 -8
- data/lib/pubid/components/date.rb +23 -16
- data/lib/pubid/components/edition.rb +9 -6
- data/lib/pubid/components/iteration.rb +32 -0
- data/lib/pubid/components/language.rb +6 -4
- data/lib/pubid/components/locality.rb +10 -1
- data/lib/pubid/components/publisher.rb +9 -6
- data/lib/pubid/components/relationship.rb +151 -0
- data/lib/pubid/components/stage.rb +5 -14
- data/lib/pubid/components/supplement.rb +184 -0
- data/lib/pubid/components/type.rb +5 -15
- data/lib/pubid/components/typed_stage.rb +10 -11
- data/lib/pubid/components.rb +4 -1
- data/lib/pubid/core/update_codes.rb +28 -7
- data/lib/pubid/csa/identifier.rb +9 -59
- data/lib/pubid/csa/identifiers/base.rb +0 -123
- data/lib/pubid/csa/identifiers/cec.rb +0 -103
- data/lib/pubid/csa/identifiers/series.rb +0 -104
- data/lib/pubid/csa/renderer.rb +292 -0
- data/lib/pubid/csa/single_identifier.rb +1 -1
- data/lib/pubid/csa/urn_generator.rb +1 -1
- data/lib/pubid/csa/urn_parser.rb +33 -0
- data/lib/pubid/csa.rb +46 -1
- data/lib/pubid/etsi/components/code.rb +10 -9
- data/lib/pubid/etsi/components/version.rb +0 -5
- data/lib/pubid/etsi/identifier.rb +4 -55
- data/lib/pubid/etsi/identifiers/base.rb +31 -27
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
- data/lib/pubid/etsi/renderer.rb +42 -0
- data/lib/pubid/etsi/urn_parser.rb +34 -0
- data/lib/pubid/etsi.rb +44 -1
- data/lib/pubid/export/exporter.rb +4 -46
- data/lib/pubid/export/flavor_exporter.rb +111 -278
- data/lib/pubid/export.rb +0 -6
- data/lib/pubid/identifier.rb +92 -18
- data/lib/pubid/identifier_metadata.rb +1 -1
- data/lib/pubid/idf/builder.rb +3 -3
- data/lib/pubid/idf/identifier.rb +7 -66
- data/lib/pubid/idf/identifiers/amendment.rb +2 -1
- data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
- data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
- data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
- data/lib/pubid/idf/parser.rb +3 -2
- data/lib/pubid/idf/renderer.rb +84 -0
- data/lib/pubid/idf/supplement_identifier.rb +2 -10
- data/lib/pubid/idf/urn_generator.rb +4 -39
- data/lib/pubid/idf/urn_parser.rb +25 -0
- data/lib/pubid/idf.rb +55 -1
- data/lib/pubid/iec/builder.rb +46 -64
- data/lib/pubid/iec/components/code.rb +8 -32
- data/lib/pubid/iec/components/publisher.rb +0 -1
- data/lib/pubid/iec/components.rb +14 -0
- data/lib/pubid/iec/identifier.rb +251 -213
- data/lib/pubid/iec/identifiers/amendment.rb +2 -3
- data/lib/pubid/iec/identifiers/base.rb +5 -33
- data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
- data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
- data/lib/pubid/iec/identifiers/guide.rb +0 -2
- data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
- data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
- data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
- data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
- data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
- data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
- data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
- data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
- data/lib/pubid/iec/identifiers/working_document.rb +2 -50
- data/lib/pubid/iec/identifiers.rb +30 -0
- data/lib/pubid/iec/parser.rb +13 -12
- data/lib/pubid/iec/renderer.rb +254 -0
- data/lib/pubid/iec/single_identifier.rb +6 -12
- data/lib/pubid/iec/supplement_identifier.rb +58 -54
- data/lib/pubid/iec/urn_generator.rb +3 -3
- data/lib/pubid/iec/urn_parser.rb +3 -3
- data/lib/pubid/iec.rb +43 -67
- data/lib/pubid/ieee/builder.rb +12 -12
- data/lib/pubid/ieee/components/code.rb +8 -0
- data/lib/pubid/ieee/components/draft.rb +14 -0
- data/lib/pubid/ieee/components/relationship.rb +5 -149
- data/lib/pubid/ieee/identifier.rb +5 -52
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
- data/lib/pubid/ieee/identifiers/base.rb +221 -556
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
- data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
- data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
- data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
- data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
- data/lib/pubid/ieee/identifiers/standard.rb +1 -1
- data/lib/pubid/ieee/pre_parser.rb +301 -0
- data/lib/pubid/ieee/renderer.rb +307 -0
- data/lib/pubid/ieee/urn_parser.rb +34 -0
- data/lib/pubid/ieee.rb +66 -1
- data/lib/pubid/ieee_debug.rb +0 -1
- data/lib/pubid/iho/builder.rb +2 -2
- data/lib/pubid/iho/identifier.rb +7 -59
- data/lib/pubid/iho/identifiers/base.rb +64 -31
- data/lib/pubid/iho/parser.rb +3 -3
- data/lib/pubid/iho/renderer.rb +30 -0
- data/lib/pubid/iho/urn_generator.rb +2 -2
- data/lib/pubid/iho/urn_parser.rb +58 -0
- data/lib/pubid/iho.rb +52 -1
- data/lib/pubid/iso/builder.rb +55 -53
- data/lib/pubid/iso/bundled_identifier.rb +51 -0
- data/lib/pubid/iso/components/code.rb +7 -19
- data/lib/pubid/iso/components/publisher.rb +10 -8
- data/lib/pubid/iso/components.rb +2 -4
- data/lib/pubid/iso/identifier.rb +219 -252
- data/lib/pubid/iso/identifiers/addendum.rb +9 -6
- data/lib/pubid/iso/identifiers/amendment.rb +8 -4
- data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/iso/identifiers/data.rb +0 -1
- data/lib/pubid/iso/identifiers/directives.rb +8 -2
- data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
- data/lib/pubid/iso/identifiers/extract.rb +2 -2
- data/lib/pubid/iso/identifiers/guide.rb +0 -1
- data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
- data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
- data/lib/pubid/iso/identifiers/pas.rb +2 -2
- data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
- data/lib/pubid/iso/identifiers/supplement.rb +11 -3
- data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
- data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
- data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
- data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
- data/lib/pubid/iso/identifiers.rb +0 -1
- data/lib/pubid/iso/normalizer.rb +89 -0
- data/lib/pubid/iso/parser.rb +22 -4
- data/lib/pubid/iso/single_identifier.rb +0 -4
- data/lib/pubid/iso/supplement_identifier.rb +15 -2
- data/lib/pubid/iso/urn_generator.rb +66 -182
- data/lib/pubid/iso/urn_parser.rb +12 -7
- data/lib/pubid/iso.rb +177 -2
- data/lib/pubid/itu/builder.rb +0 -12
- data/lib/pubid/itu/components/code.rb +9 -7
- data/lib/pubid/itu/components/sector.rb +15 -4
- data/lib/pubid/itu/components/series.rb +0 -4
- data/lib/pubid/itu/components.rb +11 -0
- data/lib/pubid/itu/identifier.rb +4 -116
- data/lib/pubid/itu/identifiers/amendment.rb +0 -2
- data/lib/pubid/itu/identifiers/annex.rb +0 -2
- data/lib/pubid/itu/identifiers/base.rb +124 -128
- data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
- data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
- data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
- data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
- data/lib/pubid/itu/identifiers/supplement.rb +0 -2
- data/lib/pubid/itu/urn_parser.rb +23 -0
- data/lib/pubid/itu.rb +44 -1
- data/lib/pubid/jcgm/builder.rb +16 -8
- data/lib/pubid/jcgm/identifier.rb +0 -43
- data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
- data/lib/pubid/jcgm/renderer.rb +68 -0
- data/lib/pubid/jcgm/single_identifier.rb +0 -8
- data/lib/pubid/jcgm/urn_generator.rb +4 -6
- data/lib/pubid/jcgm/urn_parser.rb +23 -0
- data/lib/pubid/jcgm.rb +43 -2
- data/lib/pubid/jis/builder.rb +44 -52
- data/lib/pubid/jis/identifier.rb +120 -46
- data/lib/pubid/jis/identifiers/amendment.rb +1 -1
- data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
- data/lib/pubid/jis/identifiers/standard.rb +2 -1
- data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
- data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
- data/lib/pubid/jis/identifiers.rb +1 -1
- data/lib/pubid/jis/parser.rb +31 -5
- data/lib/pubid/jis/renderer.rb +69 -0
- data/lib/pubid/jis/single_identifier.rb +6 -12
- data/lib/pubid/jis/supplement_identifier.rb +17 -14
- data/lib/pubid/jis/urn_parser.rb +23 -0
- data/lib/pubid/jis.rb +42 -2
- data/lib/pubid/nist/builder.rb +63 -1871
- data/lib/pubid/nist/caster.rb +1272 -0
- data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
- data/lib/pubid/nist/components/code.rb +9 -20
- data/lib/pubid/nist/components/supplement.rb +2 -2
- data/lib/pubid/nist/components.rb +0 -1
- data/lib/pubid/nist/identifier.rb +8 -60
- data/lib/pubid/nist/identifiers/base.rb +564 -492
- data/lib/pubid/nist/identifiers/circular.rb +7 -2
- data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
- data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
- data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
- data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
- data/lib/pubid/nist/identifiers/handbook.rb +2 -1
- data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
- data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
- data/lib/pubid/nist/identifiers/monograph.rb +7 -3
- data/lib/pubid/nist/identifiers/report.rb +4 -2
- data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
- data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
- data/lib/pubid/nist/identifiers.rb +1 -0
- data/lib/pubid/nist/parser.rb +62 -452
- data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
- data/lib/pubid/nist/preprocessor.rb +428 -0
- data/lib/pubid/nist/renderer.rb +43 -0
- data/lib/pubid/nist/router.rb +148 -0
- data/lib/pubid/nist/series/base.rb +58 -0
- data/lib/pubid/nist/series/crpl.rb +13 -0
- data/lib/pubid/nist/series/fips.rb +14 -0
- data/lib/pubid/nist/series/ir.rb +60 -0
- data/lib/pubid/nist/series/letter_preserving.rb +15 -0
- data/lib/pubid/nist/series/mono.rb +19 -0
- data/lib/pubid/nist/series/ncstar.rb +20 -0
- data/lib/pubid/nist/series.rb +49 -0
- data/lib/pubid/nist/supplement_identifier.rb +3 -1
- data/lib/pubid/nist/urn_parser.rb +67 -0
- data/lib/pubid/nist.rb +86 -4
- data/lib/pubid/oiml/builder.rb +21 -3
- data/lib/pubid/oiml/components/code.rb +17 -0
- data/lib/pubid/oiml/identifier.rb +40 -46
- data/lib/pubid/oiml/identifiers/annex.rb +13 -46
- data/lib/pubid/oiml/identifiers/errata.rb +15 -0
- data/lib/pubid/oiml/identifiers.rb +1 -1
- data/lib/pubid/oiml/parser.rb +59 -12
- data/lib/pubid/oiml/renderer.rb +171 -0
- data/lib/pubid/oiml/single_identifier.rb +61 -42
- data/lib/pubid/oiml/supplement_identifier.rb +31 -17
- data/lib/pubid/oiml/urn_generator.rb +0 -8
- data/lib/pubid/oiml/urn_parser.rb +22 -0
- data/lib/pubid/oiml.rb +42 -1
- data/lib/pubid/plateau/identifier.rb +4 -55
- data/lib/pubid/plateau/identifiers/base.rb +45 -36
- data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
- data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
- data/lib/pubid/plateau/renderer.rb +51 -0
- data/lib/pubid/plateau/supplement_identifier.rb +0 -4
- data/lib/pubid/plateau/urn_parser.rb +43 -0
- data/lib/pubid/plateau.rb +43 -1
- data/lib/pubid/renderers/directives_renderer.rb +22 -8
- data/lib/pubid/renderers/guide_renderer.rb +4 -2
- data/lib/pubid/renderers/human_readable.rb +18 -7
- data/lib/pubid/rendering/context.rb +28 -19
- data/lib/pubid/rendering.rb +0 -3
- data/lib/pubid/sae/components/date.rb +8 -0
- data/lib/pubid/sae/components/type.rb +5 -1
- data/lib/pubid/sae/identifier.rb +4 -35
- data/lib/pubid/sae/identifiers/base.rb +26 -31
- data/lib/pubid/sae/renderer.rb +36 -0
- data/lib/pubid/sae/urn_generator.rb +2 -10
- data/lib/pubid/sae/urn_parser.rb +36 -0
- data/lib/pubid/sae.rb +42 -1
- data/lib/pubid/urn_generator/base.rb +12 -12
- data/lib/pubid/urn_parser/base.rb +81 -0
- data/lib/pubid/urn_parser/errors.rb +9 -0
- data/lib/pubid/urn_parser.rb +14 -0
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid.rb +45 -7
- data/lib/tasks/export.rake +6 -5
- data/lib/tasks/website-data.json +1940 -1882
- metadata +75 -45
- data/lib/pubid/amca/scheme.rb +0 -16
- data/lib/pubid/ansi/scheme.rb +0 -15
- data/lib/pubid/api/scheme.rb +0 -66
- data/lib/pubid/ashrae/scheme.rb +0 -53
- data/lib/pubid/asme/scheme.rb +0 -37
- data/lib/pubid/astm/scheme.rb +0 -55
- data/lib/pubid/bsi/identifiers/base.rb +0 -11
- data/lib/pubid/bsi/scheme.rb +0 -243
- data/lib/pubid/ccsds/scheme.rb +0 -57
- data/lib/pubid/cen_cenelec/scheme.rb +0 -164
- data/lib/pubid/cie/scheme.rb +0 -64
- data/lib/pubid/components/factory.rb +0 -50
- data/lib/pubid/csa/scheme.rb +0 -44
- data/lib/pubid/etsi/scheme.rb +0 -42
- data/lib/pubid/export/data_class_exporter.rb +0 -59
- data/lib/pubid/export/ieee_exporter.rb +0 -78
- data/lib/pubid/export/itu_exporter.rb +0 -66
- data/lib/pubid/export/nist_exporter.rb +0 -64
- data/lib/pubid/export/registry_exporter.rb +0 -90
- data/lib/pubid/export/scheme_exporter.rb +0 -70
- data/lib/pubid/identifier_registry.rb +0 -198
- data/lib/pubid/idf/scheme.rb +0 -61
- data/lib/pubid/iec/scheme.rb +0 -71
- data/lib/pubid/ieee/scheme.rb +0 -90
- data/lib/pubid/iho/scheme.rb +0 -29
- data/lib/pubid/iso/identifiers/base.rb +0 -115
- data/lib/pubid/iso/scheme.rb +0 -193
- data/lib/pubid/itu/scheme.rb +0 -174
- data/lib/pubid/jcgm/scheme.rb +0 -60
- data/lib/pubid/jis/components/code.rb +0 -59
- data/lib/pubid/jis/identifiers/base.rb +0 -72
- data/lib/pubid/jis/scheme.rb +0 -49
- data/lib/pubid/nist/components/publisher.rb +0 -24
- data/lib/pubid/nist/scheme.rb +0 -199
- data/lib/pubid/oiml/identifiers/base.rb +0 -36
- data/lib/pubid/oiml/scheme.rb +0 -46
- data/lib/pubid/plateau/scheme.rb +0 -45
- data/lib/pubid/rendering/base.rb +0 -73
- data/lib/pubid/rendering/common.rb +0 -211
- data/lib/pubid/rendering/format.rb +0 -25
- data/lib/pubid/sae/scheme.rb +0 -47
- data/lib/pubid/scheme.rb +0 -219
data/lib/pubid/iso/identifier.rb
CHANGED
|
@@ -3,17 +3,66 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Iso
|
|
5
5
|
class Identifier < ::Pubid::Identifier
|
|
6
|
-
# Override base types with ISO-specific ones
|
|
7
|
-
|
|
6
|
+
# Override base types with ISO-specific ones.
|
|
7
|
+
# Defaults to the type's implied publisher (ISO for most; IWA has none),
|
|
8
|
+
# so an omitted publisher key reconstructs correctly on from_hash.
|
|
9
|
+
attribute :publisher, ::Pubid::Iso::Components::Publisher,
|
|
10
|
+
default: -> { self.class.default_publisher }
|
|
8
11
|
attribute :copublishers, ::Pubid::Iso::Components::Publisher,
|
|
9
12
|
collection: true
|
|
13
|
+
|
|
14
|
+
# The publisher implied when none is serialized. ISO for most types;
|
|
15
|
+
# publisher-less types (IWA) override this to nil.
|
|
16
|
+
def self.default_publisher
|
|
17
|
+
::Pubid::Iso::Components::Publisher.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# typed_stage is the single source of truth for stage (and, with the class,
|
|
21
|
+
# the doctype). Default to the class's published typed_stage, so an omitted
|
|
22
|
+
# "stage" key reconstructs the published state on from_hash.
|
|
23
|
+
attribute :typed_stage, ::Pubid::Components::TypedStage,
|
|
24
|
+
default: -> { self.class.published_typed_stage }
|
|
25
|
+
|
|
26
|
+
# The class's published typed_stage (canonical surface form), or nil for
|
|
27
|
+
# types with no stages (e.g. TC documents).
|
|
28
|
+
def self.published_typed_stage
|
|
29
|
+
return nil unless const_defined?(:TYPED_STAGES)
|
|
30
|
+
|
|
31
|
+
ts = self::TYPED_STAGES.find { |t| t.stage_code.to_s == "published" }
|
|
32
|
+
return nil unless ts
|
|
33
|
+
|
|
34
|
+
ts = ts.dup
|
|
35
|
+
ts.original_abbr = ts.canonical_abbreviation
|
|
36
|
+
ts
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# type and stage are derived from typed_stage, never stored — so the
|
|
40
|
+
# doctype (fixed by the class / _type) can't be lost when "stage" is
|
|
41
|
+
# omitted for the published default.
|
|
42
|
+
def type
|
|
43
|
+
typed_stage&.to_type
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def stage
|
|
47
|
+
typed_stage&.to_stage
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Return a copy with the lifecycle stage set from an ISO harmonized stage
|
|
51
|
+
# code (e.g. "90.92"). typed_stage is the single source of truth, so this
|
|
52
|
+
# is all that is needed to surface the stage in #to_s and #to_urn. Returns
|
|
53
|
+
# an unchanged copy if the code is not recognised.
|
|
54
|
+
def with_harmonized_stage(harmonized_code)
|
|
55
|
+
ts = Pubid::Iso.locate_stage_by_harmonized_code(harmonized_code)
|
|
56
|
+
ts ? dup.tap { |id| id.typed_stage = ts } : dup
|
|
57
|
+
end
|
|
58
|
+
|
|
10
59
|
attribute :number, ::Pubid::Iso::Components::Code
|
|
11
60
|
attribute :part, ::Pubid::Iso::Components::Code
|
|
12
61
|
attribute :subpart, ::Pubid::Iso::Components::Code
|
|
13
62
|
|
|
14
63
|
# Polymorphic type map for lutaml::Model key_value serialization
|
|
15
64
|
# Maps polymorphic_name → class name for deserialization
|
|
16
|
-
# Validated by spec to stay in sync with
|
|
65
|
+
# Validated by spec to stay in sync with identifier_types
|
|
17
66
|
ISO_TYPE_MAP = {
|
|
18
67
|
"pubid:iso:international-standard" => "Pubid::Iso::Identifiers::InternationalStandard",
|
|
19
68
|
"pubid:iso:international-standardized-profile" => "Pubid::Iso::Identifiers::InternationalStandardizedProfile",
|
|
@@ -33,298 +82,216 @@ module Pubid
|
|
|
33
82
|
"pubid:iso:data" => "Pubid::Iso::Identifiers::Data",
|
|
34
83
|
"pubid:iso:tc-document" => "Pubid::Iso::Identifiers::TcDocument",
|
|
35
84
|
"pubid:iso:technology-trends-assessments" => "Pubid::Iso::Identifiers::TechnologyTrendsAssessments",
|
|
85
|
+
"pubid:iso:bundled-identifier" => "Pubid::Iso::BundledIdentifier",
|
|
36
86
|
}.freeze
|
|
37
87
|
|
|
38
|
-
#
|
|
88
|
+
# BundledIdentifier lives outside Pubid::Iso::Identifiers but carries a
|
|
89
|
+
# polymorphic `_type`, so the shared polymorphic_type_map needs it
|
|
90
|
+
# explicitly (see Pubid::Identifier#additional_identifier_classes).
|
|
91
|
+
def self.additional_identifier_classes
|
|
92
|
+
[Pubid::Iso::BundledIdentifier]
|
|
93
|
+
end
|
|
94
|
+
private_class_method :additional_identifier_classes
|
|
95
|
+
|
|
96
|
+
# Build type map from Pubid::Iso.identifier_types for validation
|
|
39
97
|
def self.build_type_map
|
|
40
|
-
|
|
98
|
+
Pubid::Iso.identifier_types.to_h do |klass|
|
|
41
99
|
[klass.polymorphic_name, klass.name]
|
|
42
100
|
end
|
|
43
101
|
end
|
|
44
102
|
|
|
103
|
+
# The base Pubid::Identifier no longer auto-maps attributes, so each
|
|
104
|
+
# flavor's top class must declare its own key_value mapping. Subclasses
|
|
105
|
+
# merge their own blocks on top of this one (e.g. SupplementIdentifier
|
|
106
|
+
# adds base_identifier; Directives adds subgroup), so list every base
|
|
107
|
+
# attribute ISO serializes here once.
|
|
45
108
|
key_value do
|
|
46
109
|
map "_type", to: :_type, polymorphic_map: ISO_TYPE_MAP
|
|
110
|
+
# Code components serialize as their plain string value, not {value,number}.
|
|
111
|
+
map "number", with: { to: :number_to_kv, from: :number_from_kv }
|
|
112
|
+
map "part", with: { to: :part_to_kv, from: :part_from_kv }
|
|
113
|
+
map "subpart", with: { to: :subpart_to_kv, from: :subpart_from_kv }
|
|
114
|
+
map "stage_iteration",
|
|
115
|
+
with: { to: :stage_iteration_to_kv, from: :stage_iteration_from_kv }
|
|
116
|
+
# date serialized flat as year/month/day, nils omitted.
|
|
117
|
+
map "year", with: { to: :year_to_kv, from: :year_from_kv }
|
|
118
|
+
map "month", with: { to: :month_to_kv, from: :month_from_kv }
|
|
119
|
+
map "day", with: { to: :day_to_kv, from: :day_from_kv }
|
|
120
|
+
map "edition", to: :edition
|
|
121
|
+
map "languages", to: :languages
|
|
122
|
+
# publisher emitted only when the primary isn't the type default;
|
|
123
|
+
# copublishers (the other bodies) as an array, omitted when empty.
|
|
124
|
+
map "publisher", with: { to: :publisher_to_kv, from: :publisher_from_kv }
|
|
125
|
+
map "copublishers", with: { to: :copublishers_to_kv, from: :copublishers_from_kv }
|
|
126
|
+
map "locality", to: :locality
|
|
127
|
+
# `type` and generic `stage` are fully derived from `typed_stage`
|
|
128
|
+
# (builder sets them via to_type/to_stage), so we serialize only the
|
|
129
|
+
# unique typed-stage `code` under "stage" and recompute the rest on
|
|
130
|
+
# load. _type already pins the document type.
|
|
131
|
+
map "stage", with: { to: :stage_to_kv, from: :stage_from_kv }
|
|
132
|
+
# Omit the `false` default; only the meaningful `true` is serialized.
|
|
133
|
+
map "all_parts", with: { to: :all_parts_to_kv, from: :all_parts_from_kv }
|
|
47
134
|
end
|
|
48
135
|
|
|
49
|
-
def
|
|
50
|
-
|
|
136
|
+
def all_parts_to_kv(model, doc)
|
|
137
|
+
return unless model.all_parts
|
|
51
138
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Pubid::Parsers::MrString.parse(string)
|
|
57
|
-
else
|
|
58
|
-
parsed = Pubid::Iso::Parser.new.parse(string)
|
|
59
|
-
if parsed.nil? || parsed.empty?
|
|
60
|
-
raise Pubid::Iso::Parser::ParseError,
|
|
61
|
-
"Invalid identifier format"
|
|
62
|
-
end
|
|
139
|
+
doc.add_child(
|
|
140
|
+
Lutaml::KeyValue::DataModel::Element.new("all_parts", true),
|
|
141
|
+
)
|
|
142
|
+
end
|
|
63
143
|
|
|
64
|
-
|
|
65
|
-
|
|
144
|
+
def all_parts_from_kv(model, value)
|
|
145
|
+
model.all_parts = value
|
|
66
146
|
end
|
|
67
147
|
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# * `type:` (e.g. `:tr`, `:amd`) → lookup via Scheme
|
|
76
|
-
# * else `stage:` (e.g. `"DIS"`, `"AMD"`) → lookup via Scheme
|
|
77
|
-
# * else → InternationalStandard
|
|
78
|
-
#
|
|
79
|
-
# @param type [Symbol, String, nil] type key (`:is`, `:tr`, `:amd`, …)
|
|
80
|
-
# @param stage [String, Symbol, nil] typed-stage abbreviation
|
|
81
|
-
# @param opts [Hash] remaining attribute primitives:
|
|
82
|
-
# :publisher (String), :number, :part, :subpart, :year, :edition,
|
|
83
|
-
# :language
|
|
84
|
-
# @return [Pubid::Iso::Identifier]
|
|
85
|
-
def self.create(type: nil, stage: nil, base: nil, **opts)
|
|
86
|
-
# A bundled directive (e.g. "ISO/IEC DIR 1 + IEC SUP") is stored by the
|
|
87
|
-
# 1.x index as the base document's fields plus a nested joint_document
|
|
88
|
-
# (or a supplements array). The 2.x model is a separate
|
|
89
|
-
# BundledIdentifier; build that so .create round-trips parse.
|
|
90
|
-
if opts[:joint_document] || opts[:supplements]
|
|
91
|
-
return build_bundled(type: type, stage: stage, base: base, **opts)
|
|
92
|
-
end
|
|
148
|
+
# Serialize typed_stage as just its unique code (e.g. "is", "dis",
|
|
149
|
+
# "committee_draft_amd"). type/stage are recomputed from it on load.
|
|
150
|
+
def stage_to_kv(model, doc)
|
|
151
|
+
ts = model.typed_stage
|
|
152
|
+
return unless ts&.code
|
|
153
|
+
# Omit the published default (recomputed from the class on load).
|
|
154
|
+
return if ts.stage_code.to_s == "published"
|
|
93
155
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
abbr: Array(ts.abbr).first.to_s,
|
|
117
|
-
harmonized_stages: Array(ts.harmonized_stages),
|
|
118
|
-
)
|
|
119
|
-
end
|
|
120
|
-
# Build the base_identifier whenever a `base:` is supplied, regardless
|
|
121
|
-
# of whether the resolved class is registered as a supplement (e.g.
|
|
122
|
-
# DirectivesSupplement holds a base but is not in
|
|
123
|
-
# Scheme#supplement_identifiers). Only classes that *require* a base
|
|
124
|
-
# and were given none raise.
|
|
125
|
-
if base
|
|
126
|
-
attrs[:base_identifier] = build_base_identifier(base)
|
|
127
|
-
elsif supplement_klass?(klass)
|
|
128
|
-
raise ArgumentError, "#{klass} requires a base: identifier"
|
|
129
|
-
end
|
|
130
|
-
# For a DirectivesSupplement the top-level `publisher:` names the
|
|
131
|
-
# supplement's own publisher ("… ISO SUP"), not the document's — the
|
|
132
|
-
# document publisher lives on the base. Mirror parse, which records it
|
|
133
|
-
# as `supplement_publisher`.
|
|
134
|
-
if klass <= Identifiers::DirectivesSupplement && attrs.key?(:publisher)
|
|
135
|
-
attrs[:supplement_publisher] = attrs.delete(:publisher)
|
|
136
|
-
attrs.delete(:copublishers)
|
|
137
|
-
end
|
|
138
|
-
klass.new(**attrs)
|
|
156
|
+
doc.add_child(
|
|
157
|
+
Lutaml::KeyValue::DataModel::Element.new("stage", ts.code.to_s),
|
|
158
|
+
)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Resolve the typed-stage code back to the full TypedStage within this
|
|
162
|
+
# identifier's class, then derive type/stage from it.
|
|
163
|
+
def stage_from_kv(model, value)
|
|
164
|
+
return if value.nil? || value.to_s.empty?
|
|
165
|
+
|
|
166
|
+
ts = (model.class.const_defined?(:TYPED_STAGES) &&
|
|
167
|
+
model.class::TYPED_STAGES.find { |t| t.code.to_s == value.to_s }) ||
|
|
168
|
+
Pubid::Iso::Scheme.locate_typed_stage_by_code(value)
|
|
169
|
+
return unless ts
|
|
170
|
+
|
|
171
|
+
# The renderer prefers `original_abbr` (the parsed surface form); without
|
|
172
|
+
# it the supplement renderer falls back to `short_abbr` (e.g. "AMD").
|
|
173
|
+
# Resolving from a code has no surface form, so render the canonical
|
|
174
|
+
# abbreviation (`abbr.first`, e.g. "Amd").
|
|
175
|
+
ts = ts.dup
|
|
176
|
+
ts.original_abbr = ts.canonical_abbreviation
|
|
177
|
+
model.typed_stage = ts
|
|
139
178
|
end
|
|
140
179
|
|
|
141
|
-
#
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
180
|
+
# --- Code components <-> plain string ---
|
|
181
|
+
def number_to_kv(model, doc) = emit_code(doc, "number", model.number)
|
|
182
|
+
def number_from_kv(model, value) = model.number = build_code(value)
|
|
183
|
+
def part_to_kv(model, doc) = emit_code(doc, "part", model.part)
|
|
184
|
+
def part_from_kv(model, value) = model.part = build_code(value)
|
|
185
|
+
def subpart_to_kv(model, doc) = emit_code(doc, "subpart", model.subpart)
|
|
186
|
+
def subpart_from_kv(model, value) = model.subpart = build_code(value)
|
|
187
|
+
|
|
188
|
+
def stage_iteration_to_kv(model, doc)
|
|
189
|
+
iter = model.stage_iteration
|
|
190
|
+
v = iter.is_a?(::Pubid::Components::Iteration) ? iter.number : iter
|
|
191
|
+
return if v.nil? || v.to_s.empty?
|
|
192
|
+
|
|
193
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new("stage_iteration",
|
|
194
|
+
v.to_s))
|
|
151
195
|
end
|
|
152
196
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
# (e.g. "IEC" for "+ IEC SUP"), while parse records it as the supplement's
|
|
156
|
-
# own publisher; move it and drop the nested base + empty top publisher.
|
|
157
|
-
def self.build_joint_supplement(joint)
|
|
158
|
-
j = joint.transform_keys(&:to_sym)
|
|
159
|
-
b = (j[:base] || {}).transform_keys(&:to_sym)
|
|
160
|
-
publisher = b[:publisher].to_s.empty? ? j[:publisher] : b[:publisher]
|
|
161
|
-
create(
|
|
162
|
-
type: j[:type],
|
|
163
|
-
publisher: publisher,
|
|
164
|
-
copublisher: b[:copublisher] || j[:copublisher],
|
|
165
|
-
number: (j[:number] unless j[:number].to_s.empty?),
|
|
166
|
-
year: j[:year],
|
|
167
|
-
)
|
|
197
|
+
def stage_iteration_from_kv(model, value)
|
|
198
|
+
model.stage_iteration = ::Pubid::Components::Iteration.new(number: value.to_s)
|
|
168
199
|
end
|
|
169
200
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
# supplement chains (e.g. a Corrigendum to an Amendment) build cleanly.
|
|
174
|
-
def self.build_base_identifier(base)
|
|
175
|
-
return base if base.is_a?(::Pubid::Identifier)
|
|
201
|
+
def emit_code(doc, key, code)
|
|
202
|
+
v = code.is_a?(::Pubid::Components::Code) ? code.value : code
|
|
203
|
+
return if v.nil? || v.to_s.empty?
|
|
176
204
|
|
|
177
|
-
|
|
205
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new(key, v.to_s))
|
|
178
206
|
end
|
|
179
207
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
# TypedStage (so e.g. TR renders the "/TR" prefix). Returns nil if
|
|
183
|
-
# neither is available; the renderer then omits the stage prefix.
|
|
184
|
-
def self.resolve_create_typed_stage(klass, stage)
|
|
185
|
-
if stage
|
|
186
|
-
ts = locate_create_typed_stage(stage)
|
|
187
|
-
ts && retype_stage_for_class(klass, ts)
|
|
188
|
-
elsif klass.const_defined?(:TYPED_STAGES)
|
|
189
|
-
klass.const_get(:TYPED_STAGES).find do |ts|
|
|
190
|
-
ts.stage_code.to_sym == :published
|
|
191
|
-
end
|
|
192
|
-
end
|
|
208
|
+
def build_code(value)
|
|
209
|
+
::Pubid::Iso::Components::Code.new(value: value.to_s)
|
|
193
210
|
end
|
|
194
211
|
|
|
195
|
-
#
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def
|
|
204
|
-
return
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
harmonized = Array(ts.harmonized_stages)
|
|
209
|
-
return ts if harmonized.empty?
|
|
210
|
-
|
|
211
|
-
klass.const_get(:TYPED_STAGES).find do |s|
|
|
212
|
-
(Array(s.harmonized_stages) & harmonized).any?
|
|
213
|
-
end || ts
|
|
212
|
+
# --- date serialized flat as year/month/day ---
|
|
213
|
+
def year_to_kv(model, doc) = emit_date_part(doc, "year", model.date&.year)
|
|
214
|
+
def year_from_kv(model, value) = date_for(model).year = value.to_s
|
|
215
|
+
def month_to_kv(model, doc) = emit_date_part(doc, "month", model.date&.month)
|
|
216
|
+
def month_from_kv(model, value) = date_for(model).month = value.to_s
|
|
217
|
+
def day_to_kv(model, doc) = emit_date_part(doc, "day", model.date&.day)
|
|
218
|
+
def day_from_kv(model, value) = date_for(model).day = value.to_s
|
|
219
|
+
|
|
220
|
+
def emit_date_part(doc, key, val)
|
|
221
|
+
return if val.nil? || val.to_s.empty?
|
|
222
|
+
|
|
223
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new(key, val.to_s))
|
|
214
224
|
end
|
|
215
225
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
# or a unique per-typed-stage code (:dtr, :fdisp). Try each in turn.
|
|
219
|
-
def self.locate_create_typed_stage(stage)
|
|
220
|
-
Scheme.locate_typed_stage_by_abbr(stage.to_s) ||
|
|
221
|
-
Scheme.locate_typed_stage_by_stage_code(stage) ||
|
|
222
|
-
Scheme.locate_typed_stage_by_code(stage)
|
|
226
|
+
def date_for(model)
|
|
227
|
+
model.date ||= ::Pubid::Components::Date.new
|
|
223
228
|
end
|
|
224
229
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
raise ArgumentError, "Unknown ISO type: #{type.inspect}" unless located
|
|
230
|
+
# --- publisher: primary only when non-default; copublishers as a list ---
|
|
231
|
+
def publisher_to_kv(model, doc)
|
|
232
|
+
pub = model.publisher&.publisher
|
|
233
|
+
return if pub.nil? || pub == model.class.default_publisher&.publisher
|
|
230
234
|
|
|
231
|
-
|
|
232
|
-
elsif stage
|
|
233
|
-
ts = locate_create_typed_stage(stage)
|
|
234
|
-
ts && Scheme.locate_identifier_klass_by_type_code(ts.type_code)
|
|
235
|
-
end
|
|
236
|
-
# A bare `base:` with no type/stage is still a supplement; fall back to
|
|
237
|
-
# the generic Supplement (which can hold a base) rather than
|
|
238
|
-
# InternationalStandard (which cannot).
|
|
239
|
-
klass ||= Identifiers::Supplement if base
|
|
240
|
-
klass || Identifiers::InternationalStandard
|
|
235
|
+
doc.add_child(Lutaml::KeyValue::DataModel::Element.new("publisher", pub))
|
|
241
236
|
end
|
|
242
237
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
# matching the class's :short letter (e.g. type "R" → Recommendation,
|
|
246
|
-
# whose key is :rec and short is "R"). Indexes and legacy data carry
|
|
247
|
-
# either the key, an upper-cased key, or the short form.
|
|
248
|
-
def self.locate_klass_by_type_or_short(type)
|
|
249
|
-
Scheme.locate_identifier_klass_by_type_code(type) ||
|
|
250
|
-
Scheme.locate_identifier_klass_by_type_code(type.to_s.downcase) ||
|
|
251
|
-
Scheme.identifiers.detect { |k| k.type&.dig(:short)&.to_s == type.to_s }
|
|
238
|
+
def publisher_from_kv(model, value)
|
|
239
|
+
publisher_for(model).publisher = value.to_s
|
|
252
240
|
end
|
|
253
241
|
|
|
254
|
-
def
|
|
255
|
-
|
|
242
|
+
def copublishers_to_kv(model, doc)
|
|
243
|
+
cp = model.publisher&.copublisher
|
|
244
|
+
return unless cp&.any?
|
|
245
|
+
|
|
246
|
+
doc.add_child(
|
|
247
|
+
Lutaml::KeyValue::DataModel::Element.new("copublishers", cp.map(&:to_s)),
|
|
248
|
+
)
|
|
256
249
|
end
|
|
257
250
|
|
|
258
|
-
def
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
)
|
|
269
|
-
end
|
|
270
|
-
if opts[:copublisher]
|
|
271
|
-
out[:copublishers] = Array(opts[:copublisher]).map do |c|
|
|
272
|
-
Components::Publisher.new(publisher: c.to_s)
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
%i[number part subpart].each do |k|
|
|
276
|
-
v = opts[k]
|
|
277
|
-
out[k] = Components::Code.new(number: v.to_s) unless v.nil?
|
|
251
|
+
def copublishers_from_kv(model, value)
|
|
252
|
+
list = Array(value).map(&:to_s)
|
|
253
|
+
return unless list.any?
|
|
254
|
+
|
|
255
|
+
# Mirror Builder#parse: copublishers live both on the primary
|
|
256
|
+
# publisher (as strings) and as the top-level `copublishers`
|
|
257
|
+
# collection of Publisher objects. `==` compares the latter, so
|
|
258
|
+
# populate both or a deserialized id never equals a parsed one.
|
|
259
|
+
publisher_for(model).copublisher = list
|
|
260
|
+
model.copublishers = list.map do |cp|
|
|
261
|
+
::Pubid::Iso::Components::Publisher.new(publisher: cp)
|
|
278
262
|
end
|
|
279
|
-
|
|
280
|
-
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def publisher_for(model)
|
|
266
|
+
model.publisher ||= ::Pubid::Iso::Components::Publisher.new
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def self.parse(string, format: :auto)
|
|
270
|
+
if string.length > Pubid::MAX_INPUT_LENGTH
|
|
271
|
+
raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
281
272
|
end
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
273
|
+
|
|
274
|
+
format = Pubid::FormatDetector.detect(string) if format == :auto
|
|
275
|
+
|
|
276
|
+
case format
|
|
277
|
+
when :urn
|
|
278
|
+
Pubid::Iso::UrnParser.parse(string)
|
|
279
|
+
when :mr_string
|
|
280
|
+
Pubid::Parsers::MrString.parse(string)
|
|
281
|
+
else
|
|
282
|
+
parsed = Pubid::Iso::Parser.new.parse(string)
|
|
283
|
+
if parsed.nil? || parsed.empty?
|
|
284
|
+
raise Pubid::Iso::Parser::ParseError,
|
|
285
|
+
"Invalid identifier format"
|
|
293
286
|
end
|
|
287
|
+
|
|
288
|
+
Pubid::Iso::Builder.new.build(parsed)
|
|
294
289
|
end
|
|
295
|
-
if (v = opts[:language])
|
|
296
|
-
out[:languages] =
|
|
297
|
-
[::Pubid::Components::Language.new(code: v.to_s)]
|
|
298
|
-
end
|
|
299
|
-
# TcDocument committee fields: the 1.x/index shape is the flat
|
|
300
|
-
# tctype/tcnumber/… keys, but the 2.x model stores underscored Code
|
|
301
|
-
# components (mirrors the parser's builder). Without this mapping a
|
|
302
|
-
# TC document round-trips to a bare "ISO N <num>".
|
|
303
|
-
{ tctype: :tc_type, tcnumber: :tc_number,
|
|
304
|
-
sctype: :sc_type, scnumber: :sc_number,
|
|
305
|
-
wgtype: :wg_type, wgnumber: :wg_number }.each do |src, dest|
|
|
306
|
-
v = opts[src]
|
|
307
|
-
out[dest] = Components::Code.new(number: v.to_s) unless v.nil?
|
|
308
|
-
end
|
|
309
|
-
# Directives subgroup (e.g. "ISO/IEC JTC 1 DIR"): the 1.x/index shape
|
|
310
|
-
# is dirtype: "JTC", jtc_dir: "DIR", number: "1"; the 2.x model folds
|
|
311
|
-
# the subgroup into a single `subgroup` Code ("JTC 1") with no
|
|
312
|
-
# directive number, mirroring parse. Without this, .create drops the
|
|
313
|
-
# subgroup and collapses the id into a plain "DIR 1".
|
|
314
|
-
if opts[:dirtype]
|
|
315
|
-
out[:subgroup] = Components::Code.new(
|
|
316
|
-
number: [opts[:dirtype], opts[:number]].compact.join(" "),
|
|
317
|
-
)
|
|
318
|
-
out.delete(:number)
|
|
319
|
-
end
|
|
320
|
-
# TODO(create-shim): 1.x also accepted iteration, amendments,
|
|
321
|
-
# corrigendums, addendum, month, dir. Add as relaton call sites
|
|
322
|
-
# require them.
|
|
323
|
-
out
|
|
324
290
|
end
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
291
|
+
|
|
292
|
+
# from_hash is the shared polymorphic dispatch on Pubid::Identifier, which
|
|
293
|
+
# routes `_type` through polymorphic_type_map (ISO_TYPE_MAP's dynamic
|
|
294
|
+
# equivalent). ISO_TYPE_MAP remains as the key_value polymorphic_map.
|
|
328
295
|
end
|
|
329
296
|
end
|
|
330
297
|
end
|
|
@@ -4,7 +4,6 @@ module Pubid
|
|
|
4
4
|
module Iso
|
|
5
5
|
module Identifiers
|
|
6
6
|
class Addendum < SupplementIdentifier
|
|
7
|
-
attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
|
|
8
7
|
|
|
9
8
|
# Override URN supplement type to use generic "sup" instead of "add"
|
|
10
9
|
# This matches the ISO URN specification where addendums use "sup"
|
|
@@ -65,9 +64,11 @@ module Pubid
|
|
|
65
64
|
),
|
|
66
65
|
::Pubid::Components::TypedStage.new(
|
|
67
66
|
code: :dad,
|
|
68
|
-
abbr: ["DAD", "DAdd", "D ADD", "Dad"],
|
|
67
|
+
abbr: ["DAD", "DAdd", "D ADD", "Dad", "DIS Add"],
|
|
69
68
|
short_abbr: "DAD",
|
|
70
|
-
|
|
69
|
+
# "DAdd" stays in `abbr` so it still parses, but render the canonical
|
|
70
|
+
# "DAD" (pubid v1 legacy_abbr parity). No long_abbr → no long render.
|
|
71
|
+
long_abbr: nil,
|
|
71
72
|
type_code: :add,
|
|
72
73
|
stage_code: :dad,
|
|
73
74
|
name: "Draft Addendum",
|
|
@@ -75,9 +76,10 @@ module Pubid
|
|
|
75
76
|
),
|
|
76
77
|
::Pubid::Components::TypedStage.new(
|
|
77
78
|
code: :fdad,
|
|
78
|
-
abbr: ["FDAD", "FDAdd", "FD ADD", "FDad"],
|
|
79
|
+
abbr: ["FDAD", "FDAdd", "FD ADD", "FDad", "FDIS Add"],
|
|
79
80
|
short_abbr: "FDAD",
|
|
80
|
-
|
|
81
|
+
# See :dad — parse "FDAdd", render canonical "FDAD" (v1 parity).
|
|
82
|
+
long_abbr: nil,
|
|
81
83
|
type_code: :add,
|
|
82
84
|
stage_code: :fdad,
|
|
83
85
|
name: "Final Draft Addendum",
|
|
@@ -96,7 +98,8 @@ module Pubid
|
|
|
96
98
|
].freeze
|
|
97
99
|
|
|
98
100
|
def self.type
|
|
99
|
-
{ key: :add,
|
|
101
|
+
{ key: :add,
|
|
102
|
+
web: :addendum, title: "Addendum", short: "ADD" }
|
|
100
103
|
end
|
|
101
104
|
end
|
|
102
105
|
end
|
|
@@ -4,7 +4,6 @@ module Pubid
|
|
|
4
4
|
module Iso
|
|
5
5
|
module Identifiers
|
|
6
6
|
class Amendment < SupplementIdentifier
|
|
7
|
-
attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
|
|
8
7
|
|
|
9
8
|
TYPED_STAGES = [
|
|
10
9
|
::Pubid::Components::TypedStage.new(
|
|
@@ -71,7 +70,10 @@ module Pubid
|
|
|
71
70
|
code: :damd,
|
|
72
71
|
abbr: ["DAM", "DAmd"],
|
|
73
72
|
short_abbr: "DAM",
|
|
74
|
-
|
|
73
|
+
# "DAmd" stays in `abbr` so it still parses, but render the canonical
|
|
74
|
+
# "DAM" (matches pubid v1's legacy_abbr semantics: parse the long
|
|
75
|
+
# spelling, emit the short one). No long_abbr → no long rendering.
|
|
76
|
+
long_abbr: nil,
|
|
75
77
|
type_code: :amd,
|
|
76
78
|
stage_code: :damd,
|
|
77
79
|
name: "Draft Amendment",
|
|
@@ -81,7 +83,8 @@ module Pubid
|
|
|
81
83
|
code: :fdamd,
|
|
82
84
|
abbr: ["FDAM", "FDAmd"],
|
|
83
85
|
short_abbr: "FDAM",
|
|
84
|
-
|
|
86
|
+
# See :damd — parse "FDAmd", render canonical "FDAM" (v1 parity).
|
|
87
|
+
long_abbr: nil,
|
|
85
88
|
type_code: :amd,
|
|
86
89
|
stage_code: :fdamd,
|
|
87
90
|
name: "Final Draft Amendment",
|
|
@@ -120,7 +123,8 @@ module Pubid
|
|
|
120
123
|
].freeze
|
|
121
124
|
|
|
122
125
|
def self.type
|
|
123
|
-
{ key: :amd,
|
|
126
|
+
{ key: :amd,
|
|
127
|
+
web: :amendment, title: "Amendment", short: "AMD" }
|
|
124
128
|
end
|
|
125
129
|
end
|
|
126
130
|
end
|