Name | forkmixer JSON |
Version |
2.0.0
JSON |
| download |
home_page | None |
Summary | ForkMixer -- A fork of Mixer, a fixtures replacement. Supported Django ORM, SqlAlchemy ORM, Mongoengine ODM and custom python objects. |
upload_time | 2025-10-06 03:43:48 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | BSD |
keywords |
django
flask
sqlalchemy
testing
mock
stub
mongoengine
data
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
|
coveralls test coverage |
No coveralls.
|
.. image:: https://raw.github.com/paulchubatyy/forkmixer/main/docs/_static/logo.png
ForkMixer
=========
**ForkMixer** is a fork of the original Mixer project, a helper to generate instances of Django or SQLAlchemy models.
It's useful for testing and fixture replacement. Fast and convenient test-data
generation.
.. note::
This is a fork of the original `Mixer <https://github.com/klen/mixer>`_ project by Kirill Klenov.
Original project: https://github.com/klen/mixer
ForkMixer supports:
* Django_;
* SQLAlchemy_;
* Flask-SQLAlchemy_;
* Peewee_;
* Pony_;
* Mongoengine_;
* Marshmallow_;
* Custom schemes;
.. _badges:
.. image:: http://img.shields.io/pypi/l/forkmixer.svg?style=flat-square
:target: https://pypi.python.org/pypi/forkmixer
:alt: License
.. _documentation:
**Repository**: https://github.com/paulchubatyy/forkmixer
**Original Mixer Documentation**: https://mixer.readthedocs.org/
.. important::
ForkMixer requires Python 3.10+
.. _contents:
.. contents::
Requirements
=============
- Python 3.7+
- Django (5.1+) for Django ORM support;
- Flask-SQLALchemy for SQLAlchemy ORM support and integration as Flask application;
- Faker >= 0.7.3
- Mongoengine for Mongoengine ODM support;
- SQLAlchemy for SQLAlchemy ORM support;
- Peewee ORM support;
Installation
=============
**ForkMixer** should be installed using pip: ::
pip install forkmixer
Or using uv (recommended): ::
uv add forkmixer
Development
============
For development, it's recommended to use `uv <https://github.com/astral-sh/uv>`_ for fast dependency management.
**Setup development environment**: ::
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone the repository
git clone https://github.com/paulchubatyy/forkmixer
cd forkmixer
# Install dependencies (creates .venv and installs all dependencies)
uv sync --all-extras
# Or use make
make install
**Run tests**: ::
uv run pytest tests/
# Or use make
make t
**Run specific tests**: ::
uv run pytest tests/test_main.py
Usage
=====
| By default Mixer tries to generate fake (human-friendly) data.
| If you want to randomize the generated values initialize the Mixer
| by manual: Mixer(fake=False)
| By default Mixer saves the generated objects in a database. If you want to disable
| this, initialize the Mixer by manual like Mixer(commit=False)
Django workflow
---------------
Quick example:
.. code-block:: python
from forkmixer.backend.django import mixer
from customapp.models import User, UserMessage
# Generate a random user
user = mixer.blend(User)
# Generate an UserMessage
message = mixer.blend(UserMessage, user=user)
# Generate an UserMessage and an User. Set username for generated user to 'testname'.
message = mixer.blend(UserMessage, user__username='testname')
# Generate SomeModel from SomeApp and select FK or M2M values from db
some = mixer.blend('someapp.somemodel', somerelation=mixer.SELECT)
# Generate SomeModel from SomeApp and force a value of money field from default to random
some = mixer.blend('someapp.somemodel', money=mixer.RANDOM)
# Generate SomeModel from SomeApp and skip the generation of money field
some = mixer.blend('someapp.somemodel', money=mixer.SKIP)
# Generate 5 SomeModel's instances and take company field's values from custom generator
some_models = mixer.cycle(5).blend('somemodel', company=(name for name in company_names))
Flask, Flask-SQLAlchemy
-----------------------
Quick example:
.. code-block:: python
from forkmixer.backend.flask import mixer
from models import User, UserMessage
mixer.init_app(self.app)
# Generate a random user
user = mixer.blend(User)
# Generate an userMessage
message = mixer.blend(UserMessage, user=user)
# Generate an UserMessage and an User. Set username for generated user to 'testname'.
message = mixer.blend(UserMessage, user__username='testname')
# Generate SomeModel and select FK or M2M values from db
some = mixer.blend('project.models.SomeModel', somerelation=mixer.SELECT)
# Generate SomeModel from SomeApp and force a value of money field from default to random
some = mixer.blend('project.models.SomeModel', money=mixer.RANDOM)
# Generate SomeModel from SomeApp and skip the generation of money field
some = mixer.blend('project.models.SomeModel', money=mixer.SKIP)
# Generate 5 SomeModel's instances and take company field's values from custom generator
some_models = mixer.cycle(5).blend('project.models.SomeModel', company=(company for company in companies))
Support for Flask-SQLAlchemy models that have `__init__` arguments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
For support this scheme, just create your own mixer class, like this:
.. code-block:: python
from forkmixer.backend.sqlalchemy import Mixer
class MyOwnMixer(Mixer):
def populate_target(self, values):
target = self.__scheme(**values)
return target
mixer = MyOwnMixer()
SQLAlchemy workflow
-------------------
Example of initialization:
.. code-block:: python
from forkmixer.backend.sqlalchemy import Mixer
ENGINE = create_engine('sqlite:///:memory:')
BASE = declarative_base()
SESSION = sessionmaker(bind=ENGINE)
mixer = Mixer(session=SESSION(), commit=True)
role = mixer.blend('package.models.Role')
Also, see `Flask`_, `Flask-SQLAlchemy`_.
Mongoengine workflow
--------------------
Example usage:
.. code-block:: python
from forkmixer.backend.mongoengine import mixer
class User(Document):
created_at = DateTimeField(default=datetime.datetime.now)
email = EmailField(required=True)
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)
username = StringField(max_length=50)
class Post(Document):
title = StringField(max_length=120, required=True)
author = ReferenceField(User)
tags = ListField(StringField(max_length=30))
post = mixer.blend(Post, author__username='foo')
Marshmallow workflow
--------------------
Example usage:
.. code-block:: python
from forkmixer.backend.marshmallow import mixer
import marshmallow as ma
class User(ma.Schema):
created_at = ma.fields.DateTime(required=True)
email = ma.fields.Email(required=True)
first_name = ma.fields.String(required=True)
last_name = ma.fields.String(required=True)
username = ma.fields.String(required=True)
class Post(ma.Schema):
title = ma.fields.String(required=True)
author = ma.fields.Nested(User, required=True)
post = mixer.blend(Post, author__username='foo')
Common usage
------------
Quick example:
.. code-block:: python
from forkmixer.main import mixer
class Test:
one = int
two = int
name = str
class Scheme:
name = str
money = int
male = bool
prop = Test
scheme = mixer.blend(Scheme, prop__one=1)
DB commits
----------
By default 'django', 'flask', 'mongoengine' backends tries to save objects in
database. For preventing this behavior init `mixer` manually:
.. code-block:: python
from forkmixer.backend.django import Mixer
mixer = Mixer(commit=False)
Or you can temporary switch context use the mixer as context manager:
.. code-block:: python
from forkmixer.backend.django import mixer
# Will be save to db
user1 = mixer.blend('auth.user')
# Will not be save to db
with mixer.ctx(commit=False):
user2 = mixer.blend('auth.user')
.. _custom:
Custom fields
-------------
The mixer allows you to define generators for fields by manually.
Quick example:
.. code-block:: python
from forkmixer.main import mixer
class Test:
id = int
name = str
mixer.register(Test,
name=lambda: 'John',
id=lambda: str(mixer.faker.small_positive_integer())
)
test = mixer.blend(Test)
test.name == 'John'
isinstance(test.id, str)
# You could pinned just a value to field
mixer.register(Test, name='Just John')
test = mixer.blend(Test)
test.name == 'Just John'
Also, you can make your own factory for field types:
.. code-block:: python
from forkmixer.backend.django import Mixer, GenFactory
def get_func(*args, **kwargs):
return "Always same"
class MyFactory(GenFactory):
generators = {
models.CharField: get_func
}
mixer = Mixer(factory=MyFactory)
Middlewares
-----------
You can add middleware layers to process generation:
.. code-block:: python
from forkmixer.backend.django import mixer
# Register middleware to model
@mixer.middleware('auth.user')
def encrypt_password(user):
user.set_password('test')
return user
You can add several middlewares. Each middleware should get one argument
(generated value) and return them.
It's also possible to unregister a middleware:
.. code-block:: python
mixer.unregister_middleware(encrypt_password)
Locales
-------
By default mixer uses 'en' locale. You could switch mixer default locale by
creating your own mixer:
.. code-block:: python
from forkmixer.backend.django import Mixer
mixer = Mixer(locale='it')
mixer.faker.name() ## u'Acchisio Conte'
At any time you could switch mixer current locale:
.. code-block:: python
mixer.faker.locale = 'cz'
mixer.faker.name() ## u'Miloslava Urbanov\xe1 CSc.'
mixer.faker.locale = 'en'
mixer.faker.name() ## u'John Black'
# Use the mixer context manager
mixer.faker.phone() ## u'1-438-238-1116'
with mixer.ctx(locale='fr'):
mixer.faker.phone() ## u'08 64 92 11 79'
mixer.faker.phone() ## u'1-438-238-1116'
.. _bugtracker:
Bug tracker
===========
If you have any suggestions, bug reports or
annoyances please report them to the issue tracker
at https://github.com/klen/mixer/issues
Contributing
============
Development of mixer happens at Github: https://github.com/klen/mixer
Contributors
=============
* Antoine Bertin (https://github.com/Diaoul)
* Benjamin Port (https://github.com/bport)
* Dmitriy Moseev (https://github.com/DmitriyMoseev)
* Eelke Hermens (https://github.com/eelkeh)
* Esteban J. G. Gabancho (https://github.com/egabancho)
* Felix Dreissig (https://github.com/F30)
* Illia Volochii (https://github.com/illia-v)
* Jannis (https://github.com/jnns)
* Kirill Pavlov (https://github.com/pavlov99)
* Kwok-kuen Cheung (https://github.com/cheungpat)
* Mahdi Yusuf (https://github.com/myusuf3)
* Marek BaczyĆski (https://github.com/imbaczek)
* Marigold (https://github.com/Marigold)
* Matt Caldwell (https://github.com/mattcaldwell)
* Mikhail Porokhovnichenko (https://github.com/marazmiki)
* Skylar Saveland (https://github.com/skyl)
* Suriya Subramanian (https://github.com/suriya)
* Gram (https://github.com/orsinium)
* Joshua (https://github.com/jomasti)
* Lucas Rangel Cezimbra (https://github.com/lucasrcezimbra)
* avi-pomicell (https://github.com/avi-pomicell)
* Jochen Brissier (https://github.com/jbrissier)
License
========
Licensed under a `BSD license`_.
.. _links:
.. _Django: http://djangoproject.com/
.. _Flask: https://flask.palletsprojects.com/en/1.1.x/
.. _Flask-SQLAlchemy: http://flask-sqlalchemy.pocoo.org/
.. _SQLAlchemy: http://www.sqlalchemy.org/
.. _Marshmallow: http://marshmallow.readthedocs.io/en/latest/
.. _Mongoengine: http://mongoengine.org/
.. _Peewee: http://peewee.readthedocs.org/en/latest/
.. _Pony: http://ponyorm.com/
.. _klen: http://klen.github.io
.. _BSD license: http://www.linfo.org/bsdlicense.html
Raw data
{
"_id": null,
"home_page": null,
"name": "forkmixer",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "django, flask, sqlalchemy, testing, mock, stub, mongoengine, data",
"author": null,
"author_email": "Paul Chubatyy <xobb@citylance.biz>, Kirill Klenov <horneds@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/33/60/3d589f6b9df5171aa2c7ff0435d61c7fd0185b451a83c070d1dec09af01d/forkmixer-2.0.0.tar.gz",
"platform": null,
"description": ".. image:: https://raw.github.com/paulchubatyy/forkmixer/main/docs/_static/logo.png\n\nForkMixer\n=========\n\n**ForkMixer** is a fork of the original Mixer project, a helper to generate instances of Django or SQLAlchemy models.\nIt's useful for testing and fixture replacement. Fast and convenient test-data\ngeneration.\n\n.. note::\n\n This is a fork of the original `Mixer <https://github.com/klen/mixer>`_ project by Kirill Klenov.\n Original project: https://github.com/klen/mixer\n\nForkMixer supports:\n\n* Django_;\n* SQLAlchemy_;\n* Flask-SQLAlchemy_;\n* Peewee_;\n* Pony_;\n* Mongoengine_;\n* Marshmallow_;\n* Custom schemes;\n\n.. _badges:\n\n.. image:: http://img.shields.io/pypi/l/forkmixer.svg?style=flat-square\n :target: https://pypi.python.org/pypi/forkmixer\n :alt: License\n\n.. _documentation:\n\n\n**Repository**: https://github.com/paulchubatyy/forkmixer\n\n**Original Mixer Documentation**: https://mixer.readthedocs.org/\n\n.. important::\n\n ForkMixer requires Python 3.10+\n\n\n.. _contents:\n\n.. contents::\n\n\nRequirements\n=============\n\n- Python 3.7+\n- Django (5.1+) for Django ORM support;\n- Flask-SQLALchemy for SQLAlchemy ORM support and integration as Flask application;\n- Faker >= 0.7.3\n- Mongoengine for Mongoengine ODM support;\n- SQLAlchemy for SQLAlchemy ORM support;\n- Peewee ORM support;\n\n\nInstallation\n=============\n\n**ForkMixer** should be installed using pip: ::\n\n pip install forkmixer\n\nOr using uv (recommended): ::\n\n uv add forkmixer\n\n\nDevelopment\n============\n\nFor development, it's recommended to use `uv <https://github.com/astral-sh/uv>`_ for fast dependency management.\n\n**Setup development environment**: ::\n\n # Install uv if you haven't already\n curl -LsSf https://astral.sh/uv/install.sh | sh\n\n # Clone the repository\n git clone https://github.com/paulchubatyy/forkmixer\n cd forkmixer\n\n # Install dependencies (creates .venv and installs all dependencies)\n uv sync --all-extras\n\n # Or use make\n make install\n\n**Run tests**: ::\n\n uv run pytest tests/\n\n # Or use make\n make t\n\n**Run specific tests**: ::\n\n uv run pytest tests/test_main.py\n\n\nUsage\n=====\n\n | By default Mixer tries to generate fake (human-friendly) data.\n | If you want to randomize the generated values initialize the Mixer\n | by manual: Mixer(fake=False)\n\n\n | By default Mixer saves the generated objects in a database. If you want to disable\n | this, initialize the Mixer by manual like Mixer(commit=False)\n\n\nDjango workflow\n---------------\nQuick example:\n\n.. code-block:: python\n\n from forkmixer.backend.django import mixer\n from customapp.models import User, UserMessage\n\n # Generate a random user\n user = mixer.blend(User)\n\n # Generate an UserMessage\n message = mixer.blend(UserMessage, user=user)\n\n # Generate an UserMessage and an User. Set username for generated user to 'testname'.\n message = mixer.blend(UserMessage, user__username='testname')\n\n # Generate SomeModel from SomeApp and select FK or M2M values from db\n some = mixer.blend('someapp.somemodel', somerelation=mixer.SELECT)\n\n # Generate SomeModel from SomeApp and force a value of money field from default to random\n some = mixer.blend('someapp.somemodel', money=mixer.RANDOM)\n \n # Generate SomeModel from SomeApp and skip the generation of money field\n some = mixer.blend('someapp.somemodel', money=mixer.SKIP)\n\n # Generate 5 SomeModel's instances and take company field's values from custom generator\n some_models = mixer.cycle(5).blend('somemodel', company=(name for name in company_names))\n\n\nFlask, Flask-SQLAlchemy\n-----------------------\nQuick example:\n\n.. code-block:: python\n\n from forkmixer.backend.flask import mixer\n from models import User, UserMessage\n\n mixer.init_app(self.app)\n\n # Generate a random user\n user = mixer.blend(User)\n\n # Generate an userMessage\n message = mixer.blend(UserMessage, user=user)\n\n # Generate an UserMessage and an User. Set username for generated user to 'testname'.\n message = mixer.blend(UserMessage, user__username='testname')\n\n # Generate SomeModel and select FK or M2M values from db\n some = mixer.blend('project.models.SomeModel', somerelation=mixer.SELECT)\n\n # Generate SomeModel from SomeApp and force a value of money field from default to random\n some = mixer.blend('project.models.SomeModel', money=mixer.RANDOM)\n \n # Generate SomeModel from SomeApp and skip the generation of money field\n some = mixer.blend('project.models.SomeModel', money=mixer.SKIP)\n\n # Generate 5 SomeModel's instances and take company field's values from custom generator\n some_models = mixer.cycle(5).blend('project.models.SomeModel', company=(company for company in companies))\n\n\nSupport for Flask-SQLAlchemy models that have `__init__` arguments\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor support this scheme, just create your own mixer class, like this:\n\n.. code-block:: python\n\n from forkmixer.backend.sqlalchemy import Mixer\n\n class MyOwnMixer(Mixer):\n\n def populate_target(self, values):\n target = self.__scheme(**values)\n return target\n\n mixer = MyOwnMixer()\n\n\nSQLAlchemy workflow\n-------------------\n\nExample of initialization:\n\n.. code-block:: python\n\n from forkmixer.backend.sqlalchemy import Mixer\n\n ENGINE = create_engine('sqlite:///:memory:')\n BASE = declarative_base()\n SESSION = sessionmaker(bind=ENGINE)\n\n mixer = Mixer(session=SESSION(), commit=True)\n role = mixer.blend('package.models.Role')\n\n\nAlso, see `Flask`_, `Flask-SQLAlchemy`_.\n\n\nMongoengine workflow\n--------------------\n\nExample usage:\n\n.. code-block:: python\n\n from forkmixer.backend.mongoengine import mixer\n\n class User(Document):\n created_at = DateTimeField(default=datetime.datetime.now)\n email = EmailField(required=True)\n first_name = StringField(max_length=50)\n last_name = StringField(max_length=50)\n username = StringField(max_length=50)\n\n class Post(Document):\n title = StringField(max_length=120, required=True)\n author = ReferenceField(User)\n tags = ListField(StringField(max_length=30))\n\n post = mixer.blend(Post, author__username='foo')\n\nMarshmallow workflow\n--------------------\n\nExample usage:\n\n.. code-block:: python\n\n from forkmixer.backend.marshmallow import mixer\n import marshmallow as ma\n\n class User(ma.Schema):\n created_at = ma.fields.DateTime(required=True)\n email = ma.fields.Email(required=True)\n first_name = ma.fields.String(required=True)\n last_name = ma.fields.String(required=True)\n username = ma.fields.String(required=True)\n\n class Post(ma.Schema):\n title = ma.fields.String(required=True)\n author = ma.fields.Nested(User, required=True)\n\n post = mixer.blend(Post, author__username='foo')\n\n\nCommon usage\n------------\nQuick example:\n\n.. code-block:: python\n\n from forkmixer.main import mixer\n\n class Test:\n one = int\n two = int\n name = str\n\n class Scheme:\n name = str\n money = int\n male = bool\n prop = Test\n\n scheme = mixer.blend(Scheme, prop__one=1)\n\n\nDB commits\n----------\n\nBy default 'django', 'flask', 'mongoengine' backends tries to save objects in\ndatabase. For preventing this behavior init `mixer` manually:\n\n.. code-block:: python\n\n from forkmixer.backend.django import Mixer\n\n mixer = Mixer(commit=False)\n\n\nOr you can temporary switch context use the mixer as context manager:\n\n.. code-block:: python\n\n from forkmixer.backend.django import mixer\n\n # Will be save to db\n user1 = mixer.blend('auth.user')\n\n # Will not be save to db\n with mixer.ctx(commit=False):\n user2 = mixer.blend('auth.user')\n\n\n.. _custom:\n\nCustom fields\n-------------\n\nThe mixer allows you to define generators for fields by manually.\nQuick example:\n\n.. code-block:: python\n\n from forkmixer.main import mixer\n\n class Test:\n id = int\n name = str\n\n mixer.register(Test,\n name=lambda: 'John',\n id=lambda: str(mixer.faker.small_positive_integer())\n )\n\n test = mixer.blend(Test)\n test.name == 'John'\n isinstance(test.id, str)\n\n # You could pinned just a value to field\n mixer.register(Test, name='Just John')\n test = mixer.blend(Test)\n test.name == 'Just John'\n\nAlso, you can make your own factory for field types:\n\n.. code-block:: python\n\n from forkmixer.backend.django import Mixer, GenFactory\n\n def get_func(*args, **kwargs):\n return \"Always same\"\n\n class MyFactory(GenFactory):\n generators = {\n models.CharField: get_func\n }\n\n mixer = Mixer(factory=MyFactory)\n\nMiddlewares\n-----------\n\nYou can add middleware layers to process generation:\n\n.. code-block:: python\n\n from forkmixer.backend.django import mixer\n\n # Register middleware to model\n @mixer.middleware('auth.user')\n def encrypt_password(user):\n user.set_password('test')\n return user\n\nYou can add several middlewares. Each middleware should get one argument\n(generated value) and return them.\n\nIt's also possible to unregister a middleware:\n\n.. code-block:: python\n\n mixer.unregister_middleware(encrypt_password)\n\n\nLocales\n-------\n\nBy default mixer uses 'en' locale. You could switch mixer default locale by\ncreating your own mixer:\n\n.. code-block:: python\n\n from forkmixer.backend.django import Mixer\n\n mixer = Mixer(locale='it')\n mixer.faker.name() ## u'Acchisio Conte'\n\nAt any time you could switch mixer current locale:\n\n.. code-block:: python\n\n mixer.faker.locale = 'cz'\n mixer.faker.name() ## u'Miloslava Urbanov\\xe1 CSc.'\n\n mixer.faker.locale = 'en'\n mixer.faker.name() ## u'John Black'\n\n # Use the mixer context manager\n mixer.faker.phone() ## u'1-438-238-1116'\n with mixer.ctx(locale='fr'):\n mixer.faker.phone() ## u'08 64 92 11 79'\n\n mixer.faker.phone() ## u'1-438-238-1116'\n\n.. _bugtracker:\n\nBug tracker\n===========\n\nIf you have any suggestions, bug reports or\nannoyances please report them to the issue tracker\nat https://github.com/klen/mixer/issues\n\n\nContributing\n============\n\nDevelopment of mixer happens at Github: https://github.com/klen/mixer\n\n\nContributors\n=============\n\n* Antoine Bertin (https://github.com/Diaoul)\n* Benjamin Port (https://github.com/bport)\n* Dmitriy Moseev (https://github.com/DmitriyMoseev)\n* Eelke Hermens (https://github.com/eelkeh)\n* Esteban J. G. Gabancho (https://github.com/egabancho)\n* Felix Dreissig (https://github.com/F30)\n* Illia Volochii (https://github.com/illia-v)\n* Jannis (https://github.com/jnns)\n* Kirill Pavlov (https://github.com/pavlov99)\n* Kwok-kuen Cheung (https://github.com/cheungpat)\n* Mahdi Yusuf (https://github.com/myusuf3)\n* Marek Baczy\u0144ski (https://github.com/imbaczek)\n* Marigold (https://github.com/Marigold)\n* Matt Caldwell (https://github.com/mattcaldwell)\n* Mikhail Porokhovnichenko (https://github.com/marazmiki)\n* Skylar Saveland (https://github.com/skyl)\n* Suriya Subramanian (https://github.com/suriya)\n* Gram (https://github.com/orsinium)\n* Joshua (https://github.com/jomasti)\n* Lucas Rangel Cezimbra (https://github.com/lucasrcezimbra)\n* avi-pomicell (https://github.com/avi-pomicell)\n* Jochen Brissier (https://github.com/jbrissier)\n\n\nLicense\n========\n\nLicensed under a `BSD license`_.\n\n\n.. _links:\n\n.. _Django: http://djangoproject.com/\n.. _Flask: https://flask.palletsprojects.com/en/1.1.x/\n.. _Flask-SQLAlchemy: http://flask-sqlalchemy.pocoo.org/\n.. _SQLAlchemy: http://www.sqlalchemy.org/\n.. _Marshmallow: http://marshmallow.readthedocs.io/en/latest/\n.. _Mongoengine: http://mongoengine.org/\n.. _Peewee: http://peewee.readthedocs.org/en/latest/\n.. _Pony: http://ponyorm.com/\n.. _klen: http://klen.github.io\n.. _BSD license: http://www.linfo.org/bsdlicense.html\n",
"bugtrack_url": null,
"license": "BSD",
"summary": "ForkMixer -- A fork of Mixer, a fixtures replacement. Supported Django ORM, SqlAlchemy ORM, Mongoengine ODM and custom python objects.",
"version": "2.0.0",
"project_urls": {
"Documentation": "https://github.com/paulchubatyy/forkmixer",
"Homepage": "https://github.com/paulchubatyy/forkmixer",
"Issue tracker": "https://github.com/paulchubatyy/forkmixer/issues",
"Original Project": "https://github.com/klen/mixer",
"Source code": "https://github.com/paulchubatyy/forkmixer"
},
"split_keywords": [
"django",
" flask",
" sqlalchemy",
" testing",
" mock",
" stub",
" mongoengine",
" data"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "397aabdfca7e2d2c80e10e02bd33adc0fe4fc2e3f9fb6b9f0f57f43128807c4c",
"md5": "b4f4c41e3927f5f0b964a6378328bb7d",
"sha256": "f731cce202f44c3718b522ac2725cfa50e6b87b802783a69fa7b310b8ac78e7a"
},
"downloads": -1,
"filename": "forkmixer-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b4f4c41e3927f5f0b964a6378328bb7d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 39524,
"upload_time": "2025-10-06T03:43:46",
"upload_time_iso_8601": "2025-10-06T03:43:46.933951Z",
"url": "https://files.pythonhosted.org/packages/39/7a/abdfca7e2d2c80e10e02bd33adc0fe4fc2e3f9fb6b9f0f57f43128807c4c/forkmixer-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "33603d589f6b9df5171aa2c7ff0435d61c7fd0185b451a83c070d1dec09af01d",
"md5": "08ef51eafa1ef271350b74bd0d979d8d",
"sha256": "b5e6d422f7a81dd9f6709938d20955c5eea2b5873581ec1540010893c6a327b7"
},
"downloads": -1,
"filename": "forkmixer-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "08ef51eafa1ef271350b74bd0d979d8d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 51465,
"upload_time": "2025-10-06T03:43:48",
"upload_time_iso_8601": "2025-10-06T03:43:48.435815Z",
"url": "https://files.pythonhosted.org/packages/33/60/3d589f6b9df5171aa2c7ff0435d61c7fd0185b451a83c070d1dec09af01d/forkmixer-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-06 03:43:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "paulchubatyy",
"github_project": "forkmixer",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"lcname": "forkmixer"
}