{ "info": { "author": "Upvest GmbH", "author_email": "tech@upvest.co", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Upvest Python SDK\n=================\n\n[![CircleCI](https://circleci.com/gh/upvestco/upvest-python.svg?style=svg)](https://circleci.com/gh/upvestco/upvest-python)\n[![PyPI version](https://img.shields.io/pypi/v/upvest.svg)](https://pypi.org/project/upvest/)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/upvest.svg)](https://pypi.org/project/upvest/)\n\nInstallation\n------\nThe Upvest SDK is available on [PYPI](https://pypi.org/project/upvest/). Install with pip:\n```python\npip install upvest\n```\n\nThe default SDK is lightweight, and user recovery kits are returned as an SVG in string format. If you wish to process the recovery kit in binary format, then additional requirements are necessary:\n\n```python\npip install upvest[recovery]\n```\n\nNote that this may require additional system level dependencies to support [PyNaCl](https://pypi.org/project/PyNaCl/).\n\nDocumentation\n------\nIn order to retrieve your API credentials for using this Python client, you'll need to [sign up with Upvest](https://login.upvest.co/sign-up).\n\n### API Keys Authentication\nThe Upvest API uses the notion of _tenants_, which represent customers that build their platform upon the Upvest API. The end-users of the tenant (i.e. your customers), are referred to as _clients_. A tenant is able to manage their users directly (CRUD operations for the user instance) and is also able to initiate actions on the user's behalf (create wallets, send transactions).\n\nThe authentication via API keys and secret allows you to perform all tenant related operations.\nPlease create an API key pair within the [Upvest account management](https://login.upvest.co/).\n\nThe default `BASE_URL` for both authentication objects is `https://api.playground.upvest.co`, but feel free to adjust it, once you retrieve your live keys.\nNext, create an `UpvestTenancyAPI` object in order to authenticate your API calls:\n```python\nfrom upvest.tenancy import UpvestTenancyAPI\ntenancy = UpvestTenancyAPI(API_KEY, API_SECRET, API_PASSPHRASE, base_url=BASE_URL) # or base_url=None to use the playground environment (default)\n```\n\n### OAuth Authentication\nThe authentication via OAuth allows you to perform operations on behalf of your user.\nFor more information on the OAuth concept, please refer to our [documentation](https://doc.upvest.co/docs/oauth2-authentication).\nAgain, please retrieve your client credentials from the [Upvest account management](https://login.upvest.co/).\n\nNext, create an `UpvestClienteleAPI` object with these credentials and your user authentication data in order to authenticate your API calls on behalf of a user:\n```python\nfrom upvest.clientele import UpvestClienteleAPI\nclientele = UpvestClienteleAPI(CLIENT_ID, CLIENT_SECRET, username, password, base_url=BASE_URL) # or base_url=None to use the playground environment (default)\n```\n\n### API Calls\nAll tenancy related operations must be authenticated using the API Keys Authentication, whereas all actions on a user's behalf need to be authenticated via OAuth. The API calls are built along with those two authentication objects.\n\nThe methods allow for passing parameters if needed. If the required arguments are not provided, a respective error will be raised.\n\n### Response objects\nThe response objects are designed around users, wallets, transactions and assets. If you retrieve more than one object (for example: `tenancy.users.all()`) a list of those objects will be returned.\n\n#### User object\nThe user response object has the following properties:\n```python\nuser = tenancy.users.get('username')\nuser.username\nuser.recoverykit # is None if not just created\n```\n\n#### Wallet object\nThe wallet response object has the following properties:\n```python\nwallet = clientele.wallets.get('wallet_id')\nwallet.transactions\nwallet.id\nwallet.balances\nwallet.protocol\nwallet.address\nwallet.status\n```\n\n#### Asset object\nThe transaction response object has the following properties:\n```python\nasset, *rest = clientele.assets.all()\nasset.id\nasset.name\nasset.symbol\nasset.exponent\nasset.protocol\nasset.metadata\n```\n\n#### Transaction object\nThe transaction response object has the following properties:\n```python\ntransaction = wallet.transactions.get('transaction_id')\ntransaction.id\ntransaction.path\ntransaction.hash\ntransaction.sender\ntransaction.recipient\ntransaction.quantity\ntransaction.fee\ntransaction.status\n```\n\nUsage\n------\n### Tenancy\n#### User management\n##### Create a user\n```python\nuser = tenancy.users.create('username','password')\n```\n##### Retrieve a user\n```python\nuser = tenancy.users.get('username')\n```\n##### List all users under tenancy\n```python\nusers = tenancy.users.all()\n```\n##### List a specific number of users under tenancy\n```python\nusers = tenancy.users.list(10)\n```\n##### Change password of a user\n```python\nuser = tenancy.users.get('username').update(password='current_password', new_password='new_password')\n```\n##### Delete a user\n```python\ntenancy.users.get('username').delete()\n```\n\n### Clientele\n#### Assets\n##### List available assets\n```python\nassets = clientele.assets.all()\n```\nNote that it's also possible to retrieve the same list from `tenancy.assets.all()`.\n\n#### Wallets\n##### Create a wallet for a user\n```python\nwallet = clientele.wallets.create('asset_id', 'password')\n```\n##### Retrieve specific wallet for a user\n```python\nwallet = clientele.wallets.get('wallet_id')\n```\n##### List all wallets for a user\n```python\nwallets = clientele.wallets.all()\n```\n##### List a specific number of wallets\n```python\nwallets = clientele.wallets.list(40)\n```\n\n#### Transactions\n##### Create transaction\n```python\nwallet = clientele.wallets.create('asset_id','password')\ntransaction = wallet.transactions.create('password', 'asset_id', 'quantity', 'fee', 'recipient')\n```\n#### Retrieve specific transaction\n```python\nwallet = clientele.wallets.create('asset_id','password')\nid = wallet.transactions.all()[i].id\ntransaction = wallet.transactions.get(id)\n```\n##### List all transactions of a wallet for a user\n```python\nwallet = clientele.wallets.create('asset_id','password')\ntransactions = wallet.transactions.all()\n```\n##### List a specific number of transactions of a wallet for a user\n```python\nwallet = clientele.wallets.create('asset_id','password')\ntransactions = wallet.transactions.list(8)\n```\n\nUsage\n------\n\n### Tenant creation\nThe business \"Blockchain4Everyone\", founded by [John](https://en.wikipedia.org/wiki/The_man_on_the_Clapham_omnibus), would like to build a platform for Ethereum wallets with easy access and wallet management. Therefore, John visits the [Upvest Signup Page](https://login.upvest.co/sign-up), creates an account, and retrieves his API keys from the account management page. He is now able to create the API Keys Authentication object:\n```python\n# API Keys object\nfrom upvest.tenancy import UpvestTenancyAPI\ntenancy = UpvestTenancyAPI(API_KEY, API_SECRET, API_PASSPHRASE, base_url=BASE_URL)\n```\n\n### User creation\nJohn sets up his platform and soon has the first person signing up for his service. Jane Apple, his first user, creates an account entering the username `Jane Apple` and the password `very secret`. Via an API call from his application's backend to the Upvest API, John creates an account for Jane under his tenancy account with Upvest, by implementing the following call using the API keys object from before:\n```python\nuser = tenancy.users.create('Jane Apple','very secret')\nrecovery_kit = user.recovery_kit\n```\nAfter the request, John can access the recovery kit in the user instance and pass it on to Jane. Recovery kits are encrypted using a public key whose private counterpart is provided to tenants at sign-up on the Upvest Account Management portal, and not stored by Upvest. In case Jane loses her password, John is able to reset her password on her behalf, using her password and his decryption key, after conducting a proper KYC process in order to prevent identity fraud.\n\n### Wallet creation\nAfter creating an account Jane wants to create an Ethereum wallet on John's platform. In order to do that on behalf of Jane, John needs to initialize an OAuth object with his client credentials and Jane's username and password. After doing so, John can easily create a wallet by providing the respective `asset_id` for Ethereum to the `wallets.create()` function. The `asset_id` can be retrieved via a call to the Upvest asset endpoint, using the clientele or tenancy authentication:\n```python\nfrom upvest.clientele import UpvestClienteleAPI\nclientele = UpvestClienteleAPI(CLIENT_ID, CLIENT_SECRET, 'Jane Apple','very secret', base_url=BASE_URL)\n\n# List assets and their ids\nasset_id = clientele.assets.all()[i].id\nasset_id = tenancy.assets.all()[i].id\n\n# Create a wallet for Jane on Ethereum with her password and the respective asset_id\nethereum_wallet = clientele.wallets.create(asset_id, 'very secret')\nwallet_address = ethereum_wallet.address\n```\nUsing the address, Jane is now able to receive funds in her Ethereum wallet on John's platform. Thus she sends Ethereumfrom her current Ethereum wallet provider and sends the funds to her newly created wallet on John's platform.\n\n### Transaction sending\nAfter a couple of days, Jane would like to buy a new road bike, paying with Ether. The address of the seller is `0x6720d291A72B8673E774A179434C96D21eb85E71` and Jane needs to transfer 1 ETH. As a quantity it's denoted in [Wei](http://ethdocs.org/en/latest/ether.html#denominations) (Ether's smallest unit), John will need to implement a transformation of this amount. The transaction can be sent via the Upvest API making the following call:\n```python\n# Retrieve Jane's wallet_id\nwallets_of_jane = clientele.wallets.all()\nwallet = wallets_of_jane[0]\nrecipient = '0x6720d291A72B8673E774A179434C96D21eb85E71'\n\n# Send the transaction\ntransaction = wallet.transactions.create('very secret', 'asset_id', 1000000000000000000, 4000000000, recipient)\ntxhash = transaction.txhash\n```\n\nThat's it! Jane has successfully sent a transaction and is able to monitor it via [Etherscan](https://etherscan.io).\n\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/upvestco/upvest-python/", "keywords": "api,upvest,bitcoin,ethereum,oauth2,client", "license": "MIT", "maintainer": "Alexander Reichhardt", "maintainer_email": "alexander@upvest.co", "name": "upvest", "package_url": "https://pypi.org/project/upvest/", "platform": "", "project_url": "https://pypi.org/project/upvest/", "project_urls": { "Homepage": "https://github.com/upvestco/upvest-python/" }, "release_url": "https://pypi.org/project/upvest/0.0.10/", "requires_dist": [ "requests (<3,>=2.21.0)", "environs (==4.1.0)", "pre-commit (==1.10.5) ; extra == 'dev'", "prospector (==1.1.6.2) ; extra == 'dev'", "protobuf (>=3.9.1) ; extra == 'recovery'", "PyNaCl (>=1.3.0) ; extra == 'recovery'", "pytest (==5.2.1) ; extra == 'test'", "py-ecc (==1.7.0) ; extra == 'test'", "pysha3 (==1.0.2) ; extra == 'test'", "bitcoin (==1.1.42) ; extra == 'test'", "web3 (==5.5.0) ; extra == 'test'" ], "requires_python": "", "summary": "Upvest API client library", "version": "0.0.10", "yanked": false, "yanked_reason": null }, "last_serial": 6623848, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "1541eb522ade4796a450afae184bb23c", "sha256": "5e6d2197d6d05e697517906508f709cefc11e9455a902c2fd7fb2db724aecae5" }, "downloads": -1, "filename": "upvest-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1541eb522ade4796a450afae184bb23c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9367, "upload_time": "2019-05-10T15:18:30", "upload_time_iso_8601": "2019-05-10T15:18:30.949653Z", "url": "https://files.pythonhosted.org/packages/22/54/42930247343f22011e0ba3f67fd760ea8f7930f2fd565ed1e05720679d82/upvest-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ce73d3cdc61151cfbf87e885c0d0c6a0", "sha256": "ccf44cf758a9b0e1835ea30bcd24c2a5daf161ea97d5e673eb2e5b41ebc65151" }, "downloads": -1, "filename": "upvest-0.0.1.tar.gz", "has_sig": false, "md5_digest": "ce73d3cdc61151cfbf87e885c0d0c6a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11301, "upload_time": "2019-05-10T15:18:34", "upload_time_iso_8601": "2019-05-10T15:18:34.046902Z", "url": "https://files.pythonhosted.org/packages/7b/b7/4dc880f059aebcde2dd43bb8cec992d37598af83c5d5bf902c3c4cbb8871/upvest-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "ab2ad60c4215ff843f1c6e8bf272904a", "sha256": "5413b728bdca69e24c6a6143ad32905b7d65c0afad93e31cec67bdcf8b68eb36" }, "downloads": -1, "filename": "upvest-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "ab2ad60c4215ff843f1c6e8bf272904a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16835, "upload_time": "2020-02-13T14:46:14", "upload_time_iso_8601": "2020-02-13T14:46:14.629263Z", "url": "https://files.pythonhosted.org/packages/6e/21/505c567708b0b836d11e3479cc63e165b126ce15a32873fa79cecb2b8f17/upvest-0.0.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8894fbc7d9ce6b02a80bfcd77ddbb4a0", "sha256": "17e7cc513cc033db01319a6279428278dd659128753b406fa77a81f0c862dfa9" }, "downloads": -1, "filename": "upvest-0.0.10.tar.gz", "has_sig": false, "md5_digest": "8894fbc7d9ce6b02a80bfcd77ddbb4a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18343, "upload_time": "2020-02-13T14:46:16", "upload_time_iso_8601": "2020-02-13T14:46:16.370293Z", "url": "https://files.pythonhosted.org/packages/cf/ca/777a88195627bbc89d26dbf5fefd133172d6441c1b6c276735f475cdb8c9/upvest-0.0.10.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "8f3c5ce72648018f296a9c5666d99ac8", "sha256": "e2d6969d787c19cf71a417ba605d60d97c2a8391473328d2a128ca3bbb0d95de" }, "downloads": -1, "filename": "upvest-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8f3c5ce72648018f296a9c5666d99ac8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10791, "upload_time": "2019-05-27T13:30:09", "upload_time_iso_8601": "2019-05-27T13:30:09.530135Z", "url": "https://files.pythonhosted.org/packages/83/37/edad22deca74aa0691165198b36d8830721155dabcc2b2a2a8b080c0d8a9/upvest-0.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d2e79f9b5f92fafc4e45449ced80d87", "sha256": "e93e47353b3c2ddf3016803cf7f1d5ed49c5e65391d1cab68b98e747a469bc78" }, "downloads": -1, "filename": "upvest-0.0.2.tar.gz", "has_sig": false, "md5_digest": "7d2e79f9b5f92fafc4e45449ced80d87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11937, "upload_time": "2019-05-27T13:30:11", "upload_time_iso_8601": "2019-05-27T13:30:11.316428Z", "url": "https://files.pythonhosted.org/packages/5a/9c/9c1fefc03bbe03f2f3c7c50b9b4269f166db70d20720f5a28cd7aa8d2134/upvest-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "8ffdf396122afcad4acfd710af3b4fea", "sha256": "830233b4a97bff3c2b07f913dece402d1c0198533a71326469c3c87406aa0044" }, "downloads": -1, "filename": "upvest-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "8ffdf396122afcad4acfd710af3b4fea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10797, "upload_time": "2019-06-04T10:36:25", "upload_time_iso_8601": "2019-06-04T10:36:25.275586Z", "url": "https://files.pythonhosted.org/packages/55/34/4ec24913f840054fc560cebf181374a7ba020637c9f24af2555ddf1d2268/upvest-0.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "75e6518f8d8abe367c50180f98a2b214", "sha256": "4e7a4866b57796ce2dfbf7cc99dcb97ea71be30cf4accd504bba131a140d1a3f" }, "downloads": -1, "filename": "upvest-0.0.3.tar.gz", "has_sig": false, "md5_digest": "75e6518f8d8abe367c50180f98a2b214", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11968, "upload_time": "2019-06-04T10:36:27", "upload_time_iso_8601": "2019-06-04T10:36:27.043799Z", "url": "https://files.pythonhosted.org/packages/73/01/f145c65b1b63cb6ab2746890faaeda68875309ed4e945ee45a0f7f43642f/upvest-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "260647bfc34b87294338d76cc3e0dc18", "sha256": "e6fd4c4f03e90e295a8bc17bd4d41b5a8196cfedff518206247ef8e24340588f" }, "downloads": -1, "filename": "upvest-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "260647bfc34b87294338d76cc3e0dc18", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10806, "upload_time": "2019-06-13T13:32:07", "upload_time_iso_8601": "2019-06-13T13:32:07.475823Z", "url": "https://files.pythonhosted.org/packages/59/ad/888813e3dda58cde4b568c0a75fd2ce130d4b12aca06a1839ff8a1a1e48e/upvest-0.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4d4df77e69af0f6281bc26937dd8e5e9", "sha256": "0a27a493f1edfc24c056ea3faffd6aeb82764e7228240c10b8ee7610f4786219" }, "downloads": -1, "filename": "upvest-0.0.4.tar.gz", "has_sig": false, "md5_digest": "4d4df77e69af0f6281bc26937dd8e5e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9040, "upload_time": "2019-06-13T13:32:09", "upload_time_iso_8601": "2019-06-13T13:32:09.682781Z", "url": "https://files.pythonhosted.org/packages/9f/30/7bed8fc8a6a041f78490040032cad60d3a220a7c07166937cd3719e42473/upvest-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "feb421d88efd421cf9500cb3a4e656a9", "sha256": "e4e43a4edc5807c6b2aa625931675536232ca53935b0ecca0d68949fa3e30ac9" }, "downloads": -1, "filename": "upvest-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "feb421d88efd421cf9500cb3a4e656a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10797, "upload_time": "2019-07-12T08:33:31", "upload_time_iso_8601": "2019-07-12T08:33:31.083518Z", "url": "https://files.pythonhosted.org/packages/8d/29/63c30dade0fdc9fc2af18b1cf8f98953223b24d7f416219b368491ddba2b/upvest-0.0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3c7d0064a7dbbd8011b31db8ec494f5d", "sha256": "6f62d4c56c97625ea9acb4c57a429f211e191aea561ba61804726ffb8feadab2" }, "downloads": -1, "filename": "upvest-0.0.5.tar.gz", "has_sig": false, "md5_digest": "3c7d0064a7dbbd8011b31db8ec494f5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9035, "upload_time": "2019-07-12T08:33:32", "upload_time_iso_8601": "2019-07-12T08:33:32.852945Z", "url": "https://files.pythonhosted.org/packages/58/6d/67154157f34c6f4d863df1e432f87b7285f29b3f33ffedfa9e84fbcc0252/upvest-0.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.6.1": [ { "comment_text": "", "digests": { "md5": "90cf2e32af0dcfd2a81b25de0be882c3", "sha256": "e839f5a364eda1c40115c7a403505663fafe9f93243c7a1430609535a13ac19a" }, "downloads": -1, "filename": "upvest-0.0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "90cf2e32af0dcfd2a81b25de0be882c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11059, "upload_time": "2019-07-30T14:48:34", "upload_time_iso_8601": "2019-07-30T14:48:34.226864Z", "url": "https://files.pythonhosted.org/packages/55/76/48caef6b6ed6a491186b04611166206d07adc32ddbff2878129db659bfda/upvest-0.0.6.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "1975f9673f2290508102b98775816a86", "sha256": "cc75c6152bc63949d4c9b7bb8ef68a485455c5eb1e0d0aaf2c5dec8b2f90b956" }, "downloads": -1, "filename": "upvest-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "1975f9673f2290508102b98775816a86", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11505, "upload_time": "2019-09-03T14:18:10", "upload_time_iso_8601": "2019-09-03T14:18:10.944135Z", "url": "https://files.pythonhosted.org/packages/fc/65/c5802010a75cd761849779696d21fddb1e2bb1c74dd1549c9c64323ff19d/upvest-0.0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "635e8224a771ca1e9eaed5970fac5a6c", "sha256": "742bf41d56ed7b6bc22491b3f0194947c7c504b2acdf49d95c3e22c966c79fa2" }, "downloads": -1, "filename": "upvest-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "635e8224a771ca1e9eaed5970fac5a6c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14936, "upload_time": "2019-09-16T08:21:13", "upload_time_iso_8601": "2019-09-16T08:21:13.713917Z", "url": "https://files.pythonhosted.org/packages/87/0a/70825dcb476e95de12a392d343031b4e854f51fc190df979f79aeda92092/upvest-0.0.8-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "9c33414f46bb4a88571f57fe20191278", "sha256": "074c144413e68f24f66c59e6a50ff17ab4c3f3621420ee68453d19de4d2e1af6" }, "downloads": -1, "filename": "upvest-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "9c33414f46bb4a88571f57fe20191278", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15341, "upload_time": "2019-10-25T10:45:47", "upload_time_iso_8601": "2019-10-25T10:45:47.486491Z", "url": "https://files.pythonhosted.org/packages/4a/47/bcc487db0e7a4b1db437ab49bbf8ee6a90b39ac78d8041d4d5417d55b829/upvest-0.0.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fb530730e41600e7638a4498c85e96bf", "sha256": "a10d4861072405d3d7dbace8fd6f9ebde0ff638e065c8e591aa608f36e6e77e6" }, "downloads": -1, "filename": "upvest-0.0.9.tar.gz", "has_sig": false, "md5_digest": "fb530730e41600e7638a4498c85e96bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17081, "upload_time": "2019-10-25T10:45:49", "upload_time_iso_8601": "2019-10-25T10:45:49.389142Z", "url": "https://files.pythonhosted.org/packages/67/32/374e641fa0cab65814a2b902209fea57011d8302419206d8fbda54a791a8/upvest-0.0.9.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ab2ad60c4215ff843f1c6e8bf272904a", "sha256": "5413b728bdca69e24c6a6143ad32905b7d65c0afad93e31cec67bdcf8b68eb36" }, "downloads": -1, "filename": "upvest-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "ab2ad60c4215ff843f1c6e8bf272904a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16835, "upload_time": "2020-02-13T14:46:14", "upload_time_iso_8601": "2020-02-13T14:46:14.629263Z", "url": "https://files.pythonhosted.org/packages/6e/21/505c567708b0b836d11e3479cc63e165b126ce15a32873fa79cecb2b8f17/upvest-0.0.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8894fbc7d9ce6b02a80bfcd77ddbb4a0", "sha256": "17e7cc513cc033db01319a6279428278dd659128753b406fa77a81f0c862dfa9" }, "downloads": -1, "filename": "upvest-0.0.10.tar.gz", "has_sig": false, "md5_digest": "8894fbc7d9ce6b02a80bfcd77ddbb4a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18343, "upload_time": "2020-02-13T14:46:16", "upload_time_iso_8601": "2020-02-13T14:46:16.370293Z", "url": "https://files.pythonhosted.org/packages/cf/ca/777a88195627bbc89d26dbf5fefd133172d6441c1b6c276735f475cdb8c9/upvest-0.0.10.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }