{ "info": { "author": "David Miller", "author_email": "david@deadpansincerity.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.1", "Topic :: Software Development :: Libraries" ], "description": "===\nffs\n===\n\nPython Filesystem Api helpers\n\n.. image:: https://secure.travis-ci.org/davidmiller/ffs.png?branch=master\n :alt: Build Status\n :target: https://secure.travis-ci.org/davidmiller/ffs\n\nDealing with the filesystem in Python is clunky. Those of us who have an almost\nemotional engagement with the elegance of the APIs we use, feel that it shouldn't\nhave to be this way. Not in Python.\n\nRationale\n=========\n\nThis dance started waaay back. Frist there was Jason Orendorff's path.py, back\nin 2004. Then in 05-06 Reinhold Birkenfeld and Bj\u00f6rn Lindqvist tweaked it for\nPEP 355, which tried to get something like that into the Standard Library. The\nattempt failed miserably. Then in 2007 there was Mike Orr's Unipath, which added\na test suite and made it setuptoolsable.\n\nPhew.\n\nQuestion (short): So why are you doing it again?\n\nQuestion (by implication): The idea has been solidly rejected by python-dev, with\nstrong objections from that community, and there's already a 3rd party module that\ndoes a pretty good job of this stuff for those people who like This Kind Of Thing.\nWhy should I care?\n\nAnswer (short): The name is way more fun.\n\nAnswer (less facetiously): The name is way more fun. And four less characters to type.\nAnd you know, if you're going to do something that's arguably a Bad Idea (TM) that\ngoes against the One True Way, you have to at leas market it properly, and in my life\nat least, \"FFS Python\" is already a well established phrase.\n\nAnswer (oh, right, I just looked up what facetious means):\n\nThis kind of thing is about APIs. And the APIs that are out there, could *still be\nbetter*. In fact, the APIs *were* better before all the operator overloading got taken\nout in a misguided attempt to get the thing into the standard library.\n\nUnipath is self-proclaimed stable since 2007, and hasn't even seen a bugfix release\nsince 2009. It's used in production by Real People's software that does Real Work.\nRight now, I'm not even sure what the *right* API even is, yet alone in a position to\nattempt to get patches into a package that's had a stable API for 5 years. That's\nStick-A-Fork-In-It-It's-Done-style stability.\n\nThe api for the Path class in ffs *Will* change, without depreciation warnings, on\nminor point releases. Hell, this thing's only *on* PyPi at this stage so I can pull it\ninto a CI system without having to maintain my own cheeseshop.\n\n`Docs`_\n\n`Source`_\n\n`Issues`_\n\n.. _Docs: http://www.deadpansincerity.com/docs/ffs\n.. _Source: https://github.com/davidmiller/ffs\n.. _Issues: https://github.com/davidmiller/ffs/issues\n\n\nHistory\n-------\n\n0.0.7.7 ()\n+++++++++++++++++++++\nAdds .open() to HTTPPath to return file like objects\nAdds .checksum() to Path.\nAdds .as_zip to base leafbranch path\nAdds path argument to newfile \n\n0.0.7.6 (Feb 13 2014)\n+++++++++++++++++++++\nAdds minimal archive support to contrib.\n\n0.0.7.5\n+++++++\nFixes bugs with CSV header rows when CSV rows have trailing commas/periods.\nUses simplejson when available.\nAdd the .mimetype property to Path objects\n\n0.0.7.4 (May 02 2013)\n+++++++++++++++++++++\nAdd Path.here() for a nicer syntax for the directory of the calling file.\n\n0.0.7.3 (Nov 19 2012)\n+++++++++++++++++++++\n\nAdd Path.newfile() and Path.newdir() - non destructive versions of the\ncontextmanager tempfile() && tempath()\n\n0.0.7.2 (Nov 14 2012)\n+++++++++++++++++++++\nAdd __version__ to main module\n\n0.0.7.1 (Oct 12 2012)\n+++++++++++++++++++++\n\nAdd glob patterns to Path().ls()\nAdd a header argument to Path.csv() to autocreate CSV row classes\n\n0.0.7 (Oct 11 2012)\n+++++++++++++++++++\n\nFix bug with Path.ls() so that children are returned as Path objects\nrelative to the parent.\n\nExpose Path.decode (Useful when using Paths as Django template directories)\n\n0.0.6 (Oct 09 2012)\n+++++++++++++++++++\n\nAdd ffs.contrib.mold for templating helpers.\n\n0.0.5 (Sep 22 2012)\n+++++++++++++++++++\n\nAdd a mv() method to Path.\nRe-enable rstrip(). (Stdlib uses it e.g. shutil._basename)\nCatch the case where we call Path(Path('foo')) and get recursion errors.\nAdd the formats module for helpers with Fileformats.\nFrist entry is the Indeterminate CSV class (ducktypes as both a reader and writer until\nyou do something deterministic)x\nAdd a csv contextmanager to Path\nDiskFilesystem.open() implicitly calls expanduser\nInitial implementation of a HTTP path system\n\n0.0.4.1 (Sep 12 2012)\n+++++++++++++++++++++\n\nCopying:\nAdd a GNU cp clone to nix.\nAdd the --recursive argument to the filesystem cp implementation\nAdd a cp(target) method to the Path class\n\nTouching:\nWhen touching a subpath where some parents do not exist, Path().touch('this/that/theother.txt')\nshould create them and assume the caller knows their own mind. This is consistent with the\nbehaviour of << and open().\n\n0.0.3 (Sep 11 2012)\n+++++++++++++++++++\n\nReduce the level of String duck-typing to sane levels. Although we do inherit\nfrom str, we bail with AttributeErrors when we think that we're being used\nfor something absurd - e.g. what's the sane use of Path().splitlines() ?\n\nOverload the / operator to be equivalent to path addition.\n\nAdd a mkdir() method to Path. This (and now also touch()) take starargs of\nchild nodes to the current Path, assuming it is a directory. This allows creating\nmany directories with one call::\n\n >>> p = Path(rpmroot)\n >>> p.mkdir('BUILD', 'SOURCES', 'SPECS', 'RPM', 'SRPMS')\n\nMaintain immutability for in-place append and update tests to catch this regression.\n\nAdd a Filesystem abstraction layer that allows us to use *nix semantics and\nmetaphors with anything that uses Path-like structures.\n\n0.0.2 (Aug 21 2012)\n+++++++++++++++++++\n\nAdded the Path class - string-like with shortcuts!\nnix.cd doubles as a function and a contextmanager\nMany extra aliases in ffs.nix\n\n0.0.1 (Jul 20 2012)\n+++++++++++++++++++\n\nInitial release. Minimal useful feature set. Known incomplete implementations.", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.deadpansincerity.com/docs/ffs", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "ffs", "package_url": "https://pypi.org/project/ffs/", "platform": "", "project_url": "https://pypi.org/project/ffs/", "project_urls": { "Homepage": "http://www.deadpansincerity.com/docs/ffs" }, "release_url": "https://pypi.org/project/ffs/0.0.8.2/", "requires_dist": null, "requires_python": "", "summary": "Python Filesystem Api helpers", "version": "0.0.8.2" }, "last_serial": 3483760, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "e64445d00562e8392ee0113c029be9d4", "sha256": "decc4d0b89f43b79d47105e1bb0c7f1c21e65919f2ed154228bbcb70738da84c" }, "downloads": -1, "filename": "ffs-0.0.1.tar.gz", "has_sig": false, "md5_digest": "e64445d00562e8392ee0113c029be9d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7736, "upload_time": "2012-07-30T13:16:21", "url": "https://files.pythonhosted.org/packages/2a/0b/0e390af8f0c42aa799b135458463da4bc87269f6e65e1c8aacbf56ecb2ef/ffs-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "af81887cc358835ca25665e60474c920", "sha256": "70edce9ba0e6007d0a7045806f6ea5f8fbb0669610c95db936dac3a798265e13" }, "downloads": -1, "filename": "ffs-0.0.2.tar.gz", "has_sig": false, "md5_digest": "af81887cc358835ca25665e60474c920", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19892, "upload_time": "2012-08-21T13:46:18", "url": "https://files.pythonhosted.org/packages/c6/e7/99de5994c1bdb2913cd45f66320c10f7625323b1fa9ef3384b047c9faf27/ffs-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "cc5ed8a6c4dd16318cfead37658ee023", "sha256": "3992ed552c6ac858f04d823853e71d124a606606401f939de96ad679d98d5578" }, "downloads": -1, "filename": "ffs-0.0.3.tar.gz", "has_sig": false, "md5_digest": "cc5ed8a6c4dd16318cfead37658ee023", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27484, "upload_time": "2012-09-11T13:04:50", "url": "https://files.pythonhosted.org/packages/44/bf/e265fff237432258f212eb1f988dfec78fc74b7fb04bd33131ddce2bf680/ffs-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "94f9b8d6f6c30aa9f0bfe53d0241e9c8", "sha256": "617389ea491125aca2fa4e455a7735095686f298efff8c14f317d5e8986b52f8" }, "downloads": -1, "filename": "ffs-0.0.4.tar.gz", "has_sig": false, "md5_digest": "94f9b8d6f6c30aa9f0bfe53d0241e9c8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28847, "upload_time": "2012-09-12T13:57:46", "url": "https://files.pythonhosted.org/packages/53/83/089f6d17acd49a00fadfae19b185e0fb4fb16b77774d037144ef66fbd239/ffs-0.0.4.tar.gz" } ], "0.0.4.1": [ { "comment_text": "", "digests": { "md5": "320f86f54d0b696315e7ee5153045912", "sha256": "5e3d348a8bcc8184ce4c98a28efff67cb6ddeb593bdfa6d91037279491f76724" }, "downloads": -1, "filename": "ffs-0.0.4.1.tar.gz", "has_sig": false, "md5_digest": "320f86f54d0b696315e7ee5153045912", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28832, "upload_time": "2012-09-12T13:59:07", "url": "https://files.pythonhosted.org/packages/9b/3b/e103e4ee261a233716698a159a31f6df44050bd3129c07f97effadaf61f5/ffs-0.0.4.1.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "7eb975600018f3a52d53a8a39a60cf4c", "sha256": "78aa42da6afd3b0be210437807e2a739cc709573c3997ef069f341f2e86f8aa0" }, "downloads": -1, "filename": "ffs-0.0.5.tar.gz", "has_sig": false, "md5_digest": "7eb975600018f3a52d53a8a39a60cf4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31826, "upload_time": "2012-09-22T14:02:56", "url": "https://files.pythonhosted.org/packages/c6/95/148f76713347203cc81abb644b736c9ef0191d2b39b3beaf3935b434d29d/ffs-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "e97d5d3276e45cadafe57807f4c2b2a4", "sha256": "1c31cc3d5d669efe1e149dea0d135fde4407af00f07f2ff24888eac05b68b57b" }, "downloads": -1, "filename": "ffs-0.0.6.tar.gz", "has_sig": false, "md5_digest": "e97d5d3276e45cadafe57807f4c2b2a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32233, "upload_time": "2012-10-09T16:03:28", "url": "https://files.pythonhosted.org/packages/dc/cf/7ddb9d4e352bdf7ab6e764aa487649684bcaa225eeb3648318a01cae9fb1/ffs-0.0.6.tar.gz" } ], "0.0.6.1": [ { "comment_text": "", "digests": { "md5": "697496bc8c82b670493940857ec0588b", "sha256": "3e46e6dd05b8f7ce5be4ddf2dda79049769fd02ae6cdf8bf52c5ea4b05a57da0" }, "downloads": -1, "filename": "ffs-0.0.6.1.tar.gz", "has_sig": false, "md5_digest": "697496bc8c82b670493940857ec0588b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34229, "upload_time": "2012-10-09T16:07:45", "url": "https://files.pythonhosted.org/packages/3b/f7/12c237982cc5295ef0cb62653144a45a51178ea3193abaef290c9e0e5ec3/ffs-0.0.6.1.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "fcec70354f50ad65e8f6b25347b3ea9e", "sha256": "56a6e37c5d51d940c65fd4c5f012462380a0ae32cfe672a1680ce50291ba0833" }, "downloads": -1, "filename": "ffs-0.0.7.tar.gz", "has_sig": false, "md5_digest": "fcec70354f50ad65e8f6b25347b3ea9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34546, "upload_time": "2012-10-11T11:46:51", "url": "https://files.pythonhosted.org/packages/16/99/52080941e8b9bc03de38e7c1219523601622a6e5a70358a29f0230125cba/ffs-0.0.7.tar.gz" } ], "0.0.7.1": [ { "comment_text": "", "digests": { "md5": "6e600ed794d37a0ef3594d3d3dbc7d40", "sha256": "af55852055e8d871d24e4583e1ad038ed5a6d83d4684cd0cbf80a854f6f78e72" }, "downloads": -1, "filename": "ffs-0.0.7.1.tar.gz", "has_sig": false, "md5_digest": "6e600ed794d37a0ef3594d3d3dbc7d40", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35401, "upload_time": "2012-10-12T12:06:31", "url": "https://files.pythonhosted.org/packages/e5/39/1898c560fb366c291eadf35923eba2bb67f415aa1867ca60fe219f5a6cc0/ffs-0.0.7.1.tar.gz" } ], "0.0.7.2": [ { "comment_text": "", "digests": { "md5": "d8187c55726b0c5e0655cf8372a3cd53", "sha256": "87c3f27ccef679665332273ced7d3e0d868c1abf50fe0b7fea2b9a5a1d63c166" }, "downloads": -1, "filename": "ffs-0.0.7.2.tar.gz", "has_sig": false, "md5_digest": "d8187c55726b0c5e0655cf8372a3cd53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35460, "upload_time": "2012-11-14T11:40:06", "url": "https://files.pythonhosted.org/packages/bf/2b/c116bd64fa51c41bcff53c37aefc17cd6586b24c22241713a5cf97fd04f4/ffs-0.0.7.2.tar.gz" } ], "0.0.7.3": [ { "comment_text": "", "digests": { "md5": "97728039e442f58b1ee675f0ec5fd89e", "sha256": "80e62f108e02ae2ea41d1bc59be60a7d2da63af953cdd08662b9625afc1a3c0a" }, "downloads": -1, "filename": "ffs-0.0.7.3.tar.gz", "has_sig": false, "md5_digest": "97728039e442f58b1ee675f0ec5fd89e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35845, "upload_time": "2012-11-19T11:41:40", "url": "https://files.pythonhosted.org/packages/1f/84/d23c2a6bf293ff02ed9b4196bcd0061b7a33501aeccc01650be291c9124f/ffs-0.0.7.3.tar.gz" } ], "0.0.7.4": [ { "comment_text": "", "digests": { "md5": "65b6917fce71a787531b02ce5a84c7a7", "sha256": "af6495ef21866d4d48769da603c1709d44b145f884d108dba24e508c51eb939f" }, "downloads": -1, "filename": "ffs-0.0.7.4.tar.gz", "has_sig": false, "md5_digest": "65b6917fce71a787531b02ce5a84c7a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35151, "upload_time": "2013-05-02T18:29:42", "url": "https://files.pythonhosted.org/packages/b1/00/f4743afee12444a123d7a506fc0cac70472f526785603fb97d2f2cda6b73/ffs-0.0.7.4.tar.gz" } ], "0.0.7.6": [ { "comment_text": "", "digests": { "md5": "c94aa7e77daa9818947f48afe144bb81", "sha256": "e6f536d44fa4ac58dbf98b6c82cb3629482f57a2c596307bfdb1708325c31b12" }, "downloads": -1, "filename": "ffs-0.0.7.6.tar.gz", "has_sig": false, "md5_digest": "c94aa7e77daa9818947f48afe144bb81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37446, "upload_time": "2014-02-13T14:22:40", "url": "https://files.pythonhosted.org/packages/85/d5/63eefbb81ad040a98379ca26b95d762a495abb9bdb6fec17a26f5a110561/ffs-0.0.7.6.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "d4c0976243dc3b250e9b59ae4e1165a8", "sha256": "189b6d32dcd6f321e87c5e6a3dcba1dcc0a02b2d074efb42ac81cfa81fe027bd" }, "downloads": -1, "filename": "ffs-0.0.8.tar.gz", "has_sig": false, "md5_digest": "d4c0976243dc3b250e9b59ae4e1165a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39025, "upload_time": "2015-05-06T14:52:45", "url": "https://files.pythonhosted.org/packages/c5/6e/0abf6134ae200657608c2176b15176d1b6aa7a60bc72f398d8d7f2665ce7/ffs-0.0.8.tar.gz" } ], "0.0.8.1": [ { "comment_text": "", "digests": { "md5": "2a995ce47161ef7149426f84616c13ae", "sha256": "14535c830a40ac70f01bd20ca5b027482dbc0ffa80837d9f83c879ba99083dd0" }, "downloads": -1, "filename": "ffs-0.0.8.1.tar.gz", "has_sig": false, "md5_digest": "2a995ce47161ef7149426f84616c13ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38711, "upload_time": "2015-11-05T12:59:24", "url": "https://files.pythonhosted.org/packages/79/49/81f13e41fb09a46260bd8bd4d1c2a6267d630f31679a77822ee32811fd00/ffs-0.0.8.1.tar.gz" } ], "0.0.8.2": [ { "comment_text": "", "digests": { "md5": "be732e9873245f9e4513a630c0d5953c", "sha256": "d8f7776fa40a7f47ebaf38e2e439ad4448c9739744819bc2acde8e796ca105f6" }, "downloads": -1, "filename": "ffs-0.0.8.2.tar.gz", "has_sig": false, "md5_digest": "be732e9873245f9e4513a630c0d5953c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39352, "upload_time": "2018-01-12T11:30:41", "url": "https://files.pythonhosted.org/packages/1b/b4/05911a8e2fee9c27038b06ef8205404486453a60fcd14d778c9df1a46d3d/ffs-0.0.8.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "be732e9873245f9e4513a630c0d5953c", "sha256": "d8f7776fa40a7f47ebaf38e2e439ad4448c9739744819bc2acde8e796ca105f6" }, "downloads": -1, "filename": "ffs-0.0.8.2.tar.gz", "has_sig": false, "md5_digest": "be732e9873245f9e4513a630c0d5953c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39352, "upload_time": "2018-01-12T11:30:41", "url": "https://files.pythonhosted.org/packages/1b/b4/05911a8e2fee9c27038b06ef8205404486453a60fcd14d778c9df1a46d3d/ffs-0.0.8.2.tar.gz" } ] }