{ "info": { "author": "Draftable", "author_email": "hello@draftable.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "Draftable Compare API - Python Client Library\n=============================================\n\nThis is a thin Python 2/3 client for Draftable's `document comparison\nAPI `__.\nIt wraps the available endpoints, and handles authentication and\nsigning for you. The source code is available on\n`Github `__.\n\nSee the `full API documentation `__ for an\nintroduction to the API, usage notes, and other references.\n\nGetting started\n---------------\n\n- Sign up for free at `api.draftable.com `__\n to get your credentials.\n\n- ``pip install draftable-compare-api``\n\n- Instantiate the client:\n\n ::\n\n import draftable\n client = draftable.Client(, )\n comparisons = client.comparisons\n\n- Start creating comparisons:\n\n ::\n\n comparison = comparisons.create(\n left = comparisons.side_from_url('https://api.draftable.com/static/test-documents/code-of-conduct/left.rtf', file_type='rtf'),\n right = comparisons.side_from_url('https://api.draftable.com/static/test-documents/code-of-conduct/right.pdf', file_type='pdf'),\n )\n\n print(\"Comparison created:\", comparison)\n print(\"Viewer URL (expires in 30 min):\", comparisons.signed_viewer_url(comparison.identifier))\n\n\nClient API\n==========\n\nDependencies\n------------\n\nThe only dependency is the pypi ``requests`` package.\n\nDesign notes\n------------\n\n- This library should be compatible with Python 2 and Python 3. Submit\n a Github issue if it doesn't work with your interpreter.\n- This Python library always returns \"aware\" ``datetime`` objects, and\n assumes that any naive ``datetime`` objects given to it are in *UTC* time.\n- The API is designed such that *requests should always succeed*, and\n *comparisons should always succeed* in production.\n\n - Errors in making requests will only occur upon network failure, or\n when you provide invalid credentials or data.\n - Comparisons will only fail when the files are unreadable, or\n exceed your account's size limits.\n\nInitializing the client\n-----------------------\n\nThe package ``draftable-compare-api`` installs a single module,\n``draftable``, which exports a single class, ``draftable.Client``.\n\n``Client(account_id: str, auth_token: str)`` will construct an API\nclient. At present, ``Client`` has a single property, ``comparisons``,\nthat yields a ``ComparisonsEndpoint`` that manages the comparisons for\nyour API account.\n\nSo, we'll assume you set things up as follows:\n\n::\n\n import draftable\n client = draftable.Client(, )\n comparisons = client.comparisons\n\nGetting comparisons\n-------------------\n\n``ComparisonsEndpoint`` provides ``all()`` and\n``get(identifier: str)``.\n\n- ``all()`` returns a ``list`` of *all your\n comparisons*, ordered from newest to oldest. This is a potentially\n expensive operation.\n- ``get(identifier: str)`` returns a single\n ``Comparison`` object, or raises ``comparisons.NotFound`` if there isn't\n a comparison with that identifier.\n\nComparison objects\n~~~~~~~~~~~~~~~~~~\n\n``Comparison`` objects have the following properties:\n\n- ``identifier``: a ``string`` giving the identifier.\n- ``left``, ``right``: objects giving information about each side, with properties:\n\n - ``file_type``: the file extension.\n - ``source_url`` *(optional)*: if the file was specified as a URL, this will be a string with the URL. Otherwise, ``None``.\n - ``display_name`` *(optional)*: the display name, if one was given. Otherwise, ``None``.\n\n- ``public``: a ``bool`` giving whether the comparison is public, or requires authentication to view.\n- ``creation_time``: a UTC ``datetime`` giving when the comparison was created.\n- ``expiry_time`` *(optional)*: if the comparison will expire, a UTC ``datetime`` giving the expiry time. Otherwise, ``None``.\n- ``ready``: ``bool`` indicating whether the comparison is ready for display.\n\nIf a ``Comparison`` is ``ready`` (i.e. it has been processed and is ready for display), it will have the following additional properties:\n\n- ``ready_time``: UTC ``datetime`` giving the time the comparison became ready.\n- ``failed``: ``bool`` indicating whether the comparison succeeded or failed.\n- ``error_message`` *(only present if ``failed``)*: a string providing the developer with the reason the comparison failed.\n\nExample usage\n~~~~~~~~~~~~~\n\n::\n\n identifier = '.....'\n\n try:\n comparison = comparisons.get('')\n\n print(\"Comparison '{identifier}' ({publicOrPrivate}) is {readyOrNot}.\".format(\n identifier = identifier,\n publicOrPrivate = 'public' if comparison.public else 'private',\n readyOrNot = 'ready' if comparison.ready else 'not ready',\n ))\n\n if comparison.ready:\n elapsed = comparison.ready_time - comparison.creation_time\n print(\"The comparison took {} seconds.\".format(elapsed.total_seconds()))\n\n if comparison.failed:\n print(\"The comparison failed. Error message:\", comparison.error_message)\n\n except comparisons.NotFound:\n print(\"Comparison '{}' doesn't exist.\")\n\nDeleting comparisons\n--------------------\n\n``ComparisonsEndpoint`` provides ``delete(identifier)``, which attempts to delete the comparison with that identifier.\n\nIt has no return value, and raises ``comparisons.NotFound`` if there isn't a comparison with that identifier.\n\nExample usage\n~~~~~~~~~~~~~\n\n::\n\n oldest_comparisons = comparisons.all()[-10:]\n\n print(\"Deleting oldest {} comparisons...\".format(len(oldest_comparisons)));\n\n for comparison in oldest_comparisons:\n comparisons.delete(comparison.identifier)\n print(\"Deleted comparison '{}'.\".format(comparison.identifier)\n\nCreating comparisons\n--------------------\n\n``ComparisonsEndpoint`` provides ``create(...)``, which returns a ``Comparison`` object representing the newly created comparison.\n\nCreation options\n~~~~~~~~~~~~~~~~\n\n``create`` accepts the following arguments:\n\n- ``left``, ``right``: objects describing the left and right files, created using either ``comparisons.side_from_file`` or ``comparisons.side_from_url`` (see below)\n- ``identifier`` *(optional)*: the identifier to use for the comparison.\n\n - If specified, the identifier can't clash with an existing\n comparison.\n - If left unspecified, the API will automatically generate one for\n you.\n\n- ``public`` *(optional)*: whether the comparison is publicly accessible.\n\n - Defaults to ``false``. If ``true``, then the comparison viewer can be accessed by anyone, without authentication.\n - See the full API documentation for details.\n\n- ``expires`` *(optional)*: a ``timedelta`` or a UTC ``datetime``, specifying when the comparison will be automatically deleted.\n\n - If given, must be a positive ``timedelta``, or a UTC ``datetime`` in the future.\n - Defaults to ``None``, meaning the comparison will never expire.\n\nThe function ``comparisons.side_from_url`` accepts the following arguments:\n\n- ``url``: a fully qualified URL from which Draftable will download the file.\n- ``file_type``: the type of the file, specified by the file extension.\n\n - If you provide the incorrect file type, the comparison will fail.\n\n- ``display_name`` *(optional)*: a name for the file, to be shown in the comparison.\n\nThe function ``comparisons.side_from_file`` accepts the following arguments:\n\n- ``file``: a file object to be read and uploaded. Ensure the file is opened for reading in *binary mode*.\n- ``file_type``: as before.\n- ``display_name`` *(optional)*: as before.\n\nSupported file types\n~~~~~~~~~~~~~~~~~~~~\n\nThe following file types are supported:\n\n- PDF: ``pdf``\n- Word: ``docx``, ``docm``, ``doc``, ``rtf``\n- PowerPoint: ``pptx``, ``pptm``, ``ppt``\n\nExceptions\n~~~~~~~~~~\n\nIf you provide ``comparisons.side_from_file`` with an invalid ``file_type``, or a ``file`` that isn't opened in *binary mode*, it will raise ``comparisons.InvalidArgument``.\n\nIf you provide ``comparisons.side_from_url`` with an invalid ``file_type`` or a badly formatted ``url``, it will raise ``comparisons.InvalidArgument``.\n\nExceptions are raised by ``create`` in the following cases:\n\n- If a parameter is invalid (e.g. ``expires`` is set to a time in the past), it will raise ``comparisons.InvalidArgument``.\n- If ``identifier`` is already in use by another comparison, ``comparisons.BadRequest`` is raised.\n- If the API endpoint finds your request invalid for another reason, raises ``comparisons.BadRequest``.\n\nExample usage\n~~~~~~~~~~~~~\n\n::\n\n identifier = comparisons.generate_identifier(); # Generates a unique identifier.\n\n with open('path/to/right/file.docx', 'rb) as right_file:\n\n comparison = comparisons.create(\n\n identifier = identifier,\n\n left = comparisons.side_from_url('https://domain.com/left.pdf', file_type='pdf', display_name='document.pdf'),\n right = comparisons.side_from_file(right_file, file_type='docx', display_name='document (revised).docx'),\n\n # 'public' is omitted, because we only want to let authenticated users view the comparison.\n\n # Comparison expires 30 minutes into the future.\n expires: timedelta(minutes=30),\n\n )\n\n print(\"Created comparison:\", comparison);\n\n # This generates a signed viewer URL that can be used to access the private comparison for the next 30 minutes.\n print(\"Viewer URL (expires in 30 min):\", comparisons.signed_viewer_url(identifier));\n\nDisplaying comparisons\n----------------------\n\nComparisons are displayed using a *viewer URL*. See the section on displaying comparisons in the `API documentation `__ for details.\n\nViewer URLs are generated with the following methods:\n\n- ``comparisons.public_viewer_url(identifier: str, wait: bool = False)``\n\n - Viewer URL for a public comparison with the given ``identifier``.\n - ``wait`` is ``false`` by default, meaning the viewer will show an\n error if no such comparison exists.\n - If ``wait`` is ``true``, the viewer will wait for a comparison\n with the given ``identifier`` to exist (potentially displaying a\n loading animation forever).\n\n- ``comparisons.signed_vewer_url(identifier: str, valid_until: datetime | timedelta = None, wait: bool = False)``\n\n - Gets a signed viewer URL for a comparison with the given\n ``identifier``. (The signature is an HMAC based on your\n credentials.)\n - ``valid_until`` gives when the URL will expire. It's specified as\n a UTC ``datetime``, or a ``timedelta``.\n\n - If ``valid_until`` is ``None``, the URL defaults to expiring 30\n minutes in the future (more than enough time to load the page).\n\n - Again, if ``wait`` is ``true``, the viewer will wait for a\n comparison with the given ``identifier`` to exist.\n\nExample usage\n~~~~~~~~~~~~~\n\nSomewhere in ``tasks.py``:\n\n::\n\n # Celery task for creating a comparison.\n # This will run on a background worker.\n\n @app.task\n def upload_comparison_in_background(identifier, left_file_path, right_url):\n with open(left_file_path, 'rb') as left_file:\n comparisons.create(\n identifier = identifier,\n left = comparisons.side_from_file(left_file, ...),\n right = comparisons.side_from_url(right_url, ...),\n )\n\nThen, in ``compare.py``:\n\n::\n\n from .tasks import upload_comparison_in_background\n\n identifier = comparisons.generate_identifier()\n\n # Upload our request in the background with our Celery task.\n upload_comparison_in_background.delay(identifier, ...)\n\n # At some point, we'll have created the comparison. In the mean time, we'll immediately give the user a viewer URL.\n viewer_url = comparisons.signed_viewer_url(identifier, wait=true);\n\n # This URL is valid for 30 minutes, the default amount of time.\n print(\"Comparison is being created. View at:\", viewer_url)\n\nThe comparison viewer will display a loading animation, waiting for the\ncomparison to be created and processed.\n\nUtility methods\n---------------\n\n- ``comparisons.generate_identifier()`` generates a random unique\n identifier for you to use.\n\n--------------\n\nOther information\n=================\n\nPython 2 and 3 compatibility\n----------------------------\n\nThis package officially supports the latest releases of Python 2 and 3.\n\nAt the time of writing, ``Python 2.7.13``, ``Python 3.5.3``, and\n``Python 3.6.0`` are known to be supported.\n\n-----\n\nThat's it! Please report issues you encounter, and we'll work quickly to resolve\nthem. Contact us at\n`support@draftable.com `__ if you need\nassistance.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/draftable/compare-api-python-client", "keywords": "compare documents draftable api pdf word powerpoint", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "draftable-compare-api", "package_url": "https://pypi.org/project/draftable-compare-api/", "platform": "", "project_url": "https://pypi.org/project/draftable-compare-api/", "project_urls": { "Homepage": "https://github.com/draftable/compare-api-python-client" }, "release_url": "https://pypi.org/project/draftable-compare-api/1.0.9/", "requires_dist": [ "requests" ], "requires_python": "", "summary": "Draftable Compare API - Python Client Library", "version": "1.0.9" }, "last_serial": 2952838, "releases": { "1.0.0b1": [ { "comment_text": "", "digests": { "md5": "e36cf5e52ba066d71db4c19facdafc5a", "sha256": "8b80c280c30614eca2f82d3d5c43b2de35454928bd4a05c09c0119ac48f06921" }, "downloads": -1, "filename": "draftable_compare_api-1.0.0b1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e36cf5e52ba066d71db4c19facdafc5a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2811, "upload_time": "2017-02-23T13:11:10", "url": "https://files.pythonhosted.org/packages/9b/6a/2fad907909816569e618ae3b623bdae2f5b3318dbf35e75fb0bb281f06ee/draftable_compare_api-1.0.0b1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7fe7b7724b4cf55facbdaac90ca0af71", "sha256": "99c7954fd3c13669f50ae9b34d41ccbecf7aa9d940b6e2c9e6bbc0e40cbf2d0d" }, "downloads": -1, "filename": "draftable_compare_api-1.0.0b1.tar.gz", "has_sig": false, "md5_digest": "7fe7b7724b4cf55facbdaac90ca0af71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1246, "upload_time": "2017-02-23T13:11:11", "url": "https://files.pythonhosted.org/packages/c2/7d/ef24ca8fb32f859720f6d51121d3ac3b56c17ba2d8fa06fdf6e17424703c/draftable_compare_api-1.0.0b1.tar.gz" } ], "1.0.1b1": [ { "comment_text": "", "digests": { "md5": "c8608d82a6e25a3b7a743606b7c22bbf", "sha256": "ddcd3dda7021ee90d00f904e98afb3890d8495917abc6e4e27a0388e8ac0adc6" }, "downloads": -1, "filename": "draftable_compare_api-1.0.1b1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c8608d82a6e25a3b7a743606b7c22bbf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2812, "upload_time": "2017-02-23T13:17:32", "url": "https://files.pythonhosted.org/packages/25/22/c19eb1b6294510e8445f578964e670cf962d2cbbcabb24e680ee38fec82a/draftable_compare_api-1.0.1b1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e45f95f27c25fbb56fa5f108b4dddceb", "sha256": "cb1a075a962ca62248e5de4bde13a55efd628bebabcf5efd4c9976c9aa3c259c" }, "downloads": -1, "filename": "draftable_compare_api-1.0.1b1.tar.gz", "has_sig": false, "md5_digest": "e45f95f27c25fbb56fa5f108b4dddceb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1268, "upload_time": "2017-02-23T13:17:33", "url": "https://files.pythonhosted.org/packages/37/97/247844a8cad321e2eaf01478f13e47e23691ff3f1f9804f323702c6446ec/draftable_compare_api-1.0.1b1.tar.gz" } ], "1.0.2b1": [ { "comment_text": "", "digests": { "md5": "501a873991417a4adc98758e7f84942d", "sha256": "cb97c948928e96dc0a45a1dac462f4aa0af16d3f11df43d14b3f0e55c70edd9b" }, "downloads": -1, "filename": "draftable_compare_api-1.0.2b1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "501a873991417a4adc98758e7f84942d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11017, "upload_time": "2017-02-23T13:23:40", "url": "https://files.pythonhosted.org/packages/33/f3/60a4ba3629c230d6f06700f053364b8f63a77191553e626528646f40e2b6/draftable_compare_api-1.0.2b1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e677c42bbfe587747123cfcae409c3b1", "sha256": "8c9777c69c0af9171bf866d12937be4c7a30c224958a2b36cadc5a78fa736284" }, "downloads": -1, "filename": "draftable_compare_api-1.0.2b1.tar.gz", "has_sig": false, "md5_digest": "e677c42bbfe587747123cfcae409c3b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6646, "upload_time": "2017-02-23T13:23:41", "url": "https://files.pythonhosted.org/packages/c8/fa/ac1240de73175b65d095a9c2d6f5ab5e6e8c63dca57f0113546c679ceb34/draftable_compare_api-1.0.2b1.tar.gz" } ], "1.0.3b1": [ { "comment_text": "", "digests": { "md5": "dcac1ba4ba7e0cc8e6ad168d264822ad", "sha256": "551e34d789c35ffb4c53d0ef8823f2822e17ae5c4972f93f36ee8e1ff6707d16" }, "downloads": -1, "filename": "draftable_compare_api-1.0.3b1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dcac1ba4ba7e0cc8e6ad168d264822ad", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11086, "upload_time": "2017-02-23T13:28:03", "url": "https://files.pythonhosted.org/packages/7d/d6/5b2e2adcf596307e7c309e19112fc5e1c93171941d8a90f7777b8f82751b/draftable_compare_api-1.0.3b1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f792f87977604e9b5ad5ed156a7ce9b", "sha256": "0e74aec66d3e7319fe1f3ffa727eb45d2380e305104a81e6c5db6b41068c57d4" }, "downloads": -1, "filename": "draftable_compare_api-1.0.3b1.tar.gz", "has_sig": false, "md5_digest": "7f792f87977604e9b5ad5ed156a7ce9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6685, "upload_time": "2017-02-23T13:28:05", "url": "https://files.pythonhosted.org/packages/1e/45/8b4394bf107e2b4ba0147b29c56d77627e25e50fb8216df8fd793628fa2a/draftable_compare_api-1.0.3b1.tar.gz" } ], "1.0.4b1": [ { "comment_text": "", "digests": { "md5": "d6d244e913b39725ceaa33c6b87fe901", "sha256": "e0bf7c68b73b8eeee62d61040dbe5c87bfa15d8ad50e3dde91ecd53e8baffefb" }, "downloads": -1, "filename": "draftable_compare_api-1.0.4b1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6d244e913b39725ceaa33c6b87fe901", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11342, "upload_time": "2017-03-02T01:44:34", "url": "https://files.pythonhosted.org/packages/e5/10/48daef9fec376689c6e4be1aed8b876c1ca288cf969a50a5f29dd1c1ae4b/draftable_compare_api-1.0.4b1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6c256ddf6b13a117331258af456d4a2", "sha256": "3442382dda8426cc5e6bc61e849524b2611d7c98539a47ccedd0feb67b037dd4" }, "downloads": -1, "filename": "draftable_compare_api-1.0.4b1.tar.gz", "has_sig": false, "md5_digest": "b6c256ddf6b13a117331258af456d4a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6938, "upload_time": "2017-03-02T01:44:35", "url": "https://files.pythonhosted.org/packages/93/d9/10cae8a684b65070c25cec611f206a181f2b5af39ac35ad5f5626e10f7ac/draftable_compare_api-1.0.4b1.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "a6bac78cf6df70f8e78a4abb11a62852", "sha256": "a5166ddbb910f1c769b9a3d4e3a7e1b351650251fbde90cea41a27f174760681" }, "downloads": -1, "filename": "draftable_compare_api-1.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a6bac78cf6df70f8e78a4abb11a62852", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21667, "upload_time": "2017-03-21T03:57:38", "url": "https://files.pythonhosted.org/packages/2a/78/bb6cc15499218b49718aecfa5965ed77639fad817db6319b769c1599ac91/draftable_compare_api-1.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1591b2ea08bdb4ac0b502d316c174ff0", "sha256": "e71867c17977806b9eb7fe72298aade0efafba2916aa4c91f8a773734a97856f" }, "downloads": -1, "filename": "draftable_compare_api-1.0.5.tar.gz", "has_sig": false, "md5_digest": "1591b2ea08bdb4ac0b502d316c174ff0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12573, "upload_time": "2017-03-21T03:57:39", "url": "https://files.pythonhosted.org/packages/6c/70/748dce16ce654f40a9fbe007404f7ed6e75908f70ba87af25c342ba9ecfb/draftable_compare_api-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "4c79b0b16b0dff89ca9fde585041f389", "sha256": "599b4a6273cd8951a1be891914d4e9e7ee95a115e778ca0b8f61f45a71a0c961" }, "downloads": -1, "filename": "draftable_compare_api-1.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4c79b0b16b0dff89ca9fde585041f389", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21751, "upload_time": "2017-04-05T20:55:25", "url": "https://files.pythonhosted.org/packages/ce/d8/51f6b3f00ddfd125f3539c50469cc15c5c8d40f8c7916f72d90f2d9eb0ad/draftable_compare_api-1.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5aa434127c9a5ed7af17bd77babf3b36", "sha256": "ace2452a902cb7c74cb78b22adc69b50fba2fcc4d11ce848b8dcb557926e2340" }, "downloads": -1, "filename": "draftable_compare_api-1.0.6.tar.gz", "has_sig": false, "md5_digest": "5aa434127c9a5ed7af17bd77babf3b36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12670, "upload_time": "2017-04-05T20:55:28", "url": "https://files.pythonhosted.org/packages/a9/28/67d6a159f088d6452a35e6693fb6dd122f1251228f5362ca9c1e691757ec/draftable_compare_api-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "939f735c8b4b538e7f4c4fcc4a9fa7cf", "sha256": "adcb8a08ce087d17240be4c56acceb7917aa8966b8af428e176df8e3869e1cf4" }, "downloads": -1, "filename": "draftable_compare_api-1.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "939f735c8b4b538e7f4c4fcc4a9fa7cf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21609, "upload_time": "2017-04-05T21:11:01", "url": "https://files.pythonhosted.org/packages/01/10/877168c327213ee3bd27b27dd6511d293c8e8af158d0c5df3716422e243a/draftable_compare_api-1.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a7e6b5757243f46efc14137f9b0de46", "sha256": "466d58ecbd678b3b8883a1e36d822d88c6b310bb988ee0088ae7ec98e57db618" }, "downloads": -1, "filename": "draftable_compare_api-1.0.7.tar.gz", "has_sig": false, "md5_digest": "4a7e6b5757243f46efc14137f9b0de46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12525, "upload_time": "2017-04-05T21:11:03", "url": "https://files.pythonhosted.org/packages/3b/b1/6d28b21e97240fa16f3d49c0561e1cceedaa20a44e79c479d34c5d566f39/draftable_compare_api-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "0f72494174ed2c6a5906b4e6370dc33f", "sha256": "d5cebe4c7f7a69dce8240643d1072c2101185b388aa0b304e229cf4e41b3250f" }, "downloads": -1, "filename": "draftable_compare_api-1.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0f72494174ed2c6a5906b4e6370dc33f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 22060, "upload_time": "2017-05-05T23:51:59", "url": "https://files.pythonhosted.org/packages/c7/1e/71a1308c8b01e2ac8c7699651ab2226f002323a8d54173718b9544413fa3/draftable_compare_api-1.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "63104653e4b9cdfcc2c1f6b69f63879c", "sha256": "b6663a935e80e679313a2a332f97a4b58fdfd922da552d7600419e54f15a875d" }, "downloads": -1, "filename": "draftable_compare_api-1.0.8.tar.gz", "has_sig": false, "md5_digest": "63104653e4b9cdfcc2c1f6b69f63879c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12893, "upload_time": "2017-05-05T23:52:00", "url": "https://files.pythonhosted.org/packages/40/f3/bfeda43c7601851993166b7bfd2f4cfdf57e70e95ec335186d3396ad570a/draftable_compare_api-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "9c824f00b6668c729db1c25468d35336", "sha256": "c320ac8731a695b7abd696b3f15ba957988ac3a42326d4103111c866a5f9589f" }, "downloads": -1, "filename": "draftable_compare_api-1.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9c824f00b6668c729db1c25468d35336", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 22146, "upload_time": "2017-06-15T18:13:15", "url": "https://files.pythonhosted.org/packages/0c/3c/3a2eca20e60710b572f3081a8d8c062df43de51ecfea64952594fe63e954/draftable_compare_api-1.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9fc58334d4b837e232dff4c0e684f2fe", "sha256": "fb50ddb668cecd81891ea1df1278a4e0ab2c8847d221cc7ca7d1bf2a8b9af310" }, "downloads": -1, "filename": "draftable_compare_api-1.0.9.tar.gz", "has_sig": false, "md5_digest": "9fc58334d4b837e232dff4c0e684f2fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12966, "upload_time": "2017-06-15T18:13:17", "url": "https://files.pythonhosted.org/packages/3a/ba/adc5f507a2b02798244eb3b7da2905d7c755dac2ac4ce68d798087eb7b86/draftable_compare_api-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9c824f00b6668c729db1c25468d35336", "sha256": "c320ac8731a695b7abd696b3f15ba957988ac3a42326d4103111c866a5f9589f" }, "downloads": -1, "filename": "draftable_compare_api-1.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9c824f00b6668c729db1c25468d35336", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 22146, "upload_time": "2017-06-15T18:13:15", "url": "https://files.pythonhosted.org/packages/0c/3c/3a2eca20e60710b572f3081a8d8c062df43de51ecfea64952594fe63e954/draftable_compare_api-1.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9fc58334d4b837e232dff4c0e684f2fe", "sha256": "fb50ddb668cecd81891ea1df1278a4e0ab2c8847d221cc7ca7d1bf2a8b9af310" }, "downloads": -1, "filename": "draftable_compare_api-1.0.9.tar.gz", "has_sig": false, "md5_digest": "9fc58334d4b837e232dff4c0e684f2fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12966, "upload_time": "2017-06-15T18:13:17", "url": "https://files.pythonhosted.org/packages/3a/ba/adc5f507a2b02798244eb3b7da2905d7c755dac2ac4ce68d798087eb7b86/draftable_compare_api-1.0.9.tar.gz" } ] }