| # SPDX-License-Identifier: MIT |
| |
| """ |
| Tests for `__init_subclass__` related functionality. |
| """ |
| |
| import attr |
| |
| |
| def test_init_subclass_vanilla(slots): |
| """ |
| `super().__init_subclass__` can be used if the subclass is not an attrs |
| class both with dict and slotted classes. |
| """ |
| |
| @attr.s(slots=slots) |
| class Base: |
| def __init_subclass__(cls, param, **kw): |
| super().__init_subclass__(**kw) |
| cls.param = param |
| |
| class Vanilla(Base, param="foo"): |
| pass |
| |
| assert "foo" == Vanilla().param |
| |
| |
| def test_init_subclass_attrs(): |
| """ |
| `__init_subclass__` works with attrs classes as long as slots=False. |
| """ |
| |
| @attr.s(slots=False) |
| class Base: |
| def __init_subclass__(cls, param, **kw): |
| super().__init_subclass__(**kw) |
| cls.param = param |
| |
| @attr.s |
| class Attrs(Base, param="foo"): |
| pass |
| |
| assert "foo" == Attrs().param |
| |
| |
| def test_init_subclass_slots_workaround(): |
| """ |
| `__init_subclass__` works with modern APIs if care is taken around classes |
| existing twice. |
| """ |
| subs = {} |
| |
| @attr.define |
| class Base: |
| def __init_subclass__(cls): |
| subs[cls.__qualname__] = cls |
| |
| @attr.define |
| class Sub1(Base): |
| x: int |
| |
| @attr.define |
| class Sub2(Base): |
| y: int |
| |
| assert (Sub1, Sub2) == tuple(subs.values()) |