Skip to content

Commit

Permalink
OPT: add __slots__ to the dataclasses ⚡️
Browse files Browse the repository at this point in the history
  • Loading branch information
eigenein committed Nov 16, 2023
1 parent b230cfd commit a968ea3
Show file tree
Hide file tree
Showing 11 changed files with 32 additions and 28 deletions.
Empty file added combadge/_helpers/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions combadge/_helpers/dataclasses.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from sys import version_info

SLOTS = {"slots": True} if version_info >= (3, 10) else {}
File renamed without changes.
23 changes: 9 additions & 14 deletions combadge/support/http/markers/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

from typing_extensions import Annotated, TypeAlias, override

from combadge._helpers.dataclasses import SLOTS
from combadge._helpers.pydantic import get_type_adapter
from combadge.core.markers.method import MethodMarker
from combadge.core.markers.parameter import ParameterMarker
from combadge.core.typevars import FunctionT
Expand All @@ -18,12 +20,11 @@
ContainsQueryParams,
ContainsUrlPath,
)
from combadge.support.shared.functools import get_type_adapter

_T = TypeVar("_T")


@dataclass
@dataclass(**SLOTS)
class CustomHeader(ParameterMarker[ContainsHeaders]):
"""
Mark a parameter as a header value. Argument is passed «as is» during a service call.
Expand All @@ -35,7 +36,6 @@ class CustomHeader(ParameterMarker[ContainsHeaders]):
"""

name: str
__slots__ = ("name",)

