{ "info": { "author": "Lenddo", "author_email": "techbilling@lenddo.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries" ], "description": "# Python Lenddo API Client\n\n## Table of Contents\n- [Introduction](#introduction)\n- [Installation](#installation)\n- [Manual Installation](#manual-installation)\n- [General Usage](#general-usage)\n - [Example: Requesting one of your application's Lenddo Score](#example-requesting-one-of-your-applications-lenddo-score)\n - [Exceptions and Error Handling](#exceptions-and-error-handling)\n- [Submitting Applications to Lenddo: Using the API Client as a White Label Solution](#submitting-applications-to-lenddo-using-the-api-client-as-a-white-label-solution)\n - [The PartnerToken API call](#the-partnertoken-api-call)\n - [The CommitPartnerJob API call](#the-commitpartnerjob-api-call)\n- [Requesting Results from Lenddo](#requesting-results-from-lenddo)\n - [Scores](#scores)\n - [Verification Results](#verification-results)\n\n## Introduction\nThe `lenddo_api_client` python module provides the class `LenddoAPIClient`, \na generic interface to all the Lenddo HTTP APIs. The client makes authenticated HTTP requests\nusing the HMAC-SHA1 signing method.\n\n## Installation\nTo install our client use `pip`:\n```\n$ pip install lenddo\n```\n\nVersion `1.1.0` supports both python `2.7.x` and python `3.x`.\nIf any bug is encountered kindly report the issue [here](https://github.com/Lenddo/python-lenddo/issues/new).\n\n## Manual Installation\nThe python Lenddo API client library has no third-party dependencies. The only installation\nstep is to copy and drop the directory `lenddo_api_client/` into a directory in your `PYTHONPATH`. The client has\nbeen tested with python versions `2.7.x` and `3.6.x`.\n\n## General Usage\nIn order to make API calls, first instantiate a `LenddoAPIClient` initialized\nwith your API id, your API secret, the base URL of the API resource you intend to use. You\nmay then make HTTP requests using the client's `get`, `post`, `put`, `delete` and `options`\nmethods, which are named after the respective HTTP methods. Arguments to\nthese methods take the form `(resource-type, resource-id, parameter-dictionary)`:\n- `resource-type` describes the resource being requested (for example `ApplicationScore`,\n`PartnerToken`)\n- `resource-id` identifies the specific instance of the requested resource\n- `parameter-dictionary` contains additional parameters supported by the call.\nIn the case of a GET request, these are converted to the request query string. In a POST\nor PUT request, they are JSON-encoded and submitted as the request body.\n\n> Optionally, you can use [proxies](#request-a-lenddo-score-behind-a-http-proxy) when connecting to external services.\n\n### Example: Requesting one of your application's Lenddo Score\nIn this example we make a GET request to the `ApplicationScore` API to obtain the score for a\napplication with id `example-application`. `ApplicationScore` is hosted at `scoreservice.lenddo.com`.\n\n#### Request a Lenddo score with the LenddoAPIClient\n```python\nfrom lenddo_api_client import LenddoAPIClient\n\nclient = LenddoAPIClient('your-api-client-id', 'your-api-client-secret',\n\t'https://scoreservice.lenddo.com')\nresponse = client.get('ApplicationScore', 'example-application')\n```\n\nThis results in a signed HTTP GET request to `https://scoreservice.lenddo.com/ApplicationScore/example-application`.\n\n#### Request a Lenddo score behind a HTTP proxy\nSay your HTTP proxy is running at the http://192.168.1.100 address in your internal network: \n```python\nfrom lenddo_api_client import LenddoAPIClient\n\nHTTP_PROXIES = {\n 'http': 'http://192.168.1.100',\n 'https': 'http://192.168.1.100',\n}\n\nclient = LenddoAPIClient(\n 'your-api-client-id', 'your-api-client-secret', \n 'https://scoreservice.lenddo.com', proxies=HTTP_PROXIES\n )\nresponse = client.get('ApplicationScore', 'example-application') \n```\nThe `HTTP_PROXIES` dictionary is based on python's ['proxies' dict](https://docs.python.org/2/library/urllib2.html#proxyhandler-objects).\n\n### Exceptions and Error Handling\nExceptions raised by the client are standard exceptions documented in standard library docs.\nThe sdk client provides a wrapper module for these exceptions in `lenddo_api_client.errors`.\n\n| exception | description | `2.x` | `3.x` |\n| --------- | ----------- | ----- | ----- |\n| `HTTPError` | Raised when an API call returns a non-success status. | [link][py2-http-error] | [link][py3-http-error] |\n| `URLError` | Raised on network error. | [link][py2-url-error] | [link][py3-url-error] |\n\nThe following is the same request as in the previous example, this time with error handling included:\n\n```python\nimport json\n\nfrom lenddo_api_client import LenddoAPIClient\nfrom lenddo_api_client.errors import HTTPError, URLError\n\n\nclient = LenddoAPIClient(\n 'your-api-client-id', \n 'your-api-client-secret',\n 'https://scoreservice.lenddo.com'\n)\ntry:\n response = client.get('ApplicationScore', 'example-application')\nexcept HTTPError as e:\n print('API call failed with status %d' % e.code)\n\n # Error responses from the Lenddo APIs still return JSON bodies describing error details,\n # only now we have to decode the JSON ourselves.\n print(json.loads(e.read()))\nexcept URLError as e:\n print('API call failed with reason %s' % e.reason)\n```\n\nFor the sake of brevity, we omit error handling in subsequent examples. In production code, calls should\nbe made taking into account at least the possibility of `HTTPError`.\n\n## Submitting Applications to Lenddo: Using the API Client as a White Label Solution\n\nYou may submit data directly to Lenddo while keeping your own branding, thus utilizing Lenddo services\nwithout having users leave your ecosystem. For each user application, this is accomplished in two\nphases: first by making POST calls to the `PartnerToken` resource, which saves OAuth tokens associated\nto your user's application, and finally by committing the job using the `CommitPartnerJob` resource.\nBoth resources are hosted at `networkservice.lenddo.com`.\n\nApplications are identified by a `application_id` which must be supplied as parameter to both\ncalls. In addition, the `partner_script_id` parameter specifies how Lenddo informs\nyou of the results. You may only commit one job per `application_id`/`partner_script_id` pair.\n\n### The PartnerToken API call\nDuring the first phase of the job flow, make calls to `PartnerToken` to send social\nnetwork OAuth tokens to Lenddo. Each call to `PartnerToken` returns a `profile_id`\nwhich you must save in order to send it along with all other `profile_ids` associated\nto this application when you finally commit the job. To add multiple tokens for the same\napplication, make multiple `PartnerToken` calls, each time saving the returned\n`profile_id`.\n\n`PartnerToken` takes the following arguments, all required unless stated otherwise:\n\n- **application_id** - a string that identifies the application to associate with an OAuth token\nIt must match the `application_id` you use in the `CommitPartnerJob` step.\n- **provider** - the token provider. Valid values are:\n `Facebook`, ` LinkedIn`, ` Yahoo`, ` WindowsLive`, or ` Google`\n- **token data** - a dictionary of OAuth token data with keys `key` and `extra_data`.\n > **Note**: All tokens must be **OAuth 2.0**.\n - **key** - the access token proper, a string\n - **extra_data** - optional dictionary of additional OAuth fields returned by the token provider.\n\n#### Note\nIn order for Lenddo to generate the profile_id, it has to use the supplied OAuth token,\nwhich may fail (for example, when the user has denied permission or the token has expired). When\nthis happens, `PartnerToken` will return with HTTP 400 and the body of the response will contain both the\nerror code and response body that Lenddo received when trying to use the token. The provider's HTTP response\nis under `provider_status_code` and the provider's response body is under `provider_response`. The format of\nthe `provider_response` varies among OAuth providers; see the OAuth provider's documentation for details.\n\n\n#### Example\n```python\nimport json\n\nfrom lenddo_api_client import LenddoAPIClient\nfrom lenddo_api_client.errors import HTTPError\n\n\nclient = LenddoAPIClient(\n 'your-api-client-id', \n 'your-api-client-secret',\n 'https://networkservice.lenddo.com'\n)\ntry:\n response = client.post('PartnerToken', None, {\n 'application_id' : 'example-application',\n 'provider' : 'Facebook',\n 'token_data' : { 'key' : 'example-access-token' }})\nexcept HTTPError as e:\n print('API call failed with HTTP status %d' % e.code)\n print(json.loads(e.read()))\n\nprofile_id = response['profile_id']\n# ... and store this profile_id - application_id association\n```\n\n#### Errors\nTo inspect error details, catch `HTTPError`, call the exception object's 'read()' method, and decode the\nJSON response. In the table below, 'Error Name' refers to the string found in the response body's 'name' field.\n\n|Error Name |HTTP Status Code |Description |\n|---------- |---------------- |----------- |\n|BAD_REQUEST |400 |Request was malformed, or missing required data. |\n|INVALID_TOKEN |400 |Token data was missing required fields or fields had invalid values.|\n|TOKEN_FAILURE |400 |Failure upon attempt to use the token. `provider_status_code` contains the provider's HTTP status code. `provider_response` contains the provider's error response body. |\n|INTERNAL_ERROR |500 |An internal error occurred. If this persists please contact a Lenddo Representative.|\n\n### The CommitPartnerJob API Call\nOnce there are no more tokens to associate to a given application, use the\n`CommitPartnerJob` call to have Lenddo compute a score for your user. To\nobtain the results of the job, see [Requesting Results from Lenddo] (#requesting-results-from-lenddo).\n\n`CommitPartnerJob` takes the following required arguments:\n\n- **partner script id** - Please reference the [developer section](https://partners.lenddo.com/developer_settings) \n of the partner dashboard. This will define how you're notified of scoring results.\n- **application id** - an application id that, coupled with the partner script id, identifies this job. For any given\n application, this is the same application_id used in the `PartnerToken` call.\n You can use this value to retrieve score results.\n- **profile ids** - a list of `profile_ids` gathered from the results of the `PartnerToken` call.\n\nIn addition to these arguments, CommitPartnerJob accepts the following:\n- **verification_data** - A dictionary representing a verification form\n- **partner_data** - A dictionary pf form data.\n\n#### Example\n```python\n# In the actual workflow, profile_ids would be the list of the ids obtained from PartnerToken\n# responses associated to this application.\nprofile_ids = ['123FB']\n\n# Assume the same client instance as used in the PartnerToken section.\n# This client connects to networkservice.lenddo.com.\nclient.post('CommitPartnerJob', None, {\n 'partner_script_id' : 'your-partner-script-id',\n 'application_id' : 'example-application',\n 'profile_ids' : profile_ids})\n```\n\n#### Errors\nTo inspect error details, catch `HTTPError`, call the exception object's `read()` method, and decode the\nJSON response. In the table below, 'Error Name' refers to the string found in the response body's 'name' field.\n\n|Error Name |HTTP Status Code |Description |\n|---------- |---------------- |----------- |\n|BAD_REQUEST |400 |Request was malformed, or missing required data. |\n|INTERNAL_ERROR |500 |An internal error occurred. If this persists please contact a Lenddo Representative. |\n|PARTNER_CLIENT_ALREADY_PROCESSED |400 |The specified application_id has already been used. |\n\n\n## Requesting Results from Lenddo\n\nYou may obtain score and verification results from Lenddo by making calls to the\n`ApplicationVerification` and `ApplicationScore` APIs hosted at `scoreservice.lenddo.com`.\n\n### Scores\nTo obtain score results, make a GET request to `ApplicationScore`:\n\n```python\nfrom lenddo_api_client import LenddoAPIClient\nclient = LenddoAPIClient('your-api-client-id', 'your-api-client-secret',\n\t'https://scoreservice.lenddo.com')\nresponse = client.get('ApplicationScore', 'example-application', {'partner_script_id' : 'your-partner-script-id'})\nscore = response['score']\nflags = response['flags']\n```\n\n### Verification Results\nTo obtain verification results, make a GET request to `ApplicationVerification`:\n\n```python\nfrom lenddo_api_client import LenddoAPIClient\nclient = LenddoAPIClient('your-api-client-id', 'your-api-client-secret',\n\t'https://scoreservice.lenddo.com')\nresponse = client.get('ApplicationVerification', 'example-application', {'partner_script_id' : 'your-partner-script-id'})\nresults = response['verifications']\nflags = response['flags']\nname_results = results['name']\n```\n### Application Decision Results\nTo obtain application decision results, make a GET request to `ApplicationVerification`:\n\n```python\nfrom lenddo_api_client import LenddoAPIClient\nclient = LenddoAPIClient('your-api-client-id', 'your-api-client-secret',\n\t'https://scoreservice.lenddo.com')\nresponse = client.get('ApplicationDecision', 'example-application', {'partner_script_id' : 'your-partner-script-id'})\nresults = response['decision']\nflags = response['flags']\n```\n\n### FICO Score Results\nTo obtain FICO score results, make a GET request to `FICOScore`:\n\n```python\nfrom lenddo_api_client import LenddoAPIClient\nclient = LenddoAPIClient('your-api-client-id', 'your-api-client-secret',\n\t'https://scoreservice.lenddo.com')\nresponse = client.get('FICOScore', 'example-application', {'partner_script_id' : 'your-partner-script-id'})\nresults = response['score']\npd = response['pd']\n```\n\n### CommitPartnerJob partner_data format for FICO scoring\nThe partner_data format for a FICO score application has has three required fields:\n- **application** dictionary, required\n- **bureauData** dictionar\n- **applicant** dictionary\n\n#### applicationData.application\nThe application object has the following fields.\n\n| Key | Type | Required | Description |\n|--------------|------|---|--------------------------------------------------------------------------------------------------|\n| applicationId | string | Yes | |\n| date | string in ISO 8601 format | Yes | |\n| productType | string | Yes | one of \"Mortgage\", \"Personal Loans\", \"Overdraft\", \"Cards\", \"Auto Loans\", \"Payday Loan\", \"SME\", or \"Others\" |\n| channel | string | Yes | one of \"Partner/Store\", \"Internet\", \"Branch\", \"Small business hub\", \"Pre-approved\", \"Top-up\", \"Mobile App\" or \"ATM\" |\n| product | object | Yes | see description below |\n\n\n#### applicationData.application.product\nThe product object has the following fields.\n\n| Key | Type | Required | Description |\n|--------------|------|---|--------------------------------------------------------------------------------------------------|\n| loanAmount | integer | Yes | |\n| paymentMethod | string | Yes | one of \"Auto debit\" or \"Payment through transaction account\" |\n| indicatorForPresenceOfGuarantor | boolean | Yes | |\n| loanPurpose | string | Yes | one of \"Loan for personal expenses\", \"Working capital loan\", \"Holiday\", \"Loan for making interest payment\", \"Education\", \"Renovation\", \"Refinancing\", or \"Others\" |\n\n#### applicationData.bureauData\nThe \"bureauData\" object has two fields, \"enquiries\" (array of objects) and \"tradelines\" (array of objects).\n\n#### applicationData.bureauData.enquiries\nEach enquiry object in the enquiries array has the following fields.\n\n| Key | Type | Required | Description |\n|--------------|------|---|--------------------------------------------------------------------------------------------------|\n| amount | integer | Yes | the amount of the enquiry |\n| applicationId | string | Yes | |\n| enquiryDate | string in DDMMYYYY format | Yes | |\n| entityType | string | Yes | |\n| memberCd | string | Yes | |\n| memberRef | string | Yes | |\n| processedDate | string in DDMMYYYY format | Yes | the date when the enquiry was made |\n| productCd | string | Yes | the product applied for |\n| purpose | integer | Yes | purpose of the enquiry |\n| controlNum | integer | No | a system-generated enquiry control number |\n\n#### applicationData.bureauData.tradelines\nEach tradeline object in the tradelines array has the following fields.\n\n| Key | Type | Required | Description |\n|--------------|------|---|--------------------------------------------------------------------------------------------------|\n| accountNum | string | Yes |\n| accountStatus | integer | Yes |\n| accountType | integer | Yes | |\n| accountTypeCd | integer | Yes |\n| amtOverdue | number | No | the amount past due as of the date in the Date Reported field |\n| applicationId | string | Yes | |\n| cashLimit | number | No | |\n| closeDate | string in DDMMYYYY format | Yes | the date the account was closed |\n| collateralType | integer | Yes | \n| collateralValue | number | No | |\n| controlNum | integer | No | a system-generated enquiry control number |\n| creditLimit | number | No | for Credit Card (Account Type 10) and Fleet Card (Account Type 16, this field contains the highest amount of credit used in the history of the account |\n| currBalance | number | No | the entire amount of credit or loan outstanding, including the current and overdue portion, if any, together with interest last applied, as of the date in the Date Reported field |\n| delqHisMMYY | string | Yes | cycle delinquency (up to 48 months) |\n| installmentAmt | number | No | |\n| interestRate | number | No | |\n| lastPayment | number | No | |\n| lastPaymentDate | string in DDMMYYYY format | Yes | |\n| memberCd | string | Yes | |\n| memberRef | string | Yes | |\n| openDate | string in DDMMYYYY format | Yes | date of first disbursement of the account |\n| ownershipInd | integer | Yes | 1 = Individual, 2 = Authorised User (refers to supplementary credit card holder), 3 = Guarantor, 4 = Joint |\n| payHistEndDate | string in DDMMYYYY | Yes | the date of the end of the payment history |\n| payHistStartDate | string in DDMMYYYY format | Yes | date of the beginning of the payment history |\n| processedDate | string in DDMMYYYY format | Yes | |\n| productCd | string | Yes | |\n| repaymentTenure | integer | Yes | term of loan | \n| reportedDate | integer | No | Yes |\n| sanctionAmt | number | No | for all other accounts, this field contains the amount of loan sanctioned |\n| settlementAmt | number | No | settlement amount |\n| suitFiledCurrStatus | string | Yes | suit filed status of the current month |\n| suitFiledStatusMMYY | string | Yes | suit filed status history (up to 48 months)) |\n| termFrequency | string | Yes | payment frequency |\n| writeoffPrincipalAmt | number | No | |\n| writeoffSettledStatus | string | Yes | |\n| writeoffTotalAmt | number | No | write-off amount - total |\n\n#### applicant\nThe applicant object has the following fields.\n\n| Key | Type | Required | Description |\n|--------------|------|---|--------------------------------------------------------------------------------------------------|\n| dob | string in ISO 8601 format | Yes | |\n| mobileTelephoneProvided | boolean | No | |\n| gender | string | No | one of \"MALE\" or \"FEMALE\" |\n| maritalStatus | string | No | one of \"Married\", \"Living together\", \"Single\", \"Widowed\", \"Divorced/Separated\", or \"Other\" \n| residenceRegion | string | No | |\n| emailProvided | boolean | No | |\n| employmentStatus | string | No | one of \"Salaried\", \"Own Business/ Self-Employed\", \"Retired/Pensioner\", \"Part-time Employed / Freelance / Contractual Employee / Laborer\", \"Housewife/Other\", or \"Student\" |\n| yearsInCurrentJob | integer | No | |\n| homeTelephoneProvided | boolean | No | |\n| educationLevel | string | No | one of \"Undergraduate\", \"Graduate\", \"Post Graduate\", or \"Diploma and Specialized Courses\" |\n| yearsOfService | integer | No | |\n| residentialStatus | string | No | one of \"Self Owned\", \"Company Provided\", \"With Parents\", \"Rented\", \"Paying Guest\", \"Leased\", or \"Other\" \n| workTelephoneProvided | boolean | No | |\n| dependents | integer | No | |\n| numOfMonthsInCurrentAddress | integer | No | |\n| monthlyIncome | integer | No | |\n| existingCustomer | object | No | object with fields \"timeWithTheBank\" (integer) and \"noOfAccountsWithTheBank\" (integer)\n\n### Errors\nTo inspect error details, catch `HTTPError`, call the exception object's `read()` method, and decode the\nJSON response. In the table below, 'Error Name' refers to the string found in the response body's 'name' field.\n\n|Error Name |HTTP Status Code |Description |\n|---------- |---------------- |----------- |\n|BAD_REQUEST |400 |Request was malformed, or missing required data. |\n|INTERNAL_ERROR |500 |An internal error occurred. If this persists please contact a Lenddo Representative. |\n|NOT_FOUND |404 |The requested application_id was not found. |\n\n[py2-http-error]: https://docs.python.org/2/library/urllib2.html#urllib2.HTTPError\n[py2-url-error]: https://docs.python.org/2/library/urllib2.html#urllib2.URLError\n[py3-http-error]: https://docs.python.org/3/library/urllib.error.html?highlight=httperror#urllib.error.HTTPError\n[py3-url-error]: https://docs.python.org/3/library/urllib.error.html?highlight=httperror#urllib.error.URLError\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/Lenddo/python-lenddo", "keywords": "lenddo api client", "license": "", "maintainer": "", "maintainer_email": "", "name": "lenddo", "package_url": "https://pypi.org/project/lenddo/", "platform": "", "project_url": "https://pypi.org/project/lenddo/", "project_urls": { "Homepage": "https://github.com/Lenddo/python-lenddo" }, "release_url": "https://pypi.org/project/lenddo/1.2.0/", "requires_dist": null, "requires_python": "", "summary": "Python library for integrating Lenddo Services. https://www.lenddo.com", "version": "1.2.0" }, "last_serial": 4967721, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "0b8ceb682173fe7ea8bc8fa539fb76b6", "sha256": "664581b201f73fa7ea011c86489618c64a8376e619c690b525f81477e3b459b8" }, "downloads": -1, "filename": "lenddo-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0b8ceb682173fe7ea8bc8fa539fb76b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10714, "upload_time": "2018-11-08T06:55:00", "url": "https://files.pythonhosted.org/packages/e7/39/a44b432c8f3096135a02f866cd4862d73466f785a732ad9d1f394e9242fa/lenddo-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6051b493a740d7776c14ff563641107e", "sha256": "06ffda6ff1d70946910dd5f53cde4882d85d191dcf4f8716f2d44c7f3880eff2" }, "downloads": -1, "filename": "lenddo-1.0.0.tar.gz", "has_sig": false, "md5_digest": "6051b493a740d7776c14ff563641107e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15570, "upload_time": "2018-11-08T06:55:01", "url": "https://files.pythonhosted.org/packages/1f/b3/c8b3c44bc4355f77ceed978538de29fe392416465fb8afa6788cbee8fee2/lenddo-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "72be7ae019d2c6fd8fb4a2e4ff68f694", "sha256": "2a9d643c472ee8b08cc383113ab2634636da69de2c938f3269adf07bc9777e0d" }, "downloads": -1, "filename": "lenddo-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "72be7ae019d2c6fd8fb4a2e4ff68f694", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11597, "upload_time": "2018-11-08T07:08:07", "url": "https://files.pythonhosted.org/packages/bd/2a/d1e94e2aa0f817cd80ff961771f650acf619f737b09aa9b5b2c943c0f450/lenddo-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "729d1fd58ea77114b764af3f82b230c5", "sha256": "61caf45ece31bc7952468bef0af6869e648a8f5a732a0ac50415627f4ee4e9c8" }, "downloads": -1, "filename": "lenddo-1.1.0.tar.gz", "has_sig": false, "md5_digest": "729d1fd58ea77114b764af3f82b230c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16475, "upload_time": "2018-11-08T07:08:08", "url": "https://files.pythonhosted.org/packages/43/2e/e131e35c01b0ad875b05d1ab391d982030793dd23453b0233e926a2c967a/lenddo-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "fc236c66c4cd47037f665e7a2689674b", "sha256": "a39a2b39f60eee8ca65c25042ce8984ae10e4105df177e956d2fabe7fa0fee13" }, "downloads": -1, "filename": "lenddo-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fc236c66c4cd47037f665e7a2689674b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11877, "upload_time": "2019-03-21T11:23:37", "url": "https://files.pythonhosted.org/packages/1c/ca/990eb22c37965050967d96c519710626610142e58063eeb22ee8b37d37ac/lenddo-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce72fefd5aedc49e5cf91455ecd3e110", "sha256": "fc8bc63505abae1c4cf5968ba978652a6bb2926f5d6155e2326f8d10ab88866a" }, "downloads": -1, "filename": "lenddo-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ce72fefd5aedc49e5cf91455ecd3e110", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17057, "upload_time": "2019-03-21T11:23:39", "url": "https://files.pythonhosted.org/packages/72/ca/80f651bb6c9470c019ce1b9fe8af6edc49dd9a5d28a87140e15ed3444dc4/lenddo-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fc236c66c4cd47037f665e7a2689674b", "sha256": "a39a2b39f60eee8ca65c25042ce8984ae10e4105df177e956d2fabe7fa0fee13" }, "downloads": -1, "filename": "lenddo-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fc236c66c4cd47037f665e7a2689674b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11877, "upload_time": "2019-03-21T11:23:37", "url": "https://files.pythonhosted.org/packages/1c/ca/990eb22c37965050967d96c519710626610142e58063eeb22ee8b37d37ac/lenddo-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce72fefd5aedc49e5cf91455ecd3e110", "sha256": "fc8bc63505abae1c4cf5968ba978652a6bb2926f5d6155e2326f8d10ab88866a" }, "downloads": -1, "filename": "lenddo-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ce72fefd5aedc49e5cf91455ecd3e110", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17057, "upload_time": "2019-03-21T11:23:39", "url": "https://files.pythonhosted.org/packages/72/ca/80f651bb6c9470c019ce1b9fe8af6edc49dd9a5d28a87140e15ed3444dc4/lenddo-1.2.0.tar.gz" } ] }