| # 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 |