mypy: Add types-defusedxml.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2024-11-18 18:53:55 -08:00 committed by Tim Abbott
parent 532aee926c
commit c48ef926e1
6 changed files with 22 additions and 14 deletions

View File

@ -56,7 +56,6 @@ module = [
"bitfield.*", "bitfield.*",
"bmemcached.*", "bmemcached.*",
"circuitbreaker.*", "circuitbreaker.*",
"defusedxml.*", # https://github.com/tiran/defusedxml/issues/46
"digitalocean.*", "digitalocean.*",
"django_auth_ldap.*", "django_auth_ldap.*",
"django_bmemcached.*", "django_bmemcached.*",

View File

@ -3236,6 +3236,10 @@ types-decorator==5.1.8.20240310 \
--hash=sha256:3af75dc38f5baf65b9b53ea6661ce2056c5ca7d70d620d0b1f620285c1242757 \ --hash=sha256:3af75dc38f5baf65b9b53ea6661ce2056c5ca7d70d620d0b1f620285c1242757 \
--hash=sha256:52e316b03783886a8a2abdc228f7071680ba65894545cd2085ebe3cf88684a0e --hash=sha256:52e316b03783886a8a2abdc228f7071680ba65894545cd2085ebe3cf88684a0e
# via -r requirements/mypy.in # via -r requirements/mypy.in
types-defusedxml==0.7.0.20240218 \
--hash=sha256:05688a7724dc66ea74c4af5ca0efc554a150c329cb28c13a64902cab878d06ed \
--hash=sha256:2b7f3c5ca14fdbe728fab0b846f5f7eb98c4bd4fd2b83d25f79e923caa790ced
# via -r requirements/mypy.in
types-docutils==0.21.0.20241005 \ types-docutils==0.21.0.20241005 \
--hash=sha256:48f804a2b50da3a1b1681c4ca1b6184416a6e4129e302d15c44e9d97c59b3365 \ --hash=sha256:48f804a2b50da3a1b1681c4ca1b6184416a6e4129e302d15c44e9d97c59b3365 \
--hash=sha256:4d9021422f2f3fca8b0726fb8949395f66a06c0d951479eb3b1387d75b134430 --hash=sha256:4d9021422f2f3fca8b0726fb8949395f66a06c0d951479eb3b1387d75b134430

View File

@ -11,6 +11,7 @@ types-beautifulsoup4
types-boto types-boto
types-chardet types-chardet
types-decorator types-decorator
types-defusedxml
types-jsonschema types-jsonschema
types-Markdown types-Markdown
types-oauthlib types-oauthlib

View File

@ -51,4 +51,4 @@ API_FEATURE_LEVEL = (
# historical commits sharing the same major version, in which case a # historical commits sharing the same major version, in which case a
# minor version bump suffices. # minor version bump suffices.
PROVISION_VERSION = (302, 0) # bumped 2024-11-18 to upgrade Python requirements PROVISION_VERSION = (303, 0) # bumped 2024-11-18 for types-defusedxml

View File

@ -32,6 +32,7 @@ from zerver.lib.response import json_success
from zerver.lib.subdomains import get_subdomain from zerver.lib.subdomains import get_subdomain
from zerver.lib.typed_endpoint import typed_endpoint, typed_endpoint_without_parameters from zerver.lib.typed_endpoint import typed_endpoint, typed_endpoint_without_parameters
from zerver.lib.url_encoding import append_url_query_string from zerver.lib.url_encoding import append_url_query_string
from zerver.lib.utils import assert_is_not_none
from zerver.models import UserProfile from zerver.models import UserProfile
from zerver.models.realms import get_realm from zerver.models.realms import get_realm
@ -276,10 +277,10 @@ def join_bigbluebutton(request: HttpRequest, *, bigbluebutton: str) -> HttpRespo
raise JsonableError(_("Error connecting to the BigBlueButton server.")) raise JsonableError(_("Error connecting to the BigBlueButton server."))
payload = ElementTree.fromstring(response.text) payload = ElementTree.fromstring(response.text)
if payload.find("messageKey").text == "checksumError": if assert_is_not_none(payload.find("messageKey")).text == "checksumError":
raise JsonableError(_("Error authenticating to the BigBlueButton server.")) raise JsonableError(_("Error authenticating to the BigBlueButton server."))
if payload.find("returncode").text != "SUCCESS": if assert_is_not_none(payload.find("returncode")).text != "SUCCESS":
raise JsonableError(_("BigBlueButton server returned an unexpected error.")) raise JsonableError(_("BigBlueButton server returned an unexpected error."))
join_params = urlencode( join_params = urlencode(
@ -297,7 +298,7 @@ def join_bigbluebutton(request: HttpRequest, *, bigbluebutton: str) -> HttpRespo
# createTime parameter will be created, as the meeting on # createTime parameter will be created, as the meeting on
# the BigBlueButton server has to be recreated. (after a # the BigBlueButton server has to be recreated. (after a
# few minutes) # few minutes)
"createTime": payload.find("createTime").text, "createTime": assert_is_not_none(payload.find("createTime")).text,
}, },
quote_via=quote, quote_via=quote,
) )

View File

@ -12,6 +12,7 @@ from zerver.decorator import webhook_view
from zerver.lib.exceptions import JsonableError, UnsupportedWebhookEventTypeError from zerver.lib.exceptions import JsonableError, UnsupportedWebhookEventTypeError
from zerver.lib.response import json_success from zerver.lib.response import json_success
from zerver.lib.typed_endpoint import typed_endpoint_without_parameters from zerver.lib.typed_endpoint import typed_endpoint_without_parameters
from zerver.lib.utils import assert_is_not_none
from zerver.lib.webhooks.common import check_send_webhook_message from zerver.lib.webhooks.common import check_send_webhook_message
from zerver.models import UserProfile from zerver.models import UserProfile
@ -21,16 +22,18 @@ def api_pivotal_webhook_v3(request: HttpRequest, user_profile: UserProfile) -> t
def get_text(attrs: list[str]) -> str: def get_text(attrs: list[str]) -> str:
start = payload start = payload
try:
for attr in attrs: for attr in attrs:
start = start.find(attr) child = start.find(attr)
return start.text if child is None:
except AttributeError:
return "" return ""
start = child
assert start.text is not None
return start.text
event_type = payload.find("event_type").text event_type = assert_is_not_none(payload.find("event_type")).text
description = payload.find("description").text description = assert_is_not_none(payload.find("description")).text
project_id = payload.find("project_id").text assert description is not None
project_id = assert_is_not_none(payload.find("project_id")).text
story_id = get_text(["stories", "story", "id"]) story_id = get_text(["stories", "story", "id"])
# Ugh, the URL in the XML data is not a clickable URL that works for the user # Ugh, the URL in the XML data is not a clickable URL that works for the user
# so we try to build one that the user can actually click on # so we try to build one that the user can actually click on