cool-seq-tool 0.14.2__tar.gz → 0.14.4__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 (64) hide show
  1. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.gitignore +3 -0
  2. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/PKG-INFO +3 -3
  3. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/install.rst +1 -1
  4. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/pyproject.toml +2 -2
  5. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/alignment.py +1 -1
  6. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/exon_genomic_coords.py +28 -0
  7. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/feature_overlap.py +6 -5
  8. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/mane_transcript.py +17 -10
  9. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/resources/status.py +6 -1
  10. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/schemas.py +1 -1
  11. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/utils.py +1 -1
  12. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool.egg-info/PKG-INFO +3 -3
  13. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/mappers/test_exon_genomic_coords.py +14 -0
  14. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.coveragerc +0 -0
  15. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  16. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  17. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/workflows/checks.yaml +0 -0
  18. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/workflows/pr-priority-label.yaml +0 -0
  19. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/workflows/release.yml +0 -0
  20. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.github/workflows/stale.yaml +0 -0
  21. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.pre-commit-config.yaml +0 -0
  22. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/.readthedocs.yaml +0 -0
  23. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/CITATION.cff +0 -0
  24. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/LICENSE +0 -0
  25. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/README.md +0 -0
  26. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/Makefile +0 -0
  27. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/make.bat +0 -0
  28. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/_static/img/biomart.png +0 -0
  29. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/_templates/module_summary.rst +0 -0
  30. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/changelog.rst +0 -0
  31. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/conf.py +0 -0
  32. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/contributing.rst +0 -0
  33. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/index.rst +0 -0
  34. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/license.rst +0 -0
  35. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/reference/index.rst +0 -0
  36. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/transcript_selection.rst +0 -0
  37. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/docs/source/usage.rst +0 -0
  38. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/setup.cfg +0 -0
  39. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/__init__.py +0 -0
  40. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/app.py +0 -0
  41. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/handlers/__init__.py +0 -0
  42. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/handlers/seqrepo_access.py +0 -0
  43. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/__init__.py +0 -0
  44. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/mappers/liftover.py +0 -0
  45. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/resources/__init__.py +0 -0
  46. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/resources/data_files.py +0 -0
  47. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/resources/transcript_mapping.tsv +0 -0
  48. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/sources/__init__.py +0 -0
  49. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/sources/mane_transcript_mappings.py +0 -0
  50. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/sources/transcript_mappings.py +0 -0
  51. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool/sources/uta_database.py +0 -0
  52. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool.egg-info/SOURCES.txt +0 -0
  53. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool.egg-info/dependency_links.txt +0 -0
  54. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool.egg-info/requires.txt +0 -0
  55. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/src/cool_seq_tool.egg-info/top_level.txt +0 -0
  56. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/conftest.py +0 -0
  57. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/handlers/test_feature_overlap.py +0 -0
  58. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/handlers/test_seqrepo_access.py +0 -0
  59. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/mappers/test_alignment.py +0 -0
  60. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/mappers/test_liftover.py +0 -0
  61. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/mappers/test_mane_transcript.py +0 -0
  62. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/sources/test_mane_transcript_mappings.py +0 -0
  63. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/sources/test_uta_database.py +0 -0
  64. {cool_seq_tool-0.14.2 → cool_seq_tool-0.14.4}/tests/test_utils.py +0 -0
@@ -135,3 +135,6 @@ docs/source/reference/api
135
135
 
136
136
  # Files created by doctests
137
137
  tpm3.fasta
138
+
139
+ # VSCode
140
+ .vscode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cool_seq_tool
3
- Version: 0.14.2
3
+ Version: 0.14.4
4
4
  Summary: Common Operation on Lots of Sequences Tool
5
5
  Author: Kori Kuzma, James Stevenson, Katie Stahl, Alex Wagner
6
6
  License: MIT License
@@ -38,10 +38,10 @@ Classifier: Intended Audience :: Developers
38
38
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
39
39
  Classifier: License :: OSI Approved :: MIT License
40
40
  Classifier: Programming Language :: Python :: 3
41
- Classifier: Programming Language :: Python :: 3.10
42
41
  Classifier: Programming Language :: Python :: 3.11
43
42
  Classifier: Programming Language :: Python :: 3.12
44
- Requires-Python: >=3.10
43
+ Classifier: Programming Language :: Python :: 3.13
44
+ Requires-Python: >=3.11
45
45
  Description-Content-Type: text/markdown
