Skip to content

Commit 896c20b

Browse files
author
Joan Fontanals
authored
fix: create more info from dynamic (#1733)
Signed-off-by: Joan Fontanals Martinez <[email protected]>
1 parent 24c00cc commit 896c20b

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

docarray/utils/create_dynamic_doc_class.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from docarray import DocList, BaseDoc
22
from docarray.typing import AnyTensor
33
from pydantic import create_model
4+
from pydantic.fields import FieldInfo
45
from typing import Dict, List, Any, Union, Optional, Type
56
from docarray.utils._internal._typing import safe_issubclass
67

@@ -36,14 +37,15 @@ class MyDoc(BaseDoc):
3637
"""
3738
fields: Dict[str, Any] = {}
3839
for field_name, field in model.__annotations__.items():
40+
field_info = model.__fields__[field_name].field_info
3941
try:
4042
if safe_issubclass(field, DocList):
4143
t: Any = field.doc_type
42-
fields[field_name] = (List[t], {})
44+
fields[field_name] = (List[t], field_info)
4345
else:
44-
fields[field_name] = (field, {})
46+
fields[field_name] = (field, field_info)
4547
except TypeError:
46-
fields[field_name] = (field, {})
48+
fields[field_name] = (field, field_info)
4749
return create_model(
4850
model.__name__, __base__=model, __validators__=model.__validators__, **fields
4951
)
@@ -222,6 +224,7 @@ class MyDoc(BaseDoc):
222224
if base_doc_name in cached_models:
223225
return cached_models[base_doc_name]
224226
for field_name, field_schema in schema.get('properties', {}).items():
227+
225228
field_type = _get_field_type_from_schema(
226229
field_schema=field_schema,
227230
field_name=field_name,
@@ -230,7 +233,10 @@ class MyDoc(BaseDoc):
230233
is_tensor=False,
231234
num_recursions=0,
232235
)
233-
fields[field_name] = (field_type, field_schema.get('description'))
236+
fields[field_name] = (
237+
field_type,
238+
FieldInfo(default=field_schema.pop('default', None), **field_schema),
239+
)
234240

235241
model = create_model(base_doc_name, __base__=BaseDoc, **fields)
236242
cached_models[base_doc_name] = model

tests/units/util/test_create_dynamic_code_class.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from docarray import BaseDoc, DocList
1010
from docarray.typing import AnyTensor, ImageUrl
1111
from docarray.documents import TextDoc
12+
from pydantic import Field
1213

1314

1415
@pytest.mark.parametrize('transformation', ['proto', 'json'])
@@ -238,3 +239,20 @@ class ResultTestDoc(BaseDoc):
238239

239240
assert len(original_back) == 0
240241
assert len(custom_da) == 0
242+
243+
244+
def test_create_with_field_info():
245+
class CustomDoc(BaseDoc):
246+
a: str = Field(examples=['Example here'], another_extra='I am another extra')
247+
248+
CustomDocCopy = create_pure_python_type_model(CustomDoc)
249+
new_custom_doc_model = create_base_doc_from_schema(
250+
CustomDocCopy.schema(), 'CustomDoc'
251+
)
252+
assert new_custom_doc_model.schema().get('properties')['a']['examples'] == [
253+
'Example here'
254+
]
255+
assert (
256+
new_custom_doc_model.schema().get('properties')['a']['another_extra']
257+
== 'I am another extra'
258+
)

0 commit comments

Comments
 (0)