From 5eb302175251d672acb723a1e6a21af1dba4a6a1 Mon Sep 17 00:00:00 2001 From: rwbaber <97636743+rwbaber@users.noreply.github.com> Date: Tue, 24 Feb 2026 21:37:57 +0000 Subject: [PATCH] fix: Handle non-categorical columns with colors + update deprecated AnnData API (#2758) Yeah that makes sense! Mergingg --- server/cli/prepare.py | 8 ++++---- server/common/colors.py | 2 +- server/common/corpora.py | 2 +- server/data_anndata/anndata_adaptor.py | 9 +++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/server/cli/prepare.py b/server/cli/prepare.py index 87bec01a..a5a39b59 100644 --- a/server/cli/prepare.py +++ b/server/cli/prepare.py @@ -128,12 +128,12 @@ def prepare( raise click.FileError(data, hint="not a valid file or path") if not set_obs_names == "": - if set_obs_names not in adata.obs_keys(): - raise click.UsageError(f"obs {set_obs_names} not found, options are: {adata.obs_keys()}") + if set_obs_names not in list(adata.obs.keys()): + raise click.UsageError(f"obs {set_obs_names} not found, options are: {list(adata.obs.keys())}") adata.obs_names = adata.obs[set_obs_names] if not set_var_names == "": - if set_var_names not in adata.var_keys(): - raise click.UsageError(f"var {set_var_names} not found, options are: {adata.var_keys()}") + if set_var_names not in list(adata.var.keys()): + raise click.UsageError(f"var {set_var_names} not found, options are: {list(adata.var.keys())}") adata.var_names = adata.var[set_var_names] if make_obs_names_unique: adata.obs.index = make_index_unique(adata.obs.index) diff --git a/server/common/colors.py b/server/common/colors.py index 17f9eb56..00984472 100644 --- a/server/common/colors.py +++ b/server/common/colors.py @@ -228,6 +228,6 @@ def convert_anndata_category_colors_to_cxg_category_colors(data): # create the cellxgene color entry for this category cxg_colors[category_name] = dict( - zip(data.obs[category_name].cat.categories, [convert_color_to_hex_format(c) for c in data.uns[uns_key]]) + zip(data.obs[category_name].astype('category').cat.categories, [convert_color_to_hex_format(c) for c in data.uns[uns_key]]) ) return cxg_colors diff --git a/server/common/corpora.py b/server/common/corpora.py index 137eb2a1..8a4678c8 100644 --- a/server/common/corpora.py +++ b/server/common/corpora.py @@ -22,7 +22,7 @@ def corpora_get_versions_from_anndata(adata): """ # per Corpora AnnData spec, this is a corpora file if the following is true - if "version" not in adata.uns_keys(): + if "version" not in list(adata.uns.keys()): return None version = adata.uns["version"] if not isinstance(version, collections.abc.Mapping) or "corpora_schema_version" not in version: diff --git a/server/data_anndata/anndata_adaptor.py b/server/data_anndata/anndata_adaptor.py index 59d0a494..d433957f 100644 --- a/server/data_anndata/anndata_adaptor.py +++ b/server/data_anndata/anndata_adaptor.py @@ -1,4 +1,5 @@ import warnings +import importlib.metadata import anndata import numpy as np @@ -16,7 +17,7 @@ from server.common.utils.type_conversion_utils import get_schema_type_hint_of_ar from server.data_common.data_adaptor import DataAdaptor from server.common.fbs.matrix import encode_matrix_fbs -anndata_version = version.parse(str(anndata.__version__)).release +anndata_version = version.parse(str(importlib.metadata.version('anndata'))).release def anndata_version_is_pre_070(): @@ -63,7 +64,7 @@ class AnndataAdaptor(DataAdaptor): return "cellxgene anndata adaptor version" def get_library_versions(self): - return dict(anndata=str(anndata.__version__)) + return dict(anndata=str(importlib.metadata.version('anndata'))) @staticmethod def _create_unique_column_name(df, col_name_prefix): @@ -313,11 +314,11 @@ class AnndataAdaptor(DataAdaptor): layouts = self.dataset_config.embeddings__names if layouts is None or len(layouts) == 0: - layouts = [key[2:] for key in self.data.obsm_keys() if type(key) is str and key.startswith("X_")] + layouts = [key[2:] for key in list(self.data.obsm.keys()) if type(key) is str and key.startswith("X_")] # remove invalid layouts valid_layouts = [] - obsm_keys = self.data.obsm_keys() + obsm_keys = list(self.data.obsm.keys()) for layout in layouts: layout_name = f"X_{layout}" if layout_name not in obsm_keys: