{ "info": { "author": "Michael Perel", "author_email": "michaelsethperel@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# About\n\n[![Build Status](https://travis-ci.org/michaelperel/putput.svg?branch=master)](https://travis-ci.org/michaelperel/putput)\n[![Install Status](https://dev.azure.com/michaelsethperel/putput/_apis/build/status/michaelperel.putput?branchName=master)](https://dev.azure.com/michaelsethperel/putput/_build/latest?definitionId=1&branchName=master)\n[![codecov](https://codecov.io/gh/michaelperel/putput/branch/master/graph/badge.svg)](https://codecov.io/gh/michaelperel/putput)\n[![PyPI version](https://badge.fury.io/py/putput.svg)](https://badge.fury.io/py/putput)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/putput.svg)](https://pypi.org/project/putput/)\n[![Read the Docs](https://img.shields.io/readthedocs/putput.svg)](https://putput.readthedocs.io/en/latest/)\n[![PyPI - License](https://img.shields.io/pypi/l/putput.svg)](https://pypi.org/project/putput/)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/putput.svg)](https://pypi.org/project/putput/)\n\n```putput``` is a library that generates labeled data for conversational AI. It's simple to use, highly customizable, and can handle big data generation on a consumer grade laptop. ```putput``` takes minutes to setup and seconds to generate millions of labeled data points.\n\n```putput```'s labeled data could be used to:\n\n* train a ML model when you do not have real data.\n* augment training specific patterns in a ML model.\n* test existing ML models for specific patterns.\n\n```putput``` provides an API to its ```Pipeline``` that specifies how to generate labeled data. It ships with presets that configure the ```Pipeline``` for common NLU providers such as [LUIS](https://www.luis.ai/home) and [spaCy](https://spacy.io/). ```putput``` excels at generating custom datasets, even for problems that have yet to be solved commercially and for which no publicly available datasets exist. For instance, checkout this [jupyter notebook](https://nbviewer.jupyter.org/github/michaelperel/putput/blob/70bbda1499461aa8fe1fb642423fce76701ecc2b/samples/restaurant/lstm.ipynb) that uses ```putput``` to generate a dataset for **multi-intent** recognition and trains a LSTM with [Keras](https://keras.io/) to recognize multi-intent and entities.\n\nHere is an example prediction from the LSTM trained with ```putput``` data:\n\n![multi intent](./docs/_static/multiintent.png)\n\nNote that the trained LSTM can deal with real life complexity such as handling multi-intent (\"add\" and \"remove\" ```groups```) and disambiguating between the same word in different contexts (the quantity \"ten\" vs. \"ten\" in the item \"ten chicken strips\").\n\n# Installation\n\n```putput``` currently supports python >= 3.5. To install the production release, execute ```pip install putput```.\n\n# Samples\n\n```putput``` ships with several dockerized samples that show how to generate data.\n\n* Clone the repo:\n ```git clone https://github.com/michaelperel/putput.git```\n* Move into the project directory:\n ```cd putput```\n* Ensure docker is running:\n ```docker --version```\n* Build the runtime environment:\n ```docker build -t putput .```\n* The project ships with several usage samples which you can execute, for example:\n ```docker run putput smart_speaker``` or ```docker run putput restaurant```.\n\n```putput``` also ships with annotated jupyter notebooks in the ```samples/``` directory that use ```putput``` to solve real world NLU problems. Note: Github cannot correctly render certain graphics, so the notebooks should be viewed on [nbviewer](https://nbviewer.jupyter.org/).\n\n# Development\n\nThere are various checks that Travis (our CI server) executes to ensure code quality.\nYou can also run the checks locally:\n\n1. Install the development dependencies via: ```pip install -e .[dev]```\n2. Run the linter: ```python setup.py pylint```\n3. Run the type checker: ```python setup.py mypy```\n4. Run the tests: ```python setup.py test```\n\nAlternatively, you can run all the steps via Docker: ```docker build --target=build -t putput .```\n\n# Usage\n\n```putput``` is a pipeline that works by reshaping the ```pattern definition```, a user defined yaml file of patterns, into labeled data.\n\n## Example\n\nHere is an example of a ```pattern definition``` that generates labeled data for a smart speaker.\n\n```yaml\nbase_tokens:\n - PERSONAL_PRONOUNS: [he, she]\n - SPEAKER: [cortana, siri, alexa, google]\ntoken_patterns:\n - static:\n - WAKE:\n - [[hi, hey], SPEAKER]\n - PLAY:\n - [PERSONAL_PRONOUNS, [wants, would like], [to], [play]]\n - [[play]]\n - dynamic:\n - ARTIST\n - SONG\ngroups:\n - PLAY_SONG: [PLAY, SONG]\n - PLAY_ARTIST: [PLAY, ARTIST]\nutterance_patterns:\n - [WAKE, PLAY_SONG]\n - [WAKE, PLAY_ARTIST]\n - [WAKE, 1-2, PLAY_SONG]\n```\n\nFocusing on the first ```utterance_pattern```, ```[WAKE, PLAY_SONG]```, ```putput``` would generate hundreds of ```utterances```, ```tokens```, and ```groups``` of the form:\n\n```utterance``` - hi cortana he wants to play here comes the sun\n\n![utterance 1](./docs/_static/utterance.png)\n\n## Pattern definition reference\n\nIn the ```pattern definition```, the two most important sections are ```token_patterns``` and ```utterance_patterns```. A ```token_pattern``` describes a sequence of components whose product constitutes a ```token```. For instance, the sole ```token_pattern``` for the ```WAKE``` ```token``` is ```[[hi, hey], [cortana, siri, alexa, google]]``` (the ```base_token```, ```SPEAKER```, is replaced with its value ```[cortana, siri, alexa, google]``` at runtime). The product of this ```token_pattern```:\n\n* hi cortana\n* hi siri\n* hi alexa\n* hi google\n* hey cortana\n* hey siri\n* hey alexa\n* hey google\n\nrepresents the ```WAKE``` ```token```.\n\nWithin the ```token_patterns``` section, there are ```static``` and ```dynamic``` sections. ```static``` means all of the ```token_patterns``` can be specified before the application runs. ```dynamic``` means the ```token_patterns``` will be specified at runtime. In our example, ```WAKE``` is defined underneath ```static``` because all ways to awake the smart speaker are known before runtime. ```ARTIST``` and ```SONG```, however, are defined underneath ```dynamic``` because the artists and songs in your music catalog may change frequently. The values for these ```tokens``` can be passed in as arguments to ```Pipeline``` at runtime.\n\nWithin each ```token_pattern```, ```base_tokens``` may be used to keep yourself from repeating the same components. For instance, in our example, we could potentially use ```PERSONAL_PRONOUNS``` in many different places, so we'd like to only have to define it once.\n\nAn ```utterance_pattern``` describes the product of ```tokens``` that make up an ```utterance```. For instance, the first ```utterance_pattern```, ```[WAKE, PLAY, SONG]```, is a product of all of the products of ```token_patterns``` for ```WAKE```, ```PLAY```, and ```SONG``` (the ```group```, ```PLAY_SONG```, is replaced with its value ```[PLAY, SONG]```). Example ```utterances``` generated from this ```utterance_pattern``` would be:\n\n* hi cortana play here comes the sun\n* hi cortana he would like to play here comes the sun\n\nWithin each ```utterance_pattern```, ```groups``` may be used to keep yourself from repeating the same ```tokens```. For instance, in our example, we could potentially use ```PLAY_SONG``` in many different places, so we'd like to only have to define it once. Unlike ```base_tokens```, ```putput``` keeps track of ```groups```. For instance, recall one potential output corresponding to the ```utterance_pattern```, ```[WAKE, PLAY_SONG]```:\n\n![utterance 2](./docs/_static/utterance.png)\n\nSince ```PLAY_SONG``` is the only ```group``` in the ```utterance_pattern```, the ```WAKE``` ```token``` is assigned the ```group``` ```NONE``` whereas the ```PLAY``` and ```SONG``` ```tokens``` are assigned the ```group``` ```PLAY_SONG```.\n\nThinking in terms of commercial NLU providers, ```groups``` could be used to match to ```intents``` and ```tokens``` could be used to match ```entities```.\n\n```utterance_patterns``` and ```groups``` support range syntax. Looking at the last ```utterance_pattern```, ```[WAKE, 1-2, PLAY_SONG]```, we see the range, 1-2. Putput will expand this ```utterance_pattern``` to two ```utterance_patterns```, ```[WAKE, PLAY_SONG]``` and ```[WAKE, WAKE, PLAY_SONG]```. Ranges are inclusive and may also be specified as a single number, which would expand into one ```utterance_pattern```.\n\nFinally, ```groups``` may be defined within ```groups```. For instance:\n\n```yaml\n- groups:\n - PLAY_SONG: [PLAY, SONG]\n - WAKE_PLAY_SONG: [WAKE, PLAY_SONG, 10]\n```\n\nis valid syntax.\n\n## Single Intent Providers (LUIS, Rasa, Lex, etc.)\n\nIf your NLU provider only supports single intent utterances you can still use putput to generate utterances in the more familiar intent/entities paradigm. To specify single intents, simply add another level to the utterance patterns with the intent as the key and all it's utterance patterns beneath. To specify entities add a new section called 'entities' with a list of tokens that you want to be picked up as entities. For example:\n\n```yaml\nbase_tokens:\n - PERSONAL_PRONOUNS: [he, she]\n - SPEAKER: [cortana, siri, alexa, google]\ntoken_patterns:\n - static:\n - WAKE:\n - [[hi, hey], SPEAKER]\n - PLAY:\n - [PERSONAL_PRONOUNS, [wants, would like], [to], [play]]\n - [[play]]\n - dynamic:\n - ARTIST\n - SONG\nentities: [ARTIST, SONG] # Here we specify which tokens are our entities\nutterance_patterns:\n - SONG_INTENT: # Here we specify our intents and which utterance patterns belong to them\n - [WAKE, PLAY, SONG]\n - [WAKE, 1-2, PLAY, SONG]\n - ARTIST_INTENT:\n - [WAKE, PLAY, ARTIST]\n```\n\nFor a full example using the single intent pattern checkout this [LUIS example](./samples/luis_test/)\n\n## Pipeline\n\nAfter defining the ```pattern definition```, the final step to generating labeled data is instantiating ```putput```'s ```Pipeline``` and calling ```flow```.\n\n```python\ndynamic_token_patterns_map = {\n 'SONG': ('here comes the sun', 'stronger'),\n 'ARTIST': ('the beatles', 'kanye west')\n}\np = Pipeline(pattern_def_path, dynamic_token_patterns_map=dynamic_token_patterns_map)\nfor utterance, tokens, groups in p.flow():\n print(utterance)\n print(tokens)\n print(groups)\n```\n\n```flow``` yields results one ```utterance``` at a time. While the results could be the tuple ```(utterance, tokens, groups)``` for each iteration, they could also be customized by specifying arguments to ```Pipeline```. Some common use cases are limiting the size of the output, oversampling/undersampling ```utterance_patterns```, specifying how ```tokens``` and ```groups``` are tokenized, etc. Customization of the ```Pipeline``` is extensive and is covered in the ```Pipeline```'s [docs](https://putput.readthedocs.io/en/latest/source/putput.html). Common ```preset``` configurations are covered in the ```preset``` [docs](https://putput.readthedocs.io/en/latest/source/putput.presets.html).\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/michaelperel/putput", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "putput", "package_url": "https://pypi.org/project/putput/", "platform": "", "project_url": "https://pypi.org/project/putput/", "project_urls": { "Homepage": "https://github.com/michaelperel/putput" }, "release_url": "https://pypi.org/project/putput/0.5.3/", "requires_dist": [ "pyyaml (==5.1)", "tqdm (==4.31.1)", "nltk (==3.4)", "pylint (==2.3.1) ; extra == 'dev'", "codecov (==2.0.15) ; extra == 'dev'", "mypy (==0.670) ; extra == 'dev'", "pytest (==4.3.1) ; extra == 'dev'", "pytest-cov (==2.6.1) ; extra == 'dev'", "sphinx-rtd-theme (==0.4.3) ; extra == 'dev'" ], "requires_python": ">=3.5.*", "summary": "Generate labeled data for conversational AI.", "version": "0.5.3", "yanked": false, "yanked_reason": null }, "last_serial": 6043892, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "6500d30c2e139f5fa5cacb43fcd5ad1d", "sha256": "dc3b455c1f78b6b597ecb0d6230b6e6012c0546d31ca20f9af3318d3c33df178" }, "downloads": -1, "filename": "putput-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6500d30c2e139f5fa5cacb43fcd5ad1d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1628, "upload_time": "2018-11-08T15:28:07", "upload_time_iso_8601": "2018-11-08T15:28:07.510518Z", "url": "https://files.pythonhosted.org/packages/01/61/709d2dfc25b37d1cf2e3d0e2763fe5469740f442dae91cfe99ee2533e81d/putput-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f75d875ad88a66e6786a0f5a1fed9010", "sha256": "e45f366cb8208d5bc7c7dfe8218570533d2f76badcc7ead7d3cbdbb2544ad714" }, "downloads": -1, "filename": "putput-0.0.1.tar.gz", "has_sig": false, "md5_digest": "f75d875ad88a66e6786a0f5a1fed9010", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1121, "upload_time": "2018-11-08T15:28:09", "upload_time_iso_8601": "2018-11-08T15:28:09.602553Z", "url": "https://files.pythonhosted.org/packages/f2/40/82989c105a05f3e0f7fe7890604cb08f5ca71066229cd10e647cd144034d/putput-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "dd894932c8dfbc6e64e9b89f1e29c4a2", "sha256": "5830d785821635e44c8597881a7c6e1ba6fe3a2134ed4feb60899a1dbb1542b2" }, "downloads": -1, "filename": "putput-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "dd894932c8dfbc6e64e9b89f1e29c4a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 9102, "upload_time": "2019-01-15T21:52:33", "upload_time_iso_8601": "2019-01-15T21:52:33.478299Z", "url": "https://files.pythonhosted.org/packages/da/a2/ce7e0e72072cb9e9884f0fde9cf1458cadb7939e1738a02e3c34cd152953/putput-0.0.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "13d21bdb07b8ae4ae6f909bba78dece3", "sha256": "b3f8699ecb9d4fef281a028073ff10dd523abdedf111191e194d7bf31a991c02" }, "downloads": -1, "filename": "putput-0.0.6.tar.gz", "has_sig": false, "md5_digest": "13d21bdb07b8ae4ae6f909bba78dece3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 9453, "upload_time": "2019-01-15T21:52:34", "upload_time_iso_8601": "2019-01-15T21:52:34.465791Z", "url": "https://files.pythonhosted.org/packages/3f/fe/7687be5be3c58594cf547f914a3f51b783d85ab7fa2bd96c8d0133c131b7/putput-0.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "0a08f54a88836ece77452084441f7557", "sha256": "89bc0c543d3e36ea58c3f6274860debf26e5a951dae357ec3284c2124f877504" }, "downloads": -1, "filename": "putput-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "0a08f54a88836ece77452084441f7557", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 9161, "upload_time": "2019-01-25T21:16:48", "upload_time_iso_8601": "2019-01-25T21:16:48.013881Z", "url": "https://files.pythonhosted.org/packages/33/ec/88a57d6f968f9337253bb4190e669fa0210743c39021adb9aafb7fe8dfe4/putput-0.0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bfc435fcee702d32c4cab1055ccd3cca", "sha256": "16c3af258c592d6751d4f3c5a1623efe150aca90a0881719ce23013bc149da1d" }, "downloads": -1, "filename": "putput-0.0.7.tar.gz", "has_sig": false, "md5_digest": "bfc435fcee702d32c4cab1055ccd3cca", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 9576, "upload_time": "2019-01-25T21:16:49", "upload_time_iso_8601": "2019-01-25T21:16:49.503599Z", "url": "https://files.pythonhosted.org/packages/7a/aa/002e4a34ed6c7e20e5660677e99d928e6cbe39b9f075c99c6dc1a663e2ed/putput-0.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "6d1550bc183ea62dfc370b0c5e881431", "sha256": "f2ee909563489388131dfe72f946cc707a46b24ea1fa6be2ed3eaac6dd602cfd" }, "downloads": -1, "filename": "putput-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "6d1550bc183ea62dfc370b0c5e881431", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 9470, "upload_time": "2019-01-27T18:10:42", "upload_time_iso_8601": "2019-01-27T18:10:42.498133Z", "url": "https://files.pythonhosted.org/packages/fe/5b/f0930cf483811afecfae427ae5bd8a0f93054511902de3904024e30cade4/putput-0.0.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "40cba83bd6781c71a6fceb5e97618868", "sha256": "2784b3264c833802314fe77b134afb75ae3fdb3dd4b9158f48ec699e6a891a21" }, "downloads": -1, "filename": "putput-0.0.8.tar.gz", "has_sig": false, "md5_digest": "40cba83bd6781c71a6fceb5e97618868", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 9978, "upload_time": "2019-01-27T18:10:44", "upload_time_iso_8601": "2019-01-27T18:10:44.232856Z", "url": "https://files.pythonhosted.org/packages/16/50/83a738a1709e4f7a4e3ba49a3d06cebd2b202d5161d27b2807cc7df385d2/putput-0.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "c21d79e93a2cefe18f67c671b188b6cb", "sha256": "d804b8d7e10cdf1cf3a77591f9d395fd7c17bca8507fa6bbd3a24f547230cd80" }, "downloads": -1, "filename": "putput-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "c21d79e93a2cefe18f67c671b188b6cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 9492, "upload_time": "2019-01-27T21:11:02", "upload_time_iso_8601": "2019-01-27T21:11:02.144689Z", "url": "https://files.pythonhosted.org/packages/8b/60/ebaff2c37312e16cb7f71f4019dfa85f714130a2c6f84df7b124a38745a0/putput-0.0.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "54a33f14551733b833f8ecedd01aa920", "sha256": "3a58294f9c669ccc339e807149055f92b39371bea5b72c104fe2730fddd00b72" }, "downloads": -1, "filename": "putput-0.0.9.tar.gz", "has_sig": false, "md5_digest": "54a33f14551733b833f8ecedd01aa920", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 10002, "upload_time": "2019-01-27T21:11:03", "upload_time_iso_8601": "2019-01-27T21:11:03.474014Z", "url": "https://files.pythonhosted.org/packages/cb/0f/5904cb8051fa985c404a48979b3c2ece852b9b33be6fce35239049485276/putput-0.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "2de0794c60c325147ac3d37b5a540d0d", "sha256": "737588d211c80839f4c06a57b971c39ce2feb5e5f6970e7bffffea09e32a6474" }, "downloads": -1, "filename": "putput-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2de0794c60c325147ac3d37b5a540d0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 9497, "upload_time": "2019-01-27T21:53:26", "upload_time_iso_8601": "2019-01-27T21:53:26.744105Z", "url": "https://files.pythonhosted.org/packages/ed/1e/5592b7c89660a14d1110731b7e0d3728fc6062dbc88de1d0134d89a4c012/putput-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "6118eabe8ef53f2b4e8a7d2910a1416c", "sha256": "ee4a25cefdbf169425c5dce13200f133f69a5bf2a72bd05919ac3b72bd8c1853" }, "downloads": -1, "filename": "putput-0.1.0.tar.gz", "has_sig": false, "md5_digest": "6118eabe8ef53f2b4e8a7d2910a1416c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 10013, "upload_time": "2019-01-27T21:53:28", "upload_time_iso_8601": "2019-01-27T21:53:28.014365Z", "url": "https://files.pythonhosted.org/packages/36/34/99b8cf0d44a86bec7aede235bf37150144cc9f883c0372825c954e436f0e/putput-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b8c218827472695a294d32f178735890", "sha256": "ed2eabb96e4067673fae980ac2a9e4d9b414db79b4019503ec52e4f30f842ec1" }, "downloads": -1, "filename": "putput-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b8c218827472695a294d32f178735890", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 11076, "upload_time": "2019-02-08T20:08:51", "upload_time_iso_8601": "2019-02-08T20:08:51.191485Z", "url": "https://files.pythonhosted.org/packages/ef/f4/66cc357b3312a9ed492a3c3c6a7514ed84ee03ef5d07d7663f7842e0a4f3/putput-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "28372ba73c62fc3c87aae0a2eb1e6ba0", "sha256": "c05f49440090a07b737e6cae2b744ef510eb65afd6ad8c90a85c45ac94912ccc" }, "downloads": -1, "filename": "putput-0.2.0.tar.gz", "has_sig": false, "md5_digest": "28372ba73c62fc3c87aae0a2eb1e6ba0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 11561, "upload_time": "2019-02-08T20:08:52", "upload_time_iso_8601": "2019-02-08T20:08:52.604644Z", "url": "https://files.pythonhosted.org/packages/9f/a0/cb2e7f593b66fd62cf7428a6483c763913213c73d13d3acfcc056eb48f99/putput-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "60d1c401e91c86b5dd5a6ad659d05030", "sha256": "f21950ed65b71941f1b74dd7dde781ad820a5776062d3440bf130a0e5af27520" }, "downloads": -1, "filename": "putput-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "60d1c401e91c86b5dd5a6ad659d05030", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.*", "size": 10928, "upload_time": "2019-02-11T15:54:19", "upload_time_iso_8601": "2019-02-11T15:54:19.275944Z", "url": "https://files.pythonhosted.org/packages/66/74/06e316ee49b157207c4afb3fbaa8c0b67854cd8f59259cc36761533db34e/putput-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "af655959d2ba5a10ccb7f9138115dd96", "sha256": "1bf7ecf17f6cc0012600a33a8c6f5bea70902324bde22f65d31e808aece8d759" }, "downloads": -1, "filename": "putput-0.2.1.tar.gz", "has_sig": false, "md5_digest": "af655959d2ba5a10ccb7f9138115dd96", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.*", "size": 11445, "upload_time": "2019-02-11T15:54:20", "upload_time_iso_8601": "2019-02-11T15:54:20.992638Z", "url": "https://files.pythonhosted.org/packages/7c/a1/a78a38f7ac66d09b811ae89ea040bfc3516012bcbf13ffb1447b6f872236/putput-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "fe3eecc7fcc07ea22a9f3b1fdea84b5c", "sha256": "a1797275d64ebdcfbec634190ecdde5c48b8bcd6f84f81729abb3aa1cc9d89e8" }, "downloads": -1, "filename": "putput-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fe3eecc7fcc07ea22a9f3b1fdea84b5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 26807, "upload_time": "2019-03-01T19:10:45", "upload_time_iso_8601": "2019-03-01T19:10:45.952641Z", "url": "https://files.pythonhosted.org/packages/1c/57/0f23db5fcbadea90a04f2bebdef930faa941b4dcfd2249ad219638595aca/putput-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4a407df9e2ad63111f246ef1310ec1c3", "sha256": "ef58ed15650167fcaf4d1755646eef129af5c74dd96a407c257294192e7c57e4" }, "downloads": -1, "filename": "putput-0.3.0.tar.gz", "has_sig": false, "md5_digest": "4a407df9e2ad63111f246ef1310ec1c3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 25127, "upload_time": "2019-03-01T19:10:47", "upload_time_iso_8601": "2019-03-01T19:10:47.339126Z", "url": "https://files.pythonhosted.org/packages/bf/91/7e4d2d51d56780b417b55af8ca306c048e9d95bee6847a3ca83f17374ba7/putput-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "9c817d76813b3b2d4d8937801dc1cffe", "sha256": "53b5b9129c2af5ebe53f5ddaaf53ceb944f9188697fc7f680b72630415e1bd75" }, "downloads": -1, "filename": "putput-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9c817d76813b3b2d4d8937801dc1cffe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 28837, "upload_time": "2019-04-09T18:29:31", "upload_time_iso_8601": "2019-04-09T18:29:31.228197Z", "url": "https://files.pythonhosted.org/packages/3b/9e/11cc028553f935a68dd5e2cc6e87f3cb3a88952fa5ad2c1dfc71a465b385/putput-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4ac999ebf2b152c669c9ad1fc2130494", "sha256": "e02c475dfdbac3dd0bb71ad49dfad47aea752f20b08d6254ec9d0d97fc99a977" }, "downloads": -1, "filename": "putput-0.4.0.tar.gz", "has_sig": false, "md5_digest": "4ac999ebf2b152c669c9ad1fc2130494", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 26604, "upload_time": "2019-04-09T18:29:32", "upload_time_iso_8601": "2019-04-09T18:29:32.793496Z", "url": "https://files.pythonhosted.org/packages/02/2b/97f67553c2688b6f4ba9bfd2278e4a72b40cc297f63cf1a3e8f28e16966a/putput-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "317bbff0833075b7c4167cd40cfa2dd8", "sha256": "9361f9214140f61089715a0940020931554a6dec0aab23fb8ccd668518138146" }, "downloads": -1, "filename": "putput-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "317bbff0833075b7c4167cd40cfa2dd8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 29355, "upload_time": "2019-06-19T19:23:20", "upload_time_iso_8601": "2019-06-19T19:23:20.158746Z", "url": "https://files.pythonhosted.org/packages/43/28/657543097b776034e38d4618d88352c486f630af00dd20387db0b855d26f/putput-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "55113f76d5db49b8c47b1767347a2a9b", "sha256": "1a6921b5002a00f2435e15711443fd49a6a7a908fb8a54006f30a7303d40d49b" }, "downloads": -1, "filename": "putput-0.5.0.tar.gz", "has_sig": false, "md5_digest": "55113f76d5db49b8c47b1767347a2a9b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 27212, "upload_time": "2019-06-19T19:23:21", "upload_time_iso_8601": "2019-06-19T19:23:21.907983Z", "url": "https://files.pythonhosted.org/packages/88/f8/baf602041ad8a944ba2a0720578cf4f67e3b3e1d9236eed3fca5f34c466a/putput-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "c81cdb52905901926d83157a9ba2ae5a", "sha256": "6055b3dd7ccd2fc6ab7c3148934b946e021e5c890adc9f2b967a76fad5d35f04" }, "downloads": -1, "filename": "putput-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c81cdb52905901926d83157a9ba2ae5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 30339, "upload_time": "2019-08-12T14:54:19", "upload_time_iso_8601": "2019-08-12T14:54:19.773292Z", "url": "https://files.pythonhosted.org/packages/eb/ba/bc19abe86c1eee8ec2b17111b2697471f4c50816cfe3f81d97a5cae0bb71/putput-0.5.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "10e0a78a01bf83f135f9f5c03782bb19", "sha256": "b3600aa20d89c3f6be4223dd29cc5dbff1beca4e45e9afeb3c10066dfdbb3be7" }, "downloads": -1, "filename": "putput-0.5.1.tar.gz", "has_sig": false, "md5_digest": "10e0a78a01bf83f135f9f5c03782bb19", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 28445, "upload_time": "2019-08-12T14:54:21", "upload_time_iso_8601": "2019-08-12T14:54:21.208875Z", "url": "https://files.pythonhosted.org/packages/e9/61/6ccd61174399ea723f1bc71aa292acb2091ff58ab9b7db25b6a7eba5e096/putput-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "23bb1df0e4266dc90a13f818a33aa38c", "sha256": "077fc0eafbacb519b5b11560c19d50e1289ad607a233e74c81106f5ae0e2a2ff" }, "downloads": -1, "filename": "putput-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "23bb1df0e4266dc90a13f818a33aa38c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 30343, "upload_time": "2019-10-28T21:07:13", "upload_time_iso_8601": "2019-10-28T21:07:13.202355Z", "url": "https://files.pythonhosted.org/packages/25/98/9233ca8e6c64b8765c37d2336798c1414fd0ffe8c6e7039eb9d0aea295fa/putput-0.5.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4094e144ecdbc2c6ef463de1791d0b64", "sha256": "378a6c12f9012938e2d27554db474f523e3feba67da9815dfd565dddd75ab2ea" }, "downloads": -1, "filename": "putput-0.5.3.tar.gz", "has_sig": false, "md5_digest": "4094e144ecdbc2c6ef463de1791d0b64", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 24696, "upload_time": "2019-10-28T21:07:14", "upload_time_iso_8601": "2019-10-28T21:07:14.938778Z", "url": "https://files.pythonhosted.org/packages/fb/bc/2b375b7c3803d137082cc6891f6e5d2699085d5e1247fc4086a682d89686/putput-0.5.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "23bb1df0e4266dc90a13f818a33aa38c", "sha256": "077fc0eafbacb519b5b11560c19d50e1289ad607a233e74c81106f5ae0e2a2ff" }, "downloads": -1, "filename": "putput-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "23bb1df0e4266dc90a13f818a33aa38c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.*", "size": 30343, "upload_time": "2019-10-28T21:07:13", "upload_time_iso_8601": "2019-10-28T21:07:13.202355Z", "url": "https://files.pythonhosted.org/packages/25/98/9233ca8e6c64b8765c37d2336798c1414fd0ffe8c6e7039eb9d0aea295fa/putput-0.5.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4094e144ecdbc2c6ef463de1791d0b64", "sha256": "378a6c12f9012938e2d27554db474f523e3feba67da9815dfd565dddd75ab2ea" }, "downloads": -1, "filename": "putput-0.5.3.tar.gz", "has_sig": false, "md5_digest": "4094e144ecdbc2c6ef463de1791d0b64", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.*", "size": 24696, "upload_time": "2019-10-28T21:07:14", "upload_time_iso_8601": "2019-10-28T21:07:14.938778Z", "url": "https://files.pythonhosted.org/packages/fb/bc/2b375b7c3803d137082cc6891f6e5d2699085d5e1247fc4086a682d89686/putput-0.5.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }