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
9- from anyvar .utils .types import VrsVariation
109from ga4gh .vrs import VrsType , models
1110
1211from anyvlm .anyvar .base_client import (
@@ -33,6 +32,91 @@ def __init__(
3332 self .hostname = hostname
3433 self .request_timeout = request_timeout
3534
35+ def _make_allele_expression_request (
36+ self , expression : str , assembly : ReferenceAssembly , method : HTTPMethod
37+ ) -> requests .Response | None :
38+ """Make a request to the AnyVar variation endpoint for an allele expression
39+
40+ :param expression: variation expression to translate
41+ :param assembly: reference assembly used in expression
42+ :param method: HTTP method to use for the request. Only POST and PUT are
43+ supported.
44+ POST is used for retrieving a registered variation, while PUT is used for
45+ registering a new variation.
46+ :raises ValueError: if unsupported HTTP method is provided
47+ :raise AnyVarClientConnectionError: if connection to AnyVar service is
48+ unsuccessful
49+ :raise AnyVarClientError: if HTTP request fails for other reasons
50+ :return: HTTP response object if request is successful, else `None`
51+ """
52+ if method not in {HTTPMethod .POST , HTTPMethod .PUT }:
53+ msg = (
54+ f"HTTP method { method } is not supported for allele expression requests"
55+ )
56+ raise ValueError (msg )
57+
58+ url = f"{ self .hostname } /variation"
59+ payload = {
60+ "definition" : expression ,
61+ "assembly_name" : assembly .value ,
62+ "input_type" : VrsType .ALLELE .value ,
63+ }
64+ try :
65+ response = requests .request (
66+ method = method ,
67+ url = url ,
68+ json = payload ,
69+ timeout = self .request_timeout ,
70+ )
71+ except requests .ConnectionError as e :
72+ _logger .exception (
73+ "Unable to establish connection using AnyVar configured at %s" ,
74+ self .hostname ,
75+ )
76+ raise AnyVarClientConnectionError from e
77+
78+ try :
79+ response .raise_for_status ()
80+ except requests .HTTPError as e :
81+ _logger .exception (
82+ "Encountered HTTP exception submitting payload %s to %s" ,
83+ payload ,
84+ url ,
85+ )
86+ if response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY :
87+ _logger .debug (
88+ "Translation failed for variant expression '%s'" , expression
89+ )
90+ return None
91+
92+ if response .status_code == HTTPStatus .NOT_FOUND :
93+ _logger .debug ("No variation found for expression '%s'" , expression )
94+ return None
95+
96+ raise AnyVarClientError from e
97+ return response
98+
99+ def get_registered_allele (
100+ self , expression : str , assembly : ReferenceAssembly = ReferenceAssembly .GRCH38
101+ ) -> models .Allele | None :
102+ """Retrieve registered VRS Allele for given allele expression
103+
104+ Currently, only expressions supported by the VRS-Python translator are supported.
105+ This could change depending on the AnyVar implementation, though, and probably
106+ can't be validated on the AnyVLM side.
107+
108+ :param expression: variation expression to get VRS Allele for
109+ :param assembly: reference assembly used in expression
110+ :return: VRS Allele if translation succeeds and VRS Allele has already been registered, else `None`
111+ """
112+ response = self ._make_allele_expression_request (
113+ expression , assembly , HTTPMethod .POST
114+ )
115+ if not response :
116+ return None
117+
118+ return models .Allele (** response .json ()["data" ])
119+
36120 def put_allele_expressions (
37121 self ,
38122 expressions : Iterable [str ],
@@ -50,70 +134,17 @@ def put_allele_expressions(
50134 else `None`, for the i'th expression
51135 :raise AnyVarClientError: for unexpected errors relating to specifics of client interface
52136 """
53- results = []
54- url = f"{ self .hostname } /variation"
137+ results : list [str | None ] = []
55138 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
139+ response = self ._make_allele_expression_request (
140+ expression , assembly , HTTPMethod .PUT
141+ )
142+ if not response :
143+ results .append (None )
88144 else :
89145 results .append (response .json ()["object_id" ])
90146 return results
91147
92- def search_by_interval (
93- self , accession : str , start : int , end : int
94- ) -> list [VrsVariation ]:
95- """Get all variation IDs located within the specified range
96-
97- :param accession: sequence accession
98- :param start: start position for genomic region
99- :param end: end position for genomic region
100- :return: list of matching variant objects
101- :raise AnyVarClientError: if connection is unsuccessful during search query
102- """
103- response = requests .get (
104- f"{ self .hostname } /search?accession={ accession } &start={ start } &end={ end } " ,
105- timeout = self .request_timeout ,
106- )
107- try :
108- response .raise_for_status ()
109- except requests .HTTPError as e :
110- if response .json () == {
111- "detail" : "Unable to dereference provided accession ID"
112- }:
113- return []
114- raise AnyVarClientError from e
115- return [models .Allele (** v ) for v in response .json ()["variations" ]]
116-
117148 def close (self ) -> None :
118149 """Clean up AnyVar connection.
119150
0 commit comments