Skip to content

Commit 24af343

Browse files
committed
Ruff: enable B904: Use raise from to specify exception cause (PYTHON2.7 COMPAT)
1 parent b1b42c4 commit 24af343

File tree

8 files changed

+30
-27
lines changed

8 files changed

+30
-27
lines changed

demo/md5_ftpd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def validate_authentication(self, username, password, handler):
2525
if self.user_table[username]["pwd"] != hash_:
2626
raise KeyError
2727
except KeyError:
28-
raise AuthenticationFailed
28+
raise AuthenticationFailed from None
2929

3030

3131
def main():

pyftpdlib/__main__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ def parse_encoding(value):
5959
try:
6060
codecs.lookup(value)
6161
except LookupError:
62-
raise argparse.ArgumentTypeError(f"unknown encoding: {value!r}")
62+
raise argparse.ArgumentTypeError(
63+
f"unknown encoding: {value!r}"
64+
) from None
6365
return value
6466

6567

@@ -70,7 +72,7 @@ def parse_port_range(value):
7072
except ValueError:
7173
raise argparse.ArgumentTypeError(
7274
f"invalid port range: {value!r} (expected FROM-TO)"
73-
)
75+
) from None
7476
if not (1 <= start <= 65535 and 1 <= stop <= 65535):
7577
raise argparse.ArgumentTypeError(
7678
"port numbers must be between 1 and 65535"

pyftpdlib/authorizers.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,10 @@ def __init__(self, anonymous_user=None):
422422
if self.anonymous_user is not None:
423423
try:
424424
pwd.getpwnam(self.anonymous_user).pw_dir # noqa
425-
except KeyError:
426-
raise AuthorizerError(f"no such user {anonymous_user}")
425+
except KeyError as err:
426+
raise AuthorizerError(
427+
f"no such user {anonymous_user}"
428+
) from err
427429

428430
# --- overridden / private API
429431

@@ -438,8 +440,8 @@ def validate_authentication(self, username, password, handler):
438440
try:
439441
pw1 = spwd.getspnam(username).sp_pwd
440442
pw2 = crypt.crypt(password, pw1)
441-
except KeyError: # no such username
442-
raise AuthenticationFailed(self.msg_no_such_user)
443+
except KeyError as err: # no such username
444+
raise AuthenticationFailed(self.msg_no_such_user) from err
443445
else:
444446
if pw1 != pw2:
445447
raise AuthenticationFailed(self.msg_wrong_password)
@@ -451,8 +453,8 @@ def impersonate_user(self, username, password):
451453
"""
452454
try:
453455
pwdstruct = pwd.getpwnam(username)
454-
except KeyError:
455-
raise AuthorizerError(self.msg_no_such_user)
456+
except KeyError as err:
457+
raise AuthorizerError(self.msg_no_such_user) from err
456458
else:
457459
os.setegid(pwdstruct.pw_gid)
458460
os.seteuid(pwdstruct.pw_uid)
@@ -475,8 +477,8 @@ def get_home_dir(self, username):
475477
"""Return user home directory."""
476478
try:
477479
return pwd.getpwnam(username).pw_dir
478-
except KeyError:
479-
raise AuthorizerError(self.msg_no_such_user)
480+
except KeyError as err:
481+
raise AuthorizerError(self.msg_no_such_user) from err
480482

481483
@staticmethod
482484
def _get_system_users():
@@ -713,8 +715,8 @@ def validate_authentication(self, username, password, handler):
713715
win32con.LOGON32_LOGON_INTERACTIVE,
714716
win32con.LOGON32_PROVIDER_DEFAULT,
715717
)
716-
except pywintypes.error:
717-
raise AuthenticationFailed(self.msg_wrong_password)
718+
except pywintypes.error as err:
719+
raise AuthenticationFailed(self.msg_wrong_password) from err
718720

719721
@replace_anonymous
720722
def impersonate_user(self, username, password):
@@ -747,15 +749,15 @@ def get_home_dir(self, username):
747749
win32security.LookupAccountName(None, username)[0]
748750
)
749751
except pywintypes.error as err:
750-
raise AuthorizerError(err)
752+
raise AuthorizerError(err) from err
751753
path = r"SOFTWARE\Microsoft\Windows NT"
752754
path += r"\CurrentVersion\ProfileList" + "\\" + sid
753755
try:
754756
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
755-
except OSError:
757+
except OSError as err:
756758
raise AuthorizerError(
757759
f"No profile directory defined for user {username}"
758-
)
760+
) from err
759761
value = winreg.QueryValueEx(key, "ProfileImagePath")[0]
760762
home = win32api.ExpandEnvironmentStrings(value)
761763
return home

pyftpdlib/handlers.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ def initiate_sendfile(self):
816816
logger.warning(
817817
"sendfile() failed; falling back on using plain send"
818818
)
819-
raise _GiveUpOnSendfile
819+
raise _GiveUpOnSendfile from err
820820
else:
821821
raise
822822
else:
@@ -935,7 +935,7 @@ def handle_read(self):
935935
try:
936936
self.file_obj.write(chunk)
937937
except OSError as err:
938-
raise _FileReadWriteError(err)
938+
raise _FileReadWriteError(err) from err
939939

940940
handle_read_event = handle_read # small speedup
941941

@@ -1192,7 +1192,7 @@ def more(self):
11921192
try:
11931193
data = self.file.read(self.buffer_size)
11941194
except OSError as err:
1195-
raise _FileReadWriteError(err)
1195+
raise _FileReadWriteError(err) from err
11961196
else:
11971197
if self._data_wrapper is not None:
11981198
data = self._data_wrapper(data)
@@ -3469,14 +3469,14 @@ def send(self, data):
34693469
def recv(self, buffer_size):
34703470
try:
34713471
return super().recv(buffer_size)
3472-
except SSL.WantReadError:
3472+
except SSL.WantReadError as err:
34733473
debug("call: recv(), err: ssl-want-read", inst=self)
34743474
self._ssl_want_read = True
3475-
raise RetryError
3476-
except SSL.WantWriteError:
3475+
raise RetryError from err
3476+
except SSL.WantWriteError as err:
34773477
debug("call: recv(), err: ssl-want-write", inst=self)
34783478
self._ssl_want_write = True
3479-
raise RetryError
3479+
raise RetryError from err
34803480
except SSL.ZeroReturnError:
34813481
debug(
34823482
"call: recv() -> shutdown(), err: zero-return", inst=self

pyftpdlib/ioloop.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ def recv(self, buffer_size):
949949
self.handle_close()
950950
return b""
951951
elif err.errno in _ERRNOS_RETRY:
952-
raise RetryError
952+
raise RetryError from err
953953
else:
954954
raise
955955
else:

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ ignore = [
2727
"A", # flake8-builtins
2828
"ANN", # flake8-annotations
2929
"ARG", # flake8-unused-arguments
30-
"B904", # Use `raise from` to specify exception cause (PYTHON2.7 COMPAT)
3130
"BLE001", # Do not catch blind exception: `Exception`
3231
"C4", # flake8-comprehensions (PYTHON2.7 COMPAT)
3332
# "C408", # Unnecessary `dict` call (rewrite as a literal)

tests/test_authorizers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def assertRaisesWithMsg(self, excClass, msg, callableObj, *args, **kwargs):
230230
except excClass as err:
231231
if str(err) == msg:
232232
return
233-
raise self.failureException(f"{err!s} != {msg}")
233+
raise self.failureException(f"{err!s} != {msg}") from err
234234
else:
235235
if hasattr(excClass, "__name__"):
236236
excName = excClass.__name__

tests/test_functional_ssl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def assertRaisesWithMsg(self, excClass, msg, callableObj, *args, **kwargs):
199199
except excClass as err:
200200
if str(err) == msg:
201201
return
202-
raise self.failureException(f"{err!s} != {msg}")
202+
raise self.failureException(f"{err!s} != {msg}") from err
203203
else:
204204
if hasattr(excClass, "__name__"):
205205
excName = excClass.__name__

0 commit comments

Comments
 (0)