2009-06-30 30 views
5

Estoy usando YAML como formato de archivo de configuración para un proyecto de Python.¿Por qué no es este un esquema válido para Rx?

Recientemente encontré que Rx es el único validador de esquema disponible para Python y YAML. : -/Kwalify funciona con YAML, pero es solo para Ruby y Java. :(

He estado leyendo su documentación carece de todo el día y parece que no puede escribir un esquema válido para representar la estructura de mi archivo de ayuda

tengo el siguiente archivo YAML de configuración:.?

cmd: 
    exec: mycmd 
    aliases: [my, cmd] 
    filter: 
    sms: 'regex .*' 

load: 
    exec: load 
    filter: 
    sms: 'load: .*$' 

echo: 
    exec: echo % 

Fallo al representar una estructura anidada Lo que quiero es que el elemento externo (cmd, carga y eco, en este caso) sea una cadena arbitraria que a su vez contenga otros elementos. 'Exec' es una cadena fija y un elemento requerido; los 'alias' y 'filtro' también son fijos, pero deben ser opcionales. El filtro a su vez tiene otro conjunto de elementos obligatorios y opcionales. ¿Cómo debería hacerlo? representar esto con Rx?

Hasta ahora tengo el siguiente esquema (en YAML), que Rx falla al compilar:

type: //rec 
required: 
    type: //rec 
    required: 
    exec: //str 
    optional: 
    aliases: 
     type: //arr 
     contents: //str 
     length: {min: 1, max: 10} 
    filter: 
     type: //rec 
     optional: 
     sms: //str 
     email: //str 
     all: //str 

Prueba esto en IPython me da esto:

/Rx.py in make_schema(self, schema) 
    68  raise Error('invalid schema argument to make_schema') 
    69 
---> 70  uri = self.expand_uri(schema["type"]) 
    71 
    72  if not self.type_registry.get(uri): raise "unknown type %s" % uri 

KeyError: 'type' 

que me lleva a creer que No estoy especificando "tipo" en alguna parte. : -S

¿Alguna idea?

Estoy bastante cansado de pelear con esto ... ¿Hay alguna otra forma en que pueda escribir un esquema y usarlo para validar mis archivos de configuración?

Gracias de antemano,

Ivan

Respuesta

4

Prueba esto:

type: //map 
values: 
    type: //rec 
    required: 
    exec: //str 
    optional: 
    aliases: 
     type: //arr 
     contents: //str 
     length: {min: 1, max: 10} 
    filter: 
     type: //rec 
     optional: 
     sms: //str 
     email: //str 
     all: //str 

un mapa puede contener cualquier cadena como una llave, mientras que un rec sólo puede contener las claves especificadas en 'necesaria' y 'opcional'.

+1

¡Sí, eso funciona! Nunca pensé en usar // el mapa de esta manera; estaba demasiado centrado en el // tipo de rec. El autor de Rx, Ricardo Signes, amablemente también me ha enviado una respuesta útil, que pensé que compartiría con alguien que pudiera tener un problema similar en el futuro: http://pastebin.com/ f13421133. Espero que no le importe que lo haga. ¡Gracias por su respuesta, Daniel! ¡Salvaste mi día! : D – imiric

+0

Estoy tratando de usar este módulo en mi proyecto, pero como @ymiric dijo, la documentación no es amigable. ¿Puedes compartir algún ejemplo de código python que use esto por favor? – NI6

Cuestiones relacionadas