From a29650651e34381bfd8015b0bb323db5b00c4690 Mon Sep 17 00:00:00 2001 From: Kevin Schaper Date: Fri, 6 Nov 2026 17:13:35 +0000 Subject: [PATCH] fix: curate ICD10CM to Bioregistry's icd10data URI format Older bioregistry releases, including the one pinned here, make https://icd.codes/icd10cm/ the canonical ICD10CM namespace. That host has been dead since 2025-07 and Bioregistry now marks the provider as gone; its own URI format is https://www.icd10data.com/search?s=. Add ICD10CM to linked_data.curated.yaml with that namespace, so the merged contexts follow Bioregistry regardless of the pinned release. icd.codes and the BioPortal PURL stay as prefix aliases. The CSV rows were produced with the package's own ingest, merge and writer, and only the ICD10CM rows change. A full `make etl` was not run, to avoid burying this in an upstream refresh. Claude-Session: https://claude.ai/code/session_01GvqCPLs6vPfQbS73ca2jJw --- src/prefixmaps/data/linked_data.csv | 1 + src/prefixmaps/data/linked_data.curated.yaml | 3 +++ src/prefixmaps/data/merged.csv | 3 ++- src/prefixmaps/data/merged.monarch.csv | 3 ++- src/prefixmaps/data/merged.oak.csv | 3 ++- tests/test_core/test_prefixmaps.py | 20 ++++++++++++++++++++ 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/prefixmaps/data/linked_data.csv b/src/prefixmaps/data/linked_data.csv index 041d713..f776233 100644 --- a/src/prefixmaps/data/linked_data.csv +++ b/src/prefixmaps/data/linked_data.csv @@ -4,6 +4,7 @@ linkml,biolink,https://w3id.org/biolink/vocab/,canonical linkml,dcmitype,http://purl.org/dc/dcmitype/,canonical linkml,dcterms,http://purl.org/dc/terms/,canonical linkml,foaf,http://xmlns.com/foaf/0.1/,canonical +linkml,ICD10CM,https://www.icd10data.com/search?s=,canonical linkml,linkml,https://w3id.org/linkml/,canonical linkml,NANDO,http://identifiers.org/NANDO:,canonical linkml,NCIThesaurus,http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#,canonical diff --git a/src/prefixmaps/data/linked_data.curated.yaml b/src/prefixmaps/data/linked_data.curated.yaml index e04cb68..593b77d 100644 --- a/src/prefixmaps/data/linked_data.curated.yaml +++ b/src/prefixmaps/data/linked_data.curated.yaml @@ -33,3 +33,6 @@ prefixes: dcmitype: http://purl.org/dc/dcmitype/ wgs: http://www.w3.org/2003/01/geo/wgs84_pos# xml: http://www.w3.org/XML/1998/namespace + # Bioregistry's URI format for ICD-10-CM. Its icd.codes provider, which older bioregistry + # releases made canonical, has been dead since 2025-07 and is marked "gone" upstream. + ICD10CM: https://www.icd10data.com/search?s= diff --git a/src/prefixmaps/data/merged.csv b/src/prefixmaps/data/merged.csv index da3a25d..f16e0cd 100644 --- a/src/prefixmaps/data/merged.csv +++ b/src/prefixmaps/data/merged.csv @@ -6938,7 +6938,8 @@ merged,ICD10,https://icdcodelookup.com/icd-10/codes/,prefix_alias,bioregistry merged,ICD10,https://identifiers.org/icd/,prefix_alias,bioregistry merged,ICD10,https://identifiers.org/icd:,prefix_alias,bioregistry merged,ICD10,https://n2t.net/icd:,prefix_alias,bioregistry -merged,ICD10CM,https://icd.codes/icd10cm/,canonical,bioregistry +merged,ICD10CM,https://www.icd10data.com/search?s=,canonical,linkml +merged,ICD10CM,https://icd.codes/icd10cm/,prefix_alias,bioregistry merged,ICD10CM,http://bioregistry.io/ICD10CM:,prefix_alias,bioregistry merged,ICD10CM,http://icd.codes/icd10cm/,prefix_alias,bioregistry merged,ICD10CM,http://purl.bioontology.org/ontology/ICD10CM/,prefix_alias,bioregistry diff --git a/src/prefixmaps/data/merged.monarch.csv b/src/prefixmaps/data/merged.monarch.csv index f26861f..8fa5eb3 100644 --- a/src/prefixmaps/data/merged.monarch.csv +++ b/src/prefixmaps/data/merged.monarch.csv @@ -6938,7 +6938,8 @@ merged.monarch,ICD10,https://icdcodelookup.com/icd-10/codes/,prefix_alias,bioreg merged.monarch,ICD10,https://identifiers.org/icd/,prefix_alias,bioregistry merged.monarch,ICD10,https://identifiers.org/icd:,prefix_alias,bioregistry merged.monarch,ICD10,https://n2t.net/icd:,prefix_alias,bioregistry -merged.monarch,ICD10CM,https://icd.codes/icd10cm/,canonical,bioregistry +merged.monarch,ICD10CM,https://www.icd10data.com/search?s=,canonical,linkml +merged.monarch,ICD10CM,https://icd.codes/icd10cm/,prefix_alias,bioregistry merged.monarch,ICD10CM,http://bioregistry.io/ICD10CM:,prefix_alias,bioregistry merged.monarch,ICD10CM,http://icd.codes/icd10cm/,prefix_alias,bioregistry merged.monarch,ICD10CM,http://purl.bioontology.org/ontology/ICD10CM/,prefix_alias,bioregistry diff --git a/src/prefixmaps/data/merged.oak.csv b/src/prefixmaps/data/merged.oak.csv index 74037ed..95ad4c8 100644 --- a/src/prefixmaps/data/merged.oak.csv +++ b/src/prefixmaps/data/merged.oak.csv @@ -6938,7 +6938,8 @@ merged.oak,ICD10,https://icdcodelookup.com/icd-10/codes/,prefix_alias,bioregistr merged.oak,ICD10,https://identifiers.org/icd/,prefix_alias,bioregistry merged.oak,ICD10,https://identifiers.org/icd:,prefix_alias,bioregistry merged.oak,ICD10,https://n2t.net/icd:,prefix_alias,bioregistry -merged.oak,ICD10CM,https://icd.codes/icd10cm/,canonical,bioregistry +merged.oak,ICD10CM,https://www.icd10data.com/search?s=,canonical,linkml +merged.oak,ICD10CM,https://icd.codes/icd10cm/,prefix_alias,bioregistry merged.oak,ICD10CM,http://bioregistry.io/ICD10CM:,prefix_alias,bioregistry merged.oak,ICD10CM,http://icd.codes/icd10cm/,prefix_alias,bioregistry merged.oak,ICD10CM,http://purl.bioontology.org/ontology/ICD10CM/,prefix_alias,bioregistry diff --git a/tests/test_core/test_prefixmaps.py b/tests/test_core/test_prefixmaps.py index 565a2c9..f19709e 100644 --- a/tests/test_core/test_prefixmaps.py +++ b/tests/test_core/test_prefixmaps.py @@ -229,3 +229,23 @@ def test_synonyms(self): for curie in others: with self.subTest(curie=curie): self.assertEqual(canonical, converter.standardize_curie(curie)) + + def test_curated_icd10cm_prefix(self): + """ICD10CM is curated in linked_data to follow Bioregistry's URI format. + + Older bioregistry releases made the dead icd.codes namespace canonical, see #80. + """ + canonical = "https://www.icd10data.com/search?s=" + for name in ["linked_data", "merged", "merged.monarch", "merged.oak"]: + with self.subTest(context=name): + ctxt = load_context(name) + self.assertEqual(canonical, ctxt.as_dict()["ICD10CM"]) + self.assertEqual("ICD10CM", ctxt.as_inverted_dict()[canonical]) + # the dead icd.codes namespace and the BioPortal PURL stay as aliases + aliases = { + pe.namespace + for pe in self.dyn_merged_context.prefix_expansions + if pe.prefix == "ICD10CM" and pe.status == StatusType.prefix_alias + } + self.assertIn("https://icd.codes/icd10cm/", aliases) + self.assertIn("http://purl.bioontology.org/ontology/ICD10CM/", aliases)