diff query.py @ 0:55307a982baf draft

planemo upload for repository https://github.com/brsynth/galaxytools commit a78c222aa38bc456809ade9fa22eb4b887185efd
author tduigou
date Mon, 15 Sep 2025 08:45:21 +0000
parents
children f3184ef3200f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/query.py	Mon Sep 15 08:45:21 2025 +0000
@@ -0,0 +1,199 @@
+import argparse
+import json
+import logging
+import sys
+from typing import Dict, List
+
+import requests
+
+BASE_URL = "https://retrorules.org/api/v0.7"
+
+
+def from_ec_number(ec_number: str, min_diameter: int = None) -> List:
+    url = f"{BASE_URL}/ecnumber"
+    params = [("input", ec_number)]
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def from_substrate(substrate: str, min_diameter: int = None) -> List:
+    url = f"{BASE_URL}/substrate"
+    params = [("input", substrate)]
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def from_reaction_id(
+    reaction_id: str, repository: str, min_diameter: int = None
+) -> List:
+    url = f"{BASE_URL}/reactionid"
+    params = [("input", reaction_id)]
+    params.append(("repo", repository))
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def from_inchi(inchi: str, min_diameter: int = None) -> List:
+    url = f"{BASE_URL}/inchi"
+    params = [("input", inchi)]
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def from_repository(repository: str, min_diameter: int = None) -> List:
+    url = f"{BASE_URL}/repo"
+    params = [("input", repository)]
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def from_smarts_id(smarts_ids: List[str], min_diameter: int = None) -> List:
+    url = f"{BASE_URL}/smartsid"
+    params = [("input", smart_id) for smart_id in smarts_ids]
+    if min_diameter:
+        params.append(("minDiameter", str(min_diameter)))
+    return url, params
+
+
+def query(url: str, params: Dict) -> Dict:
+    response = requests.get(url, params=params)
+    response.raise_for_status()
+    return response.json()
+
+
+def write_json(path: str, data: Dict):
+    with open(path, "w") as fd:
+        json.dump(data, fd, indent=4)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description="Query RetroRules API via command-line endpoints."
+    )
+    subparsers = parser.add_subparsers(dest="command", required=True)
+
+    # Subcommand: EC number
+    parser_ecn = subparsers.add_parser("ec-number", help="From EC number")
+    parser_ecn.add_argument(
+        "--input-ec-number-str", required=True, help="EC number such as 1.1.1.1"
+    )
+    parser_ecn.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_ecn.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    # Subcommand: Substrate
+    parser_sub = subparsers.add_parser("substrate", help="From substrate")
+    parser_sub.add_argument(
+        "--input-substrate-str", required=True, help="Substrate label"
+    )
+    parser_sub.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_sub.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    # Subcommand: Reaction ID
+    parser_rea = subparsers.add_parser("reaction-id", help="From Reaction ID")
+    parser_rea.add_argument(
+        "--input-reaction-id-str", required=True, help="Reaction ID"
+    )
+    parser_rea.add_argument("--input-repository-str", required=True, help="Repository")
+    parser_rea.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_rea.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    # Subcommand: InChI
+    parser_inc = subparsers.add_parser("inchi", help="From InChI")
+    parser_inc.add_argument("--input-inchi-str", required=True, help="InChI")
+    parser_inc.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_inc.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    # Subcommand: Repository
+    parser_rep = subparsers.add_parser("repository", help="From Repository")
+    parser_rep.add_argument("--input-repository-str", required=True, help="InChI")
+    parser_rep.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_rep.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    # Subcommand: Smarts ID
+    parser_sma = subparsers.add_parser("smarts-id", help="From Smarts ID")
+    parser_sma.add_argument(
+        "--input-smarts-id-str", nargs="+", required=True, help="Smarts ID"
+    )
+    parser_sma.add_argument("--input-min-diameter-int", type=int, help="Min diameter")
+    parser_sma.add_argument(
+        "--output-data-json", required=True, help="Output results, JSON format"
+    )
+
+    logging.info("Query RetroRules - start")
+    args = parser.parse_args()
+
+    try:
+        logging.info("Build arguments")
+        url, params = "", {}
+        if args.command == "ec-number":
+            url, params = from_ec_number(
+                ec_number=args.input_ec_number_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        elif args.command == "substrate":
+            url, params = from_substrate(
+                substrate=args.input_substrate_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        elif args.command == "reaction-id":
+            url, params = from_reaction_id(
+                reaction_id=args.input_reaction_id_str,
+                repository=args.input_repository_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        elif args.command == "inchi":
+            url, params = from_inchi(
+                inchi=args.input_inchi_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        elif args.command == "repository":
+            url, params = from_repository(
+                repository=args.input_repository_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        elif args.command == "smarts-id":
+            url, params = from_smarts_id(
+                smarts_ids=args.input_smarts_id_str,
+                min_diameter=args.input_min_diameter_int,
+            )
+        else:
+            parser.print_help()
+            sys.exit(1)
+
+        logging.info("Query API")
+        data = query(url=url, params=params)
+
+        logging.info("Write data")
+        write_json(path=args.output_data_json, data=data)
+    except requests.HTTPError as e:
+        logging.error(f"HTTP error: {e.response.status_code} - {e.response.text}")
+        sys.exit(1)
+    except Exception as e:
+        logging.error(f"Error: {e}")
+        sys.exit(1)
+
+    logging.info("Query RetroRules - end")
+
+
+if __name__ == "__main__":
+    logging.basicConfig(
+        level=logging.INFO,
+        format="%(asctime)s - %(levelname)s - %(message)s",
+        datefmt="%d-%m-%Y %H:%M",
+    )
+    main()