Почему это неверная схема для Rx?
Вопрос
Я использую YAML в качестве формата файла конфигурации для проекта Python.
Недавно я нашел прием быть единственным валидатором схемы, доступным для Python и YAML.:-/ Квалифи работает с 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'
Это заставляет меня думать, что я где-то не указываю «тип».:-С
Есть идеи?
Я уже устал бороться с этой штукой...Есть ли другой способ написать схему и использовать ее для проверки файлов конфигурации?
Заранее спасибо,
Иван
Решение
Попробуй это:
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
Карта может содержать любую строку в качестве ключа, тогда как запись может содержать только ключи, указанные в «обязательных» и «необязательных».