2016-12-02 17 views
1

Я изучаю, как реализовать удобное для пользователя текстовое представление правил повторения, аналогичное методам toText() и fromText()rrule.js; однако, я хотел бы реализовать его в здании Python на dateutil.rrule.Выполнение отношения эквивалентности для правил повторения (rrules)

Тестирование таких методов, проверяющих, что они являются «обратными» друг друга, то есть вызовом одного из результатов другого и проверкой того, что результат эквивалентен исходному входу. Это подводит меня к вопросу: что это значит для двух объектов rrule?

Последняя версия dateutil.rrule, 2.6.0, как представляется, не имеет __eq__ метод для rrule класса (см source code). Эквивалентность также не кажется столь же тривиальной, как эквивалентность всех атрибутов, потому что иногда другой параметр freq может по-прежнему приводить к одинаковым рецидивам. (Например, freq=DAILY и freq=WEEKLY приводит к тому же времени повторения, если выбрано byweekday=FR, см. Скриншоты ниже от rrule.js demo).

Кто-нибудь знает о реализации отношения эквивалентности для rrules? (Это не должно быть в Python).

enter image description here

enter image description here

ответ

1

Кто-нибудь знает реализации отношения эквивалентности для rrules? (Это не должно быть в Python).

Нет, поскольку, насколько я знаю, невозможно надевать что-то надежное. Для конечных правил (с помощью COUNT или UNTIL) вы можете сравнить их набор вхождения - они будут «эквивалентными», если оба набора идентичны. Но вы не можете сделать это для бесконечных правил.

Ваш пример: «freq = DAILY и freq = WEEKLY приводит к тем же самым временам повторения, если byweekday = FR выбрано« не всегда верно и не может быть обобщено. Например, измените частоту.

FREQ=DAILY;BYDAY=FR;INTERVAL=2 
FREQ=WEEKLY;BYDAY=FR;INTERVAL=2 

Или добавьте больше дней в «byweekday» и объедините их с BYSETPOS.

FREQ=DAILY;BYDAY=MO,FR;BYSETPOS=-1 
FREQ=WEEKLY;BYDAY=MO,FR;BYSETPOS=-1 

И так далее ...

Испытательные такие методы проверки, что они друг друга «обратного», то есть, позвонив по одному на результат другой и проверки того, что результат эквивалентен к исходному входу.

Так что, если ваш вопрос касается тестирования, я думаю, что вы ошибаетесь.

Просто возьмите правило, создайте текст, проанализируйте текст и сравните новый объект с оригинальным, чтобы убедиться, что они равно. Зачем вам нужно беспокоиться о «эквиваленте»? Нет причины генерировать текстовое представление, которое внезапно меняет частоту, не так ли?

Другой подход состоит в том, чтобы проверить два метода независимо и просто признать, что представление «естественный язык» является нечетким, и эти два метода не могут быть строго взаимно противоположными друг другу. Возьмите один набор данных «rule => text version» и протестируйте генерацию. Затем возьмите другой набор данных «text version => rule» и протестируйте парсер.

+0

Действительно, в rrule.js 'rrule', похоже, не может быть точно восстановлен из его строкового представления, поскольку последний опускает время начала (параметр' dtstart'). Возможно, будет достаточно реализовать только преобразование «rule => text_version». –

 Смежные вопросы

  • Нет связанных вопросов^_^