kopia lustrzana https://github.com/collective/icalendar
used bytestrings where appropriate
again :-) hopefully I now got all the easy to fix errorspull/113/head
rodzic
5b131b1b63
commit
f1b1f9a1b2
|
@ -205,7 +205,7 @@ class vFloat(float):
|
|||
return self
|
||||
|
||||
def to_ical(self):
|
||||
return str(self)
|
||||
return compat.unicode_type(self).encode('utf-8')
|
||||
|
||||
@classmethod
|
||||
def from_ical(cls, ical):
|
||||
|
@ -225,7 +225,7 @@ class vInt(int):
|
|||
return self
|
||||
|
||||
def to_ical(self):
|
||||
return str(self)
|
||||
return compat.unicode_type(self).encode('utf-8')
|
||||
|
||||
@classmethod
|
||||
def from_ical(cls, ical):
|
||||
|
@ -256,8 +256,12 @@ class vDDDLists(object):
|
|||
self.dts = vDDD
|
||||
|
||||
def to_ical(self):
|
||||
dts_ical = (dt.to_ical() for dt in self.dts)
|
||||
return ",".join(dts_ical)
|
||||
try:
|
||||
dts_ical = (dt.to_ical() for dt in self.dts)
|
||||
return b",".join(dts_ical)
|
||||
except:
|
||||
import pdb; pdb.set_trace()
|
||||
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical, timezone=None):
|
||||
|
@ -334,7 +338,8 @@ class vDate(object):
|
|||
self.params = Parameters(dict(value='DATE'))
|
||||
|
||||
def to_ical(self):
|
||||
return "%04d%02d%02d" % (self.dt.year, self.dt.month, self.dt.day)
|
||||
s = "%04d%02d%02d" % (self.dt.year, self.dt.month, self.dt.day)
|
||||
return s.encode('utf-8')
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical):
|
||||
|
@ -381,7 +386,7 @@ class vDatetime(object):
|
|||
s += "Z"
|
||||
elif tzid:
|
||||
self.params.update({'TZID': tzid})
|
||||
return s
|
||||
return s.encode('utf-8')
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical, timezone=None):
|
||||
|
@ -443,9 +448,12 @@ class vDuration(object):
|
|||
if seconds:
|
||||
timepart += "%dS" % seconds
|
||||
if self.td.days == 0 and timepart:
|
||||
return "%sP%s" % (sign, timepart)
|
||||
return (compat.unicode_type(sign).encode('utf-8') + b'P' +
|
||||
compat.unicode_type(timepart).encode('utf-8'))
|
||||
else:
|
||||
return "%sP%dD%s" % (sign, abs(self.td.days), timepart)
|
||||
return (compat.unicode_type(sign).encode('utf-8') + b'P' +
|
||||
compat.unicode_type(abs(self.td.days)).encode('utf-8') +
|
||||
b'D' + compat.unicode_type(timepart).encode('utf-8'))
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical):
|
||||
|
@ -516,10 +524,10 @@ class vPeriod(object):
|
|||
|
||||
def to_ical(self):
|
||||
if self.by_duration:
|
||||
return '%s/%s' % (vDatetime(self.start).to_ical(),
|
||||
vDuration(self.duration).to_ical())
|
||||
return '%s/%s' % (vDatetime(self.start).to_ical(),
|
||||
vDatetime(self.end).to_ical())
|
||||
return (vDatetime(self.start).to_ical() + b'/' +
|
||||
vDuration(self.duration).to_ical())
|
||||
return (vDatetime(self.start).to_ical() + b'/' +
|
||||
vDatetime(self.end).to_ical())
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical):
|
||||
|
@ -650,10 +658,12 @@ class vRecur(CaselessDict):
|
|||
if not isinstance(vals, SEQUENCE_TYPES):
|
||||
vals = [vals]
|
||||
vals = b','.join(typ(val).to_ical() for val in vals)
|
||||
|
||||
# CaselessDict keys are always unicode
|
||||
key = key.encode(DEFAULT_ENCODING)
|
||||
result.append(key + b'=' + vals)
|
||||
return ';'.join(result)
|
||||
|
||||
return b';'.join(result)
|
||||
|
||||
@classmethod
|
||||
def parse_type(cls, key, values):
|
||||
|
|
|
@ -57,6 +57,6 @@ class TestRecurrence(unittest.TestCase):
|
|||
# code has to handle this as list and not blindly expecting to be able
|
||||
# to call event['EXDATE'].to_ical() on it:
|
||||
self.assertEqual(isinstance(exdate, list), True) # multiple EXDATE
|
||||
self.assertEqual(exdate[0].to_ical(), '20120529T100000')
|
||||
self.assertEqual(exdate[0].to_ical(), b'20120529T100000')
|
||||
|
||||
# TODO: test for embedded timezone information!
|
||||
|
|
|
@ -82,7 +82,8 @@ class TestTimezoned(unittest.TestCase):
|
|||
event.add('url', u'http://plone.org')
|
||||
cal.add_component(event)
|
||||
|
||||
test_out = '|'.join(cal.to_ical().splitlines())
|
||||
test_out = b'|'.join(cal.to_ical().splitlines())
|
||||
test_out = test_out.decode('utf-8')
|
||||
|
||||
vtimezone_lines = "BEGIN:VTIMEZONE|TZID:Europe/Vienna|X-LIC-LOCATION:"\
|
||||
+ "Europe/Vienna|BEGIN:STANDARD|DTSTART;VALUE=DATE-TIME:19701025T03"\
|
||||
|
@ -112,6 +113,6 @@ class TestTimezoned(unittest.TestCase):
|
|||
|
||||
# make sure, it's parsed properly and doesn't throw an error
|
||||
self.assertTrue(icalendar.vDDDTypes(date).to_ical()
|
||||
== '20120830T224100Z')
|
||||
== b'20120830T224100Z')
|
||||
self.assertTrue(icalendar.vDDDTypes(date2).to_ical()
|
||||
== '20120830T224100')
|
||||
== b'20120830T224100')
|
||||
|
|
|
@ -53,13 +53,13 @@ class TestProp(unittest.TestCase):
|
|||
|
||||
def test_prop_vFloat(self):
|
||||
from ..prop import vFloat
|
||||
self.assertEqual(vFloat(1.0).to_ical(), '1.0')
|
||||
self.assertEqual(vFloat(1.0).to_ical(), b'1.0')
|
||||
self.assertEqual(vFloat.from_ical('42'), 42.0)
|
||||
self.assertEqual(vFloat(42).to_ical(), '42.0')
|
||||
self.assertEqual(vFloat(42).to_ical(), b'42.0')
|
||||
|
||||
def test_prop_vInt(self):
|
||||
from ..prop import vInt
|
||||
self.assertEqual(vInt(42).to_ical(), '42')
|
||||
self.assertEqual(vInt(42).to_ical(), b'42')
|
||||
self.assertEqual(vInt.from_ical('13'), 13)
|
||||
self.assertRaises(ValueError, vInt.from_ical, '1s3')
|
||||
|
||||
|
@ -79,13 +79,13 @@ class TestProp(unittest.TestCase):
|
|||
self.assertEqual(str(dt_list[2]), '1996-04-04 01:00:00+00:00')
|
||||
|
||||
dt_list = vDDDLists([])
|
||||
self.assertEqual(dt_list.to_ical(), '')
|
||||
self.assertEqual(dt_list.to_ical(), b'')
|
||||
|
||||
dt_list = vDDDLists([datetime(2000, 1, 1)])
|
||||
self.assertEqual(dt_list.to_ical(), '20000101T000000')
|
||||
self.assertEqual(dt_list.to_ical(), b'20000101T000000')
|
||||
|
||||
dt_list = vDDDLists([datetime(2000, 1, 1), datetime(2000, 11, 11)])
|
||||
self.assertEqual(dt_list.to_ical(), '20000101T000000,20001111T000000')
|
||||
self.assertEqual(dt_list.to_ical(), b'20000101T000000,20001111T000000')
|
||||
|
||||
def test_prop_vDDDTypes(self):
|
||||
from ..prop import vDDDTypes
|
||||
|
@ -108,8 +108,8 @@ class TestProp(unittest.TestCase):
|
|||
def test_prop_vDate(self):
|
||||
from ..prop import vDate
|
||||
|
||||
self.assertEqual(vDate(date(2001, 1, 1)).to_ical(), '20010101')
|
||||
self.assertEqual(vDate(date(1899, 1, 1)).to_ical(), '18990101')
|
||||
self.assertEqual(vDate(date(2001, 1, 1)).to_ical(), b'20010101')
|
||||
self.assertEqual(vDate(date(1899, 1, 1)).to_ical(), b'18990101')
|
||||
|
||||
self.assertEqual(vDate.from_ical('20010102'), date(2001, 1, 2))
|
||||
|
||||
|
@ -119,16 +119,16 @@ class TestProp(unittest.TestCase):
|
|||
from ..prop import vDatetime
|
||||
|
||||
dt = datetime(2001, 1, 1, 12, 30, 0)
|
||||
self.assertEqual(vDatetime(dt).to_ical(), '20010101T123000')
|
||||
self.assertEqual(vDatetime(dt).to_ical(), b'20010101T123000')
|
||||
|
||||
self.assertEqual(vDatetime.from_ical('20000101T120000'),
|
||||
datetime(2000, 1, 1, 12, 0))
|
||||
|
||||
dutc = datetime(2001, 1, 1, 12, 30, 0, tzinfo=pytz.utc)
|
||||
self.assertEqual(vDatetime(dutc).to_ical(), '20010101T123000Z')
|
||||
self.assertEqual(vDatetime(dutc).to_ical(), b'20010101T123000Z')
|
||||
|
||||
dutc = datetime(1899, 1, 1, 12, 30, 0, tzinfo=pytz.utc)
|
||||
self.assertEqual(vDatetime(dutc).to_ical(), '18990101T123000Z')
|
||||
self.assertEqual(vDatetime(dutc).to_ical(), b'18990101T123000Z')
|
||||
|
||||
self.assertEqual(vDatetime.from_ical('20010101T000000'),
|
||||
datetime(2001, 1, 1, 0, 0))
|
||||
|
@ -136,7 +136,7 @@ class TestProp(unittest.TestCase):
|
|||
self.assertRaises(ValueError, vDatetime.from_ical, '20010101T000000A')
|
||||
|
||||
utc = vDatetime.from_ical('20010101T000000Z')
|
||||
self.assertEqual(vDatetime(utc).to_ical(), '20010101T000000Z')
|
||||
self.assertEqual(vDatetime(utc).to_ical(), b'20010101T000000Z')
|
||||
|
||||
# 1 minute before transition to DST
|
||||
dat = vDatetime.from_ical('20120311T015959', 'America/Denver')
|
||||
|
@ -149,26 +149,26 @@ class TestProp(unittest.TestCase):
|
|||
'20120311030000 -0600')
|
||||
|
||||
dat = vDatetime.from_ical('20101010T000000', 'Europe/Vienna')
|
||||
self.assertEqual(vDatetime(dat).to_ical(), '20101010T000000')
|
||||
self.assertEqual(vDatetime(dat).to_ical(), b'20101010T000000')
|
||||
|
||||
def test_prop_vDuration(self):
|
||||
from ..prop import vDuration
|
||||
|
||||
self.assertEqual(vDuration(timedelta(11)).to_ical(), 'P11D')
|
||||
self.assertEqual(vDuration(timedelta(-14)).to_ical(), '-P14D')
|
||||
self.assertEqual(vDuration(timedelta(1, 7384)).to_ical(), 'P1DT2H3M4S')
|
||||
self.assertEqual(vDuration(timedelta(1, 7380)).to_ical(), 'P1DT2H3M')
|
||||
self.assertEqual(vDuration(timedelta(1, 7200)).to_ical(), 'P1DT2H')
|
||||
self.assertEqual(vDuration(timedelta(0, 7200)).to_ical(), 'PT2H')
|
||||
self.assertEqual(vDuration(timedelta(0, 7384)).to_ical(), 'PT2H3M4S')
|
||||
self.assertEqual(vDuration(timedelta(0, 184)).to_ical(), 'PT3M4S')
|
||||
self.assertEqual(vDuration(timedelta(0, 22)).to_ical(), 'PT22S')
|
||||
self.assertEqual(vDuration(timedelta(0, 3622)).to_ical(), 'PT1H0M22S')
|
||||
self.assertEqual(vDuration(timedelta(11)).to_ical(), b'P11D')
|
||||
self.assertEqual(vDuration(timedelta(-14)).to_ical(), b'-P14D')
|
||||
self.assertEqual(vDuration(timedelta(1, 7384)).to_ical(), b'P1DT2H3M4S')
|
||||
self.assertEqual(vDuration(timedelta(1, 7380)).to_ical(), b'P1DT2H3M')
|
||||
self.assertEqual(vDuration(timedelta(1, 7200)).to_ical(), b'P1DT2H')
|
||||
self.assertEqual(vDuration(timedelta(0, 7200)).to_ical(), b'PT2H')
|
||||
self.assertEqual(vDuration(timedelta(0, 7384)).to_ical(), b'PT2H3M4S')
|
||||
self.assertEqual(vDuration(timedelta(0, 184)).to_ical(), b'PT3M4S')
|
||||
self.assertEqual(vDuration(timedelta(0, 22)).to_ical(), b'PT22S')
|
||||
self.assertEqual(vDuration(timedelta(0, 3622)).to_ical(), b'PT1H0M22S')
|
||||
self.assertEqual(vDuration(timedelta(days=1, hours=5)).to_ical(),
|
||||
'P1DT5H')
|
||||
self.assertEqual(vDuration(timedelta(hours=-5)).to_ical(), '-PT5H')
|
||||
b'P1DT5H')
|
||||
self.assertEqual(vDuration(timedelta(hours=-5)).to_ical(), b'-PT5H')
|
||||
self.assertEqual(vDuration(timedelta(days=-1, hours=-5)).to_ical(),
|
||||
'-P1DT5H')
|
||||
b'-P1DT5H')
|
||||
|
||||
# How does the parsing work?
|
||||
self.assertEqual(vDuration.from_ical('PT1H0M22S'), timedelta(0, 3622))
|
||||
|
@ -185,10 +185,10 @@ class TestProp(unittest.TestCase):
|
|||
# One day in exact datetimes
|
||||
per = (datetime(2000, 1, 1), datetime(2000, 1, 2))
|
||||
self.assertEqual(vPeriod(per).to_ical(),
|
||||
'20000101T000000/20000102T000000')
|
||||
b'20000101T000000/20000102T000000')
|
||||
|
||||
per = (datetime(2000, 1, 1), timedelta(days=31))
|
||||
self.assertEqual(vPeriod(per).to_ical(), '20000101T000000/P31D')
|
||||
self.assertEqual(vPeriod(per).to_ical(), b'20000101T000000/P31D')
|
||||
|
||||
# Roundtrip
|
||||
p = vPeriod.from_ical('20000101T000000/20000102T000000')
|
||||
|
@ -197,7 +197,7 @@ class TestProp(unittest.TestCase):
|
|||
(datetime(2000, 1, 1, 0, 0), datetime(2000, 1, 2, 0, 0))
|
||||
)
|
||||
self.assertEqual(vPeriod(p).to_ical(),
|
||||
'20000101T000000/20000102T000000')
|
||||
b'20000101T000000/20000102T000000')
|
||||
|
||||
self.assertEqual(vPeriod.from_ical('20000101T000000/P31D'),
|
||||
(datetime(2000, 1, 1, 0, 0), timedelta(31)))
|
||||
|
@ -205,7 +205,7 @@ class TestProp(unittest.TestCase):
|
|||
# Roundtrip with absolute time
|
||||
p = vPeriod.from_ical('20000101T000000Z/20000102T000000Z')
|
||||
self.assertEqual(vPeriod(p).to_ical(),
|
||||
'20000101T000000Z/20000102T000000Z')
|
||||
b'20000101T000000Z/20000102T000000Z')
|
||||
|
||||
# And an error
|
||||
self.assertRaises(ValueError,
|
||||
|
@ -217,12 +217,12 @@ class TestProp(unittest.TestCase):
|
|||
end = datetime(2000, 1, 2, tzinfo=dk)
|
||||
per = (start, end)
|
||||
self.assertEqual(vPeriod(per).to_ical(),
|
||||
'20000101T000000/20000102T000000')
|
||||
b'20000101T000000/20000102T000000')
|
||||
self.assertEqual(vPeriod(per).params['TZID'],
|
||||
'Europe/Copenhagen')
|
||||
|
||||
p = vPeriod((datetime(2000, 1, 1, tzinfo=dk), timedelta(days=31)))
|
||||
self.assertEqual(p.to_ical(), '20000101T000000/P31D')
|
||||
self.assertEqual(p.to_ical(), b'20000101T000000/P31D')
|
||||
|
||||
def test_prop_vWeekday(self):
|
||||
from ..prop import vWeekday
|
||||
|
@ -258,7 +258,7 @@ class TestProp(unittest.TestCase):
|
|||
})
|
||||
self.assertEqual(
|
||||
vRecur(r).to_ical(),
|
||||
'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
b'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
)
|
||||
|
||||
r = vRecur(FREQ='yearly', INTERVAL=2)
|
||||
|
@ -270,22 +270,22 @@ class TestProp(unittest.TestCase):
|
|||
})
|
||||
self.assertEqual(
|
||||
r.to_ical(),
|
||||
'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
b'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
)
|
||||
|
||||
r = vRecur(freq='DAILY', count=10)
|
||||
r['bysecond'] = [0, 15, 30, 45]
|
||||
self.assertEqual(r.to_ical(),
|
||||
'FREQ=DAILY;COUNT=10;BYSECOND=0,15,30,45')
|
||||
b'FREQ=DAILY;COUNT=10;BYSECOND=0,15,30,45')
|
||||
|
||||
r = vRecur(freq='DAILY', until=datetime(2005, 1, 1, 12, 0, 0))
|
||||
self.assertEqual(r.to_ical(), 'FREQ=DAILY;UNTIL=20050101T120000')
|
||||
self.assertEqual(r.to_ical(), b'FREQ=DAILY;UNTIL=20050101T120000')
|
||||
|
||||
# How do we fare with regards to parsing?
|
||||
r = vRecur.from_ical('FREQ=DAILY;INTERVAL=2;COUNT=10')
|
||||
self.assertEqual(r,
|
||||
{'COUNT': [10], 'FREQ': ['DAILY'], 'INTERVAL': [2]})
|
||||
self.assertEqual(vRecur(r).to_ical(), 'FREQ=DAILY;COUNT=10;INTERVAL=2')
|
||||
self.assertEqual(vRecur(r).to_ical(), b'FREQ=DAILY;COUNT=10;INTERVAL=2')
|
||||
|
||||
r = vRecur.from_ical('FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=-SU;'
|
||||
'BYHOUR=8,9;BYMINUTE=30')
|
||||
|
@ -297,19 +297,19 @@ class TestProp(unittest.TestCase):
|
|||
|
||||
self.assertEqual(
|
||||
vRecur(r).to_ical(),
|
||||
'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=-SU;BYMONTH=1'
|
||||
b'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=-SU;BYMONTH=1'
|
||||
)
|
||||
|
||||
# Some examples from the spec
|
||||
r = vRecur.from_ical('FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1')
|
||||
self.assertEqual(vRecur(r).to_ical(),
|
||||
'FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1')
|
||||
b'FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1')
|
||||
|
||||
p = 'FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30'
|
||||
r = vRecur.from_ical(p)
|
||||
self.assertEqual(
|
||||
vRecur(r).to_ical(),
|
||||
'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
b'FREQ=YEARLY;INTERVAL=2;BYMINUTE=30;BYHOUR=8,9;BYDAY=SU;BYMONTH=1'
|
||||
)
|
||||
|
||||
# and some errors
|
||||
|
@ -440,7 +440,7 @@ class TestProp(unittest.TestCase):
|
|||
factory = TypesFactory()
|
||||
datetime_parser = factory['date-time']
|
||||
self.assertEqual(datetime_parser(datetime(2001, 1, 1)).to_ical(),
|
||||
'20010101T000000')
|
||||
b'20010101T000000')
|
||||
|
||||
# A typical use is when the parser tries to find a content type and use
|
||||
# text as the default
|
||||
|
@ -454,7 +454,7 @@ class TestProp(unittest.TestCase):
|
|||
factory.to_ical('comment', u'by Rasmussen, Max M\xfcller'),
|
||||
b'by Rasmussen\\, Max M\xc3\xbcller'
|
||||
)
|
||||
self.assertEqual(factory.to_ical('priority', 1), '1')
|
||||
self.assertEqual(factory.to_ical('priority', 1), b'1')
|
||||
self.assertEqual(factory.to_ical('cn', u'Rasmussen, Max M\xfcller'),
|
||||
b'Rasmussen\\, Max M\xc3\xbcller')
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue