{ "info": { "author": "Scott Colby", "author_email": "scolby33@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Framework :: AsyncIO", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Topic :: Utilities" ], "description": "folderhash |python_versions| |license| |library|\n================================================\nCompare folder contents via hash.\nFile I/O and hashing are done in threads using the `Curio `_ library to make the comparison as speedy as possible!\n\nI use :code:`folderhash` for extra assurance that large or important file copies have been performed accurately.\n\n.. |python_versions| image:: https://img.shields.io/badge/python->%3D3.6-blue.svg?style=flat-square\n :alt: Supports Python 3.6\n.. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square\n :alt: MIT License\n.. |library| image:: https://img.shields.io/badge/async-curio-blue.svg?style=flat-square\n :target: https://curio.readthedocs.io/\n :alt: Uses the Curio async library\n\n\nInstallation\n------------\nInstallation from PyPI should be easy:\n\n.. code-block:: sh\n\n $ pip install folderhash\n\n:code:`folderhash` supports only Python 3.6 or later.\n\nDemo\n----\n\n.. code-block:: console\n\n $ mkdir -p /tmp/demo/a /tmp/demo/b # just some setup\n $ cd /tmp/demo\n $ touch a/a a/b a/c b/a b/b b/d\n $ echo \"DIFFERENT CONTENT\" >> a/b\n\n $ folderhash a b # the simplest case--compare two folders\n 9fb5d41e2533b73381bdde8e3ac2d60a6a18467674771187595d83e9bfa30909 a/b\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a b/b\n\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a a/c\n ABSENT b/c\n\n ABSENT a/d\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a b/d\n\n $ # you can change the hash algorithm!\n $ # all of the algorithms in your Python's `hashlib` are available\n $ # default is sha3_256\n $ folderhash -s md5 a b \n 128edd12d0b04e23d10c4747d0da2c03 a/b\n d41d8cd98f00b204e9800998ecf8427e b/b\n\n d41d8cd98f00b204e9800998ecf8427e a/c\n ABSENT b/c\n\n ABSENT a/d\n d41d8cd98f00b204e9800998ecf8427e b/d\n\n $ # it works with relative paths, too\n $ cd a\n $ folderhash . ../b\n 9fb5d41e2533b73381bdde8e3ac2d60a6a18467674771187595d83e9bfa30909 ./b\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a ../b/b\n\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a ./c\n ABSENT ../b/c\n\n ABSENT ./d\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a ../b/d\n\n $ # you can do the hashing separately and compare at a later time\n $ # absolute paths are always shown here\n $ cd ..\n $ folderhash a > a.txt\n $ folderhash b > b.txt\n $ folderhash -a a.txt -b b.txt\n 9fb5d41e2533b73381bdde8e3ac2d60a6a18467674771187595d83e9bfa30909 /tmp/demo/a/b\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a /tmp/demo/b/b\n\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a /tmp/demo/a/c\n ABSENT /tmp/demo/b/c\n\n ABSENT /tmp/demo/a/d\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a /tmp/demo/b/d\n\n $ # the format of the hash files is simple: {hash_value}{full_path}\n $ cat a.txt\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a /tmp/demo/a/a\n 9fb5d41e2533b73381bdde8e3ac2d60a6a18467674771187595d83e9bfa30909 /tmp/demo/a/b\n a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a /tmp/demo/a/c\n\nChangelog\n---------\n\nChanges as of 8 August 2017\n\n1.0.1 <8 August 2017>\n^^^^^^^^^^^^^^^^^^^^^\n\n- Some readme fixes\n- Change the PyPI development status classifier from Beta to Production/Stable\n- Show paths relative to the input argument instead of absolute paths when producing output. I think it's easier to understand this way.\n- Add some error checking for input of empty hash files\n\n1.0.0 <7 August 2017>\n^^^^^^^^^^^^^^^^^^^^^\n\n- Initial stable release to PyPI!\n\nContributing\n------------\nThere are many ways to contribute to an open-source project, but the two most common are reporting bugs and contributing code.\n\nIf you have a bug or issue to report, please visit the `issues page on Github `_ and open an issue there.\n\nLicense\n-------\n\nMIT. See the :code:`LICENSE.rst` file for more information.\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/scolby33/folderhash", "keywords": "filesystem,diff,hash", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "folderhash", "package_url": "https://pypi.org/project/folderhash/", "platform": "", "project_url": "https://pypi.org/project/folderhash/", "project_urls": { "Homepage": "https://github.com/scolby33/folderhash" }, "release_url": "https://pypi.org/project/folderhash/1.0.1/", "requires_dist": [ "curio", "docopt" ], "requires_python": "", "summary": "Compare folder contents via hash.", "version": "1.0.1" }, "last_serial": 3080445, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "c8b46cb05eb0621adabefb41026e2b80", "sha256": "4fd32e212a74a8b44d7ac4cfd01b52d3d85c48d9f9361577cd6b7261c4dddcaa" }, "downloads": -1, "filename": "folderhash-1.0.0-py36-none-any.whl", "has_sig": false, "md5_digest": "c8b46cb05eb0621adabefb41026e2b80", "packagetype": "bdist_wheel", "python_version": "py36", "requires_python": null, "size": 8389, "upload_time": "2017-08-08T01:22:44", "url": "https://files.pythonhosted.org/packages/3c/b9/89f7d874dcd4caa9f39c47e3a4eaddd646a1505e85a2f82d66129e5c15fd/folderhash-1.0.0-py36-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b57141f7d49f2c89a63db620628e1e0", "sha256": "4b33c31dbc13b39a3bd25b1d47fe9cced6ef8246b96a37b0e4e319239b36eb8f" }, "downloads": -1, "filename": "folderhash-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4b57141f7d49f2c89a63db620628e1e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7340, "upload_time": "2017-08-08T01:22:45", "url": "https://files.pythonhosted.org/packages/4f/c5/32d223106192b7cc5fb818e27a43a810d338188b924bc61cf7517b9c63fc/folderhash-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "657b3a6b13488d3829b482b2d3cf41f0", "sha256": "d4eba02d713acd238a79c83860e173db837472017623ac509737056e21d9c2b1" }, "downloads": -1, "filename": "folderhash-1.0.1-py36-none-any.whl", "has_sig": false, "md5_digest": "657b3a6b13488d3829b482b2d3cf41f0", "packagetype": "bdist_wheel", "python_version": "py36", "requires_python": null, "size": 9021, "upload_time": "2017-08-08T08:29:41", "url": "https://files.pythonhosted.org/packages/65/2d/aab960c1ae83df0c47bb4fcebe202a1f50d6a991c7bfdbb0f5fda9cc88d6/folderhash-1.0.1-py36-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76b6f6635a2f05de14ae4d6861100cd0", "sha256": "2192716be457828e348a06441276d132b75a279ab00320b27cd9421bf824dfd4" }, "downloads": -1, "filename": "folderhash-1.0.1.tar.gz", "has_sig": false, "md5_digest": "76b6f6635a2f05de14ae4d6861100cd0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7770, "upload_time": "2017-08-08T08:29:42", "url": "https://files.pythonhosted.org/packages/16/b4/176bf6bcc3f69c7dea644694428daed6a97351d2356de9cd07128b93f981/folderhash-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "657b3a6b13488d3829b482b2d3cf41f0", "sha256": "d4eba02d713acd238a79c83860e173db837472017623ac509737056e21d9c2b1" }, "downloads": -1, "filename": "folderhash-1.0.1-py36-none-any.whl", "has_sig": false, "md5_digest": "657b3a6b13488d3829b482b2d3cf41f0", "packagetype": "bdist_wheel", "python_version": "py36", "requires_python": null, "size": 9021, "upload_time": "2017-08-08T08:29:41", "url": "https://files.pythonhosted.org/packages/65/2d/aab960c1ae83df0c47bb4fcebe202a1f50d6a991c7bfdbb0f5fda9cc88d6/folderhash-1.0.1-py36-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76b6f6635a2f05de14ae4d6861100cd0", "sha256": "2192716be457828e348a06441276d132b75a279ab00320b27cd9421bf824dfd4" }, "downloads": -1, "filename": "folderhash-1.0.1.tar.gz", "has_sig": false, "md5_digest": "76b6f6635a2f05de14ae4d6861100cd0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7770, "upload_time": "2017-08-08T08:29:42", "url": "https://files.pythonhosted.org/packages/16/b4/176bf6bcc3f69c7dea644694428daed6a97351d2356de9cd07128b93f981/folderhash-1.0.1.tar.gz" } ] }