{
"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 [](https://circleci.com/gh/michalc/treelock) [](https://codeclimate.com/github/michalc/treelock/maintainability) [](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"
}
]
}