Skip to content

Commit 60567ab

Browse files
committed
fix: Add dataclass decorator for all example code
@serde decorator works without @DataClass decorator but there is no way to prevent mypy from producing type error. Adding @DataClass decorator back to the all the example code. Find related mypy page https://mypy.readthedocs.io/en/stable/additional_features.html#caveats-known-issues
1 parent 6f973a8 commit 60567ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+147
-10
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Declare a class with pyserde's `@serde` decorator.
1515

1616
```python
1717
@serde
18+
@dataclass
1819
class Foo:
1920
i: int
2021
s: str

Diff for: docs/features/attributes.md

+2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ Field attributes are options to customize (de)serialization behaviour specific t
1515
You can specify field attributes as keyword argument in `serde.field`. See [serde.core.Field](https://yukinarit.github.io/pyserde/api/serde/core.html#Field) for available field attributes. This is recommended way since pyserde v0.6. Use `dataclasses.field` below if you are using pyserde < v0.6.
1616

1717
```python
18+
from dataclasses import dataclass
1819
from serde import field, serde
1920

2021
@serde
22+
@dataclass
2123
class Foo:
2224
class_name: str = field(rename='class')
2325
```

Diff for: docs/features/case-conversion.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Converting `snake_case` fields into supported case styles e.g. `camelCase` and `
44

55
```python
66
@serde(rename_all = 'camelcase')
7+
@dataclass
78
class Foo:
89
int_field: int
910
str_field: str

Diff for: docs/features/conditional-skip.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ If you conditionally skip some fields, you can pass function or lambda in `skip_
66

77
```python
88
@serde
9+
@dataclass
910
class World:
1011
player: str
1112
buddy: str = field(default='', skip_if=lambda v: v == 'Pikachu')

Diff for: docs/features/custom-class-serializer.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def deserializer(cls, o):
1616
raise SerdeSkip()
1717

1818
@serde(serializer=serializer, deserializer=deserializer)
19+
@dataclass
1920
class Foo:
2021
i: int
2122
dt1: datetime

Diff for: docs/features/custom-field-serializer.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
If you want to provide a custom function to override the default (de)serialization behaviour of a field, you can pass your functions to `serializer` and `deserializer` in `serde.field`.
44

55
```python
6+
from dataclasses import dataclass
67
from serde import serde, field
78

89
@serde
10+
@dataclass
911
class Foo:
1012
dt1: datetime
1113
dt2: datetime = field(
1214
serializer=lambda x: x.strftime('%d/%m/%y'), deserializer=lambda x: datetime.strptime(x, '%d/%m/%y')
1315
)
1416
```
15-
`dt1` in the example will serialized into `2021-01-01T00:00:00` because the pyserde's default (de)serializier for datetime is ISO 8601. `dt2` field in the example will be serialized into `01/01/21` by the custom field serializer.
17+
`dt1` in the example will serialized into `2021-01-01T00:00:00` because the pyserde's default (de)serializer for datetime is ISO 8601. `dt2` field in the example will be serialized into `01/01/21` by the custom field serializer.
1618

1719
For complete example, please see [examples/custom_field_serializer.py](https://github.com/yukinarit/pyserde/blob/master/examples/custom_field_serializer.py)

Diff for: docs/features/decorators.md

+12-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@serde is a shortcut of @serialize and @deserialize decorators. This code
66
```python
77
@serde
8+
@dataclass
89
class Foo:
910
...
1011
```
@@ -14,6 +15,7 @@ is equivalent to the following code.
1415
```python
1516
@deserialize
1617
@serialize
18+
@dataclass
1719
class Foo:
1820
...
1921
```
@@ -26,18 +28,21 @@ class Foo:
2628

2729
```python
2830
@serde(serializer=serializer, deserializer=deserializer)
31+
@dataclass
2932
class Foo:
3033
...
3134
```
3235

33-
* If you want to have extra attributes to the dataclass decorator, you can have both `@dataclass` and `@serde` decorators
36+
> **Note:** `@serde` actually works without @dataclass decorator, because it detects and add @dataclass to the declared class automatically. However, mypy will produce `Too many arguments` or `Unexpected keyword argument` error. This is due to the current mypy limitation. See the following documentation for more information.
37+
https://mypy.readthedocs.io/en/stable/additional_features.html#caveats-known-issues
38+
>
39+
>
40+
> ```python
41+
> @serde
42+
> class Foo:
43+
> ...
44+
> ```
3445
35-
```python
36-
@serde
37-
@dataclass(unsafe_hash=True)
38-
class Foo:
39-
...
40-
```
4146
4247
## `@serialize`/`@deserialize`
4348

Diff for: docs/features/flatten.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ You can flatten the fields of the nested structure.
44

55
```python
66
@serde
7+
@dataclass
78
class Bar:
89
c: float
910
d: bool
1011

