diff --git a/src/adaptix/_internal/code_tools/cascade_namespace.py b/src/adaptix/_internal/code_tools/cascade_namespace.py index 3fbf2e49..691ec313 100644 --- a/src/adaptix/_internal/code_tools/cascade_namespace.py +++ b/src/adaptix/_internal/code_tools/cascade_namespace.py @@ -6,6 +6,8 @@ class CascadeNamespace(ABC): + __slots__ = () + @abstractmethod def add_constant(self, name: str, value: object) -> None: ... diff --git a/src/adaptix/_internal/code_tools/code_block_tree.py b/src/adaptix/_internal/code_tools/code_block_tree.py index 3a0c68e6..4e3d9149 100644 --- a/src/adaptix/_internal/code_tools/code_block_tree.py +++ b/src/adaptix/_internal/code_tools/code_block_tree.py @@ -7,6 +7,8 @@ class TextSliceWriter(AbstractContextManager[None]): + __slots__ = () + @abstractmethod def write(self, text: str, /) -> None: ... @@ -34,6 +36,8 @@ def make_string(self) -> str: class OneLineWriter(LinesWriter): + __slots__ = () + def make_string(self) -> str: return "".join(self._slices) @@ -53,16 +57,20 @@ def at_multi_line(writer: TextSliceWriter): class Statement(ABC): + __slots__ = () + @abstractmethod def write_lines(self, writer: TextSliceWriter) -> None: ... class Expression(Statement, ABC): - pass + __slots__ = () class ConcatStatements(Statement): + __slots__ = ("_elements",) + def __init__(self, elements: Iterable[Statement]): self._elements = elements @@ -76,6 +84,8 @@ def statements(*elements: Statement) -> ConcatStatements: class RawStatement(Statement): + __slots__ = ("_text",) + def __init__(self, text: str): self._text = text @@ -84,10 +94,12 @@ def write_lines(self, writer: TextSliceWriter) -> None: class RawExpr(RawStatement, Expression): - pass + __slots__ = () class _TemplatedStatement(Statement): + __slots__ = ("_name_to_stmt", "_template") + def __init__(self, template: str, **stmts: Statement): self._template = template self._name_to_stmt = stmts @@ -114,22 +126,30 @@ def write_lines(self, writer: TextSliceWriter) -> None: class CodeBlock(_TemplatedStatement): + __slots__ = () + EMPTY_LINE: Statement = RawStatement("") PASS: Statement = RawStatement("pass") class CodeExpr(_TemplatedStatement, Expression): + __slots__ = () + def __init__(self, template: str, **exprs: Expression): super().__init__(template, **exprs) class DictItem(ABC): + __slots__ = () + @abstractmethod def write_fragment(self, writer: TextSliceWriter) -> None: ... class MappingUnpack(DictItem): + __slots__ = ("_expr",) + def __init__(self, expr: Expression): self._expr = expr @@ -141,6 +161,8 @@ def write_fragment(self, writer: TextSliceWriter) -> None: class DictKeyValue(DictItem): + __slots__ = ("_key", "_value") + def __init__(self, key: Expression, value: Expression): self._key = key self._value = value @@ -155,6 +177,8 @@ def write_fragment(self, writer: TextSliceWriter) -> None: class DictLiteral(Expression): + __slots__ = ("_items",) + def __init__(self, items: Sequence[DictItem]): self._items = items @@ -172,6 +196,8 @@ def write_lines(self, writer: TextSliceWriter) -> None: class ListLiteral(Expression): + __slots__ = ("_items",) + def __init__(self, items: Sequence[Expression]): self._items = items @@ -187,6 +213,8 @@ def write_lines(self, writer: TextSliceWriter) -> None: class StringLiteral(Expression): + __slots__ = ("_text",) + def __init__(self, text: str): self._text = text diff --git a/src/adaptix/_internal/code_tools/compiler.py b/src/adaptix/_internal/code_tools/compiler.py index b4283f90..54aff81f 100644 --- a/src/adaptix/_internal/code_tools/compiler.py +++ b/src/adaptix/_internal/code_tools/compiler.py @@ -10,6 +10,8 @@ class ClosureCompiler(ABC): """Abstract class compiling closures""" + __slots__ = () + @abstractmethod def compile( self, @@ -45,6 +47,8 @@ def generate_idx(self, name: str) -> int: class BasicClosureCompiler(ClosureCompiler): + __slots__ = () + def _make_source_builder(self, builder: CodeBuilder) -> CodeBuilder: main_builder = CodeBuilder() diff --git a/src/adaptix/_internal/code_tools/name_sanitizer.py b/src/adaptix/_internal/code_tools/name_sanitizer.py index de3a922e..ffd8d1e3 100644 --- a/src/adaptix/_internal/code_tools/name_sanitizer.py +++ b/src/adaptix/_internal/code_tools/name_sanitizer.py @@ -4,12 +4,16 @@ class NameSanitizer(ABC): + __slots__ = () + @abstractmethod def sanitize(self, name: str) -> str: ... class BuiltinNameSanitizer(NameSanitizer): + __slots__ = () + _BAD_CHARS = re.compile(r"\W") _TRANSLATE_MAP = str.maketrans({".": "_", "[": "_"}) diff --git a/src/adaptix/_internal/conversion/broaching/code_generator.py b/src/adaptix/_internal/conversion/broaching/code_generator.py index 69354f19..5cd7f6ef 100644 --- a/src/adaptix/_internal/conversion/broaching/code_generator.py +++ b/src/adaptix/_internal/conversion/broaching/code_generator.py @@ -34,6 +34,8 @@ class GenState: + __slots__ = ("_name_sanitizer", "_namespace", "_prefix_counter") + def __init__(self, namespace: CascadeNamespace, name_sanitizer: NameSanitizer): self._namespace = namespace self._name_sanitizer = name_sanitizer @@ -58,12 +60,16 @@ def register_mangled(self, base: str, obj: object) -> str: class BroachingCodeGenerator(ABC): + __slots__ = () + @abstractmethod def produce_code(self, signature: Signature, closure_name: str) -> tuple[str, Mapping[str, object]]: ... class BuiltinBroachingCodeGenerator(BroachingCodeGenerator): + __slots__ = ("_name_sanitizer", "_plan") + def __init__(self, plan: BroachingPlan, name_sanitizer: NameSanitizer): self._plan = plan self._name_sanitizer = name_sanitizer diff --git a/src/adaptix/_internal/conversion/coercer_provider.py b/src/adaptix/_internal/conversion/coercer_provider.py index 488855a0..1d849a04 100644 --- a/src/adaptix/_internal/conversion/coercer_provider.py +++ b/src/adaptix/_internal/conversion/coercer_provider.py @@ -17,6 +17,8 @@ class NormTypeCoercerProvider(CoercerProvider, ABC): + __slots__ = () + @final def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coercer: norm_src = try_normalize_type(request.src.last.type) @@ -35,6 +37,8 @@ def _provide_coercer_norm_types( class SameTypeCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, @@ -48,6 +52,8 @@ def _provide_coercer_norm_types( class DstAnyCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, @@ -61,6 +67,8 @@ def _provide_coercer_norm_types( class SubclassCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, @@ -81,6 +89,12 @@ def _provide_coercer_norm_types( class MatchingCoercerProvider(CoercerProvider): + __slots__ = ( + "_dst_lsc", + "_one_arg_coercer", + "_src_lsc", + ) + def __init__(self, src_lsc: LocStackChecker, dst_lsc: LocStackChecker, coercer: OneArgCoercer): self._src_lsc = src_lsc self._dst_lsc = dst_lsc @@ -99,6 +113,8 @@ def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coerc class UnionSubcaseCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, @@ -120,6 +136,8 @@ def _provide_coercer_norm_types( class OptionalCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, @@ -157,6 +175,8 @@ def _get_not_none(self, norm: BaseNormType) -> BaseNormType: class TypeHintTagsUnwrappingProvider(CoercerProvider): + __slots__ = () + def _unwrap_type(self, tp: TypeHint) -> TypeHint: try: norm = normalize_type(tp) @@ -181,6 +201,8 @@ def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coerc class ForwardRefEvaluatingProvider(CoercerProvider): + __slots__ = () + def _replace_forward_ref(self, tp: TypeHint) -> TypeHint: if not isinstance(tp, ForwardRef): return tp @@ -207,6 +229,8 @@ def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coerc class IterableCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + CONCRETE_ORIGINS = {set, list, tuple, deque} ABC_TO_IMPL = { collections.abc.Iterable: tuple, @@ -259,6 +283,8 @@ def _parse_destination(self, norm: BaseNormType) -> tuple[Callable, TypeHint]: class DictCoercerProvider(NormTypeCoercerProvider): + __slots__ = () + def _provide_coercer_norm_types( self, mediator: Mediator, diff --git a/src/adaptix/_internal/conversion/converter_provider.py b/src/adaptix/_internal/conversion/converter_provider.py index 4cdfa9f1..90497f39 100644 --- a/src/adaptix/_internal/conversion/converter_provider.py +++ b/src/adaptix/_internal/conversion/converter_provider.py @@ -19,6 +19,8 @@ class BuiltinConverterProvider(ConverterProvider): + __slots__ = ("_name_sanitizer",) + def __init__(self, *, name_sanitizer: NameSanitizer = BuiltinNameSanitizer()): self._name_sanitizer = name_sanitizer diff --git a/src/adaptix/_internal/conversion/facade/retort.py b/src/adaptix/_internal/conversion/facade/retort.py index 1ff04d5f..cc4f06d0 100644 --- a/src/adaptix/_internal/conversion/facade/retort.py +++ b/src/adaptix/_internal/conversion/facade/retort.py @@ -33,6 +33,8 @@ class FilledConversionRetort(OperatingRetort): + __slots__ = () + recipe = [ BUILTIN_SHAPE_PROVIDER, @@ -63,6 +65,8 @@ class FilledConversionRetort(OperatingRetort): class AdornedConversionRetort(OperatingRetort): + __slots__ = ("_simple_converter_cache",) + def _calculate_derived(self) -> None: super()._calculate_derived() self._simple_converter_cache: dict[tuple[TypeHint, TypeHint, Optional[str]], Converter] = {} @@ -203,4 +207,4 @@ def convert(self, src_obj: Any, dst: type[DstT], *, recipe: Iterable[Provider] = class ConversionRetort(FilledConversionRetort, AdornedConversionRetort): - pass + __slots__ = () diff --git a/src/adaptix/_internal/conversion/linking_provider.py b/src/adaptix/_internal/conversion/linking_provider.py index 5d716d91..271c6085 100644 --- a/src/adaptix/_internal/conversion/linking_provider.py +++ b/src/adaptix/_internal/conversion/linking_provider.py @@ -23,6 +23,8 @@ class DefaultLinkingProvider(LinkingProvider): + __slots__ = () + def _provide_linking(self, mediator: Mediator, request: LinkingRequest) -> LinkingResult: target_field_id = request.destination.last.cast(FieldLoc).field_id @@ -40,6 +42,12 @@ def _iterate_sources(self, request: LinkingRequest) -> Iterable[LinkingSource]: class MatchingLinkingProvider(LinkingProvider): + __slots__ = ( + "_dst_lsc", + "_one_arg_coercer", + "_src_lsc", + ) + def __init__(self, src_lsc: LocStackChecker, dst_lsc: LocStackChecker, coercer: Optional[OneArgCoercer]): self._src_lsc = src_lsc self._dst_lsc = dst_lsc @@ -62,6 +70,11 @@ def _provide_linking(self, mediator: Mediator, request: LinkingRequest) -> Linki class ConstantLinkingProvider(LinkingProvider): + __slots__ = ( + "_default", + "_dst_lsc", + ) + def __init__(self, dst_lsc: LocStackChecker, default: Union[DefaultValue, DefaultFactory]): self._dst_lsc = dst_lsc self._default = default @@ -76,6 +89,12 @@ def _provide_linking(self, mediator: Mediator, request: LinkingRequest) -> Linki class FunctionLinkingProvider(LinkingProvider): + __slots__ = ( + "_dst_lsc", + "_func", + "_input_shape", + ) + def __init__(self, func: Callable, dst_lsc: LocStackChecker): self._func = func self._dst_lsc = dst_lsc diff --git a/src/adaptix/_internal/conversion/model_coercer_provider.py b/src/adaptix/_internal/conversion/model_coercer_provider.py index c3ff02c7..aa388a39 100644 --- a/src/adaptix/_internal/conversion/model_coercer_provider.py +++ b/src/adaptix/_internal/conversion/model_coercer_provider.py @@ -42,6 +42,8 @@ class ModelCoercerProvider(CoercerProvider): + __slots__ = ("_name_sanitizer",) + def __init__(self, *, name_sanitizer: NameSanitizer = BuiltinNameSanitizer()): self._name_sanitizer = name_sanitizer diff --git a/src/adaptix/_internal/conversion/policy_provider.py b/src/adaptix/_internal/conversion/policy_provider.py index 82ea46d7..b094d813 100644 --- a/src/adaptix/_internal/conversion/policy_provider.py +++ b/src/adaptix/_internal/conversion/policy_provider.py @@ -4,6 +4,8 @@ class UnlinkedOptionalPolicyProvider(MethodsProvider): + __slots__ = ("_is_allowed",) + def __init__(self, *, is_allowed: bool): self._is_allowed = is_allowed diff --git a/src/adaptix/_internal/conversion/provider_template.py b/src/adaptix/_internal/conversion/provider_template.py index a7f7d186..a90a64ff 100644 --- a/src/adaptix/_internal/conversion/provider_template.py +++ b/src/adaptix/_internal/conversion/provider_template.py @@ -8,6 +8,8 @@ class ConverterProvider(MethodsProvider, ABC): + __slots__ = () + @final @method_handler def _outer_provide_converter(self, mediator: Mediator, request: ConverterRequest): @@ -19,6 +21,8 @@ def _provide_converter(self, mediator: Mediator, request: ConverterRequest) -> C class CoercerProvider(MethodsProvider, ABC): + __slots__ = () + @method_handler @abstractmethod def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coercer: @@ -26,6 +30,8 @@ def _provide_coercer(self, mediator: Mediator, request: CoercerRequest) -> Coerc class LinkingProvider(MethodsProvider, ABC): + __slots__ = () + @method_handler @abstractmethod def _provide_linking(self, mediator: Mediator, request: LinkingRequest) -> LinkingResult: diff --git a/src/adaptix/_internal/conversion/request_filtering.py b/src/adaptix/_internal/conversion/request_filtering.py index a6598024..33e925d7 100644 --- a/src/adaptix/_internal/conversion/request_filtering.py +++ b/src/adaptix/_internal/conversion/request_filtering.py @@ -2,6 +2,8 @@ class FromCtxParam(LocStackChecker): + __slots__ = ("_field_id",) + def __init__(self, field_id: str): if not field_id.isidentifier(): raise ValueError("param_name must be a valid python identifier to exactly match parameter") diff --git a/src/adaptix/_internal/datastructures.py b/src/adaptix/_internal/datastructures.py index 47389734..3403b21d 100644 --- a/src/adaptix/_internal/datastructures.py +++ b/src/adaptix/_internal/datastructures.py @@ -25,6 +25,8 @@ @runtime_checkable class SupportsKeysAndGetItem(Protocol[K, _VT_co]): + __slots__ = () + def keys(self) -> Iterable[K]: ... @@ -33,6 +35,8 @@ def __getitem__(self, __key: K, /) -> _VT_co: class UnrewritableDict(dict[K, V], Generic[K, V]): + __slots__ = () + def __setitem__(self, key, value): if key in self: old_value = self[key] diff --git a/src/adaptix/_internal/feature_requirement.py b/src/adaptix/_internal/feature_requirement.py index f6d654dc..3269e221 100644 --- a/src/adaptix/_internal/feature_requirement.py +++ b/src/adaptix/_internal/feature_requirement.py @@ -18,7 +18,7 @@ def _false(): class Requirement(ABC): - __slots__ = ("__bool__", "__dict__", "is_met") + __slots__ = ("__bool__", "is_met") def __init__(self): self.is_met = self._evaluate() @@ -35,6 +35,8 @@ def fail_reason(self) -> str: class PythonVersionRequirement(Requirement): + __slots__ = ("min_version",) + def __init__(self, min_version: VarTuple[int]): self.min_version = min_version super().__init__() @@ -48,6 +50,8 @@ def fail_reason(self) -> str: class MaxPythonVersionRequirement(Requirement): + __slots__ = ("max_version",) + def __init__(self, max_version: VarTuple[int]): self.max_version = max_version super().__init__() @@ -61,6 +65,8 @@ def fail_reason(self) -> str: class DistributionRequirement(Requirement): + __slots__ = ("distribution_name",) + def __init__(self, distribution_name: str): self.distribution_name = distribution_name super().__init__() @@ -78,6 +84,8 @@ def fail_reason(self) -> str: class DistributionVersionRequirement(DistributionRequirement): + __slots__ = ("min_version",) + # Pattern from PEP 440 _VERSION_PATTERN = r""" v? @@ -150,6 +158,8 @@ def fail_reason(self) -> str: class PythonImplementationRequirement(Requirement): + __slots__ = ("implementation_name",) + def __init__(self, implementation_name: str): self.implementation_name = implementation_name super().__init__() diff --git a/src/adaptix/_internal/integrations/msgspec/native.py b/src/adaptix/_internal/integrations/msgspec/native.py index f6b2e146..2e5caa4f 100644 --- a/src/adaptix/_internal/integrations/msgspec/native.py +++ b/src/adaptix/_internal/integrations/msgspec/native.py @@ -29,6 +29,8 @@ class ToBuiltinsParams(TypedDict, total=False): class NativeMsgspecProvider(LoaderProvider, DumperProvider): + __slots__ = ("_convert_params", "_to_builtins_params") + def __init__( self, convert_params: ConvertParams, diff --git a/src/adaptix/_internal/integrations/pydantic/native.py b/src/adaptix/_internal/integrations/pydantic/native.py index 3297d64e..73c041b6 100644 --- a/src/adaptix/_internal/integrations/pydantic/native.py +++ b/src/adaptix/_internal/integrations/pydantic/native.py @@ -41,6 +41,8 @@ class ToPythonParams(TypedDict, total=False): class NativePydanticProvider(LoaderProvider, DumperProvider): + __slots__ = ("_config", "_to_python_params", "_validate_python_params") + def __init__( self, config: Optional["ConfigDict"], diff --git a/src/adaptix/_internal/model_tools/definitions.py b/src/adaptix/_internal/model_tools/definitions.py index 6d4ebf11..415548cc 100644 --- a/src/adaptix/_internal/model_tools/definitions.py +++ b/src/adaptix/_internal/model_tools/definitions.py @@ -42,6 +42,8 @@ class DefaultFactoryWithSelf(Generic[S, T]): class Accessor(Hashable, ABC): + __slots__ = () + @property @abstractmethod def getter(self) -> Callable[[Any], Any]: @@ -59,6 +61,8 @@ def trail_element(self) -> TrailElement: class DescriptorAccessor(Accessor, ABC): + __slots__ = ("_access_error", "_attr_name") + def __init__(self, attr_name: str, access_error: Optional[Catchable]): self._attr_name = attr_name self._access_error = access_error @@ -92,6 +96,8 @@ def __repr__(self): class ItemAccessor(Accessor): + __slots__ = ("_access_error", "_path_element", "key") + def __init__(self, key: Union[int, str], access_error: Optional[Catchable], path_element: TrailElement): self.key = key self._access_error = access_error diff --git a/src/adaptix/_internal/morphing/concrete_provider.py b/src/adaptix/_internal/morphing/concrete_provider.py index 74eaa02f..31c56cc6 100644 --- a/src/adaptix/_internal/morphing/concrete_provider.py +++ b/src/adaptix/_internal/morphing/concrete_provider.py @@ -26,6 +26,8 @@ class IsoFormatProvider(MorphingProvider): + __slots__ = ("_cls", "_loc_stack_checker") + _CLS_TO_JSON_FORMAT = { time: JSONSchemaBuiltinFormat.TIME, date: JSONSchemaBuiltinFormat.DATE, @@ -66,6 +68,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(datetime) class DatetimeFormatProvider(MorphingProvider): + __slots__ = ("_fmt",) + def __init__(self, fmt: str): self._fmt = fmt @@ -105,6 +109,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(datetime) class DatetimeTimestampProvider(MorphingProvider): + __slots__ = ("_tz",) + def __init__(self, tz: Optional[timezone]): self._tz = tz @@ -143,6 +149,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(date) class DateTimestampProvider(MorphingProvider): + __slots__ = () + def _is_pydatetime(self) -> bool: try: import _pydatetime @@ -210,6 +218,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(timedelta) class SecondsTimedeltaProvider(MorphingProvider): + __slots__ = () + _OK_TYPES = (int, float, Decimal) def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: @@ -243,6 +253,8 @@ def none_loader(data): @for_predicate(None) class NoneProvider(MorphingProvider): + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: return none_loader @@ -254,6 +266,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> class _Base64DumperMixin(DumperProvider): + __slots__ = () + def provide_dumper(self, mediator: Mediator, request: DumperRequest) -> Dumper: return mediator.cached_call(self._make_dumper) @@ -264,6 +278,8 @@ def bytes_base64_dumper(data): class _Base64JSONSchemaMixin(JSONSchemaProvider): + __slots__ = () + def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> JSONSchema: return JSONSchema(type=JSONSchemaType.STRING, content_encoding="base64") @@ -273,6 +289,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(bytes) class BytesBase64Provider(_Base64DumperMixin, _Base64JSONSchemaMixin, MorphingProvider): + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: return mediator.cached_call(self._make_loader) @@ -295,6 +313,8 @@ def bytes_base64_loader(data): @for_predicate(BytesIO) class BytesIOBase64Provider(_Base64JSONSchemaMixin, MorphingProvider): + __slots__ = () + _BYTES_PROVIDER = BytesBase64Provider() def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: @@ -319,6 +339,8 @@ def bytes_io_base64_dumper(data: BytesIO): @for_predicate(typing.IO[bytes]) class IOBytesBase64Provider(BytesIOBase64Provider, _Base64JSONSchemaMixin, MorphingProvider): + __slots__ = () + def provide_dumper(self, mediator: Mediator, request: DumperRequest) -> Dumper: return mediator.cached_call(self._make_dumper) @@ -333,6 +355,8 @@ def io_bytes_base64_dumper(data: typing.IO[bytes]): @for_predicate(bytearray) class BytearrayBase64Provider(_Base64DumperMixin, _Base64JSONSchemaMixin, MorphingProvider): + __slots__ = () + _BYTES_PROVIDER = BytesBase64Provider() def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: @@ -358,6 +382,8 @@ def _regex_dumper(data: re.Pattern): @for_predicate(re.Pattern) class RegexPatternProvider(MorphingProvider): + __slots__ = ("flags",) + def __init__(self, flags: re.RegexFlag = re.RegexFlag(0)): self.flags = flags @@ -390,6 +416,15 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> class ScalarProvider(MorphingProvider, Generic[T]): + __slots__ = ( + "_dumper", + "_json_schema", + "_lax_coercion_loader", + "_loc_stack_checker", + "_strict_coercion_loader", + "_target", + ) + def __init__( self, target: type[T], @@ -614,6 +649,8 @@ def zone_info_coercion_loader(data): @for_predicate(typing.Self if HAS_SELF_TYPE else ~P.ANY) class SelfTypeProvider(MorphingProvider): + __slots__ = () + def _substituting_provide(self, mediator: Mediator, request: LocatedRequest): try: owner_loc, _field_loc = find_owner_with_field(request.loc_stack) @@ -643,6 +680,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> @for_predicate(typing.LiteralString if HAS_PY_311 else ~P.ANY) class LiteralStringProvider(MorphingProvider): + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: strict_coercion = mediator.mandatory_provide(StrictCoercionRequest(loc_stack=request.loc_stack)) return str_strict_coercion_loader if strict_coercion else str diff --git a/src/adaptix/_internal/morphing/constant_length_tuple_provider.py b/src/adaptix/_internal/morphing/constant_length_tuple_provider.py index 27a26afe..ac5c3817 100644 --- a/src/adaptix/_internal/morphing/constant_length_tuple_provider.py +++ b/src/adaptix/_internal/morphing/constant_length_tuple_provider.py @@ -28,6 +28,8 @@ @for_predicate(tuple) class ConstantLengthTupleProvider(LoaderProvider, DumperProvider): + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: norm = try_normalize_type(request.last_loc.type) if len(norm.args) > 1 and norm.args[1] == Ellipsis: diff --git a/src/adaptix/_internal/morphing/dict_provider.py b/src/adaptix/_internal/morphing/dict_provider.py index 5fd4c4bd..55732661 100644 --- a/src/adaptix/_internal/morphing/dict_provider.py +++ b/src/adaptix/_internal/morphing/dict_provider.py @@ -22,6 +22,8 @@ @for_predicate(dict) class DictProvider(LoaderProvider, DumperProvider): + __slots__ = () + def _extract_key_value(self, request: LocatedRequest) -> tuple[BaseNormType, BaseNormType]: norm = try_normalize_type(request.last_loc.type) return norm.args @@ -248,6 +250,8 @@ def dict_dumper_dt_all(data: Mapping): @for_predicate(defaultdict) class DefaultDictProvider(LoaderProvider, DumperProvider): + __slots__ = ("default_factory",) + _DICT_PROVIDER = DictProvider() def __init__(self, default_factory: Optional[Callable] = None): diff --git a/src/adaptix/_internal/morphing/enum_provider.py b/src/adaptix/_internal/morphing/enum_provider.py index 86c22b94..a488c3af 100644 --- a/src/adaptix/_internal/morphing/enum_provider.py +++ b/src/adaptix/_internal/morphing/enum_provider.py @@ -32,6 +32,8 @@ class BaseEnumMappingGenerator(ABC): + __slots__ = () + @abstractmethod def _generate_mapping(self, cases: Iterable[EnumT]) -> Mapping[EnumT, str]: ... @@ -49,6 +51,8 @@ def generate_for_loading(self, cases: Iterable[EnumT]) -> Mapping[str, EnumT]: class ByNameEnumMappingGenerator(BaseEnumMappingGenerator): + __slots__ = ("_map", "_name_style") + def __init__( self, name_style: Optional[NameStyle] = None, @@ -75,6 +79,8 @@ def _generate_mapping(self, cases: Iterable[EnumT]) -> Mapping[EnumT, str]: class AnyEnumLSC(LastLocChecker): + __slots__ = () + def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: try: norm = normalize_type(loc.type) @@ -85,6 +91,8 @@ def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: class FlagEnumLSC(LastLocChecker): + __slots__ = () + def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: try: norm = normalize_type(loc.type) @@ -95,15 +103,17 @@ def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: @for_predicate(AnyEnumLSC()) class BaseEnumProvider(LoaderProvider, DumperProvider, ABC): - pass + __slots__ = () @for_predicate(FlagEnumLSC()) class BaseFlagProvider(LoaderProvider, DumperProvider, ABC): - pass + __slots__ = () class EnumNameProvider(BaseEnumProvider): + __slots__ = ("_mapping_generator",) + """This provider represents enum members to the outside world by their name""" def __init__(self, mapping_generator: BaseEnumMappingGenerator): self._mapping_generator = mapping_generator @@ -146,6 +156,8 @@ def enum_dumper(data: Enum) -> str: class EnumValueProvider(BaseEnumProvider): + __slots__ = ("_value_type",) + def __init__(self, value_type: TypeHint): self._value_type = value_type @@ -193,6 +205,8 @@ class EnumExactValueProvider(BaseEnumProvider): by their value without any processing """ + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: return mediator.cached_call( self._make_loader, @@ -252,6 +266,8 @@ def enum_exact_value_dumper(data): class FlagByExactValueProvider(BaseFlagProvider): + __slots__ = () + def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: return mediator.cached_call( self._make_loader, @@ -302,6 +318,13 @@ def _extract_non_compound_cases_from_flag(enum: type[FlagT]) -> Sequence[FlagT]: class FlagByListProvider(BaseFlagProvider): + __slots__ = ( + "_allow_compound", + "_allow_duplicates", + "_allow_single_value", + "_mapping_generator", + ) + def __init__( self, mapping_generator: BaseEnumMappingGenerator, diff --git a/src/adaptix/_internal/morphing/facade/retort.py b/src/adaptix/_internal/morphing/facade/retort.py index 273badb7..81d59baf 100644 --- a/src/adaptix/_internal/morphing/facade/retort.py +++ b/src/adaptix/_internal/morphing/facade/retort.py @@ -95,6 +95,8 @@ class FilledRetort(OperatingRetort, ABC): """A retort contains builtin providers""" + __slots__ = () + recipe = [ NoneProvider(), @@ -224,6 +226,8 @@ class FilledRetort(OperatingRetort, ABC): class AdornedRetort(OperatingRetort): """A retort implementing high-level user interface""" + __slots__ = ("_debug_trail", "_dumper_cache", "_loader_cache", "_strict_coercion") + def __init__( self, *, @@ -360,4 +364,4 @@ def make_json_schema(self, tp: TypeHint, ctx: JSONSchemaContext) -> JSONSchema: class Retort(FilledRetort, AdornedRetort): - pass + __slots__ = () diff --git a/src/adaptix/_internal/morphing/generic_provider.py b/src/adaptix/_internal/morphing/generic_provider.py index f9928d82..247b39dc 100644 --- a/src/adaptix/_internal/morphing/generic_provider.py +++ b/src/adaptix/_internal/morphing/generic_provider.py @@ -23,6 +23,8 @@ class NewTypeUnwrappingProvider(DelegatingProvider): + __slots__ = () + def _get_proxy_target(self, tp: TypeHint) -> TypeHint: if not is_new_type(tp): raise CannotProvide @@ -34,6 +36,8 @@ def _get_error_text(self) -> str: class TypeAliasUnwrappingProvider(DelegatingProvider): + __slots__ = () + def _get_proxy_target(self, tp: TypeHint) -> TypeHint: norm = try_normalize_type(tp) if not isinstance(norm, NormTypeAlias): @@ -46,6 +50,8 @@ def _get_error_text(self) -> str: class ForwardRefEvaluatingProvider(DelegatingProvider): + __slots__ = () + def _get_proxy_target(self, tp: TypeHint) -> TypeHint: if not isinstance(tp, ForwardRef): raise CannotProvide @@ -60,6 +66,8 @@ def _get_error_text(self) -> str: class TypeHintTagsUnwrappingProvider(LoaderProvider, DumperProvider): + __slots__ = () + def _unwrap_type_hint(self, tp: TypeHint) -> TypeHint: norm = try_normalize_type(tp) unwrapped = strip_tags(norm) @@ -372,6 +380,8 @@ def path_like_dumper(data): @for_predicate(PathLike[str]) class PathLikeProvider(LoaderProvider, DumperProvider): + __slots__ = () + _impl = Path def provide_loader(self, mediator: Mediator, request: LoaderRequest) -> Loader: diff --git a/src/adaptix/_internal/morphing/iterable_provider.py b/src/adaptix/_internal/morphing/iterable_provider.py index f448b34e..11bc47f7 100644 --- a/src/adaptix/_internal/morphing/iterable_provider.py +++ b/src/adaptix/_internal/morphing/iterable_provider.py @@ -23,6 +23,8 @@ class IterableProvider(MorphingProvider): + __slots__ = ("_dump_as", "_json_schema_unique_items") + def __init__(self, *, dump_as: Callable[[Iterable[T]], Iterable[T]], json_schema_unique_items: bool = False): self._dump_as = dump_as self._json_schema_unique_items = json_schema_unique_items diff --git a/src/adaptix/_internal/morphing/json_schema/mangling.py b/src/adaptix/_internal/morphing/json_schema/mangling.py index c182bb97..b662cecc 100644 --- a/src/adaptix/_internal/morphing/json_schema/mangling.py +++ b/src/adaptix/_internal/morphing/json_schema/mangling.py @@ -7,6 +7,8 @@ class IndexRefMangler(RefMangler): + __slots__ = ("_separator", "_start") + def __init__(self, start: int = 1, separator: str = "-"): self._start = start self._separator = separator @@ -34,6 +36,8 @@ def _with_index(self, common_ref: str, index: int) -> str: class QualnameRefMangler(RefMangler): + __slots__ = () + def mangle_refs( self, occupied_refs: Container[str], @@ -56,6 +60,8 @@ def _generate_name(self, sources_group: LocalRefSourceGroup) -> Optional[str]: class CompoundRefMangler(RefMangler): + __slots__ = ("_base", "_wrapper") + def __init__(self, base: RefMangler, wrapper: RefMangler): self._base = base self._wrapper = wrapper diff --git a/src/adaptix/_internal/morphing/json_schema/patch.py b/src/adaptix/_internal/morphing/json_schema/patch.py index babe924c..df9e8288 100644 --- a/src/adaptix/_internal/morphing/json_schema/patch.py +++ b/src/adaptix/_internal/morphing/json_schema/patch.py @@ -12,6 +12,8 @@ class JSONSchemaPatch: + __slots__ = ("_patchers",) + def __init__(self) -> None: self._patchers: list[Patcher] = [] diff --git a/src/adaptix/_internal/morphing/json_schema/providers.py b/src/adaptix/_internal/morphing/json_schema/providers.py index e1a52bd1..2775d342 100644 --- a/src/adaptix/_internal/morphing/json_schema/providers.py +++ b/src/adaptix/_internal/morphing/json_schema/providers.py @@ -11,6 +11,8 @@ class ConstantInlineJSONSchemaProvider(LocatedRequestMethodsProvider): + __slots__ = ("_inline",) + def __init__(self, *, inline: bool): self._inline = inline @@ -20,12 +22,16 @@ def provide_inline_json_schema(self, mediator: Mediator, request: InlineJSONSche class BuiltinInlineJSONSchemaProvider(LocatedRequestMethodsProvider): + __slots__ = () + @method_handler def provide_inline_json_schema(self, mediator: Mediator, request: InlineJSONSchemaRequest) -> bool: return request.json_schema.properties == Omitted() and request.json_schema.prefix_items == Omitted() class JSONSchemaRefProvider(LocatedRequestMethodsProvider): + __slots__ = () + @method_handler def provide_ref_source(self, mediator: Mediator, request: RefSourceRequest) -> LocalRefSource: return LocalRefSource( @@ -36,6 +42,8 @@ def provide_ref_source(self, mediator: Mediator, request: RefSourceRequest) -> L class ConstantJSONSchemaRefProvider(LocatedRequestMethodsProvider): + __slots__ = ("_ref",) + def __init__(self, ref: str): self._ref = ref @@ -49,17 +57,19 @@ def provide_ref_source(self, mediator: Mediator, request: RefSourceRequest) -> L class KeepJSONSchema(metaclass=SingletonMeta): - pass + __slots__ = () class EraseJSONSchema(metaclass=SingletonMeta): - pass + __slots__ = () JSONSchemaOverride = Union[JSONSchema, KeepJSONSchema, EraseJSONSchema, JSONSchemaPatch] class JSONSchemaOverrideProvider(JSONSchemaProvider): + __slots__ = ("_override",) + def __init__(self, override: JSONSchemaOverride): self._override = override diff --git a/src/adaptix/_internal/morphing/json_schema/ref_generator.py b/src/adaptix/_internal/morphing/json_schema/ref_generator.py index 8bc2d4cf..38ea797a 100644 --- a/src/adaptix/_internal/morphing/json_schema/ref_generator.py +++ b/src/adaptix/_internal/morphing/json_schema/ref_generator.py @@ -5,5 +5,7 @@ class BuiltinRefGenerator(RefGenerator): + __slots__ = () + def generate_ref(self, json_schema: JSONSchema, loc_stack: LocStack) -> str: return format_type(loc_stack.last.type, brackets=False, qualname=False) diff --git a/src/adaptix/_internal/morphing/json_schema/resolver.py b/src/adaptix/_internal/morphing/json_schema/resolver.py index ba1f2d5d..6961e59d 100644 --- a/src/adaptix/_internal/morphing/json_schema/resolver.py +++ b/src/adaptix/_internal/morphing/json_schema/resolver.py @@ -11,6 +11,8 @@ class JSONSchemaResolver(ABC): + __slots__ = () + @abstractmethod def resolve( self, @@ -23,17 +25,23 @@ def resolve( class LocalRefSourceGroup: + __slots__ = ("sources",) + def __init__(self, sources: Sequence[LocalRefSource[JSONSchema]]): self.sources = sources class RefGenerator(ABC): + __slots__ = () + @abstractmethod def generate_ref(self, json_schema: JSONSchema, loc_stack: LocStack) -> str: ... class RefMangler(ABC): + __slots__ = () + @abstractmethod def mangle_refs( self, @@ -59,7 +67,7 @@ def __contains__(self, item): class CustomJSONSchemaHasher: - __slots__ = ("_extra", "_json_schema") + __slots__ = ("_json_schema",) def __init__(self, json_schema: JSONSchema): self._json_schema = json_schema @@ -72,6 +80,8 @@ def __eq__(self, other): class BuiltinJSONSchemaResolver(JSONSchemaResolver): + __slots__ = ("_ref_generator", "_ref_mangler") + def __init__(self, ref_generator: RefGenerator, ref_mangler: RefMangler): self._ref_generator = ref_generator self._ref_mangler = ref_mangler diff --git a/src/adaptix/_internal/morphing/model/basic_gen.py b/src/adaptix/_internal/morphing/model/basic_gen.py index c14c7141..ec080f59 100644 --- a/src/adaptix/_internal/morphing/model/basic_gen.py +++ b/src/adaptix/_internal/morphing/model/basic_gen.py @@ -60,6 +60,8 @@ def fetch_code_gen_hook(mediator: Mediator, loc_stack: LocStack) -> CodeGenHook: class CodeGenAccumulator(MethodsProvider): """Accumulates all generated code. It may be useful for debugging""" + __slots__ = ("list",) + def __init__(self) -> None: self.list: list[tuple[CodeGenHookRequest, CodeGenHookData]] = [] @@ -245,12 +247,16 @@ def has_collect_policy(crown: InpCrown) -> bool: class ModelLoaderGen(ABC): + __slots__ = () + @abstractmethod def produce_code(self, closure_name: str) -> tuple[str, Mapping[str, object]]: ... class ModelDumperGen(ABC): + __slots__ = () + @abstractmethod def produce_code(self, closure_name: str) -> tuple[str, Mapping[str, object]]: ... diff --git a/src/adaptix/_internal/morphing/model/crown_definitions.py b/src/adaptix/_internal/morphing/model/crown_definitions.py index 3a814b13..4c7e43e6 100644 --- a/src/adaptix/_internal/morphing/model/crown_definitions.py +++ b/src/adaptix/_internal/morphing/model/crown_definitions.py @@ -18,14 +18,20 @@ class ExtraSkip(metaclass=SingletonMeta): """Ignore any extra data""" + __slots__ = () + class ExtraForbid(metaclass=SingletonMeta): """Raise error if extra data would be met""" + __slots__ = () + class ExtraCollect(metaclass=SingletonMeta): """Collect extra data and pass it to object""" + __slots__ = () + # -------- Base classes for crown -------- # @@ -144,7 +150,7 @@ class OutFieldCrown(BaseFieldCrown): class ExtraKwargs(metaclass=SingletonMeta): - pass + __slots__ = () @dataclass(frozen=True) diff --git a/src/adaptix/_internal/morphing/model/dumper_gen.py b/src/adaptix/_internal/morphing/model/dumper_gen.py index 3ac8249d..24c0e7bd 100644 --- a/src/adaptix/_internal/morphing/model/dumper_gen.py +++ b/src/adaptix/_internal/morphing/model/dumper_gen.py @@ -56,6 +56,19 @@ class GenState: + __slots__ = ( + "_last_path_idx", + "_path", + "debug_trail", + "error_handler_name", + "error_handlers", + "field_id_to_path", + "field_to_idx", + "namespace", + "path_to_suffix", + "trail_element_to_name_idx", + ) + def __init__(self, namespace: CascadeNamespace, debug_trail: DebugTrail, error_handler_name: str): self.namespace = namespace self.debug_trail = debug_trail @@ -128,6 +141,8 @@ def get_trail_element_expr(self, trail_element: TrailElement) -> str: class VarExpr(Expression): + __slots__ = ("name",) + def __init__(self, name: str): self.name = name @@ -136,6 +151,8 @@ def write_lines(self, writer: TextSliceWriter) -> None: class AssignmentStatement(Statement): + __slots__ = ("value", "var") + def __init__(self, var: VarExpr, value: Expression): self.var = var self.value = value @@ -151,6 +168,8 @@ def write_lines(self, writer: TextSliceWriter) -> None: class ErrorHandling(Statement): + __slots__ = ("_field", "_state") + def __init__(self, state: GenState, field: Optional[OutputField]): self._state = state self._field = field @@ -178,6 +197,8 @@ def write_lines(self, writer: TextSliceWriter) -> None: class FieldErrorCatching(Statement): + __slots__ = ("_field", "_state", "_stmt") + def __init__(self, state: GenState, field: OutputField, stmt: Statement): self._state = state self._field = field @@ -213,6 +234,15 @@ class DictFragment(NamedTuple): class BuiltinModelDumperGen(ModelDumperGen): + __slots__ = ( + "_debug_trail", + "_fields_dumpers", + "_id_to_field", + "_model_identity", + "_name_layout", + "_shape", + ) + def __init__( self, shape: OutputShape, @@ -845,6 +875,13 @@ def _get_placeholder_expr(self, state: GenState, placeholder: Placeholder) -> Ex class ModelOutputJSONSchemaGen: + __slots__ = ( + "_field_default_dumper", + "_field_json_schema_getter", + "_placeholder_dumper", + "_shape", + ) + def __init__( self, shape: OutputShape, diff --git a/src/adaptix/_internal/morphing/model/dumper_provider.py b/src/adaptix/_internal/morphing/model/dumper_provider.py index b54595c0..df9651ca 100644 --- a/src/adaptix/_internal/morphing/model/dumper_provider.py +++ b/src/adaptix/_internal/morphing/model/dumper_provider.py @@ -31,6 +31,8 @@ class ModelDumperProvider(DumperProvider, JSONSchemaProvider): + __slots__ = ("_name_sanitizer",) + def __init__(self, *, name_sanitizer: NameSanitizer = BuiltinNameSanitizer()): self._name_sanitizer = name_sanitizer diff --git a/src/adaptix/_internal/morphing/model/loader_gen.py b/src/adaptix/_internal/morphing/model/loader_gen.py index 80142eb5..cdcc572d 100644 --- a/src/adaptix/_internal/morphing/model/loader_gen.py +++ b/src/adaptix/_internal/morphing/model/loader_gen.py @@ -46,6 +46,8 @@ class Namer: + __slots__ = ("_path", "debug_trail", "path_to_suffix") + def __init__( self, debug_trail: DebugTrail, @@ -101,6 +103,17 @@ def emit_error(self, error_expr: str) -> str: class GenState(Namer): + __slots__ = ( + "_crown_stack", + "_last_path_idx", + "_name_to_field", + "_parent_path", + "builder", + "field_id_to_path", + "namespace", + "type_checked_type_paths", + ) + path_to_suffix: dict[CrownPath, str] def __init__( @@ -177,6 +190,19 @@ class BuiltinModelLoaderGen(ModelLoaderGen): calls loaders and stores results to variables. """ + __slots__ = ( + "_debug_trail", + "_field_id_to_param", + "_field_loaders", + "_id_to_field", + "_model_identity", + "_name_layout", + "_props", + "_shape", + "_skipped_fields", + "_strict_coercion", + ) + def __init__( self, *, @@ -794,6 +820,12 @@ def _gen_none_crown(self, state: GenState, crown: InpNoneCrown): class ModelInputJSONSchemaGen: + __slots__ = ( + "_field_name_to_json_schema", + "_field_name_to_json_schema_of_default", + "_shape", + ) + def __init__( self, shape: InputShape, diff --git a/src/adaptix/_internal/morphing/model/loader_provider.py b/src/adaptix/_internal/morphing/model/loader_provider.py index 65fd1364..20c879f0 100644 --- a/src/adaptix/_internal/morphing/model/loader_provider.py +++ b/src/adaptix/_internal/morphing/model/loader_provider.py @@ -32,6 +32,11 @@ class ModelLoaderProvider(LoaderProvider, JSONSchemaProvider): + __slots__ = ( + "_name_sanitizer", + "_props", + ) + def __init__( self, *, @@ -304,6 +309,8 @@ def _validate_params( class InlinedShapeModelLoaderProvider(ModelLoaderProvider): + __slots__ = ("_shape",) + def __init__( self, *, diff --git a/src/adaptix/_internal/morphing/model/request_filtering.py b/src/adaptix/_internal/morphing/model/request_filtering.py index af0f4d35..d272c7e2 100644 --- a/src/adaptix/_internal/morphing/model/request_filtering.py +++ b/src/adaptix/_internal/morphing/model/request_filtering.py @@ -4,6 +4,8 @@ class AnyModelLSC(LocStackChecker): + __slots__ = () + def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool: try: mediator.provide(InputShapeRequest(loc_stack=loc_stack)) diff --git a/src/adaptix/_internal/morphing/name_layout/base.py b/src/adaptix/_internal/morphing/name_layout/base.py index f3d49216..6ff9176c 100644 --- a/src/adaptix/_internal/morphing/name_layout/base.py +++ b/src/adaptix/_internal/morphing/name_layout/base.py @@ -32,6 +32,8 @@ class ExtraMoveMaker(ABC): + __slots__ = () + @abstractmethod def make_inp_extra_move( self, @@ -50,6 +52,8 @@ def make_out_extra_move( class StructureMaker(ABC): + __slots__ = () + @abstractmethod def make_inp_structure( self, @@ -86,6 +90,8 @@ def empty_as_list_out( class SievesMaker(ABC): + __slots__ = () + @abstractmethod def make_sieves( self, @@ -97,6 +103,8 @@ def make_sieves( class ExtraPoliciesMaker(ABC): + __slots__ = () + @abstractmethod def make_extra_policies( self, diff --git a/src/adaptix/_internal/morphing/name_layout/component.py b/src/adaptix/_internal/morphing/name_layout/component.py index 803722fa..753227af 100644 --- a/src/adaptix/_internal/morphing/name_layout/component.py +++ b/src/adaptix/_internal/morphing/name_layout/component.py @@ -104,11 +104,15 @@ def apply_lsc( class NameMappingRetort(OperatingRetort): + __slots__ = () + def provide_name_mapping(self, request: NameMappingRequest) -> Optional[KeyPath]: return self._provide_from_recipe(request) class BuiltinStructureMaker(StructureMaker): + __slots__ = () + def _generate_key(self, schema: StructureSchema, shape: BaseShape, field: BaseField) -> Key: if schema.as_list: return shape.fields.index(field) @@ -349,6 +353,8 @@ class SievesOverlay(Overlay[SievesSchema]): class BuiltinSievesMaker(SievesMaker): + __slots__ = () + def _create_sieve(self, field: OutputField) -> Sieve: if isinstance(field.default, DefaultValue): default_value = field.default.value @@ -404,6 +410,8 @@ class ExtraMoveAndPoliciesOverlay(Overlay[ExtraMoveAndPoliciesSchema]): class BuiltinExtraMoveAndPoliciesMaker(ExtraMoveMaker, ExtraPoliciesMaker): + __slots__ = () + def _create_extra_targets(self, extra: Union[str, Sequence[str]]) -> ExtraTargets: if isinstance(extra, str): return ExtraTargets((extra,)) diff --git a/src/adaptix/_internal/morphing/name_layout/crown_builder.py b/src/adaptix/_internal/morphing/name_layout/crown_builder.py index 397d6c59..6cca27e3 100644 --- a/src/adaptix/_internal/morphing/name_layout/crown_builder.py +++ b/src/adaptix/_internal/morphing/name_layout/crown_builder.py @@ -37,6 +37,11 @@ class PathWithLeaf(Generic[LeafCr]): class BaseCrownBuilder(ABC, Generic[LeafCr, DictCr, ListCr]): + __slots__ = ( + "_paths_to_leaves", + "_paths_to_order", + ) + def __init__(self, paths_to_leaves: PathsTo[LeafCr]): self._paths_to_leaves = paths_to_leaves self._paths_to_order = {path: i for i, path in enumerate(paths_to_leaves)} @@ -109,6 +114,8 @@ def _make_list_crown(self, current_path: KeyPath, paths_with_leaves: PathedLeave class InpCrownBuilder(BaseCrownBuilder[LeafInpCrown, InpDictCrown, InpListCrown]): + __slots__ = ("extra_policies",) + def __init__(self, extra_policies: PathsTo[DictExtraPolicy], paths_to_leaves: PathsTo[LeafInpCrown]): self.extra_policies = extra_policies super().__init__(paths_to_leaves) @@ -127,6 +134,8 @@ def _make_list_crown(self, current_path: KeyPath, paths_with_leaves: PathedLeave class OutCrownBuilder(BaseCrownBuilder[LeafOutCrown, OutDictCrown, OutListCrown]): + __slots__ = ("path_to_sieves",) + def __init__(self, path_to_sieves: PathsTo[Sieve], paths_to_leaves: PathsTo[LeafOutCrown]): self.path_to_sieves = path_to_sieves super().__init__(paths_to_leaves) diff --git a/src/adaptix/_internal/morphing/name_layout/name_mapping.py b/src/adaptix/_internal/morphing/name_layout/name_mapping.py index 9c76368a..936ae1e9 100644 --- a/src/adaptix/_internal/morphing/name_layout/name_mapping.py +++ b/src/adaptix/_internal/morphing/name_layout/name_mapping.py @@ -47,6 +47,8 @@ def resolve_map_result(generated_key: Key, map_result: MapResult) -> Optional[Ke class NameMappingProvider(MethodsProvider, ABC): + __slots__ = () + @abstractmethod @method_handler def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) -> Optional[KeyPath]: @@ -54,6 +56,8 @@ def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) class DictNameMappingProvider(NameMappingProvider): + __slots__ = ("_name_map",) + def __init__(self, name_map: Mapping[str, MapResult]): self._name_map = name_map self._validate() @@ -75,6 +79,8 @@ def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) class ConstNameMappingProvider(NameMappingProvider): + __slots__ = ("_result",) + def __init__(self, result: MapResult): self._result = result @@ -83,6 +89,8 @@ def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) class FuncNameMappingProvider(NameMappingProvider): + __slots__ = ("_func",) + def __init__(self, func: Callable[[BaseShape, BaseField], MapResult]): self._func = func @@ -92,6 +100,8 @@ def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) class SkipPrivateFieldsNameMappingProvider(NameMappingProvider): + __slots__ = () + def provide_name_mapping(self, mediator: Mediator, request: NameMappingRequest) -> Optional[KeyPath]: if not isinstance(request.field, OutputField): raise CannotProvide diff --git a/src/adaptix/_internal/morphing/name_layout/provider.py b/src/adaptix/_internal/morphing/name_layout/provider.py index ef753a24..4c76c105 100644 --- a/src/adaptix/_internal/morphing/name_layout/provider.py +++ b/src/adaptix/_internal/morphing/name_layout/provider.py @@ -22,6 +22,13 @@ class BuiltinNameLayoutProvider(MethodsProvider): + __slots__ = ( + "_extra_move_maker", + "_extra_policies_maker", + "_sieves_maker", + "_structure_maker", + ) + def __init__( self, structure_maker: StructureMaker, diff --git a/src/adaptix/_internal/morphing/provider_template.py b/src/adaptix/_internal/morphing/provider_template.py index 3ce567fb..46e957d4 100644 --- a/src/adaptix/_internal/morphing/provider_template.py +++ b/src/adaptix/_internal/morphing/provider_template.py @@ -15,6 +15,8 @@ class LoaderProvider(LocatedRequestMethodsProvider, ABC): + __slots__ = () + @method_handler @abstractmethod def provide_loader(self, mediator: Mediator[Loader], request: LoaderRequest) -> Loader: @@ -22,6 +24,8 @@ def provide_loader(self, mediator: Mediator[Loader], request: LoaderRequest) -> class DumperProvider(LocatedRequestMethodsProvider, ABC): + __slots__ = () + @method_handler @abstractmethod def provide_dumper(self, mediator: Mediator[Dumper], request: DumperRequest) -> Dumper: @@ -29,6 +33,8 @@ def provide_dumper(self, mediator: Mediator[Dumper], request: DumperRequest) -> class JSONSchemaProvider(LocatedRequestMethodsProvider, ABC): + __slots__ = () + @method_handler @abstractmethod def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> JSONSchema: @@ -41,10 +47,12 @@ class MorphingProvider( JSONSchemaProvider, ABC, ): - pass + __slots__ = () class ProxyProvider(Provider, ABC): + __slots__ = ("_for_dumper", "_for_loader") + def __init__(self, *, for_loader: bool = True, for_dumper: bool = True): self._for_loader = for_loader self._for_dumper = for_dumper @@ -85,6 +93,8 @@ def _get_error_text(self) -> str: class ABCProxy(ProxyProvider): + __slots__ = ("_abstract", "_impl") + def __init__(self, abstract: TypeHint, impl: TypeHint, *, for_loader: bool = True, for_dumper: bool = True): self._abstract = normalize_type(abstract).origin self._impl = impl @@ -101,6 +111,8 @@ def _get_error_text(self) -> str: class ToVarTupleProxy(ABCProxy): + __slots__ = () + def __init__(self, abstract: TypeHint, *, for_loader: bool = True, for_dumper: bool = True): super().__init__(abstract, tuple, for_loader=for_loader, for_dumper=for_dumper) @@ -109,5 +121,7 @@ def _get_proxy_target(self, tp: TypeHint) -> TypeHint: class DelegatingProvider(ProxyProvider, ABC): + __slots__ = () + def _get_request_checker(self) -> RequestChecker: return AlwaysTrueRequestChecker() diff --git a/src/adaptix/_internal/morphing/sentinel_provider.py b/src/adaptix/_internal/morphing/sentinel_provider.py index 314c2681..88f0d22b 100644 --- a/src/adaptix/_internal/morphing/sentinel_provider.py +++ b/src/adaptix/_internal/morphing/sentinel_provider.py @@ -16,6 +16,8 @@ class IsSentinelRequest(LocatedRequest[bool]): class SentinelProvider(MorphingProvider): + __slots__ = () + def _raise_error(self, target: str) -> NoReturn: raise CannotProvide( f"Sentinels are not meant to be represented externally, so they do not have {target}." diff --git a/src/adaptix/_internal/morphing/union_provider.py b/src/adaptix/_internal/morphing/union_provider.py index 61abaaaf..de901d37 100644 --- a/src/adaptix/_internal/morphing/union_provider.py +++ b/src/adaptix/_internal/morphing/union_provider.py @@ -14,11 +14,9 @@ from ..special_cases_optimization import as_is_stub from ..type_tools import BaseNormType, is_subclass_soft, strip_tags from ..type_tools.normalize_type import NoneType -from ..utils import Omitted from .concrete_provider import none_loader from .json_schema.definitions import JSONSchema from .json_schema.request_cls import JSONSchemaRequest -from .json_schema.schema_model import JSONSchemaType from .load_error import LoadError, TypeLoadError, UnionLoadError from .provider_template import DumperProvider, JSONSchemaProvider, LoaderProvider from .request_cls import DebugTrailRequest, DumperRequest, LoaderRequest @@ -28,6 +26,8 @@ @for_predicate(Union) class UnionProvider(LoaderProvider, DumperProvider, JSONSchemaProvider): + __slots__ = () + def _get_loc_stacks_to_request( self, mediator: Mediator, diff --git a/src/adaptix/_internal/provider/essential.py b/src/adaptix/_internal/provider/essential.py index 70dd5d42..1b855be1 100644 --- a/src/adaptix/_internal/provider/essential.py +++ b/src/adaptix/_internal/provider/essential.py @@ -128,6 +128,8 @@ class DirectMediator(ABC): Mediator is a proxy to providers of retort. """ + __slots__ = () + @abstractmethod def provide(self, request: Request[T]) -> T: """Get response of sent request. @@ -232,6 +234,8 @@ class Mediator(DirectMediator, ABC, Generic[ResponseT]): Mediator is a proxy to providers of retort. """ + __slots__ = () + @abstractmethod def provide_from_next(self) -> ResponseT: """Forward current request to providers @@ -253,6 +257,8 @@ def cached_call(self, func: Callable[..., T], *args: Any, **kwargs: Any) -> T: class RequestChecker(ABC, Generic[RequestT]): + __slots__ = () + @abstractmethod def check_request(self, mediator: DirectMediator, request: RequestT, /) -> bool: ... @@ -264,6 +270,8 @@ def check_request(self, mediator: DirectMediator, request: RequestT, /) -> bool: class Provider(ABC): """An object that can process Request instances""" + __slots__ = () + @abstractmethod def get_request_handlers(self) -> Sequence[RequestHandlerRegisterRecord]: ... diff --git a/src/adaptix/_internal/provider/loc_stack_filtering.py b/src/adaptix/_internal/provider/loc_stack_filtering.py index 0df26db6..778ff4af 100644 --- a/src/adaptix/_internal/provider/loc_stack_filtering.py +++ b/src/adaptix/_internal/provider/loc_stack_filtering.py @@ -31,11 +31,15 @@ class LocStack(ImmutableStack[AnyLocT_co]): + __slots__ = () + def replace_last_type(self: LocStackT, tp: TypeHint, /) -> LocStackT: return self.replace_last(replace(self.last, type=tp)) class LocStackChecker(ABC): + __slots__ = () + @abstractmethod def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool: ... @@ -68,6 +72,8 @@ def __invert__(self) -> "LocStackChecker": class InvertLSC(LocStackChecker): + __slots__ = ("_lsc",) + def __init__(self, lsc: LocStackChecker): self._lsc = lsc @@ -76,6 +82,8 @@ def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool class BinOperatorLSC(LocStackChecker, ABC): + __slots__ = ("_loc_stack_checkers",) + def __init__(self, loc_stack_checkers: Iterable[LocStackChecker]): self._loc_stack_checkers = loc_stack_checkers @@ -91,19 +99,27 @@ def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool class OrLocStackChecker(BinOperatorLSC): + __slots__ = () + _reduce = any # type: ignore[assignment] class AndLocStackChecker(BinOperatorLSC): + __slots__ = () + _reduce = all # type: ignore[assignment] class XorLocStackChecker(BinOperatorLSC): + __slots__ = () + def _reduce(self, elements: Iterable[bool], /) -> bool: return reduce(operator.xor, elements) class LastLocChecker(LocStackChecker, ABC): + __slots__ = () + _expected_location: ClassVar[type] def __init_subclass__(cls, **kwargs): @@ -175,6 +191,8 @@ def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: class VarTupleLSC(LastLocChecker): + __slots__ = () + def _check_location(self, mediator: DirectMediator, loc: TypeHintLoc) -> bool: try: norm = normalize_type(loc.type) @@ -206,6 +224,8 @@ def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool class AnyLocStackChecker(LocStackChecker): + __slots__ = () + def check_loc_stack(self, mediator: DirectMediator, loc_stack: LocStack) -> bool: return True @@ -272,6 +292,8 @@ def create_loc_stack_checker(pred: Pred) -> LocStackChecker: class LocStackPattern: + __slots__ = ("_stack",) + def __init__(self, stack: VarTuple[LocStackChecker]): self._stack = stack diff --git a/src/adaptix/_internal/provider/located_request.py b/src/adaptix/_internal/provider/located_request.py index f7998f0c..53098771 100644 --- a/src/adaptix/_internal/provider/located_request.py +++ b/src/adaptix/_internal/provider/located_request.py @@ -42,6 +42,8 @@ def __repr__(self): class LocatedRequestMethodsProvider(MethodsProvider): + __slots__ = () + _loc_stack_checker: LocStackChecker = AnyLocStackChecker() @classmethod @@ -67,6 +69,8 @@ def decorator(cls: type[LocatedRequestMethodsProvider]): class LocStackBoundingProvider(Provider): + __slots__ = ("_loc_stack_checker", "_provider") + def __init__(self, loc_stack_checker: LocStackChecker, provider: Provider): self._loc_stack_checker = loc_stack_checker self._provider = provider diff --git a/src/adaptix/_internal/provider/methods_provider.py b/src/adaptix/_internal/provider/methods_provider.py index 24f0cb46..2e29ac88 100644 --- a/src/adaptix/_internal/provider/methods_provider.py +++ b/src/adaptix/_internal/provider/methods_provider.py @@ -45,6 +45,8 @@ def _infer_request_cls(func) -> type[Request]: class MethodsProvider(Provider): + __slots__ = () + _mp_cls_request_to_method_name: ClassVar[Mapping[type[Request], str]] = {} def __init_subclass__(cls, **kwargs): diff --git a/src/adaptix/_internal/provider/overlay_schema.py b/src/adaptix/_internal/provider/overlay_schema.py index 20c71778..c3c24160 100644 --- a/src/adaptix/_internal/provider/overlay_schema.py +++ b/src/adaptix/_internal/provider/overlay_schema.py @@ -109,6 +109,8 @@ def provide_schema(overlay: type[Overlay[Sc]], mediator: Mediator, loc_stack: Lo class OverlayProvider(MethodsProvider): + __slots__ = ("_chain", "_overlays") + def __init__(self, overlays: Iterable[Overlay], chain: Optional[Chain]): self._chain = chain self._overlays = ClassMap(*overlays) diff --git a/src/adaptix/_internal/provider/provider_wrapper.py b/src/adaptix/_internal/provider/provider_wrapper.py index b113bd0f..477d25fb 100644 --- a/src/adaptix/_internal/provider/provider_wrapper.py +++ b/src/adaptix/_internal/provider/provider_wrapper.py @@ -9,6 +9,8 @@ class ConcatProvider(Provider): + __slots__ = ("_providers",) + def __init__(self, *providers: Provider): self._providers = providers @@ -34,6 +36,8 @@ class Chain(Enum): class ChainingProvider(Provider): + __slots__ = ("_chain", "_provider") + def __init__(self, chain: Chain, provider: Provider): self._chain = chain self._provider = provider diff --git a/src/adaptix/_internal/provider/request_checkers.py b/src/adaptix/_internal/provider/request_checkers.py index 0e5fa58b..44b84402 100644 --- a/src/adaptix/_internal/provider/request_checkers.py +++ b/src/adaptix/_internal/provider/request_checkers.py @@ -2,6 +2,8 @@ class AlwaysTrueRequestChecker(RequestChecker): + __slots__ = () + def check_request(self, mediator: DirectMediator, request: Request, /) -> bool: return True diff --git a/src/adaptix/_internal/provider/shape_provider.py b/src/adaptix/_internal/provider/shape_provider.py index 4197c1e8..a2ea8b8c 100644 --- a/src/adaptix/_internal/provider/shape_provider.py +++ b/src/adaptix/_internal/provider/shape_provider.py @@ -43,6 +43,8 @@ class OutputShapeRequest(LocatedRequest[OutputShape]): class ShapeProvider(MethodsProvider): + __slots__ = ("_introspector",) + def __init__(self, introspector: ShapeIntrospector): self._introspector = introspector @@ -88,6 +90,11 @@ def _provide_output_shape(self, mediator: Mediator, request: OutputShapeRequest) class PropertyExtender(MethodsProvider): + __slots__ = ( + "_infer_types_for", + "_output_fields", + ) + def __init__( self, output_fields: Iterable[OutputField], @@ -141,6 +148,11 @@ def _infer_property_type(self, tp: TypeHint, attr_name: str) -> TypeHint: class ShapeGenericResolver(Generic[ShapeT]): + __slots__ = ( + "_initial_request", + "_mediator", + ) + def __init__(self, mediator: Mediator, initial_request: LocatedRequest[ShapeT]): self._mediator = mediator self._initial_request = initial_request @@ -189,6 +201,14 @@ def provide_generic_resolved_shape(mediator: Mediator, request: LocatedRequest[S class SimilarShapeProvider(MethodsProvider): + __slots__ = ( + "_for_input", + "_for_output", + "_loc_stack_checker", + "_prototype", + "_target", + ) + def __init__(self, target: TypeHint, prototype: TypeHint, *, for_input: bool = True, for_output: bool = True): self._target = target self._prototype = prototype diff --git a/src/adaptix/_internal/provider/value_provider.py b/src/adaptix/_internal/provider/value_provider.py index 02829fa9..e5255419 100644 --- a/src/adaptix/_internal/provider/value_provider.py +++ b/src/adaptix/_internal/provider/value_provider.py @@ -8,6 +8,8 @@ class ValueProvider(Provider, Generic[T]): + __slots__ = ("_request_cls", "_value") + def __init__(self, request_cls: type[Request[T]], value: T): self._request_cls = request_cls self._value = value diff --git a/src/adaptix/_internal/py.typed b/src/adaptix/_internal/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/src/adaptix/_internal/retort/base_retort.py b/src/adaptix/_internal/retort/base_retort.py index 2094dbff..17cd3dff 100644 --- a/src/adaptix/_internal/retort/base_retort.py +++ b/src/adaptix/_internal/retort/base_retort.py @@ -33,6 +33,8 @@ class BaseRetort(Cloneable, metaclass=RetortMeta): recipe: ClassVar[Iterable[Provider]] = [] _full_class_recipe: ClassVar[VarTuple[Provider]] + __slots__ = ("_full_recipe", "_instance_recipe") + def __init_subclass__(cls, **kwargs): # noinspection PyProtectedMember cls._full_class_recipe = tuple( diff --git a/src/adaptix/_internal/retort/builtin_mediator.py b/src/adaptix/_internal/retort/builtin_mediator.py index 4152c1c8..23cc2736 100644 --- a/src/adaptix/_internal/retort/builtin_mediator.py +++ b/src/adaptix/_internal/retort/builtin_mediator.py @@ -12,6 +12,8 @@ class RequestBus(ABC, Generic[RequestT, ResponseT]): + __slots__ = () + @abstractmethod def send(self, request: RequestT) -> ResponseT: pass diff --git a/src/adaptix/_internal/retort/error_renderer.py b/src/adaptix/_internal/retort/error_renderer.py index 891606f6..9657951e 100644 --- a/src/adaptix/_internal/retort/error_renderer.py +++ b/src/adaptix/_internal/retort/error_renderer.py @@ -7,12 +7,16 @@ class ErrorRenderer(ABC): + __slots__ = () + @abstractmethod def render(self, error: CannotProvide) -> str: ... class BuiltinErrorRenderer(ErrorRenderer): + __slots__ = ("_tree_renderer",) + def __init__(self, tree_renderer_config: TreeRendererConfig): self._tree_renderer = TreeRenderer( config=tree_renderer_config, diff --git a/src/adaptix/_internal/retort/operating_retort.py b/src/adaptix/_internal/retort/operating_retort.py index 69a98018..0757dc7b 100644 --- a/src/adaptix/_internal/retort/operating_retort.py +++ b/src/adaptix/_internal/retort/operating_retort.py @@ -38,6 +38,8 @@ def __hash__(self): class LocatedRequestCallableRecursionResolver(RecursionResolver[LocatedRequest, CallableT], Generic[CallableT]): + __slots__ = ("_tp_to_stub",) + def __init__(self) -> None: self._tp_to_stub: dict[TypeHint, FuncWrapper] = {} @@ -63,6 +65,8 @@ def track_response(self, request: LocatedRequest, response: CallableT) -> None: class BaseRequestErrorRepresentor(ErrorRepresentor[RequestT], Generic[RequestT]): + __slots__ = ("_not_found_desc",) + def __init__(self, not_found_desc: str): self._not_found_desc = not_found_desc @@ -74,12 +78,16 @@ def get_provider_not_found_description(self, request: RequestT) -> str: class LocatedRequestErrorRepresentor(BaseRequestErrorRepresentor[LocatedRequestT], Generic[LocatedRequestT]): + __slots__ = () + def get_request_context_notes(self, request: LocatedRequestT) -> Iterable[str]: loc_stack_desc = format_loc_stack(request.loc_stack, always_wrap_with_brackets=True) yield f"Location: {loc_stack_desc}" class LinkingRequestErrorRepresentor(ErrorRepresentor[LinkingRequest]): + __slots__ = () + def get_request_context_notes(self, request: RequestT) -> Iterable[str]: return () @@ -89,6 +97,8 @@ def get_provider_not_found_description(self, request: LinkingRequest) -> str: class CoercerRequestErrorRepresentor(BaseRequestErrorRepresentor[CoercerRequest]): + __slots__ = () + def get_request_context_notes(self, request: CoercerRequest) -> Iterable[str]: src_desc = format_loc_stack(request.src) dst_desc = format_loc_stack(request.dst) @@ -96,6 +106,8 @@ def get_request_context_notes(self, request: CoercerRequest) -> Iterable[str]: class JSONSchemaMiddlewareProvider(LocatedRequestMethodsProvider): + __slots__ = () + @method_handler def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> JSONSchema: json_schema = mediator.provide_from_next() @@ -113,6 +125,8 @@ def provide_json_schema(self, mediator: Mediator, request: JSONSchemaRequest) -> class OperatingRetort(SearchingRetort): """A retort that can operate as Retort but have no predefined providers and no high-level user interface""" + __slots__ = () + def _get_recipe_head(self) -> Sequence[Provider]: return ( JSONSchemaMiddlewareProvider(), diff --git a/src/adaptix/_internal/retort/request_bus.py b/src/adaptix/_internal/retort/request_bus.py index 26df7c3c..463abdb0 100644 --- a/src/adaptix/_internal/retort/request_bus.py +++ b/src/adaptix/_internal/retort/request_bus.py @@ -18,6 +18,8 @@ class ErrorRepresentor(ABC, Generic[RequestT]): + __slots__ = () + @abstractmethod def get_provider_not_found_description(self, request: RequestT) -> str: ... @@ -30,6 +32,8 @@ def get_request_context_notes(self, request: RequestT) -> Iterable[str]: class RequestRouter(ABC, Generic[RequestT]): """An offset of each element must belong to [0; max_offset)""" + __slots__ = () + @abstractmethod def find_handler( self, @@ -113,6 +117,8 @@ def _attach_sub_exceptions_notes(self, exc: E, sub_exceptions: Iterable[CannotPr class RecursionResolver(ABC, Generic[RequestT, ResponseT]): + __slots__ = () + @abstractmethod def track_request(self, request: RequestT) -> Optional[ResponseT]: ... @@ -123,7 +129,7 @@ def track_response(self, request: RequestT, response: ResponseT) -> None: class RecursiveRequestBus(BasicRequestBus[RequestT, ResponseT], Generic[RequestT, ResponseT]): - __slots__ = (*BasicRequestBus.__slots__, "_recursion_resolver") + __slots__ = ("_recursion_resolver",) def __init__( self, diff --git a/src/adaptix/_internal/retort/routers.py b/src/adaptix/_internal/retort/routers.py index 454213a0..a080bb57 100644 --- a/src/adaptix/_internal/retort/routers.py +++ b/src/adaptix/_internal/retort/routers.py @@ -76,6 +76,8 @@ def get_max_offset(self) -> int: class ExactOriginCombiner: + __slots__ = ("_combo",) + def __init__(self) -> None: self._combo: OriginToHandler = {} diff --git a/src/adaptix/_internal/retort/searching_retort.py b/src/adaptix/_internal/retort/searching_retort.py index c9177f04..b60238ad 100644 --- a/src/adaptix/_internal/retort/searching_retort.py +++ b/src/adaptix/_internal/retort/searching_retort.py @@ -44,6 +44,13 @@ def __str__(self): class SearchingRetort(BaseRetort, Provider, ABC): """A retort that can operate as Retort but have no predefined providers and no high-level user interface""" + __slots__ = ( + "_call_cache", + "_error_renderer", + "_request_cls_to_error_representor", + "_request_cls_to_router", + ) + def __init__( self, *, diff --git a/src/adaptix/_internal/tree_renderer.py b/src/adaptix/_internal/tree_renderer.py index a08e7e53..6c0d6d71 100644 --- a/src/adaptix/_internal/tree_renderer.py +++ b/src/adaptix/_internal/tree_renderer.py @@ -23,6 +23,12 @@ class TreeRendererConfig: class TreeRenderer(Generic[N]): + __slots__ = ( + "_children_getter", + "_config", + "_node_renderer", + ) + def __init__( self, config: TreeRendererConfig, diff --git a/src/adaptix/_internal/type_tools/generic_resolver.py b/src/adaptix/_internal/type_tools/generic_resolver.py index 3f8c7347..2c8045cc 100644 --- a/src/adaptix/_internal/type_tools/generic_resolver.py +++ b/src/adaptix/_internal/type_tools/generic_resolver.py @@ -23,6 +23,8 @@ class MembersStorage(Generic[K, M]): class GenericResolver(Generic[K, M]): + __slots__ = ("_raw_members_getter",) + def __init__(self, members_getter: Callable[[TypeHint], MembersStorage[K, M]]): self._raw_members_getter = members_getter diff --git a/src/adaptix/_internal/type_tools/implicit_params.py b/src/adaptix/_internal/type_tools/implicit_params.py index 420c2da1..487b15f0 100644 --- a/src/adaptix/_internal/type_tools/implicit_params.py +++ b/src/adaptix/_internal/type_tools/implicit_params.py @@ -10,6 +10,8 @@ class ImplicitParamsGetter: + __slots__ = () + def _process_limit_element(self, type_var: TypeVar, tp: TypeHint) -> TypeHint: if isinstance(tp, ForwardRef): return eval_forward_ref(vars(sys.modules[type_var.__module__]), tp) diff --git a/src/adaptix/_internal/type_tools/normalize_type.py b/src/adaptix/_internal/type_tools/normalize_type.py index f0f82089..bf41dd6d 100644 --- a/src/adaptix/_internal/type_tools/normalize_type.py +++ b/src/adaptix/_internal/type_tools/normalize_type.py @@ -48,6 +48,8 @@ class BaseNormType(Hashable, ABC): + __slots__ = () + @property @abstractmethod def origin(self) -> Any: @@ -102,7 +104,7 @@ def __repr__(self): class _NormType(_BasicNormType): - __slots__ = (*_BasicNormType.__slots__, "_source") + __slots__ = ("_origin", "_source") def __init__(self, origin: TypeHint, args: VarTuple[Any], *, source: TypeHint): self._origin = origin @@ -114,6 +116,8 @@ def origin(self) -> Any: class _UnionNormType(_BasicNormType): + __slots__ = () + def __init__(self, args: VarTuple[Any], *, source: TypeHint): super().__init__(self._order_args(args), source=source) @@ -141,6 +145,8 @@ def _type_and_value_iter(args): class _LiteralNormType(_BasicNormType): + __slots__ = () + def __init__(self, args: VarTuple[Any], *, source: TypeHint): super().__init__(self._order_args(args), source=source) @@ -168,12 +174,12 @@ def __eq__(self, other): class _AnnotatedNormType(_BasicNormType): + __slots__ = ("_hash",) + @property def origin(self) -> Any: return Annotated - __slots__ = (*_BasicNormType.__slots__, "_hash") - def __init__(self, args: VarTuple[Hashable], *, source: TypeHint): super().__init__(args, source=source) self._hash = self._calc_hash() @@ -255,7 +261,7 @@ def __eq__(self, other): class NormTV(_BaseNormTypeVarLike): - __slots__ = (*_BaseNormTypeVarLike.__slots__, "_limit", "_variance", "_default") + __slots__ = ("_default", "_limit", "_variance") def __init__(self, var: Any, limit: TypeVarLimit, *, source: TypeHint, default: Optional[BaseNormType]): super().__init__(var, source=source) @@ -284,7 +290,7 @@ def default(self) -> Optional[BaseNormType]: class NormTVTuple(_BaseNormTypeVarLike): - __slots__ = (*_BaseNormTypeVarLike.__slots__, "_default") + __slots__ = ("_default",) def __init__(self, var: Any, *, source: TypeHint, default: Optional[tuple[BaseNormType, ...]]): super().__init__(var, source=source) @@ -296,7 +302,7 @@ def default(self) -> Optional[tuple[BaseNormType, ...]]: class NormParamSpec(_BaseNormTypeVarLike): - __slots__ = (*_BaseNormTypeVarLike.__slots__, "_limit", "_default") + __slots__ = ("_default", "_limit") def __init__(self, var: Any, limit: TypeVarLimit, *, source: TypeHint, default: Optional[tuple[BaseNormType, ...]]): super().__init__(var, source=source) @@ -343,12 +349,16 @@ def __eq__(self, other): class _NormParamSpecArgs(NormParamSpecMarker): + __slots__ = () + @property def origin(self) -> Any: return typing.ParamSpecArgs class _NormParamSpecKwargs(NormParamSpecMarker): + __slots__ = () + @property def origin(self) -> Any: return typing.ParamSpecKwargs @@ -472,6 +482,8 @@ def _replace_source_with_union(norm: BaseNormType, sources: list) -> BaseNormTyp class AspectStorage(list[str]): + __slots__ = () + @overload def add(self, *, condition: object = True) -> Callable[[NormAspect], NormAspect]: ... @@ -501,6 +513,8 @@ class NotSubscribedError(ValueError): class TypeNormalizer: + __slots__ = ("_namespace", "implicit_params_getter") + def __init__(self, implicit_params_getter: ImplicitParamsGetter): self.implicit_params_getter = implicit_params_getter self._namespace: Optional[dict[str, Any]] = None diff --git a/src/adaptix/_internal/utils.py b/src/adaptix/_internal/utils.py index f3238a5c..33ccf455 100644 --- a/src/adaptix/_internal/utils.py +++ b/src/adaptix/_internal/utils.py @@ -13,6 +13,8 @@ class Cloneable(ABC): + __slots__ = () + @abstractmethod def _calculate_derived(self) -> None: return @@ -28,6 +30,8 @@ def _clone(self: C) -> Generator[C, Any, Any]: class ForbiddingDescriptor: + __slots__ = ("_name",) + def __init__(self): self._name = None @@ -99,6 +103,8 @@ def pairs(iterable: Iterable[T]) -> Iterable[tuple[T, T]]: # type: ignore[no-re class Omitted(metaclass=SingletonMeta): + __slots__ = () + def __bool__(self): raise TypeError("Omitted() cannot be used in boolean context") @@ -110,6 +116,8 @@ def __bool__(self): class ComparableSequence(Protocol[T]): + __slots__ = () + def __lt__(self, __other: T, /) -> bool: ...