@override
def __call__(self, request: ContainsHeaders, value: Any) -> None: # noqa: D102
Expand Down Expand Up @@ -83,7 +83,7 @@ def path(path_or_factory: str | Callable[..., str]) -> Callable[[FunctionT], Fun
return Path[Any](path_or_factory).mark


@dataclass
@dataclass(**SLOTS)
class HttpMethod(Generic[FunctionT], MethodMarker[ContainsMethod, FunctionT]): # noqa: D101
method: str

Expand All @@ -103,7 +103,7 @@ def http_method(method: str) -> Callable[[FunctionT], FunctionT]:
return HttpMethod[Any](method).mark


@dataclass
@dataclass(**SLOTS)
class QueryParam(ParameterMarker[ContainsQueryParams]):
"""
Mark parameter as a query parameter.
Expand All @@ -114,7 +114,6 @@ class QueryParam(ParameterMarker[ContainsQueryParams]):
"""

name: str
__slots__ = ("name",)

@override
def __call__(self, request: ContainsQueryParams, value: Any) -> None: # noqa: D102
Expand All @@ -123,7 +122,7 @@ def __call__(self, request: ContainsQueryParams, value: Any) -> None: # noqa: D

if not TYPE_CHECKING:

@dataclass
@dataclass(**SLOTS)
class Payload(ParameterMarker[ContainsPayload]):
"""
Mark parameter as a request payload. An argument gets converted to a dictionary and passed over to a backend.
Expand Down Expand Up @@ -170,7 +169,7 @@ def __class_getitem__(cls, item: type[Any]) -> Any:
Payload: TypeAlias = _T


@dataclass
@dataclass(**SLOTS)
class Field(ParameterMarker[ContainsPayload]):
"""
Mark a parameter as a value of a separate payload field.
Expand All @@ -184,7 +183,6 @@ class Field(ParameterMarker[ContainsPayload]):
"""

name: str
__slots__ = ("name",)

@override
def __call__(self, request: ContainsPayload, value: Any) -> None: # noqa: D102
Expand All @@ -195,7 +193,7 @@ def __call__(self, request: ContainsPayload, value: Any) -> None: # noqa: D102

if not TYPE_CHECKING:

@dataclass
@dataclass(**SLOTS)
class FormData(ParameterMarker[ContainsFormData]):
"""
Mark parameter as a request form data.
Expand All @@ -210,8 +208,6 @@ class FormData(ParameterMarker[ContainsFormData]):
>>> ...
"""

__slots__ = ()

@override
def __call__(self, request: ContainsFormData, value: Any) -> None: # noqa: D102
value = get_type_adapter(type(value)).dump_python(value, by_alias=True)
Expand All @@ -227,7 +223,7 @@ def __class_getitem__(cls, item: type[Any]) -> Any:
FormData: TypeAlias = _T


@dataclass
@dataclass(**SLOTS)
class FormField(ParameterMarker[ContainsFormData]):
"""
Mark a parameter as a separate form field value.
Expand All @@ -243,7 +239,6 @@ class FormField(ParameterMarker[ContainsFormData]):
""" # noqa: E501

name: str
__slots__ = ("name",)

@override
def __call__(self, request: ContainsFormData, value: Any) -> None: # noqa: D102
Expand Down
7 changes: 4 additions & 3 deletions combadge/support/http/markers/response.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
# noinspection PyUnresolvedReferences
from typing_extensions import override

from combadge._helpers.dataclasses import SLOTS
from combadge.core.markers.response import ResponseMarker
from combadge.support.http.abc import SupportsReasonPhrase, SupportsStatusCode, SupportsText


@dataclass
@dataclass(**SLOTS)
class StatusCode(ResponseMarker):
"""
Build a payload with response status code.
Expand All @@ -29,7 +30,7 @@ def __call__(self, response: SupportsStatusCode, input_: Any) -> Dict[Any, Any]:
return {self.key: HTTPStatus(response.status_code)}


@dataclass
@dataclass(**SLOTS)
class ReasonPhrase(ResponseMarker):
"""Build a payload with HTTP reason message."""

Expand All @@ -41,7 +42,7 @@ def __call__(self, response: SupportsReasonPhrase, input_: Any) -> Dict[Any, Any
return {self.key: response.reason_phrase}


@dataclass
@dataclass(**SLOTS)
class Text(ResponseMarker):
"""
Build a payload with HTTP response text.
Expand Down
3 changes: 2 additions & 1 deletion combadge/support/http/request.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from dataclasses import dataclass

from combadge._helpers.dataclasses import SLOTS
from combadge.support.http.abc import (
ContainsFormData,
ContainsHeaders,
Expand All @@ -11,7 +12,7 @@
from combadge.support.shared.request import BaseBackendRequest


@dataclass
@dataclass(**SLOTS)
class Request(
ContainsMethod,
ContainsUrlPath,
Expand Down
6 changes: 3 additions & 3 deletions combadge/support/shared/request.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from abc import ABC
from dataclasses import dataclass

from combadge._helpers.dataclasses import SLOTS

@dataclass

@dataclass(**SLOTS)
class BaseBackendRequest(ABC): # noqa: B024
"""Base class for protocol-dependent requests."""

__slots__ = ()
4 changes: 3 additions & 1 deletion combadge/support/soap/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
from dataclasses import dataclass
from typing import Optional

from combadge._helpers.dataclasses import SLOTS

@dataclass

@dataclass(**SLOTS)
class ContainsOperationName(ABC):
"""SOAP operation name."""

Expand Down
5 changes: 2 additions & 3 deletions combadge/support/soap/markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@
# noinspection PyUnresolvedReferences
from typing_extensions import override

from combadge._helpers.dataclasses import SLOTS
from combadge.core.markers.method import MethodMarker
from combadge.core.typevars import FunctionT
from combadge.support.soap.abc import ContainsOperationName


@dataclass
@dataclass(**SLOTS)
class OperationName(Generic[FunctionT], MethodMarker[ContainsOperationName, FunctionT]): # noqa: D101
name: str

__slots__ = ("name",)

@override
def prepare_request(self, request: ContainsOperationName, _arguments: BoundArguments) -> None: # noqa: D102
request.operation_name = self.name
Expand Down
3 changes: 2 additions & 1 deletion combadge/support/soap/request.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from dataclasses import dataclass

from combadge._helpers.dataclasses import SLOTS
from combadge.support.http.abc import ContainsPayload
from combadge.support.shared.request import BaseBackendRequest
from combadge.support.soap.abc import ContainsOperationName


@dataclass
@dataclass(**SLOTS)
class Request(ContainsOperationName, ContainsPayload, BaseBackendRequest):
"""Backend-agnostic SOAP request."""
6 changes: 4 additions & 2 deletions combadge/support/zeep/backends/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from dataclasses import dataclass
from typing import Any, Generic, TypeVar, Union

from combadge._helpers.dataclasses import SLOTS

try:
from types import UnionType # type: ignore[attr-defined]
except ImportError:
Expand Down Expand Up @@ -95,15 +97,15 @@ def _parse_soap_fault(exception: Fault, fault_type: TypeAdapter[_SoapFaultT]) ->
return fault_type.validate_python(exception.__dict__)


@dataclass
@dataclass(**SLOTS)
class ByBindingName:
"""Create service by binding name and address."""

binding_name: str
address: str


@dataclass
@dataclass(**SLOTS)
class ByServiceName:
"""Create service by service and port names."""

Expand Down

0 comments on commit a968ea3

Please sign in to comment.