blob: 6372a15df83cd510f1d0d2378e70ef3724faf28b [file] [log] [blame]
# SPDX-License-Identifier: MIT
"""
Baseline features that should be supported by all type checkers.
"""
from __future__ import annotations
from typing import Any
import attrs
@attrs.define(order=True)
class NGClass:
x: int = attrs.field(default=42)
ngc = NGClass(1)
@attrs.mutable(slots=False)
class NGClass2:
x: int
ngc2 = NGClass2(1)
@attrs.frozen(str=True)
class NGFrozen:
x: int
ngf = NGFrozen(1)
attrs.fields(NGFrozen).x.evolve(eq=False)
a = attrs.fields(NGFrozen).x
a.evolve(repr=False)
@attrs.define
class C:
a: int
c = C(1)
c.a
@attrs.frozen
class D:
a: int
D(1).a
@attrs.define
class Derived(C):
b: int
Derived(1, 2).a
Derived(1, 2).b
@attrs.define
class Error(Exception):
x: int
try:
raise Error(1)
except Error as e:
e.x
e.args
str(e)
@attrs.define
class AliasExample:
without_alias: int
_with_alias: int = attrs.field(alias="_with_alias")
attrs.fields(AliasExample).without_alias.alias
attrs.fields(AliasExample)._with_alias.alias
@attrs.define
class Validated:
num: int = attrs.field(validator=attrs.validators.ge(0))
attrs.validators.set_disabled(True)
attrs.validators.set_disabled(False)
with attrs.validators.disabled():
Validated(num=-1)
@attrs.define
class WithCustomRepr:
a: int = attrs.field(repr=True)
b: str = attrs.field(repr=False)
c: str = attrs.field(repr=lambda value: "c is for cookie")
d: bool = attrs.field(repr=str)
@attrs.define(on_setattr=attrs.setters.validate)
class ValidatedSetter2:
a: int
b: str = attrs.field(on_setattr=attrs.setters.NO_OP)
c: bool = attrs.field(on_setattr=attrs.setters.frozen)
d: int = attrs.field(
on_setattr=[attrs.setters.convert, attrs.setters.validate]
)
e: bool = attrs.field(
on_setattr=attrs.setters.pipe(
attrs.setters.convert, attrs.setters.validate
)
)
@attrs.define(eq=True, order=True)
class OrderFlags:
a: int = attrs.field(eq=False, order=False)
b: int = attrs.field(eq=True, order=True)
# field_transformer
def ft_hook2(
cls: type, attribs: list[attrs.Attribute]
) -> list[attrs.Attribute]:
return attribs
@attrs.define(field_transformer=ft_hook2)
class TransformedAttrs2:
x: int
@attrs.define
class FactoryTest:
a: list[int] = attrs.field(default=attrs.Factory(list))
b: list[Any] = attrs.field(default=attrs.Factory(list, False))
c: list[int] = attrs.field(default=attrs.Factory((lambda s: s.a), True))
attrs.asdict(FactoryTest())
attrs.asdict(FactoryTest(), retain_collection_types=False)
@attrs.define(match_args=False)
class MatchArgs2:
a: int
b: int
# NG versions of asdict/astuple
attrs.asdict(MatchArgs2(1, 2))
attrs.astuple(MatchArgs2(1, 2))
def accessing_from_attrs() -> None:
"""
Use a function to keep the ns clean.
"""
attrs.converters.optional
attrs.exceptions.FrozenError
attrs.filters.include
attrs.filters.exclude
attrs.setters.frozen
attrs.validators.and_
attrs.cmp_using