2009-06-30 10 views
5

Używam YAML jako format pliku konfiguracyjnego dla projektu Python.Dlaczego ten schemat nie jest poprawny dla Rx?

Ostatnio znalazłem Rx jako jedyny walidator schematu dostępny dla Pythona i YAML. : -/Kwalify współpracuje z YAML, ale tylko dla Ruby i Java. :(

Czytałem dokumentację brakuje przez cały dzień i po prostu nie może wydawać się, aby napisać poprawny schemat do reprezentowania mojego strukturę plików Pomoc

Mam następujący plik konfiguracyjny YAML.?

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

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

echo: 
    exec: echo % 

Nie udaje mi się reprezentować struktury zagnieżdżonej, czego potrzebuję dla najbardziej zewnętrznego elementu (cmd, load i echo, w tym przypadku), aby być dowolnym ciągiem, który z kolei zawiera inne elementy. "Exec" jest ustalonym łańcuchem i wymaganym elementem, "aliasy" i "filtr" są również poprawione, ale powinny być opcjonalne, natomiast filtr ma inny zestaw wymaganych i opcjonalnych elementów. reprezentować to z Rx?

tej pory mam następujący schemat (w YAML), który Rx zawiedzie skompilować:

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 

Testowanie to w ipython daje mi to:

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

co prowadzi mnie do wierzę "Nie mam gdzieś określenia" typ ". : -S

Jakieś pomysły?

Jestem dość zmęczony, walcząc z tym ... Czy jest jakiś inny sposób, w jaki mogę napisać schemat i użyć go do sprawdzenia poprawności plików konfiguracyjnych?

Dzięki z góry,

Ivan

Odpowiedz

4

Spróbuj tego:

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 

Mapa może zawierać dowolny ciąg znaków jako klucz, natomiast rec może zawierać tylko klawisze wyszczególnione w „niezbędna” i "opcjonalne".

+1

Tak, to działa! Nigdy nie myślałem o używaniu // mapy w ten sposób; był zbyt skoncentrowany na typie // rec. Autor Rx, Ricardo Signes, uprzejmie przesłał mi pomocną odpowiedź, co do której pomyślałem, że udostępnię snipper każdemu, kto może mieć podobny problem w przyszłości: http://pastebin.com/ f13421133. Mam nadzieję, że mi to nie przeszkadza. Dzięki za odpowiedź, Daniel! Uratowałeś mój dzień! : D – imiric

+0

Próbuję użyć tego modułu w moim projekcie, ale jak powiedział @imiric, dokumentacja nie jest przyjazna. Czy możesz podać przykładowy kod Pythona, który używa tego? – NI6