Skip to content

Commit f9c6bf7

Browse files
committed
extract the attribute name from the closure when a modifier is used in a 'direct' mapping
1 parent 44b4cbe commit f9c6bf7

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

connector/tests/test_mapper.py

+16
Original file line numberDiff line numberDiff line change
@@ -558,3 +558,19 @@ class ObjectMapper(ImportMapper):
558558
'test': .5})]
559559
}
560560
self.assertEqual(map_record.values(for_create=True), expected)
561+
562+
def test_modifier_filter_field(self):
563+
""" A direct mapping with a modifier must still be considered from the list of fields """
564+
class MyMapper(ImportMapper):
565+
direct = [('field', 'field2'),
566+
('no_field', 'no_field2'),
567+
(convert('name', int), 'out_name')]
568+
569+
env = mock.MagicMock()
570+
record = {'name': '300', 'field': 'value', 'no_field': 'no_value'}
571+
mapper = MyMapper(env)
572+
map_record = mapper.map_record(record)
573+
expected = {'out_name': 300, 'field2': 'value'}
574+
self.assertEqual(map_record.values(fields=['field', 'name']), expected)
575+
self.assertEqual(map_record.values(for_create=True,
576+
fields=['field', 'name']), expected)

connector/unit/mapper.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,14 @@ def _apply_with_options(self, map_record):
659659
for_create = self.options.for_create
660660
result = {}
661661
for from_attr, to_attr in self.direct:
662-
if (not fields or from_attr in fields):
662+
if callable(from_attr): # in a modifier
663+
# the name of the attribute is the first arg of the
664+
# closure
665+
attr_name = from_attr.__closure__[0].cell_contents
666+
else:
667+
attr_name = from_attr
668+
669+
if (not fields or attr_name in fields):
663670
value = self._map_direct(map_record.source,
664671
from_attr,
665672
to_attr)

0 commit comments

Comments
 (0)