Skip to content

Commit febbefb

Browse files
committed
Fixups from code review.
1 parent 4d22e2b commit febbefb

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

prymer/api/primer_pair.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,12 @@ def calculate_amplicon_span(left_primer: Oligo, right_primer: Oligo) -> Span:
242242
Returns:
243243
a Span starting at the first base of the left primer and ending at the last base of
244244
the right primer
245-
"""
246245
246+
Raises:
247+
ValueError: If `left_primer` and `right_primer` have different reference names.
248+
ValueError: If `left_primer` doesn't start before the right primer.
249+
ValueError: If `right_primer` ends before `left_primer`.
250+
"""
247251
# Require that `left_primer` and `right_primer` both map to the same reference sequence
248252
if left_primer.span.refname != right_primer.span.refname:
249253
raise ValueError(
@@ -260,6 +264,14 @@ def calculate_amplicon_span(left_primer: Oligo, right_primer: Oligo) -> Span:
260264
f"Right primer span: {right_primer.span}"
261265
)
262266

267+
# Require that the left primer starts before the right primer
268+
if right_primer.span.end < left_primer.span.end:
269+
raise ValueError(
270+
"Right primer ends before left primer ends. "
271+
f"Left primer span: {left_primer.span}, "
272+
f"Right primer span: {right_primer.span}"
273+
)
274+
263275
return Span(left_primer.span.refname, left_primer.span.start, right_primer.span.end)
264276

265277
@staticmethod

tests/api/test_primer_pair.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,9 +449,7 @@ def test_reference_mismatch() -> None:
449449
def test_right_primer_before_left_primer() -> None:
450450
"""Test that an exception is raised if the left primer starts after the right primer ends"""
451451
pp = PRIMER_PAIR_TEST_CASES[0].primer_pair
452-
with pytest.raises(
453-
ValueError, match="Left primer does not start before the right primer"
454-
):
452+
with pytest.raises(ValueError, match="Left primer does not start before the right primer"):
455453
replace(
456454
pp,
457455
left_primer=pp.right_primer,
@@ -556,3 +554,24 @@ def test_primer_pair_compare(
556554
assert -expected_by_amplicon_false == PrimerPair.compare(
557555
this=that, that=this, seq_dict=seq_dict, by_amplicon=False
558556
)
557+
558+
559+
def test_calculate_amplicon_span() -> None:
560+
left = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr1", 50, 59))
561+
right = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr1", 150, 159))
562+
assert PrimerPair.calculate_amplicon_span(left, right) == Span("chr1", 50, 159)
563+
564+
left = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr2", 50, 59))
565+
right = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr3", 150, 159))
566+
with pytest.raises(ValueError, match="different references"):
567+
PrimerPair.calculate_amplicon_span(left, right)
568+
569+
left = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr1", 150, 159))
570+
right = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr1", 50, 59))
571+
with pytest.raises(ValueError, match="Left primer does not start before the right primer"):
572+
PrimerPair.calculate_amplicon_span(left, right)
573+
574+
left = Oligo(name="l", bases="AACCGGTTAAACGTT", tm=60, penalty=1, span=Span("chr1", 150, 164))
575+
right = Oligo(name="l", bases="AACCGGTTAA", tm=60, penalty=1, span=Span("chr1", 150, 159))
576+
with pytest.raises(ValueError, match="Right primer ends before left primer ends"):
577+
PrimerPair.calculate_amplicon_span(left, right)

0 commit comments

Comments
 (0)