{ "info": { "author": "Aubrey Taylor , Adam Venturella ", "author_email": "aubricus@gmail.com, aventurella@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# Promptly\n\n[![Build Status](https://travis-ci.org/aventurella/promptly.png?branch=master)](https://travis-ci.org/aventurella/promptly)\n\nA little python utility to help you build command line prompts that can\nbe styled using CSS.\n\n# Changes\n\n## v0.6.1\n\nSwitched to six for compat\nAdded travis test for python 3.4\n\n## v0.6.0\n\nInputs can now specify duplicate keys and a list will be returned, for example:\n```python\nfrom promptly import console\nfrom promptly import Form\n\nform = Form()\n\nform.add.string(\n 'name',\n 'What is your name?',\n default='Ollie'\n)\n\nform.add.string(\n 'name',\n 'What is your other name?',\n default='Potato'\n)\n\nform.add.int(\n 'number',\n 'Pick a number'\n)\n\nconsole.run(form)\nprint(dict(form))\n\n#\n# {\n# 'name': ['value1', 'value2'],\n# 'number': 9\n# }\n#\n```\n\n\n## v0.5.4\n\nAltered the console runners.console.ConsoleRunner.render() to fix inconsistent\nrendering in some teminals.\n\nThere was an issue on some terminals where passing the full prompt to\nto input/raw_input (py3 and py2 respectively) would do some interesting\nthings with line wrapping and color codes. Part of the color code issue\nwas probably related to `readline` and this reported documentation issue\nre ansi escapes for readline (http://bugs.python.org/issue17337#msg183328)\n\nhttp://bugs.python.org/issue17337\n\nThe fix applied however, skips sending the majority of the prompt through\ninput/raw_input and instead writes it to stdout. Only the single line\nfor the actual prompting is now sent to input/raw_input. This appears\nto address the issue.\n\n\n## v0.5.3\nNotifications can now be added into forms. The effect for the console runner\nwill be to simply print the notification and then continue to the next\nquestion in the form. When converting the form to a dict, like branches,\nnotifications will not be included in the data that is returned.\n\n```python\nfrom promptly import console\nfrom promptly import Form\n\nform = Form()\nform.add.notification('Welcome to a promptly form')\nform.add.string('favorite_dog', 'Who is your favorite dog?', default='Lucy')\nform.add.notification('Thanks for filling out the form!')\nconsole.run(form)\n\nprint(dict(form))\n```\n\nIn the case of the above you would get a prompt sequence like this:\n\n```\n\u00b7\u00b7\u00b7\nWelcome to a promptly form\n\u00b7\u00b7\u00b7\n\nWho is your favorite dog?\n> Lucy\n\n\u00b7\u00b7\u00b7\nThanks for filling out the form!\n\u00b7\u00b7\u00b7\n\n{'favorite_dog': 'Lucy'}\n\n```\n\n\n## v0.5.2\nPyreadline does not supprt `set_startup_hook(lambda: readline.insert_text(default))`\nas such the defaults on windows based machines would not show up.\n\nThe solution for this release was to alter the console renderer for string\nand integer input on those machines who have pyreadline installed.\n\nIn that case the prompt will appear as follows:\n\n```\nWho is your favorite dog? [Lucy]\n>\n```\n\nNote that the default is tacked on to the end of the question.\n\nCompare this to the style we get when we have a system that\nsupports readline:\n\n```\nWho is your favorite dog?\n> Lucy\n```\n\nIntegers and String based prompts are rendered like this.\n\n\n## v0.5.1\nAdded some love for our Windows friends. We now check weather or not readline is available\nand if not install pyreadline in that case.\n\n## v0.5\n## WARNING 0.5 is backwards incompatible\n\nThis should be the last backwards incompatible update for a while. v0.5\nsaw a redesign of how forms are run. This was done in the hope that one day\nI have time to do a curses or urwid implementation. We will see. On the whole\nthough it does make it more confirguable for individuals that do not like\nthe default form rendering as Promptly now supports form runners.\n\nWhat are form runners? Well put simply, in prior versions you would call:\n\n```python\n # < v0.5\n from promptly import From\n\n\n form = Form()\n form.add.string('favorite_food', 'What is your favorite food?')\n form.run()\n```\n\nThis worked well, but it bound the prompts to a single implementation of the\n`Form` object. `v0.5` treats the `Form` object as more of a collection and the\nrunners figure out how to deal with it. Lets take a look at the example from\nabove in in `v0.5`:\n\n```python\n # v0.5+\n from promptly import From\n form promptly import console\n\n\n form = Form()\n form.add.string('favorite_food', 'What is your favorite food?')\n console.run(form)\n```\n\nPretty much exactly the same, but we just hand the form off to the\nrun to deal with, instead of the form.\n\nSome additional changes, the `promptly.inputs.*` have all been renamed\nand simplified. Now they basically act as marker classes for input types.\nThey help the runner identify the kind of prompts to generate.\n\nThe logic, such as `StringInput.build_prompt`, basically got moved into\n`promptly.renderers.console.StringPrompt`. If you were always using the\nshortcut syntax for cerating your forms:\n\n```python\n form.add.string(...)\n form.add.bool(...)\n form.add.int(...)\n form.add.select(...)\n form.add.multiselect(...)\n```\n\nThen you don't have to worry about anything, everything should still\nwork fine for you. If you were using the more verbose style:\n\n```python\n\n form.add(\n 'age',\n IntegerInput('What is your age?',\n default=1)\n )\n```\n\nThings will break for you. It's probably better to always be using the\nshortcuts.\n\nAll of the input types now take \"notifications\" This is a convenient way\nto annotate your questions. Lets take a look at a prompt with notifications\nand the same prompt without notifications.\n\nFirst, no notifications:\n\n```python\n from promptly import From\n form promptly import console\n\n\n form = Form()\n form.add.string('name', 'What is your name?', default='Lucy')\n console.run(form, prefix='[promptly] ')\n```\n\nThat will generate a prompt that looks like this:\n\n```\n [promptly] What is your name?\n > Lucy\n```\n\nNow lets look at the same prompt with notifications:\n\n```python\n from promptly import From\n form promptly import console\n\n\n form = Form()\n form.add.string(\n 'name',\n 'What is your name?',\n notifications=('This will help to identify you later', 'Identification is fun!')\n default='Lucy')\n console.run(form, prefix='[promptly] ')\n```\n\nThat will generate a prompt that looks like this:\n\n```\n [promptly] What is your name?\n This will help to identify you later\n Identification is fun!\n \u00b7\u00b7\u00b7\n > Lucy\n```\n\nThe notifications appear after the question, but before the user input.\n\nThe available CSS styles have also been updated to account for these.\nSee the list below for the default styles available.\n\nThere is also convenience function for just dropping notifications\nto the console without running though a form. They will be styled according\nto the notification and prefix styles:\n\n```python\n from promptly import console\n\n console.notification('Hello World', prefix='[notice] ', stylesheet=None)\n```\n\nThis will immediately write a message to sys.stdout.\n\n## v0.4\n**Migration Guide**\n## WARNING 0.4 is backwards incompatible\n\n**Migration Guide**\n- `my_form.add.choice` should be become `my_form.add.select`\n- `ChoiceInput` should become `SelectInput`\n- SelectInput (formerly ChoiceInput) and MultiSelectInput now take\n an option_format callable. By default this callable is\n `promptly.utils.numeric_options`. This will take a list ['foo', 'bar']\n and return a list: [(1, 'foo'), (2, 'bar')]. So if you only need\n numbers for your choices or multi-select input's you don't\n need to worry about, you get them for free. If you were passing\n your own in something like: `zip(range(1,3), ['foo', 'bar'])` you\n no longer need to do that. In fact that will break things for you\n so you should replace it with just your list of choices\n\n\n\n### New Features\n\n#### Branches\nForms can now branch. The branch input item takes a callable that will\nbe executed and is expected to return another `Form` object. This `Form`\nobject will be merged into the currently running form at the location\nwhere the branch was added. The callable signature is as follows:\n\n`my_branch_building_action(form, *args, **kwargs):`\n\nExample branch usage:\n\n```python\n\ndef handler(form, name):\n branch = Form()\n\n if form.age.value < 30:\n branch.add.string('name', 'What is your name?')\n else:\n branch.add.string('name', 'What is your pet's name?', default=name)\n\n return branch\n\n\nform = Form()\nform.add.int('age', 'What is your age?', default=age)\nform.add.branch(handler, name='Lucy')\n\n# The branch fields will be added here in terms of\n# position in the form once the user reaches the branch\n\nform.add.int('number', 'What is your favorite number?')\nform.run()\n```\n\n#### MultiSelectInput\nA new input type has been added, `MultiSelectInput`, a shortcut for creating\none is also available in the form of:\n`my_form.add.multiselect(key, label, choices, done_label='Done')`\n\nNote that done_label is optional.\n\nMultiSelectInput lets the user choose multiple options from a SelectInput\nstyle display. It marks the currently selected items. If the user chooses the\nsame option that has already been selected it will be deselected.\n\nA final option is added to the list of choices provided to represent\nthe sentinel choice. The `done_label` kwarg sets the value used here\nBy default it is set to *Done*. The user must select the sentinel choice\nin order to continue on in the form.\n\n\n\n\n\n## Lets Make a Promptly Form\n\n```python\n from promptly import Form\n form promptly import console\n\n\n # Build our form\n form = Form()\n\n # add questions in the sequence you would like them to appear\n\n form.add.string('name',\n 'What is your name?',\n default='Aubrey')\n\n form.add.int('age',\n 'What is your age?',\n default=1)\n\n # no options_format kwarg is provided for ChoiceInput\n # so it will use the default numeric_options\n form.add.select('color',\n 'What is your favorite color',\n ('red', 'green', 'blue'),\n default=1)\n\n form.add.bool('yaks', 'Do you like yaks?', default=True)\n\n # Our form is created, lets prompt the user for the answers:\n\n # promptly comes with a default set of styles or you can\n # provide your own.\n\n with open('/path/to/my/styles.css') as css:\n console.run(form, prefix='[promptly] ', stylesheet=css.read())\n\n # control has returned back to our script, lets see what the user said:\n\n print(form.name.value)\n print(form.age.value)\n print(form.color.value) # this will be a (key, value) tuple\n print(form.yaks.value)\n\n if form.age.value < 12:\n print(form.food.value)\n\n # Or we can just convert the whole form into a dictionary:\n d = dict(form)\n print(d)\n\n```\n\n\n## CSS Styling\nPromptly prompts are styles with a very limited subset of CSS.\nOnly the following properties apply:\n\n- color\n- background-color\n- font-weight\n\nThe avialable colors are limited to the color names provided by colorama:\n\n```\n Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Style: DIM, NORMAL, BRIGHT, RESET_ALL\n```\n\nIn other words:\n```css\n .prefix {\n color: white;\n background-color: blue;\n }\n```\n\nThe font-weight property maps to colorama Style values in the following way:\n\n```\n font-weight: normal; -> Style.NORMAL\n font-weight: bold; -> Style.BRIGHT\n font-weight: lighter; -> Style.DIM\n```\n\n### Heads Up\n\nThe CSS parser in promptly is **VERY VERY** primitive. It's just enough to parse\nwhat is below and that's all. It is by no means a full implementation of the\nCSS spec.\n\n\n## Default Prompty Stylesheet\n\nBelow is the default stylesheet included with promptly. This stylesheet\npresents the exhaustive set of selectors that can be used to style\nyour prompts. If it's not below, promptly doesn't support it.\n\nRemember each selector can support:\n\n```css\n color: \n background-color: \n font-weight: \n```\n\nThe default stylesheet below does not use every available option\nfor obvious reasons. But you should feel free too if you so desire.\n\n```body``` will set the default color and font-weight and background color.\nThe additional styles effectively cascade on top of body.\n\n\nNew selectors in `v0.5`\n`.action` represents the Cheveron before the user input is displayed.\n`.input` are the style for the user input.\n`.notification .footer` are the styles for the 3 dots that appear below\nselection choices and after notifications.\n\n```css\n body{\n color:white;\n font-weight:normal;\n }\n\n .action{\n color:magenta;\n font-weight:bold;\n }\n\n .input{\n color:white;\n font-weight:bold;\n }\n\n .prefix{\n color:blue;\n font-weight:bold;\n }\n\n .notification .label{\n color:white;\n font-weight:bold;\n }\n\n .notification .footer{\n color:white;\n font-weight:normal;\n }\n\n .string .label{\n color:white;\n }\n\n .string .default-wrapper{\n color:white;\n font-weight:bold;\n }\n\n .string .default-value{\n color:yellow;\n }\n\n .integer .label{\n color:white;\n }\n\n .integer .default-wrapper{\n color:white;\n font-weight:bold;\n }\n\n .integer .default-value{\n color:yellow;\n }\n\n .boolean .label{\n color:white;\n }\n\n .boolean .default-wrapper{\n color:white;\n font-weight:bold;\n }\n\n .boolean .default-value{\n color:yellow;\n }\n\n .boolean .other-value{\n color:yellow;\n }\n\n .boolean .seperator{\n color:white;\n font-weight:bold;\n }\n\n .choices .label{\n color:white;\n }\n\n .choices .default-wrapper{\n color:white;\n font-weight:bold;\n }\n\n .choices .default-value{\n color:yellow;\n }\n\n .choices .option-key{\n color:yellow;\n }\n\n .choices .seperator{\n color:yellow;\n font-weight:lighter;\n }\n\n .choices .option-value{\n color:white;\n font-weight:bold;\n }\n\n .choices .action{\n color:magenta;\n font-weight:bold;\n }\n\n .choices .selection{\n color:white;\n }\n\n```", "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/aventurella/promptly", "keywords": null, "license": "Copyright (c) 2013 Aubrey Taylor and Adam Venturella.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", "maintainer": null, "maintainer_email": null, "name": "promptly", "package_url": "https://pypi.org/project/promptly/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/promptly/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/aventurella/promptly" }, "release_url": "https://pypi.org/project/promptly/0.6.3/", "requires_dist": null, "requires_python": null, "summary": "Console Prompting", "version": "0.6.3" }, "last_serial": 1542209, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "27d443006d02ded7c2eef3d2c5ca2a13", "sha256": "2951625f374ce72fb4d89a065ec0a39822449206bf71447b2fc35008b74477b0" }, "downloads": -1, "filename": "promptly-0.1.tar.gz", "has_sig": false, "md5_digest": "27d443006d02ded7c2eef3d2c5ca2a13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2787, "upload_time": "2013-03-11T22:11:17", "url": "https://files.pythonhosted.org/packages/47/f6/e54823340f1a83c196f24dc5ef8fc0d4cbdb8f1b883caae1188209614213/promptly-0.1.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "2f4f39a4b227f9ad7f8061f6a9b05fd1", "sha256": "38819ca62788b83030d7e10b0ad04e2d1882028255e30bcc8a4b63da584294d9" }, "downloads": -1, "filename": "promptly-0.3.tar.gz", "has_sig": false, "md5_digest": "2f4f39a4b227f9ad7f8061f6a9b05fd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6838, "upload_time": "2013-03-16T05:20:31", "url": "https://files.pythonhosted.org/packages/0a/97/200685564b233ca62bc98f4ffbc93f9923bd092429880ce61ceb41bf2f6e/promptly-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "4efc084d97abcba2a57eb746eaaa3ba4", "sha256": "9acd36eb69c0518a9a4bcc02cf15ffa4f614931d7575950f2c537b9a2a6742ff" }, "downloads": -1, "filename": "promptly-0.4.tar.gz", "has_sig": false, "md5_digest": "4efc084d97abcba2a57eb746eaaa3ba4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12447, "upload_time": "2013-10-16T18:20:16", "url": "https://files.pythonhosted.org/packages/0a/2a/210119128b72325c805bfa06a9cf6e78c5d1c678b5c6b4f2d321d0d5129c/promptly-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "951dccd73e44bcf8abaab1664ff983b3", "sha256": "516a4495b61b1aec43968bae50d02be539eb704b64ba9aee94e4b644485bf193" }, "downloads": -1, "filename": "promptly-0.4.1.tar.gz", "has_sig": false, "md5_digest": "951dccd73e44bcf8abaab1664ff983b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12462, "upload_time": "2013-10-17T12:46:23", "url": "https://files.pythonhosted.org/packages/a7/e9/85cfd321d6fd11a27ef50ba6935484afb35275d49cc1381c6d0aacf4683b/promptly-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "7c1f02d5db015d8bae79c84b96f56366", "sha256": "4e0978581d342ead8cd6dafa39a1e34285f8c8b7d0d9c1a94b9de58837924db5" }, "downloads": -1, "filename": "promptly-0.4.2.tar.gz", "has_sig": false, "md5_digest": "7c1f02d5db015d8bae79c84b96f56366", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12513, "upload_time": "2013-10-17T13:13:27", "url": "https://files.pythonhosted.org/packages/de/d1/51a6299a07b0f9c35917ac5a033e02298da2ff43a65fd8eb19f462ac57b5/promptly-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "aa3d4d37bb4ffd7a8a83518a4640774b", "sha256": "dc277feb186e0445835ba7545ed7300b08c8a521e583ebdb9c9bfbccac02e7e1" }, "downloads": -1, "filename": "promptly-0.4.3.tar.gz", "has_sig": false, "md5_digest": "aa3d4d37bb4ffd7a8a83518a4640774b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12382, "upload_time": "2013-10-27T14:51:27", "url": "https://files.pythonhosted.org/packages/47/07/f6caca7b7ba4b7f76ac8aecf2181bae43cdb53be5d3d9f4caf5fa38b178e/promptly-0.4.3.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "86d55cbca3d34d1c0634659185d9471a", "sha256": "67516518423d3f26f7b448c2a94a004a82378e9eec482b0046b46a4cecc5b900" }, "downloads": -1, "filename": "promptly-0.5.0.tar.gz", "has_sig": false, "md5_digest": "86d55cbca3d34d1c0634659185d9471a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16757, "upload_time": "2013-10-29T02:36:22", "url": "https://files.pythonhosted.org/packages/ff/01/e45cea48886dc61b4ce18e798ec9a6dbcf797a4aadea0be25c97cb364420/promptly-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "f2396090873e9780a924b9172377398a", "sha256": "ef4ae1a40c56baaeb2d2476d81d536adb0bd7e06870f11ff21ec77d2a3e8f49b" }, "downloads": -1, "filename": "promptly-0.5.1.tar.gz", "has_sig": false, "md5_digest": "f2396090873e9780a924b9172377398a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16589, "upload_time": "2013-11-06T18:32:54", "url": "https://files.pythonhosted.org/packages/7c/b7/5d4c5b695c5e7c337083b7b30c5cbd255bdc10d97d2e3f78cdd46581589b/promptly-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "01ab53de9b4dc3175064bc0ce329e1d0", "sha256": "1f18885732f11ae9bb2e3366575c853c0bcc5078ec433121cb69335d6190458b" }, "downloads": -1, "filename": "promptly-0.5.2.tar.gz", "has_sig": false, "md5_digest": "01ab53de9b4dc3175064bc0ce329e1d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17461, "upload_time": "2013-11-06T23:48:15", "url": "https://files.pythonhosted.org/packages/a8/16/f8ae118aed6f509d77af75b0fef238b53d17c4260ae087798d87c4f8e81c/promptly-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "dd1ac939139c06dffcbb21b8696e7215", "sha256": "db3ec613d2ffbb049652acd24dbe70cc7af7bfa9ec60ece682f0a4e8bd37d757" }, "downloads": -1, "filename": "promptly-0.5.3.tar.gz", "has_sig": false, "md5_digest": "dd1ac939139c06dffcbb21b8696e7215", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18190, "upload_time": "2013-11-08T18:37:36", "url": "https://files.pythonhosted.org/packages/ca/32/7390ba34c4c68105e3e17086c03203d5193c2c56bbe65db1b401a72cc780/promptly-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "0eae6a740bfb13a6720ce3c732e5360f", "sha256": "11e3edefcdf2cda1c28a6d99c34259f70fcddf0e5b5797a1ba39c483cb43c90e" }, "downloads": -1, "filename": "promptly-0.5.4.tar.gz", "has_sig": false, "md5_digest": "0eae6a740bfb13a6720ce3c732e5360f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19016, "upload_time": "2014-01-21T14:19:50", "url": "https://files.pythonhosted.org/packages/9f/28/5756b471c19343049409b5c46297c95f7b19966c50b2c63eac701bf79493/promptly-0.5.4.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "12ff50f7973c86d5e8c240c29d0490bc", "sha256": "10a11020a1994f5b33510f13e6109d01e5bb10812c49935f16f1c8daf47ea001" }, "downloads": -1, "filename": "promptly-0.6.0.tar.gz", "has_sig": false, "md5_digest": "12ff50f7973c86d5e8c240c29d0490bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19543, "upload_time": "2014-02-27T18:49:27", "url": "https://files.pythonhosted.org/packages/25/40/99814982ff8558dde97902baa7d51b3b7ebc3720c3811798ea17ef853c27/promptly-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "593b598d52ccedf18164c30a249be649", "sha256": "3a1325ccb69cb463096b3919ba97ca33a771bd782efaa8f9b55c223bc6ad758e" }, "downloads": -1, "filename": "promptly-0.6.1.tar.gz", "has_sig": false, "md5_digest": "593b598d52ccedf18164c30a249be649", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19403, "upload_time": "2015-05-11T13:55:39", "url": "https://files.pythonhosted.org/packages/eb/86/3fc7041ae7d86b111614619be95a9eeb1b0af2fe5e16827d4417e7cc2708/promptly-0.6.1.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "947edff255d13865f596bd420cf8e4e0", "sha256": "73bc9b9fd3bc8aeca248565896df094b68171bf5f90656a4d943f1b6e475defc" }, "downloads": -1, "filename": "promptly-0.6.3.tar.gz", "has_sig": false, "md5_digest": "947edff255d13865f596bd420cf8e4e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19576, "upload_time": "2015-05-11T16:10:26", "url": "https://files.pythonhosted.org/packages/46/fc/7df82324df58c4eb8782e916a2f4cd86497e844f3bbcfdb1def8e51034dc/promptly-0.6.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "947edff255d13865f596bd420cf8e4e0", "sha256": "73bc9b9fd3bc8aeca248565896df094b68171bf5f90656a4d943f1b6e475defc" }, "downloads": -1, "filename": "promptly-0.6.3.tar.gz", "has_sig": false, "md5_digest": "947edff255d13865f596bd420cf8e4e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19576, "upload_time": "2015-05-11T16:10:26", "url": "https://files.pythonhosted.org/packages/46/fc/7df82324df58c4eb8782e916a2f4cd86497e844f3bbcfdb1def8e51034dc/promptly-0.6.3.tar.gz" } ] }