Skip to content

Commit f9f1906

Browse files
committed
Fix an issue where a list[] type field
1 parent 1b78e99 commit f9f1906

2 files changed

Lines changed: 30 additions & 12 deletions

File tree

src/odin/annotated_resource/type_resolution.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,14 @@ def _create_field_via_origin(origin, tp, options: Options) -> BaseField:
269269
options.base_args["value"] = value
270270
return options.construct_field()
271271

272-
elif issubclass(origin, list):
272+
# If type already defined skip lookup
273+
if options.is_field_type_valid:
274+
return options.construct_field()
275+
276+
if issubclass(origin, list):
273277
return _create_field_from_list_type(get_args(tp), options)
274278

275-
elif issubclass(origin, dict):
279+
if issubclass(origin, dict):
276280
return _create_field_from_dict_type(get_args(tp), options)
277281

278282
msg = f"Unable to resolve field for sub-scripted type {tp!r}"
@@ -281,16 +285,18 @@ def _create_field_via_origin(origin, tp, options: Options) -> BaseField:
281285

282286
def _create_field_for_type(tp, options: Options) -> Field:
283287
# If type already defined skip lookup
284-
if not options.is_field_type_valid:
285-
# Is a basic type
286-
if isinstance(tp, type):
287-
_set_options_field_type(options, tp)
288-
elif tp is Any:
289-
# For Python 3.10
290-
options.field_type = AnyField
291-
else:
292-
msg = f"Annotation is not a type instance {tp!r}"
293-
raise ResourceDefError(msg)
288+
if options.is_field_type_valid:
289+
return options.construct_field()
290+
291+
# Is a basic type
292+
if isinstance(tp, type):
293+
_set_options_field_type(options, tp)
294+
elif tp is Any:
295+
# For Python 3.10
296+
options.field_type = AnyField
297+
else:
298+
msg = f"Annotation is not a type instance {tp!r}"
299+
raise ResourceDefError(msg)
294300

295301
return options.construct_field()
296302

tests/annotated_resources/test_type_resolution.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,18 @@ def test_to_python(self, target, value, expected):
187187
odin.StringField,
188188
odin.NotProvided,
189189
),
190+
(
191+
Annotated[str, odin.Options(field_type=odin.EmailField)],
192+
odin.NotProvided,
193+
odin.EmailField,
194+
odin.NotProvided,
195+
),
196+
(
197+
Annotated[list[str], odin.Options(field_type=odin.EmailField)],
198+
odin.NotProvided,
199+
odin.EmailField,
200+
odin.NotProvided,
201+
),
190202
(
191203
Annotated[str, odin.Options(verbose_name="Foo")],
192204
"foo",

0 commit comments

Comments
 (0)