{ "info": { "author": "snare", "author_email": "snare@ho.ax", "bugtrack_url": null, "classifiers": [], "description": "Scruffy\n=======\n\n.. image:: https://img.shields.io/travis/snare/scruffy.svg\n :target: https://travis-ci.org/snare/scruffy\n\n.. image:: https://img.shields.io/pypi/format/scruffington.svg\n :target: https://pypi.python.org/pypi/scruffington\n\n.. image:: https://readthedocs.org/projects/scruffy/badge/?version=latest\n :target: http://scruffy.readthedocs.org/en/latest/\n\n\n*Scruffy. The Janitor.*\n\nScruffy is a framework for taking care of a bunch of boilerplate in Python apps. It handles the loading of configuration files, the loading and management of plugins, and the management of other filesystem resources such as temporary files and directories, log files, etc.\n\nA typical use case for Scruffy is a command-line Python tool with some or all of the following requirements:\n\n* Read a set of configuration defaults\n* Read a local configuration file and apply it on top of the defaults\n* Allow overriding some configuration options with command line flags or at runtime\n* Load a core set of Python-based plugins\n* Load a set of user-defined Python-based plugins\n* Generate log files whose name, location and other logging settings are based on configuration\n* Store application state between runs in a file or database\n\nScruffy is used by Voltron_ and Calculon_\n\n.. _Voltron: https://github.com/snare/voltron\n.. _Calculon: https://github.com/snare/calculon\n\nInstallation\n------------\n\nA standard python setup script is included.\n\n $ python setup.py install\n\nThis will install the Scruffy package wherever that happens on your system.\n\nAlternately, Scruffy can be installed with `pip` from PyPi (where it's called `scruffington`, because I didn't check for a conflict before I named it).\n\n $ pip install scruffington\n\nDocumentation\n-------------\n\nFull documentation is hosted at readthedocs_\n\n.. _readthedocs: http://scruffy.readthedocs.io/\n\nQuick start\n-----------\n\nConfig\n~~~~~~\n\nLoad a user config file, and apply it on top of a set of defaults loaded from inside the Python package we're currently running from.\n\n*thingy.yaml*:\n\n.. code:: yaml\n\n some_property: 1\n other_property: a thing\n\n*thingy.py*:\n\n.. code:: python\n\n from scruffy import ConfigFile\n\n c = ConfigFile('thingy.yaml', load=True,\n defaults=File('defaults.yaml', parent=PackageDirectory())\n )\n\n print(\"c.some_property == {c.some_property}\".format(c=c))\n print(\"c.other_property == {c.other_property}\".format(c=c))\n\nRun it:\n\n::\n\n $ python thingy.py\n c.some_property == 1\n c.other_property == a thing\n\nPlugins\n~~~~~~~\n\nLoad some plugins.\n\n*~/.thingy/plugins/example.py*:\n\n.. code:: python\n\n from scruffy import Plugin\n\n class ExamplePlugin(Plugin):\n def do_a_thing(self):\n print('{}.{} is doing a thing'.format(__name__, self.__class__.__name__))\n\n*thingy.py*:\n\n.. code:: python\n\n from scruffy import PluginDirectory, PluginRegistry\n\n pd = PluginDirectory('~/.thingy/plugins')\n pd.load()\n\n for p in PluginRegistry.plugins:\n print(\"Initialising plugin {}\".format(p))\n p().do_a_thing()\n\nRun it:\n\n::\n\n $ python thingy.py\n Initialising plugin \n example.ExamplePlugin is doing a thing\n\nLogging\n~~~~~~~\n\nScruffy's `LogFile` class will do some configuration of Python's `logging` module.\n\n*log.py*:\n\n.. code:: python\n\n import logging\n from scruffy import LogFile\n\n log = logging.getLogger('main')\n log.setLevel(logging.INFO)\n LogFile('/tmp/thingy.log', logger='main').configure()\n\n log.info('Hello from log.py')\n\n*/tmp/thingy.log*:\n\n::\n\n Hello from log.py\n\nEnvironment\n~~~~~~~~~~~\n\nScruffy's `Environment` class ties all the other stuff together. The other classes can be instantiated as named children of an `Environment`, which will load any `Config` objects, apply the configs to the other objects, and then prepare the other objects.\n\n*~/.thingy/config*:\n\n.. code:: yaml\n\n log_dir: /tmp/logs\n log_file: thingy.log\n\n*env.py*:\n\n.. code:: python\n\n from scruffy import *\n\n e = Environment(\n main_dir=Directory('~/.thingy', create=True,\n config=ConfigFile('config', defaults=File('defaults.yaml', parent=PackageDirectory())),\n lock=LockFile('lock')\n user_plugins=PluginDirectory('plugins')\n ),\n log_dir=Directory('{config:log_dir}', create=True\n LogFile('{config:log_file}', logger='main')\n ),\n pkg_plugins=PluginDirectory('plugins', parent=PackageDirectory())\n )\n\nLicense\n-------\n\nSee LICENSE file. If you use this and don't hate it, buy me a beer at a conference some time.\n\nCredits\n-------\n\nProps to richo_. Flat duck pride.\n\n.. _richo: http://github.com/richo\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/snare/scruffy", "keywords": "scruffy", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "scruffington", "package_url": "https://pypi.org/project/scruffington/", "platform": "", "project_url": "https://pypi.org/project/scruffington/", "project_urls": { "Homepage": "https://github.com/snare/scruffy" }, "release_url": "https://pypi.org/project/scruffington/0.3.8.1/", "requires_dist": [ "pyyaml", "six" ], "requires_python": "", "summary": "The janitor", "version": "0.3.8.1" }, "last_serial": 5919425, "releases": { "0.3": [], "0.3.1": [ { "comment_text": "", "digests": { "md5": "d354ebb21ee9dea8e007ae8a3a87d10c", "sha256": "9b3728517fef5ae13853092e52bf55d425711b3284a0198186e58e456c1f30e1" }, "downloads": -1, "filename": "scruffington-0.3.1.tar.gz", "has_sig": false, "md5_digest": "d354ebb21ee9dea8e007ae8a3a87d10c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8432, "upload_time": "2015-02-26T11:39:18", "url": "https://files.pythonhosted.org/packages/aa/d1/c3dcfa8793abb5bacd716b0c2ef91000ca2288ae103540f27f06f7ccc32e/scruffington-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "758832b18380aac6d4ea3eba6710c4f7", "sha256": "a5f85b70b0211c5f5945ad5554709098311ea008b88db21fb6cb83f9876be96c" }, "downloads": -1, "filename": "scruffington-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "758832b18380aac6d4ea3eba6710c4f7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12141, "upload_time": "2016-03-16T09:28:36", "url": "https://files.pythonhosted.org/packages/c1/cc/5d375310eea3189748e2342055c613d119f3c96abf7bba75b7368a537000/scruffington-0.3.2-py2.py3-none-any.whl" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "5edbde60dd5095e14f821e518cc72612", "sha256": "8da8df0c72ae909c3a54854a7c9e584fd41c7e62d7405a1a91d9410354ec39b3" }, "downloads": -1, "filename": "scruffington-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5edbde60dd5095e14f821e518cc72612", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11819, "upload_time": "2016-04-02T12:31:09", "url": "https://files.pythonhosted.org/packages/41/3b/f8ca90c0cb2465d53c22ced46bdd9528bd79ff3ff664cabd4003006a094d/scruffington-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7c482fabe5e6aaba1c18ed065533ba6c", "sha256": "54b17f550628167d16b1c651d8dff1213d8eb61b728e949ef63aa201c08d4ba2" }, "downloads": -1, "filename": "scruffington-0.3.3.tar.gz", "has_sig": false, "md5_digest": "7c482fabe5e6aaba1c18ed065533ba6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8767, "upload_time": "2016-04-25T07:19:57", "url": "https://files.pythonhosted.org/packages/a9/a3/a29e24cd41c3e411d2e535d25be1866a7011dbe69b8dfdb96b8e605e4494/scruffington-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "cdfb7ffa251e3e27079725387ea907bb", "sha256": "971d009959e09471d3d7e52e19e1bc0ebe473394c1bb587edd7b26d3edf72911" }, "downloads": -1, "filename": "scruffington-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cdfb7ffa251e3e27079725387ea907bb", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12074, "upload_time": "2016-05-15T05:23:43", "url": "https://files.pythonhosted.org/packages/b7/0e/86141c5b342a21ce77724c3d66ac5e04976b6c035145e5bdb488b49c35e2/scruffington-0.3.4-py2.py3-none-any.whl" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "6166bb107ec3e7f47c16746e8987567c", "sha256": "8f5c70a9ceb86802de3df23063c7f818c0f7286c4af3976627a2c62deb8e3156" }, "downloads": -1, "filename": "scruffington-0.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6166bb107ec3e7f47c16746e8987567c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12088, "upload_time": "2016-09-02T07:58:27", "url": "https://files.pythonhosted.org/packages/b1/24/84bbbddbbdb19c68d14d86ccf2344ac41be3670f6f692634087c7f28a326/scruffington-0.3.5-py2.py3-none-any.whl" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "7145c36ed7fe95b29262cbdbe2721bed", "sha256": "eabd13f93141fe6c63533217341965e1d5f15b7e898e75d44d9b938a773546c2" }, "downloads": -1, "filename": "scruffington-0.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7145c36ed7fe95b29262cbdbe2721bed", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12094, "upload_time": "2016-09-02T08:06:23", "url": "https://files.pythonhosted.org/packages/85/ac/062e2012f01e530a6059dc0a83535891583efcbbad186d10a3bb9a1b0482/scruffington-0.3.6-py2.py3-none-any.whl" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "1481ada707f2761115f30e7c0e435803", "sha256": "b540cf1abcd675172d1c6e495d19380aa14d2d589100d43fa99b8de41ae18e10" }, "downloads": -1, "filename": "scruffington-0.3.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1481ada707f2761115f30e7c0e435803", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12133, "upload_time": "2016-09-28T09:16:57", "url": "https://files.pythonhosted.org/packages/6c/73/18d180df19d55e8803731ad638513038906914063bd9bde8eea3cfa1ece5/scruffington-0.3.7-py2.py3-none-any.whl" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "8d359891507d496a74d6ee9150e5ccea", "sha256": "1487b3593437b7a3276ab94723c9cbc790a0c788948d0630a0b926f5dff52821" }, "downloads": -1, "filename": "scruffington-0.3.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8d359891507d496a74d6ee9150e5ccea", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12400, "upload_time": "2019-10-02T17:29:20", "url": "https://files.pythonhosted.org/packages/a8/6d/91a27f1483436d70d584551c5883543bdb3e107e6db083fa688d756d319b/scruffington-0.3.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "45d2fa0d22f278fa85bbbb8ab9bb472f", "sha256": "1eaaa75f7be00b4b50aee898bd26eb69544c28af1f573653b9d47f5867d7ace5" }, "downloads": -1, "filename": "scruffington-0.3.8.tar.gz", "has_sig": false, "md5_digest": "45d2fa0d22f278fa85bbbb8ab9bb472f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10799, "upload_time": "2019-10-02T17:29:22", "url": "https://files.pythonhosted.org/packages/9c/5e/99fa8b88753da4188e4dc8911a6791cb7fa877c68e4455fbaf503779004e/scruffington-0.3.8.tar.gz" } ], "0.3.8.1": [ { "comment_text": "", "digests": { "md5": "21024ce509abb0ec2f818aa394300194", "sha256": "bff8743e9de89001c8848e338aa05a7965ebb1cb34b14a775e4ed2ec74d41741" }, "downloads": -1, "filename": "scruffington-0.3.8.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "21024ce509abb0ec2f818aa394300194", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14157, "upload_time": "2019-10-02T18:20:17", "url": "https://files.pythonhosted.org/packages/4a/ad/c93f6cfa83a8534ad52afc3e5d3db7d7c5f87c15f178cc4a260f14804bb5/scruffington-0.3.8.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e152195caec2b24859836a3112e3599f", "sha256": "6aaf841e83356e6283255d7ba76c11d97b5be74ae35718a9fbedd2e79f33a98d" }, "downloads": -1, "filename": "scruffington-0.3.8.1.tar.gz", "has_sig": false, "md5_digest": "e152195caec2b24859836a3112e3599f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11365, "upload_time": "2019-10-02T18:20:19", "url": "https://files.pythonhosted.org/packages/8d/c0/d6eb8f6ab605f847a0db979dfb1cd13760dd813555c8467ac8beba9c6d9b/scruffington-0.3.8.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "21024ce509abb0ec2f818aa394300194", "sha256": "bff8743e9de89001c8848e338aa05a7965ebb1cb34b14a775e4ed2ec74d41741" }, "downloads": -1, "filename": "scruffington-0.3.8.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "21024ce509abb0ec2f818aa394300194", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14157, "upload_time": "2019-10-02T18:20:17", "url": "https://files.pythonhosted.org/packages/4a/ad/c93f6cfa83a8534ad52afc3e5d3db7d7c5f87c15f178cc4a260f14804bb5/scruffington-0.3.8.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e152195caec2b24859836a3112e3599f", "sha256": "6aaf841e83356e6283255d7ba76c11d97b5be74ae35718a9fbedd2e79f33a98d" }, "downloads": -1, "filename": "scruffington-0.3.8.1.tar.gz", "has_sig": false, "md5_digest": "e152195caec2b24859836a3112e3599f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11365, "upload_time": "2019-10-02T18:20:19", "url": "https://files.pythonhosted.org/packages/8d/c0/d6eb8f6ab605f847a0db979dfb1cd13760dd813555c8467ac8beba9c6d9b/scruffington-0.3.8.1.tar.gz" } ] }