Skip to content

Commit

Permalink
This is a combination of 2 commits.
Browse files Browse the repository at this point in the history
Validate that uns values are all > 0 in length
  • Loading branch information
joyceyan committed Jan 31, 2024
1 parent 5378b16 commit 8799141
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
6 changes: 4 additions & 2 deletions cellxgene_schema_cli/cellxgene_schema/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ def _validate_dataframe(self, df_name: str):
self.warnings.append(column_def["warning_message"])
self._validate_column(column, column_name, df_name, column_def)

def _validate_colors_in_uns_dict(self, uns_dict: dict) -> None:
def _validate_uns_dict(self, uns_dict: dict) -> None:
df = getattr_anndata(self.adata, "obs")

# Mapping from obs column name to number of unique categorical values
Expand All @@ -759,6 +759,8 @@ def _validate_colors_in_uns_dict(self, uns_dict: dict) -> None:
category_mapping[column_name] = column.nunique()

for key, value in uns_dict.items():
if len(value) == 0:
self.errors.append(f"uns['{key}'] cannot be an empty value.")
if key.endswith("_colors"):
# 1. Verify that the corresponding categorical field exists in obs
column_name = key.replace("_colors", "")
Expand Down Expand Up @@ -1284,7 +1286,7 @@ def _deep_check(self):
elif component_def["type"] == "dict":
self._validate_dict(component, component_name, component_def)
if component_name == "uns":
self._validate_colors_in_uns_dict(component)
self._validate_uns_dict(component)
elif component_def["type"] == "annotation_mapping":
self._validate_annotation_mapping(component_name, component)
if component_name == "obsm":
Expand Down
25 changes: 25 additions & 0 deletions cellxgene_schema_cli/tests/test_schema_compliance.py
Original file line number Diff line number Diff line change
Expand Up @@ -1631,6 +1631,30 @@ def test_colors_happy_path_no_column_def(self, validator_with_adata):
validator.adata.obs["test_column"] = validator.adata.obs["test_column"].astype("category")
validator.adata.uns["test_column_colors"] = numpy.array(["#000000", "#ffffff"])
assert validator.validate_adata()

def test_uns_empty_numpy_array(self, validator_with_adata):
validator = validator_with_adata
validator.adata.uns["log1p"] = numpy.array([])
validator.validate_adata()
assert validator.errors == ["ERROR: uns['log1p'] cannot be an empty value, found []"]

def test_uns_empty_python_array(self, validator_with_adata):
validator = validator_with_adata
validator.adata.uns["log1p"] = []
validator.validate_adata()
assert validator.errors == ["ERROR: uns['log1p'] cannot be an empty value, found []"]

def test_uns_empty_string(self, validator_with_adata):
validator = validator_with_adata
validator.adata.uns["log1p"] = ""
validator.validate_adata()
assert validator.errors == ["ERROR: uns['log1p'] cannot be an empty value, found """]

def test_uns_empty_dictionary(self, validator_with_adata):
validator = validator_with_adata
validator.adata.uns["log1p"] = {}
validator.validate_adata()
assert validator.errors == ["ERROR: uns['log1p'] cannot be an empty value."]

def test_colors_happy_path_duplicates(self, validator_with_adata):
validator = validator_with_adata
Expand Down Expand Up @@ -1676,6 +1700,7 @@ def test_empty_color_array(self, validator_with_adata):
validator.adata.uns["suspension_type_colors"] = numpy.array([])
validator.validate_adata()
assert validator.errors == [
"ERROR: uns['suspension_type_colors'] cannot be an empty value, found []",
"ERROR: Annotated categorical field suspension_type must have at least 2 color options in uns[suspension_type_colors]. Found: []"
]

Expand Down

0 comments on commit 8799141

Please sign in to comment.