Skip to main content

A small package that helps generate content to fill databases for tests

Project description

tests coverage

fake-gen

A simple package that generates data for tests.

fake_gen provides the basic Factory and DictFactory classes that generate content. it also provides many more specialized factories that provide extended functionality. every Factory instance knows how many elements its going to generate, this enables us to generate statistical results.

The DictFactory is especially useful if you want to generate data that you will later input to your NoSQL, Document based database

In addition, using the DictFactory and the DependentField factories allows us to create factorys that depend on the results of other factories. (see Examples for more information).

fake_gen isn't bound to a specifc database, but does include database specfic modules inside, like - extra.mongodb.py) but it will always be clean of database related dependencies.

Installation

pip install fake-gen

Examples

We integrate the awsome faker package to generate data using FakeDataFactory, this allows us to generate all sorts of content like: * Names (First, last, full names) * companies * addresses * emails * urls * and much much more

lets create a very simple factory that generates Users:

import fake_gen

class Users(fake_gen.DictFactory):
    id = fake_gen.CountingFactory(10)
    firstname = fake_gen.FakeDataFactory('firstName')
    lastname = fake_gen.FakeDataFactory('lastName')
    address = fake_gen.FakeDataFactory('address')
    age = fake_gen.RandomInteger(10, 30)
    gender = fake_gen.RandomSelection(['female', 'male'])

for user in Users().generate(10): # let say we only want 10 users
    print user
    # {'firstname': 'Toni', 'lastname': 'Schaden', 'gender': 'female', 'age': 18, 'address': '0641 Homenick Hills\nSouth Branson, RI 70388', 'id': 10}
    # {'firstname': 'Gene', 'lastname': 'Greenfelder', 'gender': 'male', 'age': 17, 'address': '292 Loy Lights Suite 328\nFritzfort, IN 73914', 'id': 11}
    # or more likely you'd want to insert them into your favorite database (MongoDB, ElasticSearch, ..)

When creating our own subclasses for DictFactory, we can make some fields dependent on other fields. for example:

class ExampleFactory(DictFactory):
    a = CountingFactory(10)
    b = ClonedField("a") # b will have the same value as field 'a'

for e in ExampleFactory().generate(100):
    print e

# {'a': 10, 'b': 10}
# {'a': 11, 'b': 11}
# ...

Lets say we want to generate something like events data, we want events to have a start time, and an end time that will be 20 minutes in the future. In addition, we want the event's start_time will be 12 minutes apart.

import fake_gen

EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
class EventsFactory(fake_gen.DictFactory):
    start_time = fake_gen.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
    end_time = fake_gen.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
    event_code = fake_gen.RandomSelection(EVENT_TYPES)

for event in EventFactory().generate(100):
    print event
    # {'start_time': datetime.datetime(2013, 12, 23, 13, 37, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 13, 57, 1, 591878), 'event_code': 'USER_CONNECTED'}
    # {'start_time': datetime.datetime(2013, 12, 23, 13, 49, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 14, 9, 1, 591878), 'event_code': 'USER_LOGIN'}
    # {'start_time': datetime.datetime(2013, 12, 23, 14, 1, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 14, 21, 1, 591878), 'event_code': 'USER_DISCONNECT'}

We also have factories that allow us to generate different data distributed by different percentage, for example, lets say we want to create a 'Job', that will have an assigned user field, a state field and a description field. We want the state to be 'pending' in 90% of dictionaries and 'error' in the rest of them. In addition, we want that if the 'state' field is 'error' the assigned user will be 'support', or else it should be 'admin'.

class Job(fake_gen.DictFactory):
    state = fake_gen.StatisticalValuesFactory([('pending', 90), ('error', 10)])
    assigned_user = fake_gen.ConditionalValueField('state', {'error': 'support'}, 'admin')
    description = fake_gen.RandomLengthStringFactory()

for i in Job().generate(10):
    print i
    # {'state': 'error', 'assigned_user': 'support', 'description': 'jUlyFByPxPdFlBPBfPaGaTPPuajFSHXKkyewzrQ'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'tOzkgmBBnxQZhSYEjVduyXGdLrtqeTZqRxmHNXbaJBfpdNxuLKWyTDxkCZgiZTLHeiKEswvIyDzAnuuOLtXmVWhjvazaOYuu'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'TIDVuvZRUBLLTtG'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'RgcSaFzmMrhwCAZjLofikmXJhtqkVOTsWHnqTXjgrxgzTKH'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'tLkSEkCbYDvlcDBDWUBGMmidEdOxeiLDBADDKnqGqWLnxUBqzOXFXnBxkiGTymuGNbUnmxyawzLGsiummCiwxNSw'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'tUyYLofuZpceaWYKkiRvksQLqFHGOiwACuPIvRxMIuftJPsObSqCBcrQnOkOhqAukfMwrY'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'JbFrUxrERMObfwhEtCQGcxEbimvoTFwJriSfRFLFkBpyemqEfqUCGKmVlgSlVoZrrnetEnLCgbfobFbTMQOZ'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'lqatAwdcQuMMOPiYdVMRyyQgEIzOlcoozijjdCfXsVoZnnTtQjPSGBFZQGSkPblJrTIYLAotiZoyYRFrlncevwuNcqfOmeXeCPD'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'VYxnhydWtIUFiOEPszVQHuxYBIUGDyAefZiPIgkWHCMmophiueXbixXtdwKQkuvWImuErMOOOcwevQHGApXkolhjAq'}
    # {'state': 'pending', 'assigned_user': 'admin', 'description': 'RcawgTkQggchdHppSyQxnbDdNxqkGqbQWnQMSlorqnAQLdAqyWnKtGpXaZuVdxcGQBImzVPQsYAbIFUIpqvDzwTDdRpleBrc'}

