From 0b8a85d3d6d21e25121f854ac9d89bb5d306ac66 Mon Sep 17 00:00:00 2001 From: eunsung Date: Sun, 22 Dec 2024 15:23:13 +0900 Subject: [PATCH 1/4] required for faker33.1.0 --- django_faker/__init__.py | 50 ++++++++------------------------------- django_faker/guessers.py | 2 +- django_faker/populator.py | 6 ++--- 3 files changed, 14 insertions(+), 44 deletions(-) diff --git a/django_faker/__init__.py b/django_faker/__init__.py index ed816d8..63bd213 100644 --- a/django_faker/__init__.py +++ b/django_faker/__init__.py @@ -9,7 +9,6 @@ __version__ = '0.2.1' class Faker(object): - instance = None populators = {} generators = {} @@ -21,10 +20,8 @@ def __new__(cls, *args, **kwargs): return cls.instance def __init__(self): -# assert False, "Cannot create a instance of Faker" pass - @staticmethod def getCodename(locale=None, providers=None): """ @@ -43,68 +40,41 @@ def getCodename(locale=None, providers=None): return codename - @classmethod def getGenerator(cls, locale=None, providers=None, codename=None): """ use a codename to cache generators """ - codename = codename or cls.getCodename(locale, providers) if codename not in cls.generators: from faker import Faker as FakerGenerator - # initialize with faker.generator.Generator instance - # and remember in cache - cls.generators[codename] = FakerGenerator( locale, providers ) - cls.generators[codename].seed( cls.generators[codename].randomInt() ) + generator = FakerGenerator(locale=locale) + if providers: + for provider in providers: + generator.add_provider(provider) + cls.generators[codename] = generator + FakerGenerator.seed() return cls.generators[codename] - - @classmethod def getPopulator(cls, locale=None, providers=None): """ - uses: - from django_faker import Faker pop = Faker.getPopulator() - + from myapp import models pop.addEntity(models.MyModel, 10) pop.addEntity(models.MyOtherModel, 10) pop.execute() - - pop = Faker.getPopulator('it_IT') - - pop.addEntity(models.MyModel, 10) - pop.addEntity(models.MyOtherModel, 10) - pop.execute() - """ - codename = cls.getCodename(locale, providers) if codename not in cls.populators: - - generator = cls.generators.get(codename, None) or cls.getGenerator(codename=codename) - + generator = cls.generators.get(codename, None) or cls.getGenerator(codename=codename) from django_faker import populator + cls.populators[codename] = populator.Populator(generator) - cls.populators[codename] = populator.Populator( generator ) - - return cls.populators[codename] - -# if not cls.populator: -# cls.populator= populators.Populator( -# # initialize with faker.generator.Generator instance -# FakerGenerator( -# -# getattr(settings,'FAKER_LOCALE', getattr(settings,'LANGUAGE_CODE', locale)), -# -# getattr(settings,'FAKER_PROVIDERS', providers) -# ) -# ) - + return cls.populators[codename] \ No newline at end of file diff --git a/django_faker/guessers.py b/django_faker/guessers.py index d3db451..104d4a6 100644 --- a/django_faker/guessers.py +++ b/django_faker/guessers.py @@ -15,7 +15,7 @@ def guessFormat(self, name): name = name.lower() generator = self.generator if re.findall(r'^is[_A-Z]', name): return lambda x:generator.boolean() - if re.findall(r'(_a|A)t$', name): return lambda x:generator.dateTime() + if re.findall(r'(_a|A)t$', name): return lambda x:generator.date_time() if name in ('first_name','firstname'): return lambda x: generator.firstName() if name in ('last_name','lastname'): return lambda x: generator.lastName() diff --git a/django_faker/populator.py b/django_faker/populator.py index 623ba55..a47c739 100644 --- a/django_faker/populator.py +++ b/django_faker/populator.py @@ -18,9 +18,9 @@ def guessFormat(self, field): if isinstance(field, BooleanField): return lambda x: generator.boolean() if isinstance(field, NullBooleanField): return lambda x: generator.nullBoolean() if isinstance(field, DecimalField): return lambda x: generator.pydecimal(rightDigits=field.decimal_places) - if isinstance(field, SmallIntegerField): return lambda x: generator.randomInt(0,65535) - if isinstance(field, IntegerField): return lambda x: generator.randomInt(0,4294967295) - if isinstance(field, BigIntegerField): return lambda x: generator.randomInt(0,18446744073709551615) + if isinstance(field, SmallIntegerField): return lambda x: generator.random_int(0,65535) + if isinstance(field, IntegerField): return lambda x: generator.random_int(0,4294967295) + if isinstance(field, BigIntegerField): return lambda x: generator.random_int(0,18446744073709551615) if isinstance(field, FloatField): return lambda x: generator.pyfloat() if isinstance(field, CharField): if field.choices: From dc24bc12e8eb1308545b2580c6f080936104f26d Mon Sep 17 00:00:00 2001 From: eunsung Date: Sun, 22 Dec 2024 15:23:50 +0900 Subject: [PATCH 2/4] required for django >=2.0.0 --- django_faker/populator.py | 2 +- runtests.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/django_faker/populator.py b/django_faker/populator.py index a47c739..b8f3fb2 100644 --- a/django_faker/populator.py +++ b/django_faker/populator.py @@ -62,7 +62,7 @@ def guessFieldFormatters(self, generator): # yield field.name, getattr(self, field.name) fieldName = field.name if isinstance(field, (ForeignKey,ManyToManyField,OneToOneField)): - relatedModel = field.rel.to + relatedModel = field.remote_field.model def build_relation(inserted): if relatedModel in inserted and inserted[relatedModel]: diff --git a/runtests.py b/runtests.py index fe0ab13..21f4343 100644 --- a/runtests.py +++ b/runtests.py @@ -2,6 +2,7 @@ import sys from django.conf import settings +import django def configure(): @@ -22,6 +23,7 @@ def configure(): SITE_ID=1, SECRET_KEY=fake.sha1(), ) + django.setup() if not settings.configured: configure() From b405bdcb4baf3a52cf9612a4f125eeaeb6d03b69 Mon Sep 17 00:00:00 2001 From: eunsung Date: Sun, 22 Dec 2024 15:24:18 +0900 Subject: [PATCH 3/4] handling DurationField --- django_faker/populator.py | 8 +++++--- django_faker/tests.py | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/django_faker/populator.py b/django_faker/populator.py index b8f3fb2..c82eb8b 100644 --- a/django_faker/populator.py +++ b/django_faker/populator.py @@ -1,8 +1,8 @@ import random from django_faker.guessers import Name from django.db.models.fields import * -from django.db.models import ForeignKey, ManyToManyField, OneToOneField, ImageField - +from django.db.models import ForeignKey, ManyToManyField, OneToOneField, ImageField, DurationField +from datetime import timedelta class FieldTypeGuesser(object): @@ -24,13 +24,15 @@ def guessFormat(self, field): if isinstance(field, FloatField): return lambda x: generator.pyfloat() if isinstance(field, CharField): if field.choices: - return lambda x: generator.randomElement(field.choices)[0] + return lambda x: generator.random_element(field.choices)[0] return lambda x: generator.text(field.max_length) if field.max_length >= 5 else generator.word() if isinstance(field, TextField): return lambda x: generator.text() if isinstance(field, DateTimeField): return lambda x: generator.dateTime() if isinstance(field, DateField): return lambda x: generator.date() if isinstance(field, TimeField): return lambda x: generator.time() + if isinstance(field, DurationField): return lambda x: timedelta(seconds=generator.random_int(60, 86400)) + if isinstance(field, URLField): return lambda x: generator.uri() if isinstance(field, SlugField): return lambda x: generator.slug() diff --git a/django_faker/tests.py b/django_faker/tests.py index f7f9f00..b1096dd 100644 --- a/django_faker/tests.py +++ b/django_faker/tests.py @@ -2,13 +2,16 @@ from django_faker.populator import Populator from django_faker import Faker as DjangoFaker +import django from django.db import models -from django.utils import unittest +import unittest +from unittest import skipIf from django.template import Context, TemplateSyntaxError from django.template import Template fake = Faker() + class Game(models.Model): title= models.CharField(max_length=200) @@ -26,8 +29,13 @@ class Player(models.Model): nickname= models.CharField(max_length=100) score= models.BigIntegerField() last_login_at= models.DateTimeField() + game= models.ForeignKey(Game, on_delete=models.CASCADE) + - game= models.ForeignKey(Game) +class GamePlayTime(models.Model): + game = models.ForeignKey(Game, on_delete=models.CASCADE) + player = models.ForeignKey(Player, on_delete=models.CASCADE) + duration = models.DurationField() class Action(models.Model): @@ -46,9 +54,26 @@ class Action(models.Model): name= models.CharField(max_length=4, choices=ACTIONS) executed_at= models.DateTimeField() - actor= models.ForeignKey(Player,related_name='actions', null=True) - target= models.ForeignKey(Player, related_name='enemy_actions+', null=True) + actor= models.ForeignKey(Player, on_delete=models.CASCADE, related_name='actions', null=True) + target= models.ForeignKey(Player, on_delete=models.CASCADE, related_name='enemy_actions+', null=True) + +class TestDurationField(unittest.TestCase): + def testGamePlayTime(self): + generator = fake + + populator = Populator(generator) + populator.addEntity(Game, 10) + populator.addEntity(Player, 10, { + 'game': lambda x: Game.objects.order_by('?').first() + }) + populator.addEntity(GamePlayTime, 10, { + 'game': lambda x: Game.objects.order_by('?').first(), + 'player': lambda x: Player.objects.order_by('?').first() + }) + + insertedPks = populator.execute() + self.assertEqual(len(insertedPks[GamePlayTime]), 10) class PopulatorTestCase(unittest.TestCase): @@ -83,7 +108,7 @@ def testFormatter(self): populator.addEntity(Game,5) populator.addEntity(Player, 10, { - 'score': lambda x: fake.randomInt(0,1000), + 'score': lambda x: fake.random_int(0,1000), 'nickname': lambda x: fake.email() }) populator.addEntity(Action,30) @@ -96,6 +121,7 @@ def testFormatter(self): self.assertTrue( any([0 <= p.score <= 1000 and '@' in p.nickname for p in Player.objects.all() ]) ) +@skipIf(django.VERSION >= (2, 0), "Template tags not supported in Django 2.0+") class TemplateTagsTestCase(unittest.TestCase): @staticmethod @@ -151,7 +177,7 @@ def testOrFakeFilterTag(self): def testFullXmlContact(self): self.assertTrue(self.render(""" - {% fake 'randomInt' 10 20 as times %} + {% fake 'random_int' 10 20 as times %} {% for i in 10|get_range %} From cd53da0869935289ac2fb06c17d6e418e1cdb2cd Mon Sep 17 00:00:00 2001 From: eunsung Date: Sun, 22 Dec 2024 15:28:32 +0900 Subject: [PATCH 4/4] faker methods using snake_case --- .gitignore | 3 +++ django_faker/guessers.py | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 3a8691b..71cd7f5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ *.egg-info/* docs/_build/* dist/* +venv/* +.eggs/* +build/* diff --git a/django_faker/guessers.py b/django_faker/guessers.py index 104d4a6..ec490fa 100644 --- a/django_faker/guessers.py +++ b/django_faker/guessers.py @@ -17,15 +17,15 @@ def guessFormat(self, name): if re.findall(r'^is[_A-Z]', name): return lambda x:generator.boolean() if re.findall(r'(_a|A)t$', name): return lambda x:generator.date_time() - if name in ('first_name','firstname'): return lambda x: generator.firstName() - if name in ('last_name','lastname'): return lambda x: generator.lastName() + if name in ('first_name','firstname'): return lambda x: generator.first_name() + if name in ('last_name','lastname'): return lambda x: generator.last_name() - if name in ('username','login','nickname'): return lambda x:generator.userName() + if name in ('username','login','nickname'): return lambda x:generator.user_name() if name in ('email','email_address'): return lambda x:generator.email() - if name in ('phone_number','phonenumber','phone'): return lambda x:generator.phoneNumber() + if name in ('phone_number','phonenumber','phone'): return lambda x:generator.phone_number() if name == 'address' : return lambda x:generator.address() if name == 'city' : return lambda x: generator.city() - if name == 'streetaddress' : return lambda x: generator.streetaddress() + if name == 'streetaddress' : return lambda x: generator.street_address() if name in ('postcode','zipcode'): return lambda x: generator.postcode() if name == 'state' : return lambda x: generator.state() if name == 'country' : return lambda x: generator.country()