Skip to content

Commit

Permalink
Merge pull request #13 from olegpidsadnyi/fixpostgen
Browse files Browse the repository at this point in the history
Fixes post-generation declarations when called via the getfuncargvalue
  • Loading branch information
bubenkoff committed Sep 15, 2015
2 parents f74d6de + fa64f2a commit 968d63d
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 10 deletions.
6 changes: 6 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
Changelog
=========

1.1.3
-----

- circular dependency determination is fixed for the post-generation (olegpidsadnyi)


1.1.2
-----

Expand Down
2 changes: 1 addition & 1 deletion pytest_factoryboy/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""pytest-factoryboy public API."""
from .fixture import register, LazyFixture

__version__ = '1.1.2'
__version__ = '1.1.3'


__all__ = [
Expand Down
26 changes: 17 additions & 9 deletions pytest_factoryboy/fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,23 @@ def attributes(cls, create=False, extra=None):
Factory._meta.postgen_declarations = {}
Factory._meta.exclude = [value for value in Factory._meta.exclude if value in data]

# Extract post-generation context
post_decls = []
if factory_class._meta.postgen_declarations:
for attr, decl in sorted(factory_class._meta.postgen_declarations.items()):
context = decl.extract(attr, data)
if isinstance(decl, factory.RelatedFactory):
factoryboy_request.defer(make_deferred_related(request, request.fixturename, attr))
else:
factoryboy_request.defer(make_deferred_postgen(request, request.fixturename, attr, decl, context))
post_decls.append((attr, decl, decl.extract(attr, data)))

return Factory(**data)
# Create model fixture instance
instance = Factory(**data)

# Defer post-generation declarations
for attr, decl, context in post_decls:
if isinstance(decl, factory.RelatedFactory):
factoryboy_request.defer(make_deferred_related(request, request.fixturename, attr))
else:
factoryboy_request.defer(make_deferred_postgen(request, request.fixturename, instance, attr, decl, context))

return instance


def make_deferred_related(request, fixture, attr):
Expand All @@ -190,11 +198,12 @@ def deferred():
return deferred


def make_deferred_postgen(request, fixture, attr, declaration, context):
def make_deferred_postgen(request, fixture, instance, attr, declaration, context):
"""Make deferred function for the post-generation declaration.
:param request: PyTest request.
:param fixture: Object fixture name e.g. "author".
:param instance: Parent object instance.
:param attr: Declaration attribute name e.g. "register_user".
:param context: Post-generation declaration extraction context.
Expand All @@ -203,10 +212,9 @@ def make_deferred_postgen(request, fixture, attr, declaration, context):
name = SEPARATOR.join((fixture, attr))

def deferred():
obj = request.getfuncargvalue(fixture)
context.value = evaluate(request, request.getfuncargvalue(name))
context.extra = dict((key, evaluate(request, value)) for key, value in context.extra.items())
declaration.call(obj, True, context)
declaration.call(instance, True, context)
deferred.__name__ = name
return deferred

Expand Down
5 changes: 5 additions & 0 deletions tests/test_postgen_dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,8 @@ def test_depends_on_1(depends_on_1):
def test_depends_on_2(depends_on_2):
"""Test that post-generation hooks are done and the value is 1."""
assert depends_on_2.foo.value == 1


def test_getfuncargvalue(request):
"""Test post-generation declarations via the getfuncargvalue."""
assert request.getfuncargvalue('foo')

0 comments on commit 968d63d

Please sign in to comment.