Skip to content

Commit b9ce240

Browse files
rapid archive url bug fix (#20)
1 parent fba2f5c commit b9ce240

File tree

3 files changed

+53
-20
lines changed

3 files changed

+53
-20
lines changed

app/api/resources/rapid_view.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
StableIdResolverResponse
1212
from app.api.utils.commons import build_stable_id_resolver_content, is_json_request
1313
from app.api.utils.metadata import get_genome_id_from_assembly_accession_id, get_metadata
14-
from app.api.utils.rapid import format_assembly_accession, construct_rapid_archive_url, construct_url, \
15-
generate_rapid_id_page, generate_rapid_page
14+
from app.api.utils.rapid import format_assembly_accession, construct_url, \
15+
generate_rapid_id_page, generate_rapid_page, construct_rapid_archive_url
1616
from app.api.utils.search import get_search_results
17-
from app.core.config import ENSEMBL_URL, RAPID_ARCHIVE_URL
17+
from app.core.config import ENSEMBL_URL
1818
from app.core.logging import InterceptHandler
1919

2020
logging.getLogger().handlers = [InterceptHandler()]
@@ -27,7 +27,7 @@ async def resolve_rapid_stable_id(request: Request, stable_id: str):
2727
# Handle only gene stable id for now
2828
params = SearchPayload(stable_id=stable_id, type="gene", per_page=10)
2929
search_results = get_search_results(params)
30-
rapid_archive_url = f"{RAPID_ARCHIVE_URL}/id/{stable_id}"
30+
rapid_archive_url = construct_rapid_archive_url(request)
3131

3232
if not search_results or not search_results.get("matches"):
3333
if is_json_request(request):
@@ -77,6 +77,7 @@ async def resolve_rapid_help(request: Request, subpath: str = ""):
7777
response_type=RapidResolverHtmlResponseType.HELP,
7878
code=308,
7979
resolved_url=f"{ENSEMBL_URL}/help",
80+
rapid_archive_url=construct_rapid_archive_url(request)
8081
)
8182
return rapid_resolved_response(response, request)
8283

@@ -87,6 +88,7 @@ async def resolve_rapid_blast(request: Request):
8788
response_type=RapidResolverHtmlResponseType.BLAST,
8889
code=308,
8990
resolved_url=f"{ENSEMBL_URL}/blast",
91+
rapid_archive_url=construct_rapid_archive_url(request)
9092
)
9193
return rapid_resolved_response(response, request)
9294

@@ -97,13 +99,15 @@ async def resolve_rapid_blast(request: Request):
9799
async def resolve_species(
98100
request: Request, species_url_name: str, subpath: str = "", r: str = Query(None)
99101
):
102+
rapid_archive_url = construct_rapid_archive_url(request)
100103
# Check if its blast redirect
101104
if "tools/blast" in subpath.lower():
102105
response = RapidResolverResponse(
103106
response_type=RapidResolverHtmlResponseType.BLAST,
104107
code=308,
105108
resolved_url=f"{ENSEMBL_URL}/blast",
106109
species_name=species_url_name,
110+
rapid_archive_url=rapid_archive_url
107111
)
108112
return rapid_resolved_response(response, request)
109113

@@ -117,6 +121,7 @@ async def resolve_species(
117121
resolved_url=f"{ENSEMBL_URL}/species-selector",
118122
message="Invalid input accession ID",
119123
species_name=species_url_name,
124+
rapid_archive_url=rapid_archive_url
120125
)
121126
return rapid_resolved_response(input_error_response, request)
122127

