Skip to content

Commit 093428e

Browse files
committed
feat: update pydantic version
fix: change conlist to Set fix missing required field for JsonApi object fix not required fields
1 parent be405b5 commit 093428e

10 files changed

+89
-82
lines changed

jsonapi_pydantic/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from jsonapi_pydantic import constants, v1_0
22

3-
__version__ = "0.1.5"
3+
__version__ = "0.2.0"
44

55
__all__ = ["constants", "v1_0"]

jsonapi_pydantic/v1_0/error.py

+13-19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from typing import Any, Optional, Union
22

3-
from pydantic import AnyUrl, BaseModel, Field
3+
from pydantic.fields import Field
4+
from pydantic.main import BaseModel
5+
from pydantic.networks import AnyUrl
46

57
from jsonapi_pydantic.v1_0.links import Link
68
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
@@ -15,27 +17,19 @@ class ErrorLinks(BaseModel):
1517

1618

1719
class Source(BaseModel):
18-
pointer: Pointer = Field(title="Pointer")
19-
parameter: Parameter = Field(title="Parameter")
20-
21-
22-
Id = Optional[Any]
23-
Status = Optional[str]
24-
Code = Optional[str]
25-
Title = Optional[str]
26-
Detail = Optional[str]
27-
Meta = Optional[MetaObject]
20+
pointer: Pointer = Field(None, title="Pointer")
21+
parameter: Parameter = Field(None, title="Parameter")
2822

2923

3024
class Error(BaseModel):
31-
id: Id = Field(title="Id")
32-
links: Optional[ErrorLinks] = Field(title="Links")
33-
status: Status = Field(title="Status")
34-
code: Code = Field(title="Code")
35-
title: Title = Field(title="Title")
36-
detail: Detail = Field(title="Detail")
37-
source: Optional[Source] = Field(title="Source")
38-
meta: Meta = Field(title="Meta")
25+
id: Optional[Any] = Field(None, title="Id")
26+
links: Optional[ErrorLinks] = Field(None, title="Links")
27+
status: Optional[Union[str, int]] = Field(None, title="Status")
28+
code: Optional[str] = Field(None, title="Code")
29+
title: Optional[str] = Field(None, title="Title")
30+
detail: Optional[str] = Field(None, title="Detail")
31+
source: Optional[Source] = Field(None, title="Source")
32+
meta: Optional[MetaObject] = Field(None, title="Meta")
3933

4034

4135
__all__ = ["ErrorLinks", "Source", "Error"]

jsonapi_pydantic/v1_0/jsonapi.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

3-
from pydantic import BaseModel, Field
3+
from pydantic.fields import Field
4+
from pydantic.main import BaseModel
45

56
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
67

@@ -9,8 +10,8 @@
910

1011

1112
class JsonApi(BaseModel):
12-
version: Version = Field(title="Version")
13-
meta: Meta = Field(title="Meta")
13+
version: Version = Field(None, title="Version")
14+
meta: Meta = Field(None, title="Meta")
1415

1516

1617
__all__ = ["JsonApi"]

jsonapi_pydantic/v1_0/links.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from typing import Dict, Optional, Union
22

3-
from pydantic import AnyUrl, BaseModel, Field, root_validator
3+
from pydantic.fields import Field
4+
from pydantic.functional_validators import model_validator
5+
from pydantic.main import BaseModel
6+
from pydantic.networks import AnyUrl
47

58
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
69

@@ -9,15 +12,15 @@
912

1013

1114
class Link(BaseModel):
12-
href: Href = Field(title="Href")
13-
meta: Meta = Field(title="Meta")
15+
href: Href = Field(None, title="Href")
16+
meta: Meta = Field(None, title="Meta")
1417

15-
@root_validator
16-
def check_all_values(cls, values: dict) -> dict:
18+
@model_validator(mode="before")
19+
def check_all_values(cls, data: dict) -> dict:
1720
# More about these restrictions: https://jsonapi.org/format/#document-links
18-
if len(values) < 1:
21+
if len(data) < 1:
1922
raise ValueError("A link object can contain the following members: href, meta.")
20-
return values
23+
return data
2124

2225

2326
Links = Dict[str, Union[AnyUrl, Link, None]]
+12-12
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
1-
from typing import Optional, Union
1+
from typing import Optional, Set, Union
22

3-
from pydantic import BaseModel, Field, conlist, root_validator
3+
from pydantic.fields import Field
4+
from pydantic.functional_validators import model_validator
5+
from pydantic.main import BaseModel
46

