{ "info": { "author": "Michal Charemza", "author_email": "michal@charemza.name", "bugtrack_url": null, "classifiers": [ "Framework :: AsyncIO", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# treelock [![CircleCI](https://circleci.com/gh/michalc/treelock.svg?style=svg)](https://circleci.com/gh/michalc/treelock) [![Maintainability](https://api.codeclimate.com/v1/badges/d0174cccc3f8974fa4e7/maintainability)](https://codeclimate.com/github/michalc/treelock/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/d0174cccc3f8974fa4e7/test_coverage)](https://codeclimate.com/github/michalc/treelock/test_coverage)\n\nFast read/write sub-tree locking for asyncio Python. Suitable for large trees, when it's not feasible or desired to have the entire tree in memory at once.\n\nInspired by the work of [Ritik Malhotra](https://people.eecs.berkeley.edu/~kubitron/courses/cs262a-F14/projects/reports/project6_report.pdf).\n\n\n## Installation\n\n```bash\npip install treelock\n```\n\n\n## Usage\n\nEach instance of `TreeLock` is callable, and returns an asynchronous context manager. In order to acquire a read (shared) lock on the sub-trees with root nodes in the iterable `read_roots`; and to acquire a write (exclusive) lock of the sub-trees with root nodes in the iterable `write_roots`, you must pass them to the instance of `TreeLock`:\n\n```python\nfrom treelock import TreeLock\n\nlock = TreeLock()\n\nasync def access(read_roots, write_roots):\n async with lock(read=read_roots, write=write_roots):\n # access the sub-trees\n```\n\nThe lock is _not_ re-entrant: the same task attempting to enter multiple context managers with incompatible sub-trees will deadlock. Hence the locks for all the required sub-trees must be requested up-front.\n\nA typical use-case will be for read/write (shared/exclusive) locking of a path in a filesystem hierarchy. For example, if treating S3 as a filesystem, but allowing what-whould-be non-atomic operations on folders.\n\nFor example, you could define `delete`, `write`, `rename`, `copy` and `read` operations on folders at certain paths, e.g. instances of `PurePosixPath`. A read lock of such a path should allow reads of the corresponding folder, but block all operations that would change it. A write lock should prevent all other access to that folder. You can do this using `TreeLock`, noting that each path is in fact a node in the tree of all possible paths.\n\n```python\nfrom treelock import TreeLock\n\nlock = TreeLock()\n\nasync def delete(path):\n async with lock(read=[], write=[path]):\n ...\n\nasync def write(path, ...):\n async with lock(read=[], write=[path]):\n ...\n\nasync def rename(path_from, path_to):\n async with lock(read=[], write=[path_from, path_to]):\n ...\n\nasync def copy(path_from, path_to):\n async with lock(read=[path_from], write=[path_to]):\n ...\n\nasync def read(path):\n async with lock(read=[path], write=[]):\n ...\n```\n\nThere is more information on this usage, as well as details of the underlying algorithm, at https://charemza.name/blog/posts/python/asyncio/s3-path-locking/.\n\n\n## Required properties of the nodes\n\nThese are a subset of the properties of [PurePosixPath](https://docs.python.org/3/library/pathlib.html#pathlib.PurePosixPath).\n\n- Each defines the `__cmp__` and `__hash__` methods. These are used for a dictionary internally, so `__hash__` must be reasonable enough to to acheive constant-time behaviour.\n\n- Each must define the `__lt__` method. This must be well-behaved, i.e. defines a total order between all possible nodes, otherwise deadlock can occur.\n\n- Each has a property `parents` that is an iterator to the ancestors of the node, in decreasing order according to `__lt__`. This is a slightly mis-named property, but this is consistent with PurePosixPath.\n\nNote that a node does not need to be aware of its child nodes. This makes `TreeLock` suitable for locking sub-trees below a node without knowledge of the descendants of that node.\n\n\n## Fast locking and unlocking\n\nThe number of operations to lock or unlock a node only depends on the ancestors of a node. Specifically, it does not increase as the number of descendants increase, nor does it increase with the number of locks currently being held.\n\n\n## Running tests\n\n```bash\npython setup.py test\n```\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/michalc/treelock", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "treelock", "package_url": "https://pypi.org/project/treelock/", "platform": "", "project_url": "https://pypi.org/project/treelock/", "project_urls": { "Homepage": "https://github.com/michalc/treelock" }, "release_url": "https://pypi.org/project/treelock/0.0.16/", "requires_dist": [ "fifolock" ], "requires_python": ">=3.5", "summary": "Fast read/write sub-tree locking for asyncio Python", "version": "0.0.16" }, "last_serial": 4546283, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "03576698de801ed340c500285309194d", "sha256": "f1370ac2cdd5dde11550a4c8d862d271e483f82537f9ebddacd1e6d775c117d5" }, "downloads": -1, "filename": "treelock-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "03576698de801ed340c500285309194d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 2816, "upload_time": "2018-11-24T16:39:22", "url": "https://files.pythonhosted.org/packages/3a/2a/0bed615106eb6cb568b24bd947099505c63d14965b4ed36c3c59294b19d1/treelock-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1cecd9ba6d73999991f787dd566adfb", "sha256": "304b08b61a941f789a11e3157df978864ae11f888a8913357b728fcf93c3e32e" }, "downloads": -1, "filename": "treelock-0.0.1.tar.gz", "has_sig": false, "md5_digest": "e1cecd9ba6d73999991f787dd566adfb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 1693, "upload_time": "2018-11-24T16:39:24", "url": "https://files.pythonhosted.org/packages/bc/ad/a9ddad3fe09aa9b118829b78d7104fd3df16f4d20f062685a2023679248f/treelock-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "127bc05ade52b163acf063aec7d85ced", "sha256": "1bf2a194a079d63015cb4535cb66d685673804e912b82031fc831ad0a1496e1f" }, "downloads": -1, "filename": "treelock-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "127bc05ade52b163acf063aec7d85ced", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4390, "upload_time": "2018-11-25T13:48:00", "url": "https://files.pythonhosted.org/packages/34/97/ea8fa573eb82089bc11219d9c7d31c1bb979a045f56e365e94105255ea5d/treelock-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a7345ce17b0f4aeb28a548910cf907b", "sha256": "db1d87832f2342f3a1a4eca3e8664aff86b0c559765ffc1dda02ec8d97a965d7" }, "downloads": -1, "filename": "treelock-0.0.10.tar.gz", "has_sig": false, "md5_digest": "3a7345ce17b0f4aeb28a548910cf907b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3508, "upload_time": "2018-11-25T13:48:02", "url": "https://files.pythonhosted.org/packages/e9/fe/324f588d10efed161766ec52b83dc6ae44005d49f831d9ebefad447c44bd/treelock-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "d21642524a58252ec9ace00d25d7e120", "sha256": "a3831fd972a69b7119960331cdf1d68fce0d87b45b4a9191321b8170c484dff9" }, "downloads": -1, "filename": "treelock-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "d21642524a58252ec9ace00d25d7e120", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4391, "upload_time": "2018-11-25T13:52:49", "url": "https://files.pythonhosted.org/packages/d3/74/59e9ccfe7169e600b64b11ac99930d144cf85206ebee3615892e6c854c1b/treelock-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e3972c76de81fafd626c1405200190c7", "sha256": "1bc6f41d023339a96f47c5557a5e204bcc8219bf93328cc7ac7586dc7cf37b5c" }, "downloads": -1, "filename": "treelock-0.0.11.tar.gz", "has_sig": false, "md5_digest": "e3972c76de81fafd626c1405200190c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3505, "upload_time": "2018-11-25T13:52:51", "url": "https://files.pythonhosted.org/packages/d9/b1/f80a5c1b152f574563b50ee514e6bf4d348b5023fd0adcb1e441a7f14350/treelock-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "4ba8f4342da8c121f0fb4b941173f25d", "sha256": "a0606e2202875ce6be15b6c62592af0a5509be739c4b46d71427cc80223ebec8" }, "downloads": -1, "filename": "treelock-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "4ba8f4342da8c121f0fb4b941173f25d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4472, "upload_time": "2018-11-27T21:54:26", "url": "https://files.pythonhosted.org/packages/2c/f6/c842a20ff747492409927487fe6a3a1530496430bfe5bf379b3f5f3aa863/treelock-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f87d0b9c9c7b357ff047fbc77796f86b", "sha256": "cd1117fabda2c0e0fe2d726f302c1e5f01e0667934704ba7f356d737db6329b6" }, "downloads": -1, "filename": "treelock-0.0.12.tar.gz", "has_sig": false, "md5_digest": "f87d0b9c9c7b357ff047fbc77796f86b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3587, "upload_time": "2018-11-27T21:54:27", "url": "https://files.pythonhosted.org/packages/e1/56/646f7e6508e24497a3912889b774d9f73e4c9c58be0d9b3e995b91686ef7/treelock-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "3ae07bb9ca9e24b795b0005eaa9c661e", "sha256": "742e7f372606b3cc494c69db794139b639e8204c0cb41f1e37eff52628c01615" }, "downloads": -1, "filename": "treelock-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "3ae07bb9ca9e24b795b0005eaa9c661e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4471, "upload_time": "2018-11-29T08:02:28", "url": "https://files.pythonhosted.org/packages/df/cc/c33a0e534da707a5f76b09077a436a33bd57f52410445718d46d25ce9582/treelock-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e979f78071325d019c4436e2c852d48e", "sha256": "65804bd2ce636636bb3add8d3b1dce2c64c622e9255388c4345fd977d7f0800b" }, "downloads": -1, "filename": "treelock-0.0.13.tar.gz", "has_sig": false, "md5_digest": "e979f78071325d019c4436e2c852d48e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3589, "upload_time": "2018-11-29T08:02:29", "url": "https://files.pythonhosted.org/packages/32/17/3b8195b6eeb07d68ccfb67cbb6c86b3200f60692da8282f05d52d646ea65/treelock-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "e1c3268bd18b8feb8ac2d3466071275d", "sha256": "d25b0d2faf7809b9a1d213ac1df4765aef12d9b3de6a4959aa59a588037f3f8d" }, "downloads": -1, "filename": "treelock-0.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "e1c3268bd18b8feb8ac2d3466071275d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4568, "upload_time": "2018-11-29T21:32:20", "url": "https://files.pythonhosted.org/packages/38/16/a093cddb0f109cd9e95c84c65a332dd4a66902dff249386a0b27410b3d01/treelock-0.0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab234310bdc5df8c79c47244582f5f1a", "sha256": "77e8f9f44bd1c9bc45a24991e429a6fc2b33ff19dcd8c80c95d92f8768628725" }, "downloads": -1, "filename": "treelock-0.0.14.tar.gz", "has_sig": false, "md5_digest": "ab234310bdc5df8c79c47244582f5f1a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3672, "upload_time": "2018-11-29T21:32:22", "url": "https://files.pythonhosted.org/packages/ef/b7/115f4c5d58ddf62f163c5e7a449b024ef7886d2ffd684edd1e67d73cd955/treelock-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "61607362b4f613b50deee908b3f5c29c", "sha256": "f9c2b28f2e5e39915a763aca45d1c57b718ce6d79eda152889f756e3e98aeabf" }, "downloads": -1, "filename": "treelock-0.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "61607362b4f613b50deee908b3f5c29c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4570, "upload_time": "2018-11-29T22:12:18", "url": "https://files.pythonhosted.org/packages/ee/6e/4a0f43f7e7759ec7fa2fa832afa38f7ff3525b8adc2744a2fad95a5d213d/treelock-0.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f1214c0306e355d93da4e3a2693ff304", "sha256": "1e203e361405110e3b30abb2f6033490b3d2bfb85faa07cddb5d6dddb432fa03" }, "downloads": -1, "filename": "treelock-0.0.15.tar.gz", "has_sig": false, "md5_digest": "f1214c0306e355d93da4e3a2693ff304", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3680, "upload_time": "2018-11-29T22:12:19", "url": "https://files.pythonhosted.org/packages/6b/63/bd12b4dbd584c660a05a7ad5f395c9df4ac95182da5d21cec907df731114/treelock-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "579a7dcfb2b51c4e1f6ba0a05e308318", "sha256": "e2f6db30aa5a7dc94c0a83c1479241ac372bcac8fde8528d60accff393bf7170" }, "downloads": -1, "filename": "treelock-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "579a7dcfb2b51c4e1f6ba0a05e308318", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4603, "upload_time": "2018-11-30T08:50:14", "url": "https://files.pythonhosted.org/packages/b2/05/07bfc4dd92d6a6caca80d8110221fd8d8fdb4819820d43fd8d2dfd47aa5c/treelock-0.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ff4268f60754469e84a73182c0b3f00", "sha256": "833e483ea17d42b6b5f22e3c21b8007be5bb1f50911f5c337d88a54cf4dfb82d" }, "downloads": -1, "filename": "treelock-0.0.16.tar.gz", "has_sig": false, "md5_digest": "9ff4268f60754469e84a73182c0b3f00", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3721, "upload_time": "2018-11-30T08:50:16", "url": "https://files.pythonhosted.org/packages/da/73/13df8eb65cf0fe23b1a6386e4ab17f21721e035d4039793cb246dbe045ec/treelock-0.0.16.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "4f89ae21a4002108641892eadc89b013", "sha256": "3cf467e90b84cf3c87415683c9b607e8136e8cd636a983d9a7eb09e3f33defae" }, "downloads": -1, "filename": "treelock-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4f89ae21a4002108641892eadc89b013", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 3995, "upload_time": "2018-11-24T20:31:17", "url": "https://files.pythonhosted.org/packages/a7/67/5609cb1067d46824028afa62d7047889d9fbfc033f52451aa2d653b0eeb7/treelock-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d6587cbf76d5554c2d47227f3c739e68", "sha256": "75d9edd667cf50234b342473a13fbf591b2cabfd91c5a2da30136fc43de45cc5" }, "downloads": -1, "filename": "treelock-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d6587cbf76d5554c2d47227f3c739e68", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3080, "upload_time": "2018-11-24T20:31:19", "url": "https://files.pythonhosted.org/packages/b7/30/3b4fad287f2d8f1d8b866d735c5d87287ce978745967342c818420c23e18/treelock-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "f6afed7c8720dc598dfd5469a76379fe", "sha256": "18acfcf2e641859897db4168fcf6f15e16d0727fd33f475212c26e79d22e7b65" }, "downloads": -1, "filename": "treelock-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f6afed7c8720dc598dfd5469a76379fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 3994, "upload_time": "2018-11-24T20:35:14", "url": "https://files.pythonhosted.org/packages/7f/ac/dcb7dd416115a506101edabfc71e9d13a0d690f98975d830f75353e23ad2/treelock-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "527bda3bc1548201c301b308618a1d65", "sha256": "09de694df910de3734260a120cdc4ba1908ac318c659342e9a1093c4d7e35938" }, "downloads": -1, "filename": "treelock-0.0.3.tar.gz", "has_sig": false, "md5_digest": "527bda3bc1548201c301b308618a1d65", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3081, "upload_time": "2018-11-24T20:35:15", "url": "https://files.pythonhosted.org/packages/86/8a/51182aaed9d16050ee59cd5c0b8f0ce40adee071db499a37567890b02598/treelock-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "a90b9032df42efed3c2cdb64bdced8f1", "sha256": "0e9beb4101de62f42169fda4376930ef232549b0667004236f4106ffa455950a" }, "downloads": -1, "filename": "treelock-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "a90b9032df42efed3c2cdb64bdced8f1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 3994, "upload_time": "2018-11-24T20:48:28", "url": "https://files.pythonhosted.org/packages/de/65/c5e46e0f800729248234bdc84dd05d9f16ac14d664d0a40a8292aa191299/treelock-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d6794c286c0d96fda5779eeaf71d2041", "sha256": "a346b191f4822e8374472e3de5e443ddcf7e693eafa93919c73aa139b4c26d6c" }, "downloads": -1, "filename": "treelock-0.0.4.tar.gz", "has_sig": false, "md5_digest": "d6794c286c0d96fda5779eeaf71d2041", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3081, "upload_time": "2018-11-24T20:48:29", "url": "https://files.pythonhosted.org/packages/9b/8c/6cb390bb5617455639437411a823226b342cfda188e4b124203478662798/treelock-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "58db0df2cdd7d874a334fe08dbcca8ca", "sha256": "772d205b04d1fece29a5d2ed4a72b6260d546366d168e666c7afae106076f288" }, "downloads": -1, "filename": "treelock-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "58db0df2cdd7d874a334fe08dbcca8ca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4087, "upload_time": "2018-11-24T22:15:01", "url": "https://files.pythonhosted.org/packages/4b/fd/67a0c1c1e92e224c26c9366034678cbb93cbe56911a2f6c658292ed70677/treelock-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddc6de970e92088666e67dc1acfc0486", "sha256": "e1a181345ad2a7983dbdc3ceb7959603056e11d8e302c80638af8da01f6d7918" }, "downloads": -1, "filename": "treelock-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ddc6de970e92088666e67dc1acfc0486", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3181, "upload_time": "2018-11-24T22:15:03", "url": "https://files.pythonhosted.org/packages/1a/c4/df7acf4f645f2ed6402dd67ad472745baf0cf96d5abf8e126bef6e1b53a5/treelock-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "8e3de726cef782bb6c93a38bea9bfa21", "sha256": "ae06dfb4b6ec81860dd78195dd957213037dc4e226f5953524cf412a690d904e" }, "downloads": -1, "filename": "treelock-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "8e3de726cef782bb6c93a38bea9bfa21", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4088, "upload_time": "2018-11-25T08:21:07", "url": "https://files.pythonhosted.org/packages/ab/96/a6bf6f8856992736e6f98563bdfec3619d0d51ca23d15efcc114e5735705/treelock-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc94410e1c5e415bec5bd71d20b927a4", "sha256": "c95ea4dacd67cd2ef56af4086ed42224829075fefaf37f5981c38cd67367a6f1" }, "downloads": -1, "filename": "treelock-0.0.6.tar.gz", "has_sig": false, "md5_digest": "cc94410e1c5e415bec5bd71d20b927a4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3186, "upload_time": "2018-11-25T08:21:08", "url": "https://files.pythonhosted.org/packages/2c/6a/a8d8878d82f20f38cdb85ba2741f30e0ab06aeff754bc314bf497781f007/treelock-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "d6db27507b6cd79a59003761789de1f2", "sha256": "b2305b45c5b5c94893b0ce2c1954eed143a6fcdc2b21556f6472b34624d05930" }, "downloads": -1, "filename": "treelock-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "d6db27507b6cd79a59003761789de1f2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4086, "upload_time": "2018-11-25T08:56:27", "url": "https://files.pythonhosted.org/packages/f4/7b/4edc1ca437c1752ac7866a992ad8d2c24912c4a4b41202aeb1874cda4fb0/treelock-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58dd1e494323efb997613d86bcf9e357", "sha256": "3ddda1197f358bb08dff488a4e07a053af6c1692351ae6dc17508efd33a1aaa1" }, "downloads": -1, "filename": "treelock-0.0.7.tar.gz", "has_sig": false, "md5_digest": "58dd1e494323efb997613d86bcf9e357", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3185, "upload_time": "2018-11-25T08:56:28", "url": "https://files.pythonhosted.org/packages/4a/47/33a8c2b4d740317c3c2feae767177439adaca9190554dbf59d416476ebfa/treelock-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "32cee7dd3ddac4b8a7f7db967916d523", "sha256": "d01e34802ce7afa0af084805c5d24d01f0cf876a71a414acc2ea2e8fa01f09a0" }, "downloads": -1, "filename": "treelock-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "32cee7dd3ddac4b8a7f7db967916d523", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4114, "upload_time": "2018-11-25T09:23:20", "url": "https://files.pythonhosted.org/packages/70/c5/0dbf3bd9dc2d5f96e56580f62b24b807afdde4199e3437dc5c7bc2a27ffb/treelock-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af3b31a31329867b6b60f307a56dd509", "sha256": "6add371c6516ea303025cf1580323cf729ba832e786c29602ad811433c74d7a6" }, "downloads": -1, "filename": "treelock-0.0.8.tar.gz", "has_sig": false, "md5_digest": "af3b31a31329867b6b60f307a56dd509", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3211, "upload_time": "2018-11-25T09:23:22", "url": "https://files.pythonhosted.org/packages/19/c7/8f18af1b144f78af98ec1e907c7346858a729f16bfd1c4602cf532a25ae4/treelock-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "c2cd2c6ce6cf5d1819ec6f99fb3cec23", "sha256": "2b4ca47e3169745edb18fbd618c587e58bea50baaeef8fc8c88407032efab683" }, "downloads": -1, "filename": "treelock-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "c2cd2c6ce6cf5d1819ec6f99fb3cec23", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 4359, "upload_time": "2018-11-25T13:45:37", "url": "https://files.pythonhosted.org/packages/1f/49/1ece27291ae771e96c0c78b966d4f05dc09f06809ddedfcd6d17c67e0739/treelock-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b91557cdf791694c5ab2c94030d646c6", "sha256": "d8a2e2ba94c7d8fdae16edeb1454b6e003194ca5827e249e30635ddfaa0e0e64" }, "downloads": -1, "filename": "treelock-0.0.9.tar.gz", "has_sig": false, "md5_digest": "b91557cdf791694c5ab2c94030d646c6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 3477, "upload_time": "2018-11-25T13:45:38", "url": "https://files.pythonhosted.org/packages/72/81/62063bde60c6e9584a55b33700d36c7c347f530ce2b3924b4f8b22e575e0/treelock-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "579a7dcfb2b51c4e1f6ba0a05e308318", "sha256": "e2f6db30aa5a7dc94c0a83c1479241ac372bcac8fde8528d60accff393bf7170" }, "downloads": -1, "filename": "treelock-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "579a7dcfb2b51c4e1f6ba0a05e308318", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4603, "upload_time": "2018-11-30T08:50:14", "url": "https://files.pythonhosted.org/packages/b2/05/07bfc4dd92d6a6caca80d8110221fd8d8fdb4819820d43fd8d2dfd47aa5c/treelock-0.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ff4268f60754469e84a73182c0b3f00", "sha256": "833e483ea17d42b6b5f22e3c21b8007be5bb1f50911f5c337d88a54cf4dfb82d" }, "downloads": -1, "filename": "treelock-0.0.16.tar.gz", "has_sig": false, "md5_digest": "9ff4268f60754469e84a73182c0b3f00", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3721, "upload_time": "2018-11-30T08:50:16", "url": "https://files.pythonhosted.org/packages/da/73/13df8eb65cf0fe23b1a6386e4ab17f21721e035d4039793cb246dbe045ec/treelock-0.0.16.tar.gz" } ] }