From aaa8d51af47df9274aa113d143a7881cfedb3e40 Mon Sep 17 00:00:00 2001 From: tylertjburns <52676131+tylertjburns@users.noreply.github.com> Date: Thu, 5 Aug 2021 09:35:04 -0500 Subject: [PATCH] Update object_mapper.py --- mapper/object_mapper.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mapper/object_mapper.py b/mapper/object_mapper.py index 381a524..585612d 100644 --- a/mapper/object_mapper.py +++ b/mapper/object_mapper.py @@ -2,7 +2,7 @@ """ Copyright (C) 2015, marazt. All rights reserved. """ -from inspect import getmembers, isroutine +from inspect import getmembers, isroutine, signature from datetime import date, datetime from mapper.casedict import CaseDict @@ -166,10 +166,6 @@ def map(self, from_obj, to_type=type(None), ignore_case=False, allow_none=False, .format(key_from.__module__, key_from.__name__, to_type.__module__, to_type.__name__)) key_to = to_type custom_mappings = self.mappings[key_from][key_to][1] - - # Currently, all target class data members need to have default value - # Object with __init__ that carries required non-default arguments are not supported - inst = key_to() def not_private(s): return not s.startswith('_') @@ -183,6 +179,12 @@ def is_included(s, mapping): from_obj_attributes = getmembers(from_obj, lambda a: not isroutine(a)) from_obj_dict = {k: v for k, v in from_obj_attributes} + # support __init__ by passing arguments by keyword when instantiating the key_to + sig = signature(key_to.__init__) + kwargs = {x: from_obj_dict[x] for x in sig.parameters if x not in ('self', 'kwargs')} + + inst = key_to(**kwargs) + to_obj_attributes = getmembers(inst, lambda a: not isroutine(a)) to_obj_dict = {k: v for k, v in to_obj_attributes if not_excluded(k) and (not_private(k) or is_included(k, custom_mappings))}