varcode 9.2.2__tar.gz → 9.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. {varcode-9.2.2/varcode.egg-info → varcode-9.2.3}/PKG-INFO +1 -1
  2. varcode-9.2.3/tests/test_nonlocal_sv_transcripts.py +83 -0
  3. {varcode-9.2.2 → varcode-9.2.3}/tests/test_osteosarc_fusions.py +9 -1
  4. {varcode-9.2.2 → varcode-9.2.3}/tests/test_symbolic_sv_padding.py +1 -1
  5. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/structural.py +9 -3
  6. varcode-9.2.3/varcode/version.py +1 -0
  7. {varcode-9.2.2 → varcode-9.2.3/varcode.egg-info}/PKG-INFO +1 -1
  8. {varcode-9.2.2 → varcode-9.2.3}/varcode.egg-info/SOURCES.txt +1 -0
  9. varcode-9.2.2/varcode/version.py +0 -1
  10. {varcode-9.2.2 → varcode-9.2.3}/LICENSE +0 -0
  11. {varcode-9.2.2 → varcode-9.2.3}/MANIFEST.in +0 -0
  12. {varcode-9.2.2 → varcode-9.2.3}/README.md +0 -0
  13. {varcode-9.2.2 → varcode-9.2.3}/pyproject.toml +0 -0
  14. {varcode-9.2.2 → varcode-9.2.3}/requirements.txt +0 -0
  15. {varcode-9.2.2 → varcode-9.2.3}/setup.cfg +0 -0
  16. {varcode-9.2.2 → varcode-9.2.3}/tests/test_annotator_divergence_scenarios.py +0 -0
  17. {varcode-9.2.2 → varcode-9.2.3}/tests/test_annotator_parity_adversarial.py +0 -0
  18. {varcode-9.2.2 → varcode-9.2.3}/tests/test_annotators.py +0 -0
  19. {varcode-9.2.2 → varcode-9.2.3}/tests/test_cli_effects.py +0 -0
  20. {varcode-9.2.2 → varcode-9.2.3}/tests/test_cli_genes.py +0 -0
  21. {varcode-9.2.2 → varcode-9.2.3}/tests/test_cli_without_pkg_resources.py +0 -0
  22. {varcode-9.2.2 → varcode-9.2.3}/tests/test_collection_filtering.py +0 -0
  23. {varcode-9.2.2 → varcode-9.2.3}/tests/test_collection_variants_attr_consistency.py +0 -0
  24. {varcode-9.2.2 → varcode-9.2.3}/tests/test_common.py +0 -0
  25. {varcode-9.2.2 → varcode-9.2.3}/tests/test_cosmic_mutations.py +0 -0
  26. {varcode-9.2.2 → varcode-9.2.3}/tests/test_cryptic_exons.py +0 -0
  27. {varcode-9.2.2 → varcode-9.2.3}/tests/test_csv_roundtrip.py +0 -0
  28. {varcode-9.2.2 → varcode-9.2.3}/tests/test_dbnsfp_validation.py +0 -0
  29. {varcode-9.2.2 → varcode-9.2.3}/tests/test_default_structural_helpers.py +0 -0
  30. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_annotation_errors.py +0 -0
  31. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_candidates.py +0 -0
  32. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_classes.py +0 -0
  33. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_collection.py +0 -0
  34. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_collection_serialization.py +0 -0
  35. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_collection_sort_order.py +0 -0
  36. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effect_hypotheses.py +0 -0
  37. {varcode-9.2.2 → varcode-9.2.3}/tests/test_effects_from_mutagenix_variants.py +0 -0
  38. {varcode-9.2.2 → varcode-9.2.3}/tests/test_exacto_fusions.py +0 -0
  39. {varcode-9.2.2 → varcode-9.2.3}/tests/test_exonic_splice_site.py +0 -0
  40. {varcode-9.2.2 → varcode-9.2.3}/tests/test_fast_path.py +0 -0
  41. {varcode-9.2.2 → varcode-9.2.3}/tests/test_frameshift_cterminus_regression.py +0 -0
  42. {varcode-9.2.2 → varcode-9.2.3}/tests/test_frameshift_helpers.py +0 -0
  43. {varcode-9.2.2 → varcode-9.2.3}/tests/test_genome_contig_validation.py +0 -0
  44. {varcode-9.2.2 → varcode-9.2.3}/tests/test_genome_sequence.py +0 -0
  45. {varcode-9.2.2 → varcode-9.2.3}/tests/test_genomic_layout.py +0 -0
  46. {varcode-9.2.2 → varcode-9.2.3}/tests/test_genotype.py +0 -0
  47. {varcode-9.2.2 → varcode-9.2.3}/tests/test_genotype_from_vcf.py +0 -0
  48. {varcode-9.2.2 → varcode-9.2.3}/tests/test_germline_context.py +0 -0
  49. {varcode-9.2.2 → varcode-9.2.3}/tests/test_germline_effects.py +0 -0
  50. {varcode-9.2.2 → varcode-9.2.3}/tests/test_haplotype_effect.py +0 -0
  51. {varcode-9.2.2 → varcode-9.2.3}/tests/test_maf.py +0 -0
  52. {varcode-9.2.2 → varcode-9.2.3}/tests/test_mitochondrial.py +0 -0
  53. {varcode-9.2.2 → varcode-9.2.3}/tests/test_mm10_klf6_frameshift.py +0 -0
  54. {varcode-9.2.2 → varcode-9.2.3}/tests/test_mouse.py +0 -0
  55. {varcode-9.2.2 → varcode-9.2.3}/tests/test_mutant_transcript.py +0 -0
  56. {varcode-9.2.2 → varcode-9.2.3}/tests/test_mutate.py +0 -0
  57. {varcode-9.2.2 → varcode-9.2.3}/tests/test_no_duplicate_variants.py +0 -0
  58. {varcode-9.2.2 → varcode-9.2.3}/tests/test_partial_annotators.py +0 -0
  59. {varcode-9.2.2 → varcode-9.2.3}/tests/test_premature_stop_short_description.py +0 -0
  60. {varcode-9.2.2 → varcode-9.2.3}/tests/test_problematic_variants.py +0 -0
  61. {varcode-9.2.2 → varcode-9.2.3}/tests/test_protein_diff_parity.py +0 -0
  62. {varcode-9.2.2 → varcode-9.2.3}/tests/test_read_phase_resolver.py +0 -0
  63. {varcode-9.2.2 → varcode-9.2.3}/tests/test_real_world_callers.py +0 -0
  64. {varcode-9.2.2 → varcode-9.2.3}/tests/test_reference.py +0 -0
  65. {varcode-9.2.2 → varcode-9.2.3}/tests/test_reference_mismatch_error.py +0 -0
  66. {varcode-9.2.2 → varcode-9.2.3}/tests/test_reference_segments.py +0 -0
  67. {varcode-9.2.2 → varcode-9.2.3}/tests/test_rna_evidence.py +0 -0
  68. {varcode-9.2.2 → varcode-9.2.3}/tests/test_rna_haplotype_sequences.py +0 -0
  69. {varcode-9.2.2 → varcode-9.2.3}/tests/test_rna_read_phasing_source.py +0 -0
  70. {varcode-9.2.2 → varcode-9.2.3}/tests/test_selenocysteine.py +0 -0
  71. {varcode-9.2.2 → varcode-9.2.3}/tests/test_silent_aa_pos.py +0 -0
  72. {varcode-9.2.2 → varcode-9.2.3}/tests/test_silent_hgvs_description.py +0 -0
  73. {varcode-9.2.2 → varcode-9.2.3}/tests/test_splice_graph.py +0 -0
  74. {varcode-9.2.2 → varcode-9.2.3}/tests/test_splice_outcomes.py +0 -0
  75. {varcode-9.2.2 → varcode-9.2.3}/tests/test_splice_site_effects.py +0 -0
  76. {varcode-9.2.2 → varcode-9.2.3}/tests/test_stop_codon_classification_bugs.py +0 -0
  77. {varcode-9.2.2 → varcode-9.2.3}/tests/test_string_helpers.py +0 -0
  78. {varcode-9.2.2 → varcode-9.2.3}/tests/test_structural_variant_annotator.py +0 -0
  79. {varcode-9.2.2 → varcode-9.2.3}/tests/test_structural_variants.py +0 -0
  80. {varcode-9.2.2 → varcode-9.2.3}/tests/test_sv_tabular_metadata.py +0 -0
  81. {varcode-9.2.2 → varcode-9.2.3}/tests/test_symbolic_alleles.py +0 -0
  82. {varcode-9.2.2 → varcode-9.2.3}/tests/test_timings.py +0 -0
  83. {varcode-9.2.2 → varcode-9.2.3}/tests/test_transcript_layout.py +0 -0
  84. {varcode-9.2.2 → varcode-9.2.3}/tests/test_transcript_model.py +0 -0
  85. {varcode-9.2.2 → varcode-9.2.3}/tests/test_transforms_left_align.py +0 -0
  86. {varcode-9.2.2 → varcode-9.2.3}/tests/test_transforms_pair_breakends.py +0 -0
  87. {varcode-9.2.2 → varcode-9.2.3}/tests/test_variant.py +0 -0
  88. {varcode-9.2.2 → varcode-9.2.3}/tests/test_variant_collection.py +0 -0
  89. {varcode-9.2.2 → varcode-9.2.3}/tests/test_vcf.py +0 -0
  90. {varcode-9.2.2 → varcode-9.2.3}/tests/test_vcf_output.py +0 -0
  91. {varcode-9.2.2 → varcode-9.2.3}/tests/test_vcf_parsing.py +0 -0
  92. {varcode-9.2.2 → varcode-9.2.3}/tests/test_vcf_phase_resolver.py +0 -0
  93. {varcode-9.2.2 → varcode-9.2.3}/tests/test_vcf_spec_examples.py +0 -0
  94. {varcode-9.2.2 → varcode-9.2.3}/varcode/__init__.py +0 -0
  95. {varcode-9.2.2 → varcode-9.2.3}/varcode/annotators/__init__.py +0 -0
  96. {varcode-9.2.2 → varcode-9.2.3}/varcode/annotators/fast.py +0 -0
  97. {varcode-9.2.2 → varcode-9.2.3}/varcode/annotators/protein_diff.py +0 -0
  98. {varcode-9.2.2 → varcode-9.2.3}/varcode/annotators/registry.py +0 -0
  99. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/__init__.py +0 -0
  100. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/effects_script.py +0 -0
  101. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/genes_script.py +0 -0
  102. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/logging.conf +0 -0
  103. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/variant_args.py +0 -0
  104. {varcode-9.2.2 → varcode-9.2.3}/varcode/cli/version_info.py +0 -0
  105. {varcode-9.2.2 → varcode-9.2.3}/varcode/common.py +0 -0
  106. {varcode-9.2.2 → varcode-9.2.3}/varcode/cryptic_exons.py +0 -0
  107. {varcode-9.2.2 → varcode-9.2.3}/varcode/csv_helpers.py +0 -0
  108. {varcode-9.2.2 → varcode-9.2.3}/varcode/effect_candidates.py +0 -0
  109. {varcode-9.2.2 → varcode-9.2.3}/varcode/effect_hypotheses.py +0 -0
  110. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/__init__.py +0 -0
  111. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/classify.py +0 -0
  112. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/codon_tables.py +0 -0
  113. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/common.py +0 -0
  114. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_classes.py +0 -0
  115. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_collection.py +0 -0
  116. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_helpers.py +0 -0
  117. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_ordering.py +0 -0
  118. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_prediction.py +0 -0
  119. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_prediction_coding.py +0 -0
  120. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_prediction_coding_frameshift.py +0 -0
  121. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/effect_prediction_coding_in_frame.py +0 -0
  122. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/fast_path.py +0 -0
  123. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/mutate.py +0 -0
  124. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/transcript_helpers.py +0 -0
  125. {varcode-9.2.2 → varcode-9.2.3}/varcode/effects/translate.py +0 -0
  126. {varcode-9.2.2 → varcode-9.2.3}/varcode/errors.py +0 -0
  127. {varcode-9.2.2 → varcode-9.2.3}/varcode/exacto.py +0 -0
  128. {varcode-9.2.2 → varcode-9.2.3}/varcode/genome.py +0 -0
  129. {varcode-9.2.2 → varcode-9.2.3}/varcode/genome_sequence.py +0 -0
  130. {varcode-9.2.2 → varcode-9.2.3}/varcode/genomic_layout.py +0 -0
  131. {varcode-9.2.2 → varcode-9.2.3}/varcode/genotype.py +0 -0
  132. {varcode-9.2.2 → varcode-9.2.3}/varcode/germline.py +0 -0
  133. {varcode-9.2.2 → varcode-9.2.3}/varcode/maf.py +0 -0
  134. {varcode-9.2.2 → varcode-9.2.3}/varcode/mutant_transcript.py +0 -0
  135. {varcode-9.2.2 → varcode-9.2.3}/varcode/nucleotides.py +0 -0
  136. {varcode-9.2.2 → varcode-9.2.3}/varcode/phasing.py +0 -0
  137. {varcode-9.2.2 → varcode-9.2.3}/varcode/realized_effects.py +0 -0
  138. {varcode-9.2.2 → varcode-9.2.3}/varcode/reference.py +0 -0
  139. {varcode-9.2.2 → varcode-9.2.3}/varcode/rna_evidence.py +0 -0
  140. {varcode-9.2.2 → varcode-9.2.3}/varcode/rna_read_phasing.py +0 -0
  141. {varcode-9.2.2 → varcode-9.2.3}/varcode/splice_graph.py +0 -0
  142. {varcode-9.2.2 → varcode-9.2.3}/varcode/splice_outcomes.py +0 -0
  143. {varcode-9.2.2 → varcode-9.2.3}/varcode/string_helpers.py +0 -0
  144. {varcode-9.2.2 → varcode-9.2.3}/varcode/structural_variant.py +0 -0
  145. {varcode-9.2.2 → varcode-9.2.3}/varcode/sv_allele_parser.py +0 -0
  146. {varcode-9.2.2 → varcode-9.2.3}/varcode/transcript_layout.py +0 -0
  147. {varcode-9.2.2 → varcode-9.2.3}/varcode/transcript_model.py +0 -0
  148. {varcode-9.2.2 → varcode-9.2.3}/varcode/transforms/__init__.py +0 -0
  149. {varcode-9.2.2 → varcode-9.2.3}/varcode/ucsc_reference_names.py +0 -0
  150. {varcode-9.2.2 → varcode-9.2.3}/varcode/util.py +0 -0
  151. {varcode-9.2.2 → varcode-9.2.3}/varcode/variant.py +0 -0
  152. {varcode-9.2.2 → varcode-9.2.3}/varcode/variant_collection.py +0 -0
  153. {varcode-9.2.2 → varcode-9.2.3}/varcode/vcf.py +0 -0
  154. {varcode-9.2.2 → varcode-9.2.3}/varcode/vcf_output.py +0 -0
  155. {varcode-9.2.2 → varcode-9.2.3}/varcode/vcf_parsing.py +0 -0
  156. {varcode-9.2.2 → varcode-9.2.3}/varcode.egg-info/dependency_links.txt +0 -0
  157. {varcode-9.2.2 → varcode-9.2.3}/varcode.egg-info/entry_points.txt +0 -0
  158. {varcode-9.2.2 → varcode-9.2.3}/varcode.egg-info/requires.txt +0 -0
  159. {varcode-9.2.2 → varcode-9.2.3}/varcode.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: varcode
3
- Version: 9.2.2
3
+ Version: 9.2.3
4
4
  Summary: Variant annotation in Python
5
5
  Author-email: Alex Rubinsteyn <alex.rubinsteyn@unc.edu>
6
6
  Project-URL: Homepage, https://github.com/openvax/varcode
@@ -0,0 +1,83 @@
1
+ """A partial overlap cannot establish a local DUP/INV transcript (#405)."""
2
+
3
+ import pytest
4
+ from pyensembl import cached_release
5
+
6
+ from varcode import StructuralVariant, parse_symbolic_alt
7
+ from varcode.effects import Inversion, LargeDuplication
8
+ from varcode.effects import structural
9
+
10
+
11
+ @pytest.fixture(params=["ENST00000003084", "ENST00000357654"])
12
+ def transcript(request):
13
+ return cached_release(81).transcript_by_id(request.param)
14
+
15
+
16
+ @pytest.fixture(autouse=True)
17
+ def no_optional_candidates(monkeypatch):
18
+ # Isolate the span fallback; fusion preservation also has real esvee tests.
19
+ monkeypatch.setattr(structural, "_fusion_partner", lambda *args: None)
20
+ monkeypatch.setattr(structural, "_enumerate_and_attach_cryptics", lambda *args: None)
21
+ monkeypatch.setattr(structural, "_enumerate_and_attach_splice_outcomes", lambda *args: None)
22
+
23
+
24
+ def make_sv(transcript, kind, outside, symbolic=False, assembly=None):
25
+ start, end = transcript.start + 50, transcript.end - 50
26
+ if outside in ("left", "both"):
27
+ start = transcript.start - 100
28
+ if outside in ("right", "both"):
29
+ end = transcript.end + 100
30
+ if symbolic:
31
+ return parse_symbolic_alt(
32
+ transcript.contig, start, "N", "<%s>" % kind,
33
+ info={"END": end}, genome=transcript.genome)
34
+ return StructuralVariant(
35
+ transcript.contig, start, kind, end=end,
36
+ genome=transcript.genome, alt_assembly=assembly)
37
+
38
+
39
+ @pytest.mark.parametrize("kind,cls", [("DUP", LargeDuplication), ("INV", Inversion)])
40
+ @pytest.mark.parametrize("outside", ["left", "right", "both"])
41
+ @pytest.mark.parametrize("symbolic", [False, True])
42
+ def test_nonlocal_event_keeps_type_without_inventing_transcript(
43
+ transcript, kind, cls, outside, symbolic):
44
+ sv = make_sv(transcript, kind, outside, symbolic)
45
+ effect = sv.effect_on_transcript(transcript)
46
+ assert isinstance(effect, cls)
47
+ assert effect.mutant_transcript is None
48
+ assert all(c.effect.mutant_transcript is None for c in effect.candidates)
49
+
50
+
51
+ @pytest.mark.parametrize("kind", ["DUP", "INV"])
52
+ @pytest.mark.parametrize("outside", ["left", "right", "both"])
53
+ def test_nonlocal_event_preserves_supplied_assembly(transcript, kind, outside):
54
+ assembly = "ATG" + "GCT" * 10 + "TAA"
55
+ sv = make_sv(transcript, kind, outside, assembly=assembly)
56
+ effect = sv.effect_on_transcript(transcript)
57
+ assert effect.mutant_transcript.cdna_sequence == assembly
58
+
59
+
60
+ @pytest.mark.parametrize("kind", ["DUP", "INV"])
61
+ def test_wholly_internal_event_retains_local_model(transcript, kind):
62
+ sv = make_sv(transcript, kind, outside=None)
63
+ effect = sv.effect_on_transcript(transcript)
64
+ assert effect.mutant_transcript is not None
65
+ if kind == "DUP":
66
+ assert len(effect.mutant_transcript.cdna_sequence) > len(transcript.sequence)
67
+ else:
68
+ assert any(s.strand == "-" for s in effect.mutant_transcript.reference_segments)
69
+
70
+
71
+ @pytest.mark.parametrize("transcript_id", ["ENST00000439541", "ENST00000550411"])
72
+ @pytest.mark.parametrize("kind", ["DUP", "INV"])
73
+ def test_gene_containment_does_not_establish_short_isoform_structure(transcript_id, kind):
74
+ # CBX5's long isoform spans both ends, but these short isoforms do not.
75
+ genome = cached_release(95)
76
+ tx = genome.transcript_by_id(transcript_id)
77
+ sv = StructuralVariant("12", 54_259_010, kind, end=54_262_307, genome=genome)
78
+ ends = [end for junction in sv.junctions for end in junction]
79
+ assert all(structural._contains(tx.gene, end) for end in ends)
80
+ assert any(not structural._contains(tx, end) for end in ends)
81
+ effect = sv.effect_on_transcript(tx)
82
+ assert isinstance(effect, (LargeDuplication, Inversion))
83
+ assert effect.mutant_transcript is None
@@ -48,7 +48,7 @@ from varcode import StructuralVariant, FastEffectAnnotator, load_vcf
48
48
  from varcode.effects.structural import (
49
49
  _build_fusion_mutant_transcript,
50
50
  )
