From 7d7e1450f0f297d4fd7960abde68ffffa6587573 Mon Sep 17 00:00:00 2001 From: Tim Klein Date: Mon, 7 Jun 2021 09:17:04 -0400 Subject: [PATCH 1/3] [-] Fix import of recipe from non-installed-app module - Add unit tests for happy and sad path --- model_bakery/baker.py | 6 +++--- tests/test_baker.py | 27 +++++++++++++++++++++++++++ tests/uninstalled/baker_recipes.py | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 tests/uninstalled/baker_recipes.py diff --git a/model_bakery/baker.py b/model_bakery/baker.py index 7e2257f2..9f1f5f1d 100644 --- a/model_bakery/baker.py +++ b/model_bakery/baker.py @@ -118,10 +118,10 @@ def prepare( def _recipe(name: str) -> Any: app_name, recipe_name = name.rsplit(".", 1) - if "." in app_name: # probably full path, not app name - pkg = app_name - else: + try: pkg = apps.get_app_config(app_name).module.__package__ + except LookupError: + pkg = app_name return import_from_str(".".join((pkg, "baker_recipes", recipe_name))) diff --git a/tests/test_baker.py b/tests/test_baker.py index fe124f04..514ef177 100644 --- a/tests/test_baker.py +++ b/tests/test_baker.py @@ -95,6 +95,33 @@ def test_raise_model_not_found(self): baker.Baker("NonExistingModel") +class TestRecipeFinder: + def test_from_app_module(self): + obj = baker.prepare_recipe("generic.person") + assert isinstance(obj, models.Person) + assert obj.name == "John Doe" + + def test_full_path_from_app_module(self): + obj = baker.prepare_recipe("tests.generic.person") + assert isinstance(obj, models.Person) + assert obj.name == "John Doe" + + def test_from_non_app_module(self): + obj = baker.prepare_recipe("uninstalled.person") + assert isinstance(obj, models.Person) + assert obj.name == "Uninstalled" + + def test_full_path_from_non_app_module(self): + obj = baker.prepare_recipe("tests.uninstalled.person") + assert isinstance(obj, models.Person) + assert obj.name == "Uninstalled" + + def test_raise_on_non_module_path(self): + # Error trying to parse "app_name" + "recipe_name" from provided string + with pytest.raises(ValueError): + baker.prepare_recipe("person") + + @pytest.mark.django_db class TestsBakerCreatesSimpleModel: def test_consider_real_django_fields_only(self): diff --git a/tests/uninstalled/baker_recipes.py b/tests/uninstalled/baker_recipes.py new file mode 100644 index 00000000..b7b6f216 --- /dev/null +++ b/tests/uninstalled/baker_recipes.py @@ -0,0 +1,18 @@ +from django.utils.timezone import now + +from model_bakery.recipe import Recipe + +from tests.generic.models import Person + +person = Recipe( + Person, + name="Uninstalled", + nickname="uninstalled", + age=18, + bio="Uninstalled", + blog="http://uninstalled.com", + days_since_last_login=4, + birthday=now().date(), + appointment=now(), + birth_time=now() +) From 79447f69ef6006c35648063b8ff5fa4f3eb7affa Mon Sep 17 00:00:00 2001 From: Tim Klein Date: Mon, 7 Jun 2021 09:18:55 -0400 Subject: [PATCH 2/3] [-] Lint with isort and black --- tests/generic/baker_recipes.py | 2 +- tests/uninstalled/baker_recipes.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/generic/baker_recipes.py b/tests/generic/baker_recipes.py index 813b7693..f4e27c7a 100644 --- a/tests/generic/baker_recipes.py +++ b/tests/generic/baker_recipes.py @@ -10,8 +10,8 @@ Dog, DummyDefaultFieldsModel, DummyUniqueIntegerFieldModel, - Person, LonelyPerson, + Person, School, ) diff --git a/tests/uninstalled/baker_recipes.py b/tests/uninstalled/baker_recipes.py index b7b6f216..838bbb02 100644 --- a/tests/uninstalled/baker_recipes.py +++ b/tests/uninstalled/baker_recipes.py @@ -1,7 +1,6 @@ from django.utils.timezone import now from model_bakery.recipe import Recipe - from tests.generic.models import Person person = Recipe( @@ -14,5 +13,5 @@ days_since_last_login=4, birthday=now().date(), appointment=now(), - birth_time=now() + birth_time=now(), ) From f95ae1a3d2c2c2a7cb789e821f39325732a5d448 Mon Sep 17 00:00:00 2001 From: Tim Klein Date: Mon, 7 Jun 2021 09:32:32 -0400 Subject: [PATCH 3/3] [-] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bda5a1f9..662e48a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed +- Fixed a bug (introduced in 1.2.1) that was breaking imports of recipes from non-installed-app modules [PR #201](https://github.com/model-bakers/model_bakery/pull/201) + ### Removed ## [1.3.1](https://pypi.org/project/model-bakery/1.3.1/)