In version 1.0.5 we extended the DictFactory to support passing additional factories, or overriding existing factories, for a specific instance. Lets take for example our 'User' example from the begining.

import fake_gen
class Users(fake_gen.DictFactory):
    id = fake_gen.CountingFactory(10)
    firstname = fake_gen.FakeDataFactory('firstName')
    lastname = fake_gen.FakeDataFactory('lastName')
    address = fake_gen.FakeDataFactory('address')
    age = fake_gen.RandomInteger(10, 30)
    gender = fake_gen.RandomSelection(['female', 'male'])

But lets override it so the 'firstname' always returns John, and make the age be a random integer between 40 and 60 and add an 'email' field.

for user in Users(firstname=fake_gen.Constant('John'), age=fake_gen.RandomInteger(40, 60), email=fake_gen.FakeDataFactory('email')).generate(10): # let say we only want 10 users
    print user
    #{'firstname': 'John', 'gender': 'male', 'age': 54, 'email': 'hazle.wehner@brekke.com', 'lastname': 'Willms', 'address': '245 Pfeffer Light Apt. 309\nEast Audieside, IN 11931', 'id': 10}
    #{'firstname': 'John', 'gender': 'male', 'age': 47, 'email': 'mariam25@gmail.com', 'lastname': 'Ratke', 'address': '98710 Freddy Gateway\nDelilahborough, GU 50849', 'id': 11}
    #{'firstname': 'John', 'gender': 'male', 'age': 55, 'email': 'tyler22@yahoo.com', 'lastname': 'Cormier', 'address': '432 Block Locks Apt. 547\nNew Estel, NJ 54026', 'id': 12}
    # or more likely you'd want to insert them into your favorite database (MongoDB, ElasticSearch, ..)

Factories

See the Factorie's Docstrings for more examples and doctests.

Bases

Factory Class Description
Factory The base class of all the factories.
DictFactory A very powerful base class. allows sub classing to create factories that generate dicts with a specific schema (see [Examples][#Examples]).
ListFactory A factory that returns on each iteration a list of elements_per_list items returned from calls to the given factory.
Callable Gets a callable object as an argument and returns the result of calling the object on every iteration
DependentCallable Gets a callable object as an argument and returns the result of calling the object passing the defined fields as arguments on every iteration
ClonedField A factory that copies the value of another factory.

Dates

Factory Class Description
RandomDateFactory Generates random dates (python's datetime) between 2 dates
DateIntervalFactory Generates datetime objects starting from base while adding delta to it each iteration.
RelativeToDatetimeField Generates datetime object relative to another datetime field, like if you have start_time which is a RandomDateFactory field, and want an end_time field that is always 15 minutes later.

And MUCH MUCH more..

Todos

  • Add usage documentation for each factory (using doctest maybe?)
  • Add more tests
  • Add GeoLocationFactories to generates Location and distance related data (for example, random points near a central point).
  • Add MORE Statistical Factories
  • more ideas welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fake-gen-1.0.0b2.tar.gz (19.1 kB view details)

Uploaded Source

Built Distribution

fake_gen-1.0.0b2-py2.py3-none-any.whl (19.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file fake-gen-1.0.0b2.tar.gz.

File metadata

  • Download URL: fake-gen-1.0.0b2.tar.gz
  • Upload date:
  • Size: 19.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for fake-gen-1.0.0b2.tar.gz
Algorithm Hash digest
SHA256 673c53265fd22a6bd4a26841d8b93a706902f03019b730b5ad942b08fa5ad382
MD5 e3717306d230b998ba454f2f3c2e5c69
BLAKE2b-256 698bb190da7b1dddca688098cfb7e54d4dc8f8f29b931c213c8b057eecec8393

See more details on using hashes here.

File details

Details for the file fake_gen-1.0.0b2-py2.py3-none-any.whl.

File metadata

  • Download URL: fake_gen-1.0.0b2-py2.py3-none-any.whl
  • Upload date:
  • Size: 19.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for fake_gen-1.0.0b2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c561ede02e9c0f8da8c93a767d6a6367967c57b97e3084032f5d033b7eac3736
MD5 6cee46131fa82fa7809a451de0a2b3f8
BLAKE2b-256 8e702940357054bf756508b18340a9c7251f2451242fe7a4fb4478b850677576

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page