51
- from varcode.effects import GeneFusion, Intronic
51
+ from varcode.effects import GeneFusion, Intronic, Inversion, LargeDuplication
52
52
  from varcode.transforms import pair_breakends
53
53
 
54
54
  from .data import data_path
@@ -267,6 +267,10 @@ def test_esvee_vcf_otx1_kif3c_inversion_is_fusion_on_both_partners():
267
267
  assert fusion.three_prime_transcript.id == kif3c.id
268
268
  assert fusion.mutant_transcript.mutant_protein_sequence == (
269
269
  "MMSYLKQPPYGMNGLGLAGPAMDLLHPSVGYPETS")
270
+ if sv.sv_type == "INV":
271
+ (span,) = [c.effect for c in fusion.candidates
272
+ if isinstance(c.effect, Inversion)]
273
+ assert span.mutant_transcript is None
270
274
 
271
275
 
272
276
  def test_esvee_vcf_cpeb2_fam193a_duplication_is_fusion():
@@ -290,6 +294,10 @@ def test_esvee_vcf_cpeb2_fam193a_duplication_is_fusion():
290
294
  assert isinstance(on_fam193a, GeneFusion)
291
295
  assert on_fam193a.three_prime_transcript.id == fam193a.id
292
296
  assert on_fam193a.five_prime_transcript.gene_name == "CPEB2"
