Skip to content

Commit 01ffa41

Browse files
authored
Merge pull request #1645 from maykinmedia/ruff-bugbear
Initial pass at applying ruff bugbear
2 parents 993f336 + 93936fe commit 01ffa41

File tree

26 files changed

+126
-76
lines changed

26 files changed

+126
-76
lines changed

ruff.toml

+4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ select = [
4848
"PERF",
4949
# https://docs.astral.sh/ruff/rules/#refurb-furb
5050
"FURB",
51+
# https://docs.astral.sh/ruff/rules/#flake8-bugbear-b
52+
"B006",
53+
"B010",
54+
"B904",
5155
]
5256
ignore = [
5357
# Whitespace before ':' (conflicts with Black)

src/manage.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
try:
1616
import django # noqa
1717
except ImportError:
18-
raise ImportError(
18+
raise ImportError( # noqa: B904
1919
"Couldn't import Django. Are you sure it's installed and "
2020
"available on your PYTHONPATH environment variable? Did you "
2121
"forget to activate a virtual environment?"

src/open_inwoner/accounts/gateways.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ def send(self, to, token, **kwargs):
6464
to,
6565
self.get_message(token),
6666
)
67-
except messagebird.client.ErrorException as e:
68-
for error in e.errors:
67+
except messagebird.client.ErrorException as exc:
68+
for error in exc.errors:
6969
logger.critical(
7070
("Could not send SMS to {to}:\n{error}").format(to=to, error=error)
7171
)
72-
raise GatewayError()
72+
raise GatewayError() from exc
7373
else:
7474
logging.debug('Sent SMS to %s: "%s"', to, self.get_message(token))
7575
return True

src/open_inwoner/cms/cases/views/status.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ def get_context_data(self, **kwargs):
111111
def get(self, request, *args, **kwargs):
112112
try:
113113
ZGWApiGroupConfig.objects.get(pk=self.kwargs["api_group_id"])
114-
except ZGWApiGroupConfig.DoesNotExist:
114+
except ZGWApiGroupConfig.DoesNotExist as exc:
115115
logger.exception("Non-existent ZGWApiGroupConfig passed")
116-
raise Http404
116+
raise Http404 from exc
117117

118118
return super().get(request, *args, **kwargs)
119119

@@ -735,9 +735,9 @@ def get(self, request, *args, **kwargs):
735735

736736
try:
737737
api_group = ZGWApiGroupConfig.objects.get(pk=self.kwargs["api_group_id"])
738-
except ZGWApiGroupConfig.DoesNotExist:
738+
except ZGWApiGroupConfig.DoesNotExist as exc:
739739
logger.exception("Non-existent ZGWApiGroupConfig passed")
740-
raise Http404
740+
raise Http404 from exc
741741

742742
info_object_uuid = kwargs["info_id"]
743743
info_object = fetch_single_information_object_uuid(
@@ -821,9 +821,9 @@ def handle_document_error(self, request, file):
821821
def handle_document_upload(self, request, form):
822822
try:
823823
api_group = ZGWApiGroupConfig.objects.get(pk=self.kwargs["api_group_id"])
824-
except ZGWApiGroupConfig.DoesNotExist:
824+
except ZGWApiGroupConfig.DoesNotExist as exc:
825825
logger.exception("Non-existent ZGWApiGroupConfig passed")
826-
raise Http404
826+
raise Http404 from exc
827827

828828
cleaned_data = form.cleaned_data
829829
files = cleaned_data["files"]

src/open_inwoner/components/tests/abstract.py

+50-13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Any
2+
13
from django.template import Context, Template
24
from django.test import RequestFactory
35

@@ -55,7 +57,7 @@ def test_href(self):
5557
# The tag name, a value of "list_item" would be the equivalent of "{% list_item %}".
5658
tag = ""
5759

58-
def assertContext(self, args: dict = {}) -> any:
60+
def assertContext(self, args: dict | None = None) -> Any:
5961
"""
6062
Asserts that a context is returned by the inclusion tag.
6163
@@ -64,11 +66,12 @@ def assertContext(self, args: dict = {}) -> any:
6466
6567
Returns: The return value of the tag's function.
6668
"""
69+
args = args or {}
6770
context = self.call_function(args)
6871
self.assertTrue(context)
6972
return context
7073

71-
def assertRender(self, args: dict = {}, data={}) -> str:
74+
def assertRender(self, args: dict | None = None, data: dict | None = None) -> str:
7275
"""
7376
Asserts that something is rendered by the tag.
7477
@@ -79,12 +82,14 @@ def assertRender(self, args: dict = {}, data={}) -> str:
7982
8083
Returns: The str rendered by the tag.
8184
"""
85+
data = data or {}
86+
args = args or {}
8287
html = self.render(args, data)
8388
self.assertTrue(html)
8489
return html
8590

8691
def assertSelector(
87-
self, selector: str, args: dict = {}, data: dict = {}
92+
self, selector: str, args: dict | None = None, data: dict | None = None
8893
) -> ResultSet:
8994
"""
9095
Asserts that an HTML tag matching `selector` is present in the tag's rendered output.
@@ -97,12 +102,14 @@ def assertSelector(
97102
98103
Returns: bs4.element.ResultSet
99104
"""
105+
data = data or {}
106+
args = args or {}
100107
nodes = self.select(selector, args, data)
101108
self.assertTrue(nodes, msg=f"Did not find selector {selector}")
102109
return nodes
103110

104111
def assertNotSelector(
105-
self, selector: str, args: dict = {}, data: dict = {}
112+
self, selector: str, args: dict | None = None, data: dict | None = None
106113
) -> ResultSet:
107114
"""
108115
Asserts that an HTML tag matching `selector` is not present in the tag's rendered output.
@@ -115,12 +122,18 @@ def assertNotSelector(
115122
116123
Returns: bs4.element.ResultSet
117124
"""
125+
data = data or {}
126+
args = args or {}
118127
nodes = self.select(selector, args, data)
119128
self.assertFalse(nodes)
120129
return nodes
121130

122131
def assertTextContent(
123-
self, selector: str, text: str, args: dict = {}, data: dict = {}
132+
self,
133+
selector: str,
134+
text: str,
135+
args: dict | None = None,
136+
data: dict | None = None,
124137
) -> str:
125138
"""
126139
Asserts that an HTML tag matching `selector` has textual content matching `text`.
@@ -134,11 +147,13 @@ def assertTextContent(
134147
135148
Returns: bs4.element.ResultSet
136149
"""
150+
data = data or {}
151+
args = args or {}
137152
node = self.select_one(selector, args, data)
138153
self.assertEqual(str(text).strip(), node.text.strip())
139154
return node.text
140155

141-
def render(self, args={}, data={}):
156+
def render(self, args: dict | None = None, data: dict | None = None):
142157
"""
143158
Renders the template tag with arguments (and optionally passing `data` to RequestFactory's query string).
144159
@@ -149,6 +164,7 @@ def render(self, args={}, data={}):
149164
150165
Returns: The str rendered by the tag.
151166
"""
167+
data = data or {}
152168
args = args or {}
153169
template_context = self.get_template_context(args)
154170
context = Context(
@@ -157,7 +173,9 @@ def render(self, args={}, data={}):
157173
template = self.get_template(args)
158174
return template.render(context)
159175

160-
def select_one(self, selector: str, args: dict = {}, data: dict = {}) -> Tag:
176+
def select_one(
177+
self, selector: str, args: dict | None = None, data: dict | None = None
178+
) -> Tag | None:
161179
"""
162180
Returns a bs4.element.Tag for HTML tag matching `selector` within the str rendered by the tag.
163181
@@ -169,11 +187,15 @@ def select_one(self, selector: str, args: dict = {}, data: dict = {}) -> Tag:
169187
170188
Returns: bs4.element.Tag
171189
"""
190+
data = data or {}
191+
args = args or {}
172192
html = self.render(args, data)
173193
soup = BeautifulSoup(html, features="lxml")
174194
return soup.select_one(selector)
175195

176-
def select(self, selector: str, args: dict = {}, data: dict = {}) -> ResultSet:
196+
def select(
197+
self, selector: str, args: dict | None = None, data: dict | None = None
198+
) -> ResultSet:
177199
"""
178200
Returns a bs4.element.ResultSet for HTML tags matching `selector` within the str rendered by the tag.
179201
@@ -185,11 +207,13 @@ def select(self, selector: str, args: dict = {}, data: dict = {}) -> ResultSet:
185207
186208
Returns: bs4.element.ResultSet
187209
"""
210+
data = data or {}
211+
args = args or {}
188212
html = self.render(args, data)
189213
soup = BeautifulSoup(html, features="lxml")
190214
return soup.select(selector)
191215

192-
def call_function(self, args: dict = {}) -> any:
216+
def call_function(self, args: dict | None = None) -> Any:
193217
"""
194218
Calls the tag's function directly.
195219
@@ -198,13 +222,15 @@ def call_function(self, args: dict = {}) -> any:
198222
199223
Returns: The return value of the tag's function.
200224
"""
225+
if args is None:
226+
args = {}
201227
template = self.get_template(args)
202228
nodelist = template.compile_nodelist()
203229
inclusion_node = nodelist[1]
204230
function = inclusion_node.func
205231
return function(**args)
206232

207-
def get_template(self, args={}):
233+
def get_template(self, args: dict | None = None):
208234
"""
209235
Returns the (Django) Template instance (in order to render the tag).
210236
A templates str is constructed and then passed to a django.template.Template, the resulting instance is
@@ -215,6 +241,8 @@ def get_template(self, args={}):
215241
216242
Returns: django.template.Template
217243
"""
244+
if args is None:
245+
args = {}
218246
args = self.get_args(args)
219247
template = (
220248
"{% load " + self.library + " %}{% " + self.tag + " " + args + " " + " %}"
@@ -315,7 +343,9 @@ def test_contents(self):
315343
# A value of "{% list_item %}" would be the equivalent of "{% render_list %}{% list_item %}{% endrender_list %}".
316344
contents = ""
317345

318-
def assertContents(self, args={}, data={}, contents_context={}) -> str:
346+
def assertContents(
347+
self, args: dict | None = None, data: dict | None = None, contents_context=None
348+
) -> str:
319349
"""
320350
Asserts that rendered HTML of contents is present in the tag's rendered output.
321351
@@ -327,13 +357,16 @@ def assertContents(self, args={}, data={}, contents_context={}) -> str:
327357
328358
Returns: The contents html.
329359
"""
360+
contents_context = contents_context or {}
361+
data = data or {}
362+
args = args or {}
330363
html = self.render(args, data)
331364
context = Context(contents_context)
332365
contents_html = self.get_contents(context)
333366
self.assertIn(contents_html, html)
334367
return contents_html
335368

336-
def get_contents(self, context: Context | dict = {}) -> str:
369+
def get_contents(self, context: Context | dict | None = None) -> str:
337370
"""
338371
Renders contents HTML.
339372
@@ -342,11 +375,13 @@ def get_contents(self, context: Context | dict = {}) -> str:
342375
343376
Returns: The contents html.
344377
"""
378+
if context is None:
379+
context = {}
345380
return Template("{% load " + self.library + " %}" + self.contents).render(
346381
context
347382
)
348383

349-
def get_template(self, args={}):
384+
def get_template(self, args: dict | None = None):
350385
"""
351386
Returns the (Django) Template instance (in order to render the tag).
352387
A templates str is constructed and then passed to a django.template.Template, the resulting instance is
@@ -357,6 +392,8 @@ def get_template(self, args={}):
357392
358393
Returns: django.template.Template
359394
"""
395+
if args is None:
396+
args = {}
360397
args = self.get_args(args)
361398
template = (
362399
"{% load "

src/open_inwoner/configurations/admin.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,13 @@ def clean_redirect_to(self):
109109
try:
110110
resolve(redirect_to)
111111
except Resolver404:
112-
raise ValidationError(_("The entered path is invalid."))
112+
raise ValidationError(_("The entered path is invalid.")) from None
113113
else:
114114
validate_url = URLValidator()
115115
try:
116116
validate_url(redirect_to)
117117
except exceptions.ValidationError:
118-
raise ValidationError(_("The entered url is invalid."))
118+
raise ValidationError(_("The entered url is invalid.")) from None
119119

120120
return redirect_to
121121

src/open_inwoner/configurations/bootstrap/auth.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -428,10 +428,10 @@ def configure(self):
428428

429429
try:
430430
form.save()
431-
except ValidationError as e:
431+
except ValidationError as exc:
432432
raise ConfigurationRunFailed(
433433
"Something went wrong while saving configuration"
434-
) from e
434+
) from exc
435435

436436
def test_configuration(self):
437437
"""

src/open_inwoner/configurations/bootstrap/utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ def get_service(slug: str) -> Service:
2828
"""
2929
try:
3030
return Service.objects.get(slug=slug)
31-
except Service.DoesNotExist as e:
32-
raise Service.DoesNotExist(f"{str(e)} (identifier = {slug})")
31+
except Service.DoesNotExist as exc:
32+
raise Service.DoesNotExist(f"{str(exc)} (identifier = {slug})") from exc

src/open_inwoner/configurations/bootstrap/zgw.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def execute(self, model: OpenZaakConfigurationModel):
8585
raise ConfigurationRunFailed(
8686
"You must first ensure all the ZGW Services referenced in this "
8787
f"step have been created:\n{str(exc)}"
88-
)
88+
) from exc
8989

9090
ZGWApiGroupConfig.objects.get_or_create(
9191
open_zaak_config=config,

src/open_inwoner/mail/verification.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ def decode_email_verification_token(token: str) -> Payload:
4646
signer = signing.TimestampSigner(salt=VERIFY_SALT)
4747
try:
4848
payload: Payload = signer.unsign_object(token, max_age=VERIFY_MAX_AGE)
49-
except signing.BadSignature:
50-
raise BadToken("invalid signature")
49+
except signing.BadSignature as exc:
50+
raise BadToken("invalid signature") from exc
5151
else:
5252
return payload
5353

src/open_inwoner/openklant/tests/mocks.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ def __init__(self):
1212
def get_fetch_parameters(self, request=None, user=None, use_vestigingsnummer=False):
1313
return {"user_bsn": "123456789"}
1414

15-
def get_or_create_partij_for_user(self, fetch_params={}, user=None):
15+
def get_or_create_partij_for_user(self, fetch_params=None, user=None):
1616
return {"uuid": "0d150ff9-0924-46f6-8ef9-17fee9e54d23"}, False
1717

18-
def list_questions(self, fetch_params={}, user=None):
18+
def list_questions(self, fetch_params=None, user=None):
1919
return [self.retrieve_question()[0]]
2020

2121
def retrieve_question(
22-
self, fetch_params={}, question_uuid="", user=None, new_answer_available=False
22+
self, fetch_params=None, question_uuid="", user=None, new_answer_available=False
2323
):
2424
return (
2525
{

src/open_inwoner/openklant/views/utils.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
def generate_question_answer_pair(
77
range_: tuple[int, int] = (1, 10),
8-
operators: list[str] = ["+", "-"],
8+
operators: list[str] | None = None,
99
) -> tuple[str, int]:
10+
operators = operators or ["+", "-"]
1011
lower, upper = range_
1112
num1 = secrets.choice(range(lower, upper))
1213
num2 = secrets.choice(range(lower, upper))

src/open_inwoner/openzaak/auth.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def get_valid_subscription_from_jwt(jwt_string: str) -> Subscription:
4040
},
4141
)
4242
client_id = decoded_unverified.get("client_id")
43-
except InvalidTokenError:
44-
raise InvalidAuth(f"cannot decode token: {jwt_string}")
43+
except InvalidTokenError as exc:
44+
raise InvalidAuth(f"cannot decode token: {jwt_string}") from exc
4545

4646
if not client_id:
4747
raise InvalidAuth(f"missing 'client_id' in token: {jwt_string}")

0 commit comments

Comments
 (0)