46
46
  License-File: LICENSE
47
47
  Requires-Dist: asyncpg
@@ -6,7 +6,7 @@ Installation
6
6
  Prerequisites
7
7
  -------------
8
8
 
9
- * Python 3.10+
9
+ * Python 3.11+
10
10
  * A UNIX-like environment (e.g. MacOS, WSL, Ubuntu)
11
11
  * A recent version of PostgreSQL (ideally at least 11+)
12
12
 
@@ -16,11 +16,11 @@ classifiers = [
16
16
  "Topic :: Scientific/Engineering :: Bio-Informatics",
17
17
  "License :: OSI Approved :: MIT License",
18
18
  "Programming Language :: Python :: 3",
19
- "Programming Language :: Python :: 3.10",
20
19
  "Programming Language :: Python :: 3.11",
21
20
  "Programming Language :: Python :: 3.12",
21
+ "Programming Language :: Python :: 3.13",
22
22
  ]
23
- requires-python = ">=3.10"
23
+ requires-python = ">=3.11"
24
24
  description = "Common Operation on Lots of Sequences Tool"
25
25
  license = {file = "LICENSE"}
26
26
  dependencies = [
@@ -106,7 +106,7 @@ class AlignmentMapper:
106
106
  c_end_pos: int,
107
107
  cds_start: int | None = None,
108
108
  coordinate_type: CoordinateType = CoordinateType.RESIDUE,
109
- target_genome_assembly: bool = Assembly.GRCH38,
109
+ target_genome_assembly: Assembly = Assembly.GRCH38,
110
110
  ) -> tuple[dict | None, str | None]:
111
111
  """Translate cDNA representation to genomic representation
112
112
 
@@ -65,6 +65,27 @@ class TxSegment(BaseModelForbidExtra):
65
65
  genomic_location: SequenceLocation = Field(
66
66
  ..., description="The genomic position of a transcript segment."
67
67
  )
68
+ is_exonic: bool = Field(
69
+ default=True, description="If the position occurs on an exon"
70
+ )
71
+
72
+ @model_validator(mode="before")
73
+ def check_seg_pos(cls, values: dict) -> dict: # noqa: N805
74
+ """Ensure that only one of `start` or `end` is set in the
75
+ genomic_location field
76
+
77
+ :param values: The values in the TxSegment class
78
+ :raises ValueError: If `start` and `end` are both set in
79
+ `genomic_location`
80
+ :return: Values in model
81
+ """
82
+ loc = values.get("genomic_location")
83
+ start = getattr(loc, "start", None)
84
+ end = getattr(loc, "end", None)
85
+ if start and end:
86
+ err_msg = "Only one of `start` or `end` may be set as this describes the start or end of a transcript segment"
87
+ raise ValueError(err_msg)
88
+ return values
68
89
 
69
90
  model_config = ConfigDict(
70
91
  json_schema_extra={
@@ -79,6 +100,7 @@ class TxSegment(BaseModelForbidExtra):
79
100
  },
80
101
  "end": 154192135,
81
102
  },
103
+ "is_exonic": True,
82
104
  }
83
105
  }
84
106
  )
@@ -136,6 +158,7 @@ class GenomicTxSeg(BaseModelForbidExtra):
136
158
  },
137
159
  "end": 154192135,
138
160
  },
161
+ "is_exonic": True,
139
162
  },
140
163
  "errors": [],
141
164
  }
@@ -202,6 +225,7 @@ class GenomicTxSegService(BaseModelForbidExtra):
202
225
  },
203
226
  "end": 154192135,
204
227
  },
228
+ "is_exonic": True,
205
229
  },
206
230
  "seg_end": {
207
231
  "exon_ord": 7,
@@ -214,6 +238,7 @@ class GenomicTxSegService(BaseModelForbidExtra):
214
238
  },
215
239
  "start": 154170399,
216
240
  },
241
+ "is_exonic": True,
217
242
  },
218
243
  }
219
244
  }
@@ -895,6 +920,7 @@ class ExonGenomicCoordsMapper:
895
920
  # Check if breakpoint occurs on an exon.
896
921
  # If not, determine the adjacent exon given the selected transcript
897
922
  if not self._is_exonic_breakpoint(genomic_pos, tx_exons):
923
+ is_exonic = False
898
924
  exon_num = self._get_adjacent_exon(
899
925
  tx_exons_genomic_coords=tx_exons,
900
926
  strand=strand,
@@ -902,6 +928,7 @@ class ExonGenomicCoordsMapper:
902
928
  end=genomic_pos if not is_seg_start else None,
903
929
  )
904
930
  else:
931
+ is_exonic = True
905
932
  exon_data = await self.uta_db.get_tx_exon_aln_v_data(
906
933
  transcript,
907
934
  genomic_pos,
@@ -934,6 +961,7 @@ class ExonGenomicCoordsMapper:
934
961
  exon_ord=exon_num,
935
962
  offset=offset,
936
963
  genomic_location=genomic_location,
964
+ is_exonic=is_exonic,
937
965
  ),
938
966
  )
939
967
 
@@ -212,14 +212,15 @@ class FeatureOverlap:
212
212
 
213
213
  ga4gh_seq_id = ga4gh_aliases[0]
214
214
 
215
- def _get_seq_loc(start_pos: int, stop_pos: int, refget_ac: str) -> dict:
216
- """Get VRS Sequence Location represented as a dict
215
+ def _get_seq_loc(
216
+ start_pos: int, stop_pos: int, refget_ac: str
217
+ ) -> SequenceLocation:
218
+ """Get VRS Sequence Location
217
219
 
218
220
  :param start_pos: Start position
219
221
  :param stop_pos: Stop position
220
222
  :param refget_ac: Refget Accession (SQ.)
221
- :return: VRS Sequence Location represented as dictionary with the ga4gh ID
222
- included
223
+ :return: VRS Sequence Location
223
224
  """