297
+ for fusion in (on_cpeb2, on_fam193a):
298
+ (span,) = [c.effect for c in fusion.candidates
299
+ if isinstance(c.effect, LargeDuplication)]
300
+ assert span.mutant_transcript is None
293
301
 
294
302
 
295
303
  def test_esvee_vcf_sema6a_parm1_fusion_from_either_record():
@@ -37,7 +37,7 @@ def test_no_nonempty_span_cannot_delete_or_copy_the_anchor(kind, info):
37
37
  def test_exact_mutant_cdna_on_both_strands(kind, builder, reverse):
38
38
  sequence = "ACGTTGCAAGCTTAGGCTAC"
39
39
  tx = SimpleNamespace(exons=[SimpleNamespace(start=100, end=119)],
40
- start=100, end=119, sequence=sequence,
40
+ contig="1", start=100, end=119, sequence=sequence,
41
41
  on_backward_strand=reverse)
42
42
  sv = parse_symbolic_alt("1", 109, "G", "<%s>" % kind, info={"END": 114})
43
43
  a, b = (5, 10) if reverse else (10, 15)
@@ -126,9 +126,15 @@ def _cdna_ranges_kept_after_deletion(variant, transcript):
126
126
 
127
127
 
128
128
  def _cdna_ranges_within_sv(variant, transcript):
