22
33import logging
44from collections .abc import Iterable , Sequence
5- from http import HTTPStatus
5+ from http import HTTPMethod , HTTPStatus
66
77import requests
88from anyvar .utils .liftover_utils import ReferenceAssembly
@@ -33,6 +33,91 @@ def __init__(
3333 self .hostname = hostname
3434 self .request_timeout = request_timeout
3535
36+ def _make_allele_expression_request (
37+ self , expression : str , assembly : ReferenceAssembly , method : HTTPMethod
38+ ) -> requests .Response | None :
39+ """Make a request to the AnyVar variation endpoint for an allele expression
40+
41+ :param expression: variation expression to translate
42+ :param assembly: reference assembly used in expression
43+ :param method: HTTP method to use for the request. Only POST and PUT are
44+ supported.
45+ POST is used for retrieving a registered variation, while PUT is used for
46+ registering a new variation.
47+ :raises ValueError: if unsupported HTTP method is provided
48+ :raise AnyVarClientConnectionError: if connection to AnyVar service is
49+ unsuccessful
50+ :raise AnyVarClientError: if HTTP request fails for other reasons
51+ :return: HTTP response object if request is successful, else `None`
52+ """
53+ if method not in {HTTPMethod .POST , HTTPMethod .PUT }:
54+ msg = (
55+ f"HTTP method { method } is not supported for allele expression requests"
56+ )
57+ raise ValueError (msg )
58+
59+ url = f"{ self .hostname } /variation"
60+ payload = {
61+ "definition" : expression ,
62+ "assembly_name" : assembly .value ,
63+ "input_type" : VrsType .ALLELE .value ,
64+ }
65+ try :
66+ response = requests .request (
67+ method = method ,
68+ url = url ,
69+ json = payload ,
70+ timeout = self .request_timeout ,
71+ )
72+ except requests .ConnectionError as e :
73+ _logger .exception (
74+ "Unable to establish connection using AnyVar configured at %s" ,
75+ self .hostname ,
76+ )
77+ raise AnyVarClientConnectionError from e
78+
79+ try :
80+ response .raise_for_status ()
81+ except requests .HTTPError as e :
82+ _logger .exception (
83+ "Encountered HTTP exception submitting payload %s to %s" ,
84+ payload ,
85+ url ,
86+ )
87+ if response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY :
88+ _logger .debug (
89+ "Translation failed for variant expression '%s'" , expression
90+ )
91+ return None
92+
93+ if response .status_code == HTTPStatus .NOT_FOUND :
94+ _logger .debug ("No variation found for expression '%s'" , expression )
95+ return None
96+
97+ raise AnyVarClientError from e
98+ return response
99+
100+ def get_registered_allele_expression (
101+ self , expression : str , assembly : ReferenceAssembly = ReferenceAssembly .GRCH38
102+ ) -> models .Allele | None :
103+ """Retrieve VRS Allele for given allele expression
104+
105+ Currently, only expressions supported by the VRS-Python translator are supported.
106+ This could change depending on the AnyVar implementation, though, and probably
107+ can't be validated on the AnyVLM side.
108+
109+ :param expression: variation expression to translate
110+ :param assembly: reference assembly used in expression
111+ :return: VRS Allele if translation succeeds, else `None`
112+ """
113+ response = self ._make_allele_expression_request (
114+ expression , assembly , HTTPMethod .POST
115+ )
116+ if not response :
117+ return None
118+
119+ return models .Allele (** response .json ()["data" ])
120+
36121 def put_allele_expressions (
37122 self ,
38123 expressions : Iterable [str ],
@@ -50,41 +135,13 @@ def put_allele_expressions(
50135 else `None`, for the i'th expression
51136 :raise AnyVarClientError: for unexpected errors relating to specifics of client interface
52137 """
53- results = []
54- url = f"{ self .hostname } /variation"
138+ results : list [str | None ] = []
55139 for expression in expressions :
56- payload = {
57- "definition" : expression ,
58- "assembly_name" : assembly .value ,
59- "input_type" : VrsType .ALLELE .value ,
60- }
61- try :
62- response = requests .put (
63- url ,
64- json = payload ,
65- timeout = self .request_timeout ,
66- )
67- except requests .ConnectionError as e :
68- _logger .exception (
69- "Unable to establish connection using AnyVar configured at %s" ,
70- self .hostname ,
71- )
72- raise AnyVarClientConnectionError from e
73- try :
74- response .raise_for_status ()
75- except requests .HTTPError as e :
76- _logger .exception (
77- "Encountered HTTP exception submitting payload %s to %s" ,
78- payload ,
79- url ,
80- )
81- if response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY :
82- _logger .debug (
83- "Translation failed for variant expression '%s'" , expression
84- )
85- results .append (None )
86- else :
87- raise AnyVarClientError from e
140+ response = self ._make_allele_expression_request (
141+ expression , assembly , HTTPMethod .PUT
142+ )
143+ if not response :
144+ results .append (None )
88145 else :
89146 results .append (response .json ()["object_id" ])
90147 return results
0 commit comments