forked from klen/mixer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
auto.py
86 lines (59 loc) · 2.11 KB
/
auto.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
""" Automatic backend selection. """
from .main import ProxyMixer
from . import _compat as _
class MixerProxy(object):
""" Load mixer for class automaticly.
::
from mixer.auto import mixer
django_model_instance = mixer.blend('django.app.models.Model')
sqlalchemy_model_instance = mixer.blend('sqlalchemy.app.models.Model')
mongo_model_instance = mixer.blend('mongoengine.app.models.Model')
"""
__store__ = dict()
@classmethod
def cycle(cls, count=5):
""" Generate a lot instances.
:return MetaMixer:
"""
return ProxyMixer(cls, count)
@classmethod
def blend(cls, model, **params):
""" Get a mixer class for model.
:return instance:
"""
scheme = cls.__load_cls(model)
backend = cls.__store__.get(scheme)
if not backend:
if cls.__is_django_model(scheme):
from .backend.django import mixer as backend
elif cls.__is_sqlalchemy_model(scheme):
from .backend.sqlalchemy import mixer as backend
elif cls.__is_mongoengine_model(scheme):
from .backend.mongoengine import mixer as backend
cls.__store__[scheme] = backend
return backend.blend(scheme, **params)
@staticmethod
def __load_cls(cls_type):
if isinstance(cls_type, _.string_types):
mod, cls_type = cls_type.rsplit('.', 1)
mod = _.import_module(mod)
cls_type = getattr(mod, cls_type)
return cls_type
@staticmethod
def __is_django_model(model):
try:
from django.db.models import Model
return issubclass(model, Model)
except ImportError:
return False
@staticmethod
def __is_sqlalchemy_model(model):
return bool(getattr(model, '__mapper__', False))
@staticmethod
def __is_mongoengine_model(model):
try:
from mongoengine.base.document import BaseDocument
return issubclass(model, BaseDocument)
except ImportError:
return False
mixer = MixerProxy()