summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README16
-rw-r--r--factory/base.py11
-rw-r--r--tests/test_using.py11
3 files changed, 34 insertions, 4 deletions
diff --git a/README b/README
index e41e07a..aa64a1f 100644
--- a/README
+++ b/README
@@ -220,4 +220,20 @@ the global factory, using a simple syntax : ``field__attr=42`` will set the attr
>>> e2.bar
'baz'
+Abstract factories
+------------------
+
+If a ``Factory`` simply defines generic attribute declarations without being bound to a given class,
+it should be marked 'abstract' by declaring ``ABSTRACT_FACTORY = True``.
+Such factories cannot be built/created/....
+
+
+ class AbstractFactory(factory.Factory):
+ ABSTRACT_FACTORY = True
+ foo = 'foo'
+
+ >>> AbstractFactory()
+ Traceback (most recent call last):
+ ...
+ AttributeError: type object 'AbstractFactory' has no attribute '_associated_class'
diff --git a/factory/base.py b/factory/base.py
index ef782c7..0edf961 100644
--- a/factory/base.py
+++ b/factory/base.py
@@ -92,9 +92,8 @@ class BaseFactoryMetaClass(type):
"""
parent_factories = get_factory_bases(bases)
- if not parent_factories or attrs.get('ABSTRACT_FACTORY', False):
- # If this isn't a subclass of Factory, or specifically declared
- # abstract, don't do anything special.
+ if not parent_factories:
+ # If this isn't a subclass of Factory, don't do anything special.
return super(BaseFactoryMetaClass, cls).__new__(cls, class_name, bases, attrs)
declarations = containers.DeclarationDict()
@@ -200,7 +199,11 @@ class FactoryMetaClass(BaseFactoryMetaClass):
parent_factories = get_factory_bases(bases)
if not parent_factories or attrs.get('ABSTRACT_FACTORY', False):
- # If this isn't a subclass of Factory, don't do anything special.
+ # If this isn't a subclass of Factory, or specifically declared
+ # abstract, don't do anything special.
+ if 'ABSTRACT_FACTORY' in attrs:
+ attrs.pop('ABSTRACT_FACTORY')
+
return super(FactoryMetaClass, cls).__new__(cls, class_name, bases, attrs)
base = parent_factories[0]
diff --git a/tests/test_using.py b/tests/test_using.py
index 7f9f09c..36ecdff 100644
--- a/tests/test_using.py
+++ b/tests/test_using.py
@@ -211,6 +211,17 @@ class FactoryTestCase(unittest.TestCase):
test_object = TestObjectFactory.build()
self.assertEqual(test_object.one, 'one')
+ def test_abstract(self):
+ class SomeAbstractFactory(factory.Factory):
+ ABSTRACT_FACTORY = True
+ one = 'one'
+
+ class InheritedFactory(SomeAbstractFactory):
+ FACTORY_FOR = TestObject
+
+ test_object = InheritedFactory.build()
+ self.assertEqual(test_object.one, 'one')
+
def testSequence(self):
class TestObjectFactory(factory.Factory):
one = factory.Sequence(lambda n: 'one' + n)