dataclass-extensions 0.2.4__py3-none-any.whl → 0.2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -90,7 +90,7 @@ def _coerce(
90
90
  if _safe_issubclass(allowed_type, Enum):
91
91
  try:
92
92
  return allowed_type(value)
93
- except TypeError:
93
+ except (TypeError, ValueError):
94
94
  pass
95
95
 
96
96
  # e.g. typing.NamedTuple
@@ -1 +1 @@
1
- VERSION = "0.2.4"
1
+ VERSION = "0.2.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataclass-extensions
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Additional functionality for Python dataclasses
5
5
  Author-email: Pete Walsh <epwalsh10@gmail.com>
6
6
  License: Apache License
@@ -231,6 +231,8 @@ Additional functionality for Python dataclasses
231
231
 
232
232
  ## Installation
233
233
 
234
+ Python 3.10 or newer is required. You can install the package from PyPI:
235
+
234
236
  ```fish
235
237
  pip install dataclass-extensions
236
238
  ```
@@ -249,18 +251,39 @@ class Fruit:
249
251
  calories: int
250
252
  price: float
251
253
 
252
-
253
254
  @dataclass
254
255
  class FruitBasket:
255
256
  fruit: Fruit
256
257
  count: int
257
258
 
258
-
259
259
  basket = FruitBasket(fruit=Fruit(calories=200, price=1.0), count=2)
260
260
  assert encode(basket) == {"fruit": {"calories": 200, "price": 1.0}, "count": 2}
261
261
  assert decode(FruitBasket, encode(basket)) == basket
262
262
  ```
263
263
 
264
+ You can also define how to encode/decode non-dataclass types:
265
+
266
+
267
+ ```python
268
+ from dataclasses import dataclass
269
+ from dataclass_extensions import decode, encode
270
+
271
+
272
+ class Foo:
273
+ def __init__(self, x: int):
274
+ self.x = x
275
+
276
+ @dataclass
277
+ class Bar:
278
+ foo: Foo
279
+
280
+ encode.register_encoder(lambda foo: {"x": foo.x}, Foo)
281
+ decode.register_decoder(lambda d: Foo(d["x"]), Foo)
282
+
283
+ encode(Bar(foo=Foo(10))) # {'foo': {'x': 10}}
284
+ decode(Bar, {"foo": {"x": 10}})
285
+ ```
286
+
264
287
  ### Registrable subclasses
265
288
 
266
289
  ```python
@@ -273,28 +296,25 @@ class Fruit(Registrable):
273
296
  calories: int
274
297
  price: float
275
298
 
276
-
277
299
  @Fruit.register("banana")
278
300
  @dataclass
279
301
  class Banana(Fruit):
280
302
  calories: int = 200
281
303
  price: float = 1.25
282
304
 
283
-
284
305
  @Fruit.register("apple")
285
306
  @dataclass
286
307
  class Apple(Fruit):
287
308
  calories: int = 150
288
309
  price: float = 1.50
289
310
 
290
-
291
311
  @dataclass
292
312
  class FruitBasket:
293
313
  fruit: Fruit
294
314
  count: int
295
315
 
296
-
297
316
  basket = FruitBasket(fruit=Apple(), count=2)
317
+ # note the additional "type" field, which corresponds to the registered name of the subclass
298
318
  assert encode(basket) == {"fruit": {"calories": 150, "price": 1.5, "type": "apple"}, "count": 2}
299
319
  assert decode(FruitBasket, encode(basket)) == basket
300
320
  ```
@@ -1,13 +1,13 @@
1
1
  dataclass_extensions/__init__.py,sha256=jpgRh5jjj9jM1tkhTVvB-aDThI2v4tAlq_WpR0-NOSI,255
2
- dataclass_extensions/decode.py,sha256=KfHL261Lfpx8_aWEeGDrR-3jjsN7iRSUAql7aHdzIJA,7451
2
+ dataclass_extensions/decode.py,sha256=mfCmE8U8s40xRKE4Nd4MhlL1dwpcrcKSUbWaFqw9NrA,7465
3
3
  dataclass_extensions/encode.py,sha256=7mLHmZrHThQMbC0wY5voHx3mOHgsRbq59kw_JdwgOOg,3324
4
4
  dataclass_extensions/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  dataclass_extensions/registrable.py,sha256=TWdJ0vLkOTsw5Zm8uOk7Ueh6ZODn-q_2jht1uWRkpzE,4608
6
6
  dataclass_extensions/types.py,sha256=UwSV0MKjFDaK4dlgm72vJHHr6-8QNe8jMhbTZGOMIJM,247
7
7
  dataclass_extensions/utils.py,sha256=8cigzY9JDEWexWXlcMxXyf27S50-1ZPMNmn4zUSrc6k,935
8
- dataclass_extensions/version.py,sha256=aW1vyQzVgJryQ8zUgs1wjZtK8gdLvOuZsB4IHQKPPN8,18
9
- dataclass_extensions-0.2.4.dist-info/licenses/LICENSE,sha256=YvuKOpYh3COIF0yqq-nCMXtpS7mh1GyYvPVlW2j1G-M,11359
10
- dataclass_extensions-0.2.4.dist-info/METADATA,sha256=4zE_weYoYVzsGLPgT2Mmn82tBXBGLPN25JAYQSzM05I,15215
11
- dataclass_extensions-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
12
- dataclass_extensions-0.2.4.dist-info/top_level.txt,sha256=njfdeqLtTThNGwqnoKu4JV8J1287xGAeEwyESpoU-k8,21
13
- dataclass_extensions-0.2.4.dist-info/RECORD,,
8
+ dataclass_extensions/version.py,sha256=sIh4VI6K8WvZPswkYvGqS-J8LeZb01HJ4SVcHLlcPMs,18
9
+ dataclass_extensions-0.2.5.dist-info/licenses/LICENSE,sha256=YvuKOpYh3COIF0yqq-nCMXtpS7mh1GyYvPVlW2j1G-M,11359
10
+ dataclass_extensions-0.2.5.dist-info/METADATA,sha256=EWYw300Hyd_2w-l-7pc_BIqmOCVrwn-nz8q4GjhgG5Q,15825
11
+ dataclass_extensions-0.2.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
12
+ dataclass_extensions-0.2.5.dist-info/top_level.txt,sha256=njfdeqLtTThNGwqnoKu4JV8J1287xGAeEwyESpoU-k8,21
13
+ dataclass_extensions-0.2.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5