
ChangeLog
*********


2.6.0 (XXXX-XX-XX)
==================

*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".

*Bugfix:*

   * issue #201: Properly handle custom Django managers when dealing
     with abstract Django models.

   * issue #212: Fix "factory.django.mute_signals()" to handle
     Django's signal caching

   * issue #228: Don't load "django.apps.apps.get_model()" until
     required

   * issue #219: Stop using "mogo.model.Model.new()", deprecated 4
     years ago.


2.5.2 (2015-04-21)
==================

*Bugfix:*

   * Add support for Django 1.7/1.8

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


2.5.1 (2015-03-27)
==================

*Bugfix:*

   * Respect custom managers in "DjangoModelFactory" (see issue
     #192)

   * Allow passing declarations (e.g "Sequence") as parameters to
     "FileField" and "ImageField".


2.5.0 (2015-03-26)
==================

*New:*

   * Add support for getting/setting "factory.fuzzy"'s random state
     (see issue #175, issue #185).

   * Support lazy evaluation of iterables in
     "factory.fuzzy.FuzzyChoice" (see issue #184).

   * Support non-default databases at the factory level (see issue
     #171)

   * Make "factory.django.FileField" and "factory.django.ImageField"
     non-post_generation, i.e normal fields also available in "save()"
     (see issue #141).

*Bugfix:*

   * Avoid issues when using "factory.django.mute_signals()" on a
     base factory class (see issue #183).

   * Fix limitations of "factory.StubFactory", that can now use
     "factory.SubFactory" and co (see issue #131).

*Deprecation:*

   * Remove deprecated features from *2.4.0 (2014-06-21)*

   * Remove the auto-magical sequence setup (based on the latest
     primary key value in the database) for Django and SQLAlchemy;
     this relates to issues issue #170, issue #153, issue #111, issue
     #103, issue #92, issue #78. See
     https://github.com/rbarrois/factory_boy/commit/13d310f for
     technical details.

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" occurences; the files containing
other attributes to rename can be found with "grep -R  FACTORY ."


2.4.1 (2014-06-23)
==================

*Bugfix:*

   * 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:*

   * Add support for "factory.fuzzy.FuzzyInteger.step", thanks to
     ilya-pirogov (issue #120)

   * Add "mute_signals()" decorator to temporarily disable some
     signals, thanks to ilya-pirogov (issue #122)

   * Add "FuzzyFloat" (issue #124)

   * Declare target model and other non-declaration fields in a
     "class Meta" section.

*Deprecation:*

   * Use of "FACTORY_FOR" and other "FACTORY" class-level attributes
     is deprecated and will be removed in 2.5. Those attributes should
     now declared within the "class Meta" attribute:

     For "factory.Factory":

     * Rename "FACTORY_FOR" to "model"

     * Rename "FACTORY_FOR" to "model"

     * Rename "ABSTRACT_FACTORY" to "abstract"

     * Rename "FACTORY_STRATEGY" to "strategy"

     * Rename "FACTORY_ARG_PARAMETERS" to "inline_args"

     * Rename "FACTORY_HIDDEN_ARGS" to "exclude"

     For "factory.django.DjangoModelFactory":

     * Rename "FACTORY_DJANGO_GET_OR_CREATE" to
       "django_get_or_create"

     For "factory.alchemy.SQLAlchemyModelFactory":

     * Rename "FACTORY_SESSION" to "sqlalchemy_session"


2.3.1 (2014-01-22)
==================

*Bugfix:*

   * Fix badly written assert containing state-changing code,
     spotted by chsigi (issue #126)

   * Don't crash when handling objects whose __repr__ is non-pure-
     ascii bytes on Py2, discovered by mbertheau (issue #123) and
     strycore (issue #127)


2.3.0 (2013-12-25)
==================

*New:*

   * Add "FuzzyText", thanks to jdufresne (issue #97)

   * Add "FuzzyDecimal", thanks to thedrow (issue #94)

   * Add support for "EmbeddedDocument", thanks to imiric (issue
     #100)


2.2.1 (2013-09-24)
==================

*Bugfix:*

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


2.2.0 (2013-09-24)
==================

*Bugfix:*

   * Removed duplicated "SQLAlchemyModelFactory" lurking in
     "factory" (issue #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:*

   * The "DjangoModelFactory" now supports the "FACTORY_FOR =
     'myapp.MyModel'" syntax, making it easier to shove all factories
     in a single module (issue #66).

   * Add "factory.debug()" helper for easier backtrace analysis

   * Adding factory support for mongoengine with
     "MongoEngineFactory".


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)
==================

*Bugfix:*

   * Properly retrieve the "color" keyword argument passed to
     "ImageField"


2.1.0 (2013-06-26)
==================

*New:*

   * Add "FuzzyDate" thanks to saulshanabrook

   * Add "FuzzyDateTime" and "FuzzyNaiveDateTime".

   * Add a "factory_parent" attribute to the "LazyStub" passed to
     "LazyAttribute", in order to access fields defined in wrapping
     factories.

   * Move "DjangoModelFactory" and "MogoFactory" to their own
     modules ("factory.django" and "factory.mogo")

   * Add the "reset_sequence()" classmethod to "Factory" to ease
     resetting the sequence counter for a given factory.

   * Add debug messages to "factory" logger.

   * Add a "reset()" method to "Iterator" (issue #63)

   * Add support for the SQLAlchemy ORM through
     "SQLAlchemyModelFactory" (issue #64, thanks to Romain Commandé)

   * Add "factory.django.FileField" and "factory.django.ImageField"
     hooks for related Django model fields (issue #52)

*Bugfix*

   * Properly handle non-integer pks in "DjangoModelFactory" (issue
     #57).

   * Disable "RelatedFactory" generation when a specific value was
     passed (issue #62, thanks to Gabe Koscky)

*Deprecation:*

   * Rename "RelatedFactory"'s "name" argument to
     "factory_related_name" (See issue #58)


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
---

* **Global:**

     * Rewrite the whole documentation

     * Provide a dedicated "MogoFactory" subclass of "Factory"

* **The Factory class:**

     * Better creation/building customization hooks at
       "factory.Factory._build()" and "factory.Factory.create()"

     * Add support for passing non-kwarg parameters to a "Factory"
       wrapped class through "FACTORY_ARG_PARAMETERS".

     * Keep the "FACTORY_FOR" attribute in "Factory" classes

* **Declarations:**

     * Allow "SubFactory" to solve circular dependencies between
       factories

     * Enhance "SelfAttribute" to handle "container" attribute
       fetching

     * Add a "getter" to "Iterator" declarations

     * A "Iterator" may be prevented from cycling by setting its
       "cycle" argument to "False"

     * Allow overriding default arguments in a
       "PostGenerationMethodCall" when generating an instance of the
       factory

     * An object created by a "DjangoModelFactory" will be saved
       again after "PostGeneration" hooks execution


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 automagic 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)
==================

*Bugfix:*

   * Fix "PostGenerationDeclaration" and derived classes.


1.1.4 (2012-06-19)
==================

*New:*

   * Add "use_strategy()" decorator to override a "Factory"'s
     default strategy

   * Improve test running (tox, python2.6/2.7)

   * Introduce "PostGeneration" and "RelatedFactory"


1.1.3 (2012-03-09)
==================

*Bugfix:*

   * Fix packaging rules


1.1.2 (2012-02-25)
==================

*New:*

   * Add "Iterator" and "InfiniteIterator" for "Factory" attribute
     declarations.

   * Provide "generate()" and "simple_generate()", that allow
     specifying the instantiation strategy directly. Also provides
     "generate_batch()" and "simple_generate_batch()".


1.1.1 (2012-02-24)
==================

*New:*

   * Add "build_batch()", "create_batch()" and "stub_batch()", to
     instantiate factories in batch


1.1.0 (2012-02-24)
==================

*New:*

   * Improve the "SelfAttribute" syntax to fetch sub-attributes
     using the "foo.bar" syntax;

   * Add "ContainerAttribute" to fetch attributes from the container
     of a "SubFactory".

   * Provide the "make_factory()" helper: "MyClassFactory =
     make_factory(MyClass, x=3, y=4)"

   * Add "build()", "create()", "stub()" helpers

*Bugfix:*

   * 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".

*Bugfix:*

   * Handle nested "SubFactory"

   * Share sequence counter between parent and subclasses

   * Fix "SubFactory" / "Sequence" interferences


1.0.2 (2011-05-16)
==================

*New:*

   * Introduce "SubFactory"


1.0.1 (2011-05-13)
==================

*New:*

   * Allow "Factory" inheritance

   * Improve handling of custom build/create functions

*Bugfix:*

   * Fix concurrency between "LazyAttribute" and "Sequence"


1.0.0 (2010-08-22)
==================

*New:*

   * First version of factory_boy


Credits
=======

* Initial version by Mark Sandstrom (2010)

* Developed by Raphaël Barrois since 2011
