ruff: Enable B008 function-call-in-default-argument.

https://docs.astral.sh/ruff/rules/function-call-in-default-argument/

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2024-11-10 16:51:07 -08:00 committed by Tim Abbott
parent b85dcd0175
commit b3f18b805d
6 changed files with 17 additions and 13 deletions

View File

@ -20,7 +20,7 @@ from django.utils.timezone import now as timezone_now
from typing_extensions import override from typing_extensions import override
from confirmation import settings as confirmation_settings from confirmation import settings as confirmation_settings
from zerver.lib.types import UnspecifiedValue from zerver.lib.types import UNSET, Unset
from zerver.models import ( from zerver.models import (
EmailChangeStatus, EmailChangeStatus,
MultiuseInvite, MultiuseInvite,
@ -129,7 +129,7 @@ def create_confirmation_object(
obj: ConfirmationObjT, obj: ConfirmationObjT,
confirmation_type: int, confirmation_type: int,
*, *,
validity_in_minutes: int | None | UnspecifiedValue = UnspecifiedValue(), validity_in_minutes: int | None | Unset = UNSET,
no_associated_realm_object: bool = False, no_associated_realm_object: bool = False,
) -> "Confirmation": ) -> "Confirmation":
# validity_in_minutes is an override for the default values which are # validity_in_minutes is an override for the default values which are
@ -149,7 +149,7 @@ def create_confirmation_object(
current_time = timezone_now() current_time = timezone_now()
expiry_date = None expiry_date = None
if not isinstance(validity_in_minutes, UnspecifiedValue): if not isinstance(validity_in_minutes, Unset):
if validity_in_minutes is None: if validity_in_minutes is None:
expiry_date = None expiry_date = None
else: else:
@ -172,7 +172,7 @@ def create_confirmation_link(
obj: ConfirmationObjT, obj: ConfirmationObjT,
confirmation_type: int, confirmation_type: int,
*, *,
validity_in_minutes: int | None | UnspecifiedValue = UnspecifiedValue(), validity_in_minutes: int | None | Unset = UNSET,
url_args: Mapping[str, str] = {}, url_args: Mapping[str, str] = {},
no_associated_realm_object: bool = False, no_associated_realm_object: bool = False,
) -> str: ) -> str:

View File

@ -145,7 +145,6 @@ ignore = [
"ANN102", # Missing type annotation for `cls` in classmethod "ANN102", # Missing type annotation for `cls` in classmethod
"ANN401", # Dynamically typed expressions (typing.Any) are disallowed "ANN401", # Dynamically typed expressions (typing.Any) are disallowed
"B007", # Loop control variable not used within the loop body "B007", # Loop control variable not used within the loop body
"B008", # Do not perform function calls in argument defaults
"B904", # Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling "B904", # Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
"C408", # Unnecessary `dict` call (rewrite as a literal) "C408", # Unnecessary `dict` call (rewrite as a literal)
"COM812", # Trailing comma missing "COM812", # Trailing comma missing

View File

@ -1746,6 +1746,9 @@ class ClientCapabilities(TypedDict):
archived_channels: NotRequired[bool] archived_channels: NotRequired[bool]
DEFAULT_CLIENT_CAPABILITIES = ClientCapabilities(notification_settings_null=False)
def do_events_register( def do_events_register(
user_profile: UserProfile | None, user_profile: UserProfile | None,
realm: Realm, realm: Realm,
@ -1760,7 +1763,7 @@ def do_events_register(
all_public_streams: bool = False, all_public_streams: bool = False,
include_subscribers: bool = True, include_subscribers: bool = True,
include_streams: bool = True, include_streams: bool = True,
client_capabilities: ClientCapabilities = ClientCapabilities(notification_settings_null=False), client_capabilities: ClientCapabilities = DEFAULT_CLIENT_CAPABILITIES,
narrow: Collection[NarrowTerm] = [], narrow: Collection[NarrowTerm] = [],
fetch_event_types: Collection[str] | None = None, fetch_event_types: Collection[str] | None = None,
spectator_requested_language: str | None = None, spectator_requested_language: str | None = None,

View File

@ -69,7 +69,7 @@ class LinkifierDict(TypedDict):
id: int id: int
class UnspecifiedValue: class Unset:
"""In most API endpoints, we use a default value of `None"` to encode """In most API endpoints, we use a default value of `None"` to encode
parameters that the client did not pass, which is nicely Pythonic. parameters that the client did not pass, which is nicely Pythonic.
@ -84,6 +84,9 @@ class UnspecifiedValue:
""" """
UNSET = Unset()
class EditHistoryEvent(TypedDict, total=False): class EditHistoryEvent(TypedDict, total=False):
""" """
Database format for edit history events. Database format for edit history events.

View File

@ -73,6 +73,8 @@ class TestEndpoint(ZulipTestCase):
__pydantic_config__ = ConfigDict(extra="forbid") __pydantic_config__ = ConfigDict(extra="forbid")
default_foo = Foo(10, 10)
@typed_endpoint @typed_endpoint
def view( def view(
request: HttpRequest, request: HttpRequest,
@ -81,7 +83,7 @@ class TestEndpoint(ZulipTestCase):
json_str: Json[str], json_str: Json[str],
json_data: Json[Foo], json_data: Json[Foo],
json_optional: Json[int | None] | None = None, json_optional: Json[int | None] | None = None,
json_default: Json[Foo] = Foo(10, 10), json_default: Json[Foo] = default_foo,
non_json: str = "ok", non_json: str = "ok",
non_json_optional: str | None = None, non_json_optional: str | None = None,
) -> HttpResponse: ) -> HttpResponse:

View File

@ -9,7 +9,7 @@ from pydantic import Json
from zerver.context_processors import get_valid_realm_from_request from zerver.context_processors import get_valid_realm_from_request
from zerver.lib.compatibility import is_pronouns_field_type_supported from zerver.lib.compatibility import is_pronouns_field_type_supported
from zerver.lib.events import ClientCapabilities, do_events_register from zerver.lib.events import DEFAULT_CLIENT_CAPABILITIES, ClientCapabilities, do_events_register
from zerver.lib.exceptions import JsonableError, MissingAuthenticationError from zerver.lib.exceptions import JsonableError, MissingAuthenticationError
from zerver.lib.narrow_helpers import narrow_dataclasses_from_tuples from zerver.lib.narrow_helpers import narrow_dataclasses_from_tuples
from zerver.lib.request import RequestNotes from zerver.lib.request import RequestNotes
@ -46,7 +46,7 @@ def events_register_backend(
presence_history_limit_days: Json[int] | None = None, presence_history_limit_days: Json[int] | None = None,
all_public_streams: Json[bool] | None = None, all_public_streams: Json[bool] | None = None,
include_subscribers: Json[bool] = False, include_subscribers: Json[bool] = False,
client_capabilities: Json[ClientCapabilities] | None = None, client_capabilities: Json[ClientCapabilities] = DEFAULT_CLIENT_CAPABILITIES,
event_types: Json[list[str]] | None = None, event_types: Json[list[str]] | None = None,
fetch_event_types: Json[list[str]] | None = None, fetch_event_types: Json[list[str]] | None = None,
narrow: Json[NarrowT] | None = None, narrow: Json[NarrowT] | None = None,
@ -99,9 +99,6 @@ def events_register_backend(
all_public_streams = False all_public_streams = False
include_streams = False include_streams = False
if client_capabilities is None:
client_capabilities = ClientCapabilities(notification_settings_null=False)
client = RequestNotes.get_notes(request).client client = RequestNotes.get_notes(request).client
assert client is not None assert client is not None