{ "info": { "author": "Martin Moss", "author_email": "martin_moss@btinternet.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.0", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "Heroku3.py\n==========\n\n.. image:: https://img.shields.io/pypi/v/heroku3.svg\n :target: https://pypi.org/project/heroku3\n\n.. image:: https://circleci.com/gh/martyzz1/heroku3.py.svg?style=svg\n :target: https://circleci.com/gh/martyzz1/heroku3.py\n\n.. image:: https://coveralls.io/repos/github/martyzz1/heroku3.py/badge.svg?branch=master\n :target: https://coveralls.io/github/martyzz1/heroku3.py?branch=master\n\n.. image:: https://www.travis-ci.org/martyzz1/heroku3.py.svg?branch=master\n :target: https://www.travis-ci.org/martyzz1/heroku3.py\n\n.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg\n\nThis is the updated Python wrapper for the Heroku `API V3. `_\nThe Heroku REST API allows Heroku users to manage their accounts, applications, addons, and\nother aspects related to Heroku. It allows you to easily utilize the Heroku\nplatform from your applications.\n\nIntroduction\n===========\n\nFirst instantiate a heroku_conn as above::\n\n import heroku3\n heroku_conn = heroku3.from_key('YOUR_API_KEY')\n\nInteract with your applications::\n\n >>> heroku_conn.apps()\n [, , ...]\n\n >>> app = heroku_conn.apps()['sharp-night-7758']\n\nGeneral notes on Debugging\n--------------------------\n\nHeroku provides some useful debugging information. This code exposes the following\n\nRatelimit Remaining\n~~~~~~~~~~~~~~~~~~~\n\nGet the current ratelimit remaining::\n\n num = heroku_conn.ratelimit_remaining()\n\nLast Request Id\n~~~~~~~~~~~~~~~\n\nGet the unique ID of the last request sent to heroku to give them for debugging::\n\n id = heroku_conn.last_request_id\n\n\nGeneral notes about list Objects\n--------------------------------\n\nThe new heroku3 API gives greater control over the interaction of the returned data. Primarily this\ncentres around calls to the api which result in list objects being returned.\ne.g. multiple objects like apps, addons, releases etc.\n\nThroughout the docs you'll see references to using limit & order_by. Wherever you see these, you *should* be able to use *limit*, *order_by*, *sort* and *valrange*.\n\nYou can control ordering, limits and pagination by supplying the following keywords::\n\n order_by=<'id'|'version'>\n limit=\n valrange= - See api docs for this, This value is passed straight through to the API call *as is*.\n sort=<'asc'|'desc'>\n\n**You'll have to investigate the api for each object's *Accept-Ranges* header to work out which fields can be ordered by**\n\nExamples\n~~~~~~~~\n\nList all apps in name order::\n\n heroku_conn.apps(order_by='name')\n\nList the last 10 releases::\n\n app.releases(order_by='version', limit=10, sort='desc')\n heroku_conn.apps()['empty-spring-4049'].releases(order_by='version', limit=10, sort='desc')\n\n\nList objects can be referred to directly by *any* of their primary keys too::\n\n app = heroku_conn.apps()['myapp']\n dyno = heroku_conn.apps()['myapp_id'].dynos()['web.1']\n proc = heroku_conn.apps()['my_app'].process_formation()['web']\n\n**Be careful if you use *limit* in a list call *and* refer directly to an primary key**\nE.g.Probably stupid...::\n\n dyno = heroku_conn.apps()['myapp'].dynos(limit=1)['web.1']\n\nGeneral Notes on Objects\n------------------------\n\nTo find out the Attributes available for a given object, look at the corresponding Documentation for that object.\ne.g.\n\n`Formation `_ Object::\n\n >>>print(feature.command)\n bundle exec rails server -p $PORT\n\n >>>print(feature.created_at)\n 2012-01-01T12:00:00Z\n\n >>>print(feature.id)\n 01234567-89ab-cdef-0123-456789abcdef\n\n >>>print(feature.quantity)\n 1\n >>>print(feature.size)\n 1\n >>>print(feature.type)\n web\n\n >>>print(feature.updated_at)\n 2012-01-01T12:00:00Z\n\nSwitching Accounts Mid Flow\n---------------------------\n\nIt is also possible to change the underlying heroku_connection at any point on any object or listobject by creating a new heroku_conn and calling change_connection::\n\n heroku_conn1 = heroku3.from_key('YOUR_API_KEY')\n heroku_conn2 = heroku3.from_key('ANOTHER_API_KEY')\n app = heroku_conn1.apps()['MYAPP']\n app.change_connection(heroku_conn2)\n app.config() # this call will use heroku_conn2\n ## or on list objects\n apps = heroku_conn1.apps()\n apps.change_connection(heroku_conn2)\n for app in apps:\n config = app.config()\n\nLegacy API Calls\n================\n\nThe API has been built with an internal legacy=True ability, so any functionlity not implemented in the new API can be called via the previous `legacy API `_. This is currently only used for *rollbacks*.\n\n\nObject API\n==========\n\nAccount\n-------\n\nGet account::\n\n account = heroku_conn.account()\n\nChange Password::\n\n account.change_password(\"\", \"\")\n\nSSH Keys\n~~~~\n\nList all configured keys::\n\n keylist = account.keys(order_by='id')\n\nAdd Key::\n\n account.add_key()\n\nRemove key::\n\n account.remove_key()\n\nAccount Features (Heroku Labs)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nList all configured account \"features\"::\n\n featurelist = account.features()\n\nDisable a feature::\n\n feature = account.disable_feature(id_or_name)\n feature.disable()\n\nEnable a feature::\n\n feature = account.enable_feature(id_or_name)\n feature.enable()\n\nPlans - or Addon Services\n--------------\n\nList all available Addon Services::\n\n addonlist = heroku_conn.addon_services(order_by='id')\n addonlist = heroku_conn.addon_services()\n\nGet specific available Addon Service::\n\n addonservice = heroku_conn.addon_services()\n\nApp\n--------\n\nThe App Class is the starting point for most of the api functionlity.\n\nList all apps::\n\n applist = heroku_conn.apps(order_by='id')\n applist = heroku_conn.apps()\n\nGet specific app::\n\n app = heroku_conn.app()\n app = heroku_conn.apps()[id_or_name]\n\nCreate an app::\n\n app = heroku_conn.create_app(name=None, stack_id_or_name='cedar', region_id_or_name=)\n\nDestroy an app (**Warning this is irreversible**)::\n\n app.delete()\n\nAddons\n~~~~~~\n\nList all Addons::\n\n addonlist = app.addons(order_by='id')\n addonlist = applist[].addons(limit=10)\n addonlist = heroku_conn.addons()\n\nInstall an Addon::\n\n addon = app.install_addon(plan_id_or_name='', config={})\n addon = app.install_addon(plan_id_or_name='', config={})\n addon = app.install_addon(plan_id_or_name=addonservice.id, config={})\n\nRemove an Addon::\n\n addon = app.remove_addon()\n addon = app.remove_addon(addonservice.id)\n addon.delete()\n\nUpdate/Upgrade an Addon::\n\n addon = addon.upgrade(plan_id_or_name='')\n addon = addon.upgrade(plan_id_or_name='')\n\nBuildpacks\n~~~~~~~~~~~~~\n\nUpdate all buildpacks::\n\n buildpack_urls = ['https://github.com/some/buildpack', 'https://github.com/another/buildpack']\n app.update_buildpacks(buildpack_urls)\n\n*N.B. buildpack_urls can also be empty. This clears all buildpacks.*\n\n\nApp Labs/Features\n~~~~~~~~~~~~~\n\nList all features::\n\n appfeaturelist = app.features()\n appfeaturelist = app.labs() #nicename for features()\n appfeaturelist = app.features(order_by='id', limit=10)\n\nAdd a Feature::\n\n appfeature = app.enable_feature()\n\nRemove a Feature::\n\n appfeature = app.disable_feature()\n\nApp Transfers\n~~~~~~~~~~~~~\n\nList all Transfers::\n\n transferlist = app.transfers()\n transferlist = app.transfers(order_by='id', limit=10)\n\nCreate a Transfer::\n\n transfer = app.create_transfer(recipient_id_or_name=)\n transfer = app.create_transfer(recipient_id_or_name=)\n\nDelete a Transfer::\n\n deletedtransfer = app.delete_transfer()\n deletedtransfer = transfer.delete()\n\nUpdate a Transfer's state::\n\n transfer.update(state)\n transfer.update(\"Pending\")\n transfer.update(\"Declined\")\n transfer.update(\"Accepted\")\n\n\nCollaborators\n~~~~~~~~~~~~~\n\nList all Collaborators::\n\n collaboratorlist = app.collaborators()\n collaboratorlist = app.collaborators(order_by='id')\n\nAdd a Collaborator::\n\n collaborator = app.add_collaborator(user_id_or_email=, silent=0)\n collaborator = app.add_collaborator(user_id_or_email=user_id, silent=0)\n collaborator = app.add_collaborator(user_id_or_email=user_id, silent=1) #don't send invitation email\n\nRemove a Collaborator::\n\n collaborator = app.remove_collaborator(userid_or_email)\n\nConfigVars\n~~~~~~~~~~\n\nGet an apps config::\n\n config = app.config()\n\nAdd a config Variable::\n\n config['New_var'] = 'new_val'\n\nUpdate a config Variable::\n\n config['Existing_var'] = 'new_val'\n\nRemove a config Variable::\n\n del config['Existing_var']\n config['Existing_var'] = None\n\nUpdate Multiple config Variables::\n\n # newconfig will always be a new ConfigVars object representing all config values for an app\n # i.e. there won't be partial configs\n newconfig = config.update({u'TEST1': u'A1', u'TEST2': u'A2', u'TEST3': u'A3'})\n newconfig = heroku_conn.update_appconfig(, {u'TEST1': u'A1', u'TEST2': u'A2', u'TEST3': u'A3'})\n newconfig = app.update_config({u'TEST1': u'A1', u'TEST2': u'A2', u'TEST3': u'A3'})\n\nCheck if a var exists::\n\n if 'KEY' in config:\n print(\"KEY = {0}\".format(config[KEY]))\n\nGet dict of config vars::\n\n my_dict = config.to_dict()\n\nDomains\n~~~~~~~\n\nGet a list of domains configured for this app::\n\n domainlist = app.domains(order_by='id')\n\nAdd a domain to this app::\n\n domain = app.add_domain('domain_hostname')\n\nRemove a domain from an app::\n\n domain = app.remove_domain('domain_hostname')\n\nDynos & Process Formations\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDynos\n_______\n\nDynos represent all your running dyno processes. Use dynos to investigate whats running on your app.\nUse Dynos to create one off processes/run commands.\n\n**You don't \"scale\" dyno Processes. You \"scale\" Formation Processes. See Formations section Below**\n\nGet a list of running dynos::\n\n dynolist = app.dynos()\n dynolist = app.dynos(order_by='id')\n\nKill a dyno::\n\n app.kill_dyno()\n app.dynos['run.1'].kill()\n dyno.kill()\n\n**Restarting your dynos is achieved by killing existing dynos, and allowing heroku to auto start them. A Handy wrapper for this proceses has been provided below.**\n\n*N.B. This will only restart Formation processes, it will not kill off other processes.*\n\nRestart a Dyno::\n\n #a simple wrapper around dyno.kill() with run protection so won't kill any proc of type='run' e.g. 'run.1'\n dyno.restart()\n\nRestart all your app's Formation configured Dyno's::\n\n app.restart()\n\nRun a command without attaching to it. e.g. start a command and return the dyno object representing the command::\n\n dyno = app.run_command_detached('fab -l', size=1, env={'key': 'val'})\n dyno = heroku_conn.run_command_on_app(, , size=1, attach=False, printout=True, env={'key': 'val'})\n\nRun a command and attach to it, returning the commands output as a string::\n\n #printout is used to control if the task should also print to STDOUT - useful for long running processes\n #size = is the processes dyno size 1X(default), 2X, 3X etc...\n #env = Envrionment variables for the dyno\n output, dyno = heroku_conn.run_command_on_app(, , size=1, attach=True, printout=True, env={'key': 'val'})\n output = app.run_command('fab -l', size=1, printout=True, env={'key': 'val'})\n print output\n\nFormations\n_________\n\nFormations represent the dynos that you have configured in your Procfile - whether they are running or not.\nUse Formations to scale dynos up and down\n\nGet a list of your configured Processes::\n\n proclist = app.process_formation()\n proclist = app.process_formation(order_by='id')\n proc = app.process_formation()['web']\n proc = heroku_conn.apps()['myapp'].process_formation()['web']\n\nScale your Procfile processes::\n\n app.process_formation()['web'].scale(2) # run 2 dynos\n app.process_formation()['web'].scale(0) # don't run any dynos\n proc = app.scale_formation_process(, )\n\nResize your Procfile Processes::\n\n app.process_formation()['web'].resize(2) # for 2X\n app.process_formation()['web'].resize(1) # for 1X\n proc = app.resize_formation_process(, )\n\n\nLog Drains\n~~~~~~~~~~\n\nList all active logdrains::\n\n logdrainlist = app.logdrains()\n logdrainlist = app.logdrains(order_by='id')\n\nCreate a logdrain::\n\n loggdrain = app.create_logdrain()\n\nRemove a logdrain::\n\n delete_logdrain - app.remove_logdrain()\n\n\n\nLog Sessions\n~~~~~~~~~~~~\n\nAccess the logs::\n\n log = heroku_conn.get_app_log(, dyno='web.1', lines=2, source='app', timeout=False)\n log = app.get_log()\n log = app.get_log(lines=100)\n print(app.get_log(dyno='web.1', lines=2, source='app'))\n 2011-12-21T22:53:47+00:00 heroku[web.1]: State changed from down to created\n 2011-12-21T22:53:47+00:00 heroku[web.1]: State changed from created to starting\n\n\nYou can even stream the tail::\n\n #accepts the same params as above - lines|dyno|source|timeout (passed to requests)\n log = heroku_conn.stream_app_log(, lines=1, timeout=100)\n #or\n for line in app.stream_log(lines=1):\n print(line)\n\n 2011-12-21T22:53:47+00:00 heroku[web.1]: State changed from down to created\n 2011-12-21T22:53:47+00:00 heroku[web.1]: State changed from created to starting\n\nMaintenance Mode\n~~~~~~~~~~~~~~~~\n\nEnable Maintenance Mode::\n\n app.enable_maintenance_mode()\n\nDisable Maintenance Mode::\n\n app.disable_maintenance_mode()\n\nOAuth\n~~~~~\nOAuthAuthorizations\n___________________\n\nList all OAuthAuthorizations::\n\n authorizations = heroku_conn.oauthauthorizations(order_by=id)\n\nGet a specific OAuthAuthorization::\n\n authorization = authorizations[]\n authorization = heroku_conn.oauthauthorization(oauthauthorization_id)\n\nCreate an OAuthAuthorization::\n\n authorization = heroku_conn.oauthauthorization_create(scope, oauthclient_id=None, description=None)\n\nDelete an OAuthAuthorization::\n\n authorization.delete()\n heroku_conn.oauthauthorization_delete(oauthauthorization_id)\n\nOAuthClient\n___________\n\nList all OAuthClients::\n\n clients = heroku_conn.oauthclients(order_by=id)\n\nGet a specific OAuthClient::\n\n client = clients[]\n client = heroku_conn.oauthclient(oauthclient_id)\n\nCreate an OAuthClient::\n\n client = heroku_conn.oauthclient_create(name, redirect_uri)\n\nUpdate an existing OAuthClient::\n\n client = client.update(name=None, redirect_uri=None)\n\nDelete an OAuthClient::\n\n client.delete()\n heroku_conn.oauthclient_delete(oauthclient_id)\n\nOAuthToken\n__________\n\nCreate an OAuthToken::\n\n heroku_conn.oauthtoken_create(client_secret=None, grant_code=None, grant_type=None, refresh_token=None)\n\nRelease\n~~~~~~~\n\nList all releases::\n\n releaselist = app.releases()\n releaselist = app.releases(order_by='version')\n\nrelease information::\n\n for release in app.releases():\n print(\"{0}-{1} released by {2} on {3}\".format(release.id, release.description, release.user.name, release.created_at))\n\nRollbck to a release::\n\n app.rollback(\"v{0}\".format(release.version))\n app.rollback(\"v108\")\n\nRename App\n~~~~~~~~~~\n\nRename App::\n\n app.rename('Carrot-kettle-teapot-1898')\n\nCustomized Sessions\n-------------------\n\nHeroku.py is powered by `Requests `_ and supports all `customized sessions `_:\n\nLogging\n-------\n\nNote: logging is now achieved by the following method::\n\n\n import httplib\n httplib.HTTPConnection.debuglevel = 1\n\n logging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests\n logging.getLogger().setLevel(logging.INFO)\n requests_log = logging.getLogger(\"requests.packages.urllib3\")\n requests_log.setLevel(logging.INFO)\n requests_log.propagate = True\n\n heroku_conn.ratelimit_remaining()\n\n >>>INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): api.heroku.com\n >>>send: 'GET /account/rate-limits HTTP/1.1\\r\\nHost: api.heroku.com\\r\\nAuthorization: Basic ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ=\\r\\nContent-Type: application/json\\r\\nAccept-Encoding: gzip, deflate, compress\\r\\nAccept: application/vnd.heroku+json; version=3\\r\\nUser-Agent: python-requests/1.2.3 CPython/2.7.2 Darwin/12.4.0\\r\\n\\r\\n'\n >>>reply: 'HTTP/1.1 200 OK\\r\\n'\n >>>header: Content-Encoding: gzip\n >>>header: Content-Type: application/json;charset=utf-8\n >>>header: Date: Thu, 05 Sep 2013 11:13:03 GMT\n >>>header: Oauth-Scope: global\n >>>header: Oauth-Scope-Accepted: global identity\n >>>header: RateLimit-Remaining: 2400\n >>>header: Request-Id: ZZZZZZ2a-b704-4bbc-bdf1-e4bc263586cb\n >>>header: Server: nginx/1.2.8\n >>>header: Status: 200 OK\n >>>header: Strict-Transport-Security: max-age=31536000\n >>>header: Vary: Accept-Encoding\n >>>header: X-Content-Type-Options: nosniff\n >>>header: X-Runtime: 0.032193391\n >>>header: Content-Length: 44\n >>>header: Connection: keep-alive\n\n\n\nInstallation\n------------\n\nTo install ``heroku3.py``, simply::\n\n $ pip install heroku3\n\nOr, if you absolutely must::\n\n $ easy_install heroku3\n\nBut, you `really shouldn't do that `_.\n\n\nLicense\n-------\n\nOriginal Heroku License left intact, The code in this repository is mostly my own, but credit where credit is due and all that :)\n\nCopyright (c) 2013 Heroku, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nHistory\n-------\n\n3.4.0\n+++++\n* Support for python 2.6 dropped\n* Add Tests\n* Get project building on circleci/travis-ci & coveralls\n* Adding Slug to Release Models\n* bugfixes\n\n3.2.0-2\n+++++++\n* Various fixes for python3\n* Add newer features from Heroku API, support for Organisations\n\n3.1.4\n+++++\n* bugfixes\n\n3.1.3 (2015-03-12)\n++++++++++++++++++\n* removed debug\n\n3.1.0 (2014-11-24)\n++++++++++++++++++\n* Moved to Heroku3 for pypi release\n* Updated heroku/data/cacert.pem\n\n3.0.0 - 3.1.0 \n+++++++++++++\n* Add support for all of heroku's api\n* Various bugfixes and enhancements\n* Add Documentation\n* Add examples.py\n* Used in production on https://www.migreat.com & https://www.migreat.co.uk since 2013-10-01\n\n3.0.0 (2013-08-28)\n++++++++++++++++++\n* Rewrite to support V3 API\n\n* Initial release.\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/martyzz1/heroku3.py/tarball/v3.4.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/martyzz1/heroku3.py", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "heroku3", "package_url": "https://pypi.org/project/heroku3/", "platform": "", "project_url": "https://pypi.org/project/heroku3/", "project_urls": { "Download": "https://github.com/martyzz1/heroku3.py/tarball/v3.4.0", "Homepage": "https://github.com/martyzz1/heroku3.py" }, "release_url": "https://pypi.org/project/heroku3/3.4.0/", "requires_dist": [ "requests (>=1.2.3)", "simplejson (==3.3.1)", "python-dateutil (>=2.6.0)" ], "requires_python": "", "summary": "Heroku API Wrapper.", "version": "3.4.0" }, "last_serial": 4375353, "releases": { "3.1.0": [ { "comment_text": "", "digests": { "md5": "531b11589c3d2fa592a01b8a407fae3f", "sha256": "f645c1e4c4a4889544ac20132e2fd02705f5475b201a065ac606209402e222ae" }, "downloads": -1, "filename": "heroku3-3.1.0.macosx-10.7-x86_64.tar.gz", "has_sig": false, "md5_digest": "531b11589c3d2fa592a01b8a407fae3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21451, "upload_time": "2014-11-25T17:11:36", "url": "https://files.pythonhosted.org/packages/79/61/8b7d9c1fc490898b5235bd21747f065163c98a75095736289134aecf4a7b/heroku3-3.1.0.macosx-10.7-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "0fc1ab88e255997b51716fb0a48d86a2", "sha256": "ecd49be6aec75c9de147c9e5ffe62b0833397b8ced7bc7775e7b67fcbb8c4015" }, "downloads": -1, "filename": "heroku3-3.1.0.tar.gz", "has_sig": false, "md5_digest": "0fc1ab88e255997b51716fb0a48d86a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28610, "upload_time": "2014-11-25T17:20:36", "url": "https://files.pythonhosted.org/packages/70/73/89deb54772d024fce4189b960befc0ba7490f41353c243ffb635d8a48917/heroku3-3.1.0.tar.gz" } ], "3.1.1": [ { "comment_text": "", "digests": { "md5": "9ddde52ed092f5216d11b5376613499f", "sha256": "1777bb4fdd67c268d50f9e634556ab101cad2e397ae90157dfc56945ab9462ea" }, "downloads": -1, "filename": "heroku3-3.1.1.tar.gz", "has_sig": false, "md5_digest": "9ddde52ed092f5216d11b5376613499f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28628, "upload_time": "2014-11-25T17:26:55", "url": "https://files.pythonhosted.org/packages/c6/42/fc80e8b0a17c7883eb8d8d2ad67f9ab82c903b659a9f0fc5c64d57ed2387/heroku3-3.1.1.tar.gz" } ], "3.1.2": [ { "comment_text": "", "digests": { "md5": "2f07ddff9298b41cd496f3b4abf27b47", "sha256": "ea83e57efc6c1e4bd5c7a0b8988d703b5adbe4e275fb9d6d586c85f9fd11fc26" }, "downloads": -1, "filename": "heroku3-3.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2f07ddff9298b41cd496f3b4abf27b47", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 175887, "upload_time": "2014-11-26T11:16:00", "url": "https://files.pythonhosted.org/packages/ba/9e/bcdeafb3a831a2d54c7815d2105e449ec18d83dce899147132c1d90720d4/heroku3-3.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4d0ba1c84e9425ad0efba88179f1b34", "sha256": "404039fef462fcba3a20f8d400a287103c528b856e97f7ce70fc4ade3d631b47" }, "downloads": -1, "filename": "heroku3-3.1.2.tar.gz", "has_sig": false, "md5_digest": "b4d0ba1c84e9425ad0efba88179f1b34", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 168543, "upload_time": "2014-11-26T11:20:29", "url": "https://files.pythonhosted.org/packages/24/2f/0c44ac7498d754d79bcd78122fd6d86b6cf5cb897529549586b21a2b605c/heroku3-3.1.2.tar.gz" } ], "3.1.3": [ { "comment_text": "", "digests": { "md5": "45fed25a39a56bd00a2c9532c8bc939c", "sha256": "e46ce3cd31f01524d519d31c3d3937b2be73f432eba0c4abf412e9fd31eeb3ed" }, "downloads": -1, "filename": "heroku3-3.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "45fed25a39a56bd00a2c9532c8bc939c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 175883, "upload_time": "2015-03-12T22:27:28", "url": "https://files.pythonhosted.org/packages/a4/c6/8b005cf558ddce983684063812accec1f6926a2803472946df08fc0e933c/heroku3-3.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09dc14c758a59544fabc6b9e1477db9c", "sha256": "94f0c97b954363f8dfcff496258439d3195fa9ddb6e34afe48a3fcb0b76b5a20" }, "downloads": -1, "filename": "heroku3-3.1.3.tar.gz", "has_sig": false, "md5_digest": "09dc14c758a59544fabc6b9e1477db9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 168479, "upload_time": "2015-03-12T22:27:15", "url": "https://files.pythonhosted.org/packages/ba/1a/1a0b0adacbcb744449ca786588fd5e39015b83057656d6cc3b0d699fbdd2/heroku3-3.1.3.tar.gz" } ], "3.1.4": [ { "comment_text": "", "digests": { "md5": "9558c24fdb3f95267af8ca90b77d675b", "sha256": "9bf55a47194406c080f840fcf05cd045687183ea9fda21776d06ccd5cf69c1c6" }, "downloads": -1, "filename": "heroku3-3.1.4.tar.gz", "has_sig": false, "md5_digest": "9558c24fdb3f95267af8ca90b77d675b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169688, "upload_time": "2016-11-15T10:41:12", "url": "https://files.pythonhosted.org/packages/5e/6f/733a21eaac7eabda19569eeb3459225a3aad4c2bb84479a4d9121d7c7d1b/heroku3-3.1.4.tar.gz" } ], "3.2.0": [ { "comment_text": "", "digests": { "md5": "e6f689b1f385da15a7fe8725cffaa07a", "sha256": "3c2cc5023d39812203368f696f04fbfc19c00676bcb7f2bff4f7375ed4f17be5" }, "downloads": -1, "filename": "heroku3-3.2.0.tar.gz", "has_sig": false, "md5_digest": "e6f689b1f385da15a7fe8725cffaa07a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169765, "upload_time": "2016-11-15T10:45:39", "url": "https://files.pythonhosted.org/packages/31/d1/7f1b2c2a73b69a6be9131bab8b758bca90e6235993027e246ea23a7ae373/heroku3-3.2.0.tar.gz" } ], "3.2.1": [ { "comment_text": "", "digests": { "md5": "8c4fd47b14d59fcc09e995aac8c1afcb", "sha256": "3f361354710c0b1d2bafe8899b6fac123612b5e2c3cb160d9d07c4459722554e" }, "downloads": -1, "filename": "heroku3-3.2.1.tar.gz", "has_sig": false, "md5_digest": "8c4fd47b14d59fcc09e995aac8c1afcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169786, "upload_time": "2016-11-15T15:59:48", "url": "https://files.pythonhosted.org/packages/40/06/fc30614f7a837f2f56361fd4be677ff148a9d90d3f96d096b8b215d50fe0/heroku3-3.2.1.tar.gz" } ], "3.2.2": [ { "comment_text": "", "digests": { "md5": "d5e05a7a4322233e960a3731191defb9", "sha256": "c057bb88a4db2d83ae3da35f28a1d6dcd65af0b9a83d12dc0dbee0f7c7772f49" }, "downloads": -1, "filename": "heroku3-3.2.2.tar.gz", "has_sig": false, "md5_digest": "d5e05a7a4322233e960a3731191defb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 170128, "upload_time": "2017-03-01T22:33:22", "url": "https://files.pythonhosted.org/packages/75/eb/7e53018f2f4fb908e9e38de584cfd83c967140462687840dbd263d6f8daa/heroku3-3.2.2.tar.gz" } ], "3.3.0": [ { "comment_text": "", "digests": { "md5": "472875de0b6e049f2fa2e964b117146f", "sha256": "ceb8757062007d480717799f13cf9a97bc6161354211404d6284d8a42e11fc70" }, "downloads": -1, "filename": "heroku3-3.3.0.tar.gz", "has_sig": false, "md5_digest": "472875de0b6e049f2fa2e964b117146f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 170344, "upload_time": "2017-05-03T13:24:49", "url": "https://files.pythonhosted.org/packages/38/6b/d4459b8b0935c4f9f14262d54eb571a1e878da14af9dec219b2a9366e64b/heroku3-3.3.0.tar.gz" } ], "3.4.0": [ { "comment_text": "", "digests": { "md5": "85d622f7252759d4a66565624be08db7", "sha256": "92d5b802f11af242430c52b4fc00a25b8c009a3d9b6bd1b44460d36a8788eb61" }, "downloads": -1, "filename": "heroku3-3.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "85d622f7252759d4a66565624be08db7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 174068, "upload_time": "2018-10-14T21:23:52", "url": "https://files.pythonhosted.org/packages/66/3f/7682db45b78c262fb7caa0fbccd24055edbf3d3d58072963e7141ef63054/heroku3-3.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac072f568f612c310616651349158f46", "sha256": "b1d02c1169f87ca420656e345ae750de5dbb3df7d8f7ddcbcbaba59c400775a9" }, "downloads": -1, "filename": "heroku3-3.4.0.tar.gz", "has_sig": false, "md5_digest": "ac072f568f612c310616651349158f46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 172145, "upload_time": "2018-10-14T21:24:01", "url": "https://files.pythonhosted.org/packages/61/18/6414414db665a116b729482e8f95ec7d261f9a1ada33b70d4d992bf6febe/heroku3-3.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "85d622f7252759d4a66565624be08db7", "sha256": "92d5b802f11af242430c52b4fc00a25b8c009a3d9b6bd1b44460d36a8788eb61" }, "downloads": -1, "filename": "heroku3-3.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "85d622f7252759d4a66565624be08db7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 174068, "upload_time": "2018-10-14T21:23:52", "url": "https://files.pythonhosted.org/packages/66/3f/7682db45b78c262fb7caa0fbccd24055edbf3d3d58072963e7141ef63054/heroku3-3.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac072f568f612c310616651349158f46", "sha256": "b1d02c1169f87ca420656e345ae750de5dbb3df7d8f7ddcbcbaba59c400775a9" }, "downloads": -1, "filename": "heroku3-3.4.0.tar.gz", "has_sig": false, "md5_digest": "ac072f568f612c310616651349158f46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 172145, "upload_time": "2018-10-14T21:24:01", "url": "https://files.pythonhosted.org/packages/61/18/6414414db665a116b729482e8f95ec7d261f9a1ada33b70d4d992bf6febe/heroku3-3.4.0.tar.gz" } ] }