224
225
  _sl = SequenceLocation(
225
226
  sequenceReference=SequenceReference(
@@ -229,7 +230,7 @@ class FeatureOverlap:
229
230
  end=stop_pos,
230
231
  )
231
232
  ga4gh_identify(_sl)
232
- return _sl.model_dump(exclude_none=True)
233
+ return _sl
233
234
 
234
235
  resp = {}
235
236
  refget_ac = ga4gh_seq_id.split("ga4gh:")[-1]
@@ -55,7 +55,7 @@ class DataRepresentation(BaseModel):
55
55
  """Define object model for final output representation"""
56
56
 
57
57
  gene: str | None = None
58
- refseq: str
58
+ refseq: str | None = None
59
59
  ensembl: str | None = None
60
60
  pos: tuple[int, int]
61
61
  strand: Strand
@@ -447,7 +447,7 @@ class ManeTranscript:
447
447
 
448
448
  async def _g_to_c(
449
449
  self,
450
- g: dict,
450
+ g: GenomicTxMetadata,
451
451
  refseq_c_ac: str,
452
452
  status: TranscriptPriority,
453
453
  ensembl_c_ac: str | None = None,
@@ -590,16 +590,23 @@ class ManeTranscript:
590
590
  if mane_transcript:
591
591
  mane_start_pos = mane_transcript.pos[0]
592
592
  mane_end_pos = mane_transcript.pos[1]
593
- if anno == AnnotationLayer.CDNA:
593
+ if anno == AnnotationLayer.CDNA and isinstance(
594
+ mane_transcript, CdnaRepresentation
595
+ ):
594
596
  mane_cds = mane_transcript.coding_start_site
595
597
  mane_start_pos += mane_cds
596
598
  mane_end_pos += mane_cds
597
- mane_ref, _ = self.seqrepo_access.get_reference_sequence(
598
- mane_transcript.refseq,
599
- start=mane_start_pos,
600
- end=mane_end_pos if mane_start_pos != mane_end_pos else None,
601
- coordinate_type=coordinate_type,
602
- )
599
+
600
+ if mane_transcript.refseq:
601
+ mane_ref, _ = self.seqrepo_access.get_reference_sequence(
602
+ mane_transcript.refseq,
603
+ start=mane_start_pos,
604
+ end=mane_end_pos if mane_start_pos != mane_end_pos else None,
605
+ coordinate_type=coordinate_type,
606
+ )
607
+ else:
608
+ mane_ref = None
609
+
603
610
  if not mane_ref:
604
611
  _logger.info("Unable to validate reference for MANE Transcript")
605
612
 
@@ -1330,7 +1337,7 @@ class ManeTranscript:
1330
1337
  gene: str | None = None,
1331
1338
  coordinate_type: CoordinateType = CoordinateType.RESIDUE,
1332
1339
  try_longest_compatible: bool = False,
1333
- ) -> dict | None:
1340
+ ) -> ProteinAndCdnaRepresentation | None:
1334
1341
  """Given GRCh38 genomic representation, return protein representation.
1335
1342
 
1336
1343
  Will try MANE Select and then MANE Plus Clinical. If neither is found and
@@ -24,6 +24,7 @@ ResourceStatus = namedtuple(
24
24
  DataFile.TRANSCRIPT_MAPPINGS.lower(),
25
25
  DataFile.MANE_SUMMARY.lower(),
26
26
  DataFile.LRG_REFSEQGENE.lower(),
27
+ DataFile.MANE_REFSEQ_GENOMIC.lower(),
27
28
  "liftover",
28
29
  ),
29
30
  )
@@ -37,6 +38,7 @@ async def check_status(
37
38
  sr: SeqRepo | None = None,
38
39
  chain_file_37_to_38: str | None = None,
39
40
  chain_file_38_to_37: str | None = None,
41
+ mane_refseq_genomic_path: str | None = None,
40
42
  ) -> ResourceStatus:
41
43
  """Perform basic status checks on availability of required data resources.
