{ "info": { "author": "Steven Skoczen", "author_email": "skoczen@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Testing" ], "description": "![Polytester Logo](https://cloud.githubusercontent.com/assets/200635/5837495/4b37ce74-a1b2-11e4-8eb7-0b7e8b05e52b.png)\n\n\nPolytester is a simple, groovy multi-language test runner.\n\nIt makes it easy to run tests in your polygot projects. Run python, javascript, ruby, java, and more side by side. It abstracts away the pain and config and lets you just get get developing. Easily.\n\nPolytester Just Works with any testing framework that runs in the shell (yo, that's pretty much everything on the planet), and ships with extra-smooth integration for lots of common frameworks including django, karma, protractor, and more.\nPolytester was built by [Steven Skoczen](http://stevenskoczen.com) at [BuddyUp](http://buddyup.org). If you're in school, and could use a study buddy, check us out!\n\n[![Build Status](https://travis-ci.org/skoczen/polytester.svg)](https://travis-ci.org/skoczen/polytester) ![Pypi Badge](https://badge.fury.io/py/polytester.png) ![Downloads Badge](https://pypip.in/d/polytester/badge.png)\n\n# Installation\n\n```\npip install polytester\n```\n\n# Getting started\n\n\n1. Create a tests.yml file. The following example shows django, protractor, and karma (jasmine) tests.\n ```yml\n api:\n command: python manage.py test\n js:\n command: karma start karma.conf.js\n e2e:\n command: protractor\n ```\n\n\n2. Run `polytester`\n\n ```\n $ polytester\n Detecting...\n \u2714 api detected as django tests.\n \u2714 e2e detected as protractor tests.\n \u2714 js detected as karma tests.\n Running tests...\n \u2714 api - 35 tests passed.\n \u2714 e2e - 17 tests passed.\n \u2714 js - 23 tests passed.\n\n \u2714 All tests passed.\n ```\n\n Note that the status code returned is correct, so you can just dump this on your CI service, and be done.\n\nThat's it. There is no step 3.\n\n# Because everyone loves animated gifs\n\nHere's the above - polytester installed, configured, and running in less than 30 seconds:\n\n![install](https://cloud.githubusercontent.com/assets/200635/5915016/3d92455e-a632-11e4-9ff4-d3553b6774c0.gif)\n\n# Supported Frameworks\n\nAny test framework that returns standard error codes will work out of the box. That's pretty much everything.\n\nIn addition, polytester progressively upgrades to extra-nice output for the frameworks it has parsers for. As of v1.0, the following parsers are built-in, and it's simple to write your own. More are very much welcome via PR, and as you [can see below](#writing-a-custom-parser), writing them is easy!\n\n- [Django](https://www.djangoproject.com/)\n- [Karma](http://karma-runner.github.io/)\n- [Protractor](http://angular.github.io/protractor/)\n- [Python Nose](https://nose.readthedocs.org/en/latest/)\n- [Python py.test](http://pytest.org/latest/)\n- [Python unittest](https://docs.python.org/3/library/unittest.html)\n- [Rspec](http://rspec.info/)\n- [Salad](https://github.com/salad/salad)\n\nBut again, for extra clarity - if your test runner returns normal output codes, you can just drop it in and it'll work great.\n\n# Command-line options\n\n## Running polytester.\n\nPolytester will respond to `pt` or `polytester`. Both do the exact same thing.\n\n## Options\n\nThere are a variety of options to make development simple.\n\n- `polytester foo` or `polytester foo,bar` just runs the test suite(s) specified.\n- `--autoreload` or `--ci` watches all files specified in a `watch_glob`, and immediately runs the relevant suite on file changes. Any running tests are killed.\n- `--wip` runs tests flagged as \"work in progress\" by running the `wip_command` for all suites that specify it.\n- `--verbose` or `-v` dumps all output to the shell. To prevent collisions, when run in this mode, test suites are run in serial, instead of the normal parallel execution.\n- `--parallel n m` only runs test chunk `n` of `m`, for parallel build test environments. \n- `--config foo.yml` specifies a different location for the config file. Default is `tests.yml`\n\n\n# Advanced usage\n\nIf you want to get more out of polytester, there's more under the surface, including wip, autoreload, pass/fail counts, custom frameworks, and more.\n\nHere's all the goodness.\n\n\n## Autoreload\n\nHaving your tests auto-run when files change is super-handy. With polytester, it's simple.\n\n1. Specify a `watch_glob` (and optionally a `watch_dir`) in your `tests.yml`\n\n ```yml\n python: \n command: nosetests\n watch_glob: \"*.py\"\n watch_dir: api\n ```\n\n2. Run with `--autoreload`\n\n ```bash\n polytester --autoreload\n ```\n\nAny time you change a file that matches the glob, polytester will immediately run the matching test suite. Any running tests for that suite will be immediately killed.\n\nNotes:\n\n- If `watch_dir` is not specified, it defaults to the current directory.\n- To specify multiple file types, you can use standard unix globs, i.e. `*.html;*.js;*.css`.\n- Running with `--autoreload` will only run the tests that have a `watch_glob` in their config. Which makes sense once you think about it, but might suprise you at first glance.\n\nAutoreload in action:\n\n![ci-small-2](https://cloud.githubusercontent.com/assets/200635/5915017/3dce3852-a632-11e4-8c4e-ade981d98a71.gif)\n\n## WIP (Work in Progress) tests\n\nBeing able to tag and run certain groups of tests becomes a huge develoment time-saver for larger codebases. Polytester makes it simple. Just specify a `wip_command`, and run with `--wip`.\n\n1. Specify a `wip_command` in your `tests.yml`\n\n ```yml\n python: \n command: nosetests\n wip_command: nosetests -a wip\n ```\n\n2. Run with `--wip`\n\n ```bash\n polytester --wip\n ```\n\nThat's it!\n\n## Parallel Execution\n\nIf you're running on a ci platform with parallel builds, like [CircleCI](http://circleci.com), the `--parallel` option can save you some time.\n\nJust set up your build config to use it, and pass in the appropriate shell variables.\n\nFor CircleCI, just set your `circle.yml` to:\n```yml\ntest:\n override:\n - polytester --parallel $CIRCLE_NODE_INDEX $CIRCLE_NODE_TOTAL:\n parallel: true\n```\n\nAnd you're all set. Your test suites will split out automatically, according to the number of build containers you have.\n\n\n## Specifying test frameworks\n\nIf you're using the default test command for any supported frameworks, polytester just detects the right one, and you're on your way. However, if you're using a custom runner, or something a bit special, you can easily just specify which parser polytester should use.\n\nLet's say for reasons too complex to explain, I have a custom wrapper around my nose script. No problem. In my `tests.yml`, I just tell polytester to expect nose output.\n\n\n```yml\npython: \n command: my_custom_nose_script.sh\n parser: polytester.NoseParser\n```\n\nNow, when you run, you get this output:\n\n```bash\n$ polytester\nDetecting...\n \u2714 python specified as nose tests.\n\nRunning tests...\n \u2714 python: 47 tests passed.\n\n\u2714 All tests passed.\n```\n\nHere's the full list of built-in parsers:\n\n- `DefaultParser` (Just listens to exit codes, no support for number of tests.)\n- `NoseParser`\n- `DjangoParser`\n- `KarmaParser`\n- `ProtractorParser`\n- `SaladParser`\n\nIf you need a parser not in this list, you can make it by writing a few simple functions. See [Custom parsers](#writing-a-custom-parser) below.\n\n\n\n## All options\nHere's a yml file, with everything, just for easy reference.:\n\n```yml\npython: \n command: nosetests\n wip_command: nosetests -a wip\n watch_glob: \"*.py;*.html\" # Note you do need quotes because of the *.\n watch_dir: my_app/foo\n parser: my_parsers.MyNiftyCustomNoseParser\n```\n\n\n## Writing a Custom Parser\n\nAny test framework that returns standard error codes (0 for pass, non-zero for fail) will Just Work out of the box. However, if you want fancy test counts (and someday more), writing a custom parser is easy.\n\nJust write a class that inherits `DefaultParser`, stick it somewhere on your python path, put in in your `tests.yml` file, and you're good to go. Here's an example for pep8.\n\n**Please note:** if you're writing for a common framework/use case, please submit a pull request!\n\n\n1. Write your own parser.\n\n my_parsers.py\n ```python\n from polytester.parsers import DefaultParser\n\n class MyCustomParser(DefaultParser):\n name = \"my custom\"\n\n def tests_passed(self, result):\n # Required, the code below is the default in DefaultParser\n return result.return_code == 0\n\n def num_failed(self, result):\n # Optional.\n m = re.match(\"(\\d+) failed\", result.output)\n return int(m.group(0))\n\n def num_passed(self, result):\n # Optional.\n return self.num_total(result) - self.num_failed(result)\n\n def num_total(self, result):\n # Optional.\n m = re.match(\"(\\d+) total\", result.output)\n return int(m.group(0))\n\n def command_matches(self, command_string):\n # Optional, used for trying to auto-detect the test framework.\n # Since this is totally custom, we just return false\n return False\n ```\n\n For reference, `results` is an object with the following attributes:\n\n - `output` - The stdout and stderr, in the order produced while running.\n - `cleaned_output` - `output`, but stripped of all ANSI colors and escape codes.\n - `return_code` - The return code.\n - `passed` - A boolean indicating if the tests have passed. `None` until a definitive answer is known.\n - `parser` - An instance of the parser class. (i.e. you can call `result.parser.num_failed(result)`).\n\n\n2. Specify it in your test.yml file.\n\n ```yml\n custom: \n command: run_tests.sh\n parser: my_parsers.MyCustomParser\n ```\n\n3. Run your tests like normal!\n\n ```bash\n $ polytester\n Detecting...\n \u2714 custom specified as my custom tests.\n\n Running tests...\n \u2714 custom: 18 tests passed.\n\n \u2714 All tests passed.\n ```\n\n# When things go wrong.\n\nWhen tests fail, polytester just falls back to the helpful output your test frameworks already give you:\n\n```\n$ polytester\nDetecting...\n \u2714 api detected as django tests.\n \u2714 e2e detected as karma tests.\n \u2714 js detected as protractor tests.\nRunning tests...\n \u2718 api - 1 of 35 tests failed.\n\n ======================================================================\n FAIL: test_addition (events.tests.SampleTest)\n ----------------------------------------------------------------------\n Traceback (most recent call last):\n File \"/Users/me/project/events/tests.py\", line 6, in test_addition\n self.assertEquals(1+1, 3)\n AssertionError: 2 != 3\n\n ----------------------------------------------------------------------\n Ran 35 tests in 1.642s\n\n FAILED (failures=1)\n\n \u2714 e2e - 17 tests passed.\n \u2714 js - 23 tests passed.\n\n\u2718 Tests failed\n```\n\n\n# Built on the shoulders of giants\n\nPolytester leverages some fantastic libraries. It wouldn't exist without them.\n\n- [Clint](https://github.com/kennethreitz/clint) for all the nice shell output,\n- [Watchdog](https://github.com/gorakhargosh/watchdog) for the magical file watching, and\n- [PyYAML](http://pyyaml.org/) because nobody should have to think about parsing yaml files again.\n\nPolytester has also has had help from lots of coders. Alphabetically:\n\n- [brandoncazander](https://github.com/brandoncazander) gave you more robust ansi parsing across older versions of python.\n- [calebmeyer](https://github.com/calebmeyer) gave you rspec support.\n- [joshfriend](https://github.com/joshfriend) added py.test support, and spotted a bug on python 2.7.x with `--ci`.\n\n\n# Releases\n\n#### 1.2.0 - March 6, 2015\n\n- Pretty hefty rewrite of how the test runner and watch threads are handled, to fix the incompatabilities reported by [alecklandgraf](https://github.com/alecklandgraf).\n\n\n#### 1.1.3 - March 3, 2015\n\n- Rspec parser, thanks to [calebmeyer](https://github.com/calebmeyer).\n- Improvements to ansi parsing across older versions of python, thanks to (brandoncazander)[https://github.com/brandoncazander].\n\n#### 1.1.2 - Feb 5, 2015\n\n- Bugfix to `--ci` on python 3.4.\n\n#### 1.1.1 - Jan 30, 2015\n\n- Copypasta bugfix to django parser.\n\n#### 1.1 - Jan 30, 2015\n\n- The start of a test suite for polytester, thanks entirely to [joshfriend](https://github.com/joshfriend).\n- Parser for the python unittest runner added by [joshfriend](https://github.com/joshfriend).\n- Bugfix to nose parser, by [joshfriend](https://github.com/joshfriend).\n- Fixed a bug in test output introduced by 1.0.2. Thanks to [joshfriend](https://github.com/joshfriend) for the report.\n- Noticing a pattern? That pattern is that people like [joshfriend](https://github.com/joshfriend) are what makes open-source awesome.\n- All code now passes pep8.\n\n#### 1.0.2 - Jan 30, 2015\n\n- Adds support for py.test, thanks to [joshfriend](https://github.com/joshfriend).\n- Fixes support for KeyboardInterrupts on python 2.7.x, thanks to the report by [joshfriend](https://github.com/joshfriend).\n\n#### 1.0.1 - Jan 27, 2015 \n\n- Bugfix on --parallel.\n\n#### 1.0 - Jan 27, 2015 - \"Rick James\"\n\n- All RDD features in, we're using polytester in production.\n\n#### 0.1.3 - Jan 22, 2015\n\n- Everything but `--ci`, `--failfast`, and a couple parsers is in.\n\n#### 0.1.2 - Jan 21, 2015\n\n- Works on python 3. First stable release!\n\n#### 0.1.1 - Jan 21, 2015\n\n- Fixes inclusion of wsgiref, which breaks python 3 due to a print.\n\n#### 0.1 - Jan 21, 2015\n\n- Initial release. Basic functionality works, only Django parser is in. Very much RDD.\n\n\n# Into the Future\n\nAs with all the open-source projects I run, I leave the future pretty open to what the people who use the project request, and the PRs that are sent.\n\nBut here's a short list of things that are rolling around in my head as future features:\n\n- Full test coverage. We've got a good start, but 100% (or near) coverage with some integration tests is the long-term goal.\n- Better parsing of test outputs, to just list failed test file names and line numbers or other fancy niceties.\n- xUnit output\n- `--failfast`, for super-quick iteration.\n- The ability for parsers to do better parallelization introspection (based on globs, etc)\n- Whatever great stuff you bring to the table!\n\n# Contributing\n\n### PRs Welcome!\nIf you want to add support for a language or framework, those PRs are *always* welcome. \n\nIf you have a bigger idea, just pop open an issue, and we'll talk it through, so we don't cross wires when the PR comes!\n\n### Culture\n\nAnyone is welcome to contribute to polytester, regardless of skill level or experience. To make polytester the best it can be, we have one big, overriding cultural principle:\n\n**Be kind.**\n\nSimple. Easy, right?\n\nWe've all been newbie coders, we've all had bad days, we've all been frustrated with libraries, we've all spoken a language we learned later in life. In discussions with other coders, PRs, and CRs, we just give each the benefit of the doubt, listen well, and assume best intentions. It's worked out fantastically.\n\nThis doesn't mean we don't have honest, spirited discussions about the direction to move polytester forward, or how to implement a feature. We do. We just respect one other while we do it. Not so bad, right? :)\n\n### Testing\nA `Makefile` is included for your testing convenience. Here's a few sample commands:\n\n $ make test # run the tests on the default python version (3.4)\n $ make test-all # run tests on all supported pythons (2.7, 3.3, 3.4)\n $ make flake8 # run a pep8/pyflakes style/syntax check\n $ make clean # remove cached/compiled python test data\n $ make clean-all # rebuild the virtualenv from scratch\n\nThe `Makefile` will take care of creating a [virtualenv](https://pypi.python.org/pypi/virtualenv) and installing the required dependencies (and keep them up to date).\n\nIf you don't have all the supported versions of Python installed, don't worry! Push your changes to a branch, open a pull-request, and [Travis](https://travis-ci.org/) will run the tests on your behalf.", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/skoczen/polytester/tarball/1.2.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/skoczen/polytester", "keywords": "test,multi-language,nose,karma,jasmine,rails,runner,junit,pytest", "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "polytester", "package_url": "https://pypi.org/project/polytester/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/polytester/", "project_urls": { "Download": "https://github.com/skoczen/polytester/tarball/1.2.0", "Homepage": "https://github.com/skoczen/polytester" }, "release_url": "https://pypi.org/project/polytester/1.2.0/", "requires_dist": null, "requires_python": null, "summary": "A simple, easy-to-use multi-language test runner.", "version": "1.2.0" }, "last_serial": 1450168, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6a47bfd479cffb6a4b01642b712e08e8", "sha256": "52f2131c940e85ea5ca692387d93f6c86a8e5240435688ce2c899fdd7b485f66" }, "downloads": -1, "filename": "polytester-0.1.tar.gz", "has_sig": false, "md5_digest": "6a47bfd479cffb6a4b01642b712e08e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9385, "upload_time": "2015-01-21T12:37:37", "url": "https://files.pythonhosted.org/packages/7a/83/663b8a38365d0b2ae4825e3cd65cc989d3aff558be33561c5e367bf198e7/polytester-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "c38175b51e81aac8f7325ccb93b647d3", "sha256": "d91bdec7c7c81262ab0fb41ab1b21809b4835fb3d5d9fffedd55ec662557a53a" }, "downloads": -1, "filename": "polytester-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c38175b51e81aac8f7325ccb93b647d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9537, "upload_time": "2015-01-21T12:42:10", "url": "https://files.pythonhosted.org/packages/28/de/d85b4fd57dfd0459959efc8fea0d121eab16fed254da93ee82ec76f3ad7a/polytester-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "4fc825148ed8fedddb005195451147b5", "sha256": "08e5df60535c7c8b43e1b500feee4202de87a47f77e1b906b52d799bffbdd732" }, "downloads": -1, "filename": "polytester-0.1.2.tar.gz", "has_sig": false, "md5_digest": "4fc825148ed8fedddb005195451147b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9579, "upload_time": "2015-01-21T13:00:09", "url": "https://files.pythonhosted.org/packages/ac/ba/d117a0c42f79f280cd508dcf6d2dca812c4f9b541d7184dc1ab57fda9d95/polytester-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "b7b321cbdba4c64c7351a944557b3e11", "sha256": "dfb4124af15bc9f38a7a399b6b9d54c9286a8287242901b97bb919ba68c0dd02" }, "downloads": -1, "filename": "polytester-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b7b321cbdba4c64c7351a944557b3e11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15788, "upload_time": "2015-01-23T10:41:35", "url": "https://files.pythonhosted.org/packages/68/b9/7eb56a92116c109209538a93def7f90b1beb08a3621ea139bc5b3dac32ac/polytester-0.1.3.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "b6eb5e8ac64ddbfde75c0f4c0553caeb", "sha256": "a31be7f14d6e99b015b9a08325f06f5a0ef72f1673e76de9217efe98ec000dea" }, "downloads": -1, "filename": "polytester-1.0.tar.gz", "has_sig": false, "md5_digest": "b6eb5e8ac64ddbfde75c0f4c0553caeb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18253, "upload_time": "2015-01-27T07:07:07", "url": "https://files.pythonhosted.org/packages/ee/f9/5bc93ed96e60b3e4165927d9cf87971f2244217f9ed62a27c165df5dc658/polytester-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "378c96118745d668b1b7fc20e5a63f35", "sha256": "e9e07d99998a123c95b35c29969d4f8671b68c3e5542056c671d8c6c2321c9fa" }, "downloads": -1, "filename": "polytester-1.0.1.tar.gz", "has_sig": false, "md5_digest": "378c96118745d668b1b7fc20e5a63f35", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19033, "upload_time": "2015-01-27T10:08:03", "url": "https://files.pythonhosted.org/packages/86/f5/d48c2d33be492e51a86d296c65e0ae8b506b3a27628249c8a9a54ff81549/polytester-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "bc404d83a8044054ae1af55b644c3216", "sha256": "e25e86d7c3c0b3a668a341fb63b83b7144643ef16d80a2ca0b19ae02601415d5" }, "downloads": -1, "filename": "polytester-1.0.2.tar.gz", "has_sig": false, "md5_digest": "bc404d83a8044054ae1af55b644c3216", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19992, "upload_time": "2015-01-30T02:48:00", "url": "https://files.pythonhosted.org/packages/37/cb/9c972b8b5ffaf2bdf6356104f2597e237b46152fb565e30c974f2e8e42e5/polytester-1.0.2.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "4765cadc8c5e9290a78c1b7b74ac5ad2", "sha256": "99b2b1f90140fe836d01244087eecbeb8e020d9fdc930e5c849d4ac13a06e4f6" }, "downloads": -1, "filename": "polytester-1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "4765cadc8c5e9290a78c1b7b74ac5ad2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 23605, "upload_time": "2015-01-30T12:55:29", "url": "https://files.pythonhosted.org/packages/b0/17/46b12f6bd77536b723a04e6aaa275a3e5485a429a27c69ef7155f2d0eb58/polytester-1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f43f56500e8d06d8e9ae641988f73cdd", "sha256": "d11d43239923fe87a5023c88d222aa12aaae6098ec17926277a399427d33031d" }, "downloads": -1, "filename": "polytester-1.1.tar.gz", "has_sig": false, "md5_digest": "f43f56500e8d06d8e9ae641988f73cdd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21420, "upload_time": "2015-01-30T12:55:23", "url": "https://files.pythonhosted.org/packages/3d/05/bec07f7f2e756e2afbe0e070005a9c206cf7bef9a2c2a4c15b22c61fc6a1/polytester-1.1.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5184c3bff8370c1fb08c667a67c2b4e2", "sha256": "d5acf040dd7837e4bd88b80399aac8e6e4599e8fa8bfddd704008ad5bb78d18d" }, "downloads": -1, "filename": "polytester-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "5184c3bff8370c1fb08c667a67c2b4e2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 23733, "upload_time": "2015-01-30T13:13:35", "url": "https://files.pythonhosted.org/packages/d0/f1/97632e484c6af66c48bea9da732bbe806c3209c3616c9872b0a05129cd13/polytester-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd2f38c448aeae2d8fad934446725317", "sha256": "23d9c9681cc4aff1fc7f00919dd68780eaa371660ace6fd21f280fbb31f60778" }, "downloads": -1, "filename": "polytester-1.1.1.tar.gz", "has_sig": false, "md5_digest": "bd2f38c448aeae2d8fad934446725317", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21510, "upload_time": "2015-01-30T13:13:29", "url": "https://files.pythonhosted.org/packages/05/14/aaaf24a94a68ee67e5cd99c5f5f9c4c3cf437680e23332c745d1cf048bc1/polytester-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "5eed4e926c5f1fa525c475e0f4ffc16e", "sha256": "21398c19b28fe02674406e1553a1ec625d587ff1fa24d9a43929a1387f7fcc00" }, "downloads": -1, "filename": "polytester-1.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "5eed4e926c5f1fa525c475e0f4ffc16e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 23803, "upload_time": "2015-02-05T08:46:36", "url": "https://files.pythonhosted.org/packages/48/e8/002d7d634d648298858534295e6b9c334b136fa2a93391d88d698fc2c0df/polytester-1.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "70a0ce08b0c04110f5b9ea71407777f6", "sha256": "54da4df4d3d62776dbea69ffde3d45e0aee7ce8ae9afd245b7eb49db38dd703d" }, "downloads": -1, "filename": "polytester-1.1.2.tar.gz", "has_sig": false, "md5_digest": "70a0ce08b0c04110f5b9ea71407777f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21541, "upload_time": "2015-02-05T08:46:30", "url": "https://files.pythonhosted.org/packages/7e/54/8b072e40bfbf609e66d2b1dbeb34e1ad0c34ada69188e02e5dfd0c859bba/polytester-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "2315dae9f40edd00183abe454db77e00", "sha256": "e9cdf798afa5488c146ba742f649a6ee5f1b14b80a47cae036f2f13fced3395f" }, "downloads": -1, "filename": "polytester-1.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "2315dae9f40edd00183abe454db77e00", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 28048, "upload_time": "2015-03-03T09:52:02", "url": "https://files.pythonhosted.org/packages/11/31/4ae38b762e47fca67a4ced8f49f81f105f9926283f1aefe642e6defc05ca/polytester-1.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ee9f72ab4af5a136c5d26984979878e", "sha256": "11cc9ee8901f75cb45cf8f156eb6f19f8452ebf7567c18adb2fcd8c7ed4d0cbe" }, "downloads": -1, "filename": "polytester-1.1.3.tar.gz", "has_sig": false, "md5_digest": "0ee9f72ab4af5a136c5d26984979878e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23383, "upload_time": "2015-03-03T09:51:56", "url": "https://files.pythonhosted.org/packages/5d/ca/c6a7c6d806973fdf6807fe7cbc01148fb2e7d432b35ddc7edff471d6cc29/polytester-1.1.3.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "3c5c65ed0828f324129230643f52a0f2", "sha256": "9323d336b6716939b702fcb23568f7d07f36d5967f42edcb14a2b551444c592e" }, "downloads": -1, "filename": "polytester-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3c5c65ed0828f324129230643f52a0f2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 28391, "upload_time": "2015-03-06T04:11:08", "url": "https://files.pythonhosted.org/packages/4e/9a/db4a802a3670a5ae1d690537ab0e247a70a472f7b3a48f126373aa8f6b89/polytester-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3b724bdab7e40b49f3227b4e6789277", "sha256": "59be296392eadf95d92750498667de358052db2ef5cb2b84baaa101118dc6eaa" }, "downloads": -1, "filename": "polytester-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a3b724bdab7e40b49f3227b4e6789277", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23754, "upload_time": "2015-03-06T04:11:02", "url": "https://files.pythonhosted.org/packages/dd/39/1b1a4135ce20e2257ba78ebbda8239d19b63b6649ba10121bb871c2e690f/polytester-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3c5c65ed0828f324129230643f52a0f2", "sha256": "9323d336b6716939b702fcb23568f7d07f36d5967f42edcb14a2b551444c592e" }, "downloads": -1, "filename": "polytester-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3c5c65ed0828f324129230643f52a0f2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 28391, "upload_time": "2015-03-06T04:11:08", "url": "https://files.pythonhosted.org/packages/4e/9a/db4a802a3670a5ae1d690537ab0e247a70a472f7b3a48f126373aa8f6b89/polytester-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3b724bdab7e40b49f3227b4e6789277", "sha256": "59be296392eadf95d92750498667de358052db2ef5cb2b84baaa101118dc6eaa" }, "downloads": -1, "filename": "polytester-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a3b724bdab7e40b49f3227b4e6789277", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23754, "upload_time": "2015-03-06T04:11:02", "url": "https://files.pythonhosted.org/packages/dd/39/1b1a4135ce20e2257ba78ebbda8239d19b63b6649ba10121bb871c2e690f/polytester-1.2.0.tar.gz" } ] }