57
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
68
from jsonapi_pydantic.v1_0.resource.relationship_links import RelationshipLinks
79
from jsonapi_pydantic.v1_0.resource_identifier import ResourceIdentifier
810

911
Links = Optional[RelationshipLinks]
10-
ResourceLinkage = Union[
11-
None, ResourceIdentifier, conlist(ResourceIdentifier, min_items=0, unique_items=True)
12-
]
12+
ResourceLinkage = Union[None, ResourceIdentifier, Set[ResourceIdentifier]]
1313
Meta = Optional[MetaObject]
1414

1515

1616
class Relationship(BaseModel):
17-
links: Links = Field(title="Links")
18-
data: ResourceLinkage = Field(title="Resource linkage")
19-
meta: Meta = Field(title="Meta")
17+
links: Links = Field(None, title="Links")
18+
data: ResourceLinkage = Field(None, title="Resource linkage")
19+
meta: Meta = Field(None, title="Meta")
2020

21-
@root_validator
22-
def check_all_values(cls, values: dict) -> dict:
21+
@model_validator(mode="before")
22+
def check_all_values(cls, data: dict) -> dict:
2323
# More about these restrictions: https://jsonapi.org/format/#document-resource-object-relationships
24-
if len(values) < 1:
24+
if len(data) < 1:
2525
raise ValueError(
2626
"A relationship object MUST contain at least one of the following: links, data, meta."
2727
)
28-
return values
28+
return data
2929

3030

3131
__all__ = ["Relationship"]
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from typing import Union
22

3-
from pydantic import AnyUrl, BaseModel, Field, root_validator
3+
from pydantic.fields import Field
4+
from pydantic.functional_validators import model_validator
5+
from pydantic.main import BaseModel
6+
from pydantic.networks import AnyUrl
47

58
from jsonapi_pydantic.v1_0.links import Link
69

@@ -9,17 +12,17 @@
912

1013

1114
class RelationshipLinks(BaseModel):
12-
self: RelationshipLink = Field(title="Relationship link")
13-
related: RelatedResourceLink = Field(title="Related resource link")
15+
self: RelationshipLink = Field(None, title="Relationship link")
16+
related: RelatedResourceLink = Field(None, title="Related resource link")
1417

15-
@root_validator
16-
def check_all_values(cls, values: dict) -> dict:
18+
@model_validator(mode="before")
19+
def check_all_values(cls, data: dict) -> dict:
1720
# More about these restrictions: https://jsonapi.org/format/#document-resource-object-relationships
18-
if len(values) < 1:
21+
if len(data) < 1:
1922
raise ValueError(
2023
"A links object for a relationship that contains at least one of the following: self, related."
2124
)
22-
return values
25+
return data
2326

2427

2528
__all__ = ["RelationshipLinks"]

jsonapi_pydantic/v1_0/resource/resource.py

+14-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from typing import Any, Dict, Optional
22

3-
from pydantic import BaseModel, Field, root_validator
3+
from pydantic.fields import Field
4+
from pydantic.functional_validators import model_validator
5+
from pydantic.main import BaseModel
46

57
from jsonapi_pydantic.v1_0.links import Links as LinksObject
68
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
@@ -15,17 +17,17 @@
1517

1618
class Resource(BaseModel):
1719
type: str = Field(title="Type")
18-
id: Id = Field(title="Id")
19-
attributes: Attributes = Field(title="Attributes")
20-
relationships: Relationships = Field(title="Relationships")
21-
links: Links = Field(title="Links")
22-
meta: Meta = Field(title="Meta")
23-
24-
@root_validator
25-
def check_all_values(cls, values: dict) -> dict:
26-
attributes, relationships = values.get("attributes"), values.get("relationships")
20+
id: Id = Field(None, title="Id")
21+
attributes: Attributes = Field(None, title="Attributes")
22+
relationships: Relationships = Field(None, title="Relationships")
23+
links: Links = Field(None, title="Links")
24+
meta: Meta = Field(None, title="Meta")
25+
26+
@model_validator(mode="before")
27+
def check_all_values(cls, data: dict) -> dict:
28+
attributes, relationships = data.get("attributes"), data.get("relationships")
2729
if not attributes and not relationships:
28-
return values
30+
return data
2931

3032
# More about these restrictions: https://jsonapi.org/format/#document-resource-object-fields
3133
try:
@@ -47,7 +49,7 @@ def check_all_values(cls, values: dict) -> dict:
4749
f"A resource can not have an attribute and relationship with the same name. Name: {key}."
4850
)
4951

50-
return values
52+
return data
5153

