mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-10-10 01:40:55 +08:00
update gene set name validation to match latest requirements (#2117)
This commit is contained in:
@@ -276,11 +276,11 @@ class DataAdaptor(metaclass=ABCMeta):
|
|||||||
|
|
||||||
Rules:
|
Rules:
|
||||||
0. all geneset names must be unique.
|
0. all geneset names must be unique.
|
||||||
1. All geneset names must be legal, meaning:
|
1. All geneset names must be comprised of legal characters, meaning:
|
||||||
* no leading or trailing white space
|
* no leading or trailing white space
|
||||||
* no multi-space runs
|
* no multi-space runs
|
||||||
* character set matches: [A-Z][a-z][0-9][ .()-]
|
* no tab, vertical tab, newline or return
|
||||||
Generates hard error.
|
Where "space" means ASCII 32. Generates hard error.
|
||||||
2. Gene symbols must be part of the current var_index. If symbol not in var_index,
|
2. Gene symbols must be part of the current var_index. If symbol not in var_index,
|
||||||
will generate a warning and the symbol removed.
|
will generate a warning and the symbol removed.
|
||||||
3. Duplicate gene symbols are silently de-duped.
|
3. Duplicate gene symbols are silently de-duped.
|
||||||
@@ -299,19 +299,18 @@ class DataAdaptor(metaclass=ABCMeta):
|
|||||||
raise KeyError("All geneset names must be unique.")
|
raise KeyError("All geneset names must be unique.")
|
||||||
|
|
||||||
# 1. check gene set character set and format
|
# 1. check gene set character set and format
|
||||||
legal_name = re.compile(r"^(\w|[ .()-])+$")
|
illegal_name = re.compile(r"^\s| |[\v\t\r\n]|\s$")
|
||||||
for name in geneset_names:
|
for name in geneset_names:
|
||||||
if type(name) != str or len(name) == 0:
|
if type(name) != str or len(name) == 0:
|
||||||
raise KeyError("Geneset names must be non-null string.")
|
raise KeyError("Geneset names must be non-null string.")
|
||||||
if name[0] in " \t\n\r" or name[-1] in " \t\n\r" or not legal_name.match(name) or " " in name:
|
if illegal_name.search(name):
|
||||||
messagefn(
|
messagefn(
|
||||||
"Error: "
|
"Error: "
|
||||||
f"Geneset name {name} is not valid. Only alphanumeric and limited special characters (-_.) "
|
f"Geneset name {name} "
|
||||||
"and space are allowed. Leading, trailing, and multiple spaces within a name are not allowed."
|
"is not valid. Leading, trailing, and multiple spaces within a name are not allowed."
|
||||||
)
|
)
|
||||||
raise KeyError(
|
raise KeyError(
|
||||||
"Geneset name is not valid, only alphanumeric and limited special characters (-_.) "
|
"Geneset name is not valid. Leading, trailing, and multiple spaces within a name are not allowed."
|
||||||
"and space are allowed. Leading, trailing, and multiple spaces within a name are not allowed."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 2. & 3. check for duplicate gene symbols, and those not present in the dataset. They will
|
# 2. & 3. check for duplicate gene symbols, and those not present in the dataset. They will
|
||||||
|
|||||||
@@ -568,8 +568,26 @@ summary test,,PIGU,\r
|
|||||||
result = self.session.put(url, json=test1)
|
result = self.session.put(url, json=test1)
|
||||||
self.assertEqual(result.status_code, HTTPStatus.NOT_FOUND)
|
self.assertEqual(result.status_code, HTTPStatus.NOT_FOUND)
|
||||||
|
|
||||||
test2 = {"tid": 4, "genesets": [{"geneset_name": "foobar", "genes": []}]}
|
test2 = {
|
||||||
test2_response = {"tid": 4, "genesets": [{"geneset_name": "foobar", "geneset_description": "", "genes": []}]}
|
"tid": 4,
|
||||||
|
"genesets": [
|
||||||
|
{"geneset_name": "foobar", "genes": []},
|
||||||
|
{"geneset_name": "contains a space", "genes": []},
|
||||||
|
{"geneset_name": "contains_weird_characters: #$%^&*()_+=-!@<>,./?';:\"[]{}|\\", "genes": []},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
test2_response = {
|
||||||
|
"tid": 4,
|
||||||
|
"genesets": [
|
||||||
|
{"geneset_name": "foobar", "geneset_description": "", "genes": []},
|
||||||
|
{"geneset_name": "contains a space", "geneset_description": "", "genes": []},
|
||||||
|
{
|
||||||
|
"geneset_name": "contains_weird_characters: #$%^&*()_+=-!@<>,./?';:\"[]{}|\\",
|
||||||
|
"geneset_description": "",
|
||||||
|
"genes": [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
result = self.session.put(url, json=test2)
|
result = self.session.put(url, json=test2)
|
||||||
self.assertEqual(result.status_code, HTTPStatus.OK)
|
self.assertEqual(result.status_code, HTTPStatus.OK)
|
||||||
result = self.session.get(url, headers={"Accept": "application/json"})
|
result = self.session.get(url, headers={"Accept": "application/json"})
|
||||||
@@ -629,7 +647,37 @@ summary test,,PIGU,\r
|
|||||||
|
|
||||||
# illegal geneset_name
|
# illegal geneset_name
|
||||||
test_case(
|
test_case(
|
||||||
{"tid": tid + 1, "genesets": [{"geneset_name": """, "genes": []}]},
|
{"tid": tid + 1, "genesets": [{"geneset_name": " foo", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "foo ", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "f oo", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "f\too", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "f\roo", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "f\noo", "genes": []}]},
|
||||||
|
HTTPStatus.BAD_REQUEST,
|
||||||
|
original_data,
|
||||||
|
)
|
||||||
|
test_case(
|
||||||
|
{"tid": tid + 1, "genesets": [{"geneset_name": "f\voo", "genes": []}]},
|
||||||
HTTPStatus.BAD_REQUEST,
|
HTTPStatus.BAD_REQUEST,
|
||||||
original_data,
|
original_data,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user