summaryrefslogtreecommitdiff
path: root/factory
diff options
context:
space:
mode:
authorRaphaël Barrois <raphael.barrois@polytechnique.org>2013-06-09 18:05:20 +0200
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2013-06-09 18:05:20 +0200
commit639e5cd1c6baf1cb19d9134545e29fbb5ba16d99 (patch)
treeac1f7e194021f7e2e912af3f04ba1706f61c9ab3 /factory
parent9bfc44dba97709aa8731e87b17fb2aed29263057 (diff)
downloadfactory-boy-639e5cd1c6baf1cb19d9134545e29fbb5ba16d99.tar
factory-boy-639e5cd1c6baf1cb19d9134545e29fbb5ba16d99.tar.gz
Move DjangoModelFactory / MogoFactory to their own modules.
Diffstat (limited to 'factory')
-rw-r--r--factory/__init__.py5
-rw-r--r--factory/base.py77
-rw-r--r--factory/django.py100
-rw-r--r--factory/mogo.py45
4 files changed, 148 insertions, 79 deletions
diff --git a/factory/__init__.py b/factory/__init__.py
index 2c81705..9eb3b7b 100644
--- a/factory/__init__.py
+++ b/factory/__init__.py
@@ -29,9 +29,7 @@ from .base import (
DictFactory,
BaseListFactory,
ListFactory,
- MogoFactory,
StubFactory,
- DjangoModelFactory,
BUILD_STRATEGY,
CREATE_STRATEGY,
@@ -39,6 +37,9 @@ from .base import (
use_strategy,
)
+from .mogo import MogoFactory
+from .django import DjangoModelFactory
+
from .declarations import (
LazyAttribute,
Iterator,
diff --git a/factory/base.py b/factory/base.py
index 2ff2944..23fdac7 100644
--- a/factory/base.py
+++ b/factory/base.py
@@ -554,83 +554,6 @@ class StubFactory(Factory):
raise UnsupportedStrategy()
-class DjangoModelFactory(Factory):
- """Factory for Django models.
-
- This makes sure that the 'sequence' field of created objects is a new id.
-
- Possible improvement: define a new 'attribute' type, AutoField, which would
- handle those for non-numerical primary keys.
- """
-
- ABSTRACT_FACTORY = True
- FACTORY_DJANGO_GET_OR_CREATE = ()
-
- @classmethod
- def _get_manager(cls, target_class):
- try:
- return target_class._default_manager # pylint: disable=W0212
- except AttributeError:
- return target_class.objects
-
- @classmethod
- def _setup_next_sequence(cls):
- """Compute the next available PK, based on the 'pk' database field."""
-
- model = cls._associated_class # pylint: disable=E1101
- manager = cls._get_manager(model)
-
- try:
- return 1 + manager.values_list('pk', flat=True
- ).order_by('-pk')[0]
- except IndexError:
- return 1
-
- @classmethod
- def _get_or_create(cls, target_class, *args, **kwargs):
- """Create an instance of the model through objects.get_or_create."""
- manager = cls._get_manager(target_class)
-
- assert 'defaults' not in cls.FACTORY_DJANGO_GET_OR_CREATE, (
- "'defaults' is a reserved keyword for get_or_create "
- "(in %s.FACTORY_DJANGO_GET_OR_CREATE=%r)"
- % (cls, cls.FACTORY_DJANGO_GET_OR_CREATE))
-
- key_fields = {}
- for field in cls.FACTORY_DJANGO_GET_OR_CREATE:
- key_fields[field] = kwargs.pop(field)
- key_fields['defaults'] = kwargs
-
- obj, _created = manager.get_or_create(*args, **key_fields)
- return obj
-
- @classmethod
- def _create(cls, target_class, *args, **kwargs):
- """Create an instance of the model, and save it to the database."""
- manager = cls._get_manager(target_class)
-
- if cls.FACTORY_DJANGO_GET_OR_CREATE:
- return cls._get_or_create(target_class, *args, **kwargs)
-
- return manager.create(*args, **kwargs)
-
- @classmethod
- def _after_postgeneration(cls, obj, create, results=None):
- """Save again the instance if creating and at least one hook ran."""
- if create and results:
- # Some post-generation hooks ran, and may have modified us.
- obj.save()
-
-
-class MogoFactory(Factory):
- """Factory for mogo objects."""
- ABSTRACT_FACTORY = True
-
- @classmethod
- def _build(cls, target_class, *args, **kwargs):
- return target_class.new(*args, **kwargs)
-
-
class BaseDictFactory(Factory):
"""Factory for dictionary-like classes."""
ABSTRACT_FACTORY = True
diff --git a/factory/django.py b/factory/django.py
new file mode 100644
index 0000000..351cb76
--- /dev/null
+++ b/factory/django.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2010 Mark Sandstrom
+# Copyright (c) 2011-2013 Raphaël Barrois
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+from __future__ import unicode_literals
+
+
+"""factory_boy extensions for use with the Django framework."""
+
+
+from . import base
+
+
+class DjangoModelFactory(base.Factory):
+ """Factory for Django models.
+
+ This makes sure that the 'sequence' field of created objects is a new id.
+
+ Possible improvement: define a new 'attribute' type, AutoField, which would
+ handle those for non-numerical primary keys.
+ """
+
+ ABSTRACT_FACTORY = True
+ FACTORY_DJANGO_GET_OR_CREATE = ()
+
+ @classmethod
+ def _get_manager(cls, target_class):
+ try:
+ return target_class._default_manager # pylint: disable=W0212
+ except AttributeError:
+ return target_class.objects
+
+ @classmethod
+ def _setup_next_sequence(cls):
+ """Compute the next available PK, based on the 'pk' database field."""
+
+ model = cls._associated_class # pylint: disable=E1101
+ manager = cls._get_manager(model)
+
+ try:
+ return 1 + manager.values_list('pk', flat=True
+ ).order_by('-pk')[0]
+ except IndexError:
+ return 1
+
+ @classmethod
+ def _get_or_create(cls, target_class, *args, **kwargs):
+ """Create an instance of the model through objects.get_or_create."""
+ manager = cls._get_manager(target_class)
+
+ assert 'defaults' not in cls.FACTORY_DJANGO_GET_OR_CREATE, (
+ "'defaults' is a reserved keyword for get_or_create "
+ "(in %s.FACTORY_DJANGO_GET_OR_CREATE=%r)"
+ % (cls, cls.FACTORY_DJANGO_GET_OR_CREATE))
+
+ key_fields = {}
+ for field in cls.FACTORY_DJANGO_GET_OR_CREATE:
+ key_fields[field] = kwargs.pop(field)
+ key_fields['defaults'] = kwargs
+
+ obj, _created = manager.get_or_create(*args, **key_fields)
+ return obj
+
+ @classmethod
+ def _create(cls, target_class, *args, **kwargs):
+ """Create an instance of the model, and save it to the database."""
+ manager = cls._get_manager(target_class)
+
+ if cls.FACTORY_DJANGO_GET_OR_CREATE:
+ return cls._get_or_create(target_class, *args, **kwargs)
+
+ return manager.create(*args, **kwargs)
+
+ @classmethod
+ def _after_postgeneration(cls, obj, create, results=None):
+ """Save again the instance if creating and at least one hook ran."""
+ if create and results:
+ # Some post-generation hooks ran, and may have modified us.
+ obj.save()
+
+
diff --git a/factory/mogo.py b/factory/mogo.py
new file mode 100644
index 0000000..48d9677
--- /dev/null
+++ b/factory/mogo.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2010 Mark Sandstrom
+# Copyright (c) 2011-2013 Raphaël Barrois
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+from __future__ import unicode_literals
+
+
+"""factory_boy extensions for use with the mogo library (pymongo wrapper)."""
+
+
+from . import base
+
+
+class MogoFactory(base.Factory):
+ """Factory for mogo objects."""
+ ABSTRACT_FACTORY = True
+
+ @classmethod
+ def _build(cls, target_class, *args, **kwargs):
+ return target_class.new(*args, **kwargs)
+
+ @classmethod
+ def _create(cls, target_class, *args, **kwargs):
+ instance = target_class.new(*args, **kwargs)
+ instance.save()
+ return instance