Почему это не допустимая схема для Rx? - PullRequest
6 голосов
/ 30 июня 2009

Я использую YAML в качестве формата файла конфигурации для проекта Python.

Недавно я обнаружил, что 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'

Что заставляет меня поверить, что я не указываю «тип» где-то.: -S

Есть идеи?

Я довольно устал бороться с этой штукой ... Есть ли какой-то другой способЯ могу написать схему и использовать ее для проверки моей конфигурацииФайлы *? 1026 *

Заранее спасибо,

Иван

1 Ответ

4 голосов
/ 30 июня 2009

Попробуйте это:

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

Карта может содержать любую строку в качестве ключа, тогда как запись может содержать только ключи, указанные в 'required' и 'option'.

...