[Calypso] Incorrect parsing of rrule?
Guido Günther
agx at sigxcpu.org
Sun Jan 24 22:32:16 PST 2016
Hi,
On Sun, Jan 24, 2016 at 10:59:24PM +0100, Petter Reinholdtsen wrote:
> [Guido Günther]
> > Hi Petter,
>
> Hi.
>
> > this looks pretty much like your exception.
>
> Yes.
>
> >> Is the problem perhaps that the <time-range> xml tag is missing an end
> >> tag? Is this required by the protocol?
> >
> > https://tools.ietf.org/html/rfc4791#section-9.9
> >
> > says that one element is sufficient. Assuming -∞ or +∞ respectively. Can
> > you cook up a patch to fix this and at tests that we don't regress
> > later?
>
> Right. Thank you for the standard reference. The following patch solve
> the issue I am seing with korganizer, but I am unsure how to write the
> test.
>
> diff --git a/calypso/xmlutils.py b/calypso/xmlutils.py
> index e94a5e9..3ce5ba5 100644
> --- a/calypso/xmlutils.py
> +++ b/calypso/xmlutils.py
> @@ -275,6 +275,12 @@ def match_filter_element(vobject, fe):
> return False
> start = fe.get("start")
> end = fe.get("end")
> + # RFC 4791 state if start is missing, assume it is -infinity
> + if start is None:
> + start = "00010101T000000Z" # start of year zero
> + # RFC 4791 state if end is missing, assume it is +infinity
> + if end is None:
> + end = "99991231T235959Z" # last date with four digit year
> if rruleset is None:
> rruleset = dateutil.rrule.rruleset()
> dtstart = vobject.dtstart.value
>
> I tried this test, but it do not produce a backtrace even if my fix is
> not present, so it is not testing what I hoped it would be testing.
>
> diff --git a/tests/test_collection.py b/tests/test_collection.py
> index feda9a0..3a61a29 100644
> --- a/tests/test_collection.py
> +++ b/tests/test_collection.py
> @@ -2,6 +2,7 @@
> """Test L{gbp.command_wrappers.Command}'s tarball unpack"""
>
> import os
> +import sys
> import subprocess
> import tempfile
> import shutil
> @@ -9,10 +10,13 @@ import unittest
>
> import calypso.config
> from calypso.webdav import Collection
> +from calypso import xmlutils
> +from calypso import paths
>
>
> class TestCollection(unittest.TestCase):
> test_vcard = "tests/data/import.vcard"
> + test_vcal = "tests/data/import.vcal"
>
> def setUp(self):
> self.tmpdir = tempfile.mkdtemp()
> @@ -29,3 +33,30 @@ class TestCollection(unittest.TestCase):
> self.assertEqual(len(collection.items), 2)
> org = u'Universitetet i Tromsø'
> self.assertTrue(org == collection.items[0].object.org.value[0])
> +
> + def test_report(self):
> + xml_request ="""
> +<calendar-query xmlns="urn:ietf:params:xml:ns:caldav">
> + <prop xmlns="DAV:">
> + <getetag xmlns="DAV:"/>
> + <resourcetype xmlns="DAV:"/>
> + </prop>
> + <filter xmlns="urn:ietf:params:xml:ns:caldav">
> + <comp-filter xmlns="urn:ietf:params:xml:ns:caldav" name="VCALENDAR">
> + <comp-filter xmlns="urn:ietf:params:xml:ns:caldav" name="VTODO">
> + <time-range xmlns="urn:ietf:params:xml:ns:caldav" start="20151021T201004Z"/>
> + </comp-filter>
> + </comp-filter>
> + </filter>
> +</calendar-query>
> +"""
> + collection = Collection("")
> + self.assertTrue(collection.import_file(self.test_vcal))
> + path = paths.base_prefix()
> +
> + # Tried calling do_REPORT() directly, but lacked the arguments
> + # needed to get the CollectionHTTPHandler class working.
> + answer = xmlutils.report(path, xml_request, collection)
> +
> + sys.stderr.write("REPORT " + answer)
> +
>
> Anyone with clues to spare?
Sidestepping your problem since we're currently concerned with filter
rules:
Wouldn't it be simpler to exercise match_filter_element() directly
(introducing a new unit test class TestMatchFIlterElement). You'd then
have tight control on the input data and the matching rules. The
necessary data could be dumped out of match_filter_element() with the
unpatched code.
Cheers,
-- Guido
More information about the Calypso
mailing list