Skip to content

Commit 8c9d457

Browse files
Fix fragile cache name property pattern for _xpehh_gwss_cache_name and _ihs_gwss_cache_name
Replace abstract @Property @AbstractMethod pattern with safe resolver methods that always return concrete cache name strings. This prevents NotImplementedError crashes from MRO edge cases or version skew, following the same pattern from fix #1193 for _roh_hmm_cache_name. Changes: - Add _get_xpehh_gwss_cache_name() safe resolver in anopheles.py - Add _get_ihs_gwss_cache_name() safe resolver in anopheles.py - Update call sites to use resolver methods instead of property access - Remove fragile class attribute overrides from species classes (af1, adar1, ag3, adir1, amin1) Fixes #1151 pattern for two additional cache name properties
1 parent 068a395 commit 8c9d457

6 files changed

Lines changed: 35 additions & 32 deletions

File tree

malariagen_data/adar1.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ class Adar1(AnophelesDataResource):
7575
7676
"""
7777

78-
_xpehh_gwss_cache_name = XPEHH_GWSS_CACHE_NAME
79-
_ihs_gwss_cache_name = IHS_GWSS_CACHE_NAME
8078
_roh_hmm_cache_name = ROH_HMM_CACHE_NAME
8179

8280
def __init__(
@@ -182,7 +180,7 @@ def _repr_html_(self):
182180
<th style="text-align: left">
183181
Data releases available
184182
</th>
185-
<td>{', '.join(self._available_releases)}</td>
183+
<td>{", ".join(self._available_releases)}</td>
186184
</tr>
187185
<tr>
188186
<th style="text-align: left">
@@ -230,7 +228,7 @@ def _repr_html_(self):
230228
<th style="text-align: left">
231229
Relevant data releases
232230
</th>
233-
<td>{', '.join(self.releases)}</td>
231+
<td>{", ".join(self.releases)}</td>
234232
</tr>
235233
</tbody>
236234
</table>

malariagen_data/adir1.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ class Adir1(AnophelesDataResource):
7575
7676
"""
7777

78-
_xpehh_gwss_cache_name = XPEHH_GWSS_CACHE_NAME
79-
_ihs_gwss_cache_name = IHS_GWSS_CACHE_NAME
8078
_roh_hmm_cache_name = ROH_HMM_CACHE_NAME
8179