@@ -130,7 +135,6 @@ async def resolve_species(
130135
query_params = parse_qs(query_string, separator=";")
131136

132137
url = construct_url(genome_id, subpath, query_params)
133-
rapid_archive_url = construct_rapid_archive_url(species_url_name, subpath, query_params)
134138
response = RapidResolverResponse(
135139
response_type=RapidResolverHtmlResponseType.INFO,
136140
code=308,
@@ -151,6 +155,7 @@ async def resolve_species(
151155
resolved_url=f"{ENSEMBL_URL}/species-selector",
152156
message=e.detail,
153157
species_name=species_url_name,
158+
rapid_archive_url=rapid_archive_url
154159
)
155160
return rapid_resolved_response(response, request)
156161
except Exception as e:
@@ -161,6 +166,7 @@ async def resolve_species(
161166
code=500,
162167
resolved_url=f"{ENSEMBL_URL}/species-selector",
163168
message=str(e),
169+
rapid_archive_url=rapid_archive_url
164170
)
165171
return rapid_resolved_response(response, request)
166172

@@ -171,6 +177,7 @@ async def resolve_home(request: Request):
171177
response_type=RapidResolverHtmlResponseType.HOME,
172178
code=308,
173179
resolved_url=ENSEMBL_URL,
180+
rapid_archive_url=construct_rapid_archive_url(request)
174181
)
175182
return rapid_resolved_response(response, request)
176183

app/api/utils/rapid.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from jinja2 import Environment, FileSystemLoader
44
from loguru import logger
5+
from fastapi import Request
56
import requests
67
import re
78

@@ -90,23 +91,19 @@ def construct_url(genome_id, subpath, query_params):
9091
raise ValueError("Invalid path")
9192

9293

93-
def construct_rapid_archive_url(species_url_name, subpath, query_params):
94-
url = f"{RAPID_ARCHIVE_URL}/{species_url_name}"
95-
query_params = query_params or {}
96-
97-
params = []
98-
for key, values in query_params.items():
99-
value = values[0] if values else ""
100-
if value:
101-
params.append(f"{key}={value}")
102-
103-
if subpath:
104-
url += f"/{subpath}"
94+
def construct_rapid_archive_url(request: Request):
95+
try:
96+
rapid_archive_path = request.url.path.removeprefix("/rapid/")
97+
if not rapid_archive_path:
98+
return RAPID_ARCHIVE_URL
10599

106-
if params:
107-
url += "?" + ";".join(params) # ; separator for rapid
100+
if request.url.query:
101+
rapid_archive_path = f"{rapid_archive_path}?{request.url.query}"
108102

109-
return url
103+
return f"{RAPID_ARCHIVE_URL}/{rapid_archive_path}"
104+
except Exception as e:
105+
logger.warning(f"Error constructing rapid archive url: {e}")
106+
return RAPID_ARCHIVE_URL
110107

111108

112109
def generate_html_content(response, page):

tests/test_rapid_utils.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import unittest
2+
from unittest.mock import MagicMock
3+
from fastapi import Request
4+
5+
from app.api.utils.rapid import construct_rapid_archive_url
6+
from app.core.config import RAPID_ARCHIVE_URL
7+
8+
9+
class TestRapidUtils(unittest.TestCase):
10+
def _assert_rapid_url(self, rapid_path, query_string=""):
11+
req = MagicMock(spec=Request)
12+
req.url.path = f"/rapid/{rapid_path}"
13+
req.url.query = query_string
14+
res = construct_rapid_archive_url(req)
15+
expected_url = RAPID_ARCHIVE_URL if not rapid_path else f"{RAPID_ARCHIVE_URL}/{rapid_path}"
16+
if query_string:
17+
expected_url = f"{expected_url}?{query_string}"
18+
self.assertEqual(res, expected_url)
19+
20+
def test_construct_rapid_archive_url(self):
21+
self._assert_rapid_url("")
22+
self._assert_rapid_url("info/index.html")
23+
self._assert_rapid_url("Multi/Tools/Blast")
24+
self._assert_rapid_url("Homo_sapiens_GCA_009914755.4/Tools/Blast")
25+
self._assert_rapid_url("id/ENSG00000221914.11")
26+
self._assert_rapid_url("Camarhynchus_parvulus_GCA_902806625.1")
27+
self._assert_rapid_url("Camarhynchus_parvulus_GCA_902806625.1/Location/Genome")
28+
self._assert_rapid_url("Homo_sapiens_GCA_009914755.4/Location/View", "r=1:56873660-58424710")
29+
self._assert_rapid_url("Homo_sapiens_GCA_009914755.4/Gene/Summary", "r=1:56873660-58424710")

0 commit comments

Comments
 (0)