{ "info": { "author": "Mixcloud", "author_email": "technical@mixcloud.com", "bugtrack_url": null, "classifiers": [], "description": "Django-Experiments\n==================\n\n.. image:: https://codeship.com/projects/1c7cb7a0-caa8-0130-f2cb-36bd8b1bab14/status?branch=master\n :target: https://codeship.com/projects/4846\n\nDjango-Experiments is an AB Testing Framework for Django.\n\nIt is possible to set up an experiment through template tags only.\nThrough the Django admin you can monitor and control experiment progress.\n\nIf you don't know what AB testing is, check out `wikipedia `_.\n\n\nInstallation\n------------\n\nDjango-Experiments is best installed via pip:\n\n::\n\n pip install django-experiments\n\nThis should download django-experiments and any dependencies. If downloading from the repo,\npip is still the recommended way to install dependencies:\n\n::\n\n pip install -r requirements.txt\n\nDependencies\n------------\n- `Django `_\n- `Redis `_\n- `jsonfield `_\n- `django-modeldict `_\n\n(Detailed list in requirements.txt)\n\nIt also requires 'django.contrib.humanize' to be in INSTALLED_APPS.\n\nUsage\n-----\n\nThe example project is a good place to get started and have a play.\nResults are stored in redis and displayed in the Django admin. The key\ncomponents of this framework are: the experiments, alternatives and\ngoals.\n\n\nConfiguration\n~~~~~~~~~~~~~\n\nBefore you can start configuring django-experiments, you must ensure\nyou have a redis server up and running. See `redis.io `_ for downloads and documentation.\n\nThis is a quick guide to configuring your settings file to the bare minimum.\nFirst, add the relevant settings for your redis server (we run it as localhost):\n\n::\n\n #Example Redis Settings\n EXPERIMENTS_REDIS_HOST = 'localhost'\n EXPERIMENTS_REDIS_PORT = 6379\n EXPERIMENTS_REDIS_DB = 0\n\nNext, activate the apps by adding them to your INSTALLED_APPS:\n\n::\n\n #Installed Apps\n INSTALLED_APPS = [\n ...\n 'django.contrib.admin',\n 'django.contrib.humanize',\n 'experiments',\n ]\n\nInclude 'django.contrib.humanize' as above if not already included.\n\nInclude the app URLconf in your urls.py file:\n\n url(r'experiments/', include('experiments.urls')),\n\nWe haven't configured our goals yet, we'll do that in a bit. Please ensure\nyou have correctly configured your STATIC_URL setting.\n\nOPTIONAL:\nIf you want to use the built in retention goals you will need to include the retention middleware:\n\n::\n\n MIDDLEWARE_CLASSES [\n ...\n 'experiments.middleware.ExperimentsRetentionMiddleware',\n ]\n\n*Note, more configuration options are detailed below.*\n\n\nExperiments and Alternatives\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe experiment can be manually created in your Django admin. Adding alternatives must currently be done in template tags or by calling the relevant code, as described below.\n\nAn experiment allows you to test the effect of various design\nalternatives on user interaction. Django-Experiments is designed to work\nfrom within django templates, to make it easier for designers. We begin\nby loading our module:\n\n::\n\n {% load experiments %}\n\nand we then define our first experiment and alternative, using the\nfollowing syntax:\n\n::\n\n {% experiment EXPERIMENT ALTERNATIVE %}\n\nWe are going to run an experiment called \u201cregister\\_text\u201d to see what\nregistration link text causes more users to complete the registration\nprocess. Our first alternative must always be the \u201ccontrol\u201d alternative.\nThis is our fallback if the experiment is disabled.\n\n::\n\n {% experiment register_text control %}\n Register now.\n {% endexperiment %}\n\nSo while the experiment is disabled, users will see a register link\nsaying \u201cRegister now\u201d. Let\u2019s define another, more polite alternative:\n\n::\n\n {% experiment register_text polite %}\n Please register!\n {% endexperiment %}\n\nWhile experiment is disabled, users will still see the \u201ccontrol\u201d\nalternative, and their registration link will say \u201cRegister now\u201d. When\nthe experiment is enabled, users will be randomly assigned to each\nalternative. This information is stored in the enrollment, a unique\ncombination of the user, the experiment and which alternative they are\nassigned to.\n\nMake sure the experiment tag has access to the request object (not an\nissue for regular templates but you might have to manually add it\ninside an inclusion tag) or it will silently fail to work.\n\nThe experiment_enroll assignment tag can also be used (note that it\ntakes strings or variables unlike the older experiment tag):\n\n::\n\n {% experiment_enroll \"experiment_name\" \"alternative1\" \"alternative2\" as assigned_alternative %}\n {% if assigned_alternative == \"alternative1\" or assigned_alternative == \"alternative2\" %}\n Please register!\n {% else %}\n Register now.\n {% endif %}\n\nYou can also enroll users in experiments and find out what alternative they\nare part of from python. To enroll a user in an experiment and show a\ndifferent result based on the alternative:\n\n::\n\n from experiments.utils import participant\n alternative = participant(request).enroll('register_text', ['polite'])\n if alternative == 'polite':\n text_to_show = get_polite_text()\n elif alternative == 'control':\n text_to_show = get_normal_text()\n\nIf you wish to find out what experiment alternative a user is part of, but not\nenroll them if they are not yet a member, you can use get_alternative. This\nwill return 'control' if the user is not enrolled. 'control' is also returned\nfor users who are enrolled in the experiment but have been assigned to the\ncontrol group - there is no way to differentiate between these cases.\n\n::\n\n from experiments.utils import participant\n alternative = participant(request).get_alternative('register_text')\n if alternative == 'polite':\n header_text = get_polite_text_summary()\n elif alternative == 'control':\n header_text = get_normal_text_summary()\n\nBy default the participant function expects a HttpRequest object, but you can\nalternatively pass a user or session as a keyword argument\n\n::\n\n participant(user=current_user).get_alternative('register_text')\n participant(session=session).get_alternative('register_text')\n\n\n\\*\\ *Experiments will be dynamically created by default if they are\ndefined in a template but not in the admin. This can be overridden in\nsettings.*\n\nAfter creating an experiment either using the Django admin, or through\ntemplate tags or code, you must enable the experiment in the Django\nadmin or manually for it to work.\n\n\nGoals\n~~~~~\n\nGoals allow us to acknowledge when a user hits a certain page. You\nspecify them in the EXPERIMENTS\\_GOALS tuple in your settings. Given the\nexample above, we would want a goal to be triggered once the user has\ncompleted the registration process.\n\nAdd the goal to our EXPERIMENT_GOALS tuple in setting.py:\n\n::\n\n EXPERIMENTS_GOALS = (\"registration\",)\n\nGoals are simple strings that uniquely identify a goal.\n\nOur registration successful page will contain the goal template tag:\n\n::\n\n {% experiment_goal \"registration\" %}\n\nThis will be fired when the user loads the page. This is not the only way of firing a goal. In total, there are four ways of recording goals:\n\n1. **Django Template Tags** (as above).\n\n ::\n\n {% experiment_goal \"registration\" %}\n\n2. **Server side**, using a python function somewhere in your django views:\n\n ::\n\n from experiments.utils import participant\n\n participant(request).goal('registration')\n\n3. **JavaScript onclick**:\n\n ::\n\n \n\n (Please note, this requires CSRF authentication. Please see the `Django Docs `_)\n\n4. **Cookies**:\n\n ::\n\n Complete Registration\n\nMultiple goals can be recorded via the cookie using space as a separator.\n\nThe goal is independent from the experiment as many experiments can all\nhave the same goal. The goals are defined in the settings.py file for\nyour project.\n\nRetention Goals\n~~~~~~~~~~~~~~~\n\nThere are two retention goals (VISIT_PRESENT_COUNT_GOAL and VISIT_NOT_PRESENT_COUNT_GOAL that\ndefault to '_retention_present_visits' and '_retention_not_present_visits' respectively). To\nuse these install the retention middleware. A visit is defined by no page views within\nSESSION_LENGTH hours (defaults to 6).\n\nVISIT_PRESENT_COUNT_GOAL does not trigger until the next visit after the user is enrolled and\nshould be used in most cases. VISIT_NOT_PRESENT_COUNT_GOAL triggers on the first visit after\nenrollment and should be used in situations where the user isn't present when being enrolled\n(for example when sending an email). Both goals are tracked for all experiments so take care\nto only use one when interpreting the results.\n\nConfirming Human\n~~~~~~~~~~~~~~~~\n\nThe framework can distinguish between humans and bots. By including\n\n::\n {% load experiments %}\n\n {% experiments_confirm_human %}\n\nat some point in your code (we recommend you put it in your base.html\nfile), unregistered users will then be confirmed as human. This can be\nquickly overridden in settings, but be careful - bots can really mess up\nyour results!\n\nIf you want to customize the confirm human code you can change the\nCONFIRM_HUMAN_SESSION_KEY setting and manage setting the value yourself.\nNote that you need to call confirm_human on the participant when they\nbecome confirmed as well as setting session[CONFIRM_HUMAN_SESSION_KEY]\nequal to True.\n\nManaging Experiments\n--------------------\n\nExperiments can be managed in the Django admin (/admin/experiments/experiment/ by\ndefault).\n\nThe States\n~~~~~~~~~~\n\n**Control** - The experiment is essentially disabled. All users will see\nthe control alternative, and no data will be collected.\n\n**Enabled** - The experiment is enabled globally, for all users.\n\n\nSettings\n--------\n\n::\n\n #Experiment Goals\n EXPERIMENTS_GOALS = ()\n\n #Auto-create experiment if doesn't exist\n EXPERIMENTS_AUTO_CREATE = True\n\n #Toggle whether the framework should verify user is human. Be careful.\n EXPERIMENTS_VERIFY_HUMAN = False\n\n #Example Redis Settings\n EXPERIMENTS_REDIS_HOST = 'localhost'\n EXPERIMENTS_REDIS_PORT = 6379\n EXPERIMENTS_REDIS_DB = 0\n\nSee conf.py for other settings\n\n\nChangelog\n---------\n1.2.0\n~~~~~\n - Add support for Django 1.10 (Thanks to @Kobold)\n - Make requirements.txt more flexible\n - Tox support added for testing on multiple Django Versions (Thanks to @Kobold again!)\n\n1.1.6\n~~~~~\n - Change to use django-modeldict-yplan as its maintained\n - Change to use pythons inbuilt unittest and not Django's as its Deprecated)\n\n1.1.5\n~~~~~\n - Removing experiment_helpers template tag library since it is no longer used and breaks under Django 1.9 (thanks david12341235)\n\n1.1.4\n~~~~~\n\n - Removing django-jsonfield from requirements.txt (thank you to bustavo) and adding jsonfield\n\n1.1.2\n~~~~~\n\n - Updating migrations\n - Documentation improvements\n - Updating example app\n\n1.1.1\n~~~~~\n\n - Fixing EXPERIMENTS_AUTO_CREATE flag (previously setting it to True did nothing)\n\n1.1.0\n~~~~~\n\n - Nexus is no longer required or used - the standard Django admin for the Experiment model takes over the functionality previously provided by Nexus - NOTE this may have some backwards incompatibilities depending on how you included the media files\n - Promote an experiment to a particular alternative (other than Control) through the admin\n - New experiment_enroll assignment tag (see below)\n\n1.0.0\n~~~~~\n\nBumping version to 1.0.0 because django-experiments is definitely production\nready but also due to backwards incompatible changes that have been merged in.\n - Django 1.7 and 1.8 support (including custom user models)\n - Fixed numerous bugs to do with retention goals - before this update they are not trustworthy. See retention section below for more information.\n - Fixed bug caused by the participant cache on request\n - Fixed bugs related to confirm human and made the functionality pluggable\n - Added \"force_alternative\" option to participant.enroll (important note: forcing the alternative in a non-random way will generate potentially invalid results)\n - Removal of gargoyle integration and extra \"request\" parameters to methods that no longer need them such as is_enrolled (BACKWARDS INCOMPATIBLE CHANGE)\n - ExperimentsMiddleware changed to ExperimentsRetentionMiddleware (BACKWARDS INCOMPATIBLE CHANGE)\n - More tests and logging added\n\n0.3.5\n~~~~~\n\n- Add migration scripts for south\n- Fix rendering when probabilities close to 100%\n- Reduce database load when a user performs an action multiple times\n\n0.3.4\n~~~~~\n\n- Updated JS goal to POST method. Requires csrf javascript.\n- Random number on template tag goal image to prevent caching\n\n\n0.3.3\n~~~~~\n\n- Static media handled by nexus again\n\n0.3.2\n~~~~~\n\n- Fixed missing edit/delete images\n\n0.3.1\n~~~~~\n\n- Replaced django static template tags. Supports django 1.3 again!\n\n0.3.0\n~~~~~\n\n- Added django permission support.\n- Started using django static instead of nexus:media. (django 1.4 only)", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mixcloud/django-experiments", "keywords": null, "license": "MIT license, see LICENSE file", "maintainer": null, "maintainer_email": null, "name": "django-experiments", "package_url": "https://pypi.org/project/django-experiments/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-experiments/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/mixcloud/django-experiments" }, "release_url": "https://pypi.org/project/django-experiments/1.2.0/", "requires_dist": null, "requires_python": null, "summary": "Python Django AB Testing Framework", "version": "1.2.0" }, "last_serial": 2350394, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "06daa68fddf4bdd0bf84a09be1c66a31", "sha256": "2416b44a1625e9fa5162f19738318d9eeea812f1e851c130a5c8cd1de2e9294f" }, "downloads": -1, "filename": "django-experiments-0.1.tar.gz", "has_sig": false, "md5_digest": "06daa68fddf4bdd0bf84a09be1c66a31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24930, "upload_time": "2012-08-02T11:48:27", "url": "https://files.pythonhosted.org/packages/b4/f3/ae0437d1fce33b376bb16861ec802fb570fe795361385983f2b748e18e68/django-experiments-0.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8609462d78e301847e07a35cd0eddda3", "sha256": "d91cc5a7e4e69cfa4af61651895895e1e16b1c3042cb53a4f4d4c7d9181b64da" }, "downloads": -1, "filename": "django-experiments-0.2.0.tar.gz", "has_sig": false, "md5_digest": "8609462d78e301847e07a35cd0eddda3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24832, "upload_time": "2012-08-02T13:06:32", "url": "https://files.pythonhosted.org/packages/ba/71/6bda9c138f5ba75dace3e25af0f57db4ff1b41b16e5886b3a590040195dc/django-experiments-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "8523dee389b17e1a79a4bfecdcd0129b", "sha256": "fdafc85ca43e40566bfb22de500a79099d04e72c3a6525d6b71d2d8ba8773e60" }, "downloads": -1, "filename": "django-experiments-0.2.1.tar.gz", "has_sig": false, "md5_digest": "8523dee389b17e1a79a4bfecdcd0129b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24881, "upload_time": "2012-08-02T13:44:11", "url": "https://files.pythonhosted.org/packages/dd/fb/4e107647ce23ac4c2306cd30c6b5d540a26e71fbc7e63486d1f3f87569b5/django-experiments-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "84d354c2717f7217d36764b756a9db45", "sha256": "9ad4c7768275b147705f8fff605a86e1e6aeb8f5e8c5f47174ed1eac27fe0ba9" }, "downloads": -1, "filename": "django-experiments-0.2.2.tar.gz", "has_sig": false, "md5_digest": "84d354c2717f7217d36764b756a9db45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24937, "upload_time": "2012-08-02T16:19:09", "url": "https://files.pythonhosted.org/packages/eb/f8/8a797cffc1616bf2f241eeff56f1f5048fc7237ffef19f0253d143d52f07/django-experiments-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "15030650d07c1a09c7cdb8980c230ef3", "sha256": "030a103c409ba269de896434f8d334a78d5d921293d3cc396f64238531c84b45" }, "downloads": -1, "filename": "django-experiments-0.2.3.tar.gz", "has_sig": false, "md5_digest": "15030650d07c1a09c7cdb8980c230ef3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25556, "upload_time": "2012-08-02T16:34:32", "url": "https://files.pythonhosted.org/packages/06/55/164bd42c3f59029a583fe7c6ace58cd7a4acf727777b1d01eea6c88c118f/django-experiments-0.2.3.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "8950fcf318fe934a0cc375457a527238", "sha256": "690c3d51e61aab54d742ee058b9f8736c4479179e0099e4b74cb5eec99e11f35" }, "downloads": -1, "filename": "django-experiments-0.3.0.tar.gz", "has_sig": false, "md5_digest": "8950fcf318fe934a0cc375457a527238", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28605, "upload_time": "2012-08-21T12:08:53", "url": "https://files.pythonhosted.org/packages/96/6c/479fc01341024cf804868b7ea54e83adebbbe47cd582b0d7f9eb78ae73c9/django-experiments-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "f0d693dfe274199ba8dd5f804bc823b8", "sha256": "64732ece1d2afd901b4ba4f67ce869595b79974e8dd79b2fc87db645a52c2591" }, "downloads": -1, "filename": "django-experiments-0.3.1.tar.gz", "has_sig": false, "md5_digest": "f0d693dfe274199ba8dd5f804bc823b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28675, "upload_time": "2012-08-21T12:26:51", "url": "https://files.pythonhosted.org/packages/22/ff/4c455cef4caeb37697c18b9e323e661ba8a7c89ab8841eab2b0e679e8f37/django-experiments-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "337b5dd561eda991610f4b9c95c5427e", "sha256": "3761ead7c46489346e14e555bda9828ea3272a99408e8518d76d312cc8db22ed" }, "downloads": -1, "filename": "django-experiments-0.3.2.tar.gz", "has_sig": false, "md5_digest": "337b5dd561eda991610f4b9c95c5427e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30256, "upload_time": "2012-08-21T12:53:23", "url": "https://files.pythonhosted.org/packages/1e/2e/e44b27f08a333fcd8b607a29809b3b2abb7431cc0550c6a375e5b899a654/django-experiments-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "d6140648c771965f15d372ad53e1828b", "sha256": "d5fd32d0c6a662ca460d4613c178fa701b0b7cd73ec2d29d55d39e832f31b8c0" }, "downloads": -1, "filename": "django-experiments-0.3.3.tar.gz", "has_sig": false, "md5_digest": "d6140648c771965f15d372ad53e1828b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30402, "upload_time": "2012-08-21T14:25:51", "url": "https://files.pythonhosted.org/packages/9e/fe/4afd3c6cb561f36674f3fcd3cf0f1575a4b8bf41befdfe4fd9e66f19c562/django-experiments-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "5e95f2b2b2cb9c10670a9dd1a151b2cd", "sha256": "bbd52294acb0e543834ce1937baa1122b233b0fafa14ee5fdff3e02c07158e92" }, "downloads": -1, "filename": "django-experiments-0.3.4.tar.gz", "has_sig": false, "md5_digest": "5e95f2b2b2cb9c10670a9dd1a151b2cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30887, "upload_time": "2012-08-23T11:29:30", "url": "https://files.pythonhosted.org/packages/02/54/63e012c3130f971b615e961a7a4035a1dc022f72e6add2b8a0bbd1f888db/django-experiments-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "2f117398ecf6b7a09aa4fcae87bf6c86", "sha256": "46f60f0f198b6e95dc1a3e4cdae4bb0c367eb138fdb8b97e3d8feb8da847bdda" }, "downloads": -1, "filename": "django-experiments-0.3.5.tar.gz", "has_sig": false, "md5_digest": "2f117398ecf6b7a09aa4fcae87bf6c86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33637, "upload_time": "2012-10-04T16:43:17", "url": "https://files.pythonhosted.org/packages/71/60/97743008bac918a4e29dc826b8e68b2d0b1e76905fef425f0425ec3b57dd/django-experiments-0.3.5.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "551f0a012489886c50151a04c32e971c", "sha256": "9a2fee6541ce2f5164ee463ff80b84dcee4d252221a39b57d35872a6b39930c7" }, "downloads": -1, "filename": "django-experiments-1.0.0.tar.gz", "has_sig": false, "md5_digest": "551f0a012489886c50151a04c32e971c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44512, "upload_time": "2015-07-03T11:07:11", "url": "https://files.pythonhosted.org/packages/b5/3b/ed2f1106950a12227cbac7dd8b6f13ecb4729209db665ef06c382414e0cd/django-experiments-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "3ef151e06b36021036aad0a960cef7c8", "sha256": "8b2dde455538df63c58e092a7a72a1fc273789ca6cabc4ef3970aecccfd1de08" }, "downloads": -1, "filename": "django-experiments-1.1.0.tar.gz", "has_sig": false, "md5_digest": "3ef151e06b36021036aad0a960cef7c8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40663, "upload_time": "2015-07-28T11:48:02", "url": "https://files.pythonhosted.org/packages/20/da/f8edb354ef0f3cefcd4e82b79404926a3b407e3a694f2a41b5756fff0174/django-experiments-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "ea2581b0fc157f3c7f587ae11ee73b8b", "sha256": "312b32b12462aa081cb90346502fa74159d3b850f96d354adaee402a44bb159f" }, "downloads": -1, "filename": "django-experiments-1.1.1.tar.gz", "has_sig": false, "md5_digest": "ea2581b0fc157f3c7f587ae11ee73b8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41225, "upload_time": "2015-08-05T13:04:03", "url": "https://files.pythonhosted.org/packages/b8/36/8cf6a1f9a92e5eb8d3f3c1c1cc4ae25951780c22d5f2ebef4c6006ced888/django-experiments-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "639fe5f7568c5f072f5aa3efa76c3116", "sha256": "9f89da7234dc7f4f999bea058ecf605ab416e1a5c42344d208f0ab5394890a5e" }, "downloads": -1, "filename": "django-experiments-1.1.2.tar.gz", "has_sig": false, "md5_digest": "639fe5f7568c5f072f5aa3efa76c3116", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42328, "upload_time": "2015-10-13T13:31:15", "url": "https://files.pythonhosted.org/packages/1e/85/50ce6e6cccc34ede94b9cb3df6fc9f4abe310bffa882a81ad4875cb89e26/django-experiments-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "52de9eb4c547ae56d01702d8a0877f02", "sha256": "a88773d3db777e641f857b49f761042ad9d25c6eb65f22098949d3a06b5ffbee" }, "downloads": -1, "filename": "django-experiments-1.1.3.tar.gz", "has_sig": false, "md5_digest": "52de9eb4c547ae56d01702d8a0877f02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42372, "upload_time": "2015-11-23T11:53:54", "url": "https://files.pythonhosted.org/packages/ad/13/0650eba5407d0dd83c41ea93794434608b3284e33551eb54eb9166897af5/django-experiments-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "32439cc38fa46a27627a1f4845d09a42", "sha256": "edc0b6cf3e89b2b9ab3e8c50b34e93bff86322fa30e15b41a2bd9c5649f2b472" }, "downloads": -1, "filename": "django-experiments-1.1.4.tar.gz", "has_sig": false, "md5_digest": "32439cc38fa46a27627a1f4845d09a42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42405, "upload_time": "2015-11-23T11:56:14", "url": "https://files.pythonhosted.org/packages/2a/ba/3127c2b5ee31f7d855306d7317c890c780d2419e6fc90f28c11e2414a0c4/django-experiments-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "ecee66b92fd8c128497c9b77e19b365a", "sha256": "a5c186de6bd13dd97d94a543cba95e6713a552868c6b7017a5bfde4add625c3c" }, "downloads": -1, "filename": "django-experiments-1.1.5.tar.gz", "has_sig": false, "md5_digest": "ecee66b92fd8c128497c9b77e19b365a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41926, "upload_time": "2016-01-04T14:12:53", "url": "https://files.pythonhosted.org/packages/47/ee/b4af1c792aafa2311af4f4f0ff977e546f7157cce06356903cb10794f265/django-experiments-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "c378b80b468eecd367da500d2cec4c54", "sha256": "a8effd4739a0d43f9ebca94f0d5eda3ecec31846519c2f6c6f69e7ec4555f4e1" }, "downloads": -1, "filename": "django-experiments-1.1.6.tar.gz", "has_sig": false, "md5_digest": "c378b80b468eecd367da500d2cec4c54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41975, "upload_time": "2016-01-25T11:03:45", "url": "https://files.pythonhosted.org/packages/d6/26/e2dd8bec69542099dc548ade39de297a753bb99ad090305c64aae6c09700/django-experiments-1.1.6.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "1f9810588dcd31c3c9b80ce2dffb65af", "sha256": "461b8a24bf073bd34b3bbab95aa28c13d44e52e68cecadcdf16cb9475bd45128" }, "downloads": -1, "filename": "django-experiments-1.2.0.tar.gz", "has_sig": false, "md5_digest": "1f9810588dcd31c3c9b80ce2dffb65af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42190, "upload_time": "2016-09-19T10:11:11", "url": "https://files.pythonhosted.org/packages/30/d5/a0b9496e2a24829d36eb75d8245bfef0e31eb686eff223673df2aceea218/django-experiments-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1f9810588dcd31c3c9b80ce2dffb65af", "sha256": "461b8a24bf073bd34b3bbab95aa28c13d44e52e68cecadcdf16cb9475bd45128" }, "downloads": -1, "filename": "django-experiments-1.2.0.tar.gz", "has_sig": false, "md5_digest": "1f9810588dcd31c3c9b80ce2dffb65af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42190, "upload_time": "2016-09-19T10:11:11", "url": "https://files.pythonhosted.org/packages/30/d5/a0b9496e2a24829d36eb75d8245bfef0e31eb686eff223673df2aceea218/django-experiments-1.2.0.tar.gz" } ] }