{ "info": { "author": "Marko Ristin", "author_email": "marko@parquery.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "reonnecting_ftp\n===============\n\nreconnecting_ftp provides a FTP client which wraps ftplib.FTP. It reconnects automatically to the server if it was\ndisconnected, and remembers the last recorded working directory.\n\nWe found reconnection to be particularly important in scripts which run for a long time, and need to repeatedly iterate\nover the files on the FTP server.\n\nSince results need to be atomic, we have to convert the result from\n``ftplib.FTP.mlsd`` (an iterable of directory entries) to an explicit list of directory entries. While this gives you\natomicity (whatever you iterate over will be done in a single connection), all the directory entries need to be stored\nin memory.\n\nAdditionally, we provide an implementation of ``mlst`` FTP command which is missing in the original ``ftplib.FTP``\nclient.\n\n\n\nUsage\n=====\n.. code-block:: python\n\n import reconnecting_ftp\n\n with reconnecting_ftp.Client(hostname=\"some-host.com\", port=21, user=\"some-user\", password=\"some-password\") as ftp:\n # change working directory\n ftp.cwd(dirname='/some-dir/some-subdir')\n\n # you can execute here all the commands as provided in ftplib.FTP. If the connection failed, the command will\n # be retried while it succeeds or the maximum number of retries haven been exhausted..\n\n # MLST the file\n pth, entry = ftp.mlst(filename='some-file.txt')\n\n # iterate over a directory entries atomically\n for name, entry_dict in ftp.mlsd(path=parent_path):\n # do something\n pass\n\nInstallation\n============\n\n* Create a virtual environment:\n\n.. code-block:: bash\n\n python3 -m venv venv3\n\n* Activate it:\n\n.. code-block:: bash\n\n source venv3/bin/activate\n\n* Install reconnecting_ftp with pip:\n\n.. code-block:: bash\n\n pip3 install reconnecting_ftp\n\nDevelopment\n===========\n\n* Check out the repository.\n\n* In the repository root, create the virtual environment:\n\n.. code-block:: bash\n\n python3 -m venv venv3\n\n* Activate the virtual environment:\n\n.. code-block:: bash\n\n source venv3/bin/activate\n\n* Install the development dependencies:\n\n.. code-block:: bash\n\n pip3 install -e .[dev]\n\n* We provide a set of pre-commit checks that lint and check code for formatting and runs unit tests. Run them locally\n from an activated virtual environment with development dependencies:\n\n.. code-block:: bash\n\n ./precommit.py\n\n* The pre-commit script can also automatically format the code:\n\n.. code-block:: bash\n\n ./precommit.py --overwrite\n\nVersioning\n==========\nWe follow `Semantic Versioning `_. The version X.Y.Z indicates:\n\n* X is the major version (backward-incompatible),\n* Y is the minor version (backward-compatible), and\n* Z is the patch version (backward-compatible bug fix).", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Parquery/reconnecting-ftp", "keywords": "ftplib reconnect retry robust ftp client", "license": "", "maintainer": "", "maintainer_email": "", "name": "reconnecting-ftp", "package_url": "https://pypi.org/project/reconnecting-ftp/", "platform": "", "project_url": "https://pypi.org/project/reconnecting-ftp/", "project_urls": { "Homepage": "https://github.com/Parquery/reconnecting-ftp" }, "release_url": "https://pypi.org/project/reconnecting-ftp/1.0.12/", "requires_dist": null, "requires_python": "", "summary": "Reconnecting FTP client", "version": "1.0.12" }, "last_serial": 5410390, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "64fb7653f79495108fcc12bd8b25489e", "sha256": "91956be7566657c721aa458db397a04b20bd19e1cf3eec0883289f65bda83094" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.0.tar.gz", "has_sig": false, "md5_digest": "64fb7653f79495108fcc12bd8b25489e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2963, "upload_time": "2018-02-19T10:05:15", "url": "https://files.pythonhosted.org/packages/f5/a8/8ef4d9df5357da6dc4527df52f3b6e1102d8d2209dd945a4e2f5a3977fe4/reconnecting_ftp-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "0665fbd3349c4740d14867cf5ed3cd71", "sha256": "e292041578d6a02c873dca89f65eaafb1077079cc9ab16b86927a266368ed265" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.1.tar.gz", "has_sig": false, "md5_digest": "0665fbd3349c4740d14867cf5ed3cd71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3104, "upload_time": "2018-02-19T10:15:28", "url": "https://files.pythonhosted.org/packages/30/10/8ec4bcccbea2d421a447c2ea98c9fb338adbf08d6d18b07d063c6e117dee/reconnecting_ftp-1.0.1.tar.gz" } ], "1.0.10": [ { "comment_text": "", "digests": { "md5": "737ef5c23750c5aa7beb20a92870fb1f", "sha256": "af0c1d7edb9b5b99f1143e9d4b6c7137bbfe418491e57d4dd89926fea61a340a" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.10.tar.gz", "has_sig": false, "md5_digest": "737ef5c23750c5aa7beb20a92870fb1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5037, "upload_time": "2018-04-24T13:24:22", "url": "https://files.pythonhosted.org/packages/46/ba/9d9df1bb10bed2c1656470a8cdbd0e1e402b2e88060416fca9c6d9f403c9/reconnecting_ftp-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "b74c91ae1ed78b16d63b7fa258ff8f07", "sha256": "9641ba91577138eff41a744976e951499b6cbc6c0f0e60ca58e1e44da45e0dfd" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.11.tar.gz", "has_sig": false, "md5_digest": "b74c91ae1ed78b16d63b7fa258ff8f07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5050, "upload_time": "2018-07-02T13:40:52", "url": "https://files.pythonhosted.org/packages/9d/f5/f918bb68f878bde439e7a097c647bdc7c30d9bb040c6c1dc2c2680c5e1cc/reconnecting_ftp-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "4570c3f0700584c069618e2352127b9b", "sha256": "da02f8e6de4e3c07090a3184572519507eefd9ec1fc08e740d6d93744b63dbda" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.12.tar.gz", "has_sig": false, "md5_digest": "4570c3f0700584c069618e2352127b9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5049, "upload_time": "2018-08-03T15:47:39", "url": "https://files.pythonhosted.org/packages/23/cf/68483b0fdee00728241a18f86d65fb0bd1de29ba57afdca04171790cc668/reconnecting_ftp-1.0.12.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "a2e9664496a94084212349d20312f60d", "sha256": "868714f5a3125e7787b464e5b5a68ee328740fe5d51614fd8fa425aad7046ea1" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.2.tar.gz", "has_sig": false, "md5_digest": "a2e9664496a94084212349d20312f60d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3123, "upload_time": "2018-02-19T15:50:19", "url": "https://files.pythonhosted.org/packages/5c/ed/712442e2dd59aaed9e3dc4dd0bacac4e8b2db9c8e9b7150ff2209da6c5f7/reconnecting_ftp-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "3181167c3591e82f1c65231ef1302d8e", "sha256": "722848ad6feb010555d36648dd74671efe237eed0a085dc0b976a604a4b859d3" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.3.tar.gz", "has_sig": false, "md5_digest": "3181167c3591e82f1c65231ef1302d8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3223, "upload_time": "2018-02-19T16:51:01", "url": "https://files.pythonhosted.org/packages/ce/66/647efed3552e49cd7b7632f775087b100b2f4d890f79cab6d143438d5082/reconnecting_ftp-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "8232161bbcc2c601ff1d87fac42eb330", "sha256": "ee118b20aead630c53f38e41fa91ce0c5befead145f55af7bc3a6afba31644c1" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.4.tar.gz", "has_sig": false, "md5_digest": "8232161bbcc2c601ff1d87fac42eb330", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3682, "upload_time": "2018-02-19T17:35:52", "url": "https://files.pythonhosted.org/packages/e4/c7/a0da33171976ba595a8a08750a9cab1923a66dd3225ec0f47c74c1d99c84/reconnecting_ftp-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "e87b0d5fd88a54646f9c37a315f6943f", "sha256": "336a98e997c9eb259887488d2c5d531a9e03ce0f7eb68a0ad97e56a8ca01886a" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.5.tar.gz", "has_sig": false, "md5_digest": "e87b0d5fd88a54646f9c37a315f6943f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3701, "upload_time": "2018-02-20T15:34:28", "url": "https://files.pythonhosted.org/packages/d9/87/dc42856947a0d088a49a04dde070821de56f8196d24a4cc48e217cd5064a/reconnecting_ftp-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "b357bd8e38a29c839d909b98d5a0c92c", "sha256": "6ab7b61e5d3cd6abf5cb436c997bc8a6d98c5a5af1f877b3ff7c83ea4602e175" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.6.tar.gz", "has_sig": false, "md5_digest": "b357bd8e38a29c839d909b98d5a0c92c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3613, "upload_time": "2018-03-04T18:11:56", "url": "https://files.pythonhosted.org/packages/24/03/c3310dae86e197d1aa67424bac321ef342abf776cba580a89d235fdf6159/reconnecting_ftp-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "f8b3833cf5c09e876b53fa4b118e6dcd", "sha256": "6838fc2e8c65bd56dcc06c1c48bdaa2e209dceb8cc6c9c8ac58ab2cb7c9e5d82" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.7.tar.gz", "has_sig": false, "md5_digest": "f8b3833cf5c09e876b53fa4b118e6dcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4615, "upload_time": "2018-04-19T21:40:57", "url": "https://files.pythonhosted.org/packages/40/d5/de3513e0f8f671b1d35832850f326f179d05545acd3b6bf500c35c27043e/reconnecting_ftp-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "b9527e21641ed6189be7ec16291856b8", "sha256": "b7dc8d096d9f04fbc2d0d9244bbeb560af9467fc63f3f72a9e470d473ceff399" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.8.tar.gz", "has_sig": false, "md5_digest": "b9527e21641ed6189be7ec16291856b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4631, "upload_time": "2018-04-24T13:01:41", "url": "https://files.pythonhosted.org/packages/6b/56/93fb06e0635783bd773122b7c4f88b43c30264ddef2081ddd6a29a4f3b20/reconnecting_ftp-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "03a8a339f7d266217fa9b91b833ba214", "sha256": "67ede5ca752390a6f82543de6d9bb0a6627d3b24e6cd8bde37cee0fdc6a2c4c8" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.9.tar.gz", "has_sig": false, "md5_digest": "03a8a339f7d266217fa9b91b833ba214", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5043, "upload_time": "2018-04-24T13:16:24", "url": "https://files.pythonhosted.org/packages/df/4f/bc412594d923237edb6c6c0e3cbcc86c255acbcce97ebda6f4b641d15fdf/reconnecting_ftp-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4570c3f0700584c069618e2352127b9b", "sha256": "da02f8e6de4e3c07090a3184572519507eefd9ec1fc08e740d6d93744b63dbda" }, "downloads": -1, "filename": "reconnecting_ftp-1.0.12.tar.gz", "has_sig": false, "md5_digest": "4570c3f0700584c069618e2352127b9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5049, "upload_time": "2018-08-03T15:47:39", "url": "https://files.pythonhosted.org/packages/23/cf/68483b0fdee00728241a18f86d65fb0bd1de29ba57afdca04171790cc668/reconnecting_ftp-1.0.12.tar.gz" } ] }