dataclass-extensions 0.2.6__py3-none-any.whl → 0.2.7__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.
- dataclass_extensions/decode.py +11 -0
- dataclass_extensions/version.py +1 -1
- {dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/METADATA +15 -7
- {dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/RECORD +7 -7
- {dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/WHEEL +0 -0
- {dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/licenses/LICENSE +0 -0
- {dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/top_level.txt +0 -0
dataclass_extensions/decode.py
CHANGED
|
@@ -115,6 +115,17 @@ def _coerce(
|
|
|
115
115
|
except ValueError:
|
|
116
116
|
pass
|
|
117
117
|
|
|
118
|
+
if allowed_type is int:
|
|
119
|
+
if _safe_isinstance(value, (int, float)) and (value_as_int := int(value)) == value:
|
|
120
|
+
return value_as_int
|
|
121
|
+
elif _safe_isinstance(value, str):
|
|
122
|
+
try:
|
|
123
|
+
value_as_float = float(value)
|
|
124
|
+
if (value_as_int := int(value_as_float)) == value_as_float:
|
|
125
|
+
return value_as_int
|
|
126
|
+
except ValueError:
|
|
127
|
+
pass
|
|
128
|
+
|
|
118
129
|
origin = getattr(allowed_type, "__origin__", None)
|
|
119
130
|
args = getattr(allowed_type, "__args__", None)
|
|
120
131
|
if (origin is list or origin is collections.abc.MutableSequence) and _safe_isinstance(
|
dataclass_extensions/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
VERSION = "0.2.
|
|
1
|
+
VERSION = "0.2.7"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataclass-extensions
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: Additional functionality for Python dataclasses
|
|
5
5
|
Author-email: Pete Walsh <epwalsh10@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -263,7 +263,6 @@ assert decode(FruitBasket, encode(basket)) == basket
|
|
|
263
263
|
|
|
264
264
|
You can also define how to encode/decode non-dataclass types:
|
|
265
265
|
|
|
266
|
-
|
|
267
266
|
```python
|
|
268
267
|
from dataclasses import dataclass
|
|
269
268
|
from dataclass_extensions import decode, encode
|
|
@@ -280,11 +279,12 @@ class Bar:
|
|
|
280
279
|
encode.register_encoder(lambda foo: {"x": foo.x}, Foo)
|
|
281
280
|
decode.register_decoder(lambda d: Foo(d["x"]), Foo)
|
|
282
281
|
|
|
283
|
-
|
|
284
|
-
|
|
282
|
+
bar = Bar(foo=Foo(10))
|
|
283
|
+
assert encode(bar) == {"foo": {"x": 10}}
|
|
284
|
+
assert decode(Bar, encode(bar)) == bar
|
|
285
285
|
```
|
|
286
286
|
|
|
287
|
-
###
|
|
287
|
+
### Polymorphism through registrable subclasses
|
|
288
288
|
|
|
289
289
|
```python
|
|
290
290
|
from dataclasses import dataclass
|
|
@@ -307,6 +307,7 @@ class Banana(Fruit):
|
|
|
307
307
|
class Apple(Fruit):
|
|
308
308
|
calories: int = 150
|
|
309
309
|
price: float = 1.50
|
|
310
|
+
variety: str = "Granny Smith"
|
|
310
311
|
|
|
311
312
|
@dataclass
|
|
312
313
|
class FruitBasket:
|
|
@@ -314,7 +315,14 @@ class FruitBasket:
|
|
|
314
315
|
count: int
|
|
315
316
|
|
|
316
317
|
basket = FruitBasket(fruit=Apple(), count=2)
|
|
317
|
-
|
|
318
|
-
|
|
318
|
+
assert encode(basket) == {
|
|
319
|
+
"fruit": {
|
|
320
|
+
"type": "apple", # corresponds to the registered name
|
|
321
|
+
"calories": 150,
|
|
322
|
+
"price": 1.5,
|
|
323
|
+
"variety": "Granny Smith",
|
|
324
|
+
},
|
|
325
|
+
"count": 2,
|
|
326
|
+
}
|
|
319
327
|
assert decode(FruitBasket, encode(basket)) == basket
|
|
320
328
|
```
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
dataclass_extensions/__init__.py,sha256=jpgRh5jjj9jM1tkhTVvB-aDThI2v4tAlq_WpR0-NOSI,255
|
|
2
|
-
dataclass_extensions/decode.py,sha256=
|
|
2
|
+
dataclass_extensions/decode.py,sha256=U23hy4qVcWR1wrXjrhVorsqp7OG1r1ZfEFhO4cANM7A,8159
|
|
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=
|
|
9
|
-
dataclass_extensions-0.2.
|
|
10
|
-
dataclass_extensions-0.2.
|
|
11
|
-
dataclass_extensions-0.2.
|
|
12
|
-
dataclass_extensions-0.2.
|
|
13
|
-
dataclass_extensions-0.2.
|
|
8
|
+
dataclass_extensions/version.py,sha256=ZQLNbaBb3Roa6Z5LEm--iZickCQhYJVSrDpqf4YBbzc,18
|
|
9
|
+
dataclass_extensions-0.2.7.dist-info/licenses/LICENSE,sha256=YvuKOpYh3COIF0yqq-nCMXtpS7mh1GyYvPVlW2j1G-M,11359
|
|
10
|
+
dataclass_extensions-0.2.7.dist-info/METADATA,sha256=p7mMDdiaL_eT0yZDbMKLS9dh47Gj4rspEnw8tvXvdu0,15925
|
|
11
|
+
dataclass_extensions-0.2.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
12
|
+
dataclass_extensions-0.2.7.dist-info/top_level.txt,sha256=njfdeqLtTThNGwqnoKu4JV8J1287xGAeEwyESpoU-k8,21
|
|
13
|
+
dataclass_extensions-0.2.7.dist-info/RECORD,,
|
|
File without changes
|
{dataclass_extensions-0.2.6.dist-info → dataclass_extensions-0.2.7.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|