Skip to content

Commit b73abfd

Browse files
committed
Handle when a single item is found.
Add a helper to allow for customise how a field is generated.
1 parent 6ad1053 commit b73abfd

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

src/odin/contrib/json_schema/__init__.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
odin.validators.MaxLengthValidator: {},
3636
odin.validators.MinLengthValidator: {},
3737
}
38+
JSON_SCHEMA_METHOD: Final[str] = "as_json_schema"
3839

3940

4041
class JSONSchema:
@@ -108,7 +109,11 @@ def _field_type(
108109
"""Get the type of a field."""
109110

110111
field_type = type(field)
111-
if field_type in FIELD_SCHEMAS:
112+
113+
if method := getattr(field, JSON_SCHEMA_METHOD, None):
114+
type_name, schema = method()
115+
116+
elif field_type in FIELD_SCHEMAS:
112117
type_name, schema = FIELD_SCHEMAS[field_type]
113118

114119
elif isinstance(field, odin.EnumField):
@@ -140,12 +145,15 @@ def _composite_field_to_schema(self, field: odin.CompositeField) -> Dict[str, An
140145
# Handle abstract resources
141146
child_resources = get_child_resources(field.of)
142147
if child_resources:
143-
schema = {
144-
"oneOf": [
145-
self._schema_def(child_resource)
146-
for child_resource in child_resources
147-
]
148-
}
148+
if len(child_resources) == 1:
149+
schema = self._schema_def(child_resources[0])
150+
else:
151+
schema = {
152+
"oneOf": [
153+
self._schema_def(child_resource)
154+
for child_resource in child_resources
155+
]
156+
}
149157
else:
150158
schema = self._schema_def(field.of)
151159

0 commit comments

Comments
 (0)