@@ -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+
87105def 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