Skip to content

Commit 270aff1

Browse files
Enable ruff/bugbear rules (B) and fix issues (#1702)
* Enable ruff/bugbear rules (B) As suggested by Repo-Review. * Fix ruff/bugbear issue (B007) B007 Loop control variable `key` not used within loop body https://docs.astral.sh/ruff/rules/unused-loop-control-variable/ * Fix ruff/bugbear issue (B015) B015 Pointless comparison. Did you mean to assign a value? Otherwise, prepend `assert` or remove it. https://docs.astral.sh/ruff/rules/useless-comparison/ * Fix ruff/bugbear issues (B028) B028 No explicit `stacklevel` keyword argument found https://docs.astral.sh/ruff/rules/no-explicit-stacklevel/ * Fix ruff/bugbear issues (B904) B904 Within an `except` clause, raise exceptions with `raise ... from err` or `raise ... from None` to distinguish them from errors in exception handling https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/ * Document changes in docs/release.rst * Disable ruff/bugbear rule (B017) B017 `pytest.raises(Exception)` should be considered evil https://docs.astral.sh/ruff/rules/assert-raises-exception/ --------- Co-authored-by: Joe Hamman <joe@earthmover.io>
1 parent 360eb53 commit 270aff1

16 files changed

+67
-43
lines changed

docs/release.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ Docs
3434

3535
Maintenance
3636
~~~~~~~~~~~
37+
* Enable ruff/bugbear rules (B) and fix issues.
38+
By :user:`Dimitri Papadopoulos Orfanos <DimitriPapadopoulos>` :issue:`1702`.
39+
3740
* Minor updates to use `np.inf` instead of `np.PINF` / `np.NINF` in preparation for NumPy 2.0.0 release.
3841
By :user:`Joe Hamman <jhamman>` :issue:`1842`.
3942

pyproject.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ exclude = [
103103
"docs"
104104
]
105105

106+
[tool.ruff.lint]
107+
extend-select = [
108+
"B"
109+
]
110+
106111
[tool.black]
107112
line-length = 100
108113
exclude = '''

zarr/_storage/absstore.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ def __getitem__(self, key):
156156
blob_name = self._append_path_to_prefix(key)
157157
try:
158158
return self.client.download_blob(blob_name).readall()
159-
except ResourceNotFoundError:
160-
raise KeyError(f"Blob {blob_name} not found")
159+
except ResourceNotFoundError as e:
160+
raise KeyError(f"Blob {blob_name} not found") from e
161161

162162
def __setitem__(self, key, value):
163163
value = ensure_bytes(value)
@@ -169,8 +169,8 @@ def __delitem__(self, key):
169169

170170
try:
171171
self.client.delete_blob(self._append_path_to_prefix(key))
172-
except ResourceNotFoundError:
173-
raise KeyError(f"Blob {key} not found")
172+
except ResourceNotFoundError as e:
173+
raise KeyError(f"Blob {key} not found") from e
174174

175175
def __eq__(self, other):
176176
return (

zarr/_storage/v3_storage_transformers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ def __getitem__(self, key):
183183
shard_key, chunk_subkey = self._key_to_shard(key)
184184
try:
185185
full_shard_value = self.inner_store[shard_key]
186-
except KeyError:
187-
raise KeyError(key)
186+
except KeyError as e:
187+
raise KeyError(key) from e
188188
index = self._get_index_from_buffer(full_shard_value)
189189
chunk_slice = index.get_chunk_slice(chunk_subkey)
190190
if chunk_slice is not None:
@@ -265,8 +265,8 @@ def __delitem__(self, key):
265265
shard_key, chunk_subkey = self._key_to_shard(key)
266266
try:
267267
index = self._get_index_from_store(shard_key)
268-
except KeyError:
269-
raise KeyError(key)
268+
except KeyError as e:
269+
raise KeyError(key) from e
270270

271271
index.set_chunk_slice(chunk_subkey, None)
272272

zarr/core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@ def _load_metadata_nosync(self):
200200
try:
201201
mkey = _prefix_to_array_key(self._store, self._key_prefix)
202202
meta_bytes = self._store[mkey]
203-
except KeyError:
204-
raise ArrayNotFoundError(self._path)
203+
except KeyError as e:
204+
raise ArrayNotFoundError(self._path) from e
205205
else:
206206
# decode and store metadata as instance members
207207
meta = self._store._metadata_class.decode_array_metadata(meta_bytes)

zarr/creation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ def _kwargs_compat(compressor, fill_value, kwargs):
297297

298298
# ignore other keyword arguments
299299
for k in kwargs:
300-
warn(f"ignoring keyword argument {k!r}")
300+
warn(f"ignoring keyword argument {k!r}", stacklevel=2)
301301

302302
return compressor, fill_value
303303

zarr/hierarchy.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,16 @@ def __init__(
187187
mkey = _prefix_to_group_key(self._store, self._key_prefix)
188188
assert not mkey.endswith("root/.group")
189189
meta_bytes = store[mkey]
190-
except KeyError:
190+
except KeyError as e:
191191
if self._version == 2:
192-
raise GroupNotFoundError(path)
192+
raise GroupNotFoundError(path) from e
193193
else:
194194
implicit_prefix = meta_root + self._key_prefix
195195
if self._store.list_prefix(implicit_prefix):
196196
# implicit group does not have any metadata
197197
self._meta = None
198198
else:
199-
raise GroupNotFoundError(path)
199+
raise GroupNotFoundError(path) from e
200200
else:
201201
self._meta = self._store._metadata_class.decode_group_metadata(meta_bytes)
202202

@@ -536,8 +536,8 @@ def __getattr__(self, item):
536536
# allow access to group members via dot notation
537537
try:
538538
return self.__getitem__(item)
539-
except KeyError:
540-
raise AttributeError
539+
except KeyError as e:
540+
raise AttributeError from e
541541

542542
def __dir__(self):
543543
# noinspection PyUnresolvedReferences

zarr/indexing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ def check_fields(fields, dtype):
932932
# multiple field selection
933933
out_dtype = np.dtype([(f, dtype[f]) for f in fields])
934934
except KeyError as e:
935-
raise IndexError(f"invalid 'fields' argument, field not found: {e!r}")
935+
raise IndexError(f"invalid 'fields' argument, field not found: {e!r}") from e
936936
else:
937937
return out_dtype
938938
else:

zarr/meta.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ def decode_dtype(cls, d, validate=True):
310310
# extract the type from the extension info
311311
try:
312312
d = d["type"]
313-
except KeyError:
314-
raise KeyError("Extended dtype info must provide a key named 'type'.")
313+
except KeyError as e:
314+
raise KeyError("Extended dtype info must provide a key named 'type'.") from e
315315
d = cls._decode_dtype_descr(d)
316316
dtype = np.dtype(d)
317317
if validate:
@@ -518,7 +518,7 @@ def decode_array_metadata(cls, s: Union[MappingType, bytes, str]) -> MappingType
518518
meta["storage_transformers"] = storage_transformers
519519

520520
except Exception as e:
521-
raise MetadataError(f"error decoding metadata: {e}")
521+
raise MetadataError(f"error decoding metadata: {e}") from e
522522
else:
523523
return meta
524524

zarr/meta_v1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def decode_metadata(b):
2323
order=meta["order"],
2424
)
2525
except Exception as e:
26-
raise MetadataError(f"error decoding metadata: {e}")
26+
raise MetadataError(f"error decoding metadata: {e}") from e
2727
else:
2828
return meta
2929

0 commit comments

Comments
 (0)