From f8fa86380c162aeb5b72a291491ff4dc9af3af38 Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Tue, 26 Nov 2019 17:27:27 -0300 Subject: [PATCH 1/6] adding black as code formatter --- .pre-commit-config.yaml | 4 ++++ .travis.yml | 2 ++ dev_requirements.txt | 3 ++- tox.ini | 6 ++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cf13fa55..7be1e9dc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,3 +15,7 @@ repos: rev: 4.0.1 hooks: - id: pydocstyle +- repo: https://github.com/ambv/black + rev: stable + hooks: + - id: black diff --git a/.travis.yml b/.travis.yml index 98effae7..25d7d60a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ jobs: include: - env: TOXENV=flake8 python: 3.7 + - env: TOXENV=black + python: 3.7 - env: TOXENV=py35-django111-{postgresql,sqlite} python: 3.5 - env: TOXENV=py36-django111-{postgresql,sqlite} diff --git a/dev_requirements.txt b/dev_requirements.txt index 1bf8f9c8..16c26307 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1,9 +1,10 @@ -r requirements.txt +black pillow pre-commit pytest pytest-django sphinx tox -wheel twine==2.0.0 +wheel diff --git a/tox.ini b/tox.ini index fb1a8143..19bd0e69 100644 --- a/tox.ini +++ b/tox.ini @@ -4,6 +4,7 @@ envlist = py36-django{111,20,21,22}-{postgresql,sqlite} py37-django{111,20,21,22}-{postgresql,sqlite} flake8 + black [testenv] setenv = @@ -31,3 +32,8 @@ commands = deps=flake8 basepython=python3 commands=flake8 model_bakery {posargs} + +[testenv:black] +deps=black +basepython=python3 +commands=black . --check From 6421205917f718089d17cbabb476b9522bc65f05 Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Tue, 26 Nov 2019 17:34:26 -0300 Subject: [PATCH 2/6] updating tests files according to black --- tests/conftest.py | 51 +-- tests/generic/baker_recipes.py | 94 ++-- tests/generic/fields.py | 3 +- tests/generic/forms.py | 2 +- tests/generic/generators.py | 2 +- tests/generic/models.py | 109 +++-- .../tests/sub_package/baker_recipes.py | 10 +- tests/test_baker.py | 243 +++++----- tests/test_extending_bakery.py | 25 +- tests/test_filling_fields.py | 209 ++++----- tests/test_recipes.py | 421 +++++++++--------- tests/test_utils.py | 6 +- 12 files changed, 566 insertions(+), 609 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 2ce9e200..ec871e1a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,39 +5,36 @@ def pytest_configure(): - test_db = os.environ.get('TEST_DB', 'sqlite') + test_db = os.environ.get("TEST_DB", "sqlite") installed_apps = [ - 'django.contrib.contenttypes', + "django.contrib.contenttypes", + "tests.generic", + "tests.ambiguous", + "tests.ambiguous2", + ] - 'tests.generic', - 'tests.ambiguous', - 'tests.ambiguous2', - ] - - if test_db == 'sqlite': - db_engine = 'django.db.backends.sqlite3' - db_name = ':memory:' - elif test_db == 'postgresql': - db_engine = 'django.db.backends.postgresql_psycopg2' - db_name = 'postgres' - installed_apps = ['django.contrib.postgres'] + installed_apps - elif test_db == 'postgis': - db_engine = 'django.contrib.gis.db.backends.postgis' - db_name = 'postgres' - installed_apps = ['django.contrib.postgres', 'django.contrib.gis'] + installed_apps + if test_db == "sqlite": + db_engine = "django.db.backends.sqlite3" + db_name = ":memory:" + elif test_db == "postgresql": + db_engine = "django.db.backends.postgresql_psycopg2" + db_name = "postgres" + installed_apps = ["django.contrib.postgres"] + installed_apps + elif test_db == "postgis": + db_engine = "django.contrib.gis.db.backends.postgis" + db_name = "postgres" + installed_apps = [ + "django.contrib.postgres", + "django.contrib.gis", + ] + installed_apps else: - raise NotImplementedError('Tests for % are not supported', test_db) + raise NotImplementedError("Tests for % are not supported", test_db) settings.configure( - DATABASES={ - 'default': { - 'ENGINE': db_engine, - 'NAME': db_name, - } - }, + DATABASES={"default": {"ENGINE": db_engine, "NAME": db_name}}, INSTALLED_APPS=installed_apps, - LANGUAGE_CODE='en', + LANGUAGE_CODE="en", SITE_ID=1, MIDDLEWARE=(), - USE_TZ=os.environ.get('USE_TZ', False) + USE_TZ=os.environ.get("USE_TZ", False), ) django.setup() diff --git a/tests/generic/baker_recipes.py b/tests/generic/baker_recipes.py index cda227a2..79b12a48 100644 --- a/tests/generic/baker_recipes.py +++ b/tests/generic/baker_recipes.py @@ -3,78 +3,63 @@ from model_bakery.recipe import Recipe, foreign_key, seq from model_bakery.recipe import related from model_bakery.timezone import now -from tests.generic.models import TEST_TIME, Person, Dog, DummyDefaultFieldsModel, \ - DummyUniqueIntegerFieldModel +from tests.generic.models import ( + TEST_TIME, + Person, + Dog, + DummyDefaultFieldsModel, + DummyUniqueIntegerFieldModel, +) from datetime import timedelta person = Recipe( Person, - name='John Doe', - nickname='joe', + name="John Doe", + nickname="joe", age=18, - bio='Someone in the crowd', - blog='http://joe.blogspot.com', + bio="Someone in the crowd", + blog="http://joe.blogspot.com", wanted_games_qtd=4, birthday=now().date(), appointment=now(), - birth_time=now() + birth_time=now(), ) -serial_person = Recipe( - Person, - name=seq('joe'), -) +serial_person = Recipe(Person, name=seq("joe"),) serial_numbers = Recipe( DummyDefaultFieldsModel, - default_decimal_field=seq(Decimal('20.1')), + default_decimal_field=seq(Decimal("20.1")), default_int_field=seq(10), - default_float_field=seq(1.23) + default_float_field=seq(1.23), ) serial_numbers_by = Recipe( DummyDefaultFieldsModel, - default_decimal_field=seq(Decimal('20.1'), increment_by=Decimal('2.4')), + default_decimal_field=seq(Decimal("20.1"), increment_by=Decimal("2.4")), default_int_field=seq(10, increment_by=3), - default_float_field=seq(1.23, increment_by=1.8) + default_float_field=seq(1.23, increment_by=1.8), ) serial_datetime = Recipe( DummyDefaultFieldsModel, default_date_field=seq(TEST_TIME.date(), timedelta(days=1)), default_date_time_field=seq(TEST_TIME, timedelta(hours=3)), - default_time_field=seq(TEST_TIME.time(), timedelta(seconds=15)) + default_time_field=seq(TEST_TIME.time(), timedelta(seconds=15)), ) -dog = Recipe( - Dog, - breed='Pug', - owner=foreign_key(person) -) +dog = Recipe(Dog, breed="Pug", owner=foreign_key(person)) -homeless_dog = Recipe( - Dog, - breed='Pug', -) +homeless_dog = Recipe(Dog, breed="Pug",) -other_dog = Recipe( - Dog, - breed='Basset', - owner=foreign_key('person') -) +other_dog = Recipe(Dog, breed="Basset", owner=foreign_key("person")) -dog_with_friends = dog.extend( - friends_with=related(dog, dog), -) +dog_with_friends = dog.extend(friends_with=related(dog, dog),) -dog_with_more_friends = dog.extend( - friends_with=related(dog_with_friends), -) +dog_with_more_friends = dog.extend(friends_with=related(dog_with_friends),) -extended_dog = dog.extend( - breed='Super basset', -) +extended_dog = dog.extend(breed="Super basset",) class SmallDogRecipe(Recipe): @@ -84,36 +69,23 @@ class SmallDogRecipe(Recipe): small_dog = SmallDogRecipe(Dog) -pug = small_dog.extend( - breed='Pug', -) +pug = small_dog.extend(breed="Pug",) -other_dog_unicode = Recipe( - Dog, - breed='Basset', - owner=foreign_key('person') -) +other_dog_unicode = Recipe(Dog, breed="Basset", owner=foreign_key("person")) -dummy_unique_field = Recipe( - DummyUniqueIntegerFieldModel, - value=seq(10), -) +dummy_unique_field = Recipe(DummyUniqueIntegerFieldModel, value=seq(10),) -dog_lady = Recipe( - Person, - dog_set=related('dog', other_dog) -) +dog_lady = Recipe(Person, dog_set=related("dog", other_dog)) nullable_related = Recipe( - 'generic.DummyBlankFieldsModel', - dummynullfieldsmodel_set=related(Recipe('generic.DummyNullFieldsModel')) + "generic.DummyBlankFieldsModel", + dummynullfieldsmodel_set=related(Recipe("generic.DummyNullFieldsModel")), ) -cast_member = Recipe('generic.CastMember', person=foreign_key(person)) +cast_member = Recipe("generic.CastMember", person=foreign_key(person)) movie_with_cast = Recipe( - 'generic.Movie', - cast_members=related(cast_member, cast_member) + "generic.Movie", cast_members=related(cast_member, cast_member) ) -overrided_save = Recipe('generic.ModelWithOverridedSave') +overrided_save = Recipe("generic.ModelWithOverridedSave") diff --git a/tests/generic/fields.py b/tests/generic/fields.py index 492a2e1a..d76eae84 100644 --- a/tests/generic/fields.py +++ b/tests/generic/fields.py @@ -10,12 +10,11 @@ class CustomFieldWithoutGenerator(models.TextField): class FakeListField(models.TextField): - def to_python(self, value): return value.split() def get_prep_value(self, value): - return ' '.join(value) + return " ".join(value) class CustomForeignKey(models.ForeignKey): diff --git a/tests/generic/forms.py b/tests/generic/forms.py index c2bbcc8c..8db28b6d 100644 --- a/tests/generic/forms.py +++ b/tests/generic/forms.py @@ -6,5 +6,5 @@ class DummyGenericIPAddressFieldForm(ModelForm): class Meta: - fields = ('ipv4_field', 'ipv6_field', 'ipv46_field') + fields = ("ipv4_field", "ipv6_field", "ipv46_field") model = DummyGenericIPAddressFieldModel diff --git a/tests/generic/generators.py b/tests/generic/generators.py index b013e26f..bd3b93c4 100644 --- a/tests/generic/generators.py +++ b/tests/generic/generators.py @@ -1,2 +1,2 @@ def gen_value_string(): - return 'value' + return "value" diff --git a/tests/generic/models.py b/tests/generic/models.py index a4277a62..58573b45 100755 --- a/tests/generic/models.py +++ b/tests/generic/models.py @@ -14,7 +14,10 @@ from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey from .fields import ( - CustomFieldWithGenerator, CustomFieldWithoutGenerator, FakeListField, CustomForeignKey + CustomFieldWithGenerator, + CustomFieldWithoutGenerator, + FakeListField, + CustomForeignKey, ) from model_bakery.timezone import smart_datetime as datetime @@ -32,18 +35,15 @@ from django.db import models GENDER_CHOICES = [ - ('M', 'male'), - ('F', 'female'), - ('N', 'non-binary'), + ("M", "male"), + ("F", "female"), + ("N", "non-binary"), ] OCCUPATION_CHOICES = ( - ('Service Industry', ( - ('waitress', 'Waitress'), - ('bartender', 'Bartender'))), - ('Education', ( - ('teacher', 'Teacher'), - ('principal', 'Principal')))) + ("Service Industry", (("waitress", "Waitress"), ("bartender", "Bartender"))), + ("Education", (("teacher", "Teacher"), ("principal", "Principal"))), +) TEST_TIME = base_datetime.datetime(2014, 7, 21, 15, 39, 58, 457698) @@ -57,7 +57,9 @@ class Profile(models.Model): class User(models.Model): - profile = models.ForeignKey(Profile, blank=True, null=True, on_delete=models.CASCADE) + profile = models.ForeignKey( + Profile, blank=True, null=True, on_delete=models.CASCADE + ) class PaymentBill(models.Model): @@ -87,7 +89,12 @@ class Person(models.Model): try: from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField - from django.contrib.postgres.fields.citext import CICharField, CIEmailField, CITextField + from django.contrib.postgres.fields.citext import ( + CICharField, + CIEmailField, + CITextField, + ) + acquaintances = ArrayField(models.IntegerField()) data = JSONField() hstore_data = HStoreField() @@ -111,12 +118,12 @@ class Person(models.Model): class Dog(models.Model): class Meta: - order_with_respect_to = 'owner' + order_with_respect_to = "owner" - owner = models.ForeignKey('Person', on_delete=models.CASCADE) + owner = models.ForeignKey("Person", on_delete=models.CASCADE) breed = models.CharField(max_length=50) created = models.DateTimeField(auto_now_add=True) - friends_with = models.ManyToManyField('Dog') + friends_with = models.ManyToManyField("Dog") class GuardDog(Dog): @@ -125,8 +132,8 @@ class GuardDog(Dog): class Home(models.Model): address = models.CharField(max_length=200) - owner = models.ForeignKey('Person', on_delete=models.CASCADE) - dogs = models.ManyToManyField('Dog') + owner = models.ForeignKey("Person", on_delete=models.CASCADE) + dogs = models.ManyToManyField("Dog") class LonelyPerson(models.Model): @@ -135,14 +142,17 @@ class LonelyPerson(models.Model): class RelatedNamesModel(models.Model): name = models.CharField(max_length=256) - one_to_one = models.OneToOneField(Person, related_name='one_related', on_delete=models.CASCADE) - foreign_key = models.ForeignKey(Person, related_name='fk_related', on_delete=models.CASCADE) + one_to_one = models.OneToOneField( + Person, related_name="one_related", on_delete=models.CASCADE + ) + foreign_key = models.ForeignKey( + Person, related_name="fk_related", on_delete=models.CASCADE + ) class ModelWithOverridedSave(Dog): - def save(self, *args, **kwargs): - self.owner = kwargs.pop('owner') + self.owner = kwargs.pop("owner") return super(ModelWithOverridedSave, self).save(*args, **kwargs) @@ -152,9 +162,11 @@ class Classroom(models.Model): class Store(models.Model): - customers = models.ManyToManyField(Person, related_name='favorite_stores') - employees = models.ManyToManyField(Person, related_name='employers') - suppliers = models.ManyToManyField(Person, related_name='suppliers', blank=True, null=True) + customers = models.ManyToManyField(Person, related_name="favorite_stores") + employees = models.ManyToManyField(Person, related_name="employers") + suppliers = models.ManyToManyField( + Person, related_name="suppliers", blank=True, null=True + ) class DummyEmptyModel(models.Model): @@ -194,7 +206,7 @@ class UnsupportedModel(models.Model): class DummyGenericForeignKeyModel(models.Model): content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() - content_object = GenericForeignKey('content_type', 'object_id') + content_object = GenericForeignKey("content_type", "object_id") class DummyGenericRelationModel(models.Model): @@ -203,9 +215,7 @@ class DummyGenericRelationModel(models.Model): class DummyNullFieldsModel(models.Model): null_foreign_key = models.ForeignKey( - 'DummyBlankFieldsModel', - null=True, - on_delete=models.CASCADE + "DummyBlankFieldsModel", null=True, on_delete=models.CASCADE ) null_integer_field = models.IntegerField(null=True) @@ -217,17 +227,18 @@ class DummyBlankFieldsModel(models.Model): class DummyDefaultFieldsModel(models.Model): default_id = models.AutoField(primary_key=True) - default_char_field = models.CharField(max_length=50, default='default') - default_text_field = models.TextField(default='default') + default_char_field = models.CharField(max_length=50, default="default") + default_text_field = models.TextField(default="default") default_int_field = models.IntegerField(default=123) default_float_field = models.FloatField(default=123.0) - default_date_field = models.DateField(default='2012-01-01') + default_date_field = models.DateField(default="2012-01-01") default_date_time_field = models.DateTimeField(default=datetime(2012, 1, 1)) - default_time_field = models.TimeField(default='00:00:00') - default_decimal_field = models.DecimalField(max_digits=5, decimal_places=2, - default=Decimal('0')) - default_email_field = models.EmailField(default='foo@bar.org') - default_slug_field = models.SlugField(default='a-slug') + default_time_field = models.TimeField(default="00:00:00") + default_decimal_field = models.DecimalField( + max_digits=5, decimal_places=2, default=Decimal("0") + ) + default_email_field = models.EmailField(default="foo@bar.org") + default_slug_field = models.SlugField(default="a-slug") class DummyFileFieldModel(models.Model): @@ -236,9 +247,12 @@ class DummyFileFieldModel(models.Model): if has_pil: + class DummyImageFieldModel(models.Model): fs = FileSystemStorage(location=gettempdir()) image_field = models.ImageField(upload_to="%Y/%m/%d", storage=fs) + + else: # doesn't matter, won't be using class DummyImageFieldModel(models.Model): @@ -256,7 +270,7 @@ class Ambiguous(models.Model): class School(models.Model): name = models.CharField(max_length=10) - students = models.ManyToManyField(Person, through='SchoolEnrollment') + students = models.ManyToManyField(Person, through="SchoolEnrollment") class SchoolEnrollment(models.Model): @@ -278,7 +292,9 @@ class CustomFieldWithoutGeneratorModel(models.Model): class CustomForeignKeyWithGeneratorModel(models.Model): - custom_fk = CustomForeignKey(Profile, blank=True, null=True, on_delete=models.CASCADE) + custom_fk = CustomForeignKey( + Profile, blank=True, null=True, on_delete=models.CASCADE + ) class DummyUniqueIntegerFieldModel(models.Model): @@ -289,7 +305,7 @@ class ModelWithNext(models.Model): attr = models.CharField(max_length=10) def next(self): - return 'foo' + return "foo" class BaseModelForNext(models.Model): @@ -311,10 +327,7 @@ def get_queryset(self): We want to test whether this annotation has been run after calling baker.make(). """ - return ( - super(MovieManager, self).get_queryset() - .annotate(name=models.F('title')) - ) + return super(MovieManager, self).get_queryset().annotate(name=models.F("title")) class MovieWithAnnotation(Movie): @@ -322,14 +335,16 @@ class MovieWithAnnotation(Movie): class CastMember(models.Model): - movie = models.ForeignKey(Movie, related_name='cast_members', on_delete=models.CASCADE) + movie = models.ForeignKey( + Movie, related_name="cast_members", on_delete=models.CASCADE + ) person = models.ForeignKey(Person, on_delete=models.CASCADE) class DummyGenericIPAddressFieldModel(models.Model): - ipv4_field = models.GenericIPAddressField(protocol='IPv4') - ipv6_field = models.GenericIPAddressField(protocol='IPv6') - ipv46_field = models.GenericIPAddressField(protocol='both') + ipv4_field = models.GenericIPAddressField(protocol="IPv4") + ipv6_field = models.GenericIPAddressField(protocol="IPv6") + ipv46_field = models.GenericIPAddressField(protocol="both") class AbstractModel(models.Model): diff --git a/tests/generic/tests/sub_package/baker_recipes.py b/tests/generic/tests/sub_package/baker_recipes.py index b977eb7a..8d22ce17 100644 --- a/tests/generic/tests/sub_package/baker_recipes.py +++ b/tests/generic/tests/sub_package/baker_recipes.py @@ -5,13 +5,13 @@ person = Recipe( Person, - name='John Deeper', - nickname='joe', + name="John Deeper", + nickname="joe", age=18, - bio='Someone in the crowd', - blog='http://joe.blogspot.com', + bio="Someone in the crowd", + blog="http://joe.blogspot.com", wanted_games_qtd=4, birthday=date.today(), appointment=datetime.now(), - birth_time=datetime.now + birth_time=datetime.now, ) diff --git a/tests/test_baker.py b/tests/test_baker.py index ae972c30..4c1ae3a3 100644 --- a/tests/test_baker.py +++ b/tests/test_baker.py @@ -8,17 +8,20 @@ from model_bakery import baker from model_bakery import random_gen -from model_bakery.exceptions import ModelNotFound, AmbiguousModelName, InvalidQuantityException +from model_bakery.exceptions import ( + ModelNotFound, + AmbiguousModelName, + InvalidQuantityException, +) from model_bakery.timezone import smart_datetime from tests.generic import models from tests.generic.forms import DummyGenericIPAddressFieldForm -class TestsModelFinder(): - +class TestsModelFinder: def test_unicode_regression(self): - obj = baker.prepare('generic.Person') + obj = baker.prepare("generic.Person") assert isinstance(obj, models.Person) def test_model_class(self): @@ -26,38 +29,37 @@ def test_model_class(self): assert isinstance(obj, models.Person) def test_app_model_string(self): - obj = baker.prepare('generic.Person') + obj = baker.prepare("generic.Person") assert isinstance(obj, models.Person) def test_model_string(self): - obj = baker.prepare('Person') + obj = baker.prepare("Person") assert isinstance(obj, models.Person) def test_raise_on_ambiguous_model_string(self): with pytest.raises(AmbiguousModelName): - baker.prepare('Ambiguous') + baker.prepare("Ambiguous") def test_raise_model_not_found(self): with pytest.raises(ModelNotFound): - baker.Baker('non_existing.Model') + baker.Baker("non_existing.Model") with pytest.raises(ModelNotFound): - baker.Baker('NonExistingModel') + baker.Baker("NonExistingModel") @pytest.mark.django_db -class TestsBakerCreatesSimpleModel(): - +class TestsBakerCreatesSimpleModel: def test_consider_real_django_fields_only(self): - id_ = models.ModelWithImpostorField._meta.get_field('id') - with patch.object(baker.Baker, 'get_fields') as mock: + id_ = models.ModelWithImpostorField._meta.get_field("id") + with patch.object(baker.Baker, "get_fields") as mock: f = Manager() - f.name = 'foo' + f.name = "foo" mock.return_value = [id_, f] try: baker.make(models.ModelWithImpostorField) except TypeError: - assert False, 'TypeError raised' + assert False, "TypeError raised" def test_make_should_create_one_object(self): person = baker.make(models.Person) @@ -75,16 +77,16 @@ def test_prepare_should_not_persist_one_object(self): assert person.id is None def test_non_abstract_model_creation(self): - person = baker.make(models.NonAbstractPerson, name='bob', happy=False) + person = baker.make(models.NonAbstractPerson, name="bob", happy=False) assert isinstance(person, models.NonAbstractPerson) - assert 'bob' == person.name + assert "bob" == person.name assert person.happy is False def test_abstract_model_subclass_creation(self): instance = baker.make(models.SubclassOfAbstract) assert isinstance(instance, models.SubclassOfAbstract) assert isinstance(instance, models.AbstractModel) - assert isinstance(instance.name, type(u'')) + assert isinstance(instance.name, type(u"")) assert len(instance.name) == 30 assert isinstance(instance.height, int) @@ -98,8 +100,7 @@ def test_multiple_inheritance_creation(self): @pytest.mark.django_db -class TestsBakerRepeatedCreatesSimpleModel(): - +class TestsBakerRepeatedCreatesSimpleModel: def test_make_should_create_objects_respecting_quantity_parameter(self): people = baker.make(models.Person, _quantity=5) assert models.Person.objects.count() == 5 @@ -133,8 +134,7 @@ def test_prepare_raises_correct_exception_if_invalid_quantity(self): @pytest.mark.django_db -class TestBakerPrepareSavingRelatedInstances(): - +class TestBakerPrepareSavingRelatedInstances: def test_default_behaviour_for_and_fk(self): dog = baker.prepare(models.Dog) @@ -172,8 +172,7 @@ def test_create_one_to_one(self): @pytest.mark.django_db -class TestBakerCreatesAssociatedModels(): - +class TestBakerCreatesAssociatedModels: def test_dependent_models_with_ForeignKey(self): dog = baker.make(models.Dog) assert isinstance(dog.owner, models.Person) @@ -206,30 +205,22 @@ def test_auto_now_add_on_parent_should_work(self): assert dog.created def test_attrs_on_related_model_through_parent(self): - baker.make(models.GuardDog, owner__name='john') + baker.make(models.GuardDog, owner__name="john") for person in models.Person.objects.all(): - assert person.name == 'john' + assert person.name == "john" def test_access_related_name_of_m2m(self): try: baker.make(models.Person, classroom_set=[baker.make(models.Classroom)]) except TypeError: - assert False, 'type error raised' + assert False, "type error raised" def test_save_object_instances_when_handling_one_to_many_relations(self): owner = baker.make(models.Person) - dogs_set = baker.prepare( - models.Dog, - owner=owner, - _quantity=2, - ) + dogs_set = baker.prepare(models.Dog, owner=owner, _quantity=2,) assert 0 == models.Dog.objects.count() # ensure there're no dogs in our db - home = baker.make( - models.Home, - owner=owner, - dogs=dogs_set, - ) + home = baker.make(models.Home, owner=owner, dogs=dogs_set,) assert home.dogs.count() == 2 assert 2 == models.Dog.objects.count() # dogs in dogs_set were created @@ -296,37 +287,37 @@ def test_m2m_changed_signal_is_fired(self): def test_m2m_changed(*args, **kwargs): self.m2m_changed_fired = True - m2m_changed.connect(test_m2m_changed, dispatch_uid='test_m2m_changed') + m2m_changed.connect(test_m2m_changed, dispatch_uid="test_m2m_changed") baker.make(models.Store, make_m2m=True) assert self.m2m_changed_fired def test_simple_creating_person_with_parameters(self): - kid = baker.make(models.Person, happy=True, age=10, name='Mike') + kid = baker.make(models.Person, happy=True, age=10, name="Mike") assert kid.age == 10 assert kid.happy is True - assert kid.name == 'Mike' + assert kid.name == "Mike" def test_creating_person_from_factory_using_paramters(self): person_baker_ = baker.Baker(models.Person) - person = person_baker_.make(happy=False, age=20, gender='M', name='John') + person = person_baker_.make(happy=False, age=20, gender="M", name="John") assert person.age == 20 assert person.happy is False - assert person.name == 'John' - assert person.gender == 'M' + assert person.name == "John" + assert person.gender == "M" def test_ForeignKey_model_field_population(self): - dog = baker.make(models.Dog, breed='X1', owner__name='Bob') - assert 'X1' == dog.breed - assert 'Bob' == dog.owner.name + dog = baker.make(models.Dog, breed="X1", owner__name="Bob") + assert "X1" == dog.breed + assert "Bob" == dog.owner.name def test_ForeignKey_model_field_population_should_work_with_prepare(self): - dog = baker.prepare(models.Dog, breed='X1', owner__name='Bob') - assert 'X1' == dog.breed - assert 'Bob' == dog.owner.name + dog = baker.prepare(models.Dog, breed="X1", owner__name="Bob") + assert "X1" == dog.breed + assert "Bob" == dog.owner.name def test_ForeignKey_model_field_population_for_not_required_fk(self): user = baker.make(models.User, profile__email="a@b.com") - assert 'a@b.com' == user.profile.email + assert "a@b.com" == user.profile.email def test_does_not_creates_null_ForeignKey(self): user = baker.make(models.User) @@ -338,46 +329,43 @@ def test_passing_m2m_value(self): def test_ensure_recursive_ForeignKey_population(self): bill = baker.make(models.PaymentBill, user__profile__email="a@b.com") - assert 'a@b.com' == bill.user.profile.email + assert "a@b.com" == bill.user.profile.email def test_field_lookup_for_m2m_relationship(self): - store = baker.make(models.Store, suppliers__gender='M') + store = baker.make(models.Store, suppliers__gender="M") suppliers = store.suppliers.all() assert suppliers for supplier in suppliers: - assert 'M' == supplier.gender + assert "M" == supplier.gender def test_field_lookup_for_one_to_one_relationship(self): - lonely_person = baker.make(models.LonelyPerson, only_friend__name='Bob') - assert 'Bob' == lonely_person.only_friend.name + lonely_person = baker.make(models.LonelyPerson, only_friend__name="Bob") + assert "Bob" == lonely_person.only_friend.name def test_allow_create_fkey_related_model(self): try: - person = baker.make(models.Person, dog_set=[baker.make(models.Dog), - baker.make(models.Dog)]) + person = baker.make( + models.Person, dog_set=[baker.make(models.Dog), baker.make(models.Dog)] + ) except TypeError: - assert False, 'type error raised' + assert False, "type error raised" assert person.dog_set.count() == 2 def test_field_lookup_for_related_field(self): person = baker.make( - models.Person, - one_related__name='Foo', - fk_related__name='Bar', + models.Person, one_related__name="Foo", fk_related__name="Bar", ) assert person.pk assert person.one_related.pk assert 1, person.fk_related.count() - assert 'Foo' == person.one_related.name - assert 'Bar' == person.fk_related.get().name + assert "Foo" == person.one_related.name + assert "Bar" == person.fk_related.get().name def test_field_lookup_for_related_field_does_not_work_with_prepare(self): person = baker.prepare( - models.Person, - one_related__name='Foo', - fk_related__name='Bar', + models.Person, one_related__name="Foo", fk_related__name="Bar", ) assert not person.pk @@ -385,41 +373,38 @@ def test_field_lookup_for_related_field_does_not_work_with_prepare(self): @pytest.mark.django_db -class TestHandlingUnsupportedModels(): - +class TestHandlingUnsupportedModels: def test_unsupported_model_raises_an_explanatory_exception(self): try: baker.make(models.UnsupportedModel) assert False, "Should have raised a TypeError" except TypeError as e: - assert 'not supported' in repr(e) + assert "not supported" in repr(e) @pytest.mark.django_db -class TestHandlingModelsWithGenericRelationFields(): - +class TestHandlingModelsWithGenericRelationFields: def test_create_model_with_generic_relation(self): dummy = baker.make(models.DummyGenericRelationModel) assert isinstance(dummy, models.DummyGenericRelationModel) @pytest.mark.django_db -class TestHandlingContentTypeField(): +class TestHandlingContentTypeField: def test_create_model_with_contenttype_field(self): dummy = baker.make(models.DummyGenericForeignKeyModel) assert isinstance(dummy, models.DummyGenericForeignKeyModel) @pytest.mark.django_db -class TestHandlingContentTypeFieldNoQueries(): +class TestHandlingContentTypeFieldNoQueries: def test_create_model_with_contenttype_field(self): dummy = baker.prepare(models.DummyGenericForeignKeyModel) assert isinstance(dummy, models.DummyGenericForeignKeyModel) @pytest.mark.django_db -class TestSkipNullsTestCase(): - +class TestSkipNullsTestCase: def test_skip_null(self): dummy = baker.make(models.DummyNullFieldsModel) assert dummy.null_foreign_key is None @@ -427,53 +412,58 @@ def test_skip_null(self): @pytest.mark.django_db -class TestFillNullsTestCase(): - +class TestFillNullsTestCase: def test_create_nullable_many_to_many_if_flagged_and_fill_field_optional(self): - classroom = baker.make(models.Classroom, make_m2m=True, _fill_optional=[ - 'students']) + classroom = baker.make( + models.Classroom, make_m2m=True, _fill_optional=["students"] + ) assert classroom.students.count() == 5 def test_create_nullable_many_to_many_if_flagged_and_fill_optional(self): classroom = baker.make(models.Classroom, make_m2m=True, _fill_optional=True) assert classroom.students.count() == 5 - def test_nullable_many_to_many_is_not_created_if_not_flagged_and_fill_optional(self): + def test_nullable_many_to_many_is_not_created_if_not_flagged_and_fill_optional( + self, + ): classroom = baker.make(models.Classroom, make_m2m=False, _fill_optional=True) assert classroom.students.count() == 0 @pytest.mark.django_db -class TestSkipBlanksTestCase(): - +class TestSkipBlanksTestCase: def test_skip_blank(self): dummy = baker.make(models.DummyBlankFieldsModel) - assert dummy.blank_char_field == '' - assert dummy.blank_text_field == '' + assert dummy.blank_char_field == "" + assert dummy.blank_text_field == "" @pytest.mark.django_db -class TestFillBlanksTestCase(): - +class TestFillBlanksTestCase: def test_fill_field_optional(self): - dummy = baker.make(models.DummyBlankFieldsModel, _fill_optional=['blank_char_field']) + dummy = baker.make( + models.DummyBlankFieldsModel, _fill_optional=["blank_char_field"] + ) assert len(dummy.blank_char_field) == 50 def test_fill_wrong_field(self): with pytest.raises(AttributeError) as exc_info: - baker.make(models.DummyBlankFieldsModel, _fill_optional=['blank_char_field', 'wrong']) + baker.make( + models.DummyBlankFieldsModel, + _fill_optional=["blank_char_field", "wrong"], + ) msg = "_fill_optional field(s) ['wrong'] are not related to model DummyBlankFieldsModel" assert msg in str(exc_info.value) def test_fill_wrong_fields_with_parent(self): with pytest.raises(AttributeError): - baker.make(models.SubclassOfAbstract, _fill_optional=['name', 'wrong']) + baker.make(models.SubclassOfAbstract, _fill_optional=["name", "wrong"]) def test_fill_many_optional(self): dummy = baker.make( models.DummyBlankFieldsModel, - _fill_optional=['blank_char_field', 'blank_text_field'] + _fill_optional=["blank_char_field", "blank_text_field"], ) assert len(dummy.blank_text_field) == 300 @@ -488,8 +478,7 @@ def test_fill_optional_with_integer(self): @pytest.mark.django_db -class TestFillAutoFieldsTestCase(): - +class TestFillAutoFieldsTestCase: def test_fill_autofields_with_provided_value(self): baker.make(models.DummyEmptyModel, id=237) saved_dummy = models.DummyEmptyModel.objects.get() @@ -504,40 +493,36 @@ def test_keeps_prepare_autovalues(self): @pytest.mark.django_db -class TestSkipDefaultsTestCase(): - +class TestSkipDefaultsTestCase: def test_skip_fields_with_default(self): dummy = baker.make(models.DummyDefaultFieldsModel) - assert dummy.default_char_field == 'default' - assert dummy.default_text_field == 'default' + assert dummy.default_char_field == "default" + assert dummy.default_text_field == "default" assert dummy.default_int_field == 123 assert dummy.default_float_field == 123.0 - assert dummy.default_date_field == '2012-01-01' + assert dummy.default_date_field == "2012-01-01" assert dummy.default_date_time_field == smart_datetime(2012, 1, 1) - assert dummy.default_time_field == '00:00:00' - assert dummy.default_decimal_field == Decimal('0') - assert dummy.default_email_field == 'foo@bar.org' - assert dummy.default_slug_field == 'a-slug' + assert dummy.default_time_field == "00:00:00" + assert dummy.default_decimal_field == Decimal("0") + assert dummy.default_email_field == "foo@bar.org" + assert dummy.default_slug_field == "a-slug" @pytest.mark.django_db -class TestBakerHandlesModelWithNext(): - +class TestBakerHandlesModelWithNext: def test_creates_instance_for_model_with_next(self): instance = baker.make( - models.BaseModelForNext, - fk=baker.make(models.ModelWithNext), + models.BaseModelForNext, fk=baker.make(models.ModelWithNext), ) assert instance.id assert instance.fk.id assert instance.fk.attr - assert 'foo' == instance.fk.next() + assert "foo" == instance.fk.next() @pytest.mark.django_db -class TestBakerHandlesModelWithList(): - +class TestBakerHandlesModelWithList: def test_creates_instance_for_model_with_list(self): instance = baker.make(models.BaseModelForList, fk=["foo"]) @@ -546,58 +531,56 @@ def test_creates_instance_for_model_with_list(self): @pytest.mark.django_db -class TestBakerGeneratesIPAdresses(): - +class TestBakerGeneratesIPAdresses: def test_create_model_with_valid_ips(self): form_data = { - 'ipv4_field': random_gen.gen_ipv4(), - 'ipv6_field': random_gen.gen_ipv6(), - 'ipv46_field': random_gen.gen_ipv46(), + "ipv4_field": random_gen.gen_ipv4(), + "ipv6_field": random_gen.gen_ipv6(), + "ipv46_field": random_gen.gen_ipv46(), } assert DummyGenericIPAddressFieldForm(form_data).is_valid() @pytest.mark.django_db -class TestBakerAllowsSaveParameters(): - +class TestBakerAllowsSaveParameters: def test_allows_save_kwargs_on_baker_make(self): owner = baker.make(models.Person) - dog = baker.make(models.ModelWithOverridedSave, _save_kwargs={'owner': owner}) + dog = baker.make(models.ModelWithOverridedSave, _save_kwargs={"owner": owner}) assert owner == dog.owner dog1, dog2 = baker.make( - models.ModelWithOverridedSave, - _save_kwargs={'owner': owner}, - _quantity=2 + models.ModelWithOverridedSave, _save_kwargs={"owner": owner}, _quantity=2 ) assert owner == dog1.owner assert owner == dog2.owner @pytest.mark.django_db -class TestBakerAutomaticallyRefreshFromDB(): - +class TestBakerAutomaticallyRefreshFromDB: def test_refresh_from_db_if_true(self): - person = baker.make(models.Person, birthday='2017-02-01', _refresh_after_create=True) + person = baker.make( + models.Person, birthday="2017-02-01", _refresh_after_create=True + ) assert person.birthday == datetime.date(2017, 2, 1) def test_do_not_refresh_from_db_if_false(self): - person = baker.make(models.Person, birthday='2017-02-01', _refresh_after_create=False) + person = baker.make( + models.Person, birthday="2017-02-01", _refresh_after_create=False + ) - assert person.birthday == '2017-02-01' + assert person.birthday == "2017-02-01" assert person.birthday != datetime.date(2017, 2, 1) def test_do_not_refresh_from_db_by_default(self): - person = baker.make(models.Person, birthday='2017-02-01') + person = baker.make(models.Person, birthday="2017-02-01") - assert person.birthday == '2017-02-01' + assert person.birthday == "2017-02-01" assert person.birthday != datetime.date(2017, 2, 1) @pytest.mark.django_db -class TestBakerMakeCanFetchInstanceFromDefaultManager(): - +class TestBakerMakeCanFetchInstanceFromDefaultManager: def test_annotation_within_manager_get_queryset_are_run_on_make(self): """A custom model Manager can be used within make(). @@ -613,8 +596,6 @@ def test_annotation_within_manager_get_queryset_are_run_on_make(self): movie.name movie = baker.make( - models.MovieWithAnnotation, - title='Old Boy', - _from_manager='objects', + models.MovieWithAnnotation, title="Old Boy", _from_manager="objects", ) assert movie.title == movie.name diff --git a/tests/test_extending_bakery.py b/tests/test_extending_bakery.py index 210a0639..4bf33063 100644 --- a/tests/test_extending_bakery.py +++ b/tests/test_extending_bakery.py @@ -17,20 +17,19 @@ def gen_age(): class ExperientBaker(baker.Baker): age_list = range(40, 60) - attr_mapping = {'age': gen_from_list(age_list)} + attr_mapping = {"age": gen_from_list(age_list)} class TeenagerBaker(baker.Baker): - attr_mapping = {'age': gen_age} + attr_mapping = {"age": gen_age} class SadPeopleBaker(baker.Baker): - attr_mapping = {'happy': gen_opposite, 'unhappy': gen_opposite} + attr_mapping = {"happy": gen_opposite, "unhappy": gen_opposite} @pytest.mark.django_db class TestSimpleExtendBaker: - def test_list_generator_respects_values_from_list(self): experient_bakers_factory = ExperientBaker(Person) experient_baker = experient_bakers_factory.make() @@ -40,21 +39,21 @@ def test_list_generator_respects_values_from_list(self): @pytest.mark.django_db class TestLessSimpleExtendBaker: def test_nonexistent_required_field(self): - gen_opposite.required = ['house'] + gen_opposite.required = ["house"] sad_people_factory = SadPeopleBaker(Person) with pytest.raises(AttributeError): sad_people_factory.make() def test_string_to_generator_required(self): - gen_opposite.required = ['default'] - happy_field = Person._meta.get_field('happy') - unhappy_field = Person._meta.get_field('unhappy') + gen_opposite.required = ["default"] + happy_field = Person._meta.get_field("happy") + unhappy_field = Person._meta.get_field("unhappy") sad_people_factory = SadPeopleBaker(Person) person = sad_people_factory.make() assert person.happy is not happy_field.default assert person.unhappy is not unhappy_field.default - @pytest.mark.parametrize('value', [18, 18.5, [], {}, True]) + @pytest.mark.parametrize("value", [18, 18.5, [], {}, True]) def test_fail_pass_non_string_to_generator_required(self, value): teens_bakers_factory = TeenagerBaker(Person) @@ -90,24 +89,24 @@ def prepare(self): class TestCustomizeBakerClassViaSettings: def class_to_import_string(self, class_to_convert): - return '%s.%s' % (self.__module__, class_to_convert.__name__) + return "%s.%s" % (self.__module__, class_to_convert.__name__) def test_create_vanilla_baker_used_by_default(self): baker_instance = baker.Baker.create(Person) assert baker_instance.__class__ == baker.Baker def test_create_fail_on_custom_baker_load_error(self, settings): - settings.BAKER_CUSTOM_CLASS = 'invalid_module.invalid_class' + settings.BAKER_CUSTOM_CLASS = "invalid_module.invalid_class" with pytest.raises(CustomBakerNotFound): baker.Baker.create(Person) - @pytest.mark.parametrize('cls', [ClassWithoutMake, ClassWithoutPrepare]) + @pytest.mark.parametrize("cls", [ClassWithoutMake, ClassWithoutPrepare]) def test_create_fail_on_missing_required_functions(self, settings, cls): settings.BAKER_CUSTOM_CLASS = self.class_to_import_string(cls) with pytest.raises(InvalidCustomBaker): baker.Baker.create(Person) - @pytest.mark.parametrize('cls', [BakerSubclass, BakerDuck]) + @pytest.mark.parametrize("cls", [BakerSubclass, BakerDuck]) def test_create_succeeds_with_valid_custom_baker(self, settings, cls): settings.BAKER_CUSTOM_CLASS = self.class_to_import_string(cls) assert baker.Baker.create(Person).__class__ == cls diff --git a/tests/test_filling_fields.py b/tests/test_filling_fields.py index 40cf7bde..18c1b0f8 100644 --- a/tests/test_filling_fields.py +++ b/tests/test_filling_fields.py @@ -7,7 +7,8 @@ import pytest from django.conf import settings from django.contrib.contenttypes.models import ContentType -from django.core.files import images, File + +# from django.core.files import images, File from django.db import connection from django.db.models import fields, ImageField, FileField @@ -19,7 +20,12 @@ try: from django.contrib.postgres.fields import ( - ArrayField, CICharField, CIEmailField, CITextField, HStoreField, JSONField, + ArrayField, + CICharField, + CIEmailField, + CITextField, + HStoreField, + JSONField, ) except ImportError: ArrayField = None @@ -30,155 +36,148 @@ CITextField = None from django.core.validators import ( - validate_ipv4_address, validate_ipv6_address, validate_ipv46_address + validate_ipv4_address, + validate_ipv6_address, + validate_ipv46_address, ) @pytest.fixture def person(db): - return baker.make('generic.Person') + return baker.make("generic.Person") @pytest.fixture() def custom_cfg(): yield None - if hasattr(settings, 'BAKER_CUSTOM_FIELDS_GEN'): - delattr(settings, 'BAKER_CUSTOM_FIELDS_GEN') - baker.generators.add('tests.generic.fields.CustomFieldWithGenerator', None) - baker.generators.add('django.db.models.fields.CharField', None) - + if hasattr(settings, "BAKER_CUSTOM_FIELDS_GEN"): + delattr(settings, "BAKER_CUSTOM_FIELDS_GEN") + baker.generators.add("tests.generic.fields.CustomFieldWithGenerator", None) + baker.generators.add("django.db.models.fields.CharField", None) -class TestFillingFromChoice(): +class TestFillingFromChoice: def test_if_gender_is_populated_from_choices(self, person): from tests.generic.models import GENDER_CHOICES + person.gender in map(lambda x: x[0], GENDER_CHOICES) def test_if_occupation_populated_from_choices(self, person): from tests.generic.models import OCCUPATION_CHOICES + occupations = [item[0] for list in OCCUPATION_CHOICES for item in list[1]] person.occupation in occupations -class TestStringFieldsFilling(): - +class TestStringFieldsFilling: def test_fill_CharField_with_a_random_str(self, person): - person_name_field = models.Person._meta.get_field('name') + person_name_field = models.Person._meta.get_field("name") assert isinstance(person_name_field, fields.CharField) assert isinstance(person.name, str) assert len(person.name) == person_name_field.max_length def test_fill_SlugField_with_a_random_str(self, person): - person_nickname_field = models.Person._meta.get_field('nickname') + person_nickname_field = models.Person._meta.get_field("nickname") assert isinstance(person_nickname_field, fields.SlugField) assert isinstance(person.nickname, str) assert len(person.nickname) == person_nickname_field.max_length def test_fill_TextField_with_a_random_str(self, person): - person_bio_field = models.Person._meta.get_field('bio') + person_bio_field = models.Person._meta.get_field("bio") assert isinstance(person_bio_field, fields.TextField) assert isinstance(person.bio, str) -class TestBinaryFieldsFilling(): - +class TestBinaryFieldsFilling: def test_fill_BinaryField_with_random_binary(self, person): - name_hash_field = models.Person._meta.get_field('name_hash') + name_hash_field = models.Person._meta.get_field("name_hash") assert isinstance(name_hash_field, fields.BinaryField) name_hash = person.name_hash assert isinstance(name_hash, bytes) assert len(name_hash) == name_hash_field.max_length -class TestsDurationFieldsFilling(): - +class TestsDurationFieldsFilling: def test_fill_DurationField_with_random_interval_in_miliseconds(self, person): - duration_of_sleep_field = models.Person._meta.get_field('duration_of_sleep') + duration_of_sleep_field = models.Person._meta.get_field("duration_of_sleep") assert isinstance(duration_of_sleep_field, fields.DurationField) duration_of_sleep = person.duration_of_sleep - assert isinstance(person.duration_of_sleep, timedelta) + assert isinstance(duration_of_sleep, timedelta) -class TestBooleanFieldsFilling(): - +class TestBooleanFieldsFilling: def test_fill_BooleanField_with_boolean(self, person): - happy_field = models.Person._meta.get_field('happy') + happy_field = models.Person._meta.get_field("happy") assert isinstance(happy_field, fields.BooleanField) assert isinstance(person.happy, bool) assert person.happy is True def test_fill_BooleanField_with_false_if_default_is_false(self, person): - unhappy_field = models.Person._meta.get_field('unhappy') + unhappy_field = models.Person._meta.get_field("unhappy") assert isinstance(unhappy_field, fields.BooleanField) assert isinstance(person.unhappy, bool) assert person.unhappy is False -class TestDateFieldsFilling(): - +class TestDateFieldsFilling: def test_fill_DateField_with_a_date(self, person): - birthday_field = models.Person._meta.get_field('birthday') + birthday_field = models.Person._meta.get_field("birthday") assert isinstance(birthday_field, fields.DateField) assert isinstance(person.birthday, date) -class TestDateTimeFieldsFilling(): - +class TestDateTimeFieldsFilling: def test_fill_DateTimeField_with_a_datetime(self, person): - appointment_field = models.Person._meta.get_field('appointment') + appointment_field = models.Person._meta.get_field("appointment") assert isinstance(appointment_field, fields.DateTimeField) assert isinstance(person.appointment, datetime) -class TestTimeFieldsFilling(): - +class TestTimeFieldsFilling: def test_fill_TimeField_with_a_time(self, person): - birth_time_field = models.Person._meta.get_field('birth_time') + birth_time_field = models.Person._meta.get_field("birth_time") assert isinstance(birth_time_field, fields.TimeField) assert isinstance(person.birth_time, time) -class TestUUIDFieldsFilling(): - +class TestUUIDFieldsFilling: def test_fill_UUIDField_with_uuid_object(self, person): - uuid_field = models.Person._meta.get_field('uuid') + uuid_field = models.Person._meta.get_field("uuid") assert isinstance(uuid_field, fields.UUIDField) assert isinstance(person.uuid, uuid.UUID) @pytest.mark.django_db -class TestFillingIntFields(): - +class TestFillingIntFields: def test_fill_IntegerField_with_a_random_number(self): dummy_int_model = baker.make(models.DummyIntModel) - int_field = models.DummyIntModel._meta.get_field('int_field') + int_field = models.DummyIntModel._meta.get_field("int_field") assert isinstance(int_field, fields.IntegerField) assert isinstance(dummy_int_model.int_field, int) def test_fill_BigIntegerField_with_a_random_number(self): dummy_int_model = baker.make(models.DummyIntModel) - big_int_field = models.DummyIntModel._meta.get_field('big_int_field') + big_int_field = models.DummyIntModel._meta.get_field("big_int_field") assert isinstance(big_int_field, fields.BigIntegerField) assert isinstance(dummy_int_model.big_int_field, int) def test_fill_SmallIntegerField_with_a_random_number(self): dummy_int_model = baker.make(models.DummyIntModel) - small_int_field = models.DummyIntModel._meta.get_field('small_int_field') + small_int_field = models.DummyIntModel._meta.get_field("small_int_field") assert isinstance(small_int_field, fields.SmallIntegerField) assert isinstance(dummy_int_model.small_int_field, int) @pytest.mark.django_db -class TestFillingPositiveIntFields(): - +class TestFillingPositiveIntFields: def test_fill_PositiveSmallIntegerField_with_a_random_number(self): dummy_positive_int_model = baker.make(models.DummyPositiveIntModel) - field = models.DummyPositiveIntModel._meta.get_field('positive_small_int_field') + field = models.DummyPositiveIntModel._meta.get_field("positive_small_int_field") positive_small_int_field = field assert isinstance(positive_small_int_field, fields.PositiveSmallIntegerField) assert isinstance(dummy_positive_int_model.positive_small_int_field, int) @@ -186,56 +185,54 @@ def test_fill_PositiveSmallIntegerField_with_a_random_number(self): def test_fill_PositiveIntegerField_with_a_random_number(self): dummy_positive_int_model = baker.make(models.DummyPositiveIntModel) - positive_int_field = models.DummyPositiveIntModel._meta.get_field('positive_int_field') + positive_int_field = models.DummyPositiveIntModel._meta.get_field( + "positive_int_field" + ) assert isinstance(positive_int_field, fields.PositiveIntegerField) assert isinstance(dummy_positive_int_model.positive_int_field, int) assert dummy_positive_int_model.positive_int_field > 0 @pytest.mark.django_db -class TestFillingOthersNumericFields(): - +class TestFillingOthersNumericFields: def test_filling_FloatField_with_a_random_float(self): self.dummy_numbers_model = baker.make(models.DummyNumbersModel) - float_field = models.DummyNumbersModel._meta.get_field('float_field') + float_field = models.DummyNumbersModel._meta.get_field("float_field") assert isinstance(float_field, fields.FloatField) assert isinstance(self.dummy_numbers_model.float_field, float) def test_filling_DecimalField_with_random_decimal(self): self.dummy_decimal_model = baker.make(models.DummyDecimalModel) - decimal_field = models.DummyDecimalModel._meta.get_field('decimal_field') + decimal_field = models.DummyDecimalModel._meta.get_field("decimal_field") assert isinstance(decimal_field, fields.DecimalField) assert isinstance(self.dummy_decimal_model.decimal_field, Decimal) -class TestURLFieldsFilling(): - +class TestURLFieldsFilling: def test_fill_URLField_with_valid_url(self, person): - blog_field = models.Person._meta.get_field('blog') + blog_field = models.Person._meta.get_field("blog") assert isinstance(blog_field, fields.URLField) assert isinstance(person.blog, str) -class TestFillingEmailField(): - +class TestFillingEmailField: def test_filling_EmailField(self, person): - field = models.Person._meta.get_field('email') + field = models.Person._meta.get_field("email") assert isinstance(field, fields.EmailField) assert isinstance(person.email, str) @pytest.mark.django_db -class TestFillingIPAddressField(): - +class TestFillingIPAddressField: def test_filling_IPAddressField(self): obj = baker.make(models.DummyGenericIPAddressFieldModel) - field = models.DummyGenericIPAddressFieldModel._meta.get_field('ipv4_field') + field = models.DummyGenericIPAddressFieldModel._meta.get_field("ipv4_field") assert isinstance(field, fields.GenericIPAddressField) assert isinstance(obj.ipv4_field, str) validate_ipv4_address(obj.ipv4_field) - if hasattr(obj, 'ipv6_field'): + if hasattr(obj, "ipv6_field"): assert isinstance(obj.ipv6_field, str) assert isinstance(obj.ipv46_field, str) @@ -244,8 +241,7 @@ def test_filling_IPAddressField(self): @pytest.mark.django_db -class TestFillingGenericForeignKeyField(): - +class TestFillingGenericForeignKeyField: def test_filling_content_type_field(self): dummy = baker.make(models.DummyGenericForeignKeyModel) assert isinstance(dummy.content_type, ContentType) @@ -253,14 +249,14 @@ def test_filling_content_type_field(self): @pytest.mark.django_db -class TestsFillingFileField(): - +class TestsFillingFileField: def test_filling_file_field(self): dummy = baker.make(models.DummyFileFieldModel, _create_files=True) - field = models.DummyFileFieldModel._meta.get_field('file_field') + field = models.DummyFileFieldModel._meta.get_field("file_field") assert isinstance(field, FileField) import time - path = "%s/%s/mock_file.txt" % (gettempdir(), time.strftime('%Y/%m/%d')) + + path = "%s/%s/mock_file.txt" % (gettempdir(), time.strftime("%Y/%m/%d")) assert abspath(path) == abspath(dummy.file_field.path) dummy.file_field.delete() @@ -272,8 +268,7 @@ def test_does_not_create_file_if_not_flagged(self): @pytest.mark.django_db -class TestFillingCustomFields(): - +class TestFillingCustomFields: def test_raises_unsupported_field_for_custom_field(self, custom_cfg): """Should raise an exception if a generator is not provided for a custom field""" with pytest.raises(TypeError): @@ -281,76 +276,85 @@ def test_raises_unsupported_field_for_custom_field(self, custom_cfg): def test_uses_generator_defined_on_settings_for_custom_field(self, custom_cfg): """Should use the function defined in settings as a generator""" - generator_dict = {'tests.generic.fields.CustomFieldWithGenerator': generators.gen_value_string} - setattr(settings, 'BAKER_CUSTOM_FIELDS_GEN', generator_dict) + generator_dict = { + "tests.generic.fields.CustomFieldWithGenerator": generators.gen_value_string + } + setattr(settings, "BAKER_CUSTOM_FIELDS_GEN", generator_dict) obj = baker.make(models.CustomFieldWithGeneratorModel) assert "value" == obj.custom_value - def test_uses_generator_defined_as_string_on_settings_for_custom_field(self, custom_cfg): + def test_uses_generator_defined_as_string_on_settings_for_custom_field( + self, custom_cfg + ): """Should import and use the function present in the import path defined in settings""" + # fmt: off generator_dict = { - 'tests.generic.fields.CustomFieldWithGenerator': - 'tests.generic.generators.gen_value_string' + "tests.generic.fields.CustomFieldWithGenerator": + "tests.generic.generators.gen_value_string" } - setattr(settings, 'BAKER_CUSTOM_FIELDS_GEN', generator_dict) + # fmt: on + setattr(settings, "BAKER_CUSTOM_FIELDS_GEN", generator_dict) obj = baker.make(models.CustomFieldWithGeneratorModel) assert "value" == obj.custom_value def test_uses_generator_defined_on_settings_for_custom_foreignkey(self, custom_cfg): """Should use the function defined in the import path for a foreign key field""" generator_dict = { - 'tests.generic.fields.CustomForeignKey': 'model_bakery.random_gen.gen_related' + "tests.generic.fields.CustomForeignKey": "model_bakery.random_gen.gen_related" } - setattr(settings, 'BAKER_CUSTOM_FIELDS_GEN', generator_dict) - obj = baker.make(models.CustomForeignKeyWithGeneratorModel, custom_fk__email="a@b.com") - assert 'a@b.com' == obj.custom_fk.email + setattr(settings, "BAKER_CUSTOM_FIELDS_GEN", generator_dict) + obj = baker.make( + models.CustomForeignKeyWithGeneratorModel, custom_fk__email="a@b.com" + ) + assert "a@b.com" == obj.custom_fk.email def test_uses_generator_defined_as_string_for_custom_field(self, custom_cfg): """Should import and use the generator function used in the add method""" baker.generators.add( - 'tests.generic.fields.CustomFieldWithGenerator', - 'tests.generic.generators.gen_value_string' + "tests.generic.fields.CustomFieldWithGenerator", + "tests.generic.generators.gen_value_string", ) obj = baker.make(models.CustomFieldWithGeneratorModel) assert "value" == obj.custom_value def test_uses_generator_function_for_custom_foreignkey(self, custom_cfg): """Should use the generator function passed as a value for the add method""" - baker.generators.add('tests.generic.fields.CustomForeignKey', gen_related) - obj = baker.make(models.CustomForeignKeyWithGeneratorModel, custom_fk__email="a@b.com") - assert 'a@b.com' == obj.custom_fk.email + baker.generators.add("tests.generic.fields.CustomForeignKey", gen_related) + obj = baker.make( + models.CustomForeignKeyWithGeneratorModel, custom_fk__email="a@b.com" + ) + assert "a@b.com" == obj.custom_fk.email def test_can_override_django_default_field_functions_generator(self, custom_cfg): def gen_char(): - return 'Some value' + return "Some value" - baker.generators.add('django.db.models.fields.CharField', gen_char) + baker.generators.add("django.db.models.fields.CharField", gen_char) person = baker.make(models.Person) - assert 'Some value' == person.name + assert "Some value" == person.name @pytest.mark.django_db -class TestFillingAutoFields(): - +class TestFillingAutoFields: def test_filling_AutoField(self): obj = baker.make(models.DummyEmptyModel) - field = models.DummyEmptyModel._meta.get_field('id') + field = models.DummyEmptyModel._meta.get_field("id") assert isinstance(field, fields.AutoField) assert isinstance(obj.id, int) @pytest.mark.django_db @pytest.mark.skipif(not models.has_pil, reason="PIL is required to test ImageField") -class TestFillingImageFileField(): - +class TestFillingImageFileField: def test_filling_image_file_field(self): dummy = baker.make(models.DummyImageFieldModel, _create_files=True) - field = models.DummyImageFieldModel._meta.get_field('image_field') + field = models.DummyImageFieldModel._meta.get_field("image_field") assert isinstance(field, ImageField) import time - path = "%s/%s/mock_img.jpeg" % (gettempdir(), time.strftime('%Y/%m/%d')) + + path = "%s/%s/mock_img.jpeg" % (gettempdir(), time.strftime("%Y/%m/%d")) # These require the file to exist in earlier versions of Django assert abspath(path) == abspath(dummy.image_field.path) @@ -364,26 +368,30 @@ def test_does_not_create_file_if_not_flagged(self): dummy.image_field.path # Django raises ValueError if file does not exist -@pytest.mark.skipif(connection.vendor != 'postgresql', reason='PostgreSQL specific tests') +@pytest.mark.skipif( + connection.vendor != "postgresql", reason="PostgreSQL specific tests" +) class TestCIStringFieldsFilling: def test_fill_cicharfield_with_a_random_str(self, person): - ci_char_field = models.Person._meta.get_field('ci_char') + ci_char_field = models.Person._meta.get_field("ci_char") assert isinstance(ci_char_field, CICharField) assert isinstance(person.ci_char, str) assert len(person.ci_char) == ci_char_field.max_length def test_filling_ciemailfield(self, person): - ci_email_field = models.Person._meta.get_field('ci_email') + ci_email_field = models.Person._meta.get_field("ci_email") assert isinstance(ci_email_field, CIEmailField) assert isinstance(person.ci_email, str) def test_filling_citextfield(self, person): - ci_text_field = models.Person._meta.get_field('ci_text') + ci_text_field = models.Person._meta.get_field("ci_text") assert isinstance(ci_text_field, CITextField) assert isinstance(person.ci_text, str) -@pytest.mark.skipif(connection.vendor != 'postgresql', reason='PostgreSQL specific tests') +@pytest.mark.skipif( + connection.vendor != "postgresql", reason="PostgreSQL specific tests" +) class TestPostgreSQLFieldsFilling: def test_fill_arrayfield_with_empty_array(self, person): assert person.acquaintances == [] @@ -396,8 +404,7 @@ def test_fill_hstorefield_with_empty_dict(self, person): @pytest.mark.skipif(not BAKER_GIS, reason="GIS support required for GIS fields") -class TestGisFieldsFilling(): - +class TestGisFieldsFilling: def assertGeomValid(self, geom): assert geom.valid is True, geom.valid_reason diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 7d502962..3cf4a230 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -1,6 +1,7 @@ import pytest import itertools -from random import choice + +# from random import choice from decimal import Decimal from unittest.mock import patch @@ -9,25 +10,31 @@ from model_bakery.recipe import Recipe, foreign_key, RecipeForeignKey from model_bakery.timezone import now, tz_aware from model_bakery.exceptions import InvalidQuantityException, RecipeIteratorEmpty -from tests.generic.models import TEST_TIME, Person, DummyNumbersModel, DummyBlankFieldsModel, Dog +from tests.generic.models import ( + TEST_TIME, + Person, + DummyNumbersModel, + DummyBlankFieldsModel, + Dog, +) from tests.generic.baker_recipes import SmallDogRecipe, pug recipe_attrs = { - 'name': 'John Doe', - 'nickname': 'joe', - 'age': 18, - 'bio': 'Someone in the crowd', - 'birthday': now().date(), - 'appointment': now(), - 'blog': 'http://joe.blogspot.com', - 'wanted_games_qtd': 4, - 'birth_time': now() + "name": "John Doe", + "nickname": "joe", + "age": 18, + "bio": "Someone in the crowd", + "birthday": now().date(), + "appointment": now(), + "blog": "http://joe.blogspot.com", + "wanted_games_qtd": 4, + "birth_time": now(), } person_recipe = Recipe(Person, **recipe_attrs) -@pytest.mark.django_db -class TestDefiningRecipes(): +@pytest.mark.django_db +class TestDefiningRecipes: def test_import_seq_from_baker(self): """ Import seq method directly from baker module @@ -35,7 +42,7 @@ def test_import_seq_from_baker(self): try: from model_bakery import seq # NoQA except ImportError: - self.fail('{} raised'.format(ImportError.__name__)) + self.fail("{} raised".format(ImportError.__name__)) def test_flat_model_make_recipe_with_the_correct_attributes(self): """ @@ -43,56 +50,47 @@ def test_flat_model_make_recipe_with_the_correct_attributes(self): foreign keys, many to many and one to one """ person = person_recipe.make() - assert person.name == recipe_attrs['name'] - assert person.nickname == recipe_attrs['nickname'] - assert person.age == recipe_attrs['age'] - assert person.bio == recipe_attrs['bio'] - assert person.birthday == recipe_attrs['birthday'] - assert person.appointment == recipe_attrs['appointment'] - assert person.blog == recipe_attrs['blog'] - assert person.wanted_games_qtd == recipe_attrs['wanted_games_qtd'] + assert person.name == recipe_attrs["name"] + assert person.nickname == recipe_attrs["nickname"] + assert person.age == recipe_attrs["age"] + assert person.bio == recipe_attrs["bio"] + assert person.birthday == recipe_attrs["birthday"] + assert person.appointment == recipe_attrs["appointment"] + assert person.blog == recipe_attrs["blog"] + assert person.wanted_games_qtd == recipe_attrs["wanted_games_qtd"] assert person.id is not None def test_flat_model_prepare_recipe_with_the_correct_attributes(self): person = person_recipe.prepare() - assert person.name == recipe_attrs['name'] - assert person.nickname == recipe_attrs['nickname'] - assert person.age == recipe_attrs['age'] - assert person.bio == recipe_attrs['bio'] - assert person.birthday == recipe_attrs['birthday'] - assert person.appointment == recipe_attrs['appointment'] - assert person.blog == recipe_attrs['blog'] - assert person.wanted_games_qtd == recipe_attrs['wanted_games_qtd'] + assert person.name == recipe_attrs["name"] + assert person.nickname == recipe_attrs["nickname"] + assert person.age == recipe_attrs["age"] + assert person.bio == recipe_attrs["bio"] + assert person.birthday == recipe_attrs["birthday"] + assert person.appointment == recipe_attrs["appointment"] + assert person.blog == recipe_attrs["blog"] + assert person.wanted_games_qtd == recipe_attrs["wanted_games_qtd"] assert person.id is None def test_accepts_callable(self): - r = Recipe( - DummyBlankFieldsModel, - blank_char_field=lambda: 'callable!!' - ) + r = Recipe(DummyBlankFieldsModel, blank_char_field=lambda: "callable!!") value = r.make().blank_char_field - assert value == 'callable!!' + assert value == "callable!!" def test_always_calls_when_creating(self): - with patch('tests.test_recipes.choice') as choice_mock: - choice_mock.return_value = 'foo' - lst = ['foo', 'bar', 'spam', 'eggs'] - r = Recipe( - DummyBlankFieldsModel, - blank_char_field=lambda: choice_mock(lst) - ) + with patch("tests.test_recipes.choice") as choice_mock: + choice_mock.return_value = "foo" + lst = ["foo", "bar", "spam", "eggs"] + r = Recipe(DummyBlankFieldsModel, blank_char_field=lambda: choice_mock(lst)) r.make().blank_char_field r.make().blank_char_field assert choice_mock.call_count == 2 def test_always_calls_with_quantity(self): - with patch('tests.test_recipes.choice') as choice_mock: - choice_mock.return_value = 'foo' - lst = ['foo', 'bar', 'spam', 'eggs'] - r = Recipe( - DummyBlankFieldsModel, - blank_char_field=lambda: choice_mock(lst) - ) + with patch("tests.test_recipes.choice") as choice_mock: + choice_mock.return_value = "foo" + lst = ["foo", "bar", "spam", "eggs"] + r = Recipe(DummyBlankFieldsModel, blank_char_field=lambda: choice_mock(lst)) r.make(_quantity=3) assert choice_mock.call_count == 3 @@ -100,44 +98,45 @@ def test_make_recipes_with_args(self): """ Overriding some fields values at recipe execution """ - person = person_recipe.make(name='Guido', age=56) - assert person.name != recipe_attrs['name'] - assert person.name == 'Guido' + person = person_recipe.make(name="Guido", age=56) + assert person.name != recipe_attrs["name"] + assert person.name == "Guido" - assert person.age != recipe_attrs['age'] + assert person.age != recipe_attrs["age"] assert person.age == 56 - assert person.nickname == recipe_attrs['nickname'] - assert person.bio == recipe_attrs['bio'] - assert person.birthday == recipe_attrs['birthday'] - assert person.appointment == recipe_attrs['appointment'] - assert person.blog == recipe_attrs['blog'] - assert person.wanted_games_qtd == recipe_attrs['wanted_games_qtd'] + assert person.nickname == recipe_attrs["nickname"] + assert person.bio == recipe_attrs["bio"] + assert person.birthday == recipe_attrs["birthday"] + assert person.appointment == recipe_attrs["appointment"] + assert person.blog == recipe_attrs["blog"] + assert person.wanted_games_qtd == recipe_attrs["wanted_games_qtd"] assert person.id is not None def test_prepare_recipes_with_args(self): """ Overriding some fields values at recipe execution """ - person = person_recipe.prepare(name='Guido', age=56) - assert person.name != recipe_attrs['name'] - assert person.name == 'Guido' + person = person_recipe.prepare(name="Guido", age=56) + assert person.name != recipe_attrs["name"] + assert person.name == "Guido" - assert person.age != recipe_attrs['age'] + assert person.age != recipe_attrs["age"] assert person.age == 56 - assert person.nickname == recipe_attrs['nickname'] - assert person.bio == recipe_attrs['bio'] - assert person.birthday == recipe_attrs['birthday'] - assert person.appointment == recipe_attrs['appointment'] - assert person.blog == recipe_attrs['blog'] - assert person.wanted_games_qtd == recipe_attrs['wanted_games_qtd'] - assert person.id == None + assert person.nickname == recipe_attrs["nickname"] + assert person.bio == recipe_attrs["bio"] + assert person.birthday == recipe_attrs["birthday"] + assert person.appointment == recipe_attrs["appointment"] + assert person.blog == recipe_attrs["blog"] + assert person.wanted_games_qtd == recipe_attrs["wanted_games_qtd"] + if person.id is not None: + raise ValueError def test_make_recipe_without_all_model_needed_data(self): - person_recipe = Recipe(Person, name='John Doe') + person_recipe = Recipe(Person, name="John Doe") person = person_recipe.make() - assert 'John Doe' == person.name + assert "John Doe" == person.name assert person.nickname assert person.age assert person.bio @@ -148,9 +147,9 @@ def test_make_recipe_without_all_model_needed_data(self): assert person.id def test_prepare_recipe_without_all_model_needed_data(self): - person_recipe = Recipe(Person, name='John Doe') + person_recipe = Recipe(Person, name="John Doe") person = person_recipe.prepare() - assert 'John Doe' == person.name + assert "John Doe" == person.name assert person.nickname assert person.age assert person.bio @@ -162,185 +161,178 @@ def test_prepare_recipe_without_all_model_needed_data(self): def test_defining_recipes_str(self): from model_bakery.recipe import seq - p = Recipe( - 'generic.Person', - name=seq('foo') - ) + + p = Recipe("generic.Person", name=seq("foo")) try: p.make(_quantity=5) except AttributeError as e: - self.fail('%s' % e) + self.fail("%s" % e) @pytest.mark.django_db -class TestExecutingRecipes(): +class TestExecutingRecipes: """ Tests for calling recipes defined in baker_recipes.py """ + def test_model_with_foreign_key(self): - dog = baker.make_recipe('tests.generic.dog') - assert dog.breed == 'Pug' + dog = baker.make_recipe("tests.generic.dog") + assert dog.breed == "Pug" assert isinstance(dog.owner, Person) assert dog.owner.id - dog = baker.prepare_recipe('tests.generic.dog') - assert dog.breed == 'Pug' + dog = baker.prepare_recipe("tests.generic.dog") + assert dog.breed == "Pug" assert isinstance(dog.owner, Person) assert dog.owner.id is None - dog = baker.prepare_recipe('tests.generic.dog', _save_related=True) - assert dog.breed == 'Pug' + dog = baker.prepare_recipe("tests.generic.dog", _save_related=True) + assert dog.breed == "Pug" assert isinstance(dog.owner, Person) assert dog.owner.id - dogs = baker.make_recipe('tests.generic.dog', _quantity=2) + dogs = baker.make_recipe("tests.generic.dog", _quantity=2) owner = dogs[0].owner for dog in dogs: - assert dog.breed == 'Pug' + assert dog.breed == "Pug" assert dog.owner == owner def test_model_with_foreign_key_as_str(self): - dog = baker.make_recipe('tests.generic.other_dog') - assert dog.breed == 'Basset' + dog = baker.make_recipe("tests.generic.other_dog") + assert dog.breed == "Basset" assert isinstance(dog.owner, Person) assert dog.owner.id - dog = baker.prepare_recipe('tests.generic.other_dog') - assert dog.breed == 'Basset' + dog = baker.prepare_recipe("tests.generic.other_dog") + assert dog.breed == "Basset" assert isinstance(dog.owner, Person) assert dog.owner.id is None def test_model_with_foreign_key_as_unicode(self): - dog = baker.make_recipe('tests.generic.other_dog_unicode') - assert dog.breed == 'Basset' + dog = baker.make_recipe("tests.generic.other_dog_unicode") + assert dog.breed == "Basset" assert isinstance(dog.owner, Person) assert dog.owner.id - dog = baker.prepare_recipe('tests.generic.other_dog_unicode') - assert dog.breed == 'Basset' + dog = baker.prepare_recipe("tests.generic.other_dog_unicode") + assert dog.breed == "Basset" assert isinstance(dog.owner, Person) assert dog.owner.id is None def test_make_recipe(self): - person = baker.make_recipe('tests.generic.person') + person = baker.make_recipe("tests.generic.person") assert isinstance(person, Person) assert person.id def test_make_recipe_with_quantity_parameter(self): - people = baker.make_recipe('tests.generic.person', _quantity=3) + people = baker.make_recipe("tests.generic.person", _quantity=3) assert len(people) == 3 for person in people: assert isinstance(person, Person) assert person.id def test_make_extended_recipe(self): - extended_dog = baker.make_recipe('tests.generic.extended_dog') - assert extended_dog.breed == 'Super basset' + extended_dog = baker.make_recipe("tests.generic.extended_dog") + assert extended_dog.breed == "Super basset" # No side effects happened due to extension - base_dog = baker.make_recipe('tests.generic.dog') - assert base_dog.breed == 'Pug' + base_dog = baker.make_recipe("tests.generic.dog") + assert base_dog.breed == "Pug" def test_extended_recipe_type(self): assert isinstance(pug, SmallDogRecipe) def test_save_related_instances_on_prepare_recipe(self): - dog = baker.prepare_recipe('tests.generic.homeless_dog') + dog = baker.prepare_recipe("tests.generic.homeless_dog") assert not dog.id assert not dog.owner.id - dog = baker.prepare_recipe('tests.generic.homeless_dog', _save_related=True) + dog = baker.prepare_recipe("tests.generic.homeless_dog", _save_related=True) assert not dog.id assert dog.owner.id def test_make_recipe_with_quantity_parameter_respection_model_args(self): people = baker.make_recipe( - 'tests.generic.person', - _quantity=3, - name='Dennis Ritchie', - age=70 + "tests.generic.person", _quantity=3, name="Dennis Ritchie", age=70 ) assert len(people) == 3 for person in people: - assert person.name == 'Dennis Ritchie' + assert person.name == "Dennis Ritchie" assert person.age == 70 def test_make_recipe_raises_correct_exception_if_invalid_quantity(self): with pytest.raises(InvalidQuantityException): - baker.make_recipe('tests.generic.person', _quantity="hi") + baker.make_recipe("tests.generic.person", _quantity="hi") with pytest.raises(InvalidQuantityException): - baker.make_recipe('tests.generic.person', _quantity=-1) + baker.make_recipe("tests.generic.person", _quantity=-1) def test_prepare_recipe_with_foreign_key(self): - person_recipe = Recipe(Person, name='John Doe') - dog_recipe = Recipe( - Dog, - owner=foreign_key(person_recipe), - ) + person_recipe = Recipe(Person, name="John Doe") + dog_recipe = Recipe(Dog, owner=foreign_key(person_recipe),) dog = dog_recipe.prepare() assert dog.id is None assert dog.owner.id is None def test_prepare_recipe_with_quantity_parameter(self): - people = baker.prepare_recipe('tests.generic.person', _quantity=3) + people = baker.prepare_recipe("tests.generic.person", _quantity=3) assert len(people) == 3 for person in people: assert isinstance(person, Person) - assert person.id == None + if person.id is not None: + raise ValueError def test_prepare_recipe_with_quantity_parameter_respection_model_args(self): people = baker.prepare_recipe( - 'tests.generic.person', - _quantity=3, - name='Dennis Ritchie', - age=70 + "tests.generic.person", _quantity=3, name="Dennis Ritchie", age=70 ) assert len(people) == 3 for person in people: - assert person.name == 'Dennis Ritchie' + assert person.name == "Dennis Ritchie" assert person.age == 70 def test_prepare_recipe_raises_correct_exception_if_invalid_quantity(self): with pytest.raises(InvalidQuantityException): - baker.prepare_recipe('tests.generic.person', _quantity="hi") + baker.prepare_recipe("tests.generic.person", _quantity="hi") with pytest.raises(InvalidQuantityException): - baker.prepare_recipe('tests.generic.person', _quantity=-1) + baker.prepare_recipe("tests.generic.person", _quantity=-1) def test_prepare_recipe(self): - person = baker.prepare_recipe('tests.generic.person') + person = baker.prepare_recipe("tests.generic.person") assert isinstance(person, Person) assert not person.id def test_make_recipe_with_args(self): - person = baker.make_recipe('tests.generic.person', name='Dennis Ritchie', age=70) - assert person.name == 'Dennis Ritchie' + person = baker.make_recipe( + "tests.generic.person", name="Dennis Ritchie", age=70 + ) + assert person.name == "Dennis Ritchie" assert person.age == 70 def test_prepare_recipe_with_args(self): - person = baker.prepare_recipe('tests.generic.person', name='Dennis Ritchie', age=70) - assert person.name == 'Dennis Ritchie' + person = baker.prepare_recipe( + "tests.generic.person", name="Dennis Ritchie", age=70 + ) + assert person.name == "Dennis Ritchie" assert person.age == 70 def test_import_recipe_inside_deeper_modules(self): - recipe_name = 'tests.generic.tests.sub_package.person' + recipe_name = "tests.generic.tests.sub_package.person" person = baker.prepare_recipe(recipe_name) - assert person.name == 'John Deeper' + assert person.name == "John Deeper" def test_pass_save_kwargs(self): owner = baker.make(Person) - dog = baker.make_recipe('tests.generic.overrided_save', _save_kwargs={'owner': owner}) + dog = baker.make_recipe( + "tests.generic.overrided_save", _save_kwargs={"owner": owner} + ) assert owner == dog.owner @pytest.mark.django_db -class TestForeignKey(): - +class TestForeignKey: def test_foreign_key_method_returns_a_recipe_foreign_key_object(self): - number_recipe = Recipe( - DummyNumbersModel, - float_field=1.6 - ) + number_recipe = Recipe(DummyNumbersModel, float_field=1.6) obj = foreign_key(number_recipe) assert isinstance(obj, RecipeForeignKey) @@ -348,18 +340,18 @@ def test_not_accept_other_type(self): with pytest.raises(TypeError) as c: foreign_key(2) exception = c.value - assert str(exception) == 'Not a recipe' + assert str(exception) == "Not a recipe" def test_do_not_create_related_model(self): """ It should not attempt to create other object when passing the object as argument """ - person = baker.make_recipe('tests.generic.person') + person = baker.make_recipe("tests.generic.person") assert Person.objects.count() == 1 - baker.make_recipe('tests.generic.dog', owner=person) + baker.make_recipe("tests.generic.dog", owner=person) assert Person.objects.count() == 1 - baker.prepare_recipe('tests.generic.dog', owner=person) + baker.prepare_recipe("tests.generic.dog", owner=person) assert Person.objects.count() == 1 def test_do_query_lookup_for_recipes_make_method(self): @@ -367,17 +359,17 @@ def test_do_query_lookup_for_recipes_make_method(self): It should not attempt to create other object when using query lookup syntax """ - dog = baker.make_recipe('tests.generic.dog', owner__name='James') + dog = baker.make_recipe("tests.generic.dog", owner__name="James") assert Person.objects.count() == 1 - assert dog.owner.name == 'James' + assert dog.owner.name == "James" def test_do_query_lookup_for_recipes_prepare_method(self): """ It should not attempt to create other object when using query lookup syntax """ - dog = baker.prepare_recipe('tests.generic.dog', owner__name='James') - assert dog.owner.name == 'James' + dog = baker.prepare_recipe("tests.generic.dog", owner__name="James") + assert dog.owner.name == "James" def test_do_query_lookup_empty_recipes(self): """ @@ -385,160 +377,154 @@ def test_do_query_lookup_empty_recipes(self): using query lookup syntax """ dog_recipe = Recipe(Dog) - dog = dog_recipe.make(owner__name='James') + dog = dog_recipe.make(owner__name="James") assert Person.objects.count() == 1 - assert dog.owner.name == 'James' + assert dog.owner.name == "James" - dog = dog_recipe.prepare(owner__name='Zezin') + dog = dog_recipe.prepare(owner__name="Zezin") assert Person.objects.count() == 1 - assert dog.owner.name == 'Zezin' + assert dog.owner.name == "Zezin" def test_related_models_recipes(self): - lady = baker.make_recipe('tests.generic.dog_lady') + lady = baker.make_recipe("tests.generic.dog_lady") assert lady.dog_set.count() == 2 - assert lady.dog_set.all()[0].breed == 'Pug' - assert lady.dog_set.all()[1].breed == 'Basset' + assert lady.dog_set.all()[0].breed == "Pug" + assert lady.dog_set.all()[1].breed == "Basset" def test_nullable_related(self): - nullable = baker.make_recipe('tests.generic.nullable_related') + nullable = baker.make_recipe("tests.generic.nullable_related") assert nullable.dummynullfieldsmodel_set.count() == 1 def test_chained_related(self): - movie = baker.make_recipe('tests.generic.movie_with_cast') + movie = baker.make_recipe("tests.generic.movie_with_cast") assert movie.cast_members.count() == 2 @pytest.mark.django_db -class TestM2MField(): - +class TestM2MField: def test_create_many_to_many(self): - dog = baker.make_recipe('tests.generic.dog_with_friends') + dog = baker.make_recipe("tests.generic.dog_with_friends") assert len(dog.friends_with.all()) == 2 for friend in dog.friends_with.all(): - assert friend.breed == 'Pug' - assert friend.owner.name == 'John Doe' + assert friend.breed == "Pug" + assert friend.owner.name == "John Doe" def test_create_nested(self): - dog = baker.make_recipe('tests.generic.dog_with_more_friends') + dog = baker.make_recipe("tests.generic.dog_with_more_friends") assert len(dog.friends_with.all()) == 1 friend = dog.friends_with.all()[0] assert len(friend.friends_with.all()) == 2 @pytest.mark.django_db -class TestSequences(): - +class TestSequences: def test_increment_for_strings(self): - person = baker.make_recipe('tests.generic.serial_person') - assert person.name == 'joe1' - person = baker.prepare_recipe('tests.generic.serial_person') - assert person.name == 'joe2' - person = baker.make_recipe('tests.generic.serial_person') - assert person.name == 'joe3' + person = baker.make_recipe("tests.generic.serial_person") + assert person.name == "joe1" + person = baker.prepare_recipe("tests.generic.serial_person") + assert person.name == "joe2" + person = baker.make_recipe("tests.generic.serial_person") + assert person.name == "joe3" def test_increment_for_numbers(self): - dummy = baker.make_recipe('tests.generic.serial_numbers') + dummy = baker.make_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 11 - assert dummy.default_decimal_field == Decimal('21.1') + assert dummy.default_decimal_field == Decimal("21.1") assert dummy.default_float_field == 2.23 - dummy = baker.make_recipe('tests.generic.serial_numbers') + dummy = baker.make_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 12 - assert dummy.default_decimal_field == Decimal('22.1') + assert dummy.default_decimal_field == Decimal("22.1") assert dummy.default_float_field == 3.23 - dummy = baker.prepare_recipe('tests.generic.serial_numbers') + dummy = baker.prepare_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 13 - assert dummy.default_decimal_field == Decimal('23.1') + assert dummy.default_decimal_field == Decimal("23.1") assert dummy.default_float_field == 4.23 def test_increment_for_numbers_2(self): """ This test is a repeated one but it is necessary to ensure Sequences atomicity """ - dummy = baker.make_recipe('tests.generic.serial_numbers') + dummy = baker.make_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 11 - assert dummy.default_decimal_field == Decimal('21.1') + assert dummy.default_decimal_field == Decimal("21.1") assert dummy.default_float_field == 2.23 - dummy = baker.make_recipe('tests.generic.serial_numbers') + dummy = baker.make_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 12 - assert dummy.default_decimal_field == Decimal('22.1') + assert dummy.default_decimal_field == Decimal("22.1") assert dummy.default_float_field == 3.23 - dummy = baker.prepare_recipe('tests.generic.serial_numbers') + dummy = baker.prepare_recipe("tests.generic.serial_numbers") assert dummy.default_int_field == 13 - assert dummy.default_decimal_field == Decimal('23.1') + assert dummy.default_decimal_field == Decimal("23.1") assert dummy.default_float_field == 4.23 def test_creates_unique_field_recipe_using_for_iterator(self): for i in range(1, 4): - dummy = baker.make_recipe('tests.generic.dummy_unique_field') + dummy = baker.make_recipe("tests.generic.dummy_unique_field") assert dummy.value == 10 + i def test_creates_unique_field_recipe_using_quantity_argument(self): - dummies = baker.make_recipe('tests.generic.dummy_unique_field', _quantity=3) + dummies = baker.make_recipe("tests.generic.dummy_unique_field", _quantity=3) assert 11 == dummies[0].value assert 12 == dummies[1].value assert 13 == dummies[2].value def test_increment_by_3(self): - dummy = baker.make_recipe('tests.generic.serial_numbers_by') + dummy = baker.make_recipe("tests.generic.serial_numbers_by") assert dummy.default_int_field == 13 - assert dummy.default_decimal_field == Decimal('22.5') + assert dummy.default_decimal_field == Decimal("22.5") assert dummy.default_float_field == pytest.approx(3.030000) - dummy = baker.make_recipe('tests.generic.serial_numbers_by') + dummy = baker.make_recipe("tests.generic.serial_numbers_by") assert dummy.default_int_field == 16 - assert dummy.default_decimal_field == Decimal('24.9') + assert dummy.default_decimal_field == Decimal("24.9") assert dummy.default_float_field == pytest.approx(4.83) - dummy = baker.prepare_recipe('tests.generic.serial_numbers_by') + dummy = baker.prepare_recipe("tests.generic.serial_numbers_by") assert dummy.default_int_field == 19 - assert dummy.default_decimal_field == Decimal('27.3') + assert dummy.default_decimal_field == Decimal("27.3") assert dummy.default_float_field == pytest.approx(6.63) def test_increment_by_timedelta(self): - dummy = baker.make_recipe('tests.generic.serial_datetime') + dummy = baker.make_recipe("tests.generic.serial_datetime") assert dummy.default_date_field == (TEST_TIME.date() + timedelta(days=1)) assert dummy.default_date_time_field == tz_aware(TEST_TIME + timedelta(hours=3)) assert dummy.default_time_field == (TEST_TIME + timedelta(seconds=15)).time() - dummy = baker.make_recipe('tests.generic.serial_datetime') + dummy = baker.make_recipe("tests.generic.serial_datetime") assert dummy.default_date_field == (TEST_TIME.date() + timedelta(days=2)) assert dummy.default_date_time_field == tz_aware(TEST_TIME + timedelta(hours=6)) assert dummy.default_time_field == (TEST_TIME + timedelta(seconds=30)).time() def test_creates_unique_timedelta_recipe_using_quantity_argument(self): - dummies = baker.make_recipe('tests.generic.serial_datetime', _quantity=3) + dummies = baker.make_recipe("tests.generic.serial_datetime", _quantity=3) assert dummies[0].default_date_field == TEST_TIME.date() + timedelta(days=1) assert dummies[1].default_date_field == TEST_TIME.date() + timedelta(days=2) assert dummies[2].default_date_field == TEST_TIME.date() + timedelta(days=3) def test_increment_after_override_definition_field(self): - person = baker.make_recipe('tests.generic.serial_person', name='tom') - assert person.name == 'tom' - person = baker.make_recipe('tests.generic.serial_person') - assert person.name == 'joe4' - person = baker.prepare_recipe('tests.generic.serial_person') - assert person.name == 'joe5' + person = baker.make_recipe("tests.generic.serial_person", name="tom") + assert person.name == "tom" + person = baker.make_recipe("tests.generic.serial_person") + assert person.name == "joe4" + person = baker.prepare_recipe("tests.generic.serial_person") + assert person.name == "joe5" @pytest.mark.django_db -class TestIterators(): - +class TestIterators: def test_accepts_generators(self): - r = Recipe(DummyBlankFieldsModel, - blank_char_field=itertools.cycle(['a', 'b'])) - assert 'a' == r.make().blank_char_field - assert 'b' == r.make().blank_char_field - assert 'a' == r.make().blank_char_field + r = Recipe(DummyBlankFieldsModel, blank_char_field=itertools.cycle(["a", "b"])) + assert "a" == r.make().blank_char_field + assert "b" == r.make().blank_char_field + assert "a" == r.make().blank_char_field def test_accepts_iterators(self): - r = Recipe(DummyBlankFieldsModel, - blank_char_field=iter(['a', 'b', 'c'])) - assert 'a' == r.make().blank_char_field - assert 'b' == r.make().blank_char_field - assert 'c' == r.make().blank_char_field + r = Recipe(DummyBlankFieldsModel, blank_char_field=iter(["a", "b", "c"])) + assert "a" == r.make().blank_char_field + assert "b" == r.make().blank_char_field + assert "c" == r.make().blank_char_field def test_empty_iterator_exception(self): - r = Recipe(DummyBlankFieldsModel, - blank_char_field=iter(['a', 'b'])) - assert 'a' == r.make().blank_char_field - assert 'b' == r.make().blank_char_field + r = Recipe(DummyBlankFieldsModel, blank_char_field=iter(["a", "b"])) + assert "a" == r.make().blank_char_field + assert "b" == r.make().blank_char_field with pytest.raises(RecipeIteratorEmpty): r.make() @@ -551,6 +537,7 @@ def test_only_iterators_not_iteratables_are_iterated(self): want to iterate "iterables", only explicit "iterators". """ - r = Recipe(DummyBlankFieldsModel, - blank_text_field="not an iterator, so don't iterate!") + r = Recipe( + DummyBlankFieldsModel, blank_text_field="not an iterator, so don't iterate!" + ) assert r.make().blank_text_field == "not an iterator, so don't iterate!" diff --git a/tests/test_utils.py b/tests/test_utils.py index 62538725..35458702 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -7,10 +7,10 @@ def test_import_from_str(): with pytest.raises(AttributeError): - import_from_str('tests.generic.UndefinedObject') + import_from_str("tests.generic.UndefinedObject") with pytest.raises(ImportError): - import_from_str('tests.generic.undefined_path.User') + import_from_str("tests.generic.undefined_path.User") - assert import_from_str('tests.generic.models.User') == User + assert import_from_str("tests.generic.models.User") == User assert import_from_str(User) == User From 546a7d97221ae12a8561828cee897b0d93992bb8 Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Tue, 26 Nov 2019 17:43:41 -0300 Subject: [PATCH 3/6] uploading missing files black updated --- docs/source/conf.py | 204 ++++++++++++++++++---------------- model_bakery/__init__.py | 8 +- model_bakery/baker.py | 167 +++++++++++++++++----------- model_bakery/generators.py | 45 +++++--- model_bakery/gis.py | 2 +- model_bakery/random_gen.py | 103 ++++++++--------- model_bakery/recipe.py | 15 ++- model_bakery/timezone.py | 1 + model_bakery/utils.py | 4 +- setup.py | 24 ++-- utils/from_mommy_to_bakery.py | 62 ++++++----- 11 files changed, 348 insertions(+), 287 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 3aafa578..ffd99c55 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -16,57 +16,57 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'Model Bakery' -copyright = '2014, Lucas Simon Rodrigues Magalhaes' +project = "Model Bakery" +copyright = "2014, Lucas Simon Rodrigues Magalhaes" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '1.0.2' +version = "1.0.2" # The full version, including alpha/beta/rc tags. -release = '1.0.2' +release = "1.0.2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +# language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -74,154 +74,157 @@ # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = "default" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] +# html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'ModelBakerydoc' +htmlhelp_basename = "ModelBakerydoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'ModelBakery.tex', 'Model Bakery Documentation', - 'Lucas Simon Rodrigues Magalhaes', 'manual'), + ( + "index", + "ModelBakery.tex", + "Model Bakery Documentation", + "Lucas Simon Rodrigues Magalhaes", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -229,12 +232,17 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'modelmommy', 'Model Bakery Documentation', - ['Lucas Simon Rodrigues Magalhaes'], 1) + ( + "index", + "modelmommy", + "Model Bakery Documentation", + ["Lucas Simon Rodrigues Magalhaes"], + 1, + ) ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -243,93 +251,99 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'ModelBakery', 'Model Bakery Documentation', - 'Lucas Simon Rodrigues Magalhaes', 'ModelBakery', 'One line description of project.', - 'Miscellaneous'), + ( + "index", + "ModelBakery", + "Model Bakery Documentation", + "Lucas Simon Rodrigues Magalhaes", + "ModelBakery", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False # -- Options for Epub output ---------------------------------------------- # Bibliographic Dublin Core info. -epub_title = 'Model Bakery' -epub_author = 'Lucas Simon Rodrigues Magalhaes' -epub_publisher = 'Lucas Simon Rodrigues Magalhaes' -epub_copyright = '2014, Lucas Simon Rodrigues Magalhaes' +epub_title = "Model Bakery" +epub_author = "Lucas Simon Rodrigues Magalhaes" +epub_publisher = "Lucas Simon Rodrigues Magalhaes" +epub_copyright = "2014, Lucas Simon Rodrigues Magalhaes" # The basename for the epub file. It defaults to the project name. -#epub_basename = 'Model Bakery' +# epub_basename = 'Model Bakery' # The HTML theme for the epub output. Since the default themes are not optimized # for small screen space, using the same theme for HTML and epub output is # usually not wise. This defaults to 'epub', a theme designed to save visual # space. -#epub_theme = 'epub' +# epub_theme = 'epub' # The language of the text. It defaults to the language option # or en if the language is not set. -#epub_language = '' +# epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' +# epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. -#epub_identifier = '' +# epub_identifier = '' # A unique identification for the text. -#epub_uid = '' +# epub_uid = '' # A tuple containing the cover image and cover page html template filenames. -#epub_cover = () +# epub_cover = () # A sequence of (type, uri, title) tuples for the guide element of content.opf. -#epub_guide = () +# epub_guide = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. -#epub_pre_files = [] +# epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. -#epub_post_files = [] +# epub_post_files = [] # A list of files that should not be packed into the epub file. -#epub_exclude_files = [] +# epub_exclude_files = [] # The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 +# epub_tocdepth = 3 # Allow duplicate toc entries. -#epub_tocdup = True +# epub_tocdup = True # Choose between 'default' and 'includehidden'. -#epub_tocscope = 'default' +# epub_tocscope = 'default' # Fix unsupported image types using the PIL. -#epub_fix_images = False +# epub_fix_images = False # Scale large images. -#epub_max_image_width = 0 +# epub_max_image_width = 0 # How to display URL addresses: 'footnote', 'no', or 'inline'. -#epub_show_urls = 'inline' +# epub_show_urls = 'inline' # If false, no index is generated. -#epub_use_index = True +# epub_use_index = True # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} +intersphinx_mapping = {"http://docs.python.org/": None} diff --git a/model_bakery/__init__.py b/model_bakery/__init__.py index 863a0895..b4e65c53 100644 --- a/model_bakery/__init__.py +++ b/model_bakery/__init__.py @@ -1,8 +1,8 @@ """Model Bakery module configuration.""" -__version__ = '1.0.2' -__title__ = 'model_bakery' -__author__ = 'Vanderson Mota' -__license__ = 'Apache 2.0' +__version__ = "1.0.2" +__title__ = "model_bakery" +__author__ = "Vanderson Mota" +__license__ = "Apache 2.0" from .utils import seq # NoQA diff --git a/model_bakery/baker.py b/model_bakery/baker.py index 8a3eb348..9f4f149d 100644 --- a/model_bakery/baker.py +++ b/model_bakery/baker.py @@ -7,24 +7,35 @@ from django.db.models.base import ModelBase from django.db.models import ( - ForeignKey, ManyToManyField, OneToOneField, Field, AutoField, BooleanField, FileField + ForeignKey, + ManyToManyField, + OneToOneField, + Field, + AutoField, + BooleanField, + FileField, +) +from django.db.models.fields.related import ( + ReverseManyToOneDescriptor as ForeignRelatedObjectsDescriptor, ) -from django.db.models.fields.related import \ - ReverseManyToOneDescriptor as ForeignRelatedObjectsDescriptor from django.db.models.fields.proxy import OrderWrt from . import generators, random_gen from .exceptions import ( - ModelNotFound, AmbiguousModelName, InvalidQuantityException, RecipeIteratorEmpty, - CustomBakerNotFound, InvalidCustomBaker + ModelNotFound, + AmbiguousModelName, + InvalidQuantityException, + RecipeIteratorEmpty, + CustomBakerNotFound, + InvalidCustomBaker, ) from .utils import import_from_str recipes = None # FIXME: use pkg_resource -mock_file_jpeg = join(dirname(__file__), 'mock_img.jpeg') -mock_file_txt = join(dirname(__file__), 'mock_file.txt') +mock_file_jpeg = join(dirname(__file__), "mock_img.jpeg") +mock_file_txt = join(dirname(__file__), "mock_file.txt") MAX_MANY_QUANTITY = 5 @@ -33,8 +44,15 @@ def _valid_quantity(quantity): return quantity is not None and (not isinstance(quantity, int) or quantity < 1) -def make(_model, _quantity=None, make_m2m=False, _save_kwargs=None, _refresh_after_create=False, - _create_files=False, **attrs): +def make( + _model, + _quantity=None, + make_m2m=False, + _save_kwargs=None, + _refresh_after_create=False, + _create_files=False, + **attrs +): """Create a persisted instance from a given model its associated models. It fill the fields with random values or you can specify which @@ -55,9 +73,7 @@ def make(_model, _quantity=None, make_m2m=False, _save_kwargs=None, _refresh_aft for _ in range(_quantity) ] return baker.make( - _save_kwargs=_save_kwargs, - _refresh_after_create=_refresh_after_create, - **attrs + _save_kwargs=_save_kwargs, _refresh_after_create=_refresh_after_create, **attrs ) @@ -72,14 +88,17 @@ def prepare(_model, _quantity=None, _save_related=False, **attrs): raise InvalidQuantityException if _quantity: - return [baker.prepare(_save_related=_save_related, **attrs) for i in range(_quantity)] + return [ + baker.prepare(_save_related=_save_related, **attrs) + for i in range(_quantity) + ] else: return baker.prepare(_save_related=_save_related, **attrs) def _recipe(name): - app, recipe_name = name.rsplit('.', 1) - return import_from_str('.'.join((app, 'baker_recipes', recipe_name))) + app, recipe_name = name.rsplit(".", 1) + return import_from_str(".".join((app, "baker_recipes", recipe_name))) def make_recipe(baker_recipe_name, _quantity=None, **new_attrs): @@ -88,9 +107,7 @@ def make_recipe(baker_recipe_name, _quantity=None, **new_attrs): def prepare_recipe(baker_recipe_name, _quantity=None, _save_related=False, **new_attrs): return _recipe(baker_recipe_name).prepare( - _quantity=_quantity, - _save_related=_save_related, - **new_attrs + _quantity=_quantity, _save_related=_save_related, **new_attrs ) @@ -111,8 +128,8 @@ def get_model(self, name): """ try: - if '.' in name: - app_label, model_name = name.split('.') + if "." in name: + app_label, model_name = name.split(".") model = apps.get_model(app_label, model_name) else: model = self.get_model_by_name(name) @@ -136,8 +153,10 @@ def get_model_by_name(self, name): self._populate() if name in self._ambiguous_models: - raise AmbiguousModelName('%s is a model in more than one app. ' - 'Use the form "app.model".' % name.title()) + raise AmbiguousModelName( + "%s is a model in more than one app. " + 'Use the form "app.model".' % name.title() + ) return self._unique_models.get(name) @@ -163,10 +182,10 @@ def _populate(self): def is_iterator(value): - if not hasattr(value, '__iter__'): + if not hasattr(value, "__iter__"): return False - return hasattr(value, '__next__') + return hasattr(value, "__next__") def _custom_baker_class(): @@ -177,22 +196,25 @@ def _custom_baker_class(): settings, or None if no custom class is defined. """ - custom_class_string = getattr(settings, 'BAKER_CUSTOM_CLASS', None) + custom_class_string = getattr(settings, "BAKER_CUSTOM_CLASS", None) if custom_class_string is None: return None try: baker_class = import_from_str(custom_class_string) - for required_function_name in ['make', 'prepare']: + for required_function_name in ["make", "prepare"]: if not hasattr(baker_class, required_function_name): raise InvalidCustomBaker( - 'Custom Baker classes must have a "%s" function' % required_function_name + 'Custom Baker classes must have a "%s" function' + % required_function_name ) return baker_class except ImportError: - raise CustomBakerNotFound("Could not find custom baker class '%s'" % custom_class_string) + raise CustomBakerNotFound( + "Could not find custom baker class '%s'" % custom_class_string + ) class Baker(object): @@ -227,7 +249,7 @@ def __init__(self, _model, make_m2m=False, create_files=False): def init_type_mapping(self): self.type_mapping = generators.get_type_mapping() - generators_from_settings = getattr(settings, 'BAKER_CUSTOM_FIELDS_GEN', {}) + generators_from_settings = getattr(settings, "BAKER_CUSTOM_FIELDS_GEN", {}) for k, v in generators_from_settings.items(): field_class = import_from_str(k) generator = import_from_str(v) @@ -242,11 +264,11 @@ def make( ): """Create and persist an instance of the model associated with Baker instance.""" params = { - 'commit': True, - 'commit_related': True, - '_save_kwargs': _save_kwargs, - '_refresh_after_create': _refresh_after_create, - '_from_manager': _from_manager, + "commit": True, + "commit_related": True, + "_save_kwargs": _save_kwargs, + "_refresh_after_create": _refresh_after_create, + "_from_manager": _from_manager, } params.update(attrs) return self._make(**params) @@ -283,16 +305,22 @@ def _make( else: self.m2m_dict[field.name] = self.model_attrs.pop(field.name) elif field.name not in self.model_attrs: - if not isinstance(field, ForeignKey) or \ - '{0}_id'.format(field.name) not in self.model_attrs: - self.model_attrs[field.name] = self.generate_value(field, commit_related) + if ( + not isinstance(field, ForeignKey) + or "{0}_id".format(field.name) not in self.model_attrs + ): + self.model_attrs[field.name] = self.generate_value( + field, commit_related + ) elif callable(self.model_attrs[field.name]): self.model_attrs[field.name] = self.model_attrs[field.name]() elif field.name in self.iterator_attrs: try: self.model_attrs[field.name] = next(self.iterator_attrs[field.name]) except StopIteration: - raise RecipeIteratorEmpty('{0} iterator is empty.'.format(field.name)) + raise RecipeIteratorEmpty( + "{0} iterator is empty.".format(field.name) + ) instance = self.instance( self.model_attrs, @@ -347,14 +375,15 @@ def create_by_related_name(self, instance, related): kwargs = filter_rel_attrs(rel_name, **self.rel_attrs) kwargs[related.field.name] = instance - kwargs['_model'] = related.field.model + kwargs["_model"] = related.field.model make(**kwargs) def _clean_attrs(self, attrs): def is_rel_field(x): - return '__' in x - self.fill_in_optional = attrs.pop('_fill_optional', False) + return "__" in x + + self.fill_in_optional = attrs.pop("_fill_optional", False) # error for non existing fields if isinstance(self.fill_in_optional, (tuple, list, set)): # parents and relations @@ -363,13 +392,15 @@ def is_rel_field(x): ) if wrong_fields: raise AttributeError( - '_fill_optional field(s) %s are not related to model %s' + "_fill_optional field(s) %s are not related to model %s" % (list(wrong_fields), self.model.__name__) ) self.iterator_attrs = dict((k, v) for k, v in attrs.items() if is_iterator(v)) self.model_attrs = dict((k, v) for k, v in attrs.items() if not is_rel_field(k)) self.rel_attrs = dict((k, v) for k, v in attrs.items() if is_rel_field(k)) - self.rel_fields = [x.split('__')[0] for x in self.rel_attrs.keys() if is_rel_field(x)] + self.rel_fields = [ + x.split("__")[0] for x in self.rel_attrs.keys() if is_rel_field(x) + ] def _skip_field(self, field): # check for fill optional argument @@ -388,22 +419,26 @@ def _skip_field(self, field): if isinstance(field, (AutoField, GenericRelation, OrderWrt)): return True - if all([ - field.name not in self.model_attrs, - field.name not in self.rel_fields, - field.name not in self.attr_mapping - ]): + if all( + [ + field.name not in self.model_attrs, + field.name not in self.rel_fields, + field.name not in self.attr_mapping, + ] + ): # Django is quirky in that BooleanFields are always "blank", # but have no default. if not field.fill_optional and ( - not issubclass(field.__class__, Field) or - field.has_default() or - (field.blank and not isinstance(field, BooleanField)) + not issubclass(field.__class__, Field) + or field.has_default() + or (field.blank and not isinstance(field, BooleanField)) ): return True if field.name not in self.model_attrs: - if field.name not in self.rel_fields and (field.null and not field.fill_optional): + if field.name not in self.rel_fields and ( + field.null and not field.fill_optional + ): return True return False @@ -433,7 +468,7 @@ def _handle_m2m(self, instance): for value in values: base_kwargs = { m2m_relation.source_field_name: instance, - m2m_relation.target_field_name: value + m2m_relation.target_field_name: value, } make(through_model, **base_kwargs) @@ -455,10 +490,11 @@ def generate_value(self, field, commit=True): """ if field.name in self.attr_mapping: generator = self.attr_mapping[field.name] - elif getattr(field, 'choices'): + elif getattr(field, "choices"): generator = random_gen.gen_from_choices(field.choices) - elif isinstance(field, ForeignKey) and \ - issubclass(self._remote_field(field).model, ContentType): + elif isinstance(field, ForeignKey) and issubclass( + self._remote_field(field).model, ContentType + ): generator = self.type_mapping[ContentType] elif generators.get(field.__class__): generator = generators.get(field.__class__) @@ -467,7 +503,7 @@ def generate_value(self, field, commit=True): elif field.has_default(): return field.default else: - raise TypeError('%s is not supported by baker.' % field.__class__) + raise TypeError("%s is not supported by baker." % field.__class__) # attributes like max_length, decimal_places are taken into account when # generating the value. @@ -477,7 +513,7 @@ def generate_value(self, field, commit=True): generator_attrs.update(filter_rel_attrs(field.name, **self.rel_attrs)) if not commit: - generator = getattr(generator, 'prepare', generator) + generator = getattr(generator, "prepare", generator) return generator(**generator_attrs) @@ -490,7 +526,7 @@ def get_required_values(generator, field): """ # FIXME: avoid abbreviations rt = {} - if hasattr(generator, 'required'): + if hasattr(generator, "required"): for item in generator.required: if callable(item): # baker can deal with the nasty hacking too! @@ -501,8 +537,11 @@ def get_required_values(generator, field): rt[item] = getattr(field, item) else: - raise ValueError("Required value '%s' is of wrong type. \ - Don't make baker sad." % str(item)) + raise ValueError( + "Required value '%s' is of wrong type. \ + Don't make baker sad." + % str(item) + ) return rt @@ -511,9 +550,9 @@ def filter_rel_attrs(field_name, **rel_attrs): clean_dict = {} for k, v in rel_attrs.items(): - if k.startswith(field_name + '__'): - splitted_key = k.split('__') - key = '__'.join(splitted_key[1:]) + if k.startswith(field_name + "__"): + splitted_key = k.split("__") + key = "__".join(splitted_key[1:]) clean_dict[key] = v else: clean_dict[k] = v diff --git a/model_bakery/generators.py b/model_bakery/generators.py index bc845a93..dc1247ae 100644 --- a/model_bakery/generators.py +++ b/model_bakery/generators.py @@ -1,10 +1,32 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import ( - BigIntegerField, BinaryField, BooleanField, CharField, DateField, DateTimeField, DecimalField, - DurationField, EmailField, FileField, FloatField, ForeignKey, GenericIPAddressField, - ImageField, IntegerField, IPAddressField, ManyToManyField, NullBooleanField, OneToOneField, - PositiveIntegerField, PositiveSmallIntegerField, SlugField, SmallIntegerField, TextField, - TimeField, URLField, UUIDField + BigIntegerField, + BinaryField, + BooleanField, + CharField, + DateField, + DateTimeField, + DecimalField, + DurationField, + EmailField, + FileField, + FloatField, + ForeignKey, + GenericIPAddressField, + ImageField, + IntegerField, + IPAddressField, + ManyToManyField, + NullBooleanField, + OneToOneField, + PositiveIntegerField, + PositiveSmallIntegerField, + SlugField, + SmallIntegerField, + TextField, + TimeField, + URLField, + UUIDField, ) from . import random_gen @@ -27,7 +49,11 @@ HStoreField = None try: - from django.contrib.postgres.fields.citext import CICharField, CIEmailField, CITextField + from django.contrib.postgres.fields.citext import ( + CICharField, + CIEmailField, + CITextField, + ) except ImportError: CICharField = None CIEmailField = None @@ -38,29 +64,23 @@ ForeignKey: random_gen.gen_related, OneToOneField: random_gen.gen_related, ManyToManyField: random_gen.gen_m2m, - BooleanField: random_gen.gen_boolean, NullBooleanField: random_gen.gen_boolean, IntegerField: random_gen.gen_integer, BigIntegerField: random_gen.gen_integer, SmallIntegerField: random_gen.gen_integer, - PositiveIntegerField: lambda: random_gen.gen_integer(min_int=0), PositiveSmallIntegerField: lambda: random_gen.gen_integer(min_int=0), - FloatField: random_gen.gen_float, DecimalField: random_gen.gen_decimal, - BinaryField: random_gen.gen_byte_string, CharField: random_gen.gen_string, TextField: random_gen.gen_text, SlugField: random_gen.gen_slug, UUIDField: random_gen.gen_uuid, - DateField: random_gen.gen_date, DateTimeField: random_gen.gen_datetime, TimeField: random_gen.gen_time, - URLField: random_gen.gen_url, EmailField: random_gen.gen_email, IPAddressField: random_gen.gen_ipv4, @@ -68,7 +88,6 @@ FileField: random_gen.gen_file_field, ImageField: random_gen.gen_image_field, DurationField: random_gen.gen_interval, - ContentType: random_gen.gen_content_type, } diff --git a/model_bakery/gis.py b/model_bakery/gis.py index bec01b35..ef4a4c2c 100644 --- a/model_bakery/gis.py +++ b/model_bakery/gis.py @@ -5,7 +5,7 @@ default_gis_mapping = {} -__all__ = ['BAKER_GIS', 'default_gis_mapping'] +__all__ = ["BAKER_GIS", "default_gis_mapping"] if BAKER_GIS: from . import random_gen diff --git a/model_bakery/random_gen.py b/model_bakery/random_gen.py index cbfe8cdb..6078fdf8 100644 --- a/model_bakery/random_gen.py +++ b/model_bakery/random_gen.py @@ -26,20 +26,21 @@ def get_content_file(content, name): from django.core.files.base import ContentFile + return ContentFile(content, name=name) def gen_file_field(): - name = 'mock_file.txt' + name = "mock_file.txt" file_path = abspath(join(dirname(__file__), name)) - with open(file_path, 'rb') as f: + with open(file_path, "rb") as f: return get_content_file(f.read(), name=name) def gen_image_field(): - name = 'mock_img.jpeg' + name = "mock_img.jpeg" file_path = abspath(join(dirname(__file__), name)) - with open(file_path, 'rb') as f: + with open(file_path, "rb") as f: return get_content_file(f.read(), name=name) @@ -81,15 +82,17 @@ def gen_float(): def gen_decimal(max_digits, decimal_places): def num_as_str(x): - return ''.join([str(randint(0, 9)) for _ in range(x)]) + return "".join([str(randint(0, 9)) for _ in range(x)]) if decimal_places: - return Decimal("%s.%s" % (num_as_str(max_digits - decimal_places - 1), - num_as_str(decimal_places))) + return Decimal( + "%s.%s" + % (num_as_str(max_digits - decimal_places - 1), num_as_str(decimal_places)) + ) return Decimal(num_as_str(max_digits)) -gen_decimal.required = ['max_digits', 'decimal_places'] +gen_decimal.required = ["max_digits", "decimal_places"] def gen_date(): @@ -105,18 +108,18 @@ def gen_time(): def gen_string(max_length): - return str(''.join(choice(string.ascii_letters) for _ in range(max_length))) + return str("".join(choice(string.ascii_letters) for _ in range(max_length))) -gen_string.required = ['max_length'] +gen_string.required = ["max_length"] def gen_slug(max_length): - valid_chars = string.ascii_letters + string.digits + '_-' - return str(''.join(choice(valid_chars) for _ in range(max_length))) + valid_chars = string.ascii_letters + string.digits + "_-" + return str("".join(choice(valid_chars) for _ in range(max_length))) -gen_slug.required = ['max_length'] +gen_slug.required = ["max_length"] def gen_text(): @@ -132,7 +135,7 @@ def gen_null_boolean(): def gen_url(): - return str('http://www.%s.com/' % gen_string(30)) + return str("http://www.%s.com/" % gen_string(30)) def gen_email(): @@ -140,7 +143,7 @@ def gen_email(): def gen_ipv6(): - return ":".join(format(randint(1, 65535), 'x') for _ in range(8)) + return ":".join(format(randint(1, 65535), "x") for _ in range(8)) def gen_ipv4(): @@ -154,12 +157,13 @@ def gen_ipv46(): def gen_ip(protocol, default_validators): from django.core.exceptions import ValidationError - protocol = (protocol or '').lower() + + protocol = (protocol or "").lower() if not protocol: field_validator = default_validators[0] - dummy_ipv4 = '1.1.1.1' - dummy_ipv6 = 'FE80::0202:B3FF:FE1E:8329' + dummy_ipv4 = "1.1.1.1" + dummy_ipv6 = "FE80::0202:B3FF:FE1E:8329" try: field_validator(dummy_ipv4) field_validator(dummy_ipv6) @@ -170,9 +174,9 @@ def gen_ip(protocol, default_validators): generator = gen_ipv4 except ValidationError: generator = gen_ipv6 - elif protocol == 'ipv4': + elif protocol == "ipv4": generator = gen_ipv4 - elif protocol == 'ipv6': + elif protocol == "ipv6": generator = gen_ipv6 else: generator = gen_ipv46 @@ -180,7 +184,7 @@ def gen_ip(protocol, default_validators): return generator() -gen_ip.required = ['protocol', 'default_validators'] +gen_ip.required = ["protocol", "default_validators"] def gen_byte_string(max_length=16): @@ -188,8 +192,9 @@ def gen_byte_string(max_length=16): return bytes(generator) -def gen_interval(interval_key='milliseconds'): +def gen_interval(interval_key="milliseconds"): from datetime import timedelta + interval = gen_integer() kwargs = {interval_key: interval} return timedelta(**kwargs) @@ -198,15 +203,17 @@ def gen_interval(interval_key='milliseconds'): def gen_content_type(): from django.contrib.contenttypes.models import ContentType from django.apps import apps + try: return ContentType.objects.get_for_model(choice(apps.get_models())) except AssertionError: - warnings.warn('Database access disabled, returning ContentType raw instance') + warnings.warn("Database access disabled, returning ContentType raw instance") return ContentType() def gen_uuid(): import uuid + return uuid.uuid4() @@ -224,18 +231,20 @@ def gen_hstore(): def _fk_model(field): try: - return ('model', field.related_model) + return ("model", field.related_model) except AttributeError: - return ('model', field.related.parent_model) + return ("model", field.related.parent_model) def _prepare_related(model, **attrs): from .baker import prepare + return prepare(model, **attrs) def gen_related(model, **attrs): from .baker import make + return make(model, **attrs) @@ -245,6 +254,7 @@ def gen_related(model, **attrs): def gen_m2m(model, **attrs): from .baker import make, MAX_MANY_QUANTITY + return make(model, _quantity=MAX_MANY_QUANTITY, **attrs) @@ -253,65 +263,46 @@ def gen_m2m(model, **attrs): # GIS generators + def gen_coord(): return uniform(0, 1) def gen_coords(): - return '{x} {y}'.format(x=gen_coord(), y=gen_coord()) + return "{x} {y}".format(x=gen_coord(), y=gen_coord()) def gen_point(): - return 'POINT ({})'.format( - gen_coords(), - ) + return "POINT ({})".format(gen_coords(),) def _gen_line_string_without_prefix(): - return '({}, {})'.format( - gen_coords(), - gen_coords(), - ) + return "({}, {})".format(gen_coords(), gen_coords(),) def gen_line_string(): - return 'LINESTRING {}'.format( - _gen_line_string_without_prefix() - ) + return "LINESTRING {}".format(_gen_line_string_without_prefix()) def _gen_polygon_without_prefix(): start = gen_coords() - return '(({}, {}, {}, {}))'.format( - start, - gen_coords(), - gen_coords(), - start - ) + return "(({}, {}, {}, {}))".format(start, gen_coords(), gen_coords(), start) def gen_polygon(): - return 'POLYGON {}'.format( - _gen_polygon_without_prefix(), - ) + return "POLYGON {}".format(_gen_polygon_without_prefix(),) def gen_multi_point(): - return 'MULTIPOINT (({}))'.format( - gen_coords(), - ) + return "MULTIPOINT (({}))".format(gen_coords(),) def gen_multi_line_string(): - return 'MULTILINESTRING ({})'.format( - _gen_line_string_without_prefix(), - ) + return "MULTILINESTRING ({})".format(_gen_line_string_without_prefix(),) def gen_multi_polygon(): - return 'MULTIPOLYGON ({})'.format( - _gen_polygon_without_prefix(), - ) + return "MULTIPOLYGON ({})".format(_gen_polygon_without_prefix(),) def gen_geometry(): @@ -319,6 +310,4 @@ def gen_geometry(): def gen_geometry_collection(): - return 'GEOMETRYCOLLECTION ({})'.format( - gen_point(), - ) + return "GEOMETRYCOLLECTION ({})".format(gen_point(),) diff --git a/model_bakery/recipe.py b/model_bakery/recipe.py index 45a212bc..9dcab68a 100644 --- a/model_bakery/recipe.py +++ b/model_bakery/recipe.py @@ -18,9 +18,9 @@ def __init__(self, _model, **attrs): self._iterator_backups = {} def _mapping(self, new_attrs): - _save_related = new_attrs.get('_save_related', True) - rel_fields_attrs = dict((k, v) for k, v in new_attrs.items() if '__' in k) - new_attrs = dict((k, v) for k, v in new_attrs.items() if '__' not in k) + _save_related = new_attrs.get("_save_related", True) + rel_fields_attrs = dict((k, v) for k, v in new_attrs.items() if "__" in k) + new_attrs = dict((k, v) for k, v in new_attrs.items() if "__" not in k) mapping = self.attr_mapping.copy() for k, v in self.attr_mapping.items(): # do not generate values if field value is provided @@ -39,7 +39,7 @@ def _mapping(self, new_attrs): elif isinstance(v, RecipeForeignKey): a = {} for key, value in list(rel_fields_attrs.items()): - if key.startswith('%s__' % k): + if key.startswith("%s__" % k): a[key] = rel_fields_attrs.pop(key) recipe_attrs = baker.filter_rel_attrs(k, **a) if _save_related: @@ -56,7 +56,7 @@ def make(self, **attrs): return baker.make(self._model, **self._mapping(attrs)) def prepare(self, **attrs): - defaults = {'_save_related': False} + defaults = {"_save_related": False} defaults.update(attrs) return baker.prepare(self._model, **self._mapping(defaults)) @@ -67,7 +67,6 @@ def extend(self, **attrs): class RecipeForeignKey(object): - def __init__(self, recipe): if isinstance(recipe, Recipe): self.recipe = recipe @@ -80,7 +79,7 @@ def __init__(self, recipe): else: raise RecipeNotFound else: - raise TypeError('Not a recipe') + raise TypeError("Not a recipe") def foreign_key(recipe): @@ -107,7 +106,7 @@ def __init__(self, *args): else: raise RecipeNotFound else: - raise TypeError('Not a recipe') + raise TypeError("Not a recipe") def make(self): """Persist objects to m2m relation.""" diff --git a/model_bakery/timezone.py b/model_bakery/timezone.py index 811067a1..94667e1a 100644 --- a/model_bakery/timezone.py +++ b/model_bakery/timezone.py @@ -10,6 +10,7 @@ from django.conf import settings from django.utils.timezone import now, utc except ImportError: + def now(): return datetime.now() diff --git a/model_bakery/utils.py b/model_bakery/utils.py index 986d897c..bc30bfad 100644 --- a/model_bakery/utils.py +++ b/model_bakery/utils.py @@ -12,7 +12,7 @@ def import_from_str(import_string): this method imports it; else it just return the object. """ if isinstance(import_string, str): - path, field_name = import_string.rsplit('.', 1) + path, field_name = import_string.rsplit(".", 1) module = importlib.import_module(path) return getattr(module, field_name) else: @@ -20,7 +20,7 @@ def import_from_str(import_string): def seq(value, increment_by=1): - if type(value) in [datetime.datetime, datetime.date, datetime.time]: + if type(value) in [datetime.datetime, datetime.date, datetime.time]: if type(value) is datetime.date: date = datetime.datetime.combine(value, datetime.datetime.now().time()) elif type(value) is datetime.time: diff --git a/setup.py b/setup.py index 268e692d..1379bef8 100755 --- a/setup.py +++ b/setup.py @@ -9,13 +9,9 @@ version=model_bakery.__version__, packages=["model_bakery"], include_package_data=True, # declarations in MANIFEST.in - install_requires=open(join(dirname(__file__), 'requirements.txt')).readlines(), - tests_require=[ - 'django>=1.11', - 'pil', - 'tox', - ], - test_suite='runtests.runtests', + install_requires=open(join(dirname(__file__), "requirements.txt")).readlines(), + tests_require=["django>=1.11", "pil", "tox"], + test_suite="runtests.runtests", author="berinfontes", author_email="bernardoxhc@gmail.com", url="http://github.com/berinhard/model_bakery", @@ -24,12 +20,12 @@ long_description=open(join(dirname(__file__), "README.rst")).read(), keywords="django testing factory python", classifiers=[ - 'Framework :: Django', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Topic :: Software Development', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', + "Framework :: Django", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Topic :: Software Development", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", ], ) diff --git a/utils/from_mommy_to_bakery.py b/utils/from_mommy_to_bakery.py index c4387744..b7401c51 100644 --- a/utils/from_mommy_to_bakery.py +++ b/utils/from_mommy_to_bakery.py @@ -10,21 +10,27 @@ import os import re -PACKAGE_NAME = r'\bmodel_mommy\b' +PACKAGE_NAME = r"\bmodel_mommy\b" PACKAGE_NAME_PATTERN = re.compile(PACKAGE_NAME) -PACKAGE_RECIPES = r'\bmommy_recipes\b' +PACKAGE_RECIPES = r"\bmommy_recipes\b" PACKAGE_RECIPES_PATTERN = re.compile(PACKAGE_RECIPES) -PACKAGE_LEGACY_MODULE = r'\bmommy\b' +PACKAGE_LEGACY_MODULE = r"\bmommy\b" PACKAGE_LEGACY_MODULE_PATTERN = re.compile(PACKAGE_LEGACY_MODULE) LEGACY_AND_NEW = [ - {'old': PACKAGE_NAME_PATTERN, 'new': r'model_bakery'}, - {'old': PACKAGE_RECIPES_PATTERN, 'new': r'baker_recipes'}, - {'old': PACKAGE_LEGACY_MODULE_PATTERN, 'new': r'baker'}, + {"old": PACKAGE_NAME_PATTERN, "new": r"model_bakery"}, + {"old": PACKAGE_RECIPES_PATTERN, "new": r"baker_recipes"}, + {"old": PACKAGE_LEGACY_MODULE_PATTERN, "new": r"baker"}, ] EXCLUDE = [ - 'node_modules', 'venv', '.git', 'sql', 'docs', - 'from_mommy_to_bakery.py', 'Pipfile', 'Pipfile.lock' + "node_modules", + "venv", + ".git", + "sql", + "docs", + "from_mommy_to_bakery.py", + "Pipfile", + "Pipfile.lock", ] @@ -35,36 +41,36 @@ def _find_changes(content, pattern, new_value): def _rename_recipe_file(to_be_renamed, dry_run): if dry_run is True: - print('Will be renamed:') + print("Will be renamed:") for old_recipe_file in to_be_renamed: - root = old_recipe_file[:old_recipe_file.rfind('/')] + root = old_recipe_file[: old_recipe_file.rfind("/")] if dry_run is False: - os.rename(old_recipe_file, f'{root}/baker_recipes.py') + os.rename(old_recipe_file, f"{root}/baker_recipes.py") else: print(old_recipe_file) def _replace_legacy_terms(file_path, dry_run): try: - content = open(file_path, 'r').read() + content = open(file_path, "r").read() except UnicodeDecodeError: return changed = [] for patterns in LEGACY_AND_NEW: - old, new = patterns['old'], patterns['new'] + old, new = patterns["old"], patterns["new"] content, has_changed = _find_changes(content, old, new) changed.append(has_changed) if any(changed): if dry_run is False: - open(file_path, 'w').write(content) + open(file_path, "w").write(content) else: print(file_path) def _sanitize_folder_or_file(folder_or_file): folder_or_file = folder_or_file.strip() - if folder_or_file.endswith('/'): + if folder_or_file.endswith("/"): # Remove trailing slash e.g.: '.tox/' -> '.tox' folder_or_file = folder_or_file[:-1] return folder_or_file @@ -73,38 +79,36 @@ def _sanitize_folder_or_file(folder_or_file): def check_files(dry_run): excluded_by_gitignore = [ _sanitize_folder_or_file(folder_or_file) - for folder_or_file in open('.gitignore').readlines() + for folder_or_file in open(".gitignore").readlines() ] exclude = EXCLUDE[:] exclude.extend(excluded_by_gitignore) to_be_renamed = [] - for root, dirs, files in os.walk('.', topdown=True): - dirs[:] = [ - directory - for directory in dirs - if directory not in exclude - ] + for root, dirs, files in os.walk(".", topdown=True): + dirs[:] = [directory for directory in dirs if directory not in exclude] for file_ in files: - if file_ in exclude or not file_.endswith('.py'): + if file_ in exclude or not file_.endswith(".py"): continue - file_path = f'{root}/{file_}' - if file_ == 'mommy_recipes.py': + file_path = f"{root}/{file_}" + if file_ == "mommy_recipes.py": to_be_renamed.append(file_path) _replace_legacy_terms(file_path, dry_run) _rename_recipe_file(to_be_renamed, dry_run) -if __name__ == '__main__': - description = 'Help you to migrate from model_mommy to model_bakery.' +if __name__ == "__main__": + description = "Help you to migrate from model_mommy to model_bakery." parser = argparse.ArgumentParser(description=description) parser.add_argument( - '--dry-run', dest='dry_run', action='store_true', - help='See which files will be changed.' + "--dry-run", + dest="dry_run", + action="store_true", + help="See which files will be changed.", ) args = parser.parse_args() From dabfe29e239b4393b03d5f326dea8aaa81eecdec Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Tue, 26 Nov 2019 17:54:32 -0300 Subject: [PATCH 4/6] inserting again random.choice to check travis build --- tests/test_recipes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 3cf4a230..b12b1cdd 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -1,7 +1,7 @@ import pytest import itertools -# from random import choice +from random import choice from decimal import Decimal from unittest.mock import patch From 3840be37a5e42d6d228bd1e039165c5e02fb4076 Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Tue, 26 Nov 2019 18:20:52 -0300 Subject: [PATCH 5/6] update if to assert --- tests/test_recipes.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_recipes.py b/tests/test_recipes.py index b12b1cdd..73d15897 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -130,8 +130,7 @@ def test_prepare_recipes_with_args(self): assert person.appointment == recipe_attrs["appointment"] assert person.blog == recipe_attrs["blog"] assert person.wanted_games_qtd == recipe_attrs["wanted_games_qtd"] - if person.id is not None: - raise ValueError + assert person.id is None def test_make_recipe_without_all_model_needed_data(self): person_recipe = Recipe(Person, name="John Doe") @@ -278,8 +277,7 @@ def test_prepare_recipe_with_quantity_parameter(self): assert len(people) == 3 for person in people: assert isinstance(person, Person) - if person.id is not None: - raise ValueError + assert person.id is None def test_prepare_recipe_with_quantity_parameter_respection_model_args(self): people = baker.prepare_recipe( From 39b158742f7ebfe12d6719e56e1760c15d75d1ac Mon Sep 17 00:00:00 2001 From: Giovana Morais Date: Mon, 2 Dec 2019 22:18:21 -0300 Subject: [PATCH 6/6] fix flake8 import crash and remove unnecessary import --- tests/test_filling_fields.py | 1 - tests/test_recipes.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_filling_fields.py b/tests/test_filling_fields.py index 18c1b0f8..7013460d 100644 --- a/tests/test_filling_fields.py +++ b/tests/test_filling_fields.py @@ -8,7 +8,6 @@ from django.conf import settings from django.contrib.contenttypes.models import ContentType -# from django.core.files import images, File from django.db import connection from django.db.models import fields, ImageField, FileField diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 73d15897..1460ca15 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -1,7 +1,7 @@ import pytest import itertools -from random import choice +from random import choice # noqa from decimal import Decimal from unittest.mock import patch