1112
@serde
13+
@dataclass
1214
class Foo:
1315
a: int
1416
b: str

Diff for: docs/features/forward-reference.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
You can use a forward reference in annotations.
44

55
```python
6+
@dataclass
67
class Foo:
78
i: int
89
s: str
910
bar: 'Bar' # Specify type annotation in string.
1011

1112
@serde
13+
@dataclass
1214
class Bar:
1315
f: float
1416
b: bool

Diff for: docs/features/postponed-evaluation-of-type-annotation.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
```python
66
from __future__ import annotations
77
from serde import serde
8+
from dataclasses import dataclass
89

910
@serde
11+
@dataclass
1012
class Foo:
1113
i: int
1214
s: str

Diff for: docs/features/python3.9-type-hinting.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ For python >= 3.9, you can use [PEP585](https://www.python.org/dev/peps/pep-0585
44

55
```python
66
@serde
7+
@dataclass
78
class Foo:
89
i: int
910
l: list[str]

Diff for: docs/features/rename.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ In case you want to use a keyword as field such as `class`, you can use `serde_r
44

55
```python
66
@serde
7+
@dataclass
78
class Foo:
89
class_name: str = field(metadata={'serde_rename': 'class'})
910

Diff for: docs/features/skip.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ You can skip serialization for a certain field, you can use `serde_skip`.
44

55
```python
66
@serde
7+
@dataclass
78
class Resource:
89
name: str
910
hash: str

Diff for: docs/features/union-operator.md

+4
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,25 @@
33
For python >= 3.10, you can use [PEP604](https://www.python.org/dev/peps/pep-0604/) Union operator `X | Y`.
44

55
```python
6+
from dataclasses import dataclass
67
from serde import serde
78
from serde.json import from_json, to_json
89

910

1011
@serde
12+
@dataclass
1113
class Bar:
1214
v: int
1315

1416

1517
@serde
18+
@dataclass
1619
class Baz:
1720
v: float
1821

1922

2023
@serde
24+
@dataclass
2125
class Foo:
2226
a: int | str
2327
b: dict[str, int] | list[int]

Diff for: docs/features/union.md

+7
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ This is the default Union representation for pyserde<0.7. Given these dataclasse
88

99
```python
1010
@serde
11+
@dataclass
1112
class Bar:
1213
b: int
1314

1415
@serde
16+
@dataclass
1517
class Baz:
1618
b: int
1719

1820
@serde(tagging=Untagged)
21+
@dataclass
1922
class Foo:
2023
a: Union[Bar, Baz]
2124
```
@@ -28,6 +31,7 @@ This is the default Union representation since 0.7. A class declaration with `Ex
2831

2932
```
3033
@serde(tagging=ExternalTagging)
34+
@dataclass
3135
class Foo:
3236
a: Union[Bar, Baz]
3337
```
@@ -36,6 +40,7 @@ class Foo:
3640
>
3741
> ```python
3842
> @serde(tagging=ExternalTagging)
43+
> @dataclass
3944
> class Foo:
4045
> a: Union[List[int], Set[int]]
4146
> ```
@@ -46,6 +51,7 @@ A class declaration with `InternalTagging` looks like below. If you serialize `F
4651
4752
```python
4853
@serde(tagging=InternalTagging("type"))
54+
@dataclass
4955
class Foo:
5056
a: Union[Bar, Baz]
5157
```
@@ -56,6 +62,7 @@ A class declaration with `AdjacentTagging` looks like below. If you serialize `F
5662

5763
```python
5864
@serde(tagging=AdjacentTagging("type", "content"))
65+
@dataclass
5966
class Foo:
6067
a: Union[Bar, Baz]
6168
```

Diff for: docs/getting-started.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ Or all at once:
1818
pip install "pyserde[all]"
1919
```
2020

21-
Define your class with pyserde's `@serialize` and `@deserialize` decorators. Be careful that module name is `serde`, not `pyserde`. `pyserde` depends on `dataclasses` module. If you are new to dataclass, I would recommend to read [dataclasses documentation](https://docs.python.org/3/library/dataclasses.html) first.
21+
Define your class with pyserde's `@serde` decorators. Be careful that module name is `serde`, not `pyserde`. `pyserde` depends on `dataclasses` module. If you are new to dataclass, I would recommend to read [dataclasses documentation](https://docs.python.org/3/library/dataclasses.html) first.
2222

2323
```python
24+
from dataclasses import dataclass
2425
from serde import serde
2526

2627
@serde
28+
@dataclass
2729
class Foo:
2830
i: int
2931
s: str
@@ -37,9 +39,11 @@ pyserde generates methods necessary for (de)serialization by `@serde` when a cla
3739
>
3840
> e.g. If you don't need deserialization functionality, you can add `@serialize` decorator only. But, calling deserialize API e.g. `from_json` for `Foo` will raise an error.
3941
> ```python
42+
> from dataclasses import dataclass
4043
> from serde import serialize
4144
>
4245
> @serialize
46+
> @dataclass
4347
> class Foo:
4448
> i: int
4549
> s: str

Diff for: docs/supported-data-formats.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Currently `dict, `tuple`, `JSON`, `Yaml`, `Toml` and `MsgPack` are supported.
55
```python
66

77
@serde
8+
@dataclass
89
class Foo:
910
i: int
1011
s: str

Diff for: docs/supported-types.md

+2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
You can write pretty complex class like this:
2020
```python
2121
@serde
22+
@dataclass
2223
class bar:
2324
i: int
2425

2526
@serde
27+
@dataclass
2628
class Foo:
2729
i: int
2830
l: List[str]

Diff for: examples/any.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
from dataclasses import dataclass
12
from typing import Any
23

34
from serde import serde
45
from serde.json import from_json, to_json
56

67

78
@serde
9+
@dataclass
810
class Bar:
911
v: float
1012

1113

1214
@serde
15+
@dataclass
1316
class Foo:
1417
a: Any
1518
b: Any

Diff for: examples/collection.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import sys
2+
from dataclasses import dataclass
23
from typing import Dict, List, Tuple
34

45
from serde import serde
@@ -8,6 +9,7 @@
89

910

1011
@serde
12+
@dataclass
1113
class Foo:
1214
l: List[str]
1315
t: Tuple[str, bool]
@@ -19,6 +21,7 @@ class Foo:
1921
if PY39:
2022

2123
@serde
24+
@dataclass
2225
class FooPy39:
2326
l: list[str]
2427
t: tuple[str, bool]

Diff for: examples/custom_class_serializer.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from dataclasses import dataclass
12
from datetime import datetime
23

34
from serde import SerdeSkip, default_deserializer, default_serializer, field, serde
@@ -28,6 +29,7 @@ def deserializer(cls, o):
2829

2930

3031
@serde(serializer=serializer, deserializer=deserializer)
32+
@dataclass
3133
class Foo:
3234
i: int
3335
dt1: datetime

Diff for: examples/custom_field_serializer.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
from dataclasses import dataclass
12
from datetime import datetime
23

34
from serde import field, serde
45
from serde.json import from_json, to_json
56

67

78
@serde
9+
@dataclass
810
class Foo:
911
dt1: datetime
1012
dt2: datetime = field(

Diff for: examples/default.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
from dataclasses import field
12
from typing import Dict
23

3-
from serde import field, serde
4+
from serde import serde
45
from serde.json import from_json, to_json
56

67

Diff for: examples/enum34.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import enum
2+
from dataclasses import dataclass
23

34
import imported
45

@@ -24,6 +25,7 @@ class IE(enum.IntEnum):
2425

2526

2627
@serde
28+
@dataclass
2729
class Foo:
2830
v0: IE
2931
v1: IE = IE.V1 # Default enum value.

0 commit comments

Comments
 (0)