pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3
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 +7 -39
- data/lib/pubid/amca/identifiers/base.rb +0 -26
- data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
- data/lib/pubid/amca/identifiers/publication.rb +0 -13
- data/lib/pubid/amca/renderer.rb +82 -0
- data/lib/pubid/amca/single_identifier.rb +0 -23
- 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 +29 -74
- data/lib/pubid/api/identifier.rb +0 -51
- data/lib/pubid/api/identifiers/base.rb +0 -2
- 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 +1 -17
- 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 +1 -14
- data/lib/pubid/api/identifiers.rb +18 -0
- data/lib/pubid/api/renderer.rb +89 -0
- data/lib/pubid/api/single_identifier.rb +1 -13
- 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 +6 -39
- 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 +3 -0
- 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/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 +42 -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/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 +0 -10
- 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 +8 -62
- data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
- data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
- data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
- data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
- data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
- data/lib/pubid/bsi/identifiers/disc.rb +1 -27
- data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
- data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
- data/lib/pubid/bsi/identifiers/flex.rb +1 -33
- data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
- data/lib/pubid/bsi/identifiers/index.rb +1 -30
- data/lib/pubid/bsi/identifiers/method.rb +1 -39
- data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
- data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
- data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
- data/lib/pubid/bsi/identifiers/section.rb +1 -28
- data/lib/pubid/bsi/identifiers/set.rb +3 -17
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
- data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
- data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
- data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
- data/lib/pubid/bsi/identifiers.rb +0 -1
- data/lib/pubid/bsi/renderer.rb +1050 -0
- data/lib/pubid/bsi/single_identifier.rb +6 -70
- data/lib/pubid/bsi/urn_generator.rb +2 -3
- data/lib/pubid/bsi/urn_parser.rb +52 -0
- data/lib/pubid/bsi.rb +224 -1
- 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 +63 -66
- 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 +7 -38
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
- data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
- 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 +2 -25
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
- 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 +11 -89
- 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 +168 -1
- data/lib/pubid/cie/components/code.rb +8 -0
- data/lib/pubid/cie/identifier.rb +6 -57
- data/lib/pubid/cie/urn_parser.rb +28 -0
- data/lib/pubid/cie.rb +43 -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 +0 -59
- data/lib/pubid/csa/identifiers/base.rb +2 -122
- data/lib/pubid/csa/identifiers/cec.rb +2 -101
- data/lib/pubid/csa/identifiers/series.rb +2 -102
- data/lib/pubid/csa/renderer.rb +292 -0
- data/lib/pubid/csa/urn_generator.rb +1 -1
- data/lib/pubid/csa/urn_parser.rb +33 -0
- data/lib/pubid/csa.rb +42 -1
- data/lib/pubid/etsi/components/code.rb +9 -2
- data/lib/pubid/etsi/identifier.rb +0 -43
- data/lib/pubid/etsi/identifiers/base.rb +1 -4
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
- data/lib/pubid/etsi/renderer.rb +42 -0
- data/lib/pubid/etsi/urn_parser.rb +34 -0
- data/lib/pubid/etsi.rb +42 -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 +2 -17
- data/lib/pubid/identifier_facade.rb +114 -0
- data/lib/pubid/identifier_metadata.rb +1 -1
- data/lib/pubid/idf/builder.rb +3 -3
- data/lib/pubid/idf/identifier.rb +3 -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 +51 -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 +8 -32
- 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 +27 -26
- data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
- 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 +21 -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 +5 -34
- data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
- data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
- data/lib/pubid/iec/identifiers/working_document.rb +4 -48
- 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 +40 -68
- 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 +6 -41
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
- data/lib/pubid/ieee/identifiers/base.rb +101 -458
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
- data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
- data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
- data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
- data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
- 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 +62 -1
- data/lib/pubid/ieee_debug.rb +0 -1
- data/lib/pubid/iho/builder.rb +2 -2
- data/lib/pubid/iho/identifier.rb +8 -42
- data/lib/pubid/iho/identifiers/base.rb +49 -10
- 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 +50 -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 +218 -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/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 +173 -2
- data/lib/pubid/itu/builder.rb +0 -12
- data/lib/pubid/itu/components/code.rb +8 -0
- data/lib/pubid/itu/components.rb +11 -0
- data/lib/pubid/itu/identifier.rb +6 -104
- 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 +0 -6
- 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 +42 -1
- data/lib/pubid/jcgm/builder.rb +16 -8
- data/lib/pubid/jcgm/identifier.rb +0 -43
- data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
- data/lib/pubid/jcgm/renderer.rb +68 -0
- data/lib/pubid/jcgm/single_identifier.rb +1 -5
- 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 +132 -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 +11 -48
- data/lib/pubid/nist/identifiers/base.rb +110 -47
- 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 +416 -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 +82 -4
- data/lib/pubid/oiml/components/code.rb +10 -0
- data/lib/pubid/oiml/identifier.rb +0 -50
- data/lib/pubid/oiml/identifiers/annex.rb +3 -45
- data/lib/pubid/oiml/identifiers/base.rb +2 -17
- data/lib/pubid/oiml/renderer.rb +161 -0
- data/lib/pubid/oiml/single_identifier.rb +6 -45
- data/lib/pubid/oiml/supplement_identifier.rb +4 -19
- 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 +7 -41
- data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
- data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
- data/lib/pubid/plateau/renderer.rb +51 -0
- data/lib/pubid/plateau/supplement_identifier.rb +1 -1
- 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 +0 -23
- data/lib/pubid/sae/identifiers/base.rb +2 -16
- 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 +29 -7
- data/lib/tasks/website-data.json +1940 -1882
- metadata +75 -44
- 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/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/iec/scheme.rb
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
require_relative "identifiers/international_standard"
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
require_relative "identifiers/technical_specification"
|
|
4
|
-
require_relative "identifiers/technical_report"
|
|
5
|
-
require_relative "identifiers/publicly_available_specification"
|
|
6
|
-
require_relative "identifiers/guide"
|
|
7
|
-
require_relative "identifiers/amendment"
|
|
8
|
-
require_relative "identifiers/corrigendum"
|
|
9
|
-
require_relative "identifiers/fragment_identifier"
|
|
10
|
-
|
|
11
|
-
module Pubid
|
|
12
|
-
module Iec
|
|
13
|
-
class Scheme < Pubid::Scheme
|
|
14
|
-
class << self
|
|
15
|
-
def identifiers
|
|
16
|
-
[
|
|
17
|
-
Identifiers::InternationalStandard,
|
|
18
|
-
Identifiers::TechnicalSpecification,
|
|
19
|
-
Identifiers::TechnicalReport,
|
|
20
|
-
Identifiers::PubliclyAvailableSpecification,
|
|
21
|
-
Identifiers::Guide,
|
|
22
|
-
]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def supplement_identifiers
|
|
26
|
-
[
|
|
27
|
-
Identifiers::Amendment,
|
|
28
|
-
Identifiers::Corrigendum,
|
|
29
|
-
Identifiers::FragmentIdentifier,
|
|
30
|
-
]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def typed_stages
|
|
34
|
-
identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def supplement_typed_stages
|
|
38
|
-
supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def locate_typed_stage_by_abbr(abbr)
|
|
42
|
-
abbr = "" if abbr.nil?
|
|
43
|
-
|
|
44
|
-
typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
|
|
45
|
-
ts.abbr.include?(abbr)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
unless typed_stage
|
|
49
|
-
raise ArgumentError,
|
|
50
|
-
"Unknown type abbreviation: '#{abbr}'"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
typed_stage
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def locate_identifier_klass_by_type_code(type_code)
|
|
57
|
-
identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
|
|
58
|
-
klass.type[:key].to_s == type_code.to_s
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
unless identifier_klass
|
|
62
|
-
raise ArgumentError,
|
|
63
|
-
"Unknown type code: #{type_code}"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
identifier_klass
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
data/lib/pubid/ieee/scheme.rb
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "typed_stages"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
module Ieee
|
|
7
|
-
# Scheme provides registry access for IEEE identifiers
|
|
8
|
-
# Following the proven ISO/IEC/CEN/BSI pattern
|
|
9
|
-
#
|
|
10
|
-
# This class is the single source of truth for:
|
|
11
|
-
# - TypedStage lookup by abbreviation
|
|
12
|
-
# - TypedStage lookup by IEEE draft notation
|
|
13
|
-
# - TypedStage lookup by ISO stage code
|
|
14
|
-
# - Identifier class selection based on type code
|
|
15
|
-
class Scheme < Pubid::Scheme
|
|
16
|
-
class << self
|
|
17
|
-
# Locate typed stage by abbreviation
|
|
18
|
-
# @param abbr [String, nil] stage abbreviation (e.g., "D1", "FDIS", "Std")
|
|
19
|
-
# @return [Components::TypedStage] matching typed stage
|
|
20
|
-
def locate_typed_stage_by_abbr(abbr)
|
|
21
|
-
return TypedStages::DEFAULT_TYPED_STAGE if abbr.nil? || abbr.to_s.strip.empty?
|
|
22
|
-
|
|
23
|
-
# Normalize abbreviation
|
|
24
|
-
abbr_str = abbr.to_s.strip
|
|
25
|
-
|
|
26
|
-
# Find typed stage that includes this abbreviation
|
|
27
|
-
typed_stage = TypedStages::TYPED_STAGES.find { |ts| ts.abbr.include?(abbr_str) }
|
|
28
|
-
|
|
29
|
-
# Fall back to default if not found
|
|
30
|
-
typed_stage || TypedStages::DEFAULT_TYPED_STAGE
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Locate typed stage by IEEE draft notation
|
|
34
|
-
# @param draft [String] IEEE draft notation (e.g., "D1", "D5", "P")
|
|
35
|
-
# @return [Components::TypedStage, nil] matching typed stage
|
|
36
|
-
def locate_typed_stage_by_ieee_draft(draft)
|
|
37
|
-
return nil if draft.nil? || draft.to_s.strip.empty?
|
|
38
|
-
|
|
39
|
-
draft_str = draft.to_s.strip
|
|
40
|
-
|
|
41
|
-
# Try exact match on abbreviation first
|
|
42
|
-
ts = TypedStages::TYPED_STAGES.find { |t| t.abbr.include?(draft_str) }
|
|
43
|
-
return ts if ts
|
|
44
|
-
|
|
45
|
-
# Try match on ieee_draft_equivalent
|
|
46
|
-
TypedStages::TYPED_STAGES.find { |t| t.ieee_draft_equivalent == draft_str }
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Locate typed stage by ISO stage code
|
|
50
|
-
# @param stage [String] ISO stage code (e.g., "WD", "CD", "DIS", "FDIS")
|
|
51
|
-
# @return [Components::TypedStage, nil] matching typed stage
|
|
52
|
-
def locate_typed_stage_by_iso_stage(stage)
|
|
53
|
-
return nil if stage.nil? || stage.to_s.strip.empty?
|
|
54
|
-
|
|
55
|
-
TypedStages::TYPED_STAGES.find { |ts| ts.iso_stage_equivalent == stage.to_s.strip }
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Locate identifier class by type code
|
|
59
|
-
# @param type_code [String, Symbol] type code (:standard, :draft, :std, :P, etc.)
|
|
60
|
-
# @return [Class] identifier class
|
|
61
|
-
def locate_identifier_klass_by_type_code(type_code)
|
|
62
|
-
type_str = type_code.to_s
|
|
63
|
-
|
|
64
|
-
case type_str
|
|
65
|
-
when "draft", "Draft Std", "Draft", "P"
|
|
66
|
-
# "P" indicates project draft status - maps to ProjectDraftIdentifier
|
|
67
|
-
Identifiers::ProjectDraftIdentifier
|
|
68
|
-
when "standard", "Std", "std"
|
|
69
|
-
Identifiers::Standard
|
|
70
|
-
else
|
|
71
|
-
# Default to base identifier
|
|
72
|
-
Identifiers::Base
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Get all typed stages
|
|
77
|
-
# @return [Array<Components::TypedStage>] all registered typed stages
|
|
78
|
-
def typed_stages
|
|
79
|
-
TypedStages::TYPED_STAGES
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Get default typed stage (published standard)
|
|
83
|
-
# @return [Components::TypedStage] default typed stage
|
|
84
|
-
def default_typed_stage
|
|
85
|
-
TypedStages::DEFAULT_TYPED_STAGE
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
data/lib/pubid/iho/scheme.rb
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Iho
|
|
5
|
-
# Scheme registry for IHO identifier types.
|
|
6
|
-
class Scheme < Pubid::Scheme
|
|
7
|
-
IDENTIFIERS = [
|
|
8
|
-
Identifiers::Standard,
|
|
9
|
-
Identifiers::Publication,
|
|
10
|
-
Identifiers::Miscellaneous,
|
|
11
|
-
Identifiers::Bibliographic,
|
|
12
|
-
Identifiers::CircularLetter,
|
|
13
|
-
].freeze
|
|
14
|
-
|
|
15
|
-
def initialize
|
|
16
|
-
@identifiers = IDENTIFIERS
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Look up an identifier class by its IHO series letter (S/P/M/B/C).
|
|
20
|
-
# @param letter [String]
|
|
21
|
-
# @return [Class<Identifiers::Base>]
|
|
22
|
-
# @raise [KeyError] if the letter is not a known IHO series
|
|
23
|
-
def self.identifier_klass_for_type_letter(letter)
|
|
24
|
-
@by_letter ||= IDENTIFIERS.to_h { |klass| [klass.type[:short], klass] }
|
|
25
|
-
@by_letter.fetch(letter.to_s)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "lutaml/model"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
module Iso
|
|
7
|
-
module Identifiers
|
|
8
|
-
# Base class for ISO identifiers
|
|
9
|
-
class Base < ::Pubid::Identifier
|
|
10
|
-
# Inherit most attributes from parent
|
|
11
|
-
# ISO-specific attributes
|
|
12
|
-
attribute :stage_iteration, ::Pubid::Iso::Components::Code
|
|
13
|
-
|
|
14
|
-
# ISO rendering context singleton
|
|
15
|
-
def self.rendering_context
|
|
16
|
-
@rendering_context ||= Pubid::Rendering::RenderingContext.iso
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Render identifier using OOP approach - each component renders itself
|
|
20
|
-
#
|
|
21
|
-
# @param lang [Symbol] language for rendering (:en or :fr)
|
|
22
|
-
# @param lang_single [Boolean] use single char language format
|
|
23
|
-
# @param with_edition [Boolean] include edition in output
|
|
24
|
-
# @return [String] formatted identifier string
|
|
25
|
-
def to_s(lang: :en, lang_single: false, with_edition: false)
|
|
26
|
-
# Create rendering context with language settings
|
|
27
|
-
context = Pubid::Rendering::RenderingContext.new(
|
|
28
|
-
stage_separator: "/",
|
|
29
|
-
stage_separator_with_copublisher: " ",
|
|
30
|
-
type_separator: "/",
|
|
31
|
-
type_separator_with_prefix: " ",
|
|
32
|
-
default_type_abbr: "IS",
|
|
33
|
-
lang: lang,
|
|
34
|
-
lang_single: lang_single,
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
# Compose the identifier from component renderings
|
|
38
|
-
render_from_components(context: context, with_edition: with_edition)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
# Compose identifier string by having each component render itself
|
|
44
|
-
#
|
|
45
|
-
# @param context [RenderingContext] rendering context for flavor rules
|
|
46
|
-
# @param with_edition [Boolean] include edition in output
|
|
47
|
-
# @return [String] composed identifier string
|
|
48
|
-
def render_from_components(context:, with_edition: false)
|
|
49
|
-
parts = []
|
|
50
|
-
parts << publisher.to_s
|
|
51
|
-
|
|
52
|
-
# Stage renders itself with context-aware separators
|
|
53
|
-
if stage
|
|
54
|
-
has_copub = publisher&.has_copublisher?
|
|
55
|
-
parts << stage.to_s(context: context, has_copublisher: has_copub)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Type renders itself with context-aware separators and default handling
|
|
59
|
-
if type
|
|
60
|
-
has_prefix = stage || publisher&.has_copublisher?
|
|
61
|
-
type_render = type.to_s(context: context, has_prefix: has_prefix)
|
|
62
|
-
parts << type_render if type_render != ""
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Number renders itself
|
|
66
|
-
parts << " #{number.value}" if number&.value
|
|
67
|
-
|
|
68
|
-
# Parts render themselves
|
|
69
|
-
parts << "-#{part.value}" if part&.value
|
|
70
|
-
parts << "-#{subpart.value}" if subpart&.value
|
|
71
|
-
|
|
72
|
-
# Stage iteration renders itself
|
|
73
|
-
parts << ".#{stage_iteration.value}" if stage_iteration&.value
|
|
74
|
-
|
|
75
|
-
# Date renders itself with context
|
|
76
|
-
parts << date.to_s(context: context) if date&.year
|
|
77
|
-
|
|
78
|
-
# Edition renders itself
|
|
79
|
-
parts << " #{edition}" if with_edition && edition&.number
|
|
80
|
-
|
|
81
|
-
# Languages render themselves
|
|
82
|
-
if languages&.any?
|
|
83
|
-
parts << "(#{languages.map do |l|
|
|
84
|
-
l.to_s(lang_single: context.lang_single)
|
|
85
|
-
end.join('/')})"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
parts.join
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
public
|
|
92
|
-
|
|
93
|
-
# V1 API compatibility - tests expect .copublishers returning array of Publisher objects
|
|
94
|
-
def copublishers
|
|
95
|
-
return [] unless publisher.copublisher&.any?
|
|
96
|
-
|
|
97
|
-
publisher.copublisher.map do |cp|
|
|
98
|
-
::Pubid::Components::Publisher.new(body: cp)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def ==(other)
|
|
103
|
-
return false unless other.is_a?(Base)
|
|
104
|
-
|
|
105
|
-
publisher == other.publisher &&
|
|
106
|
-
type == other.type &&
|
|
107
|
-
number == other.number &&
|
|
108
|
-
part == other.part &&
|
|
109
|
-
date == other.date &&
|
|
110
|
-
stage == other.stage
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
data/lib/pubid/iso/scheme.rb
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Iso
|
|
5
|
-
# ISO Scheme with memoized parser/builder and hash-based indexing
|
|
6
|
-
class Scheme < Pubid::Scheme
|
|
7
|
-
class << self
|
|
8
|
-
# Singleton instance for memoization
|
|
9
|
-
# @return [Pubid::Iso::Scheme] the singleton scheme instance
|
|
10
|
-
def instance
|
|
11
|
-
@instance ||= new
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Delegate class methods to singleton instance for backward compatibility
|
|
15
|
-
# @param identifier [String] the identifier string to parse
|
|
16
|
-
# @return [Identifier] the parsed identifier
|
|
17
|
-
def parse(identifier)
|
|
18
|
-
instance.parse(identifier)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# @param abbr [String, Symbol] the abbreviation to find
|
|
22
|
-
# @return [TypedStage] the matching typed stage
|
|
23
|
-
def locate_typed_stage_by_abbr(abbr)
|
|
24
|
-
instance.locate_typed_stage_by_abbr(abbr)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# @param type_code [String, Symbol] the type code to find
|
|
28
|
-
# @return [Class] the matching identifier class
|
|
29
|
-
def locate_identifier_klass_by_type_code(type_code)
|
|
30
|
-
instance.locate_identifier_klass_by_type_code(type_code)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# @param stage_code [String, Symbol] the stage code to find
|
|
34
|
-
# @return [TypedStage] the matching typed stage
|
|
35
|
-
def locate_typed_stage_by_stage_code(stage_code)
|
|
36
|
-
instance.locate_typed_stage_by_stage_code(stage_code)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# @param code [String, Symbol] the per-typed-stage code to find
|
|
40
|
-
# @return [TypedStage, nil] the matching typed stage
|
|
41
|
-
def locate_typed_stage_by_code(code)
|
|
42
|
-
instance.locate_typed_stage_by_code(code)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# @param harmonized_code [String] the harmonized stage code to find
|
|
46
|
-
# @return [TypedStage, nil] the matching typed stage
|
|
47
|
-
def locate_typed_stage_by_harmonized_code(harmonized_code)
|
|
48
|
-
instance.locate_typed_stage_by_harmonized_code(harmonized_code)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Keep existing class methods for backward compatibility
|
|
52
|
-
# @return [Array<Class>] all base identifier classes
|
|
53
|
-
def identifiers
|
|
54
|
-
[
|
|
55
|
-
Identifiers::InternationalStandard,
|
|
56
|
-
Identifiers::TechnicalReport,
|
|
57
|
-
Identifiers::TechnicalSpecification,
|
|
58
|
-
Identifiers::Guide,
|
|
59
|
-
Identifiers::Pas,
|
|
60
|
-
Identifiers::Data,
|
|
61
|
-
Identifiers::TechnologyTrendsAssessments,
|
|
62
|
-
Identifiers::InternationalWorkshopAgreement,
|
|
63
|
-
Identifiers::InternationalStandardizedProfile,
|
|
64
|
-
Identifiers::Recommendation,
|
|
65
|
-
Identifiers::Directives,
|
|
66
|
-
Identifiers::Amendment,
|
|
67
|
-
Identifiers::Corrigendum,
|
|
68
|
-
Identifiers::Supplement,
|
|
69
|
-
Identifiers::Extract,
|
|
70
|
-
Identifiers::DirectivesSupplement,
|
|
71
|
-
Identifiers::Addendum,
|
|
72
|
-
Identifiers::TcDocument,
|
|
73
|
-
]
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def typed_stages
|
|
77
|
-
identifiers.flat_map { |klass| klass::TYPED_STAGES }.compact
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def supplement_typed_stages
|
|
81
|
-
supplement_identifiers = [
|
|
82
|
-
Identifiers::Amendment,
|
|
83
|
-
Identifiers::Corrigendum,
|
|
84
|
-
Identifiers::Supplement,
|
|
85
|
-
Identifiers::Extract,
|
|
86
|
-
Identifiers::Addendum,
|
|
87
|
-
]
|
|
88
|
-
supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# Initialize the scheme with identifiers
|
|
93
|
-
def initialize
|
|
94
|
-
super(
|
|
95
|
-
identifiers: self.class.identifiers,
|
|
96
|
-
supplement_identifiers: [
|
|
97
|
-
Identifiers::Amendment,
|
|
98
|
-
Identifiers::Corrigendum,
|
|
99
|
-
Identifiers::Supplement,
|
|
100
|
-
Identifiers::Extract,
|
|
101
|
-
Identifiers::Addendum,
|
|
102
|
-
],
|
|
103
|
-
)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Parse an ISO identifier string using memoized parser/builder
|
|
107
|
-
# @param identifier [String] the identifier string to parse
|
|
108
|
-
# @return [Identifier] the parsed identifier
|
|
109
|
-
def parse(identifier)
|
|
110
|
-
# Handle DAD/FDAD patterns that parser can't recognize
|
|
111
|
-
if match = identifier.match(/^(.+?)\/(F?DAD)\s+(\d+)(?::(\d{4}))?$/)
|
|
112
|
-
parse_dad_pattern(match)
|
|
113
|
-
else
|
|
114
|
-
# Apply legacy update_codes normalization first, before any other preprocessing
|
|
115
|
-
normalized = Core::UpdateCodes.apply(identifier, :iso)
|
|
116
|
-
# Normalize Cyrillic (Russian) identifiers to Latin equivalents
|
|
117
|
-
normalized = normalize_cyrillic(normalized)
|
|
118
|
-
parsed = parser.parse(normalized)
|
|
119
|
-
builder.build(parsed)
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
private
|
|
124
|
-
|
|
125
|
-
# Memoized parser instance
|
|
126
|
-
# @return [Pubid::Iso::Parser] parser instance
|
|
127
|
-
def parser
|
|
128
|
-
@parser ||= ::Pubid::Iso::Parser.new
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Memoized builder instance
|
|
132
|
-
# @return [Pubid::Iso::Builder] builder instance
|
|
133
|
-
def builder
|
|
134
|
-
@builder ||= ::Pubid::Iso::Builder.new(self)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
# Normalize Cyrillic (Russian) ISO identifiers to Latin equivalents
|
|
138
|
-
# ИСО = ISO, МЭК = IEC, Руководство/Руководства = Guide,
|
|
139
|
-
# ОПМС = FDIS, ПМС = DIS, ТО = TR, ТС = TS
|
|
140
|
-
def normalize_cyrillic(identifier)
|
|
141
|
-
return identifier unless identifier.match?(/[а-яА-Я]/)
|
|
142
|
-
|
|
143
|
-
normalized = identifier.dup
|
|
144
|
-
# Remove inline comments (Russian style comments with #)
|
|
145
|
-
normalized = normalized.gsub(/\s*#\s*.*$/, "")
|
|
146
|
-
# Translate Russian abbreviations (order matters: longer first)
|
|
147
|
-
normalized = normalized.gsub("Руководства", "GUIDE")
|
|
148
|
-
normalized = normalized.gsub("Руководство", "GUIDE")
|
|
149
|
-
normalized = normalized.gsub("ИСО/МЭК", "ISO/IEC")
|
|
150
|
-
normalized = normalized.gsub("ИСО/ОПМС", "ISO/FDIS")
|
|
151
|
-
normalized = normalized.gsub("ИСО/ПМС", "ISO/DIS")
|
|
152
|
-
normalized = normalized.gsub("ИСО/ТО", "ISO/TR")
|
|
153
|
-
normalized = normalized.gsub("ИСО/ТС", "ISO/TS")
|
|
154
|
-
normalized = normalized.gsub("ИСО", "ISO")
|
|
155
|
-
normalized = normalized.gsub("МЭК", "IEC")
|
|
156
|
-
# Standalone Cyrillic stage abbreviations (after publisher replacements)
|
|
157
|
-
normalized = normalized.gsub("ТО", "TR")
|
|
158
|
-
normalized = normalized.gsub("ТС", "TS")
|
|
159
|
-
normalized = normalized.gsub("ОПМС", "FDIS")
|
|
160
|
-
normalized = normalized.gsub("ПМС", "DIS")
|
|
161
|
-
normalized.strip
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Parse DAD/FDAM pattern manually
|
|
165
|
-
# Pattern: "ISO 2631/DAD 1" or "ISO 2553/DAD 1:1987"
|
|
166
|
-
# The parser fails because it treats "/" as copublisher separator
|
|
167
|
-
def parse_dad_pattern(match)
|
|
168
|
-
base_str = match[1] # "ISO 2631" or "ISO 2553"
|
|
169
|
-
stage_abbr = match[2] # "DAD" or "FDAD"
|
|
170
|
-
supplement_number = match[3] # "1"
|
|
171
|
-
supplement_year = match[4] # "1987" or nil
|
|
172
|
-
|
|
173
|
-
# Parse the base identifier normally (without supplement)
|
|
174
|
-
base_parsed = parser.parse(base_str)
|
|
175
|
-
base_identifier = builder.build(base_parsed)
|
|
176
|
-
|
|
177
|
-
# Construct the Addendum supplement manually
|
|
178
|
-
addendum = Identifiers::Addendum.new
|
|
179
|
-
addendum.base_identifier = base_identifier
|
|
180
|
-
addendum.number = Iso::Components::Code.new(number: supplement_number)
|
|
181
|
-
addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
|
|
182
|
-
|
|
183
|
-
# Set typed_stage from register (uses TYPED_STAGES in Addendum class)
|
|
184
|
-
typed_stage = locate_typed_stage_by_abbr(stage_abbr)
|
|
185
|
-
addendum.typed_stage = typed_stage
|
|
186
|
-
addendum.stage = typed_stage.to_stage
|
|
187
|
-
addendum.type = typed_stage.to_type
|
|
188
|
-
|
|
189
|
-
addendum
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|
data/lib/pubid/itu/scheme.rb
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "model"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
module Itu
|
|
7
|
-
class Scheme < Pubid::Scheme
|
|
8
|
-
# Attribute mappings define how parsed data maps to model attributes
|
|
9
|
-
ATTRIBUTE_MAPPINGS = {
|
|
10
|
-
sector: :sector,
|
|
11
|
-
series: :series,
|
|
12
|
-
number: :number,
|
|
13
|
-
subseries: :subseries,
|
|
14
|
-
part: :part,
|
|
15
|
-
supplement: :supplement,
|
|
16
|
-
amendment: :amendment,
|
|
17
|
-
annex: :annex,
|
|
18
|
-
corrigendum: :corrigendum,
|
|
19
|
-
addendum: :addendum,
|
|
20
|
-
appendix: :appendix,
|
|
21
|
-
date: :date,
|
|
22
|
-
month: :month,
|
|
23
|
-
year: :year,
|
|
24
|
-
second_number: :second_number,
|
|
25
|
-
range_series: :range_series,
|
|
26
|
-
range_number: :range_number,
|
|
27
|
-
sg_number: :sg_number,
|
|
28
|
-
}.freeze
|
|
29
|
-
|
|
30
|
-
# Model class to use for rendering
|
|
31
|
-
def self.model_class
|
|
32
|
-
Model
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Convert parsed data to model attributes
|
|
36
|
-
def self.transform(parsed)
|
|
37
|
-
attributes = {}
|
|
38
|
-
|
|
39
|
-
# Extract sector
|
|
40
|
-
attributes[:sector] = parsed[:sector].to_s if parsed[:sector]
|
|
41
|
-
|
|
42
|
-
# Determine content based on sector
|
|
43
|
-
content = parsed[:t_content] || parsed[:r_content] || {}
|
|
44
|
-
|
|
45
|
-
# Extract series and study group
|
|
46
|
-
if content[:series].is_a?(Hash) && content[:series][:sg_number]
|
|
47
|
-
# Study groups (questions)
|
|
48
|
-
attributes[:series] = "SG#{content[:series][:sg_number]}"
|
|
49
|
-
elsif content[:series]
|
|
50
|
-
attributes[:series] = content[:series].to_s
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Extract numbering components
|
|
54
|
-
if content[:numbering]
|
|
55
|
-
numbering = content[:numbering]
|
|
56
|
-
|
|
57
|
-
# Handle numbering as array (e.g., number + subseries)
|
|
58
|
-
if numbering.is_a?(Array)
|
|
59
|
-
numbering.each do |part|
|
|
60
|
-
if part.is_a?(Hash)
|
|
61
|
-
if part[:number]
|
|
62
|
-
attributes[:number] = part[:number].to_s
|
|
63
|
-
elsif part[:subseries]
|
|
64
|
-
# Collect subseries parts
|
|
65
|
-
if attributes[:subseries]
|
|
66
|
-
attributes[:subseries] =
|
|
67
|
-
"#{attributes[:subseries]}.#{part[:subseries]}"
|
|
68
|
-
else
|
|
69
|
-
attributes[:subseries] = part[:subseries].to_s
|
|
70
|
-
end
|
|
71
|
-
elsif part[:part]
|
|
72
|
-
attributes[:part] = part[:part].to_s
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
elsif numbering.is_a?(Hash)
|
|
77
|
-
# Handle numbering as hash
|
|
78
|
-
attributes[:number] = numbering[:number].to_s if numbering[:number]
|
|
79
|
-
if numbering[:subseries]
|
|
80
|
-
attributes[:subseries] =
|
|
81
|
-
numbering[:subseries].to_s
|
|
82
|
-
end
|
|
83
|
-
attributes[:part] = numbering[:part].to_s if numbering[:part]
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Extract supplement/amendment/etc.
|
|
88
|
-
if content[:supplement]
|
|
89
|
-
attributes[:supplement] =
|
|
90
|
-
content[:supplement].to_s
|
|
91
|
-
end
|
|
92
|
-
attributes[:amendment] = content[:amendment].to_s if content[:amendment]
|
|
93
|
-
attributes[:annex] = content[:annex].to_s if content[:annex]
|
|
94
|
-
if content[:corrigendum]
|
|
95
|
-
attributes[:corrigendum] =
|
|
96
|
-
content[:corrigendum].to_s
|
|
97
|
-
end
|
|
98
|
-
attributes[:addendum] = content[:addendum].to_s if content[:addendum]
|
|
99
|
-
|
|
100
|
-
# Handle appendix (convert Roman numerals to Arabic)
|
|
101
|
-
if content[:appendix]
|
|
102
|
-
appendix = content[:appendix].to_s
|
|
103
|
-
attributes[:appendix] = roman_to_arabic(appendix) || appendix
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Extract date
|
|
107
|
-
if content[:date]
|
|
108
|
-
date = content[:date]
|
|
109
|
-
if date[:month] && date[:year]
|
|
110
|
-
attributes[:month] = date[:month].to_s
|
|
111
|
-
attributes[:year] = date[:year].to_s
|
|
112
|
-
elsif date[:year]
|
|
113
|
-
attributes[:year] = date[:year].to_s
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Extract second number (for combined standards like G.780/Y.1351)
|
|
118
|
-
if content[:second_number]
|
|
119
|
-
second = content[:second_number]
|
|
120
|
-
second_attrs = {}
|
|
121
|
-
second_attrs[:series] = second[:series].to_s if second[:series]
|
|
122
|
-
if second[:numbering]
|
|
123
|
-
numbering = second[:numbering]
|
|
124
|
-
if numbering[:number]
|
|
125
|
-
second_attrs[:number] =
|
|
126
|
-
numbering[:number].to_s
|
|
127
|
-
end
|
|
128
|
-
if numbering[:subseries]
|
|
129
|
-
second_attrs[:subseries] = numbering[:subseries].to_s
|
|
130
|
-
end
|
|
131
|
-
second_attrs[:part] = numbering[:part].to_s if numbering[:part]
|
|
132
|
-
end
|
|
133
|
-
attributes[:second_number] = second_attrs unless second_attrs.empty?
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Extract range (for Q.400-Q.490 style)
|
|
137
|
-
if content[:range_series] && content[:range_number]
|
|
138
|
-
attributes[:range] = {
|
|
139
|
-
series: content[:range_series].to_s,
|
|
140
|
-
number: content[:range_number].to_s,
|
|
141
|
-
}
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
attributes
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
# Convert Roman numerals to Arabic numbers
|
|
148
|
-
def self.roman_to_arabic(roman)
|
|
149
|
-
return roman unless roman.match?(/^[IVXLCDM]+$/i)
|
|
150
|
-
|
|
151
|
-
roman_map = {
|
|
152
|
-
"I" => 1, "V" => 5, "X" => 10, "L" => 50,
|
|
153
|
-
"C" => 100, "D" => 500, "M" => 1000
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
roman = roman.upcase
|
|
157
|
-
result = 0
|
|
158
|
-
prev_value = 0
|
|
159
|
-
|
|
160
|
-
roman.reverse.each_char do |char|
|
|
161
|
-
value = roman_map[char]
|
|
162
|
-
if value < prev_value
|
|
163
|
-
result -= value
|
|
164
|
-
else
|
|
165
|
-
result += value
|
|
166
|
-
end
|
|
167
|
-
prev_value = value
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
result.to_s
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
end
|