42
44
 
@@ -62,6 +64,7 @@ async def check_status(
62
64
  is used for ``agct``. If this is not provided, will check to see if
63
65
  ``LIFTOVER_CHAIN_38_TO_37`` env var is set. If neither is provided, will allow
64
66
  ``agct`` to download a chain file from UCSC
67
+ :param mane_refseq_genomic_path: Optional path to MANE RefSeq Genomic GFF data
65
68
  :return: boolean description of availability of each resource, given current
66
69
  environment configurations
67
70
  """
@@ -69,19 +72,21 @@ async def check_status(
69
72
  DataFile.TRANSCRIPT_MAPPINGS.lower(): transcript_file_path,
70
73
  DataFile.LRG_REFSEQGENE.lower(): lrg_refseqgene_path,
71
74
  DataFile.MANE_SUMMARY.lower(): mane_data_path,
75
+ DataFile.MANE_REFSEQ_GENOMIC.lower(): mane_refseq_genomic_path,
72
76
  }
73
77
 
74
78
  status = {
75
79
  DataFile.TRANSCRIPT_MAPPINGS.lower(): False,
76
80
  DataFile.LRG_REFSEQGENE.lower(): False,
77
81
  DataFile.MANE_SUMMARY.lower(): False,
82
+ DataFile.MANE_REFSEQ_GENOMIC.lower(): False,
78
83
  "liftover": False,
79
84
  "uta": False,
80
85
  "seqrepo": False,
81
86
  }
82
87
  for r in list(DataFile):
83
88
  name_lower = r.lower()
84
- declared_path = file_path_params[name_lower]
89
+ declared_path = file_path_params.get(name_lower)
85
90
  if declared_path and declared_path.exists() and declared_path.is_file():
86
91
  status[name_lower] = True
87
92
  continue
@@ -14,7 +14,7 @@ from pydantic import (
14
14
 
15
15
  from cool_seq_tool import __version__
16
16
 
17
- _now = str(datetime.datetime.now(tz=datetime.timezone.utc))
17
+ _now = str(datetime.datetime.now(tz=datetime.UTC))
18
18
 
19
19
 
20
20
  class AnnotationLayer(str, Enum):
@@ -47,7 +47,7 @@ def service_meta() -> ServiceMeta:
47
47
  """
48
48
  return ServiceMeta(
49
49
  version=__version__,
50
- response_datetime=datetime.datetime.now(tz=datetime.timezone.utc),
50
+ response_datetime=datetime.datetime.now(tz=datetime.UTC),
51
51
  )
52
52
 
53
53
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cool_seq_tool
3
- Version: 0.14.2
3
+ Version: 0.14.4
4
4
  Summary: Common Operation on Lots of Sequences Tool
5
5
  Author: Kori Kuzma, James Stevenson, Katie Stahl, Alex Wagner
6
6
  License: MIT License
@@ -38,10 +38,10 @@ Classifier: Intended Audience :: Developers
38
38
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
39
39
  Classifier: License :: OSI Approved :: MIT License
40
40
  Classifier: Programming Language :: Python :: 3
41
- Classifier: Programming Language :: Python :: 3.10
42
41
  Classifier: Programming Language :: Python :: 3.11
43
42
  Classifier: Programming Language :: Python :: 3.12
44
- Requires-Python: >=3.10
43
+ Classifier: Programming Language :: Python :: 3.13
44
+ Requires-Python: >=3.11
45
45
  Description-Content-Type: text/markdown
46
46
  License-File: LICENSE
47
47
  Requires-Dist: asyncpg
@@ -184,6 +184,7 @@ def tpm3_exon1():
184
184
  },
