Skip to content

Commit fc8bd6e

Browse files
committed
fixed filter logic in main
1 parent bea711e commit fc8bd6e

File tree

2 files changed

+34
-59
lines changed

2 files changed

+34
-59
lines changed

gget/gget_opentargets.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ def opentargets(
247247
verbose=True,
248248
wrap_text=False,
249249
filters=None,
250-
251250
json=False,
252251
):
253252
"""
@@ -268,7 +267,7 @@ def opentargets(
268267
Note: Not compatible with the 'tractability' and 'depmap' resources.
269268
- verbose Print progress messages (default: True).
270269
- wrap_text If True, displays data frame with wrapped text for easy reading. Default: False.
271-
- filters Filters to apply to the data. Supported filters by equality for any column in the returned data frame. Default: None (no filters applied).
270+
- filters Filters to apply to the data. Supported filters by equality for any column in the returned data frame. Dictionary of {column: value} pairs. Default: None (no filters applied).
272271
- json If True, returns results in JSON format instead of as a Data Frame. Default: False.
273272
274273

gget/main.py

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,24 @@ def str_to_bool_or_none(value):
8484
return value
8585

8686

87+
def parse_opentargets_filter(filter_arg):
88+
if "=" not in filter_arg:
89+
raise argparse.ArgumentTypeError(
90+
"OpenTargets filters must be passed as COLUMN=VALUE, e.g. 'disease.id=EFO_0000274'."
91+
)
92+
93+
filter_key, filter_value = filter_arg.split("=", 1)
94+
filter_key = filter_key.strip()
95+
filter_value = filter_value.strip()
96+
97+
if not filter_key:
98+
raise argparse.ArgumentTypeError(
99+
"OpenTargets filter column name cannot be empty."
100+
)
101+
102+
return filter_key, int_or_str(str_to_bool_or_none(filter_value))
103+
104+
87105
def main():
88106
"""
89107
Function containing argparse parsers and arguments to allow the use of gget from the terminal.
@@ -2088,35 +2106,20 @@ def main():
20882106
"Default: Standard out."
20892107
),
20902108
)
2091-
# Filters
2092-
_filters = [
2093-
# flag, long flag, filter name, example, valid resources
2094-
("d", "disease", "disease ID", "EFO_0000274", ["drugs"]),
2095-
("c", "drug", "drug ID", "CHEMBL1743081", ["pharmacogenetics"]),
2096-
("t", "tissue", "tissue ID", "UBERON_0000473", ["expression", "depmap"]),
2097-
("a", "anat_sys", "anatomical system", "nervous system", ["expression"]),
2098-
("o", "organ", "organ", "brain", ["expression"]),
2099-
("pa", "protein_a", "protein A ID", "ENSP00000304915", ["interactions"]),
2100-
("pb", "protein_b", "protein B ID", "ENSP00000379111", ["interactions"]),
2101-
("gb", "gene_b", "gene B ID", "ENSG00000077238", ["interactions"]),
2102-
]
2103-
for flag, long_flag, filter_name, example, valid_resources in _filters:
2104-
help_text = f"Filter results by {filter_name}, e.g. '{example}'.\n"
2105-
if len(valid_resources) > 1:
2106-
quot = "'"
2107-
help_text += f"Only valid for the following resources: {', '.join([quot+vr+quot for vr in valid_resources])}."
2108-
else:
2109-
help_text += f"Only valid for the '{valid_resources[0]}' resource."
2110-
parser_opentargets.add_argument(
2111-
"-f" + flag,
2112-
"--filter_" + long_flag,
2113-
type=str,
2114-
required=False,
2115-
nargs="+",
2116-
default=None,
2117-
help=help_text,
2118-
)
2119-
# End Filters
2109+
parser_opentargets.add_argument(
2110+
"-f",
2111+
"--filter",
2112+
type=parse_opentargets_filter,
2113+
action="append",
2114+
required=False,
2115+
default=None,
2116+
metavar="COLUMN=VALUE",
2117+
help=(
2118+
"Filter results by exact equality using returned OpenTargets column names.\n"
2119+
"Pass multiple filters by repeating the flag, e.g. '--filter disease.id=EFO_0000274 --filter drug.id=CHEMBL1743081'.\n"
2120+
"Nested fields use dot notation, matching the column names returned by the API."
2121+
),
2122+
)
21202123
parser_opentargets.add_argument(
21212124
"-csv",
21222125
"--csv",
@@ -2133,15 +2136,6 @@ def main():
21332136
required=False,
21342137
help="Does not print progress information.",
21352138
)
2136-
parser_opentargets.add_argument(
2137-
"-or",
2138-
"--or",
2139-
default=False,
2140-
action="store_true",
2141-
required=False,
2142-
help="Use OR instead of AND logic for multiple filter IDs.",
2143-
)
2144-
21452139
## cbio parser arguments
21462140
cbio_desc = "Plot cancer genomics heatmaps using data from cBioPortal using Ensembl IDs or gene names"
21472141
parser_cbio = parent_subparsers.add_parser(
@@ -3653,32 +3647,14 @@ def main():
36533647

36543648
## opentargets return
36553649
if args.command == "opentargets":
3656-
flag_to_filter_id = {
3657-
"filter_disease": "disease_id",
3658-
"filter_drug": "drug_id",
3659-
"filter_tissue": "tissue_id",
3660-
"filter_anat_sys": "anatomical_system",
3661-
"filter_organ": "organ",
3662-
"filter_protein_a": "protein_a_id",
3663-
"filter_protein_b": "protein_b_id",
3664-
"filter_gene_b": "gene_b_id",
3665-
}
3666-
filters: Optional[dict[str, list[str]]] = {}
3667-
3668-
for flag, filter_id in flag_to_filter_id.items():
3669-
if getattr(args, flag) is not None:
3670-
filters[filter_id] = getattr(args, flag)
3671-
3672-
if len(filters) == 0:
3673-
filters = None
3650+
filters = dict(args.filter) if args.filter is not None else None
36743651

36753652
opentargets_results = opentargets(
36763653
ensembl_id=args.ens_id,
36773654
resource=args.resource,
36783655
limit=args.limit,
36793656
verbose=args.quiet,
36803657
filters=filters,
3681-
filter_mode="or" if getattr(args, "or") else "and",
36823658
)
36833659

36843660
if args.out is not None and args.out != "":

0 commit comments

Comments
 (0)