1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- """ 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()
|