diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2011-09-05 22:17:28 +0200 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2011-09-05 22:17:28 +0200 |
commit | 2821684dec8a71e93728fc3e036f83592324b518 (patch) | |
tree | 0b78ff41c7179687f940fb4b57e7d1fac10150ba /factory/containers.py | |
parent | 89631460a87d84790bc88766433e42f881937bf7 (diff) | |
download | factory-boy-2821684dec8a71e93728fc3e036f83592324b518.tar factory-boy-2821684dec8a71e93728fc3e036f83592324b518.tar.gz |
Better fix for nested subfactories.
Signed-off-by: Raphaël Barrois <raphael.barrois@polytechnique.org>
Diffstat (limited to 'factory/containers.py')
-rw-r--r-- | factory/containers.py | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/factory/containers.py b/factory/containers.py index d3fbc5b..48a4015 100644 --- a/factory/containers.py +++ b/factory/containers.py @@ -161,21 +161,25 @@ class DeclarationsHolder(object): for base in (self._unordered, self._ordered, extra): sub_fields.update(self._extract_sub_fields(base)) + def make_value(key, val): + if key in extra: + val = extra.pop(key) + if isinstance(val, SubFactory): + new_val = val.evaluate(factory, create, sub_fields.get(key, {})) + elif isinstance(val, OrderedDeclaration): + wrapper = ObjectParamsWrapper(attributes) + new_val = val.evaluate(factory, wrapper) + else: + new_val = val + + return new_val + # For fields in _unordered, use the value from extra if any; otherwise, # use the default value. for key, value in self._unordered.iteritems(): - attributes[key] = extra.get(key, value) + attributes[key] = make_value(key, value) for key, value in self._ordered.iteritems(): - if key in extra: - attributes[key] = extra[key] - else: - if isinstance(value, SubFactory): - new_value = value.evaluate(factory, create, - sub_fields.get(key, {})) - else: - wrapper = ObjectParamsWrapper(attributes) - new_value = value.evaluate(factory, wrapper) - attributes[key] = new_value + attributes[key] = make_value(key, value) attributes.update(extra) return attributes |