{ "info": { "author": "Walter Doekes, OSSO B.V.", "author_email": "wjdoekes+exactonline@osso.nl", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Office/Business :: Financial", "Topic :: Office/Business :: Financial :: Accounting", "Topic :: Software Development :: Libraries" ], "description": "Exact Online REST API Library in Python\n=======================================\n\n.. image:: https://bettercodehub.com/edge/badge/ossobv/exactonline\n.. image:: http://api.travis-ci.org/ossobv/exactonline.svg\n\nExact Online provides accounting software in a Software-as-a-Service\ndelivery model. It implements an API through a REST interface. This\nlibrary aims to ease its use.\n\n\n\nQuick jump\n----------\n\n* `Usage by example`_\n* `Using element adapters`_\n* `Setting up the link`_\n* `Implemented resources`_\n* `Other benefits`_\n* `License`_\n* `TODO`_\n* `Further reading`_\n\n\n\nUsage by example\n----------------\n\nSet up the basics:\n\n.. code-block:: python\n\n from exactonline.api import ExactApi\n from exactonline.exceptions import ObjectDoesNotExist\n from exactonline.resource import GET, POST, PUT, DELETE\n from exactonline.storage.ini import IniStorage\n\n # Create a function to get the api with your own storage backend.\n def get_api():\n storage = IniStorage('/path/to/config.ini')\n return ExactApi(storage=storage)\n api = get_api()\n\nGet an invoice:\n\n.. code-block:: python\n\n # Get an invoice by your own invoice number (YourRef).\n # Returns a dictionary, or raises ObjectDoesNotExist.\n invoice = api.invoices.get(invoice_number='F0005555')\n\nIt looks somewhat like this:\n\n.. code-block:: python\n\n invoice == {\n u'AmountDC': 50.8,\n u'AmountFC': 50.8,\n # ...\n u'SalesEntryLines': [\n {u'AmountDC': 41.98,\n u'AmountFC': 41.98,\n # ...\n u'Description': u'Omzet backups',\n u'VATBaseAmountDC': 41.98,\n u'VATBaseAmountFC': 41.98},\n ],\n # ...\n u'VATAmountDC': 8.82,\n u'VATAmountFC': 8.82,\n u'YourRef': u'F0005555',\n u'__metadata': {u'type': u'Exact.Web.Api.Models.SalesEntry',\n u'uri': u\"https://start.exactonline.nl/api/v1/...\"},\n }\n\nGet relations:\n\n.. code-block:: python\n\n relations_limit_2 = api.relations.filter(top=2)\n # that was cheaper than: api.relations.all()[0:2]\n\n relations_limit_2 == [\n {u'Code': u' 1068',\n u'ID': u'11111111-2222-3333-4444-555555555555',\n u'Name': u'ACME Corporation',\n u'__metadata': {u'type': u'Exact.Web.Api.Models.Account',\n u'uri': u\"https://start.exactonline.nl/api/v1/...')\"}},\n {u'Code': u' 555',\n u'ID': u'22222222-3333-4444-5555-666666666666',\n u'Name': u'Daffy Duck Ltd.',\n u'__metadata': {u'type': u'Exact.Web.Api.Models.Account',\n u'uri': u\"https://start.exactonline.nl/api/v1/...')\"}}\n ]\n\nUpdate a relation:\n\n.. code-block:: python\n\n daffy_duck = api.relations.get(relation_code='555')\n api.relations.update(daffy_duck['ID'], {'Name': 'Daffy Duck and sons'})\n\nDelete a relation:\n\n.. code-block:: python\n\n daffy_duck = api.relations.get(relation_code='555')\n api.relations.delete(daffy_duck['ID'])\n\nCreate an invoice:\n\n.. code-block:: python\n\n customer_data = api.relations.get(relation_code='123') # local relation_code\n customer_guid = customer_data['ID']\n invoice_data = {\n 'AmountDC': str(amount_with_vat), # DC = default currency\n 'AmountFC': str(amount_with_vat), # FC = foreign currency\n 'EntryDate': invoice_date.strftime('%Y-%m-%dT%H:%M:%SZ'), # pretend we're in UTC\n 'Customer': customer_guid,\n 'Description': u'Invoice description',\n 'Journal': remote_journal, # 70 \"Verkoopboek\"\n 'ReportingPeriod': invoice_date.month,\n 'ReportingYear': invoice_date.year,\n 'SalesEntryLines': [],\n 'VATAmountDC': str(vat_amount),\n 'VATAmountFC': str(vat_amount),\n 'YourRef': local_invoice_number,\n # must start uniquely at the start of a year, defaults to:\n # YYJJ0001 where YY=invoice_date.year, and JJ=remote_journal\n 'InvoiceNumber': '%d%d%04d' % (invoice_date.year, remote_journal,\n int(local_invoice_number)),\n }\n # The SalesEntryLines need to be filled with a bunch of dictionaries\n # with these keys: AmountDC, AmountFC, Description, GLAccount,\n # VATCode where GLAccount holds the Journal remote GUID, and the\n # amounts are without VAT.\n\n api.invoices.create(invoice_dict)\n\nYou may need to play around a bit to find out which fields are\nmandatory, and what kind of values the fields need. The `Exact Online\nREST resources list`_ isn't always clear on that.\n\n\n\nUsing element adapters\n----------------------\n\nUsing the above works, but it's not really object oriented. If\navailable, you may be better off using one of the adaptable classes in\n``exactonline.elements`` and subclassing that.\n\nFor example, this is how you could create your own interface to an Exact\nOnline customer.\n\n.. code-block:: python\n\n # Assuming you have a MyRelation that looks like this:\n class MyRelation(object):\n relcode = 12345\n first_name = 'John'\n last_name = 'Doe'\n billing_address = None\n # ...\n\n # You could create an adapter subclass of ExactCustomer like this:\n class MyExactCustomer(ExactCustomer):\n def __init__(self, my_relation=None, **kwargs):\n super(MyExactCustomer, self).__init__(**kwargs)\n self._my_relation = my_relation\n\n def get_code(self):\n return str(self._my_relation.relcode)\n\n def get_name(self):\n return ' '.join([\n self._my_relation.first_name,\n self._my_relation.last_name])\n\n def get_address(self):\n address = self._my_relation.billing_address\n if address:\n return {\n 'AddressLine1': address.street_and_number(),\n 'Postcode': address.zipcode,\n 'City': address.city.name,\n }\n return {}\n\nIf you have the above set up, and have unique customer codes, then\nwriting/updating an Exact Online relation is as convenient as this:\n\n.. code-block:: python\n\n johndoe = MyRelation(...)\n exactonline_relation = MyExactCustomer(my_relation=johndoe, api=api)\n ret = exactonline_relation.commit()\n\nThese adaptable elements are currently implemented for writing customers\n(ExactCustomer) and invoices (ExactInvoice). See the files in\n``exactonline/elements/`` for more info.\n\n\n\nSetting up the link\n-------------------\n\nYou'll need a storage backend. The default ``IniStorage`` can be taken from\n``exactonline.storage``.\n\n.. code-block:: python\n\n from exactonline.storage.ini import IniStorage\n\n class MyIniStorage(IniStorage):\n def get_response_url(self):\n \"Configure your custom response URL.\"\n return self.get_base_url() + '/oauth/success/'\n\n storage = MyIniStorage('/path/to/config.ini')\n\n(Note that you're not tied to using ``.ini`` files. See\n``exactonline/storage.py`` if you want to use a different storage\nbackend.)\n\nYou need to set up access to your Exact Online SaaS instance, by creating an\nexport link. See `creating Exact Online credentials`_ for more info.\n\nTake that info, and configure it in your ``config.ini``.\n\n.. code-block:: ini\n\n [server]\n auth_url = https://start.exactonline.co.uk/api/oauth2/auth\n rest_url = https://start.exactonline.co.uk/api\n token_url = https://start.exactonline.co.uk/api/oauth2/token\n\n [application]\n base_url = https://example.com\n client_id = {12345678-abcd-1234-abcd-0123456789ab}\n client_secret = ZZZ999xxx000\n ; optional config:\n iteration_limit = 50\n\nCreate an initial URL:\n\n.. code-block:: python\n\n api = ExactApi(storage=storage)\n url = api.create_auth_request_url()\n\nThe URL will look like this; redirect the user there so he may\nauthenticate and allow your application access to Exact Online (this is\nOAuth)::\n\n https://start.exactonline.nl/api/oauth2/auth?\n client_id=%7B12345678-abcd-1234-abcd-0123456789ab%7D&\n redirect_uri=https%3A//example.com/oauth/success/&\n response_type=code\n\nAfter authentication he will get redirected back to::\n\n https://example.com/oauth/success/?code=...\n\nYou should implement a view on that URL, that does basically this:\n\n.. code-block:: python\n\n api.request_token(code)\n\nAt this point, you should configure your default division, if you\nhaven't already:\n\n.. code-block:: python\n\n division_choices, current_division = api.get_divisions()\n api.set_division(division_choices[0][0]) # select ID of first division\n\nNow you're all set!\n\n\n\nImplemented resources\n---------------------\n\nView ``exactonline/api/__init__.py`` to see which resource helpers are\nimplemented.\n\nCurrently, it looks like this:\n\n.. code-block:: python\n\n contacts = Contacts.as_property()\n invoices = Invoices.as_property()\n ledgeraccounts = LedgerAccounts.as_property()\n receivables = Receivables.as_property()\n relations = Relations.as_property()\n vatcodes = VatCodes.as_property()\n\nBut you can call resources which don't have a helper directly. The\nfollowing two three are equivalent:\n\n.. code-block:: python\n\n api.relations.all()\n api.restv1(GET('crm/Accounts'))\n api.rest(GET('v1/%d/crm/Accounts' % selected_division))\n\nAs are the following three:\n\n.. code-block:: python\n\n api.relations.filter(top=2)\n api.restv1(GET('crm/Accounts?$top=2'))\n api.rest(GET('v1/%d/crm/Accounts?$top=2' % selected_division))\n\nAnd these:\n\n.. code-block:: python\n\n api.invoices.filter(filter=\"EntryDate gt datetime'2015-01-01'\")\n api.restv1(GET('salesentry/SalesEntries?' +\n '$filter=EntryDate%20gt%20datetime%272015-01-01%27'))\n api.rest(GET('v1/%d/salesentry/SalesEntries?' +\n '$filter=EntryDate%%20gt%%20datetime%%272015-01-01%%27' %\n selected_division)\n # convinced yet that the helpers are useful?\n\nSee the `Exact Online REST resources list`_ for all available resources.\n\n\n\nOther benefits\n--------------\n\nThe ExactApi class ensures that:\n\n* Tokens are refreshed as needed (see: ``exactonline/api/autorefresh.py``).\n* Paginated lists are automatically downloaded in full (see:\n ``exactonline/api/unwrap.py``).\n\n\n\nCreating Exact Online credentials\n---------------------------------\n\nPreviously, one could create an API from the Exact Online interface directly.\nThis was removed at some point between 2014 and 2015.\n\nAccording to the `\"how can I create an application key?\" FAQ entry`_\nyou must now create one through the App Center.\n\n *Why am I unable to see the Register an API link and how can I\n create an application key?*\n\n All registrations are now configured through the App Center.\n Previously you were able to generate an Application Key and/or create an\n OAuth registration within your Exact Online.\n\n In Exact Online you can create an app registration for private use\n (customer account) or an app registration for commercial use (partner\n account). Go to Target groups and site maps for more information.\n\n If the Register API Key link is not visible in the App Center\n menu you do not have the correct rights to view it. To make the\n link visible go to, Username > My Exact Online > Rights and\n select Manage subscription.\n\nLog into the `Exact Online App Center`_, click MANAGE APPS (APPS BEHEREN);\nit should be a large link visible on the Top Right. Make sure the redirect\nURI has the same transport+domainname as the site that you wish to connect.\n\nFor sites with an internal URI only, you may need to alter the hostname\ntemporarily when registering. Generate the register URL with\n``api.create_auth_request_url`` and alter it as appropriate.\n\nAfter creating the App, you can go back and fetch the the *Client ID*\nand the *Client secret*.\n\n\n\nLicense\n-------\n\nExact Online REST API Library in Python is free software: you can\nredistribute it and/or modify it under the terms of the GNU Lesser\nGeneral Public License as published by the Free Software Foundation,\nversion 3 or any later version.\n\n\n\nTODO\n----\n\n* Fix so file Copyright headers are auto-populated (and date-updated).\n\n\n\nFurther reading\n---------------\n\n* `Exact Online REST API`_.\n* `Exact Online REST resources list`_.\n* `Tips by Bas van Beek`_.\n\n.. _`Exact Online App Center`: https://apps.exactonline.com/\n.. _`Exact Online REST API`: https://developers.exactonline.com/#RestIntro.html%3FTocPath%3DExact%2520Online%2520REST%2520API%7C_____0\n.. _`Exact Online REST resources list`: https://start.exactonline.co.uk/docs/HlpRestAPIResources.aspx?SourceAction=10\n.. _`Tips by Bas van Beek`: http://www.basvanbeek.nl/exact-online-tips/\n\n.. _`\"how can I create an application key?\" FAQ entry`: https://developers.exactonline.com/#FAQ_General.htm%3FTocPath%3DApp%2520Center%7C_____5\n\n\n\nChanges\n-------\n\n* v0.3.4:\n\n - Added bankaccounts manager. Closes #21. Thanks Edwin van de Ven\n (@edwinvandeven).\n - Added global configurable iteration limit parameter.\n\n Default unpagination was limited to 50 to avoid infinite loops in\n case of bugs or bad data. Some users require more pages of output.\n\n Set the iteration_limit in your config storage to a higher value if\n you run into \"Iteration ... limit reached!\".\n\n Closes #22. Thanks George Viorel Visniuc (@gvisniuc).\n\n - Move storage/config backends to separate storage subdir. This way we\n don't require the configparse if you're not using the IniStorage.\n Shows a DeprecationWarning so you have time to update your code.\n\n Closes #19.\n\n* v0.3.3:\n\n - Additions to ExactInvoice element:\n\n + Add optional \"month\" to get_ledger_lines() for accrued/deferred\n income.\n + Add get_vatcode_for_ledger_line() for customizable VATCodes.\n\n* v0.3.2:\n\n - Fix ConfigParser deprecationwarning.\n - Add VatCodes API support. Thanks Stani Michiels (@stanim). Closes\n #12.\n\n* v0.3.1:\n\n - Add Contacts API support. Thanks @Imperatus. Closes #8 and #11.\n\n* v0.3.0:\n\n - Refactor code to use fewer arguments. This makes the BetterCodeHub\n checks happy and that makes me happy. This is a BACKWARDS\n INCOMPATIBLE CHANGE. All your code that looked like this::\n\n ret = self.rest('GET', 'v1/current/Me?$select=CurrentDivision')\n\n will have to be changed to this::\n\n from exactonline.resource import GET\n ret = self.rest(GET('v1/current/Me?$select=CurrentDivision'))\n\n Closes #7.\n\n - Add IniStorage default return value for get_default_url(), returning\n get_base_url(). This makes life easier for those who did not read\n the README. Closes #6.\n\n* v0.2.5:\n\n - Fix set_tokens() bug in Python3; make sure json.loads() gets an\n unistr. Reported by @Imperatus, @LordGaav. Closes #9 and #10.\n\n* v0.2.4:\n\n - Improve HTTP functions for better error reporting and better Py23\n compatibility.\n\n* v0.2.3:\n\n - Add api.invoices.filter(invoice_number__in=LIST) filter.\n - Iterate over resultsets instead of using recursion (api.unwrap).\n - Fix python3 compatibility issue: bytestring found on autorefresh.\n Thanks @wpxgit.\n\n* v0.2.2:\n\n - Correct RST source in CHANGES file. Did not display properly on\n PyPI.\n\n* v0.2.1:\n\n - Correct example Python code in docs. Thanks @alexBaizeau.\n - Add ``exactonline.elements`` that were missing in the 0.2.0\n distributed package. Thanks @hcwsegers.\n - Add overridable ``get_ledger_code_to_guid_maps()`` helper to the\n invoices elements class.\n\n* v0.2.0:\n\n - Update build/PyPI info: move to Stable, add Python 3.4 and 3.5\n version, fix Python 3 compatibility.\n - Fix a few README RST issues. Update OAuth documentation.\n - Add initial ``exactonline.elements`` to use for easier object\n oriented data submissions.\n - Add and improve SSL, API and Python3 tests.\n\n* v0.1.3:\n\n - Add ``receivables`` manager to the API. This manager allows you to\n build a list similar to the *Outstanding Receivables* page of\n *Financial Reporting*.\n - Add ``api.invoices.map_exact2foreign_invoice_numbers`` and\n ``api.invoices.map_foreign2exact_invoice_numbers`` methods to\n quickly get a mapping between our own and the ExactOnline invoice\n numbers.\n - Python3 compatibility.\n - Minor fixes.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ossobv/exactonline", "keywords": "", "license": "LGPLv3+", "maintainer": "", "maintainer_email": "", "name": "exactonline", "package_url": "https://pypi.org/project/exactonline/", "platform": "linux", "project_url": "https://pypi.org/project/exactonline/", "project_urls": { "Homepage": "https://github.com/ossobv/exactonline" }, "release_url": "https://pypi.org/project/exactonline/0.3.4/", "requires_dist": null, "requires_python": "", "summary": "Exact Online REST API Library in Python", "version": "0.3.4" }, "last_serial": 4461208, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "e6429bf46e0bb2ab8aeb5494c93fde03", "sha256": "ab410a10cb1f0985c51dc62275278413636553043d60f448f5c58a4cdbb59347" }, "downloads": -1, "filename": "exactonline-0.1.2.tar.gz", "has_sig": false, "md5_digest": "e6429bf46e0bb2ab8aeb5494c93fde03", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17505, "upload_time": "2015-03-18T16:26:26", "url": "https://files.pythonhosted.org/packages/64/24/418dcc85d8eba5483d54004188fe0032851679d3759e40308e0333b95b60/exactonline-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "fa244bb846e8c293fc7ebffa6e0d7b13", "sha256": "796390f5ade5c00ce81e8278a1b7a96220ea6e4d03954bf6c03103d547b8e083" }, "downloads": -1, "filename": "exactonline-0.1.3.tar.gz", "has_sig": false, "md5_digest": "fa244bb846e8c293fc7ebffa6e0d7b13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20291, "upload_time": "2015-08-14T09:42:14", "url": "https://files.pythonhosted.org/packages/43/4f/ea6ab45cba99360fe27166cf3d7d648e10b5fb072cf9d69556ab268bd5aa/exactonline-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ca88be918cfde0aff776c017991d26b9", "sha256": "4474ad2e993fd80e396b920acdc3240c443e6899adeea9413124605c2b129895" }, "downloads": -1, "filename": "exactonline-0.2.0.tar.gz", "has_sig": false, "md5_digest": "ca88be918cfde0aff776c017991d26b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24137, "upload_time": "2016-04-25T19:31:09", "url": "https://files.pythonhosted.org/packages/ab/2d/7533557d8bf9fc0e6afc1329cf49f4100bdaa54221a84c1d0b5662690c57/exactonline-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "28276d396501d779201833d03503b23f", "sha256": "d42f2c8135b62f1ffba96012006363dcf1d0e28b5c2870fe3901eb135b0aebb0" }, "downloads": -1, "filename": "exactonline-0.2.1.tar.gz", "has_sig": false, "md5_digest": "28276d396501d779201833d03503b23f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27427, "upload_time": "2016-06-24T09:33:31", "url": "https://files.pythonhosted.org/packages/4f/aa/ad51fe0ed6acf7a2419eb69749717acc7684f83303e1a1510a1c28498753/exactonline-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "6c775b04b10aa97df525fbbf95b18bad", "sha256": "87492bdeac7dee2d60d37cdec0bc2035ac994103ff982bb72cef46e078857278" }, "downloads": -1, "filename": "exactonline-0.2.2.tar.gz", "has_sig": false, "md5_digest": "6c775b04b10aa97df525fbbf95b18bad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28437, "upload_time": "2016-06-24T09:50:09", "url": "https://files.pythonhosted.org/packages/0f/f6/151468c49aea6f0b3a40afd312c90f2cd57319ab887841b10ac328587b1f/exactonline-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "94985bfe55634a3faa546875b9462e22", "sha256": "3c49e7c357b255583d2b10652782da70674a480372d0a075e39715d4642dae15" }, "downloads": -1, "filename": "exactonline-0.2.3.tar.gz", "has_sig": false, "md5_digest": "94985bfe55634a3faa546875b9462e22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31415, "upload_time": "2016-09-08T14:34:29", "url": "https://files.pythonhosted.org/packages/a6/24/878a82325ee564dd7b5af58c94b3ea602f5ff17c255a75f277f60d63ce82/exactonline-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "b6c4e9069a0b1d27e58201c634af8884", "sha256": "96117619ac1ff4a35726761246738060661d56ff39bb4f6e3653cf3f6492a5eb" }, "downloads": -1, "filename": "exactonline-0.2.4.tar.gz", "has_sig": false, "md5_digest": "b6c4e9069a0b1d27e58201c634af8884", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29425, "upload_time": "2016-10-13T07:10:30", "url": "https://files.pythonhosted.org/packages/66/f4/624996ab8c97ca8e7f3020ebcfc6e36a3e98a2bf32f446677678d02f1f7f/exactonline-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "3f5c524663cdffe4f442a37c0030a81e", "sha256": "01c826ed3e135590d9250a704f7f93c14de3b7659e98588f6f7739c0f0b90102" }, "downloads": -1, "filename": "exactonline-0.2.5.tar.gz", "has_sig": false, "md5_digest": "3f5c524663cdffe4f442a37c0030a81e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33210, "upload_time": "2017-01-26T14:58:46", "url": "https://files.pythonhosted.org/packages/38/04/1e0594034f4aa22aa450a931a7117f15b56bdb5ae8cdbc95457fd30cca95/exactonline-0.2.5.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "45caa51b17c6367e2931d533fe1b6c3f", "sha256": "68747666bff7e73a3041bb02a6b6ef3b3037a72bbb9e04ece7ad0f37bcd9a3eb" }, "downloads": -1, "filename": "exactonline-0.3.0.tar.gz", "has_sig": false, "md5_digest": "45caa51b17c6367e2931d533fe1b6c3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30217, "upload_time": "2017-01-26T16:09:35", "url": "https://files.pythonhosted.org/packages/9b/39/b154da8473f416b42ebc77aeb10db646e82ce178458b465c63e405b67141/exactonline-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "a07a3eb94a197739ce809ca59a484f77", "sha256": "b350d3da5ede0aebd46069a9e3ad6e5cfa1d464ce22195eea1f384162ba8f09d" }, "downloads": -1, "filename": "exactonline-0.3.1.tar.gz", "has_sig": false, "md5_digest": "a07a3eb94a197739ce809ca59a484f77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33817, "upload_time": "2017-01-27T10:03:06", "url": "https://files.pythonhosted.org/packages/0c/11/ed36b24db52e0be57835cb4b2845a30aa802c03443449004376ef8469dc9/exactonline-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "f4e83e51e40a68ddb8dfa5230f3ec5eb", "sha256": "1d37584ff1b64e19d2bb86d5759971f404bfc8db380d93986982736c1e430b6a" }, "downloads": -1, "filename": "exactonline-0.3.2.tar.gz", "has_sig": false, "md5_digest": "f4e83e51e40a68ddb8dfa5230f3ec5eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31464, "upload_time": "2017-04-04T12:46:58", "url": "https://files.pythonhosted.org/packages/26/91/62a7760881348447d32dabf37262fa4eaa4888622e793dd29ddad7bb67d1/exactonline-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "2394360dd6913a4f9d76d10e6a64b31b", "sha256": "96fb3e9ca726b4e358e9a5f9346fa6be2ba33009ec383d5e7f1e2835ad649289" }, "downloads": -1, "filename": "exactonline-0.3.3.tar.gz", "has_sig": false, "md5_digest": "2394360dd6913a4f9d76d10e6a64b31b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34835, "upload_time": "2018-07-23T15:17:13", "url": "https://files.pythonhosted.org/packages/9a/4d/ec8d76e9c6d757423b6ae8c3f5ffbe5f50489ac441fd51bbf79a677536b5/exactonline-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "ae5d734bcedb123b8bb2a2313b62655e", "sha256": "d0d203c39b3ab55167cf39f0c18d9ed3d65f80612f2ac112a1aa3a0b08855cb0" }, "downloads": -1, "filename": "exactonline-0.3.4.tar.gz", "has_sig": false, "md5_digest": "ae5d734bcedb123b8bb2a2313b62655e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35463, "upload_time": "2018-11-07T12:35:23", "url": "https://files.pythonhosted.org/packages/43/52/6c62d997b9b71c712125bf4ab07eecaff584754a558c3615cd3d3b018dbb/exactonline-0.3.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ae5d734bcedb123b8bb2a2313b62655e", "sha256": "d0d203c39b3ab55167cf39f0c18d9ed3d65f80612f2ac112a1aa3a0b08855cb0" }, "downloads": -1, "filename": "exactonline-0.3.4.tar.gz", "has_sig": false, "md5_digest": "ae5d734bcedb123b8bb2a2313b62655e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35463, "upload_time": "2018-11-07T12:35:23", "url": "https://files.pythonhosted.org/packages/43/52/6c62d997b9b71c712125bf4ab07eecaff584754a558c3615cd3d3b018dbb/exactonline-0.3.4.tar.gz" } ] }