2016-12-02 1 views
1

Ich bin dabei zu untersuchen, wie man eine menschenfreundliche Textdarstellung von Wiederholungsregeln ähnlich den toText() und fromText() Methoden von rrule.js; Ich möchte es jedoch in Python unter dateutil.rrule implementieren.Implementierung einer Äquivalenzrelation für Wiederholungsregeln (Rules)

Testen solcher Methoden, die prüfen, dass sie einander 'invers' sind, dh, sie rufen das Ergebnis des anderen auf und prüfen, ob das Ergebnis der ursprünglichen Eingabe entspricht. Was mich zur Frage bringt: Was bedeutet es genau, dass zwei Objekte gleichwertig sind?

Die neueste Version von dateutil.rrule, 2.6.0, scheint keine __eq__ Methode zur rrule Klasse zu haben (siehe source code). Äquivalenz scheint auch nicht so trivial zu sein wie die Äquivalenz aller Attribute, da manchmal ein anderer freq Parameter immer noch zu den gleichen Wiederholungen führen kann. (Zum Beispiel führt freq=DAILY und freq=WEEKLY zu den gleichen Wiederholungszeiten, wenn byweekday=FR gewählt wird; siehe Screen-Grabs unten aus der rrule.js demo).

Kennt jemand eine Implementierung einer Äquivalenzrelation für Rules? (Es muss nicht in Python sein).

enter image description here

enter image description here

Antwort

1

Kennt jemand eine Implementierung einer Äquivalenzrelation für rrules? (Es muss nicht in Python sein).

Nein, denn soweit ich weiß ist es nicht möglich, etwas Zuverlässiges zu haben. Für endliche Regeln (mit COUNT oder UNTIL) können Sie ihre Vorkommensmenge vergleichen - sie wären "äquivalent", wenn die beiden Mengen identisch sind. Aber das kannst du nicht für unendliche Regeln tun.

Ihr Beispiel: „freq = DAILY und freq = WOCHEN der gleichen Wiederholung Zeiten führen, wenn byweekday = FR gewählt wird“ ist nicht immer wahr und kann nicht verallgemeinert werden. Ändern Sie beispielsweise die Häufigkeit.

Oder fügen Sie weitere Tage zu "byweekday" und kombinieren mit BYSETPOS.

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

Und so weiter ...

Testing solche Methoden überprüft, dass sie sich gegenseitig die ‚inverse‘ sind, das heißt, eine auf das Ergebnis der anderen aufrufen und prüfen, ob das Ergebnis entspricht zum ursprünglichen Eingang.

Also gesagt, wenn Ihre Frage zu testen ist, denke ich, dass Sie auf dem Holzweg sind.

Nehmen Sie einfach eine Regel, generieren Sie Text, parsen Sie Text und vergleichen Sie das neue Objekt mit dem Original, um sicherzustellen, dass sie gleich sind. Warum sollten Sie sich um "Äquivalent" kümmern? Es gibt keinen Grund, eine Textdarstellung zu erzeugen, ändert plötzlich die Frequenz, oder?Ein anderer Ansatz besteht darin, die beiden Methoden unabhängig voneinander zu testen und zuzugeben, dass die Repräsentation "natürlicher Sprache" unscharf ist und dass die beiden Methoden nicht genau zueinander invers sein können. Nehmen Sie einen Datensatz von "rule => text version" und testen Sie die Generierung. Dann nehmen Sie einen anderen Datensatz von "text version => rule" und testen Sie den Parser.

+0

In der Tat, auch in rrule.js, scheint die 'Rules' nicht genau rekonstruierbar zu sein, da sie die Startzeit (den' dtstart' Parameter) auslässt. Vielleicht reicht es aus, nur eine "rule => text_version" -Umsetzung zu implementieren. –