Skip to content

Commit

Permalink
Fix #308 -- do not force defaults for make and prepare
Browse files Browse the repository at this point in the history
PR #292 introduced explicit defaults for `make` and `prepare`,
which were then overwriting custom values in certain cases (explained in #308).

This PR attempts to fix this issue by not having explicit defaults.
  • Loading branch information
amureki committed Jun 30, 2022
1 parent 86414c1 commit 24c1cf1
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 16 deletions.
37 changes: 21 additions & 16 deletions model_bakery/recipe.py
Expand Up @@ -111,22 +111,28 @@ def make(
def make(
self,
_quantity: Optional[int] = None,
make_m2m: bool = False,
_refresh_after_create: bool = False,
_create_files: bool = False,
make_m2m: Optional[bool] = None,
_refresh_after_create: Optional[bool] = None,
_create_files: Optional[bool] = None,
_using: str = "",
_bulk_create: bool = False,
_bulk_create: Optional[bool] = None,
_save_kwargs: Optional[Dict[str, Any]] = None,
**attrs: Any,
) -> Union[M, List[M]]:
defaults = {
"_quantity": _quantity,
"make_m2m": make_m2m,
"_refresh_after_create": _refresh_after_create,
"_create_files": _create_files,
"_bulk_create": _bulk_create,
"_save_kwargs": _save_kwargs,
}
defaults = {}
if _quantity is not None:
defaults["_quantity"] = _quantity
if make_m2m is not None:
defaults["make_m2m"] = make_m2m
if _refresh_after_create is not None:
defaults["_refresh_after_create"] = _refresh_after_create
if _create_files is not None:
defaults["_create_files"] = _create_files
if _bulk_create is not None:
defaults["_bulk_create"] = _bulk_create
if _save_kwargs is not None:
defaults["_save_kwargs"] = _save_kwargs

defaults.update(attrs)
return baker.make(self._model, _using=_using, **self._mapping(_using, defaults))

Expand Down Expand Up @@ -157,10 +163,9 @@ def prepare(
_using: str = "",
**attrs: Any,
) -> Union[M, List[M]]:
defaults = {
"_quantity": _quantity,
"_save_related": _save_related,
}
defaults = {"_save_related": _save_related}
if _quantity is not None:
defaults["_quantity"] = _quantity
defaults.update(attrs)
return baker.prepare(
self._model, _using=_using, **self._mapping(_using, defaults)
Expand Down
4 changes: 4 additions & 0 deletions tests/generic/baker_recipes.py
Expand Up @@ -113,6 +113,10 @@ class SmallDogRecipe(Recipe):

overrided_save = Recipe("generic.ModelWithOverridedSave")

with_save_kwargs = Recipe(
"generic.ModelWithSaveKwargs", _save_kwargs={"breed": "updated_breed"}
)

ip_fields = Recipe(
"generic.DummyGenericIPAddressFieldModel",
ipv4_field=seq("127.0.0.", increment_by=2),
Expand Down
6 changes: 6 additions & 0 deletions tests/generic/models.py
Expand Up @@ -226,6 +226,12 @@ def save(self, *args, **kwargs):
return super(ModelWithOverridedSave, self).save(*args, **kwargs)


class ModelWithSaveKwargs(Dog):
def save(self, *args, **kwargs):
self.breed = kwargs.pop("breed")
return super(ModelWithSaveKwargs, self).save(*args, **kwargs)


class Classroom(models.Model):
students = models.ManyToManyField(Person, null=True)
active = models.BooleanField(null=True)
Expand Down
4 changes: 4 additions & 0 deletions tests/test_recipes.py
Expand Up @@ -332,6 +332,10 @@ def test_pass_save_kwargs(self):
)
assert owner == dog.owner

def test_pass_save_kwargs_in_recipe_definition(self):
dog = baker.make_recipe("tests.generic.with_save_kwargs")
assert dog.breed == "updated_breed"

def test_ip_fields_with_start(self):
first, second = baker.make_recipe("tests.generic.ip_fields", _quantity=2)

Expand Down

0 comments on commit 24c1cf1

Please sign in to comment.