8280
def __init__(
@@ -182,7 +180,7 @@ def _repr_html_(self):
182180
<th style="text-align: left">
183181
Data releases available
184182
</th>
185-
<td>{', '.join(self._available_releases)}</td>
183+
<td>{", ".join(self._available_releases)}</td>
186184
</tr>
187185
<tr>
188186
<th style="text-align: left">
@@ -230,7 +228,7 @@ def _repr_html_(self):
230228
<th style="text-align: left">
231229
Relevant data releases
232230
</th>
233-
<td>{', '.join(self.releases)}</td>
231+
<td>{", ".join(self.releases)}</td>
234232
</tr>
235233
</tbody>
236234
</table>

malariagen_data/af1.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ class Af1(AnophelesDataResource):
7777
7878
"""
7979

80-
_xpehh_gwss_cache_name = XPEHH_GWSS_CACHE_NAME
81-
_ihs_gwss_cache_name = IHS_GWSS_CACHE_NAME
8280
_roh_hmm_cache_name = ROH_HMM_CACHE_NAME
8381

8482
def __init__(
@@ -184,7 +182,7 @@ def _repr_html_(self):
184182
<th style="text-align: left">
185183
Data releases available
186184
</th>
187-
<td>{', '.join(self._available_releases)}</td>
185+
<td>{", ".join(self._available_releases)}</td>
188186
</tr>
189187
<tr>
190188
<th style="text-align: left">
@@ -232,7 +230,7 @@ def _repr_html_(self):
232230
<th style="text-align: left">
233231
Relevant data releases
234232
</th>
235-
<td>{', '.join(self.releases)}</td>
233+
<td>{", ".join(self.releases)}</td>
236234
</tr>
237235
</tbody>
238236
</table>

malariagen_data/ag3.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,6 @@ class Ag3(AnophelesDataResource):
155155
156156
"""
157157

158-
_xpehh_gwss_cache_name = XPEHH_GWSS_CACHE_NAME
159-
_ihs_gwss_cache_name = IHS_GWSS_CACHE_NAME
160158
_roh_hmm_cache_name = ROH_HMM_CACHE_NAME
161159

162160
def __init__(
@@ -278,7 +276,7 @@ def _repr_html_(self):
278276
<th style="text-align: left">
279277
Data releases available
280278
</th>
281-
<td>{', '.join(self._available_releases)}</td>
279+
<td>{", ".join(self._available_releases)}</td>
282280
</tr>
283281
<tr>
284282
<th style="text-align: left">
@@ -332,7 +330,7 @@ def _repr_html_(self):
332330
<th style="text-align: left">
333331
Relevant data releases
334332
</th>
335-
<td>{', '.join(self.releases)}</td>
333+
<td>{", ".join(self.releases)}</td>
336334
</tr>
337335
</tbody>
338336
</table>

malariagen_data/amin1.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ class Amin1(AnophelesDataResource):
7575
7676
"""
7777

78-
_xpehh_gwss_cache_name = XPEHH_GWSS_CACHE_NAME
79-
_ihs_gwss_cache_name = IHS_GWSS_CACHE_NAME
8078
_roh_hmm_cache_name = ROH_HMM_CACHE_NAME
8179

8280
def __init__(
@@ -182,7 +180,7 @@ def _repr_html_(self):
182180
<th style="text-align: left">
183181
Data releases available
184182
</th>
185-
<td>{', '.join(self.releases)}</td>
183+
<td>{", ".join(self.releases)}</td>
186184
</tr>
187185
<tr>
188186
<th style="text-align: left">
@@ -230,7 +228,7 @@ def _repr_html_(self):
230228
<th style="text-align: left">
231229
Relevant data releases
232230
</th>
233-
<td>{', '.join(self.releases)}</td>
231+
<td>{", ".join(self.releases)}</td>
234232
</tr>
235233
</tbody>
236234
</table>

malariagen_data/anopheles.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from abc import abstractmethod
21
from typing import Any, Dict, Mapping, Optional, Tuple, Sequence
32

43
import allel # type: ignore
@@ -180,15 +179,29 @@ def __init__(
180179
surveillance_use_only=surveillance_use_only,
181180
)
182181

183-
@property
184-
@abstractmethod
185-
def _xpehh_gwss_cache_name(self):
186-
raise NotImplementedError("Must override _xpehh_gwss_cache_name")
187-
188-
@property
189-
@abstractmethod
190-
def _ihs_gwss_cache_name(self):
191-
raise NotImplementedError("Must override _ihs_gwss_cache_name")
182+
def _get_xpehh_gwss_cache_name(self):
183+
"""Safe resolver for xpehh gwss cache name.
184+
185+
Subclasses should define _xpehh_gwss_cache_name as a class attribute.
186+
This method safely retrieves it or returns a default if unavailable.
187+
"""
188+
cache_name = getattr(self.__class__, "_xpehh_gwss_cache_name", None)
189+
if cache_name is None:
190+
# Fallback to a generic cache name if subclass hasn't defined one
191+
cache_name = "xpehh_gwss_v1"
192+
return cache_name
193+
194+
def _get_ihs_gwss_cache_name(self):
195+
"""Safe resolver for ihs gwss cache name.
196+
197+
Subclasses should define _ihs_gwss_cache_name as a class attribute.
198+
This method safely retrieves it or returns a default if unavailable.
199+
"""
200+
cache_name = getattr(self.__class__, "_ihs_gwss_cache_name", None)
201+
if cache_name is None:
202+
# Fallback to a generic cache name if subclass hasn't defined one
203+
cache_name = "ihs_gwss_v1"
204+
return cache_name
192205

193206
@staticmethod
194207
def _make_gene_cnv_label(gene_id, gene_name, cnv_type):
@@ -725,7 +738,7 @@ def ihs_gwss(
725738
) -> Tuple[np.ndarray, np.ndarray]:
726739
# change this name if you ever change the behaviour of this function, to
727740
# invalidate any previously cached data
728-
name = self._ihs_gwss_cache_name
741+
name = self._get_ihs_gwss_cache_name()
729742

730743
params = dict(
731744
contig=contig,
@@ -1249,7 +1262,7 @@ def xpehh_gwss(
12491262
) -> Tuple[np.ndarray, np.ndarray]:
12501263
# change this name if you ever change the behaviour of this function, to
12511264
# invalidate any previously cached data
1252-
name = self._xpehh_gwss_cache_name
1265+
name = self._get_xpehh_gwss_cache_name()
12531266

12541267
params = dict(
12551268
contig=contig,

0 commit comments

Comments
 (0)