|
22 | 22 | from typing_extensions import TypeAlias, ParamSpec, Concatenate, ParamSpecArgs, ParamSpecKwargs, TypeGuard |
23 | 23 | from typing_extensions import Awaitable, AsyncIterator, AsyncContextManager, Required, NotRequired |
24 | 24 | from typing_extensions import Protocol, runtime, runtime_checkable, Annotated, overload, final, is_typeddict |
| 25 | +from typing_extensions import dataclass_transform |
25 | 26 | try: |
26 | 27 | from typing_extensions import get_type_hints |
27 | 28 | except ImportError: |
@@ -2345,6 +2346,83 @@ def cached(self): ... |
2345 | 2346 | self.assertIs(True, Methods.cached.__final__) |
2346 | 2347 |
|
2347 | 2348 |
|
| 2349 | +class DataclassTransformTests(BaseTestCase): |
| 2350 | + def test_decorator(self): |
| 2351 | + def create_model(*, frozen: bool = False, kw_only: bool = True): |
| 2352 | + return lambda cls: cls |
| 2353 | + |
| 2354 | + decorated = dataclass_transform(kw_only_default=True, order_default=False)(create_model) |
| 2355 | + |
| 2356 | + class CustomerModel: |
| 2357 | + id: int |
| 2358 | + |
| 2359 | + self.assertIs(decorated, create_model) |
| 2360 | + self.assertEqual( |
| 2361 | + decorated.__dataclass_transform__, |
| 2362 | + { |
| 2363 | + "eq_default": True, |
| 2364 | + "order_default": False, |
| 2365 | + "kw_only_default": True, |
| 2366 | + "field_descriptors": (), |
| 2367 | + } |
| 2368 | + ) |
| 2369 | + self.assertIs( |
| 2370 | + decorated(frozen=True, kw_only=False)(CustomerModel), |
| 2371 | + CustomerModel |
| 2372 | + ) |
| 2373 | + |
| 2374 | + def test_base_class(self): |
| 2375 | + class ModelBase: |
| 2376 | + def __init_subclass__(cls, *, frozen: bool = False): ... |
| 2377 | + |
| 2378 | + Decorated = dataclass_transform(eq_default=True, order_default=True)(ModelBase) |
| 2379 | + |
| 2380 | + class CustomerModel(Decorated, frozen=True): |
| 2381 | + id: int |
| 2382 | + |
| 2383 | + self.assertIs(Decorated, ModelBase) |
| 2384 | + self.assertEqual( |
| 2385 | + Decorated.__dataclass_transform__, |
| 2386 | + { |
| 2387 | + "eq_default": True, |
| 2388 | + "order_default": True, |
| 2389 | + "kw_only_default": False, |
| 2390 | + "field_descriptors": (), |
| 2391 | + } |
| 2392 | + ) |
| 2393 | + self.assertIsSubclass(CustomerModel, Decorated) |
| 2394 | + |
| 2395 | + def test_metaclass(self): |
| 2396 | + class Field: ... |
| 2397 | + |
| 2398 | + class ModelMeta(type): |
| 2399 | + def __new__( |
| 2400 | + cls, name, bases, namespace, *, init: bool = True, |
| 2401 | + ): |
| 2402 | + return super().__new__(cls, name, bases, namespace) |
| 2403 | + |
| 2404 | + Decorated = dataclass_transform( |
| 2405 | + order_default=True, field_descriptors=(Field,) |
| 2406 | + )(ModelMeta) |
| 2407 | + |
| 2408 | + class ModelBase(metaclass=Decorated): ... |
| 2409 | + |
| 2410 | + class CustomerModel(ModelBase, init=False): |
| 2411 | + id: int |
| 2412 | + |
| 2413 | + self.assertIs(Decorated, ModelMeta) |
| 2414 | + self.assertEqual( |
| 2415 | + Decorated.__dataclass_transform__, |
| 2416 | + { |
| 2417 | + "eq_default": True, |
| 2418 | + "order_default": True, |
| 2419 | + "kw_only_default": False, |
| 2420 | + "field_descriptors": (Field,), |
| 2421 | + } |
| 2422 | + ) |
| 2423 | + self.assertIsInstance(CustomerModel, Decorated) |
| 2424 | + |
| 2425 | + |
2348 | 2426 | class AllTests(BaseTestCase): |
2349 | 2427 |
|
2350 | 2428 | def test_typing_extensions_includes_standard(self): |
|
0 commit comments