summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphaël Barrois <raphael.barrois@polytechnique.org>2015-05-20 23:24:45 +0200
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2015-05-20 23:24:45 +0200
commitfa6d60d17ddb7b70c6bc2337d901ef8cc924e67b (patch)
tree83fb2851ab7dd64a54732159d3099488193aac02
parent536ac1b0fe7c4a04ad144022d6394b994feccdfd (diff)
downloadfactory-boy-fa6d60d17ddb7b70c6bc2337d901ef8cc924e67b.tar
factory-boy-fa6d60d17ddb7b70c6bc2337d901ef8cc924e67b.tar.gz
Add Meta.rename to handle name conflicts (See #206).
Define ``Meta.rename = {'attrs': 'attributes'}`` if your model expects a ``attributes`` kwarg but you can't define it since it's already reserved by the ``Factory`` class.
-rw-r--r--docs/changelog.rst9
-rw-r--r--docs/reference.rst23
-rw-r--r--factory/base.py8
-rw-r--r--tests/test_using.py15
4 files changed, 54 insertions, 1 deletions
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 8f63567..cd5d281 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,6 +1,15 @@
ChangeLog
=========
+.. _v2.6.0:
+
+2.6.0 (XXXX-XX-XX)
+------------------
+
+*New:*
+
+ - Add :attr:`factory.FactoryOptions.rename` to help handle conflicting names (:issue:`206`)
+
.. _v2.5.2:
2.5.2 (2015-04-21)
diff --git a/docs/reference.rst b/docs/reference.rst
index 44f78b6..0705ca2 100644
--- a/docs/reference.rst
+++ b/docs/reference.rst
@@ -106,6 +106,28 @@ The :class:`Factory` class
.. versionadded:: 2.4.0
+ .. attribute:: rename
+
+ Sometimes, a model expect a field with a name already used by one
+ of :class:`Factory`'s methods.
+
+ In this case, the :attr:`rename` attributes allows to define renaming
+ rules: the keys of the :attr:`rename` dict are those used in the
+ :class:`Factory` declarations, and their values the new name:
+
+ .. code-block:: python
+
+ class ImageFactory(factory.Factory):
+ # The model expects "attributes"
+ form_attributes = ['thumbnail', 'black-and-white']
+
+ class Meta:
+ model = Image
+ rename = {'form_attributes': 'attributes'}
+
+ .. versionadded: 2.6.0
+
+
.. attribute:: strategy
Use this attribute to change the strategy used by a :class:`Factory`.
@@ -229,7 +251,6 @@ The :class:`Factory` class
.. OHAI_VIM**
-
.. classmethod:: _setup_next_sequence(cls)
This method will compute the first value to use for the sequence counter
diff --git a/factory/base.py b/factory/base.py
index d48edd5..0f2af59 100644
--- a/factory/base.py
+++ b/factory/base.py
@@ -176,6 +176,7 @@ class FactoryOptions(object):
OptionDefault('strategy', CREATE_STRATEGY, inherit=True),
OptionDefault('inline_args', (), inherit=True),
OptionDefault('exclude', (), inherit=True),
+ OptionDefault('rename', {}, inherit=True),
]
def _fill_from_meta(self, meta, base_meta):
@@ -413,6 +414,12 @@ class BaseFactory(object):
return decls
@classmethod
+ def _rename_fields(cls, **kwargs):
+ for old_name, new_name in cls._meta.rename.items():
+ kwargs[new_name] = kwargs.pop(old_name)
+ return kwargs
+
+ @classmethod
def _adjust_kwargs(cls, **kwargs):
"""Extension point for custom kwargs adjustment."""
return kwargs
@@ -441,6 +448,7 @@ class BaseFactory(object):
**kwargs: arguments to pass to the creation function
"""
model_class = cls._get_model_class()
+ kwargs = cls._rename_fields(**kwargs)
kwargs = cls._adjust_kwargs(**kwargs)
# Remove 'hidden' arguments.
diff --git a/tests/test_using.py b/tests/test_using.py
index b7fea81..6d75531 100644
--- a/tests/test_using.py
+++ b/tests/test_using.py
@@ -1076,6 +1076,21 @@ class KwargAdjustTestCase(unittest.TestCase):
self.assertEqual({'x': 1, 'y': 2, 'z': 3, 'foo': 3}, obj.kwargs)
self.assertEqual((), obj.args)
+ def test_rename(self):
+ class TestObject(object):
+ def __init__(self, attributes=None):
+ self.attributes = attributes
+
+ class TestObjectFactory(factory.Factory):
+ class Meta:
+ model = TestObject
+ rename = {'attributes_': 'attributes'}
+
+ attributes_ = 42
+
+ obj = TestObjectFactory.build()
+ self.assertEqual(42, obj.attributes)
+
class SubFactoryTestCase(unittest.TestCase):
def test_sub_factory(self):