{ "info": { "author": "Tim Savannah", "author_email": "kata198@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 6 - Mature", "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Testing" ], "description": "GoodTests\n=========\nGoodTests is a fast python 2/3 compatible unit testing framework which I wrote to work around the shortcomings of other existing frameworks (like py.test and py unit test). It can serve as a drop-in replacement, without the need to modify any existing testcases (or very minimal modification).\n\nIt supports parallel execution, regular expression filtering, and provides class-level encapsulation such that a corrupted python environment (such as mocking out DB function calls and whatnot) does not propigate to other tests. This was one of the issues I had found in py.test. And teardown didn't get called if the test failed, so catching cleanup was impossible. It supports both setup/teardown for an entire class, and per method.\n\nEach class runs as a separate process, which can save a lot of time in data generation, and early failure prediction.\n\nSome Features:\n--------------\n\n* It makes use of the \"assert\" keyword instead of other frameworks which have obtuse methods (like self.assertEquals)\n\n* Colour output\n\n* Because \"assert\" keyword is used, failures can have associated messages. e.x. assert len(items) == 2, 'Expected 2 items, got %d' %(len(items),)\n\n* It supports running only methods that match a given regular expression.\n\n* It supports discovery of all tests within a directory.\n\n* Drop-in replacement for existing py.test/unit tests\n\n* Tests extend \"object\". The tests themselves don't actually import any part of GoodTests.\n\n* License is LGPL\n\n* Supports python 2 and python 3.\n\n* Runs tests in parallel\n\n* Each test class (should have one per file) runs in the same process. This allows you to get more performance by not setting up and tearing down similar data for each function, and allows sharing of state and knowledge (like if test\\_constructor fails on a class, you know everything else is going to fail, so you can mark a flag \"self.xWillFail\" and assert at the beginning of functions.) Other advantages too\n\n* Supports pdb mode (enabled via --pdb). See \"Interactive Debugging\" section below.\n\nGoodTests supports auto discovery of tests given a directory, by looking for files and classes that match the pattern (compatible with py.test)\n\nEach file should be in the form of test\\_$$CLASSNAME$$.py (where $$CLASSNAME$$ is the name, e.g. \"Magic\"). The class within the file should either be prefixed or suffixed with the word \"Test\" (e.g: \"TestMagic\" or \"MagicTest\").\n\nSupports old unit-test style (teardown\\_method and setup\\_method called for each method, and setup\\_class, teardown\\_class for each class) Also supports more modern forms, setup/teardown\\_[CLASSNAME] and setup/teardown\\_[METHOD]\n\nThe setup and teardown functions run REGARDLESS of whether the method itself was a success (contrary to some other unit testing frameworks).\n\nAssertions should use the \"assert\" keyword in python (example: assert 1 != 2)\n\nSee \"test\\_Magic.py\" for an example:\n\nUsage\n-----\n\n\tUsage: GoodTests.py (options) [filesnames or directories]\n\n\t\tOptions:\n\n\t\t\\-n [number] \\- Specifies number of simultaneous executions \n\n\t\t\t\t\t\t\t\t\t Default = # of processors (2).\n\n\t\t\t\t\t\t\t\t\tYou must use \"\\-n 1\" if using pdb\n\n\t\t\\-\\-pdb \\- When an assertion fails, drop to a pdb shell within\n\n\t\t\t\t\t\t\t\t\t the test code at the point of failure ( forces \\-n1 )\n\n\n\t\t\\-m [regexp] \\- Run methods matching a specific pattern\n\n\t\t\\-q \\- Quiet (only print failures)\n\n\t\t\t\t\t\t\t\t\t This will also disable stdout during test execution\n\n\t\t\\-t \\- Print extra timing information\n\n\n\t\t\\-\\-no\\-colour \\- Strip out colours from output\n\n\t\t\\-\\-no\\-color\n\n\n\t\t\\-\\-version \\- Print version and copyright information\n\n\t\t\\-\\-help \\- Show this message\n\n\n\nGoodTests can be used with -n to do multiple simultaneous executions (one process per test class)\n\n-m will use a regular expression pattern to execute only methods matching the name -q will only print failures\n\nGoodTests.py can be pointed toward any directory, and will load all files prefixed with test\\_ (example: test\\_Something.py)\n\nOutput will contain colours, and lists all the failures (or passes) as they happen, and a consolidated list at the end:\n\n\nInteractive Debugging (pdb)\n---------------------------\n\nGoodTests.py supports an \"interactive debugging\" mode, which is toggled by passing \"--pdb\" as an argument on the commandline.\n\nWhen in \"pdb mode\" or \"interactive debugging\" mode, if an AssertionError (failed assertion) is raised, or another uncaught Exception during test execution, the following will occur:\n\n* A pdb shell is started in the frame at which the exception was raised. So if you had an assertion that failed, the shell would drop you at that point in the code, allowing you to inspect variables, etc. to help diagnose why the failure occured and correct the situation.\n\n* Once you enter \"next\" [n] or \"continue\" [c], the setup (if any) will be ran again, and you will be dropped into a pdb interactive shell starting at the top of the test function. This will allow you to walk through the code, change variables, call functions, and print values to understand and attempt to correct the situation inline. If, during this session, you correct the issue and the formerly failing assertion now passes, it will be marked as \"PASS (debugger)\" in the results. The original Traceback will be printed in the aggregate summary at the bottom of test results, noting that it did pass upon retry due to actions executed during your debug session.\n\n\nYou may also choose to put a \"pdb.set\\_trace()\" directly within your test or code somewhere. In order for this to work, you must ensure that maxRunners == 1 ( i.e. pass \"-n1\" as an argument ).\n\n\nExample\n-------\n\nExample Test test\\_Magic.py:\n\n\timport os\n\n\tDO\\_PRINT = int(os.environ.get('DO\\_PRINT', 0))\n\n\tclass TestMagic(object):\n\n\t\tdef setup\\_TestMagic(self):\n\n\t\t\tif DO\\_PRINT:\n\n\t\t\t\tprint(\"Class Constructor\")\n\n\t\tdef setup\\_one(self):\n\n\t\t\tif DO\\_PRINT:\n\n\t\t\t\tprint(\"\\-\\-Setting up one\")\n\n\t\tdef test\\_one(self):\n\n\t\t\tassert \"one\" != \"magic\"\n\n\t\t\tassert \"magic\" == \"magic\"\n\n\t\tdef teardown\\_one(self):\n\n\t\t\tif DO\\_PRINT:\n\n\t\t\t\tprint(\"\\-\\-Tearing Down One\")\n\n\n\t\tdef test\\_WillFail(self):\n\n\t\t\tassert 2 == 3, 'Expected two to equal three'\n\n\t\tdef test\\_popularity(self):\n\n\t\t\ttim = 'abcsdfsd'\n\n\t\t\tcool = 'abcsdfsd'\n\n\t\t\tassert tim is cool\n\n\t\tdef teardown\\_WillFail(self):\n\n\t\t\tif DO\\_PRINT:\n\n\t\t\t\tprint(\"\\-\\-Tearing Down Will Fail\")\n\n\nResults:\n\n\t$ GoodTests.py test\\\\\\_Magic.py\n\n\ttest\\_Magic.py \\- TestMagic.test\\_WillFail FAIL \\*\\*\\*\\*\\*Assertion Error\\*\\*\\*\\*\\*\n\n\tTraceback (most recent call last):\n\n\t\tFile \"/home/media/work/github/GoodTests/test\\_Magic.py\", line 25, in test\\_WillFail\n\n\t\tassert 2 == 3\n\n\tAssertionError: Expected two to equal three\n\n\ttest\\_Magic.py \\- TestMagic.test\\_one PASS\n\n\ttest\\_Magic.py \\- TestMagic.test\\_popularity PASS\n\n\n\t\\==================================================\n\n\tSummary:\n\n\tTest results (2 of 3 PASS) Took 0.000650 total seconds to run.\n\n\n\tFailing Tests:\n\n\ttest\\_Magic.py (1 FAILED):\n\n\t\tTestMagic (1 FAILED):\n\n\t\t\ttest\\_WillFail \\-\n\n\t\t\tTraceback (most recent call last):\n\n\t\t\t\tFile \"/home/media/work/github/GoodTests/test\\_Magic.py\", line 25, in test\\_WillFail\n\n\t\t\t\tassert 2 == 3\n\n\t\t\tAssertionError: Expected two to equal three\n\n\n\n\t\\==================================================\n\n\tSummary:\n\n\tTest results (2 of 3 PASS) Took 0.006250 total seconds to run.\n\n\nIncluding In Project\n--------------------\n\nI recommend bundling the provided \"distrib/runTests.py\" with your projects to support GoodTests.\n\nrunTests.py will download the latest GoodTests.py into the local directory if it is not installed, and will ensure the local copy of source is used when running tests, which saves the step of running \"setup.py install\" each change to run tests.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kata198/GoodTests", "keywords": "unit test,python,good tests,parallel,fast,framework,testing,py.test,nose,unit", "license": "LGPLv2", "maintainer": "Tim Savannah", "maintainer_email": "kata198@gmail.com", "name": "GoodTests", "package_url": "https://pypi.org/project/GoodTests/", "platform": "", "project_url": "https://pypi.org/project/GoodTests/", "project_urls": { "Homepage": "https://github.com/kata198/GoodTests" }, "release_url": "https://pypi.org/project/GoodTests/3.0.5/", "requires_dist": null, "requires_python": "", "summary": "A fast, parallel, featured python unit-testing framework", "version": "3.0.5" }, "last_serial": 5647118, "releases": { "1.1.0": [ { "comment_text": "", "digests": { "md5": "c0db0d9af686b1da7742aebc8948cc8b", "sha256": "9e875d572e392947ed02f54bac61169a2e224cd51c3402d404ae468c76fb522c" }, "downloads": -1, "filename": "GoodTests-1.1.0.tar.gz", "has_sig": false, "md5_digest": "c0db0d9af686b1da7742aebc8948cc8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5167, "upload_time": "2015-03-23T18:36:12", "url": "https://files.pythonhosted.org/packages/af/e2/88dfd71d6a068c0cb820fb62950065e9a2ee78a8e7c56702ead602c8b789/GoodTests-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "998f31b7ab829a3bd5956fe2f1596f93", "sha256": "7d7eedb8ad8b98b5bd9d2e2b143ee90f1c81ccfc683fc9fc88601995a2e553d9" }, "downloads": -1, "filename": "GoodTests-1.1.1.tar.gz", "has_sig": false, "md5_digest": "998f31b7ab829a3bd5956fe2f1596f93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8065, "upload_time": "2015-04-08T19:14:44", "url": "https://files.pythonhosted.org/packages/83/48/efa6ac9a24a93621c5ef255e48cee2ee6cd7c86bece3a361143baeedf050/GoodTests-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "a73ee9cb8d3764afd3262b2380c79f2b", "sha256": "3e007cfc25110be0bc9ac35a38727c747e394c219479e71e7324e0027e148eea" }, "downloads": -1, "filename": "GoodTests-1.1.2.tar.gz", "has_sig": false, "md5_digest": "a73ee9cb8d3764afd3262b2380c79f2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8115, "upload_time": "2015-04-09T19:52:35", "url": "https://files.pythonhosted.org/packages/5f/2d/13fc1e743700126db05e188542b28fc8d2d64e6b5061d98a1e09a3239b18/GoodTests-1.1.2.tar.gz" } ], "1.1.2.1": [ { "comment_text": "", "digests": { "md5": "4c11381532461dec79f0f0261bd174be", "sha256": "efd34cca0f4cd26322b34d71529a8b5294c8f1640f47dfbd6e40154f12daf461" }, "downloads": -1, "filename": "GoodTests-1.1.2.1.tar.gz", "has_sig": false, "md5_digest": "4c11381532461dec79f0f0261bd174be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8864, "upload_time": "2015-08-11T02:42:34", "url": "https://files.pythonhosted.org/packages/e4/6f/1c95d2bce3eb5bf5c2df67fecd357fef775a8076ff07fc87ccb34d5ddc11/GoodTests-1.1.2.1.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "85ca8ab68bb50732bea895d9fafde48a", "sha256": "bce9902ce96ef12b56bf11703b7c71821a1e32dba799f45f1f8cf358f1915a8a" }, "downloads": -1, "filename": "GoodTests-1.1.3.tar.gz", "has_sig": false, "md5_digest": "85ca8ab68bb50732bea895d9fafde48a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21400, "upload_time": "2015-09-21T03:56:42", "url": "https://files.pythonhosted.org/packages/b9/d1/e65d9c4e3e9e10f688c148aa3f83461836148569e592d7b3e0278cf93337/GoodTests-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "6fcce8cc5e455824a28bb9cd5e86060d", "sha256": "6545572607e8619ccd5b1a71f0aeaafd0e8f0e422a03cc86e3688b9aaac5df27" }, "downloads": -1, "filename": "GoodTests-1.1.4.tar.gz", "has_sig": false, "md5_digest": "6fcce8cc5e455824a28bb9cd5e86060d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24217, "upload_time": "2016-03-25T18:36:15", "url": "https://files.pythonhosted.org/packages/3c/e3/a56c2adcdfdfcdb81ea67244842851b8901acc68ebca624e30fe6bdf53a5/GoodTests-1.1.4.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "c4fb13a3f5beff167d84e043d8dd5492", "sha256": "989e242915032c4b50fdc86e9be2ec3677d96e0c65acf1cd6990f767fb2ab41f" }, "downloads": -1, "filename": "GoodTests-1.2.0.tar.gz", "has_sig": false, "md5_digest": "c4fb13a3f5beff167d84e043d8dd5492", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25099, "upload_time": "2016-04-26T03:45:44", "url": "https://files.pythonhosted.org/packages/63/61/c32efeab8462f6cb8e94fad7e2d1d2e85ae176f719a984eb90ea26687a70/GoodTests-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "e9c02c5e0c17fd454bb443ece0abf37f", "sha256": "d9f689a95ca58bf3d31371640fb8f04cf66973dd99d1c4466cc6f3611b661dfa" }, "downloads": -1, "filename": "GoodTests-1.2.1.tar.gz", "has_sig": false, "md5_digest": "e9c02c5e0c17fd454bb443ece0abf37f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25484, "upload_time": "2016-06-23T03:52:07", "url": "https://files.pythonhosted.org/packages/19/7a/cffb7509b732ed74390ede27832639355dc5b9cee5195021b2c0290f3dd9/GoodTests-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "69ce8d65d55e6b53a8c2fd47ff66d3a8", "sha256": "02fd210d864f949c43a522955da7e89f5579cd14d337f31acfb113d6bbc53fb9" }, "downloads": -1, "filename": "GoodTests-1.2.2.tar.gz", "has_sig": false, "md5_digest": "69ce8d65d55e6b53a8c2fd47ff66d3a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25534, "upload_time": "2016-07-25T15:44:14", "url": "https://files.pythonhosted.org/packages/1d/02/2197b126dc2800fa8883a6f1d0b7413aac2c48e50f3cf5e0e51f01a4932d/GoodTests-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "ff68729c348e70fb7a93c672361a7215", "sha256": "b52e66c72229c16c6c909487ae59d816405571e53c0edeb566a764303c67f13c" }, "downloads": -1, "filename": "GoodTests-1.2.3.tar.gz", "has_sig": false, "md5_digest": "ff68729c348e70fb7a93c672361a7215", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26596, "upload_time": "2016-09-09T21:53:05", "url": "https://files.pythonhosted.org/packages/d8/ef/b198fda84e4bedb54499a2f54da2351cc69617fb3f2fd5c6dfce0c90bcd4/GoodTests-1.2.3.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "e44bee6f1536136a8b86f0afaa43eed1", "sha256": "86dfe858443ec3a3043dd1e924b248aed230a0c8f6c8a72ae7fd1db73b208e5d" }, "downloads": -1, "filename": "GoodTests-2.0.0.tar.gz", "has_sig": false, "md5_digest": "e44bee6f1536136a8b86f0afaa43eed1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26854, "upload_time": "2017-04-06T19:08:14", "url": "https://files.pythonhosted.org/packages/59/aa/71b638514f5041978a2aee4736c3256c3e5cb702cbd2424b6a4b35d5dea3/GoodTests-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "6f9953ca7bd2e73e41aa512cb869717a", "sha256": "c204c5189b622ac3e6168e56200c62b305dabf8c9e7a0b800af693ebaa830286" }, "downloads": -1, "filename": "GoodTests-2.0.1.tar.gz", "has_sig": false, "md5_digest": "6f9953ca7bd2e73e41aa512cb869717a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26763, "upload_time": "2017-04-06T19:11:15", "url": "https://files.pythonhosted.org/packages/af/8a/82f2c040e52181ff3f6891477433d5b7f1305c84ff1c6fbc93c9fb788e37/GoodTests-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "ef0c4b8a083f0191a57eacd5e98130bf", "sha256": "0b7232596db3832c6afe0c74247d4c6d05020449bfc2c46a3c5421d100bf51d4" }, "downloads": -1, "filename": "GoodTests-2.1.0.tar.gz", "has_sig": false, "md5_digest": "ef0c4b8a083f0191a57eacd5e98130bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28353, "upload_time": "2017-04-19T16:58:30", "url": "https://files.pythonhosted.org/packages/5a/d4/e8617a7b754050426030f36f6f5b6d1e2512ae934cec8eb657f2bac2bf92/GoodTests-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "f57682aecc823f68cd120cc3c6ec58e3", "sha256": "42cabb761adbce1e06d9436ff6c571c97f14afa94b483966fcc2279adf46df99" }, "downloads": -1, "filename": "GoodTests-2.1.1.tar.gz", "has_sig": false, "md5_digest": "f57682aecc823f68cd120cc3c6ec58e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27950, "upload_time": "2017-05-19T14:46:06", "url": "https://files.pythonhosted.org/packages/e8/fc/bb8ddc4874fce558ae934d9280eaef989e5537f670179d07bd9f80144dc3/GoodTests-2.1.1.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "2e80394f65d1901e882d8875462c3580", "sha256": "95870e5e98a1c719ffda7137be41a87190855d93d18d3ef1ab9c6d9205d761de" }, "downloads": -1, "filename": "GoodTests-2.2.0.tar.gz", "has_sig": false, "md5_digest": "2e80394f65d1901e882d8875462c3580", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28785, "upload_time": "2017-11-20T02:08:23", "url": "https://files.pythonhosted.org/packages/96/29/c0f701df3ea51a2392e577a825f32b572254b9f2272ac781da9652e709da/GoodTests-2.2.0.tar.gz" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "8a286628f5d0505b7f3cff570d3bdac4", "sha256": "2e9d2f5490d371b390e61e7f65d0c82d758026a293f9d45c63424e44485942ff" }, "downloads": -1, "filename": "GoodTests-3.0.0.tar.gz", "has_sig": false, "md5_digest": "8a286628f5d0505b7f3cff570d3bdac4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40537, "upload_time": "2017-12-04T00:57:34", "url": "https://files.pythonhosted.org/packages/a9/03/fe241848f21070e675fa72ad66e8035a239c7702ddcf7658415b52d41280/GoodTests-3.0.0.tar.gz" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "e4cc246c4b6dc6d5e608bdb7d24fc552", "sha256": "abf51acd8dfd3421f9418e4c088b99a435fe4e6154f5c5a63e7fb04025221b24" }, "downloads": -1, "filename": "GoodTests-3.0.1.tar.gz", "has_sig": false, "md5_digest": "e4cc246c4b6dc6d5e608bdb7d24fc552", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40913, "upload_time": "2018-07-07T22:02:24", "url": "https://files.pythonhosted.org/packages/0e/e2/2e41f149943bde64cecba780c97d079aa75326e72f547be659de8ba9ab57/GoodTests-3.0.1.tar.gz" } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "a9a8e93b59df7014b67b2a255aba920e", "sha256": "3e6d1ab317378139aca0692cd95180e72ec59fcee052796df6f58a72c33bc0fd" }, "downloads": -1, "filename": "GoodTests-3.0.2.tar.gz", "has_sig": false, "md5_digest": "a9a8e93b59df7014b67b2a255aba920e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41015, "upload_time": "2018-07-09T00:25:44", "url": "https://files.pythonhosted.org/packages/8c/69/7bc55e382a3543d34fdcb8caa92d0f4f35d7dfd45b6b9a4879ca6d7845de/GoodTests-3.0.2.tar.gz" } ], "3.0.3": [ { "comment_text": "", "digests": { "md5": "3d7991b74214b67d79cba264375759fb", "sha256": "19cdd024be01543e2f5648e87b476c10a386d33f149e058445d8c74b8189add1" }, "downloads": -1, "filename": "GoodTests-3.0.3.tar.gz", "has_sig": false, "md5_digest": "3d7991b74214b67d79cba264375759fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41086, "upload_time": "2018-07-09T00:39:20", "url": "https://files.pythonhosted.org/packages/bd/05/32ea94157f0e0b022112b00bfd8d328f92297f2ea2c2ffae2b9acecb9e3b/GoodTests-3.0.3.tar.gz" } ], "3.0.4": [ { "comment_text": "", "digests": { "md5": "8f4d4b59c8b857ce82266712e58dd36a", "sha256": "9dd39627a79e46a9cb749adaa127776275745bfb8b3dea020d50d810553769d8" }, "downloads": -1, "filename": "GoodTests-3.0.4.tar.gz", "has_sig": false, "md5_digest": "8f4d4b59c8b857ce82266712e58dd36a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41724, "upload_time": "2018-11-01T16:06:02", "url": "https://files.pythonhosted.org/packages/41/31/48273fcb60c009b4147275840da2307fae2dc7fc174b8f8667ac87e45171/GoodTests-3.0.4.tar.gz" } ], "3.0.5": [ { "comment_text": "", "digests": { "md5": "6e5125f412ebdd62db3886bbb735f4ac", "sha256": "1b5f59b4e735cfcab290bd33afc2d7585bd7e6553d4c5e17b6292d53b80560bc" }, "downloads": -1, "filename": "GoodTests-3.0.5.tar.gz", "has_sig": false, "md5_digest": "6e5125f412ebdd62db3886bbb735f4ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41839, "upload_time": "2019-08-07T21:43:09", "url": "https://files.pythonhosted.org/packages/73/1c/3c8c0ef13113a2d4ca451325a319e85b7ce0676d96e89de8d22543b28552/GoodTests-3.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6e5125f412ebdd62db3886bbb735f4ac", "sha256": "1b5f59b4e735cfcab290bd33afc2d7585bd7e6553d4c5e17b6292d53b80560bc" }, "downloads": -1, "filename": "GoodTests-3.0.5.tar.gz", "has_sig": false, "md5_digest": "6e5125f412ebdd62db3886bbb735f4ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41839, "upload_time": "2019-08-07T21:43:09", "url": "https://files.pythonhosted.org/packages/73/1c/3c8c0ef13113a2d4ca451325a319e85b7ce0676d96e89de8d22543b28552/GoodTests-3.0.5.tar.gz" } ] }