Changelog
### 3.3.0
```
------------------
*New:*
- :issue:`366`: Add :class:`factory.django.Password` to generate Django :class:`~django.contrib.auth.models.User`
passwords.
- :issue:`304`: Add :attr:`~factory.alchemy.SQLAlchemyOptions.sqlalchemy_session_factory` to dynamically
create sessions for use by the :class:`~factory.alchemy.SQLAlchemyModelFactory`.
- Add support for Django 4.0
- Add support for Django 4.1
- Add support for Python 3.10
- Add support for Python 3.11
*Bugfix:*
- Make :meth:`~factory.django.mute_signals` mute signals during post-generation.
- :issue:`775`: Change the signature for :meth:`~factory.alchemy.SQLAlchemyModelFactory._save` and
:meth:`~factory.alchemy.SQLAlchemyModelFactory._get_or_create` to avoid argument names clashes with a field named
``session``.
*Deprecated:*
- :class:`~factory.django.DjangoModelFactory` will stop issuing a second call to
:meth:`~django.db.models.Model.save` on the created instance when :ref:`post-generation-hooks` return a value.
To help with the transition, :class:`factory.django.DjangoModelFactory._after_postgeneration` raises a
:class:`DeprecationWarning` when calling :meth:`~django.db.models.Model.save`. Inspect your
:class:`~factory.django.DjangoModelFactory` subclasses:
- If the :meth:`~django.db.models.Model.save` call is not needed after :class:`~factory.PostGeneration`, set
:attr:`factory.django.DjangoOptions.skip_postgeneration_save` to ``True`` in the factory meta.
- Otherwise, the instance has been modified by :class:`~factory.PostGeneration` hooks and needs to be
:meth:`~django.db.models.Model.save`\ d. Either:
- call :meth:`django.db.models.Model.save` in the :class:`~factory.PostGeneration` hook that modifies the
instance, or
- override :class:`~factory.django.DjangoModelFactory._after_postgeneration` to
:meth:`~django.db.models.Model.save` the instance.
*Removed:*
- Drop support for Django 2.2
- Drop support for Django 3.0
- Drop support for Django 3.1
- Drop support for Python 3.6
```
### 3.2.1
```
------------------
*New:*
- Add support for Django 3.2
*Bugfix:*
- Do not override signals receivers registered in a :meth:`~factory.django.mute_signals` context.
- :issue:`775`: Change the signature for :meth:`~factory.alchemy.SQLAlchemyModelFactory._save` and
:meth:`~factory.alchemy.SQLAlchemyModelFactory._get_or_create` to avoid argument names clashes with a field named
``session``.
```
### 3.2.0
```
------------------
*New:*
- Add support for Django 3.1
- Add support for Python 3.9
*Removed:*
- Drop support for Django 1.11. This version `is not maintained anymore <https://www.djangoproject.com/download/#supported-versions>`__.
- Drop support for Python 3.5. This version `is not maintained anymore <https://devguide.python.org/developer-workflow/development-cycle/index.html#end-of-life-branches>`__.
*Deprecated:*
- :func:`factory.use_strategy`. Use :attr:`factory.FactoryOptions.strategy` instead.
The purpose of :func:`~factory.use_strategy` duplicates the factory option. Follow :pep:`20`: *There should be
one-- and preferably only one --obvious way to do it.*
:func:`~factory.use_strategy()` will be removed in the next major version.
*Bug fix:*
- :issue:`785` :issue:`786` :issue:`787` :issue:`788` :issue:`790` :issue:`796`: Calls to :class:`factory.Faker`
and :class:`factory.django.FileField` within a :class:`~factory.Trait` or :class:`~factory.Maybe` no longer lead to
a ``KeyError`` crash.
```
### 3.1.0
```
------------------
*New:*
- Allow all types of declarations in :class:`factory.Faker` calls - enables references to other faker-defined attributes.
```
### 3.0.1
```
------------------
*Bug fix:*
- :issue:`769`: Fix ``import factory; factory.django.DjangoModelFactory`` and similar calls.
```
### 3.0.0
```
------------------
Breaking changes
""""""""""""""""
The following aliases were removed:
+------------------------------------------------+---------------------------------------------------+
| Broken alias | New import |
+================================================+===================================================+
| ``from factory import DjangoModelFactory`` | ``from factory.django import DjangoModelFactory`` |
+------------------------------------------------+---------------------------------------------------+
| ``from factory import MogoFactory`` | ``from factory.mogo import MogoFactory`` |
+------------------------------------------------+---------------------------------------------------+
| ``from factory.fuzzy import get_random_state`` | ``from factory.random import get_random_state`` |
+------------------------------------------------+---------------------------------------------------+
| ``from factory.fuzzy import set_random_state`` | ``from factory.random import set_random_state`` |
+------------------------------------------------+---------------------------------------------------+
| ``from factory.fuzzy import reseed_random`` | ``from factory.random import reseed_random`` |
+------------------------------------------------+---------------------------------------------------+
*Removed:*
- Drop support for Python 2 and 3.4. These versions `are not maintained anymore <https://devguide.python.org/developer-workflow/development-cycle/index.html#end-of-life-branches>`__.
- Drop support for Django 2.0 and 2.1. These versions `are not maintained anymore <https://www.djangoproject.com/download/#supported-versions>`__.
- Remove deprecated ``force_flush`` from ``SQLAlchemyModelFactory`` options. Use
``sqlalchemy_session_persistence = "flush"`` instead.
- Drop deprecated ``attributes()`` from :class:`~factory.Factory` subclasses; use
``factory.make_factory(dict, FactoryClass._meta.pre_declarations)`` instead.
- Drop deprecated ``declarations()`` from :class:`~factory.Factory` subclasses; use ``FactoryClass._meta.pre_declarations`` instead.
- Drop ``factory.compat`` module.
*New:*
- Add support for Python 3.8
- Add support for Django 2.2 and 3.0
- Report misconfiguration when a :py:class:`~factory.Factory` is used as the :py:attr:`~factory.Factory.model` for another :py:class:`~factory.Factory`.
- Allow configuring the color palette of :py:class:`~factory.django.ImageField`.
- :py:meth:`get_random_state()` now represents the state of Faker and ``factory_boy`` fuzzy attributes.
- Add SQLAlchemy ``get_or_create`` support
*Improvements:*
- :issue:`561`: Display a developer-friendly error message when providing a model instead of a factory in a :class:`~factory.declarations.SubFactory` class.
*Bug fix:*
- Fix issue with SubFactory not preserving signal muting behavior of the used factory, thanks `Patrick Stein <https://github.com/PFStein>`_.
- Fix issue with overriding parameters in a Trait, thanks `Grégoire Rocher <https://github.com/cecedille1>`_.
- :issue:`598`: Limit ``get_or_create`` behavior to fields specified in ``django_get_or_create``.
- :issue:`606`: Re-raise :class:`~django.db.IntegrityError` when ``django_get_or_create`` with multiple fields fails to lookup model using user provided keyword arguments.
- :issue:`630`: TypeError masked by __repr__ AttributeError when initializing ``Maybe`` with inconsistent phases.
```
Links
- PyPI: https://pypi.org/project/factory-boy
- Changelog: https://pyup.io/changelogs/factory-boy/
- Repo: https://github.com/FactoryBoy/factory_boy
This PR updates factory-boy from 2.12.0 to 3.3.0.
Changelog
### 3.3.0 ``` ------------------ *New:* - :issue:`366`: Add :class:`factory.django.Password` to generate Django :class:`~django.contrib.auth.models.User` passwords. - :issue:`304`: Add :attr:`~factory.alchemy.SQLAlchemyOptions.sqlalchemy_session_factory` to dynamically create sessions for use by the :class:`~factory.alchemy.SQLAlchemyModelFactory`. - Add support for Django 4.0 - Add support for Django 4.1 - Add support for Python 3.10 - Add support for Python 3.11 *Bugfix:* - Make :meth:`~factory.django.mute_signals` mute signals during post-generation. - :issue:`775`: Change the signature for :meth:`~factory.alchemy.SQLAlchemyModelFactory._save` and :meth:`~factory.alchemy.SQLAlchemyModelFactory._get_or_create` to avoid argument names clashes with a field named ``session``. *Deprecated:* - :class:`~factory.django.DjangoModelFactory` will stop issuing a second call to :meth:`~django.db.models.Model.save` on the created instance when :ref:`post-generation-hooks` return a value. To help with the transition, :class:`factory.django.DjangoModelFactory._after_postgeneration` raises a :class:`DeprecationWarning` when calling :meth:`~django.db.models.Model.save`. Inspect your :class:`~factory.django.DjangoModelFactory` subclasses: - If the :meth:`~django.db.models.Model.save` call is not needed after :class:`~factory.PostGeneration`, set :attr:`factory.django.DjangoOptions.skip_postgeneration_save` to ``True`` in the factory meta. - Otherwise, the instance has been modified by :class:`~factory.PostGeneration` hooks and needs to be :meth:`~django.db.models.Model.save`\ d. Either: - call :meth:`django.db.models.Model.save` in the :class:`~factory.PostGeneration` hook that modifies the instance, or - override :class:`~factory.django.DjangoModelFactory._after_postgeneration` to :meth:`~django.db.models.Model.save` the instance. *Removed:* - Drop support for Django 2.2 - Drop support for Django 3.0 - Drop support for Django 3.1 - Drop support for Python 3.6 ``` ### 3.2.1 ``` ------------------ *New:* - Add support for Django 3.2 *Bugfix:* - Do not override signals receivers registered in a :meth:`~factory.django.mute_signals` context. - :issue:`775`: Change the signature for :meth:`~factory.alchemy.SQLAlchemyModelFactory._save` and :meth:`~factory.alchemy.SQLAlchemyModelFactory._get_or_create` to avoid argument names clashes with a field named ``session``. ``` ### 3.2.0 ``` ------------------ *New:* - Add support for Django 3.1 - Add support for Python 3.9 *Removed:* - Drop support for Django 1.11. This version `is not maintained anymore <https://www.djangoproject.com/download/#supported-versions>`__. - Drop support for Python 3.5. This version `is not maintained anymore <https://devguide.python.org/developer-workflow/development-cycle/index.html#end-of-life-branches>`__. *Deprecated:* - :func:`factory.use_strategy`. Use :attr:`factory.FactoryOptions.strategy` instead. The purpose of :func:`~factory.use_strategy` duplicates the factory option. Follow :pep:`20`: *There should be one-- and preferably only one --obvious way to do it.* :func:`~factory.use_strategy()` will be removed in the next major version. *Bug fix:* - :issue:`785` :issue:`786` :issue:`787` :issue:`788` :issue:`790` :issue:`796`: Calls to :class:`factory.Faker` and :class:`factory.django.FileField` within a :class:`~factory.Trait` or :class:`~factory.Maybe` no longer lead to a ``KeyError`` crash. ``` ### 3.1.0 ``` ------------------ *New:* - Allow all types of declarations in :class:`factory.Faker` calls - enables references to other faker-defined attributes. ``` ### 3.0.1 ``` ------------------ *Bug fix:* - :issue:`769`: Fix ``import factory; factory.django.DjangoModelFactory`` and similar calls. ``` ### 3.0.0 ``` ------------------ Breaking changes """""""""""""""" The following aliases were removed: +------------------------------------------------+---------------------------------------------------+ | Broken alias | New import | +================================================+===================================================+ | ``from factory import DjangoModelFactory`` | ``from factory.django import DjangoModelFactory`` | +------------------------------------------------+---------------------------------------------------+ | ``from factory import MogoFactory`` | ``from factory.mogo import MogoFactory`` | +------------------------------------------------+---------------------------------------------------+ | ``from factory.fuzzy import get_random_state`` | ``from factory.random import get_random_state`` | +------------------------------------------------+---------------------------------------------------+ | ``from factory.fuzzy import set_random_state`` | ``from factory.random import set_random_state`` | +------------------------------------------------+---------------------------------------------------+ | ``from factory.fuzzy import reseed_random`` | ``from factory.random import reseed_random`` | +------------------------------------------------+---------------------------------------------------+ *Removed:* - Drop support for Python 2 and 3.4. These versions `are not maintained anymore <https://devguide.python.org/developer-workflow/development-cycle/index.html#end-of-life-branches>`__. - Drop support for Django 2.0 and 2.1. These versions `are not maintained anymore <https://www.djangoproject.com/download/#supported-versions>`__. - Remove deprecated ``force_flush`` from ``SQLAlchemyModelFactory`` options. Use ``sqlalchemy_session_persistence = "flush"`` instead. - Drop deprecated ``attributes()`` from :class:`~factory.Factory` subclasses; use ``factory.make_factory(dict, FactoryClass._meta.pre_declarations)`` instead. - Drop deprecated ``declarations()`` from :class:`~factory.Factory` subclasses; use ``FactoryClass._meta.pre_declarations`` instead. - Drop ``factory.compat`` module. *New:* - Add support for Python 3.8 - Add support for Django 2.2 and 3.0 - Report misconfiguration when a :py:class:`~factory.Factory` is used as the :py:attr:`~factory.Factory.model` for another :py:class:`~factory.Factory`. - Allow configuring the color palette of :py:class:`~factory.django.ImageField`. - :py:meth:`get_random_state()` now represents the state of Faker and ``factory_boy`` fuzzy attributes. - Add SQLAlchemy ``get_or_create`` support *Improvements:* - :issue:`561`: Display a developer-friendly error message when providing a model instead of a factory in a :class:`~factory.declarations.SubFactory` class. *Bug fix:* - Fix issue with SubFactory not preserving signal muting behavior of the used factory, thanks `Patrick Stein <https://github.com/PFStein>`_. - Fix issue with overriding parameters in a Trait, thanks `Grégoire Rocher <https://github.com/cecedille1>`_. - :issue:`598`: Limit ``get_or_create`` behavior to fields specified in ``django_get_or_create``. - :issue:`606`: Re-raise :class:`~django.db.IntegrityError` when ``django_get_or_create`` with multiple fields fails to lookup model using user provided keyword arguments. - :issue:`630`: TypeError masked by __repr__ AttributeError when initializing ``Maybe`` with inconsistent phases. ```Links
- PyPI: https://pypi.org/project/factory-boy - Changelog: https://pyup.io/changelogs/factory-boy/ - Repo: https://github.com/FactoryBoy/factory_boy