Skip to content

Commit

Permalink
transform any callable type; prev was just fn's. fixes #380.
Browse files Browse the repository at this point in the history
  • Loading branch information
aaraney authored and robertbartel committed Jul 10, 2023
1 parent 80ef565 commit c922a46
Showing 1 changed file with 22 additions and 14 deletions.
36 changes: 22 additions & 14 deletions python/lib/core/dmod/core/serializable.py
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ def _transform_fields(
# serial key was provided.
continue

if not inspect.isfunction(transform):
if not isinstance(transform, Callable):
error_message = (
f"non-callable field_transformer provided for field {field!r}."
"\n\n"
Expand All @@ -439,21 +439,29 @@ def _transform_fields(
)
raise ValueError(error_message)

sig = inspect.signature(transform)
try:
sig = inspect.signature(transform)

if len(sig.parameters) == 1:
serial[field] = transform(serial[field])
if len(sig.parameters) == 1:
serial[field] = transform(serial[field])

elif len(sig.parameters) == 2:
serial[field] = transform(self, serial[field])
elif len(sig.parameters) == 2:
serial[field] = transform(self, serial[field])

else:
error_message = (
f"unsupported parameter length for field_transformer callable, {field!r}."
"\n\n"
"field_transformer's take either 1 or 2 parameters, (value: T) or (self, value: T),\n"
"where T is the type of the field."
)
raise RuntimeError(error_message)
else:
error_message = (
f"unsupported parameter length for field_transformer callable, {field!r}."
"\n\n"
"field_transformer's take either 1 or 2 parameters, (value: T) or (self, value: T),\n"
"where T is the type of the field."
)
raise RuntimeError(error_message)

# ValueError can be thrown by built-in functions (i.e. `str`) that are,
# for example, implemented in C.
except ValueError:
# assume that build-in's that throw on `inspect.signature` only
# take a single parameter.
serial[field] = transform(serial[field])

return serial

0 comments on commit c922a46

Please sign in to comment.