129
- """cDNA ranges that fall INSIDE the SV span (used for DUP to
130
- derive the duplicated body and for INV to derive the flipped
131
- middle)."""
129
+ """Body ranges for a local DUP/INV model, or [] if not local.
130
+
131
+ Clipping a cross-boundary event to this transcript invents a local
132
+ rearrangement (#405). Every junction end must be in this transcript,
133
+ not merely in its gene. Fusion and supplied-assembly paths are separate.
134
+ """
135
+ if any(not _contains(transcript, end)
136
+ for junction in variant.junctions for end in junction):
137
+ return []
132
138
  sv_start, sv_end = _affected_span(variant)
133
139
  inside = []
134
140
  reverse = transcript.on_backward_strand
@@ -0,0 +1 @@
1
+ __version__ = "9.2.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: varcode
3
- Version: 9.2.2
3
+ Version: 9.2.3
4
4
  Summary: Variant annotation in Python
5
5
  Author-email: Alex Rubinsteyn <alex.rubinsteyn@unc.edu>
6
6
  Project-URL: Homepage, https://github.com/openvax/varcode
@@ -45,6 +45,7 @@ tests/test_mouse.py
45
45
  tests/test_mutant_transcript.py
46
46
  tests/test_mutate.py
47
47
  tests/test_no_duplicate_variants.py
48
+ tests/test_nonlocal_sv_transcripts.py
48
49
  tests/test_osteosarc_fusions.py
49
50
  tests/test_partial_annotators.py
50
51
  tests/test_premature_stop_short_description.py
@@ -1 +0,0 @@
1
- __version__ = "9.2.2"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes