Skip to content

Commit f1f2dac

Browse files
authored
support JSON schema generation (#451)
1 parent 92002a3 commit f1f2dac

File tree

2 files changed

+43
-26
lines changed

2 files changed

+43
-26
lines changed

upath/core.py

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,38 +1387,50 @@ def __get_pydantic_core_schema__(
13871387
) -> CoreSchema:
13881388
from pydantic_core import core_schema
13891389

1390-
deserialization_schema = core_schema.chain_schema(
1390+
str_schema = core_schema.chain_schema(
13911391
[
1392+
core_schema.str_schema(),
13921393
core_schema.no_info_plain_validator_function(
1393-
lambda v: {"path": v} if isinstance(v, str) else v,
1394+
lambda path: {
1395+
"path": path,
1396+
"protocol": None,
1397+
"storage_options": {},
1398+
},
13941399
),
1395-
core_schema.typed_dict_schema(
1396-
{
1397-
"path": core_schema.typed_dict_field(
1398-
core_schema.str_schema(), required=True
1399-
),
1400-
"protocol": core_schema.typed_dict_field(
1401-
core_schema.with_default_schema(
1402-
core_schema.nullable_schema(
1403-
core_schema.str_schema(),
1404-
),
1405-
default=None,
1406-
),
1407-
required=False,
1400+
]
1401+
)
1402+
1403+
object_schema = core_schema.typed_dict_schema(
1404+
{
1405+
"path": core_schema.typed_dict_field(
1406+
core_schema.str_schema(), required=True
1407+
),
1408+
"protocol": core_schema.typed_dict_field(
1409+
core_schema.with_default_schema(
1410+
core_schema.nullable_schema(
1411+
core_schema.str_schema(),
14081412
),
1409-
"storage_options": core_schema.typed_dict_field(
1410-
core_schema.with_default_schema(
1411-
core_schema.dict_schema(
1412-
core_schema.str_schema(),
1413-
core_schema.any_schema(),
1414-
),
1415-
default_factory=dict,
1416-
),
1417-
required=False,
1413+
default=None,
1414+
),
1415+
required=False,
1416+
),
1417+
"storage_options": core_schema.typed_dict_field(
1418+
core_schema.with_default_schema(
1419+
core_schema.dict_schema(
1420+
core_schema.str_schema(),
1421+
core_schema.any_schema(),
14181422
),
1419-
},
1420-
extra_behavior="forbid",
1423+
default_factory=dict,
1424+
),
1425+
required=False,
14211426
),
1427+
},
1428+
extra_behavior="forbid",
1429+
)
1430+
1431+
deserialization_schema = core_schema.chain_schema(
1432+
[
1433+
core_schema.union_schema([str_schema, object_schema]),
14221434
core_schema.no_info_plain_validator_function(
14231435
lambda dct: cls(
14241436
dct.pop("path"),

upath/tests/test_pydantic.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,8 @@ def test_dump_non_serializable_json():
111111
pydantic.TypeAdapter(UPath).dump_python(
112112
UPath("https://www.example.com", get_client=get_client), mode="json"
113113
)
114+
115+
116+
def test_json_schema():
117+
ta = pydantic.TypeAdapter(UPath)
118+
ta.json_schema()

0 commit comments

Comments
 (0)