ChangeLog

3.3.1 (unreleased)

New:

  • Add support for Django 4.2

  • Add support for Django 5.0

  • Add support for Python 3.12

  • issue 903: Add basic typing annotations

Bugfix:

Removed:

  • Drop support for Django 4.0

3.3.0 (2023-07-19)

New:

Bugfix:

  • Make mute_signals() mute signals during post-generation.

  • issue 775: Change the signature for _save() and _get_or_create() to avoid argument names clashes with a field named session.

Deprecated:

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

  • Drop support for Python 3.7

3.2.1 (2021-10-26)

New:
  • Add support for Django 3.2

Bugfix:

  • Do not override signals receivers registered in a mute_signals() context.

  • issue 775: Change the signature for _save() and _get_or_create() to avoid argument names clashes with a field named session.

3.2.0 (2020-12-28)

New:

  • Add support for Django 3.1

  • Add support for Python 3.9

Removed:

Deprecated:

Bug fix:

3.1.0 (2020-10-02)

New:

  • Allow all types of declarations in factory.Faker calls - enables references to other faker-defined attributes.

3.0.1 (2020-08-13)

Bug fix:

  • issue 769: Fix import factory; factory.django.DjangoModelFactory and similar calls.

3.0.0 (2020-08-12)

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.

  • Drop support for Django 2.0 and 2.1. These versions are not maintained anymore.

  • Remove deprecated force_flush from SQLAlchemyModelFactory options. Use sqlalchemy_session_persistence = "flush" instead.

  • Drop deprecated attributes() from Factory subclasses; use factory.make_factory(dict, FactoryClass._meta.pre_declarations) instead.

  • Drop deprecated declarations() from 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 Factory is used as the model for another Factory.

  • Allow configuring the color palette of ImageField.

  • 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 SubFactory class.

Bug fix:

  • Fix issue with SubFactory not preserving signal muting behavior of the used factory, thanks Patrick Stein.

  • Fix issue with overriding parameters in a Trait, thanks Grégoire Rocher.

  • issue 598: Limit get_or_create behavior to fields specified in django_get_or_create.

  • issue 606: Re-raise 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.

2.12.0 (2019-05-11)

New:

  • Add support for Python 3.7

  • Add support for Django 2.1

  • Add getter to FuzzyChoice that mimics the behavior of getter in Iterator

  • Make the extra_kwargs parameter of generate() optional

  • Add RelatedFactoryList class for one-to-many support, thanks Sean Harrington.

  • Make the locale argument for Faker keyword-only

Bug fix:

  • Allow renamed arguments to be optional, thanks to Justin Crown.

  • Fix django_get_or_create behavior when using multiple fields with unique=True, thanks to @YPCrumble <https://github.com/YPCrumble>

2.11.1 (2018-05-05)

