{ "info": { "author": "Timothy Corbett-Clark", "author_email": "timothy.corbettclark@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# File Replicator\n\nReplicate files one-way to another computer e.g. for remote development.\n\nA key use-case is to keep in sync a directory of development files from a computer on which\nthe files are edited with a copy of those files in a docker container running on a remote docker host.\n\nTested and known to work between two Linux machines. Support for developing on macOS coming...\n\n# Installation\n\nDependencies are:\n* Python 3 and some Python packages on the development machine.\n* Ability to run a shell (bash or bash-like) on the remote machine with connected `stdin`.\n* The tar utility (the full version, not the busybox version) on both machines.\n\nNote that nothing is installed remotely, there are no ports to open, and the remote user only needs\nthe ability to create the files and directories at the specified location.\n\nSo to install `file-replicator` on the machine with the source files to replicate:\n\n pip install file-replicator\n\nNothing needs to be installed on the destination machine so long as it has `bash`\n(busybox bash is fine) and `tar` (gnu). Note that on alpine linux, the busybox tar\nis insufficient, so install gnu tar with:\n\n apk install tar\n\n# How it works\n\nThe approach involves running a small bash program on the remote (destination) end which is able to\nadd/update new files in (potentially) new directories. It receives these files over `stdin`\nusing the `tar` format (binary).\n\nThe controlling (source) end then simply sends files over to the `stdin` of the receiving bash\nprogram, which pipes them through `tar` to unpack them again. Note that gnu `tar` is able to extract from\nnon-blocking file descriptor (as well as blocking), which means it keeps trying until it has all the data.\nNB the busybox tar does not have this behaviour.\n\nEstablishing the connection to the remote end is outside the remit of the tool, but `file-replicator`\nrequires as an argument the command to make such a connection. See examples below.\n\nOnce a connection has been made, two phases of operation occur:\n\n1. first, recursively walk a source tree of files and send them \"over the wire\" to the destination\n2. then, watch for changes or new files and directories before sending them \"over the wire\" to the destination\n\nSo there is no \"difference algorithm\" like rsync, no attempt to compress (although of course the connection\ncould already be compressing e.g. if over ssh), the connection is made entirely using standard means like\nssh and docker, there are no ports to open, and even the bash program on the remote end is sent over every time\nso nothing is installed remotely.\n\nThis is sufficient for editing code on a local computer and automatically replicating them to a\nremote server or docker container whenever a file is created or modified.\n\n# Usage and examples\n\nSee help with `file-replicate --help`:\n\n Usage: file-replicator [OPTIONS] SRC_DIR DEST_PARENT_DIR \\\n [CONNECTION_COMMAND]...\n\n Replicate files to another computer e.g. for remote development.\n\n SRC_DIR is the source directory on this machine.\n\n DEST_PARENT_DIR is the (absolute) destination parent directory on the\n remote machine accessed using the CONNECTION_COMMAND.\n\n The CONNECTION_COMMAND must result in a running instance of bash ready to\n receive commands on stdin.\n\n Example CONNECTION_COMMANDs include:\n\n ssh some.host.com bash\n\n docker exec -i my_container bash\n\n docker-compose exec -T my_container bash\n\n So a full use of the tool might look like:\n\n file-replicator my_code_dir /home/code -- docker exec -i a_container bash\n\n (the use of \"--\" prevents any further processing of command line arguments\n by file-replicator, leaving them all for docker)\n\n Initially, all files and required directories are recursively copied. Then\n it waits for changes before copying each modified or new file. This can be\n modified with the switches.\n\n Note that empty directories are not replicated until they contain a file.\n\n Options:\n --clean-out-first Optionally start by cleaning out the\n destination directory.\n --with-initial-replication / --no-initial-replication\n Perform (or not) an initial replication of\n all files.\n --replicate-on-change / --no-replicate-on-change\n Perform (or not) a wait-for-change-and-\n replicate cycle.\n --gitignore / --no-gitignore Use .gitignore (or not) to filter files.\n --debugging Print debugging information.\n --version Show the version and exit.\n --help Show this message and exit.\n\nFor example, to replicate files from local directory `my_project_dir` to directory\n`/home/code/my_project_dir` on remote machine called `my.server.com`:\n\n file-replicator my_project_dir /home/code ssh my.server.com bash\n\nAs another example, to replicate files from local directory `my_project_dir` to directory\n`/home/code/my_project_dir` in a running docker container called `my_container` on a potentially\nremote host (depending upon the `DOCKER*` environment variables e.g. as set by `docker-machine eval`):\n\n file-replicator my_project_dir /home/code -- docker exec -i my_container bash\n\nOr to do the same but using `docker-compose` instead:\n\n file-replicator my_project_dir /home/code -- docker-compose exec -T my_container bash\n\nLastly, as a degenerate example which doesn't actually connect to a remote machine at all\nbut replicates into the local `/tmp/my_project_dir`:\n\n file-replicator my_project_dir /tmp bash\n\nThe unit tests use this degenerate approach to test the tool.\n\n# Limitations\n\nDue to limitations with inotify (race conditions around watching for changes in newly created directories), it\nis possible that the watching-for-changes phase becomes out of step. In which case, just restart the whole program.\nThe tool includes some self-restarting behaviour, but ultimately a full restart may sometimes be needed.\n\nInformation printed to stdout indicates when this happens.\n\n# Tests\n\n ============================= test session starts ==============================\n platform linux -- Python 3.6.7, pytest-3.10.1, py-1.8.0, pluggy-0.12.0 -- /home/tcorbettclark/.cache/pypoetry/virtualenvs/file-replicator-py3.6/bin/python\n cachedir: .pytest_cache\n rootdir: /home/tcorbettclark/code/file-replicator, inifile:\n collecting ... collected 8 items\n\n tests/test_lib.py::test_empty_directories_are_copied PASSED [ 12%]\n tests/test_lib.py::test_copy_one_file PASSED [ 25%]\n tests/test_lib.py::test_copy_file_with_unusual_characters_in_name PASSED [ 37%]\n tests/test_lib.py::test_make_missing_parent_directories PASSED [ 50%]\n tests/test_lib.py::test_replicate_all_files PASSED [ 62%]\n tests/test_lib.py::test_detect_and_copy_new_file PASSED [ 75%]\n tests/test_lib.py::test_detect_and_copy_modified_file PASSED [ 87%]\n tests/test_lib.py::test_detect_and_copy_new_file_in_new_directories PASSED [100%]\n\n =========================== 8 passed in 4.00 seconds ===========================\n\n# Contributions\n\nPull-requests are welcome! Please consider including tests and updating docs at the same time.\n\nThe package is maintained using poetry (https://poetry.eustace.io) and pyenv (https://github.com/pyenv/pyenv).\n\nThe code is formatted using black (https://black.readthedocs.io/en/stable) and isort (https://github.com/timothycrosley/isort).\n\nIt is tested using pytest (https://pytest.org).\n\n# Commit checklist\n\n1. `isort -rc .`\n1. `black .`\n1. `pytest -v`\n1. clock version in `pyproject.toml`\n1. clock version in `file_replicator/__init__.py`\n1. `git tag`\n1. update this README.md with the latest output from the tests\n1. update this README.md with the latest output from the --help option\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/tcorbettclark/file-replicator", "keywords": "development,copying,replication,synchronisation,sync,files", "license": "MIT", "maintainer": "Timothy Corbett-Clark", "maintainer_email": "timothy.corbettclark@gmail.com", "name": "file-replicator", "package_url": "https://pypi.org/project/file-replicator/", "platform": "", "project_url": "https://pypi.org/project/file-replicator/", "project_urls": { "Homepage": "https://github.com/tcorbettclark/file-replicator" }, "release_url": "https://pypi.org/project/file-replicator/0.1.11/", "requires_dist": [ "inotify (>=0.2.10,<0.3.0)", "click (>=7.0,<8.0)", "pathspec (>=0.5.9,<0.6.0)" ], "requires_python": ">=3.6,<4.0", "summary": "Replicate files to another computer for remote development", "version": "0.1.11" }, "last_serial": 5438222, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "371a58d203741c0d12c8b4553efdd51d", "sha256": "36969559a86fa439452383dfd775480471801eb8515e8b3c0f3b2e2fad675443" }, "downloads": -1, "filename": "file_replicator-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "371a58d203741c0d12c8b4553efdd51d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10382, "upload_time": "2019-01-07T19:38:31", "url": "https://files.pythonhosted.org/packages/e3/e7/a43af8cf3bfffa949a3406cba3c6156a26f387f3c45f85ac3fec2cb43544/file_replicator-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1fd88f8d9f92c17a33db98804a115ba", "sha256": "98daee82d9d0b6f59338e5f2df9df6b5cd780b296e1be869953443f746f6fe8a" }, "downloads": -1, "filename": "file-replicator-0.1.0.tar.gz", "has_sig": false, "md5_digest": "a1fd88f8d9f92c17a33db98804a115ba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 4490, "upload_time": "2019-01-07T19:38:29", "url": "https://files.pythonhosted.org/packages/7e/cf/e4e0c35a7a2f3ef66188d0aea239c8e65a344fe3d513a0826f5157b83ce5/file-replicator-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "3e84f909ed0f625eb2af88f5ff461392", "sha256": "a162948788b723efb8c405f1490ef789cce10ebe4935cf3f55be101bd0f31e51" }, "downloads": -1, "filename": "file_replicator-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3e84f909ed0f625eb2af88f5ff461392", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12082, "upload_time": "2019-01-07T19:48:08", "url": "https://files.pythonhosted.org/packages/2c/0f/7b0ddf2586ee22e952f16aab074a6f76da4a5153a65555a45401acc0216c/file_replicator-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db94a2aa2aac492a04e4266664f01692", "sha256": "2c0c30ecbd4414b1bee2c154c123afe198a455398c2186dc3235aff738652bbb" }, "downloads": -1, "filename": "file-replicator-0.1.1.tar.gz", "has_sig": false, "md5_digest": "db94a2aa2aac492a04e4266664f01692", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6473, "upload_time": "2019-01-07T19:48:06", "url": "https://files.pythonhosted.org/packages/07/a1/9891efd49b5a6a2962c58e4dd07997c28d0ad2c7e8e7c923701994e2613a/file-replicator-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "a72d10fc629dfc2cb4ae26d9d4651959", "sha256": "7ce3e562d3e4856d0ab3b1bca78e980aaaedc6a688208d4c52162fc4adf371ca" }, "downloads": -1, "filename": "file_replicator-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a72d10fc629dfc2cb4ae26d9d4651959", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 14878, "upload_time": "2019-01-13T14:37:03", "url": "https://files.pythonhosted.org/packages/8e/54/c3ad2feb509c4ab0f1474298723b2de1f3879a05a4389711728b1472464f/file_replicator-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0a520cd11d3cb543543f8a0f0d573cd6", "sha256": "ca08a659e55dd4996021c2bfa5ccac88a30d976da77416210f050982956690d3" }, "downloads": -1, "filename": "file-replicator-0.1.10.tar.gz", "has_sig": false, "md5_digest": "0a520cd11d3cb543543f8a0f0d573cd6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8075, "upload_time": "2019-01-13T14:37:01", "url": "https://files.pythonhosted.org/packages/55/82/310724ed64e97419cd0fe302161fad0034ad8f7c578415a3ab07e75edb39/file-replicator-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "c2ee513be0adc2e9591ee7840717fdbe", "sha256": "acf2b79160b70dae9e24e50e0d0f429e91a8853c2de6351b1875e73750588a0a" }, "downloads": -1, "filename": "file_replicator-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "c2ee513be0adc2e9591ee7840717fdbe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 9275, "upload_time": "2019-06-23T20:49:31", "url": "https://files.pythonhosted.org/packages/ad/71/a66973f50f9f682d11a3648de36173e41676ab2a99880df16dbd887e1327/file_replicator-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "45d72a4ab64b65dcee5af5d9445fdda2", "sha256": "d7e1bcf031a4fe29eb286ea65e604c9a6a9240d74e85a3337fd1d15cdcbd7c36" }, "downloads": -1, "filename": "file-replicator-0.1.11.tar.gz", "has_sig": false, "md5_digest": "45d72a4ab64b65dcee5af5d9445fdda2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8968, "upload_time": "2019-06-23T20:49:29", "url": "https://files.pythonhosted.org/packages/9d/11/5a763a0cef8884b67e9f81812847d3dd90ec7195fe38352b209f5a66a006/file-replicator-0.1.11.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "fabf6e20373690c1c5b93efcbdfd9051", "sha256": "2fdb6d4032594ce8a84f8ec321e614ed79be5bb3e6cc0cc09ea1c252d8c970b8" }, "downloads": -1, "filename": "file_replicator-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "fabf6e20373690c1c5b93efcbdfd9051", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12947, "upload_time": "2019-01-08T01:21:09", "url": "https://files.pythonhosted.org/packages/b4/f5/5c1818a3ad086b469c7d85902137ff9de666bae8c88ebba0e39840b6079c/file_replicator-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3799cda22633ef58410661c815ec739e", "sha256": "eecb64f2980bc19265b0df1a58154ba4231069ed2dfa8df36cee9266c1c08f84" }, "downloads": -1, "filename": "file-replicator-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3799cda22633ef58410661c815ec739e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7176, "upload_time": "2019-01-08T01:21:08", "url": "https://files.pythonhosted.org/packages/16/fb/54261e8a65405089298d6618a06a3e9d4aadfe52726fe9e04f0a95565d4e/file-replicator-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "dc1f1f671b32f7201c946714cb9cc389", "sha256": "1406bc76d2178feec949900cc3a077145450ef0cfe1f93c726143e7c7fe95afa" }, "downloads": -1, "filename": "file_replicator-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "dc1f1f671b32f7201c946714cb9cc389", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13025, "upload_time": "2019-01-08T03:39:51", "url": "https://files.pythonhosted.org/packages/65/0c/71f8a50ba82037ee43eee614bf3ba454369f7e1680ecf99b10a65bdf936e/file_replicator-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "79880b5cbce8afee7e2323a3c227b3ea", "sha256": "65755cbfe15a7cf635da6fe2d59d5602bbdbc060824d84b43cf73c81f4a1362a" }, "downloads": -1, "filename": "file-replicator-0.1.3.tar.gz", "has_sig": false, "md5_digest": "79880b5cbce8afee7e2323a3c227b3ea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7162, "upload_time": "2019-01-08T03:39:50", "url": "https://files.pythonhosted.org/packages/1b/da/f82f03aed7a70ffb6b6633835f2e7a84b2997f0a6006e12669c8d3960544/file-replicator-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "19e75cabde7e11de8795a4f712ddc058", "sha256": "623b5dd2c76f00171eddb3e02f2840c80571ba051ecb8794baf72d1e19166472" }, "downloads": -1, "filename": "file_replicator-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "19e75cabde7e11de8795a4f712ddc058", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12761, "upload_time": "2019-01-09T03:37:13", "url": "https://files.pythonhosted.org/packages/79/14/e7b53d9781f9fdb5451f9daa25c62bc3892e4c6c3e5e557078e8745febab/file_replicator-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8f14e0029a108d9b91eb2bde5c3cbcb", "sha256": "0f25588fd1501fdeb766e31c883efbe632dd475a167e0c78584c751a6c3f40f2" }, "downloads": -1, "filename": "file-replicator-0.1.4.tar.gz", "has_sig": false, "md5_digest": "d8f14e0029a108d9b91eb2bde5c3cbcb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7020, "upload_time": "2019-01-09T03:37:11", "url": "https://files.pythonhosted.org/packages/44/cd/39b27087e343cd7533ff184ff1f504a27e83dbe80e50c4c1daf333db0f82/file-replicator-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "8836c699da4270356d3580629a752701", "sha256": "c8f14124317837e2de2f0a48a1d9481bf3a0f50b69d7d3280cc3ce5f5710da3f" }, "downloads": -1, "filename": "file_replicator-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "8836c699da4270356d3580629a752701", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12908, "upload_time": "2019-01-09T04:33:59", "url": "https://files.pythonhosted.org/packages/8b/e0/6b2937da3ad60481e7e63be65c155243497a6e01e169691d1edc7a1923f3/file_replicator-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1bdb8b79956e55e76b6e45063f8942a7", "sha256": "1139f0a176eb5f262082de939269189fe7fd358204e9a6f71bd1fd3ee06b6d35" }, "downloads": -1, "filename": "file-replicator-0.1.5.tar.gz", "has_sig": false, "md5_digest": "1bdb8b79956e55e76b6e45063f8942a7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7136, "upload_time": "2019-01-09T04:33:57", "url": "https://files.pythonhosted.org/packages/78/8c/5fc4297c180c4de018fbb312802f201c1ec32e8dc4ca7043a03aff212dc1/file-replicator-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "9aa74b2c16b50588f3e7eaece6fc68ff", "sha256": "403632466b8498dd17c1fae853bda0e5f17744a44e1c5941ded86726396d8d87" }, "downloads": -1, "filename": "file_replicator-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "9aa74b2c16b50588f3e7eaece6fc68ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12940, "upload_time": "2019-01-09T04:54:28", "url": "https://files.pythonhosted.org/packages/7f/df/60e807639f197901eff7910ca2028cf7e2dda9d30eeb08f4b62a184f8d90/file_replicator-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "292f7990a61b07e51fe3b312ff4a084f", "sha256": "eb0b7594ae7040dfea74e180eae6bd442cc75950eaaafadc7926e6204f5715c2" }, "downloads": -1, "filename": "file-replicator-0.1.6.tar.gz", "has_sig": false, "md5_digest": "292f7990a61b07e51fe3b312ff4a084f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7194, "upload_time": "2019-01-09T04:54:26", "url": "https://files.pythonhosted.org/packages/c2/1d/b4b70d8d0e58d792966fc9630fdba9e37f098d3093c5587294f33c11b550/file-replicator-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "70020ed1aea247f3c66ff714c9c35d2e", "sha256": "5375d29f6e0f11b54856ff6687436ebd6d233c700296c0878930fd52f9de1a80" }, "downloads": -1, "filename": "file_replicator-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "70020ed1aea247f3c66ff714c9c35d2e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 14169, "upload_time": "2019-01-11T18:04:15", "url": "https://files.pythonhosted.org/packages/7f/d8/ac064f8ab09e957b8badce1f67ae6d064ceebc0039705d07bd159e014b7a/file_replicator-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19975f821c8380c8fc8a7ebef75ccb5b", "sha256": "468c076036ece7646b9bd45ae9fb86941a9a6cda92f68985759d06c4ed496055" }, "downloads": -1, "filename": "file-replicator-0.1.7.tar.gz", "has_sig": false, "md5_digest": "19975f821c8380c8fc8a7ebef75ccb5b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7836, "upload_time": "2019-01-11T18:04:13", "url": "https://files.pythonhosted.org/packages/7d/17/1253166ccc2fc8a8a760decb7783c7968248290aa89d095f7331758b6d6a/file-replicator-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "a0f98d1d202e33372f1db061bac56faf", "sha256": "f6b5667796d0d12a9ad22f77ea083cab3cb7951810a2601a355ae366398fd294" }, "downloads": -1, "filename": "file_replicator-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "a0f98d1d202e33372f1db061bac56faf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 14588, "upload_time": "2019-01-11T18:42:58", "url": "https://files.pythonhosted.org/packages/04/87/e3e5366c1f0200df3f8ab4e9f061579090be5da9cd6c0acee200f3c3220f/file_replicator-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa3bddf0ee0408e8fdc14db3424074c4", "sha256": "5b75e348c53a2500135e489556fc7f5ace1289d0b47c54848d6a3c09ba530357" }, "downloads": -1, "filename": "file-replicator-0.1.8.tar.gz", "has_sig": false, "md5_digest": "aa3bddf0ee0408e8fdc14db3424074c4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8031, "upload_time": "2019-01-11T18:42:56", "url": "https://files.pythonhosted.org/packages/36/41/232990d32cc5973833f74a8dd4fde3ecc12a3e8c23e9fe4c539cb2b07451/file-replicator-0.1.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c2ee513be0adc2e9591ee7840717fdbe", "sha256": "acf2b79160b70dae9e24e50e0d0f429e91a8853c2de6351b1875e73750588a0a" }, "downloads": -1, "filename": "file_replicator-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "c2ee513be0adc2e9591ee7840717fdbe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 9275, "upload_time": "2019-06-23T20:49:31", "url": "https://files.pythonhosted.org/packages/ad/71/a66973f50f9f682d11a3648de36173e41676ab2a99880df16dbd887e1327/file_replicator-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "45d72a4ab64b65dcee5af5d9445fdda2", "sha256": "d7e1bcf031a4fe29eb286ea65e604c9a6a9240d74e85a3337fd1d15cdcbd7c36" }, "downloads": -1, "filename": "file-replicator-0.1.11.tar.gz", "has_sig": false, "md5_digest": "45d72a4ab64b65dcee5af5d9445fdda2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8968, "upload_time": "2019-06-23T20:49:29", "url": "https://files.pythonhosted.org/packages/9d/11/5a763a0cef8884b67e9f81812847d3dd90ec7195fe38352b209f5a66a006/file-replicator-0.1.11.tar.gz" } ] }