configdict

This package provides two classes, CheckedDict and ConfigDict, which allow to define a dict with default values and a set of allowed keys. Any modification to the dict can be validated against a set of rules.

configdict.configdict Module

CheckedDict

A dictionary based on a default prototype. A CheckedDict can only define key:value pairs which are already present in the default. It is possible to define a docstring for each key and different restrictions for the values regarding possible values, ranges and type. A CheckedDict is useful for configuration settings.

If no mutable values are used, a CheckedDict is hashable

ConfigDict

Based on CheckedDict, a ConfigDict is a persistent, unique dictionary. It is saved under the config folder determined by the OS and it is updated with each modification. It is useful for implementing configuration of a module / library / app, where there is a default/initial state and the user needs to be able to configure global settings which must be persisted between sessions (similar to the settings in an application)

Example

from configdict import ConfigDict

config = ConfigDict("myproj.subproj")
config.addKey("keyA", 10, doc="documentaion of keyA")
config.addKey("keyB", 0.5, range=(0, 1))
config.addKey("keyC", "blue", choices=("blue", "red"),
              doc="documentation of keyC")
config.load()

Alternativaly, a ConfigDict or a CheckedDict can be built via a context manager:

with ConfigDict("plotting") as cfg:
    # While building a config, __call__ is equivalent to addKey
    cfg('backend', 'matplotlib', choices={'matlotlib'})
    cfg('spectrogram.figsize', (24, 8))
    cfg('spectrogram.maxfreq', 12000,
        doc="Highest frequency in a spectrogram")
    cfg('spectrogram.window', 'hamming', choices={'hamming', 'hanning'})
    # no need to call .load, it is called automatically

A ConfigDict can be created all at once

config = ConfigDict("myapp",
    default = {
        'font-size': 10.0,
        'font-family': "Monospace",
        'port' : 9100,
    },
    validator = {
        'font-size::range' : (8, 24),
        'port::range' : (9000, 65000),
        'font-family::choices' : {'Roboto', 'Monospace'},
        'port': lambda cfg, port: checkPortAvailable(port)
    },
    docs = {
        'port': 'The port number to listen to',
        'font-size': 'The size of the font, in pixels'
    }
)

This will create the dictionary and load any persisted version. Any saved modifications will override the default values. Whenever the user changes any value (via config[key] = newvalue) the dictionary will be saved.

In all other respects a ConfigDict behaves like a normal dictionary.

Functions

getConfig(name)

Retrieve a previously created ConfigDict.

activeConfigs()

Returns a dict of active configs

configPathFromName(name[, fmt])

Given a config name, return the path where it should be saved

Classes

CheckedDict([default, validator, docs, ...])

A dictionary which checks that the keys and values are valid according to a default dict and a validator.

ConfigDict(name[, default, validator, docs, ...])

This is an optionally persistent dictionary used for configuration.

Class Inheritance Diagram

digraph inheritance5e25dce564 { bgcolor=transparent; rankdir=LR; size="8.0, 12.0"; "CheckedDict" [URL="api/configdict.configdict.CheckedDict.html#configdict.configdict.CheckedDict",fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A dictionary which checks that the keys and values are valid"]; "ConfigDict" [URL="api/configdict.configdict.ConfigDict.html#configdict.configdict.ConfigDict",fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="This is an optionally persistent dictionary used for configuration."]; "CheckedDict" -> "ConfigDict" [arrowsize=0.5,style="setlinewidth(0.5)"]; }