confspec

Framework gestor de configuración.

Autor:Carlos Jenkins
Email:carlos@jenkins.co.cr
Fecha:10 de Octubre 2014

Agenda

Acerca de confspec

http://confspec.readthedocs.org/

confspec es un framework y biblioteca Python que permite a una aplicación manejar sus opciones de configuración fácilmente y con seguridad.

Éste framework permite que se abstraiga los procesos de parseo, importación y exportación de archivos de configuración así como los procesos de parseo, casteo, conversión o interpretación y validación semántica de un opción de configuración.

Problemática y justificación

Se identificó un patrón que se repite constantemente en un gran cantidad de aplicaciones cuando deben gestionar su configuración:

  1. Leer archivo de configuración como string.
  2. Parsear formato del archivo (INI, JSON, etc).
  3. Iterar sobre las opciones y parsear el tipo de dato manualmente.
  4. Verificar si el valor tiene semántico.

Características

Características (cont.)

Arquitectura

Ejemplos

Para utilizar confspec se debe:

  1. Definir una especificación.
  2. Crear una administrador de dicha especificación.
  3. Disfrutar la vida. confspec se va a encargar de todo lo demás.

Básico

Crear especificación:

>>> from confspec import *
>>> spec = [
...     ConfigInt(key='myint', default=1),
...     ConfigBoolean(key='myboolean', default=True),
... ]
>>> spec
[1, True]

Básico (cont.)

Crear manejador:

>>> confmg = ConfigMg(spec)
>>> confmg.set('myint', 2)
>>> confmg.get('myint')
2
>>> confmg.get('myboolean')
True

Básico (cont.)

Crear proxy:

>>> conf = confmg.get_proxy()
>>> conf.myint
2
>>> conf.myint = 3
>>> conf.myint
3
>>> print(confmg.do_export('ini'))
[general]
myboolean = True
myint = 3

Leer y escribir archivos de configuración

>>> confmg = ConfigMg(
...     spec, format='ini', create=False, load=False,
...     files=['/etc/myapp/default.ini', '~/.myapp/config.ini']
... )
>>> confmg.load()
>>> confmg.save()

Validar semántica de las opciones

>>> def valid_age(age):
...     return age > 1 and age < 110
...
>>> from confspec import *
>>> spec = [
...     ConfigInt(key='age', default=18, validator=valid_age),
... ]

Habilitar writeback

>>> confmg = ConfigMg(
...     spec, writeback=True, files=['~/.myapp/config.ini']
... )

Agregar callbacks

>>> def mycallback(key, old_value, value):
...     print('New value for {}: was {}, now it is {}'.format(
...         key, old_value, value
...     ))
...
>>> confmg.register_listener(mycallback, 'mydate')
True
>>> confmg.enable_notify(True)
>>> conf.mydate
datetime.datetime(2014, 9, 30, 17, 40, 20)
>>> conf.mydate = now()

Mejoras y trabajo futuro

Preguntas

¿Preguntas?

Muchas gracias.

Autor:Carlos Jenkins
Email:carlos@jenkins.co.cr
Web:http://carlos.jenkins.co.cr/