Skip to main content

Config file sections as objects

Project description

Latest PyPI Version License

Fileconfig turns config file sections into Python objects. Create a class referring to an INI file specifying the arguments for the different instances to be created. Calling the class with the section name as parameter will return the instance with the parameters specified in the config section.

Installation

$ pip install fileconfig

Usage

Create as subclass of fileconfig.Config and set its filename attribute to your INI-file name.

If the filename is relative, it is interpreted relative to the path of the module where your class is defined.

>>> import fileconfig

>>> class Cfg(fileconfig.Config):
...     filename = 'examples/pets.ini'
...     def __init__(self, key, **kwargs):
...         self.key = key
...         self.__dict__.update(kwargs)
...     def __str__(self):
...         items = ('  %r: %r' % (k, v) for k, v in sorted(self.__dict__.iteritems()))
...         return '{\n%s\n}' % ',\n'.join(items)

On instance creation, the __init__ method will be called with the section name (key) and the keyword args from the selected section of the INI-file.

Suppose your INI-file begins like this:

[parrot]
species = Norwegian blue
can_talk = yes
quantity = 0
characteristics = beatiful plumage, pining for the fjords

To retrieve an instance, call the class with a section name.

>>> c = Cfg('parrot')

>>> print c
{
  'can_talk': 'yes',
  'characteristics': 'beatiful plumage, pining for the fjords',
  'key': 'parrot',
  'quantity': '0',
  'species': 'Norwegian blue'
}

Only one instance will be created for each section (a.k.a. the singleton pattern):

>>> Cfg('parrot') is c
True

The default __repr__ of instances is roundtripable:

>>> c
__main__.Cfg('parrot')

The constructor is also idempotent:

>>> Cfg(c) is c
True

Aliasing

You can specify a space-delimited list of aliases for each section:

[slug]
aliases = snail special_offer
species = slug
can_talk = no
quantity = 1

Aliases map to the same instance:

>>> s = Cfg('special_offer')

>>> s
__main__.Cfg('slug')

>>> s is Cfg('snail') is Cfg('slug')
True

Inspect instance names:

>>> s.key
'slug'

>>> s.aliases
['snail', 'special_offer']

>>> s.names
['slug', 'snail', 'special_offer']

To use a different delimiter for aliases override the _split_aliases method on your class.

Make it a staticmethod or classmethod that takes a single string argument and returns the splitted list.

Inheritance

INI-file sections can inherit from another section:

[polly]
inherits = parrot
can_talk = no
characteristics = dead, totally stiff, ceased to exist

Specified keys override inherited ones:

>>> print Cfg('polly')
{
  'can_talk': 'no',
  'characteristics': 'dead, totally stiff, ceased to exist',
  'inherits': 'parrot',
  'key': 'polly',
  'quantity': '0',
  'species': 'Norwegian blue'
}

Multiple or chained inheritance is not supported.

Introspection

Use the class to iterate over the instances from all section:

>>> list(Cfg)
[__main__.Cfg('parrot'), __main__.Cfg('slug'), __main__.Cfg('polly')]

Print the string representation of all instances:

>>> Cfg.pprint_all()  # doctest: +ELLIPSIS
{
  'can_talk': 'yes',
  'characteristics': 'beatiful plumage, pining for the fjords',
  'key': 'parrot',
...

Hints

Apart from the key, aliases, and inherits parameters, the __init__ method receives the unprocessed strings from the INI-file parser.

Use the __init__ method to process the other arguments:

>>> class Pet(Cfg):
...     def __init__(self, can_talk, quantity, characteristics=None, **kwargs):
...         self.can_talk = {'yes':True, 'no': False}[can_talk]
...         self.quantity = int(quantity)
...         if characteristics is not None and characteristics.split():
...             self.characteristics = [c.strip() for c in characteristics.split(',')]
...         super(Pet, self).__init__(**kwargs)

>>> print Pet('polly')
{
  'can_talk': False,
  'characteristics': ['dead', 'totally stiff', 'ceased to exist'],
  'inherits': 'parrot',
  'key': 'polly',
  'quantity': 0,
  'species': 'Norwegian blue'
}

By default, this package will use ConfigParser.SafeConfigParser from the standard library to parse the INI-file.

To use a different parser, override the _parser attribute in your fileconfig.Config subclass.

License

Fileconfig is distributed under the MIT license.

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

fileconfig-0.1.zip (11.3 kB view hashes)

Uploaded Source

Supported by

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