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
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Export
|
|
5
|
-
# Strategy for flavors using Lutaml::Model::Serializable as their Scheme
|
|
6
|
-
# (ETSI, Plateau). These have identifier classes in the Identifiers module
|
|
7
|
-
# that may not have def self.type.
|
|
8
|
-
class DataClassExporter < FlavorExporter
|
|
9
|
-
def export
|
|
10
|
-
klasses = resolve_identifier_classes_from_module
|
|
11
|
-
return nil if klasses.empty?
|
|
12
|
-
|
|
13
|
-
fixture_data = fixture_examples
|
|
14
|
-
|
|
15
|
-
identifier_types = klasses.map do |klass|
|
|
16
|
-
info = extract_type_info(klass)
|
|
17
|
-
type_key = info[:key]
|
|
18
|
-
examples = fixture_data[type_key] || fixture_data[type_key.to_s] || []
|
|
19
|
-
|
|
20
|
-
IdentifierTypeResult.new(
|
|
21
|
-
key: info[:key],
|
|
22
|
-
title: info[:title],
|
|
23
|
-
short: info[:short],
|
|
24
|
-
abbr: info[:abbr],
|
|
25
|
-
typed_stages: [],
|
|
26
|
-
examples: examples,
|
|
27
|
-
)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
scheme = scheme_class
|
|
31
|
-
attrs = scheme&.methods&.include?(:attributes) ? scheme.attributes.keys.map(&:to_s) : []
|
|
32
|
-
|
|
33
|
-
FlavorResult.new(
|
|
34
|
-
flavor: flavor,
|
|
35
|
-
identifier_types: identifier_types,
|
|
36
|
-
attributes: attrs,
|
|
37
|
-
)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
def resolve_identifier_classes_from_module
|
|
43
|
-
mod = scheme_module
|
|
44
|
-
return [] unless mod
|
|
45
|
-
|
|
46
|
-
idents_mod = mod.const_get(:Identifiers)
|
|
47
|
-
skip = %w[Base Supplement]
|
|
48
|
-
|
|
49
|
-
idents_mod.constants.filter_map do |c|
|
|
50
|
-
klass = begin; idents_mod.const_get(c); rescue NameError; next; end
|
|
51
|
-
next unless klass.is_a?(Class)
|
|
52
|
-
next if skip.include?(klass.name&.split("::")&.last)
|
|
53
|
-
|
|
54
|
-
klass
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "set"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
module Export
|
|
7
|
-
# Strategy for IEEE, which has identifier classes in the Identifiers module
|
|
8
|
-
# without a Scheme.identifiers method.
|
|
9
|
-
class IeeeExporter < FlavorExporter
|
|
10
|
-
def export
|
|
11
|
-
klasses = resolve_ieee_identifiers
|
|
12
|
-
return nil if klasses.empty?
|
|
13
|
-
|
|
14
|
-
fixture_data = fixture_examples
|
|
15
|
-
seen_keys = Set.new
|
|
16
|
-
|
|
17
|
-
identifier_types = klasses.filter_map do |klass|
|
|
18
|
-
info = extract_type_info(klass)
|
|
19
|
-
next if seen_keys.include?(info[:key])
|
|
20
|
-
|
|
21
|
-
seen_keys << info[:key]
|
|
22
|
-
|
|
23
|
-
type_key = info[:key]
|
|
24
|
-
examples = match_ieee_examples(fixture_data, type_key, klass)
|
|
25
|
-
|
|
26
|
-
IdentifierTypeResult.new(
|
|
27
|
-
key: info[:key],
|
|
28
|
-
title: info[:title],
|
|
29
|
-
short: info[:short],
|
|
30
|
-
abbr: info[:abbr],
|
|
31
|
-
typed_stages: [],
|
|
32
|
-
examples: examples,
|
|
33
|
-
)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
FlavorResult.new(
|
|
37
|
-
flavor: flavor,
|
|
38
|
-
identifier_types: identifier_types,
|
|
39
|
-
attributes: [],
|
|
40
|
-
)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
def resolve_ieee_identifiers
|
|
46
|
-
identifiers_mod = scheme_module::Identifiers
|
|
47
|
-
skip = %w[Base Supplement]
|
|
48
|
-
klasses = []
|
|
49
|
-
collect_classes(identifiers_mod, skip, klasses)
|
|
50
|
-
klasses
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def collect_classes(mod, skip, result)
|
|
54
|
-
mod.constants.each do |c|
|
|
55
|
-
const = begin; mod.const_get(c); rescue NameError; next; end
|
|
56
|
-
if const.is_a?(Module) && !const.is_a?(Class)
|
|
57
|
-
collect_classes(const, skip, result)
|
|
58
|
-
elsif const.is_a?(Class)
|
|
59
|
-
next if skip.include?(const.name&.split("::")&.last)
|
|
60
|
-
|
|
61
|
-
result << const
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def match_ieee_examples(fixture_data, type_key, klass)
|
|
67
|
-
# Try direct key match
|
|
68
|
-
examples = fixture_data[type_key] || fixture_data[type_key.to_s] || []
|
|
69
|
-
return examples if examples.any?
|
|
70
|
-
|
|
71
|
-
# Try class name match
|
|
72
|
-
class_name = klass.name&.split("::")&.last
|
|
73
|
-
snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
|
|
74
|
-
fixture_data[snake_name] || []
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Export
|
|
5
|
-
# Strategy for ITU, which uses a transform/model pattern without
|
|
6
|
-
# traditional identifier classes or TYPED_STAGES.
|
|
7
|
-
class ItuExporter < FlavorExporter
|
|
8
|
-
WEBSITE_KEY_OVERRIDES = {
|
|
9
|
-
"special_publication" => "special_publication",
|
|
10
|
-
}.freeze
|
|
11
|
-
|
|
12
|
-
def export
|
|
13
|
-
klasses = resolve_itu_identifiers
|
|
14
|
-
return nil if klasses.empty?
|
|
15
|
-
|
|
16
|
-
fixture_data = fixture_examples
|
|
17
|
-
|
|
18
|
-
identifier_types = klasses.map do |klass|
|
|
19
|
-
info = extract_type_info(klass)
|
|
20
|
-
type_key = info[:key]
|
|
21
|
-
examples = fixture_data[type_key] || fixture_data[type_key.to_s] || []
|
|
22
|
-
|
|
23
|
-
IdentifierTypeResult.new(
|
|
24
|
-
key: info[:key],
|
|
25
|
-
title: info[:title],
|
|
26
|
-
short: info[:short],
|
|
27
|
-
abbr: info[:abbr],
|
|
28
|
-
typed_stages: [],
|
|
29
|
-
examples: examples,
|
|
30
|
-
)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
FlavorResult.new(
|
|
34
|
-
flavor: flavor,
|
|
35
|
-
identifier_types: identifier_types,
|
|
36
|
-
attributes: extract_attribute_names,
|
|
37
|
-
)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
def resolve_itu_identifiers
|
|
43
|
-
identifiers_mod = scheme_module::Identifiers
|
|
44
|
-
skip = %w[Base]
|
|
45
|
-
identifiers_mod.constants.filter_map do |c|
|
|
46
|
-
klass = begin
|
|
47
|
-
identifiers_mod.const_get(c); rescue NameError; next
|
|
48
|
-
end
|
|
49
|
-
next unless klass.is_a?(Class)
|
|
50
|
-
next if skip.include?(klass.name&.split("::")&.last)
|
|
51
|
-
|
|
52
|
-
klass
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def extract_attribute_names
|
|
57
|
-
model = scheme_module::Identifier
|
|
58
|
-
return [] unless model&.methods&.include?(:model_attributes)
|
|
59
|
-
|
|
60
|
-
model.model_attributes.keys.map(&:to_s)
|
|
61
|
-
rescue NoMethodError, NameError
|
|
62
|
-
[]
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Export
|
|
5
|
-
# Strategy for NIST, which has a unique identifier architecture:
|
|
6
|
-
# per-class typed_stages class method (not TYPED_STAGES constant),
|
|
7
|
-
# and a Scheme.identifiers class method.
|
|
8
|
-
class NistExporter < FlavorExporter
|
|
9
|
-
def export
|
|
10
|
-
scheme = scheme_class
|
|
11
|
-
return nil unless scheme
|
|
12
|
-
|
|
13
|
-
klasses = scheme.identifiers.reject { |k| k == scheme_module::Identifiers::Base }
|
|
14
|
-
fixture_data = fixture_examples
|
|
15
|
-
|
|
16
|
-
seen_keys = Set.new
|
|
17
|
-
identifier_types = klasses.filter_map do |klass|
|
|
18
|
-
info = extract_type_info(klass)
|
|
19
|
-
type_key = info[:key]
|
|
20
|
-
next if seen_keys.include?(type_key)
|
|
21
|
-
|
|
22
|
-
seen_keys << type_key
|
|
23
|
-
|
|
24
|
-
examples = match_nist_examples(fixture_data, type_key, klass)
|
|
25
|
-
stages = klass.typed_stages
|
|
26
|
-
|
|
27
|
-
IdentifierTypeResult.new(
|
|
28
|
-
key: info[:key],
|
|
29
|
-
title: info[:title],
|
|
30
|
-
short: info[:short],
|
|
31
|
-
abbr: stages.flat_map(&:abbr),
|
|
32
|
-
typed_stages: stages,
|
|
33
|
-
examples: examples,
|
|
34
|
-
)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
FlavorResult.new(
|
|
38
|
-
flavor: flavor,
|
|
39
|
-
identifier_types: identifier_types,
|
|
40
|
-
attributes: klasses.first ? extract_attributes(klasses.first) : [],
|
|
41
|
-
)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
def match_nist_examples(fixture_data, type_key, klass)
|
|
47
|
-
return [] unless type_key
|
|
48
|
-
|
|
49
|
-
# NIST fixtures use series codes like "nist_sp", "nist_ir", etc.
|
|
50
|
-
key_str = type_key.to_s
|
|
51
|
-
examples = fixture_data["nist_#{key_str}"] ||
|
|
52
|
-
fixture_data[key_str.to_s] ||
|
|
53
|
-
[]
|
|
54
|
-
|
|
55
|
-
return examples if examples.any?
|
|
56
|
-
|
|
57
|
-
# Try class name match
|
|
58
|
-
class_name = klass.name&.split("::")&.last
|
|
59
|
-
snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
|
|
60
|
-
fixture_data[snake_name] || []
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "set"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
module Export
|
|
7
|
-
# Strategy for flavors using TYPED_STAGES_REGISTRY on the Scheme class
|
|
8
|
-
# (BSI, CEN). These don't use per-class TYPED_STAGES but instead have
|
|
9
|
-
# a centralized registry mapping type_code → typed stages.
|
|
10
|
-
class RegistryExporter < FlavorExporter
|
|
11
|
-
def export
|
|
12
|
-
registry = extract_registry
|
|
13
|
-
return nil if registry.empty?
|
|
14
|
-
|
|
15
|
-
known_website_keys = Set.new
|
|
16
|
-
|
|
17
|
-
identifier_types = registry.group_by(&:type_code).map do |type_code, stages|
|
|
18
|
-
wkey = resolve_website_key(type_code).to_s
|
|
19
|
-
known_website_keys << wkey
|
|
20
|
-
primary = stages.first
|
|
21
|
-
IdentifierTypeResult.new(
|
|
22
|
-
key: wkey,
|
|
23
|
-
title: primary.name,
|
|
24
|
-
short: nil,
|
|
25
|
-
abbr: primary.abbr,
|
|
26
|
-
typed_stages: stages,
|
|
27
|
-
examples: [],
|
|
28
|
-
)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Supplement with typed classes not in the registry
|
|
32
|
-
additional = discover_additional_from_identifiers(known_website_keys)
|
|
33
|
-
identifier_types.concat(additional)
|
|
34
|
-
|
|
35
|
-
FlavorResult.new(
|
|
36
|
-
flavor: flavor,
|
|
37
|
-
identifier_types: identifier_types,
|
|
38
|
-
wrapper_types: extract_wrapper_types,
|
|
39
|
-
attributes: [],
|
|
40
|
-
)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
def extract_registry
|
|
46
|
-
scheme = scheme_class
|
|
47
|
-
return [] unless scheme
|
|
48
|
-
|
|
49
|
-
if scheme.const_defined?(:TYPED_STAGES_REGISTRY)
|
|
50
|
-
scheme.const_get(:TYPED_STAGES_REGISTRY)
|
|
51
|
-
else
|
|
52
|
-
[]
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def discover_additional_from_identifiers(known_keys)
|
|
57
|
-
mod = scheme_module
|
|
58
|
-
return [] unless mod
|
|
59
|
-
|
|
60
|
-
idents_mod = mod.const_get(:Identifiers)
|
|
61
|
-
skip = %w[Base]
|
|
62
|
-
|
|
63
|
-
idents_mod.constants.filter_map do |c|
|
|
64
|
-
klass = idents_mod.const_get(c)
|
|
65
|
-
rescue NameError
|
|
66
|
-
next
|
|
67
|
-
else
|
|
68
|
-
next unless klass.is_a?(Class)
|
|
69
|
-
next if skip.include?(klass.name&.split("::")&.last)
|
|
70
|
-
|
|
71
|
-
info = extract_type_info(klass)
|
|
72
|
-
next unless info[:key]
|
|
73
|
-
|
|
74
|
-
website_key = info[:key].to_s
|
|
75
|
-
next if known_keys.include?(website_key)
|
|
76
|
-
|
|
77
|
-
known_keys << website_key
|
|
78
|
-
IdentifierTypeResult.new(
|
|
79
|
-
key: website_key,
|
|
80
|
-
title: info[:title],
|
|
81
|
-
short: info[:short],
|
|
82
|
-
abbr: [],
|
|
83
|
-
typed_stages: [],
|
|
84
|
-
examples: [],
|
|
85
|
-
)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Export
|
|
5
|
-
# Strategy for flavors using Scheme with class-level identifiers method
|
|
6
|
-
# and def self.type / TYPED_STAGES patterns.
|
|
7
|
-
#
|
|
8
|
-
# Covers: ISO, IEC, ASTM, ASHRAE, ASME, CCSDS, CIE, CSA, JIS, JCGM,
|
|
9
|
-
# OIML, IDF, API, SAE, NIST, IEEE
|
|
10
|
-
class SchemeExporter < FlavorExporter
|
|
11
|
-
def export
|
|
12
|
-
klasses = identifier_classes
|
|
13
|
-
return nil if klasses.empty?
|
|
14
|
-
|
|
15
|
-
fixture_data = fixture_examples
|
|
16
|
-
|
|
17
|
-
identifier_types = klasses.filter_map do |klass|
|
|
18
|
-
info = extract_type_info(klass)
|
|
19
|
-
stages = extract_typed_stages(klass)
|
|
20
|
-
type_key = info[:key]&.to_s
|
|
21
|
-
|
|
22
|
-
# Match fixture examples to this type
|
|
23
|
-
examples = match_examples(fixture_data, type_key, klass)
|
|
24
|
-
|
|
25
|
-
IdentifierTypeResult.new(
|
|
26
|
-
key: info[:key],
|
|
27
|
-
title: info[:title],
|
|
28
|
-
short: info[:short],
|
|
29
|
-
abbr: info[:abbr],
|
|
30
|
-
typed_stages: stages,
|
|
31
|
-
examples: examples,
|
|
32
|
-
)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
all_attrs = klasses.first ? extract_attributes(klasses.first) : []
|
|
36
|
-
wrapper_types = extract_wrapper_types
|
|
37
|
-
|
|
38
|
-
FlavorResult.new(
|
|
39
|
-
flavor: flavor,
|
|
40
|
-
identifier_types: identifier_types,
|
|
41
|
-
wrapper_types: wrapper_types,
|
|
42
|
-
attributes: all_attrs,
|
|
43
|
-
)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def match_examples(fixture_data, type_key, klass)
|
|
49
|
-
return [] unless type_key
|
|
50
|
-
|
|
51
|
-
# Try direct type key match first
|
|
52
|
-
examples = fixture_data[map_fixture_key_to_type_key(type_key)] ||
|
|
53
|
-
fixture_data[map_fixture_key_to_type_key(type_key.gsub("_",
|
|
54
|
-
""))] ||
|
|
55
|
-
[]
|
|
56
|
-
|
|
57
|
-
return examples if examples.any?
|
|
58
|
-
|
|
59
|
-
# Try class name match
|
|
60
|
-
class_name = klass.name&.split("::")&.last
|
|
61
|
-
snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
|
|
62
|
-
if snake_name && fixture_data.key?(snake_name)
|
|
63
|
-
fixture_data[snake_name]
|
|
64
|
-
else
|
|
65
|
-
[]
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "identifier_metadata"
|
|
4
|
-
|
|
5
|
-
module Pubid
|
|
6
|
-
# Global registry of all identifier types across all flavors
|
|
7
|
-
# Provides searchable index for machine-readable lookups
|
|
8
|
-
class IdentifierRegistry
|
|
9
|
-
class << self
|
|
10
|
-
# Register an identifier class with its metadata
|
|
11
|
-
# @param identifier_class [Class] The identifier class
|
|
12
|
-
# @param metadata [Hash] Metadata attributes
|
|
13
|
-
def register(identifier_class, **metadata)
|
|
14
|
-
# Extract class name from full class name
|
|
15
|
-
identifier_class_name = identifier_class.name.to_s.split("::")&.last
|
|
16
|
-
|
|
17
|
-
all_identifiers[identifier_class] = IdentifierMetadata::Metadata.new(
|
|
18
|
-
flavor: metadata.fetch(:flavor),
|
|
19
|
-
identifier_class: identifier_class_name,
|
|
20
|
-
**metadata,
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
# Index by various keys for fast lookup
|
|
24
|
-
index_by_flavor(metadata[:flavor], identifier_class)
|
|
25
|
-
if metadata[:type_key]
|
|
26
|
-
index_by_type_key(metadata[:type_key],
|
|
27
|
-
identifier_class)
|
|
28
|
-
end
|
|
29
|
-
index_by_abbr(metadata[:abbr], identifier_class) if metadata[:abbr]
|
|
30
|
-
|
|
31
|
-
identifier_class
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Find identifier class by flavor and type key
|
|
35
|
-
# @param flavor [String, Symbol] The flavor
|
|
36
|
-
# @param type_key [String, Symbol] The type key
|
|
37
|
-
# @return [Class, nil]
|
|
38
|
-
def find_by_type(flavor, type_key)
|
|
39
|
-
flavor_index[flavor.to_s]&.dig(type_key.to_s)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Find identifier class by abbreviation
|
|
43
|
-
# @param flavor [String, Symbol] The flavor
|
|
44
|
-
# @param abbr [String] The abbreviation
|
|
45
|
-
# @return [Array<Class>] All matching classes
|
|
46
|
-
def find_by_abbr(flavor, abbr)
|
|
47
|
-
abbr_index[flavor.to_s]&.dig(abbr.to_s.downcase) || []
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Get all identifiers for a flavor
|
|
51
|
-
# @param flavor [String, Symbol] The flavor
|
|
52
|
-
# @return [Array<Class>]
|
|
53
|
-
def all_for_flavor(flavor)
|
|
54
|
-
flavor_index[flavor.to_s]&.values || []
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Get all registered identifiers
|
|
58
|
-
# @return [Hash<Class, Metadata>]
|
|
59
|
-
def all_identifiers
|
|
60
|
-
@all_identifiers ||= {}
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Get metadata for an identifier class
|
|
64
|
-
# @param identifier_class [Class] The identifier class
|
|
65
|
-
# @return [Metadata, nil]
|
|
66
|
-
def metadata_for(identifier_class)
|
|
67
|
-
all_identifiers[identifier_class]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Search identifiers by criteria
|
|
71
|
-
# @param criteria [Hash] Search criteria
|
|
72
|
-
# @option criteria [String, Symbol] :flavor Filter by flavor
|
|
73
|
-
# @option criteria [String, Symbol] :type_key Filter by type key
|
|
74
|
-
# @option criteria [String] :abbr Filter by abbreviation
|
|
75
|
-
# @option criteria [String] :title Filter by title (partial match)
|
|
76
|
-
# @option criteria [Boolean] :base_class Filter by base class status
|
|
77
|
-
# @option criteria [Boolean] :supplement_class Filter by supplement class status
|
|
78
|
-
# @return [Array<Hash>] Array of {class: Class, metadata: Metadata}
|
|
79
|
-
def search(**criteria)
|
|
80
|
-
results = []
|
|
81
|
-
|
|
82
|
-
all_identifiers.each do |klass, metadata|
|
|
83
|
-
matches = true
|
|
84
|
-
|
|
85
|
-
if criteria[:flavor]
|
|
86
|
-
matches &= metadata.flavor.to_s == criteria[:flavor].to_s
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
if criteria[:type_key]
|
|
90
|
-
matches &= metadata.type_key.to_s == criteria[:type_key].to_s
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
if criteria[:abbr]
|
|
94
|
-
matches &= metadata.abbr.map(&:to_s).map(&:downcase).include?(criteria[:abbr].to_s.downcase)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
if criteria[:title]
|
|
98
|
-
matches &= metadata.title.to_s.downcase.include?(criteria[:title].to_s.downcase)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
if criteria[:base_class]
|
|
102
|
-
matches &= !metadata.base_class.nil? == criteria[:base_class]
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
if criteria[:supplement_class]
|
|
106
|
-
matches &= !metadata.supplement_class.nil? == criteria[:supplement_class]
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
results << { class: klass, metadata: metadata } if matches
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
results
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Export registry to machine-readable format (JSON)
|
|
116
|
-
# @return [String] JSON representation
|
|
117
|
-
def to_json(*args)
|
|
118
|
-
all_identifiers.values.map(&:to_hash).to_json(*args)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Export registry to machine-readable format (YAML)
|
|
122
|
-
# @return [String] YAML representation
|
|
123
|
-
def to_yaml
|
|
124
|
-
require "json"
|
|
125
|
-
hash = all_identifiers.values.map(&:to_h)
|
|
126
|
-
# Convert to YAML format (basic implementation)
|
|
127
|
-
hash.map(&:to_json).join("\n")
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
# Clear all registrations (useful for testing)
|
|
131
|
-
def clear!
|
|
132
|
-
@all_identifiers = {}
|
|
133
|
-
@flavor_index = nil
|
|
134
|
-
@type_key_index = nil
|
|
135
|
-
@abbr_index = nil
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Generate a summary report
|
|
139
|
-
# @return [String] Human-readable summary
|
|
140
|
-
def summary
|
|
141
|
-
flavors = all_identifiers.values.map(&:flavor).uniq.sort
|
|
142
|
-
total = all_identifiers.size
|
|
143
|
-
|
|
144
|
-
summary = "Identifier Registry Summary\n"
|
|
145
|
-
summary += "#{'=' * 50}\n"
|
|
146
|
-
summary += "Total identifiers: #{total}\n"
|
|
147
|
-
summary += "Flavors: #{flavors.join(', ')}\n\n"
|
|
148
|
-
|
|
149
|
-
flavors.each do |flavor|
|
|
150
|
-
flavor_ids = all_identifiers.values.select do |m|
|
|
151
|
-
m.flavor.to_s == flavor
|
|
152
|
-
end
|
|
153
|
-
summary += "#{flavor.upcase} (#{flavor_ids.size}):\n"
|
|
154
|
-
flavor_ids.sort_by(&:type_key).each do |metadata|
|
|
155
|
-
summary += " - #{metadata.type_key}: #{metadata.title}\n"
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
summary
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
private
|
|
163
|
-
|
|
164
|
-
def flavor_index
|
|
165
|
-
@flavor_index ||= Hash.new { |h, k| h[k] = {} }
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def type_key_index
|
|
169
|
-
@type_key_index ||= Hash.new { |h, k| h[k] = {} }
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def abbr_index
|
|
173
|
-
@abbr_index ||= Hash.new do |h, k|
|
|
174
|
-
h[k] = Hash.new do |h2, k2|
|
|
175
|
-
h2[k2] = []
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def index_by_flavor(flavor, identifier_class)
|
|
181
|
-
flavor_index[flavor.to_s][:_all] ||= []
|
|
182
|
-
flavor_index[flavor.to_s][:_all] << identifier_class
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def index_by_type_key(type_key, identifier_class)
|
|
186
|
-
flavor = all_identifiers[identifier_class].flavor
|
|
187
|
-
flavor_index[flavor.to_s][type_key.to_s] = identifier_class
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def index_by_abbr(abbr, identifier_class)
|
|
191
|
-
flavor = all_identifiers[identifier_class].flavor
|
|
192
|
-
Array(abbr).each do |a|
|
|
193
|
-
abbr_index[flavor.to_s][a.to_s.downcase] << identifier_class
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
end
|
data/lib/pubid/idf/scheme.rb
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pubid
|
|
4
|
-
module Idf
|
|
5
|
-
class Scheme < Pubid::Scheme
|
|
6
|
-
class << self
|
|
7
|
-
def identifiers
|
|
8
|
-
@identifiers ||= [
|
|
9
|
-
Identifiers::InternationalStandard,
|
|
10
|
-
Identifiers::ReviewedMethod,
|
|
11
|
-
].freeze
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def supplement_identifiers
|
|
15
|
-
@supplement_identifiers ||= [
|
|
16
|
-
Identifiers::Amendment,
|
|
17
|
-
Identifiers::Corrigendum,
|
|
18
|
-
].freeze
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def typed_stages
|
|
22
|
-
@typed_stages ||= identifiers.flat_map { |klass| klass::TYPED_STAGES }
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def supplement_typed_stages
|
|
26
|
-
@supplement_typed_stages ||= supplement_identifiers.flat_map do |klass|
|
|
27
|
-
klass::TYPED_STAGES
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def locate_typed_stage_by_abbr(abbr)
|
|
32
|
-
abbr = "" if abbr.nil?
|
|
33
|
-
|
|
34
|
-
typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
|
|
35
|
-
ts.abbr.include?(abbr)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
unless typed_stage
|
|
39
|
-
raise ArgumentError,
|
|
40
|
-
"Unknown type abbreviation: '#{abbr}'"
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
typed_stage
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def locate_identifier_klass_by_type_code(type_code)
|
|
47
|
-
identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
|
|
48
|
-
klass.type[:key].to_s == type_code.to_s
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
unless identifier_klass
|
|
52
|
-
raise ArgumentError,
|
|
53
|
-
"Unknown type code: #{type_code}"
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
identifier_klass
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|