{ "info": { "author": "James Westby", "author_email": "james.westby@canonical.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.6", "Topic :: Database", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Testing" ], "description": "django_factory\n==============\n\ndjango_factory is a generic implementation of `Creation Methods`_ for Django models.\n\n.. _Creation Methods: http://xunitpatterns.com/Creation%20Method.html\n\nUsing django_factory in your tests means that each test can create instances of the\nmodels, but only has to specify the model attributes that are germane to that\nparticular test.\n\nUsing creation methods usually leads to tests that are easier to read, and\nmakes it easier to avoid convoluted test setup methods that are shared, as\nthe pre-conditions for each test are easier to establish.\n\nLineage\n-------\n\ndjango_factory is inspired by `model_mommy`_ but has several important\nimprovements:\n\n.. _model_mommy: https://github.com/vandersonmota/model_mommy\n\n * The creation methods are deterministic.\n\n - This ensures that your tests are repeatable, and you will have\n fewer eratic tests.\n\n - As the default values in the test are deterministic, if they\n suit a test they can be omitted. With random values you have\n to specify many more of the values, reducing the benefit you\n get from creation methods.\n\n * Model-specific creation logic can be specified on the model itself,\n encapsulating the logic there.\n\nUse\n---\n\nThe first thing to do is create an instance of the factory::\n\n from django_factory import Factory\n\n factory = Factory()\n\nOften this will be done in the setUp method of a TestCase::\n\n class ModelTests(TestCase):\n\n def setUp(self):\n super(ModelTests, self).setUp()\n self.factory = Factory()\n\nIf you are using `testtools`_ then you can pass your test case\ninstance to the constructor in order to get better default\nvalues::\n\n class ModelTests(DjangoTestCase, TesttoolsTestCase):\n\n def setUp(self):\n super(ModelTests, self).setUp()\n self.factory = Factory(test_case=self)\n\n.. _testtools: http://pypi.python.org/pypi/testtools\n\nHowever, you don't have to define this yourself, you can just subclass\nthe provided ``TestCase`` or ``TransactionTestCase`` classes\n(corresponding to the Django classes of the same names) and\nstart using ``self.factory`` in your tests::\n\n from django_factory import TestCase\n\n class ModelTests(TestCase):\n pass\n\nOnce you have a factory instance you can create instances of\nyour models::\n\n def test_model(self):\n instance = self.factory.make_one(Model)\n\nThis will create an instance of Model with arbitrary values for\nits attributes. If you need to fix particular attribute values\nthen pass them in to the make_one method::\n\n def test_model(self):\n instance = self.factory.make_one(Model, name=\"Mike\")\n # Now instance.name == \"Mike\"\n\nThere are a few other methods that you might want to use::\n\n def test_model(self):\n instances = self.factory.make(5, Model, name=\"Mike\")\n # instances will now be a list of 5 Model instances, each\n # with name == 'Mike'\n\n instance = self.factory.prepare_one(Model, name=\"Mike\")\n # This time the instance won't be saved, you'll have to\n # do that if you want. Also note that ForeignKey and\n # ManyToManyFields will be empty, as they can't be filled\n # when not saving.\n\n instances = self.factory.prepare(5, Model, name=\"Mike\")\n # The same as make(), but without saving the instances.\n\n\nCustomising the behaviour\n-------------------------\n\nFrequently the generated values won't be right for the particular\nmodel that you have. In these cases you can override the way\nthat the values are created in order to suit your particular\nrequirements.\n\nThis overriding is done by creating a \"Factory\" nested class\non the model::\n\n class Person(models.Model):\n\n name = models.CharField(max_length=100)\n active = models.BooleanField()\n\nIf we create an instance of Person using the factory, it will\nhave ``active == False``::\n\n person = factory.make_one(Person)\n print person.active\n\nIt may be that you want most of your tests to use active people,\nand just test with inactive people in a few cases. You could\ndo this by passing the value every time::\n\n person = factory.make_one(Person, active=True)\n\nHowever this would be very repetitive. Instead you can override\nthe default value using a nested class::\n\n class Person(models.Model):\n\n name = models.CharField(max_length=100)\n active = models.BooleanField()\n\n class Factory:\n @staticmethod\n def get_active(field, factory):\n return True\n\nNow if you don't specify ``active`` when calling the factory,\nthe person instance will have ``active == True``::\n\n person = factory.make_one(Person)\n print person.active\n\nThe value for each field can be controlled in this way, by\nproviding a method on the ``Factory`` nested class that is\nnamed ``get_`` and the name of the field to control the\nvalue of.\n\nThe values passed to the ``get_active`` method are as follows:\n\n * ``field``: the field instance the value is being generated\n for. This is useful if you have a function which is used for\n several fields, and want to include some information from\n the field in the value, such as the name::\n\n class Factory:\n @staticmethod\n def get_name(field, factory):\n return field.name\n\n * ``factory``: the factory instance that is being used to generate\n the value. This is passed so that you can access the methods\n on the factory if needed. The methods that may be useful are:\n\n * ``prepare``/``prepare_one``: if you need a model instance\n for a field then you can ask the factory to create one for\n you, passing in any important values.\n\n * ``getUniqueInteger``: it is a good idea to include some\n uniqueness in the values that you are generating, so that\n you are less likely to get tests passing by accident, and\n it's easier to track back from a value to where it was\n created. This is one of the methods the factory provides\n that will help with that. It will return an integer that\n will only be returned once by the factory in any particular\n test run.\n\n * ``getUniqueString``/``getUniqueUnicode``/``getUniqueDate``/\n ``getUniqueTime``/``getUniqueDateTime``: similar to ``getUniqueInteger``,\n but will return an object of type ``str``, ``unicode``,\n ``datetime.date``, ``datetime.time``, ``datetime.datetime``\n respectively.\n\nYou can return any value from the method (including None) and it will\nbe set on the resulting instance. However, the instance must then pass\nvalidation, so errors will be caught early.\n\nBy default, when the factory finds a ManyToManyField, it will create\none instance of the referenced model for each instance of the model\nthat it creates. You can control this behaviour by providing an attribute\nnamed ``number_of_`` and the name of the ManyToManyField::\n\n class Team(models.Model):\n\n people = models.ManyToManyField(Person)\n\n class Factory:\n number_of_people = 5\n\nLastly, if controlling individual fields is not sufficient, you can\nprovide a single method, ``make_instance`` that is expected to\ncreate an instance of the model when called. This is necessary\nwhen there are complex inter-dependencies between the fields::\n\n\n class Person(models.Model):\n\n name = models.CharField(max_length=100)\n active = models.BooleanField()\n\n class Factory:\n\n @staticmethod\n def make_instance(factory, name=None, active=None):\n if name is None:\n name = factory.getUniqueUnicode(prefix=\"name\")\n if active is None:\n active = True\n return Person(name=name, active=active)\n\nAgain you are passed a ``factory`` instance in order to be able\nto get unique values to use in the model.\n\nNote that it is expected that your ``make_instance`` method doesn't\nsave the model, otherwise ``prepare`` won't work correctly with the\nmodel.\n\nCustom field types\n------------------\n\nIf you write a custom field you will want the factory to be able to\ngenerate values for that field.\n\nIn order to do that you need to write a function that returns a\nsuitable value for the field when passed an instance of the field\nand an instance of the factory::\n\n def generate_value_for_custom_field(field, factory):\n # Use uniqueness provided by factory, and inspect\n # field for any constraints that are relevant. Return\n # a suitable value\n\nOnce you have your function you can pass it to the factory\nconstructor as part of the field_mapping::\n\n field_mapping = Factory.DEFAULT_FIELD_MAPPING.copy()\n field_mapping[CustomField] = generate_value_for_custom_field\n factory = Factory(field_mapping=field_mapping)\n\nNow you can use the factory to get an instance of any model using\nthe custom field without having to override the generator at the\nmodel level.\n\nGenerators for models you don't control\n---------------------------------------\n\nSometimes you will want to customise the behaviour of models\nyou don't control. In those cases you can't define a Factory\nnested class on the model, so instead you can control their\nbehaviour through model_generators::\n\n def create_user(factory, name=None, email=None):\n if name is None:\n name = factory.getUniqueUnicode(prefix=\"name\")\n if email is None:\n email = factory.getUniqueString() + \"@example.com\"\n return User(name=name, email=email)\n\n model_generators = {User: create_user}\n factory = Factory(model_generators=model_generators)\n\nNow when you call\n\n::\n\n factory.make_one(User)\n\nit will call your ``create_user`` method to create the instance.\n\nThe default factory provided with django_factory's ``TestCase`` includes\na default generator for the User model so users with passwords can\nbe created:\n\n def test_auth(self):\n password = 'password'\n user = self.factory.make_one(User, password=password)\n logged_in = self.client.login(username=user.username,\n password=password)\n self.assertTrue(loggend_in)\n\nIf a password is not provided, it will default to 'test'.\n\n.. TODO: should there be a mapping from Model to Factory as well/instead?\n\nKnown Limitations\n-----------------\n\n * Using ``ManyToManyField`` with ``through=`` breaks down when\n ```` has multiple ForeignKeys pointing to one of the\n models invovled in the ManyToManyField relationship. Currently you\n have to use ``number_of_ = 0`` to avoid any instances being\n created, and then create them yourself.\n\n * ``ContentType``s (and the associated classes, e.g. ``GenericRelation``)\n will not be created with valid values without using ``model_generators``.\n\n * ``FilePathField`` is not currently supported in the default\n ``field_mapping``.\n\n * ``FileField`` and ``ImageField`` do not create files on the filesystem,\n and you cannot use the ``save`` etc. methods on the results. You\n can override this either by changing ``field_mapping``, or using\n a ``Factory`` nested class on your models to create the specific fields\n as needed.\n\nPossible future enhancements\n----------------------------\n\nThese are mostly rather vague currently, are in no particular order,\nand may or may not be implemented it this or some other form.\n\n * Fix the `Known Limitations`_.\n\n * Add a ``RandomizingFactory`` that generates random values rather than\n deterministic ones. This can be used as a fuzzer, or everywhere if\n the developer prefers.\n\n - Yes I said above that ``model_mommy``'s random value generation is wrong,\n but it has its uses on occaision, and some people disagree with me,\n so they should be able to use ``django_factory`` with random data and\n take advantage of all the other features.\n\n - It may be better as a boolean on Factory itself, or controlled by\n an environment variable or something.\n\n - Some way of specifying and reporting seeds used for randomization\n is important to allow failures to be reproduced.\n\n * Add a notion of \"states\" or something to the factory so that you can do\n something like::\n\n user = factory.make_one_in_state(User, \"active\")\n admin = factory.make_one_in_state(User, \"admin\")\n\n which fully and fairly explicitly specifies a set of values (e.g. admin\n implies active) while still being terse.\n\n - Some models may want a default state, some may want every creation\n to specify a state.\n\n\nChangelog\n---------\n\n0.11\n````\n\n * Add a model_generator for User, so that a password can be set at creation.\n (Michael Nelson)\n\n\n0.10\n````\n\n * Passing `value=None` to `make_one` for a `ForeignKey` field no longer\n causes a crash. It prevents generation of any value for that field,\n which may cause an error if the field is required.\n\n\n0.9\n```\n\n * Fix `TestCase` compatibility with 2.6. Previously when running under 2.6\n `testtools.TestCase.__init__` wouldn't be called, leading to lots\n of problems.\n\n0.8\n```\n\n * TextFields that have `max_length=None` no longer crash the generator\n (regression due to the `max_length` change in 0.7)\n\n0.7\n```\n\n * Fields with choices are now handled correctly when the choices are split\n in to groups.\n * The max_length of a CharField is now automatically respected.\n * A model with required ForeignKeys and a 'self' ManyToMany fields now\n correctly creates all the required ForeignKeys, rather than failing\n due to broken loop detection as before.\n\n0.6\n```\n\n * validators aren't run when calling ``prepare_one``.\n\n * Chains of ``ForeignKey``s are now correctly handled, saving the models\n as needed to complete the chains.\n\n * ``URLField`` and ``EmailField`` now generate values that pass validation.\n\n * ``ManyToManyField``s with through are now supported on Django 1.1.\n\n0.5\n```\n\n * Generate values for any field that has null=True but blank=False. The\n semantics here aren't entirely clear, but the developer can add\n generators as needed to control the behaviour.\n\n0.4\n```\n\n * Cleanups for pypi: formatting of the README, and addition of classifiers\n to setup.py.\n\n0.3\n```\n\n * Add ``model_generators`` to allow functions to be provided to create\n instances of models where you can't add a nested ``Factory`` class, or\n don't want to use the default.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://launchpad.net/django-factory", "keywords": null, "license": "Apache-2", "maintainer": null, "maintainer_email": null, "name": "django_factory", "package_url": "https://pypi.org/project/django_factory/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django_factory/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://launchpad.net/django-factory" }, "release_url": "https://pypi.org/project/django_factory/0.11/", "requires_dist": null, "requires_python": null, "summary": "Generic factory for creating instances of Django models in tests.", "version": "0.11" }, "last_serial": 791101, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "2b8443fcd15b10bba4be072884620422", "sha256": "1a4f8782dcf8ee86e2cb3f62c33b87b3bdee7e2b84d758c4d1bc77ac00d4fa06" }, "downloads": -1, "filename": "django_factory-0.1-py2.7.egg", "has_sig": true, "md5_digest": "2b8443fcd15b10bba4be072884620422", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 16303, "upload_time": "2011-12-16T17:55:16", "url": "https://files.pythonhosted.org/packages/ff/93/cc29860429f778f1fd4871174ff99b77f158466becab21f79aead0a358d5/django_factory-0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "cdace1ff5c8d7f70c729ce80e704c363", "sha256": "c08de057aa67b5812e6ac63be9c16cd9f3db8ccc3df358614da28a1aebd73414" }, "downloads": -1, "filename": "django_factory-0.1.tar.gz", "has_sig": true, "md5_digest": "cdace1ff5c8d7f70c729ce80e704c363", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19433, "upload_time": "2011-12-16T17:55:03", "url": "https://files.pythonhosted.org/packages/53/85/f17fbdd1f47bb428d1a6a04cd0c255c6d3f015dc6e81b66dd0e532d9ba4a/django_factory-0.1.tar.gz" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "3689e2e310858b60794ffc3206e17021", "sha256": "a29d97aa6093e2eb2d374619fd38a3c9bbc2bf56fab10dfc16749069076ba4b9" }, "downloads": -1, "filename": "django_factory-0.10.tar.gz", "has_sig": true, "md5_digest": "3689e2e310858b60794ffc3206e17021", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33104, "upload_time": "2012-03-07T22:40:39", "url": "https://files.pythonhosted.org/packages/b1/fe/5157b8ba9626323b4180132f0b40e0fef8ba823fe51482426621deaf397b/django_factory-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "32094666022831e0d29df9b964b19f60", "sha256": "532cfa10db4c81d2e39ace29c426c6934dbe55c24fca9063e1e4d4c37e5d8ac9" }, "downloads": -1, "filename": "django_factory-0.11.tar.gz", "has_sig": true, "md5_digest": "32094666022831e0d29df9b964b19f60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33950, "upload_time": "2013-02-13T22:30:17", "url": "https://files.pythonhosted.org/packages/71/1b/bd6161b16534b80d961b5522af6980e27f394b3f1bd68e604bec9c332c75/django_factory-0.11.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "2b96cd55f3c1488d0c60ce4e85276fff", "sha256": "f9d61746bac59d815660cc8a4f188ee1051096da43ea4ea4144e61307c39219c" }, "downloads": -1, "filename": "django_factory-0.2-py2.7.egg", "has_sig": true, "md5_digest": "2b96cd55f3c1488d0c60ce4e85276fff", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 21375, "upload_time": "2011-12-17T00:58:09", "url": "https://files.pythonhosted.org/packages/84/06/73b1233829933d02b409da2d2b1444ff70f253b53d8ba63ccb12acb7517e/django_factory-0.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "3fea0deea405a4afabef86aa537c0932", "sha256": "057389ba6dfae84f74e4818f9f3f8f3db16a3303fbf39ddc6376c738fc76c52c" }, "downloads": -1, "filename": "django_factory-0.2.tar.gz", "has_sig": true, "md5_digest": "3fea0deea405a4afabef86aa537c0932", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37930, "upload_time": "2011-12-17T00:58:14", "url": "https://files.pythonhosted.org/packages/b1/36/8eb8e6cbc3cd6b00f47f139fc29eefd495ec0d9054fb7808ad21704869bb/django_factory-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "449b220243ca2a23c283497567428b7a", "sha256": "354313ad34519e781d7fbad3024f93d4fcc03fab024fdb737b39444c728ccb59" }, "downloads": -1, "filename": "django_factory-0.3-py2.7.egg", "has_sig": true, "md5_digest": "449b220243ca2a23c283497567428b7a", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 22846, "upload_time": "2011-12-17T04:21:14", "url": "https://files.pythonhosted.org/packages/a4/76/574728190d112fbe35ba9d94af3f811c49211d383647ac591da536c0bc69/django_factory-0.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "66918aa5ef0a64a51d24b0f97569f2fd", "sha256": "5993fdd7d03455b8b754bef5586845cf0a1eb4d2d634218352406127e4462bc2" }, "downloads": -1, "filename": "django_factory-0.3.tar.gz", "has_sig": true, "md5_digest": "66918aa5ef0a64a51d24b0f97569f2fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28371, "upload_time": "2011-12-17T04:21:02", "url": "https://files.pythonhosted.org/packages/ad/d3/c6cd6240e886e9e2deffd1045c4c39db61e130ce04155fde9cf11cc580b9/django_factory-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "d9fec06d67cac390fa9351edb0fd60c3", "sha256": "4705c51e5a2a630924b875e5fee3b7ec9feac34e2722a51fb99b806aceadc648" }, "downloads": -1, "filename": "django_factory-0.4-py2.7.egg", "has_sig": true, "md5_digest": "d9fec06d67cac390fa9351edb0fd60c3", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 22993, "upload_time": "2011-12-17T04:40:33", "url": "https://files.pythonhosted.org/packages/cf/c4/5da6c43b31c82c488322e7c5baa957a0c53abc1ff467fdb774f435108588/django_factory-0.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "885c01755a69352d2f01b932302a11fe", "sha256": "c77ac143f86880d6ae079205352af00a0705fec18d7941d17117e2af1de36cb8" }, "downloads": -1, "filename": "django_factory-0.4.tar.gz", "has_sig": true, "md5_digest": "885c01755a69352d2f01b932302a11fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28779, "upload_time": "2011-12-17T04:40:37", "url": "https://files.pythonhosted.org/packages/11/23/9c7e1246d26aa6ec83003112d21737220431de05ccbfdaaf7255a162c220/django_factory-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "aaa3269f9c6060c5b2e7cf6315e77223", "sha256": "07d763506bf60f089ea52f182e826188c8e73c07de999a56b44e8407dfbde87b" }, "downloads": -1, "filename": "django_factory-0.5-py2.7.egg", "has_sig": true, "md5_digest": "aaa3269f9c6060c5b2e7cf6315e77223", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 23145, "upload_time": "2011-12-19T02:13:31", "url": "https://files.pythonhosted.org/packages/df/2f/f3728751cb8190c6767ce63c91e10a84637f2662256e930d9416c5b50489/django_factory-0.5-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "741d914aed80c0b6623ce0394bcf01da", "sha256": "18593ce2c07b2b71eb44f00f58d5eccd6648101d5940c1ccde98dc0b1a890d93" }, "downloads": -1, "filename": "django_factory-0.5.tar.gz", "has_sig": true, "md5_digest": "741d914aed80c0b6623ce0394bcf01da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40568, "upload_time": "2011-12-19T02:13:26", "url": "https://files.pythonhosted.org/packages/c6/26/5eb9d7c650d84e3e1a051deaf119f762eab9d49bd7112e58d8d9aaab4590/django_factory-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "6a35f73cf33047466fdccee3565691dc", "sha256": "1aebfe46d5c1f999d0527d1e70cf98dcd1c04b1d54d7139b13ded85a8fcff4ef" }, "downloads": -1, "filename": "django_factory-0.6-py2.7.egg", "has_sig": true, "md5_digest": "6a35f73cf33047466fdccee3565691dc", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 23597, "upload_time": "2011-12-19T20:11:06", "url": "https://files.pythonhosted.org/packages/77/d0/c5e8046f45bb285f94b9950d3eba9ad68bd4aa3f03ea475d4d7dd8956d05/django_factory-0.6-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "3e7f4fc279d72783e3b6783d1760417e", "sha256": "ef454668f945408610086edec185de555905efddc25badbf54374e6f6e6b8bab" }, "downloads": -1, "filename": "django_factory-0.6.tar.gz", "has_sig": true, "md5_digest": "3e7f4fc279d72783e3b6783d1760417e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45082, "upload_time": "2011-12-19T20:11:08", "url": "https://files.pythonhosted.org/packages/84/6f/d602fe9a6adeddd1fca0f344c8c5a9988a3ca6ab6bcb1233476aa8dd6751/django_factory-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "7eacc6766325d516cc338e88e1bf8361", "sha256": "118c378086638570a682ac8e88e08968a1b13a9121c716f53c845e1f9f140826" }, "downloads": -1, "filename": "django_factory-0.7-py2.7.egg", "has_sig": true, "md5_digest": "7eacc6766325d516cc338e88e1bf8361", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 24467, "upload_time": "2012-01-12T16:45:59", "url": "https://files.pythonhosted.org/packages/f8/f7/d1795c76018e90854c1f11cc557637571bc451038379267c4314436b198a/django_factory-0.7-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "0d73eb21bb863cf50b53ef44f18845b2", "sha256": "32475db476e37e42483d26c028e3f0f6f1c74c7dcf5898d9e8b58be72b614d5b" }, "downloads": -1, "filename": "django_factory-0.7.tar.gz", "has_sig": true, "md5_digest": "0d73eb21bb863cf50b53ef44f18845b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45070, "upload_time": "2012-01-12T16:45:50", "url": "https://files.pythonhosted.org/packages/3b/a4/b02d986936c7fd12ce4639cf05aa954d1c81a2908533fd389f6120297e50/django_factory-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "191b0a501fccffeacce3bc152c79da46", "sha256": "cfef7ce3c931a56af2817f6737714db471940d3cf397e70af098d52ec5887a33" }, "downloads": -1, "filename": "django_factory-0.8.tar.gz", "has_sig": true, "md5_digest": "191b0a501fccffeacce3bc152c79da46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32481, "upload_time": "2012-02-08T00:07:26", "url": "https://files.pythonhosted.org/packages/68/4b/1722a1e971ec8e8a3ed616276ec35176b7d12598b8f0e604b103b7ec216d/django_factory-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "a796de20724698fea274842fff377d51", "sha256": "d512cd4867fd21fa86d20d75b1a4cac1ca2d5adb7f344ab3b29661d9aa234499" }, "downloads": -1, "filename": "django_factory-0.9.tar.gz", "has_sig": true, "md5_digest": "a796de20724698fea274842fff377d51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32844, "upload_time": "2012-02-09T19:39:34", "url": "https://files.pythonhosted.org/packages/86/32/1cec517d5f410344dc32fff392c0eba57740ece8773df93d1bfd11760e2d/django_factory-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "32094666022831e0d29df9b964b19f60", "sha256": "532cfa10db4c81d2e39ace29c426c6934dbe55c24fca9063e1e4d4c37e5d8ac9" }, "downloads": -1, "filename": "django_factory-0.11.tar.gz", "has_sig": true, "md5_digest": "32094666022831e0d29df9b964b19f60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33950, "upload_time": "2013-02-13T22:30:17", "url": "https://files.pythonhosted.org/packages/71/1b/bd6161b16534b80d961b5522af6980e27f394b3f1bd68e604bec9c332c75/django_factory-0.11.tar.gz" } ] }