185
185
  "end": 154192135,
186
186
  },
187
+ "is_exonic": True,
187
188
  },
188
189
  }
189
190
  return GenomicTxSeg(**params)
@@ -208,6 +209,7 @@ def tpm3_exon8():
208
209
  },
209
210
  "start": 154170399,
210
211
  },
212
+ "is_exonic": True,
211
213
  },
212
214
  }
213
215
  return GenomicTxSeg(**params)
@@ -293,6 +295,7 @@ def mane_braf():
293
295
  },
294
296
  "end": 140801559,
295
297
  },
298
+ "is_exonic": True,
296
299
  },
297
300
  "seg_end": {
298
301
  "exon_ord": 14,
@@ -305,6 +308,7 @@ def mane_braf():
305
308
  },
306
309
  "start": 140753336,
307
310
  },
311
+ "is_exonic": True,
308
312
  },
309
313
  }
310
314
  return GenomicTxSegService(**params)
@@ -438,6 +442,7 @@ def zbtb10_exon3_end():
438
442
  },
439
443
  "end": 80514010,
440
444
  },
445
+ "is_exonic": False,
441
446
  },
442
447
  }
443
448
  return GenomicTxSegService(**params)
@@ -462,6 +467,7 @@ def zbtb10_exon5_start():
462
467
  },
463
468
  "start": 80518580,
464
469
  },
470
+ "is_exonic": False,
465
471
  },
466
472
  "seg_end": None,
467
473
  }
@@ -488,6 +494,7 @@ def tpm3_exon6_end():
488
494
  },
489
495
  "start": 154171410,
490
496
  },
497
+ "is_exonic": False,
491
498
  },
492
499
  }
493
500
  return GenomicTxSegService(**params)
@@ -512,6 +519,7 @@ def tpm3_exon5_start():
512
519
  },
513
520
  "end": 154173080,
514
521
  },
522
+ "is_exonic": False,
515
523
  },
516
524
  "seg_end": None,
517
525
  }
@@ -538,6 +546,7 @@ def gusbp3_exon2_end():
538
546
  },
539
547
  "start": 69680764,
540
548
  },
549
+ "is_exonic": False,
541
550
  },
542
551
  }
543
552
  return GenomicTxSegService(**params)
@@ -562,6 +571,7 @@ def eln_grch38_intronic():
562
571
  },
563
572
  "start": 74028173,
564
573
  },
574
+ "is_exonic": True,
565
575
  },
566
576
  "seg_end": {
567
577
  "exon_ord": 7,
@@ -574,6 +584,7 @@ def eln_grch38_intronic():
574
584
  },
575
585
  "end": 74043599,
576
586
  },
587
+ "is_exonic": False,
577
588
  },
578
589
  }
579
590
  return GenomicTxSegService(**params)
@@ -598,6 +609,7 @@ def gusbp3_exon5_start():
598
609
  },
599
610
  "end": 69645878,
600
611
  },
612
+ "is_exonic": False,
601
613
  },
602
614
  "seg_end": None,
603
615
  }
@@ -648,6 +660,7 @@ def genomic_tx_seg_service_checks(actual, expected=None, is_valid=True):
648
660
  assert (
649
661
  actual_seg.genomic_location.end == expected_seg.genomic_location.end
650
662
  )
663
+ assert actual_seg.is_exonic == expected_seg.is_exonic
651
664
 
652
665
  assert actual.errors == expected.errors
653
666
  else:
@@ -715,6 +728,7 @@ def genomic_tx_seg_checks(actual, expected=None, is_valid=True):
715
728
  actual_seg.genomic_location.start == expected_seg.genomic_location.start
716
729
  )
717
730
  assert actual_seg.genomic_location.end == expected_seg.genomic_location.end
731
+ assert actual_seg.is_exonic == expected_seg.is_exonic
718
732
 
719
733
  assert actual.errors == expected.errors
720
734
  else:
File without changes
File without changes
File without changes