Skip to main content

The janitor

Project description

https://img.shields.io/travis/snare/scruffy.svg https://img.shields.io/pypi/format/scruffington.svg https://readthedocs.org/projects/scruffy/badge/?version=latest

Scruffy. The Janitor.

Scruffy 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.

A typical use case for Scruffy is a command-line Python tool with some or all of the following requirements:

  • Read a set of configuration defaults

  • Read a local configuration file and apply it on top of the defaults

  • Allow overriding some configuration options with command line flags or at runtime

  • Load a core set of Python-based plugins

  • Load a set of user-defined Python-based plugins

  • Generate log files whose name, location and other logging settings are based on configuration

  • Store application state between runs in a file or database

Scruffy is used by Voltron and Calculon

Installation

A standard python setup script is included.

$ python setup.py install

This will install the Scruffy package wherever that happens on your system.

Alternately, 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).

$ pip install scruffington

Documentation

Full documentation is hosted at readthedocs

Quick start

Config

Load 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.

thingy.yaml:

some_property:  1
other_property: a thing

thingy.py:

from scruffy import ConfigFile

c = ConfigFile('thingy.yaml', load=True,
    defaults=File('defaults.yaml', parent=PackageDirectory())
)

print("c.some_property == {c.some_property}".format(c=c))
print("c.other_property == {c.other_property}".format(c=c))

Run it:

$ python thingy.py
c.some_property == 1
c.other_property == a thing

Plugins

Load some plugins.

~/.thingy/plugins/example.py:

from scruffy import Plugin

class ExamplePlugin(Plugin):
    def do_a_thing(self):
        print('{}.{} is doing a thing'.format(__name__, self.__class__.__name__))

thingy.py:

from scruffy import PluginDirectory, PluginRegistry

pd = PluginDirectory('~/.thingy/plugins')
pd.load()

for p in PluginRegistry.plugins:
    print("Initialising plugin {}".format(p))
    p().do_a_thing()

Run it:

$ python thingy.py
Initialising plugin <class 'example.ExamplePlugin'>
example.ExamplePlugin is doing a thing

Logging

Scruffy’s LogFile class will do some configuration of Python’s logging module.

log.py:

import logging
from scruffy import LogFile

log = logging.getLogger('main')
log.setLevel(logging.INFO)
LogFile('/tmp/thingy.log', logger='main').configure()

log.info('Hello from log.py')

/tmp/thingy.log:

Hello from log.py

Environment

Scruffy’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.

~/.thingy/config:

log_dir:    /tmp/logs
log_file:   thingy.log

env.py:

from scruffy import *

e = Environment(
    main_dir=Directory('~/.thingy', create=True,
        config=ConfigFile('config', defaults=File('defaults.yaml', parent=PackageDirectory())),
        lock=LockFile('lock')
        user_plugins=PluginDirectory('plugins')
    ),
    log_dir=Directory('{config:log_dir}', create=True
        LogFile('{config:log_file}', logger='main')
    ),
    pkg_plugins=PluginDirectory('plugins', parent=PackageDirectory())
)

License

See LICENSE file. If you use this and don’t hate it, buy me a beer at a conference some time.

Credits

Props to richo. Flat duck pride.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scruffington-0.3.9.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

scruffington-0.3.9-py2.py3-none-any.whl (14.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file scruffington-0.3.9.tar.gz.

File metadata

  • Download URL: scruffington-0.3.9.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for scruffington-0.3.9.tar.gz
Algorithm Hash digest
SHA256 c5a0accb943fd532f2e6ee9e98ae2ac97032246a6b8393a180038a24c11096ed
MD5 8e22e582758244632cae2858f0ecf138
BLAKE2b-256 906f58d8fc9750db4d5d14c37f96ab1b604679adf9f02e447c4cfe1055207477

See more details on using hashes here.

File details

Details for the file scruffington-0.3.9-py2.py3-none-any.whl.

File metadata

  • Download URL: scruffington-0.3.9-py2.py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for scruffington-0.3.9-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 290736f5d55502f3d939cc125e0cd0a143c2ef8606de1bcc4b083ff2404f4573
MD5 88272aa578a7db5ac4a5866cc76f0970
BLAKE2b-256 dfabbab06583872a571e420da5cef8ad156de57269d9ae12915c087c954986cf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page