{ "info": { "author": "Dan Crosta", "author_email": "dcrosta@late.am", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7" ], "description": "# Dabble\n\nDabble is a simple A/B testing framework for Python. Using dabble, you\nconfigure your tests in code, collect results, and analyze them later to\nmake informed decisions about design changes, feature implementations, etc.\n\nYou define an A/B test in dabble with class `ABTest`, which describes the\ntest name, the names of each of the alternatives, and the set of steps the\nusers will progress through during the test (in the simplest case, this is\njust two steps). You then define one or more `ABParameter`s, which contain\nthe values you wish to vary for each alternative in the test. Each test can\nhave one or more alternatives, though the most common case is to have 2\n(hence \"A/B testing\").\n\n## Example\n\n import dabble\n dabble.configure(\n CookieIdentityProvider('dabble_id'),\n FSResultStorage('/path/to/results.data')\n )\n\n class Signup(page):\n path = '/signup'\n\n signup_button = ABTest('signup button',\n alternatives=['red', 'green'],\n steps=['show', 'signup'])\n button_color = ABParameter('signup button', ['#ff0000', '#00ff00'])\n\n def GET(self):\n self.signup_button.record('show')\n return render('index.html', button_color=self.button_color)\n\n def POST(self):\n self.signup_button.record('signup')\n return redirect('/account')\n\nBehind the scenes, dabble has used a cookie for each user on your site to\nassigne them each an *identity*, so that each user always ever sees the same\n*alternative*. Users may visit the homepage many times over many browsing\nsessions, but as long as they have the same cookie present in their browser,\nthey will always see either the red or the green button, depending on which\nwas chosen the first time the viewed the page.\n\nWhen a user signs up, the `record()` method of `ABTest` is called, to track\nthe user's action. Later on, reports can be generated to determine whether\nthe red or the green button induced more users to sign up.\n\n## Configuring Dabble\n\nIn addition to `ABTest` and `ABParameter`, dabble also needs an\n`IdentityProvider` and a `ResultsStorage`. Dabble provides several\nalternatives for each of these out of the box, and it is also\nstraightforward to write your own.\n\n`IdentityProvider`s should make their best possible effort to always\nidentify individuals, rather than browsing sessions (particularly if cookies\nare set to expire when the user closes his/her browser). If you are testing\na feature that requires users to be logged in, then their username is a good\nchoice for identity.\n\n`ResultsStorage` stores configuration and results of A/B tests, and provides\nsome facilities for generating reports based on the stored results. Dabble\nprovides several backends, including `MongoResultsStorage`, and\n`FSResultsStorage`.\n\nAt this time it is not possible to configure different `IdentityProvider`s\nor `ResultsStorage`s for different tests within the same application.\n\n## Reporting\n\nDabble will also produce reports on all users who have taken part in an A/B\ntest, by way of the `report()` method. The report is a dictionary which\ndescribes, for each alternative, how many users attempted and converted at\neach of the defined steps. For the above example, a report might look like:\n\n\n >>> storage = FSResultStorage('/path/to/results.data')\n >>> storage.report('signup button')\n {\n 'test_name': 'signup button',\n 'results': [\n {\n 'alternative': 'red',\n 'funnel': [{\n 'stage': ('show', 'signup'),\n 'attempted': 187,\n 'converted': 22,\n }],\n },\n {\n 'alternative': 'green',\n 'funnel': [{\n 'stage': ('show', 'signup'),\n 'attempted': 195\n 'converted': 18,\n }],\n }\n ],\n }\n\nThe `funnel` key in each of the `results` entries will have one element\nfewer than the number of steps, since each entry describes the progression\nof users from one step to the next.", "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/dcrosta/dabble", "keywords": "python web abtest split ab a/b test", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "dabble", "package_url": "https://pypi.org/project/dabble/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/dabble/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/dcrosta/dabble" }, "release_url": "https://pypi.org/project/dabble/0.2.3/", "requires_dist": null, "requires_python": null, "summary": "Simple A/B testing framework", "version": "0.2.3" }, "last_serial": 743166, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "37054b294bd703409a6fd034b24e112c", "sha256": "de0d40b8f6b7dfca2fef1cd48d32ac4a90ea807ad90e32901c0f8a5307d504ba" }, "downloads": -1, "filename": "dabble-0.1.tar.gz", "has_sig": false, "md5_digest": "37054b294bd703409a6fd034b24e112c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7840, "upload_time": "2011-09-19T01:07:53", "url": "https://files.pythonhosted.org/packages/25/dc/d22d148e0698de82ff773e6d95496c03e2bd46749d5fd716bb7d1d806b0f/dabble-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "db66dae4b52eba3e9b5df10a77e91bec", "sha256": "a13132e2f86cf86e37e820366cbb336ea080e2b1fd58ea209f0597677a75db34" }, "downloads": -1, "filename": "dabble-0.1.1.tar.gz", "has_sig": false, "md5_digest": "db66dae4b52eba3e9b5df10a77e91bec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7803, "upload_time": "2011-10-25T16:24:29", "url": "https://files.pythonhosted.org/packages/45/50/230a9a350f134c80289426e1c2e55454404edd9a4389adbfc01ab2f7e725/dabble-0.1.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0879f30f65a08f089b6cfe0a3fbcee42", "sha256": "8ce5a6ee9d3e11496b3bdf154e3e8b0d868206213870d632bdc48618f4b4ac61" }, "downloads": -1, "filename": "dabble-0.2.tar.gz", "has_sig": false, "md5_digest": "0879f30f65a08f089b6cfe0a3fbcee42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9702, "upload_time": "2011-10-25T16:42:41", "url": "https://files.pythonhosted.org/packages/31/7b/6d184a723c07c268b5c2757956d8c2186bd4b475e9f40dad020fd9c72d47/dabble-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "25645ce57c7bb7d469e2171b67b9bdb1", "sha256": "2d0587d337663be51c202111c9bb7716f60306511d125601745e37b96c9e76a2" }, "downloads": -1, "filename": "dabble-0.2.1.tar.gz", "has_sig": false, "md5_digest": "25645ce57c7bb7d469e2171b67b9bdb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14496, "upload_time": "2011-10-25T17:55:58", "url": "https://files.pythonhosted.org/packages/55/36/c8d6c55288f5b9ec9a7bbcbce99dc619b4e4ca9f63996ed335272332aab6/dabble-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "502681eddf3cd11bb64ab8b59a38c76d", "sha256": "a7710ef9fa640904af1c3f985ad912683fc42c0e0db453e9128066f6ba6defaf" }, "downloads": -1, "filename": "dabble-0.2.2.tar.gz", "has_sig": false, "md5_digest": "502681eddf3cd11bb64ab8b59a38c76d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14667, "upload_time": "2011-10-25T18:21:00", "url": "https://files.pythonhosted.org/packages/e1/bf/ec89a260f852a20156a6efa147a0f87481a7e9805c45c3b0976be4bdebf6/dabble-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "36e113a6f55d81f9f2a3a65c4a9fbdef", "sha256": "285d32f3c353572d699b68e362becf4dca646d90627d98c6f90e7845f0819957" }, "downloads": -1, "filename": "dabble-0.2.3.tar.gz", "has_sig": false, "md5_digest": "36e113a6f55d81f9f2a3a65c4a9fbdef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14679, "upload_time": "2011-10-26T17:37:35", "url": "https://files.pythonhosted.org/packages/26/23/23b9777d3fd312a63559192ad1f8d5af68bce1c94a71ea850b2f6c9c1b5a/dabble-0.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "36e113a6f55d81f9f2a3a65c4a9fbdef", "sha256": "285d32f3c353572d699b68e362becf4dca646d90627d98c6f90e7845f0819957" }, "downloads": -1, "filename": "dabble-0.2.3.tar.gz", "has_sig": false, "md5_digest": "36e113a6f55d81f9f2a3a65c4a9fbdef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14679, "upload_time": "2011-10-26T17:37:35", "url": "https://files.pythonhosted.org/packages/26/23/23b9777d3fd312a63559192ad1f8d5af68bce1c94a71ea850b2f6c9c1b5a/dabble-0.2.3.tar.gz" } ] }