5254

5355
__all__ = ["Resource"]
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

3-
from pydantic import BaseModel, Field
3+
from pydantic.fields import Field
4+
from pydantic.main import BaseModel
45

56
from jsonapi_pydantic.v1_0.meta import Meta as MetaObject
67

@@ -10,7 +11,7 @@
1011
class ResourceIdentifier(BaseModel):
1112
id: str = Field(title="Id")
1213
type: str = Field(title="Type")
13-
meta: Meta = Field(title="Meta")
14+
meta: Meta = Field(None, title="Meta")
1415

1516

1617
__all__ = ["ResourceIdentifier"]

jsonapi_pydantic/v1_0/toplevel.py

+19-17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from typing import List, Optional, Union
1+
from typing import List, Optional, Set, Union
22

3-
from pydantic import BaseModel, Field, conlist, root_validator
3+
from pydantic.fields import Field
4+
from pydantic.functional_validators import model_validator
5+
from pydantic.main import BaseModel
46

57
from jsonapi_pydantic.v1_0.error import Error
68
from jsonapi_pydantic.v1_0.jsonapi import JsonApi as JsonApiObject
@@ -13,40 +15,40 @@
1315
None,
1416
Resource,
1517
ResourceIdentifier,
16-
conlist(Resource, min_items=0, unique_items=True),
17-
conlist(ResourceIdentifier, min_items=0, unique_items=True),
18+
Set[Resource],
19+
Set[ResourceIdentifier],
1820
]
1921
Errors = Optional[List[Error]]
2022
Meta = Optional[MetaObject]
2123

2224
JsonApi = Optional[JsonApiObject]
2325
Links = Optional[LinksObject]
24-
Included = Optional[conlist(Resource, min_items=0, unique_items=True)]
26+
Included = Optional[Set[Resource]]
2527

2628

2729
class TopLevel(BaseModel):
28-
data: Data = Field(title="Data")
29-
errors: Errors = Field(title="Errors")
30-
meta: Meta = Field(title="Meta")
30+
data: Data = Field(None, title="Data")
31+
errors: Errors = Field(None, title="Errors")
32+
meta: Meta = Field(None, title="Meta")
3133

32-
jsonapi: JsonApi = Field(title="JSON:API")
33-
links: Links = Field(title="Links")
34-
included: Included = Field(title="Included")
34+
jsonapi: JsonApi = Field(None, title="JSON:API")
35+
links: Links = Field(None, title="Links")
36+
included: Included = Field(None, title="Included")
3537

36-
@root_validator
37-
def check_all_values(cls, values: dict) -> dict:
38+
@model_validator(mode="before")
39+
def check_all_values(cls, data: dict) -> dict:
3840
# More about these restrictions: https://jsonapi.org/format/#document-top-level
39-
if values.get("data") and values.get("errors"):
41+
if data.get("data") and data.get("errors"):
4042
raise ValueError("The members data and errors MUST NOT coexist in the same document.")
41-
if values.get("included") and not values.get("data"):
43+
if data.get("included") and not data.get("data"):
4244
raise ValueError(
4345
"If a document does not contain a top-level data key, the included member MUST NOT be present either."
4446
)
45-
if not values.get("data") and not values.get("errors") and not values.get("meta"):
47+
if not data.get("data") and not data.get("errors") and not data.get("meta"):
4648
raise ValueError(
4749
"A document MUST contain at least one of the following top-level members: data, errors, meta."
4850
)
49-
return values
51+
return data
5052

5153

5254
__all__ = ["TopLevel"]

pyproject.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "jsonapi-pydantic"
3-
version = "0.1.5"
3+
version = "0.2.0"
44
description = "JSON:API implementation with pydantic."
55

66
authors = ["impocode <[email protected]>"]
@@ -16,6 +16,7 @@ classifiers = [
1616
"Programming Language :: Python :: 3.8",
1717
"Programming Language :: Python :: 3.9",
1818
"Programming Language :: Python :: 3.10",
19+
"Programming Language :: Python :: 3.11",
1920
"Typing :: Typed",
2021
]
2122

@@ -25,7 +26,7 @@ documentation = "https://github.com/impocode/jsonapi-pydantic"
2526

2627
[tool.poetry.dependencies]
2728
python = "^3.7"
28-
pydantic = "^1.10.2"
29+
pydantic = "^2.1.1"
2930

3031
[tool.poetry.urls]
3132
"Bug Tracker" = "https://github.com/impocode/jsonapi-pydantic/issues"

0 commit comments

Comments
 (0)