2009-06-30 84 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