SemanticChemist / utils.py
BioMike's picture
Create utils.py
312ab92 verified
from typing import List
import requests
import os
query_templates = {
"SMILES": """query BySMILES($smiles: String!, $limit: Int = {}) {{
molecules(SMILES: $smiles, limit: $limit) {{
{}
}}
}}""",
"IUPAC": """query ByIUPAC($iupac: String!, $limit: Int = {}) {{
molecules(IUPAC: $iupac, limit: $limit) {{
{}
}}
}}""",
"NAME": """query ByName($name: String!, $limit: Int = {}) {{
molecules(name: $name, limit: $limit) {{
{}
}}
}}""",
"InChI": """query ByInChI($inchi: String!, $limit: Int = {}) {{
molecules(InChI: $inchi, limit: $limit) {{
{}
}}
}}""",
"InChIKey": """query ByInChIKey($inchikey: String!, $limit: Int = {}) {{
molecules(InChIKey: $inchikey, limit: $limit) {{
{}
}}
}}""",
"CID": """query ByCID($cid: Int!) {{
molecules(CID: $cid) {{
{}
}}
}}"""
}
SUPPORTED_RETURN_FIELDS = ["CID", "IUPAC", "SMILES", "InChI", "InChIKey", "synonyms"]
API_URL = os.getenv('API_URL')
class DbProcessor:
def __init__(self, url: str = API_URL) -> None:
self.url = url
def request_data(self, text_input: str, query_type: str, return_fields: List[str], limit: int = 1):
if query_type not in query_templates:
raise ValueError(f"Query type '{query_type}' is not supported.")
for field in return_fields:
if field not in SUPPORTED_RETURN_FIELDS:
raise RuntimeError(f"Field '{field}' is not supported, try to use one from {SUPPORTED_RETURN_FIELDS}")
return_fields_str = "\n".join(return_fields)
query = query_templates[query_type].format(limit, return_fields_str)
variables = {query_type.lower(): text_input}
payload = {
"query": query,
"variables": variables
}
response = requests.post(
url=f"{self.url}/{query_type.lower()}",
json=payload
)
response.raise_for_status()
return response.json()['molecules'][0]