2009-06-30 13 views
5

Sto usando YAML come formato di file di configurazione per un progetto Python.Perché questo non è uno schema valido per Rx?

Recentemente ho trovato Rx l'unico validatore di schema disponibile per Python e YAML. : -/Kwalify funziona con YAML, ma è solo per Ruby e Java. :(

Ho letto la documentazione manca tutto il giorno e proprio non riesco a scrivere uno schema valido per rappresentare la mia struttura di file Aiuto

ho il seguente file YAML di configurazione:.?

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

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

echo: 
    exec: echo % 

Non riesco a rappresentare una struttura nidificata Ciò che voglio è che l'elemento più esterno (cmd, load ed echo, in questo caso) sia una stringa arbitraria che a sua volta contiene altri elementi. è una stringa fissa e un elemento richiesto, "alias" e "filtro" sono anch'essi corretti, ma dovrebbero essere facoltativi. Il filtro a sua volta ha un altro insieme di elementi obbligatori e facoltativi. rappresenta questo con Rx?

Finora ho il seguente schema (in YAML), che Rx non riesce a compilare:

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 

Testing questo IPython mi dà questo:

/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' 

Il che mi porta a credere che non sto specificando "type" da qualche parte. : -S

Qualche idea?

Sono piuttosto stanco di combattere con questa cosa ... C'è un altro modo in cui posso scrivere uno schema e usarlo per convalidare i miei file di configurazione?

Grazie in anticipo,

Ivan

risposta

4

Prova questo:

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 

Una mappa può contenere qualsiasi stringa come una chiave, mentre un rec può contenere solo le chiavi specificate in 'necessaria' e 'opzionale'.

+1

Sì, funziona! Non ho mai pensato di usare // mappa in questo modo; era troppo concentrato sul tipo // rec. L'autore di Rx, Ricardo Signes, mi ha gentilmente inviato una risposta utile, che ho pensato di condividere con qualcuno che potrebbe avere un problema simile in futuro: http://pastebin.com/ f13421133. Spero che non gli dispiaccia farlo. Grazie per la tua risposta, Daniel! Mi hai salvato la giornata! : D – imiric

+0

Sto provando a utilizzare questo modulo nel mio progetto ma, come ha detto @imiric, la documentazione non è amichevole. Puoi condividere qualche esempio di codice Python che usi questo per favore? – NI6

Problemi correlati