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 malariagen#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 malariagen#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)