Bug fix:

  • Fix passing deep context to a SubFactory (Foo(x__y__z=factory.Faker('name'))

2.11.0 (2018-05-05)

Bug fix:

2.10.0 (2018-01-28)

Bug fix:

New:

2.9.2 (2017-08-03)

Bug fix:

  • Fix declaration corruption bug when a factory defined foo__bar__baz=1 and a caller provided a foo__bar=x parameter at call time: this got merged into the factory’s base declarations.

2.9.1 (2017-08-02)

Bug fix:

2.9.0 (2017-07-30)

This version brings massive changes to the core engine, thus reducing the number of corner cases and weird behaviors.

New:

  • issue 275: factory.fuzzy and factory.faker now use the same random seed.

  • Add factory.Maybe, which chooses among two possible declarations based on another field’s value (powers the Trait feature).

  • PostGenerationMethodCall only allows to pass one positional argument; use keyword arguments for extra parameters.

Deprecation:

  • factory.fuzzy.get_random_state is deprecated, factory.random.get_random_state should be used instead.

  • factory.fuzzy.set_random_state is deprecated, factory.random.set_random_state should be used instead.

  • factory.fuzzy.reseed_random is deprecated, factory.random.reseed_random should be used instead.

2.8.1 (2016-12-17)

Bug fix:

  • Fix packaging issues.

2.8.0 (2016-12-17)

New:

  • issue 240: Call post-generation declarations in the order they were declared, thanks to Oleg Pidsadnyi.

  • issue 309: Provide new options for SQLAlchemy session persistence

Bug fix:

  • issue 334: Adjust for the package change in faker

2.7.0 (2016-04-19)

New:

Removed:

Warning

Version 2.7.0 moves all error classes to factory.errors. This breaks existing import statements for any error classes except those importing FactoryError directly from the factory module.

2.6.1 (2016-02-10)

New:

2.6.0 (2015-10-20)

New:

  • Add factory.FactoryOptions.rename to help handle conflicting names (issue 206)

  • Add support for random-yet-realistic values through fake-factory, through the factory.Faker class.

  • factory.Iterator no longer begins iteration of its argument at import time, thus allowing to pass in a lazy iterator such as a Django queryset (i.e factory.Iterator(models.MyThingy.objects.all())).

  • Simplify imports for ORM layers, now available through a simple factory import, at factory.alchemy.SQLAlchemyModelFactory / factory.django.DjangoModelFactory / factory.mongoengine.MongoEngineFactory.

Bug fix:

2.5.2 (2015-04-21)

Bug fix:

  • Add support for Django 1.7/1.8

  • Add support for mongoengine>=0.9.0 / pymongo>=2.1

2.5.1 (2015-03-27)

Bug fix:

2.5.0 (2015-03-26)

New:

Bug fix:

Deprecation:

Warning

Version 2.5.0 removes the ‘auto-magical sequence setup’ bug-and-feature. This could trigger some bugs when tests expected a non-zero sequence reference.

Upgrading

Warning

Version 2.5.0 removes features that were marked as deprecated in v2.4.0.

All FACTORY_*-style attributes are now declared in a class Meta: section:

# Old-style, deprecated
class MyFactory(factory.Factory):
    FACTORY_FOR = models.MyModel
    FACTORY_HIDDEN_ARGS = ['a', 'b', 'c']

# New-style
class MyFactory(factory.Factory):
    class Meta:
        model = models.MyModel
        exclude = ['a', 'b', 'c']

A simple shell command to upgrade the code would be:

# sed -i: inplace update
# grep -l: only file names, not matching lines
sed -i 's/FACTORY_FOR =/class Meta:\n        model =/' $(grep -l FACTORY_FOR $(find . -name '*.py'))

This takes care of all FACTORY_FOR occurrences; the files containing other attributes to rename can be found with grep -R  FACTORY .

2.4.1 (2014-06-23)

Bug fix:

  • Fix overriding deeply inherited attributes (set in one factory, overridden in a subclass, used in a sub-sub-class).

2.4.0 (2014-06-21)

New:

Deprecation:

2.3.1 (2014-01-22)

Bug fix:

2.3.0 (2013-12-25)

New:

2.2.1 (2013-09-24)

Bug fix:

  • Fixed sequence counter for DjangoModelFactory when a factory inherits from another factory relating to an abstract model.

2.2.0 (2013-09-24)

Bug fix:

  • Removed duplicated SQLAlchemyModelFactory lurking in factory (pull request 83)

  • Properly handle sequences within object inheritance chains. If FactoryA inherits from FactoryB, and their associated classes share the same link, sequence counters will be shared (issue 93)

  • Properly handle nested SubFactory overrides

New:

2.1.2 (2013-08-14)

New:

  • The ABSTRACT_FACTORY keyword is now optional, and automatically set to True if neither the Factory subclass nor its parent declare the FACTORY_FOR attribute (issue 74)

2.1.1 (2013-07-02)

Bug fix:

  • Properly retrieve the color keyword argument passed to ImageField

2.1.0 (2013-06-26)

New:

Bug fix

Deprecation:

2.0.2 (2013-04-16)

New:

  • When FACTORY_DJANGO_GET_OR_CREATE is empty, use Model.objects.create() instead of Model.objects.get_or_create.

2.0.1 (2013-04-16)

New:

  • Don’t push defaults to get_or_create when FACTORY_DJANGO_GET_OR_CREATE is not set.

2.0.0 (2013-04-15)

New:

  • Allow overriding the base factory class for make_factory() and friends.

  • Add support for Python3 (Thanks to kmike and nkryptic)

  • The default type for Sequence is now int

  • Fields listed in FACTORY_HIDDEN_ARGS won’t be passed to the associated class’ constructor

  • Add support for get_or_create in DjangoModelFactory, through FACTORY_DJANGO_GET_OR_CREATE.

  • Add support for fuzzy attribute definitions.

  • The Sequence counter can be overridden when calling a generating function

  • Add Dict and List declarations (Closes issue 18).

Removed:

  • Remove associated class discovery

  • Remove InfiniteIterator and infinite_iterator()

  • Remove CircularSubFactory

  • Remove extract_prefix kwarg to post-generation hooks.

  • Stop defaulting to Django’s Foo.objects.create() when “creating” instances

  • Remove STRATEGY_*

  • Remove set_building_function() / set_creation_function()

1.3.0 (2013-03-11)

Warning

This version deprecates many magic or unexplicit features that will be removed in v2.0.0.

Please read the Upgrading section, then run your tests with python -W default to see all remaining warnings.

New

Pending deprecation

The following features have been deprecated and will be removed in an upcoming release.

  • Declarations:
    • InfiniteIterator is deprecated in favor of Iterator

    • CircularSubFactory is deprecated in favor of SubFactory

    • The extract_prefix argument to post_generation() is now deprecated

  • Factory:
    • Usage of set_creation_function() and set_building_function() are now deprecated

    • Implicit associated class discovery is no longer supported, you must set the FACTORY_FOR attribute on all Factory subclasses

Upgrading

This version deprecates a few magic or undocumented features. All warnings will turn into errors starting from v2.0.0.

In order to upgrade client code, apply the following rules:

  • Add a FACTORY_FOR attribute pointing to the target class to each Factory, instead of relying on automatic associated class discovery

  • When using factory_boy for Django models, have each factory inherit from DjangoModelFactory

  • Replace factory.CircularSubFactory('some.module', 'Symbol') with factory.SubFactory('some.module.Symbol')

  • Replace factory.InfiniteIterator(iterable) with factory.Iterator(iterable)

  • Replace @factory.post_generation() with @factory.post_generation

  • Replace factory.set_building_function(SomeFactory, building_function) with an override of the _build() method of SomeFactory

  • Replace factory.set_creation_function(SomeFactory, creation_function) with an override of the _create() method of SomeFactory

1.2.0 (2012-09-08)

New:

  • Add CircularSubFactory to solve circular dependencies between factories

1.1.5 (2012-07-09)

Bug fix:

  • Fix PostGenerationDeclaration and derived classes.

1.1.4 (2012-06-19)

New:

1.1.3 (2012-03-09)

Bug fix:

  • Fix packaging rules

1.1.2 (2012-02-25)

New:

1.1.1 (2012-02-24)

New:

1.1.0 (2012-02-24)

New:

Bug fix:

  • Allow classmethod/staticmethod on factories

Deprecation:

  • Auto-discovery of FACTORY_FOR based on class name is now deprecated

1.0.4 (2011-12-21)

New:

  • Improve the algorithm for populating a Factory attributes dict

  • Add python setup.py test command to run the test suite

  • Allow custom build functions

  • Introduce MOGO_BUILD build function

  • Add support for inheriting from multiple Factory

  • Base Factory classes can now be declared abstract.

  • Provide DjangoModelFactory, whose Sequence counter starts at the next free database id

  • Introduce SelfAttribute, a shortcut for factory.LazyAttribute(lambda o: o.foo.bar.baz.

Bug fix:

1.0.2 (2011-05-16)

New:

1.0.1 (2011-05-13)

New:

  • Allow Factory inheritance

  • Improve handling of custom build/create functions

Bug fix:

1.0.0 (2010-08-22)

New:

  • First version of factory_boy

Credits

See Credits.