Skip to content

Commit 1e732a2

Browse files
committed
feat: add custom exceptions for VRS mapping errors and update error handling in mapping functions
1 parent 28289d4 commit 1e732a2

File tree

5 files changed

+56
-31
lines changed

5 files changed

+56
-31
lines changed

src/api/routers/map.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
_set_scoreset_layer,
1414
annotate,
1515
)
16+
from dcd_mapping.exceptions import (
17+
MissingSequenceIdError,
18+
UnsupportedReferenceSequenceNameSpaceError,
19+
UnsupportedReferenceSequencePrefixError,
20+
VrsMapError,
21+
)
1622
from dcd_mapping.lookup import DataLookupError
1723
from dcd_mapping.mavedb_data import (
1824
ScoresetNotSupportedError,
@@ -31,7 +37,7 @@
3137
VrsVersion,
3238
)
3339
from dcd_mapping.transcripts import select_transcripts
34-
from dcd_mapping.vrs_map import VrsMapError, vrs_map
40+
from dcd_mapping.vrs_map import vrs_map
3541

3642
router = APIRouter(
3743
prefix="/api/v1", tags=["mappings"], responses={404: {"description": "Not found"}}
@@ -115,7 +121,12 @@ async def map_scoreset(urn: str, store_path: Path | None = None) -> JSONResponse
115121
transcript=transcripts[target_gene],
116122
silent=True,
117123
)
118-
except VrsMapError as e:
124+
except (
125+
UnsupportedReferenceSequenceNameSpaceError,
126+
VrsMapError,
127+
UnsupportedReferenceSequencePrefixError,
128+
MissingSequenceIdError,
129+
) as e:
119130
return JSONResponse(
120131
content=ScoresetMapping(
121132
metadata=metadata, error_message=str(e).strip("'")

src/dcd_mapping/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
import click
88

99
from dcd_mapping.align import AlignmentError
10+
from dcd_mapping.exceptions import VrsMapError
1011
from dcd_mapping.main import map_scoreset_urn
1112
from dcd_mapping.resource_utils import ResourceAcquisitionError
1213
from dcd_mapping.schemas import VrsVersion
1314
from dcd_mapping.transcripts import TxSelectError
14-
from dcd_mapping.vrs_map import VrsMapError
1515

1616
_logger = logging.getLogger(__name__)
1717

src/dcd_mapping/exceptions.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""Exceptions for DCD Mapping Module"""
2+
3+
4+
class VrsMapError(Exception):
5+
"""Raise in case of generic VRS mapping errors."""
6+
7+
8+
class UnsupportedReferenceSequenceNameSpaceError(ValueError):
9+
"""Raised when a reference sequence name space is not supported."""
10+
11+
12+
class MissingSequenceIdError(ValueError):
13+
"""Raised when a sequence ID is not provided."""
14+
15+
16+
class UnsupportedReferenceSequencePrefixError(ValueError):
17+
"""Raised when a reference sequence prefix is not supported."""

src/dcd_mapping/main.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
save_mapped_output_json,
1515
write_scoreset_mapping_to_json,
1616
)
17+
from dcd_mapping.exceptions import (
18+
MissingSequenceIdError,
19+
UnsupportedReferenceSequenceNameSpaceError,
20+
UnsupportedReferenceSequencePrefixError,
21+
VrsMapError,
22+
)
1723
from dcd_mapping.lookup import (
1824
DataLookupError,
1925
check_gene_normalizer,
@@ -35,7 +41,7 @@
3541
VrsVersion,
3642
)
3743
from dcd_mapping.transcripts import select_transcripts
38-
from dcd_mapping.vrs_map import VrsMapError, vrs_map
44+
from dcd_mapping.vrs_map import vrs_map
3945

4046
_logger = logging.getLogger(__name__)
4147

@@ -223,7 +229,12 @@ async def map_scoreset(
223229
transcript=transcripts[target_gene],
224230
silent=silent,
225231
)
226-
except VrsMapError as e:
232+
except (
233+
MissingSequenceIdError,
234+
UnsupportedReferenceSequencePrefixError,
235+
UnsupportedReferenceSequenceNameSpaceError,
236+
VrsMapError,
237+
) as e:
227238
_emit_info(
228239
f"VRS mapping failed for scoreset {metadata.urn}", silent, logging.ERROR
229240
)

src/dcd_mapping/vrs_map.py

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
from mavehgvs.util import parse_variant_strings
2121
from mavehgvs.variant import Variant
2222

23+
from dcd_mapping.exceptions import (
24+
MissingSequenceIdError,
25+
UnsupportedReferenceSequenceNameSpaceError,
26+
UnsupportedReferenceSequencePrefixError,
27+
)
2328
from dcd_mapping.lookup import (
2429
cdot_rest,
2530
get_chromosome_identifier,
@@ -37,16 +42,12 @@
3742
)
3843
from dcd_mapping.transcripts import TxSelectError
3944

40-
__all__ = ["vrs_map", "VrsMapError"]
45+
__all__ = ["vrs_map"]
4146

4247

4348
_logger = logging.getLogger(__name__)
4449

4550

46-
class VrsMapError(Exception):
47-
"""Raise in case of VRS mapping errors."""
48-
49-
5051
def _hgvs_variant_is_valid(hgvs_string: str) -> bool:
5152
return not hgvs_string.endswith((".=", ")", "X"))
5253

@@ -612,11 +613,8 @@ def _map_genomic(
612613
error_message=str(e),
613614
)
614615
else:
615-
return MappedScore(
616-
accession_id=row.accession,
617-
score=row.score,
618-
error_message=f"Reference sequence namespace not supported: {namespace}",
619-
)
616+
msg = f"Unsupported reference sequence namespace: {namespace}"
617+
raise UnsupportedReferenceSequenceNameSpaceError(msg)
620618

621619
return MappedScore(
622620
accession_id=row.accession,
@@ -789,14 +787,8 @@ def _map_accession(
789787
variations: list[MappedScore] = []
790788
sequence_id = metadata.target_accession_id
791789
if sequence_id is None:
792-
return [
793-
MappedScore(
794-
accession_id=row.accession,
795-
score=row.score,
796-
error_message="Could not generate mapped allele objects. No sequence id was provided.",
797-
)
798-
for row in records
799-
]
790+
msg = " No target_accession_id was provided by target gene metadata. Target gene metadata must have a target_accession_id to map to VRS."
791+
raise MissingSequenceIdError(msg)
800792

801793
store_accession(sequence_id)
802794

@@ -815,14 +807,8 @@ def _map_accession(
815807
hgvs_nt_mappings = _map_genomic(row, sequence_id, align_result)
816808
variations.append(hgvs_nt_mappings)
817809
else:
818-
[
819-
MappedScore(
820-
accession_id=row.accession,
821-
score=row.score,
822-
error_message=f"Unrecognized accession prefix for accession id {metadata.target_accession_id}",
823-
)
824-
for row in records
825-
]
810+
msg = f"Unrecognized accession prefix for accession id: {metadata.target_accession_id}"
811+
raise UnsupportedReferenceSequencePrefixError(msg)
826812

827813
return variations
828814

0 commit comments

Comments
 (0)