2009-06-30 83 views
5

我使用YAML作爲Python項目的配置文件格式。爲什麼這不是Rx的有效模式?

最近我發現Rx是唯一可用於Python和YAML的模式驗證程序。 : -/Kwalify適用於YAML,但僅適用於Ruby和Java。 :(

我一直在閱讀他們缺乏資料一整天,只是似乎無法寫一個有效的模式來表示我的文件結構幫助

我有以下YAML配置文件:?

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

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

echo: 
    exec: echo % 

我無法表示一個嵌套結構我想要的是最外層項目(cmd,load和echo,在這種情況下)是一個任意的字符串,它包含其他項目'exec'是一個固定的字符串和必需的項目;'別名'和'過濾器'也是固定的,但應該是可選的。用Rx代表這個?

到目前爲止,我有以下模式(在YAML),它的Rx無法編譯:

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 

測試這在IPython中給了我這樣的:

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

這使我相信我'm沒有在某處指定「類型」。 :-S

任何想法?

我很累這場戰鬥...有沒有其他的方式可以寫一個模式,並用它來驗證我的配置文件?

由於提前,

伊凡

回答

4

嘗試這種情況:

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 

一個地圖可以包含任何的字符串作爲關鍵字,而REC只能包含在「必要」中指定的鍵和'可選'。

+1

是的,這工作!我從來沒有想過用這種方式使用//地圖;過於專注於// rec類型。 Rx的作者Ricardo Signes向我發送了一個有幫助的迴應,我想我會與任何可能在未來出現類似問題的人分享一個小竅門:http://pastebin.com/ f13421133。我希望他不介意我這樣做。 謝謝你的回答,丹尼爾!你救了我的一天! :D – imiric 2009-06-30 16:04:44