Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/adaptix/_internal/code_tools/cascade_namespace.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@


class CascadeNamespace(ABC):
__slots__ = ()

@abstractmethod
def add_constant(self, name: str, value: object) -> None:
...
Expand Down
32 changes: 30 additions & 2 deletions src/adaptix/_internal/code_tools/code_block_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@


class TextSliceWriter(AbstractContextManager[None]):
__slots__ = ()

@abstractmethod
def write(self, text: str, /) -> None:
...
Expand Down Expand Up @@ -34,6 +36,8 @@ def make_string(self) -> str:


class OneLineWriter(LinesWriter):
__slots__ = ()

def make_string(self) -> str:
return "".join(self._slices)

Expand All @@ -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

Expand All @@ -76,6 +84,8 @@ def statements(*elements: Statement) -> ConcatStatements:


class RawStatement(Statement):
__slots__ = ("_text",)

def __init__(self, text: str):
self._text = text

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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

Expand All @@ -187,6 +213,8 @@ def write_lines(self, writer: TextSliceWriter) -> None:


class StringLiteral(Expression):
__slots__ = ("_text",)

def __init__(self, text: str):
self._text = text

Expand Down
4 changes: 4 additions & 0 deletions src/adaptix/_internal/code_tools/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
class ClosureCompiler(ABC):
"""Abstract class compiling closures"""

__slots__ = ()

@abstractmethod
def compile(
self,
Expand Down Expand Up @@ -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()

Expand Down
4 changes: 4 additions & 0 deletions src/adaptix/_internal/code_tools/name_sanitizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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({".": "_", "[": "_"})

Expand Down
6 changes: 6 additions & 0 deletions src/adaptix/_internal/conversion/broaching/code_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
26 changes: 26 additions & 0 deletions src/adaptix/_internal/conversion/coercer_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -35,6 +37,8 @@ def _provide_coercer_norm_types(


class SameTypeCoercerProvider(NormTypeCoercerProvider):
__slots__ = ()

def _provide_coercer_norm_types(
self,
mediator: Mediator,
Expand All @@ -48,6 +52,8 @@ def _provide_coercer_norm_types(


class DstAnyCoercerProvider(NormTypeCoercerProvider):
__slots__ = ()

def _provide_coercer_norm_types(
self,
mediator: Mediator,
Expand All @@ -61,6 +67,8 @@ def _provide_coercer_norm_types(


class SubclassCoercerProvider(NormTypeCoercerProvider):
__slots__ = ()

def _provide_coercer_norm_types(
self,
mediator: Mediator,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -120,6 +136,8 @@ def _provide_coercer_norm_types(


class OptionalCoercerProvider(NormTypeCoercerProvider):
__slots__ = ()

def _provide_coercer_norm_types(
self,
mediator: Mediator,
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions src/adaptix/_internal/conversion/converter_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@


class BuiltinConverterProvider(ConverterProvider):
__slots__ = ("_name_sanitizer",)

def __init__(self, *, name_sanitizer: NameSanitizer = BuiltinNameSanitizer()):
self._name_sanitizer = name_sanitizer

Expand Down
6 changes: 5 additions & 1 deletion src/adaptix/_internal/conversion/facade/retort.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@


class FilledConversionRetort(OperatingRetort):
__slots__ = ()

recipe = [
BUILTIN_SHAPE_PROVIDER,

Expand Down Expand Up @@ -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] = {}
Expand Down Expand Up @@ -203,4 +207,4 @@ def convert(self, src_obj: Any, dst: type[DstT], *, recipe: Iterable[Provider] =


class ConversionRetort(FilledConversionRetort, AdornedConversionRetort):
pass
__slots__ = ()
19 changes: 19 additions & 0 deletions src/adaptix/_internal/conversion/linking_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/adaptix/_internal/conversion/model_coercer_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@


class ModelCoercerProvider(CoercerProvider):
__slots__ = ("_name_sanitizer",)

def __init__(self, *, name_sanitizer: NameSanitizer = BuiltinNameSanitizer()):
self._name_sanitizer = name_sanitizer

Expand Down
Loading
Loading