Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dataclass_transform: accept **kwargs, rename field_descriptors #1120

Merged
merged 4 commits into from Apr 16, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions typing_extensions/CHANGELOG
@@ -1,5 +1,8 @@
# Unreleased

- Update `typing_extensions.dataclass_transform` to rename the
`field_descriptors` parameter to `field_specifiers` and accept
arbitrary keyword arguments.
- Add `typing.assert_type`. Backport from bpo-46480.
- Drop support for Python 3.6. Original patch by Adam Turner (@AA-Turner).

Expand Down
18 changes: 13 additions & 5 deletions typing_extensions/src/test_typing_extensions.py
Expand Up @@ -2646,7 +2646,8 @@ class CustomerModel:
"eq_default": True,
"order_default": False,
"kw_only_default": True,
"field_descriptors": (),
"field_specifiers": (),
"kwargs": {},
}
)
self.assertIs(
Expand All @@ -2658,7 +2659,12 @@ def test_base_class(self):
class ModelBase:
def __init_subclass__(cls, *, frozen: bool = False): ...

Decorated = dataclass_transform(eq_default=True, order_default=True)(ModelBase)
Decorated = dataclass_transform(
eq_default=True,
order_default=True,
# Arbitrary unrecognized kwargs are accepted at runtime.
make_everything_awesome=True,
)(ModelBase)

class CustomerModel(Decorated, frozen=True):
id: int
Expand All @@ -2670,7 +2676,8 @@ class CustomerModel(Decorated, frozen=True):
"eq_default": True,
"order_default": True,
"kw_only_default": False,
"field_descriptors": (),
"field_specifiers": (),
"kwargs": {"make_everything_awesome": True},
}
)
self.assertIsSubclass(CustomerModel, Decorated)
Expand All @@ -2685,7 +2692,7 @@ def __new__(
return super().__new__(cls, name, bases, namespace)

Decorated = dataclass_transform(
order_default=True, field_descriptors=(Field,)
order_default=True, field_specifiers=(Field,)
)(ModelMeta)

class ModelBase(metaclass=Decorated): ...
Expand All @@ -2700,7 +2707,8 @@ class CustomerModel(ModelBase, init=False):
"eq_default": True,
"order_default": True,
"kw_only_default": False,
"field_descriptors": (Field,),
"field_specifiers": (Field,),
"kwargs": {},
}
)
self.assertIsInstance(CustomerModel, Decorated)
Expand Down
10 changes: 6 additions & 4 deletions typing_extensions/src/typing_extensions.py
Expand Up @@ -1795,10 +1795,11 @@ def dataclass_transform(
eq_default: bool = True,
order_default: bool = False,
kw_only_default: bool = False,
field_descriptors: typing.Tuple[
field_specifiers: typing.Tuple[
typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]],
...
] = (),
**kwargs: typing.Any,
) -> typing.Callable[[T], T]:
"""Decorator that marks a function, class, or metaclass as providing
dataclass-like behavior.
Expand Down Expand Up @@ -1850,8 +1851,8 @@ class CustomerModel(ModelBase):
assumed to be True or False if it is omitted by the caller.
- ``kw_only_default`` indicates whether the ``kw_only`` parameter is
assumed to be True or False if it is omitted by the caller.
- ``field_descriptors`` specifies a static list of supported classes
or functions, that describe fields, similar to ``dataclasses.field()``.
- ``field_specifiers`` specifies a static list of supported classes
or functions that describe fields, similar to ``dataclasses.field()``.

At runtime, this decorator records its arguments in the
``__dataclass_transform__`` attribute on the decorated object.
Expand All @@ -1864,7 +1865,8 @@ def decorator(cls_or_fn):
"eq_default": eq_default,
"order_default": order_default,
"kw_only_default": kw_only_default,
"field_descriptors": field_descriptors,
"field_specifiers": field_specifiers,
"kwargs": kwargs,
}
return cls_or_fn
return decorator
Expand Down