DESCRIPTION.rst 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. Home-page: http://github.com/klen/mixer
  2. Author: Kirill Klenov
  3. Author-email: horneds@gmail.com
  4. License: BSD
  5. Description-Content-Type: UNKNOWN
  6. Description: |logo| Mixer
  7. ############
  8. Mixer is an application to generate instances of Django or SQLAlchemy models.
  9. It's useful for testing and fixtures replacement. Fast and convenient test-data
  10. generation.
  11. Mixer supports:
  12. * Django_;
  13. * SQLAlchemy_;
  14. * Flask-SQLAlchemy_;
  15. * Peewee_;
  16. * Pony_;
  17. * Mongoengine_;
  18. * Marshmallow_;
  19. * Custom schemes;
  20. .. _badges:
  21. .. image:: http://img.shields.io/travis/klen/mixer.svg?style=flat-square
  22. :target: http://travis-ci.org/klen/mixer
  23. :alt: Build Status
  24. .. image:: http://img.shields.io/coveralls/klen/mixer.svg?style=flat-square
  25. :target: https://coveralls.io/r/klen/mixer
  26. :alt: Coverals
  27. .. image:: http://img.shields.io/pypi/v/mixer.svg?style=flat-square
  28. :target: https://pypi.python.org/pypi/mixer
  29. :alt: Version
  30. .. image:: http://img.shields.io/pypi/dm/mixer.svg?style=flat-square
  31. :target: https://pypi.python.org/pypi/mixer
  32. :alt: Downloads
  33. .. image:: http://img.shields.io/pypi/l/mixer.svg?style=flat-square
  34. :target: https://pypi.python.org/pypi/mixer
  35. :alt: License
  36. .. _documentation:
  37. **Docs are available at https://mixer.readthedocs.org/. Pull requests with
  38. documentation enhancements and/or fixes are awesome and most welcome.**
  39. Описание на русском языке: http://klen.github.io/mixer.html
  40. .. _contents:
  41. .. contents::
  42. Requirements
  43. =============
  44. - Django (1.11, 2.1) for Django ORM support;
  45. - Faker >= 0.7.3
  46. - Flask-SQLALchemy for SQLAlchemy ORM support and integration as Flask application;
  47. - Mongoengine for Mongoengine ODM support;
  48. - SQLAlchemy for SQLAlchemy ORM support;
  49. - Peewee ORM support;
  50. - fake-factory >= 0.5.0
  51. - faker == 0.7.3
  52. - python 2.7 or 3.6+
  53. Installation
  54. =============
  55. **Mixer** should be installed using pip: ::
  56. pip install mixer
  57. Usage
  58. =====
  59. | By default Mixer tries to generate a fake (human-friendly) data.
  60. | If you want to randomize the generated values initialize the Mixer
  61. | by manual: Mixer(fake=False)
  62. | By default Mixer saves the generated objects in a database. If you want to disable
  63. | this, initialize the Mixer by manual like: Mixer(commit=False)
  64. Django workflow
  65. ---------------
  66. Quick example: ::
  67. from mixer.backend.django import mixer
  68. from customapp.models import User, UserMessage
  69. # Generate a random user
  70. user = mixer.blend(User)
  71. # Generate an UserMessage
  72. message = mixer.blend(UserMessage, user=user)
  73. # Generate an UserMessage and an User. Set username for generated user to 'testname'.
  74. message = mixer.blend(UserMessage, user__username='testname')
  75. # Generate SomeModel from SomeApp and select FK or M2M values from db
  76. some = mixer.blend('someapp.somemodel', somerelation=mixer.SELECT)
  77. # Generate SomeModel from SomeApp and force a value of money field from default to random
  78. some = mixer.blend('someapp.somemodel', money=mixer.RANDOM)
  79. # Generate 5 SomeModel's instances and take company field's values from custom generator
  80. some_models = mixer.cycle(5).blend('somemodel', company=(name for name in company_names))
  81. Flask, Flask-SQLAlchemy
  82. -----------------------
  83. Quick example: ::
  84. from mixer.backend.flask import mixer
  85. from models import User, UserMessage
  86. mixer.init_app(self.app)
  87. # Generate a random user
  88. user = mixer.blend(User)
  89. # Generate an userMessage
  90. message = mixer.blend(UserMessage, user=user)
  91. # Generate an UserMessage and an User. Set username for generated user to 'testname'.
  92. message = mixer.blend(UserMessage, user__username='testname')
  93. # Generate SomeModel and select FK or M2M values from db
  94. some = mixer.blend('project.models.SomeModel', somerelation=mixer.SELECT)
  95. # Generate SomeModel from SomeApp and force a value of money field from default to random
  96. some = mixer.blend('project.models.SomeModel', money=mixer.RANDOM)
  97. # Generate 5 SomeModel's instances and take company field's values from custom generator
  98. some_models = mixer.cycle(5).blend('project.models.SomeModel', company=(company for company in companies))
  99. Support for Flask-SQLAlchemy models that have `__init__` arguments
  100. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  101. For support this scheme, just create your own mixer class, like this: ::
  102. from mixer.backend.sqlalchemy import Mixer
  103. class MyOwnMixer(Mixer):
  104. def populate_target(self, values):
  105. target = self.__scheme(**values)
  106. return target
  107. mixer = MyOwnMixer()
  108. SQLAlchemy workflow
  109. -------------------
  110. Example of initialization: ::
  111. from mixer.backend.sqlalchemy import Mixer
  112. ENGINE = create_engine('sqlite:///:memory:')
  113. BASE = declarative_base()
  114. SESSION = sessionmaker(bind=ENGINE)
  115. mixer = Mixer(session=SESSION(), commit=True)
  116. role = mixer.blend('package.models.Role')
  117. Also, see `Flask, Flask-SQLALchemy`_.
  118. Mongoengine workflow
  119. --------------------
  120. Example usage: ::
  121. from mixer.backend.mongoengine import mixer
  122. class User(Document):
  123. created_at = DateTimeField(default=datetime.datetime.now)
  124. email = EmailField(required=True)
  125. first_name = StringField(max_length=50)
  126. last_name = StringField(max_length=50)
  127. username = StringField(max_length=50)
  128. class Post(Document):
  129. title = StringField(max_length=120, required=True)
  130. author = ReferenceField(User)
  131. tags = ListField(StringField(max_length=30))
  132. post = mixer.blend(Post, author__username='foo')
  133. Marshmallow workflow
  134. --------------------
  135. Example usage: ::
  136. from mixer.main import mixer
  137. import marshmallow as ma
  138. class User(ma.Schema):
  139. created_at = ma.fields.DateTime(required=True)
  140. email = ma.fields.Email(required=True)
  141. first_name = ma.fields.String(required=True)
  142. last_name = ma.fields.String(required=True)
  143. username = ma.fields.String(required=True)
  144. class Post(ma.Schema):
  145. title = ma.fields.String(required=True)
  146. author = ma.fields.Nested(User, required=True)
  147. post = mixer.blend(Post, author__username='foo')
  148. Common usage
  149. ------------
  150. Quick example: ::
  151. from mixer.main import mixer
  152. class Test:
  153. one = int
  154. two = int
  155. name = str
  156. class Scheme:
  157. name = str
  158. money = int
  159. male = bool
  160. prop = Test
  161. scheme = mixer.blend(Scheme, prop__one=1)
  162. DB commits
  163. ----------
  164. By default 'django', 'flask', 'mongoengine' backends tries to save objects in
  165. database. For preventing this behavior init `mixer` manually: ::
  166. from mixer.backend.django import Mixer
  167. mixer = Mixer(commit=False)
  168. Or you can temporary switch context use the mixer as context manager: ::
  169. from mixer.backend.django import mixer
  170. # Will be save to db
  171. user1 = mixer.blend('auth.user')
  172. # Will not be save to db
  173. with mixer.ctx(commit=False):
  174. user2 = mixer.blend('auth.user')
  175. .. _custom:
  176. Custom fields
  177. -------------
  178. Mixer allows you to define generators for fields by manually.
  179. Quick example: ::
  180. from mixer.main import mixer
  181. class Test:
  182. id = int
  183. name = str
  184. mixer.register(Test,
  185. name=lambda: 'John',
  186. id=lambda: str(mixer.g.get_positive_integer())
  187. )
  188. test = mixer.blend(Test)
  189. test.name == 'John'
  190. isinstance(test.id, str)
  191. # You could pinned just a value to field
  192. mixer.register(Test, name='Just John')
  193. test = mixer.blend(Test)
  194. test.name == 'Just John'
  195. Also, you can make your own factory for field types: ::
  196. from mixer.backend.django import Mixer, GenFactory
  197. def get_func(*args, **kwargs):
  198. return "Always same"
  199. class MyFactory(GenFactory):
  200. generators = {
  201. models.CharField: get_func
  202. }
  203. mixer = Mixer(factory=MyFactory)
  204. Middlewares
  205. -----------
  206. You can add middleware layers to process generation: ::
  207. from mixer.backend.django import mixer
  208. # Register middleware to model
  209. @mixer.middleware('auth.user')
  210. def encrypt_password(user):
  211. user.set_password('test')
  212. return user
  213. You can add several middlewares. Each middleware should get one argument
  214. (generated value) and return them.
  215. It's also possible to unregister a middleware: ::
  216. mixer.unregister_middleware(encrypt_password)
  217. Locales
  218. -------
  219. By default mixer uses 'en' locale. You could switch mixer default locale by
  220. creating your own mixer: ::
  221. from mixer.backend.django import Mixer
  222. mixer = Mixer(locale='it')
  223. mixer.faker.name() ## u'Acchisio Conte'
  224. At any time you could switch mixer current locale: ::
  225. mixer.faker.locale = 'cz'
  226. mixer.faker.name() ## u'Miloslava Urbanov\xe1 CSc.'
  227. mixer.faker.locale = 'en'
  228. mixer.faker.name() ## u'John Black'
  229. # Use the mixer context manager
  230. mixer.faker.phone() ## u'1-438-238-1116'
  231. with mixer.ctx(locale='fr'):
  232. mixer.faker.phone() ## u'08 64 92 11 79'
  233. mixer.faker.phone() ## u'1-438-238-1116'
  234. .. _bugtracker:
  235. Bug tracker
  236. ===========
  237. If you have any suggestions, bug reports or
  238. annoyances please report them to the issue tracker
  239. at https://github.com/klen/mixer/issues
  240. Contributing
  241. ============
  242. Development of mixer happens at Github: https://github.com/klen/mixer
  243. Contributors
  244. =============
  245. * Antoine Bertin (https://github.com/Diaoul)
  246. * Benjamin Port (https://github.com/bport)
  247. * Dmitriy Moseev (https://github.com/DmitriyMoseev)
  248. * Eelke Hermens (https://github.com/eelkeh)
  249. * Esteban J. G. Gabancho (https://github.com/egabancho)
  250. * Felix Dreissig (https://github.com/F30)
  251. * Illia Volochii (https://github.com/illia-v)
  252. * Jannis (https://github.com/jnns)
  253. * Kirill Pavlov (https://github.com/pavlov99)
  254. * Kwok-kuen Cheung (https://github.com/cheungpat)
  255. * Mahdi Yusuf (https://github.com/myusuf3)
  256. * Marek Baczyński (https://github.com/imbaczek)
  257. * Marigold (https://github.com/Marigold)
  258. * Matt Caldwell (https://github.com/mattcaldwell)
  259. * Mikhail Porokhovnichenko (https://github.com/marazmiki)
  260. * Skylar Saveland (https://github.com/skyl)
  261. * Suriya Subramanian (https://github.com/suriya)
  262. * Gram (https://github.com/orsinium)
  263. License
  264. =======
  265. Licensed under a `BSD license`_.
  266. .. _links:
  267. .. _BSD license: http://www.linfo.org/bsdlicense.html
  268. .. _Django: http://djangoproject.com/
  269. .. _Flask-SQLAlchemy: http://flask-sqlalchemy.pocoo.org/
  270. .. _Flask: http://flask.pocoo.org/
  271. .. _Marshmallow: http://marshmallow.readthedocs.io/en/latest/
  272. .. _Mongoengine: http://mongoengine.org/
  273. .. _Peewee: http://peewee.readthedocs.org/en/latest/
  274. .. _Pony: http://ponyorm.com/
  275. .. _SQLAlchemy: http://www.sqlalchemy.org/
  276. .. _klen: http://klen.github.io
  277. .. |logo| image:: https://raw.github.com/klen/mixer/develop/docs/_static/logo.png
  278. :width: 100
  279. Keywords: django,flask,sqlalchemy,testing,mock,stub,mongoengine,data
  280. Platform: Any
  281. Classifier: Development Status :: 4 - Beta
  282. Classifier: Intended Audience :: Developers
  283. Classifier: License :: OSI Approved :: BSD License
  284. Classifier: Natural Language :: English
  285. Classifier: Natural Language :: Russian
  286. Classifier: Operating System :: OS Independent
  287. Classifier: Programming Language :: Python :: 2
  288. Classifier: Programming Language :: Python :: 2.7
  289. Classifier: Programming Language :: Python :: 3
  290. Classifier: Programming Language :: Python :: 3.5
  291. Classifier: Programming Language :: Python :: 3.6
  292. Classifier: Programming Language :: Python
  293. Classifier: Topic :: Software Development :: Libraries :: Python Modules
  294. Classifier: Topic :: Software Development :: Testing
  295. Classifier: Topic :: Utilities