auto.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. """ Automatic backend selection. """
  2. from .main import ProxyMixer
  3. from . import _compat as _
  4. class MixerProxy(object):
  5. """ Load mixer for class automaticly.
  6. ::
  7. from mixer.auto import mixer
  8. django_model_instance = mixer.blend('django.app.models.Model')
  9. sqlalchemy_model_instance = mixer.blend('sqlalchemy.app.models.Model')
  10. mongo_model_instance = mixer.blend('mongoengine.app.models.Model')
  11. """
  12. __store__ = dict()
  13. @classmethod
  14. def cycle(cls, count=5):
  15. """ Generate a lot instances.
  16. :return MetaMixer:
  17. """
  18. return ProxyMixer(cls, count)
  19. @classmethod
  20. def blend(cls, model, **params):
  21. """ Get a mixer class for model.
  22. :return instance:
  23. """
  24. scheme = cls.__load_cls(model)
  25. backend = cls.__store__.get(scheme)
  26. if not backend:
  27. if cls.__is_django_model(scheme):
  28. from .backend.django import mixer as backend
  29. elif cls.__is_sqlalchemy_model(scheme):
  30. from .backend.sqlalchemy import mixer as backend
  31. elif cls.__is_mongoengine_model(scheme):
  32. from .backend.mongoengine import mixer as backend
  33. cls.__store__[scheme] = backend
  34. return backend.blend(scheme, **params)
  35. @staticmethod
  36. def __load_cls(cls_type):
  37. if isinstance(cls_type, _.string_types):
  38. mod, cls_type = cls_type.rsplit('.', 1)
  39. mod = _.import_module(mod)
  40. cls_type = getattr(mod, cls_type)
  41. return cls_type
  42. @staticmethod
  43. def __is_django_model(model):
  44. try:
  45. from django.db.models import Model
  46. return issubclass(model, Model)
  47. except ImportError:
  48. return False
  49. @staticmethod
  50. def __is_sqlalchemy_model(model):
  51. return bool(getattr(model, '__mapper__', False))
  52. @staticmethod
  53. def __is_mongoengine_model(model):
  54. try:
  55. from mongoengine.base.document import BaseDocument
  56. return issubclass(model, BaseDocument)
  57. except ImportError:
  58. return False
  59. mixer = MixerProxy()