1cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project#
2cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project# Usage: Fill in the configuration variables.  It will download the feed
3cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project# for it, parse it, and print out test cases to add to the unit test.
4cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project#
5cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
6cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectEMAIL = "onoratoj@gmail.com"
7cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectPRIVATE_COOKIE = "432802670aefa458daf036597ec8136b"
8cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectSTART_DATE = ("2006","01","01")
9cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectEND_DATE = ("2009","01","01")
10cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
11cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
12cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
13cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectimport sys, urllib, re
14cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectfrom xml.dom import minidom
15cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
16cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdef fmt(n):
17cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    if n < 10:
18cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        return "0" + str(n)
19cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    else:
20cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        return str(n)
21cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
22cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdef makeDate(d):
23cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    return d[0] + "-" + d[1] + "-" + d[2]
24cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
25cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdef makeZDate(d):
26cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    return d[0] + d[1] + d[2] + "T000000Z"
27cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
28cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projecturl = "http://www.google.com/calendar/feeds/onoratoj@gmail.com/private-" \
29cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        + PRIVATE_COOKIE + "/composite?start-min=" + makeDate(START_DATE) \
30cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        + "&start-max=" + makeDate(END_DATE)
31cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
32cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project#data = open("out.xml")
33cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdata = urllib.urlopen(url)
34cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
35cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectDTSTART_TZID = re.compile("DTSTART;TZID=(.*):(.*)")
36cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectDTSTART = re.compile("DTSTART:(.*)")
37cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectDURATION = re.compile("DURATION:(.*)")
38cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectRRULE = re.compile("RRULE:(.*)")
39cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectTIME = re.compile("(....)-(..)-(..)T(..):(..):(..)....([+-])(..):(..)")
40cf013ece751816a07396845858f1c7037ead464fThe Android Open Source ProjectTIMEZ = re.compile("(....)-(..)-(..)T(..):(..):(..)....Z")
41cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
42cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdef stripTimezone(str):
43cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    lines = str.split("\n")
44cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    drop = False
45cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    result = []
46cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    for line in lines:
47cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        if line == "BEGIN:VTIMEZONE":
48cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            drop = True
49cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        if not drop:
50cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            result.append(line)
51cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        if line == "END:VTIMEZONE":
52cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            drop = False
53cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    return result
54cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
55cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdef fixInstance(s):
56cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    m = TIME.match(s[0])
57cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    if m:
58cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        if m.group(7) == "+":
59cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            sign = -1
60cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        else:
61cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            sign = 1
62cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        hour = int(m.group(4)) + (sign * int(m.group(8)))
63cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        return m.group(1) + m.group(2) + m.group(3) + "T" + fmt(hour) \
64cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                + m.group(5) + m.group(6) + "Z"
65cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    m = TIMEZ.match(s[0])
66cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    if m:
67cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        return m.group(1) + m.group(2) + m.group(3) + "T" + m.group(4) \
68cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                + m.group(5) + m.group(6) + "Z"
69cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    return s[0]
70cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
71cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectdom = minidom.parse(data)
72cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectroot = dom.documentElement
73cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
74cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectentries = root.getElementsByTagName("entry")
75cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
76cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectfor entry in entries:
77cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    recurrences = entry.getElementsByTagName("gd:recurrence")
78cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    dtstart = ""
79cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    tzid = ""
80cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    duration = ""
81cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    rrule = ""
82cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    if len(recurrences) > 0:
83cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        recurrence = recurrences[0]
84cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        s = ""
85cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        for c in recurrence.childNodes:
86cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            s = s + c.nodeValue
87cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        lines = stripTimezone(s)
88cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        for s in lines:
89cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            re_dtstart = DTSTART_TZID.match(s)
90cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            if re_dtstart:
91cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                dtstart = re_dtstart.group(2)
92cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                tzid = re_dtstart.group(1)
93cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            re_dtstart = DTSTART.match(s)
94cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            if re_dtstart:
95cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                dtstart = re_dtstart.group(1)
96cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            re_duration = DURATION.match(s)
97cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            if re_duration:
98cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                duration = re_duration.group(1)
99cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            re_rrule = RRULE.match(s)
100cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            if re_rrule:
101cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                rrule = re_rrule.group(1)
102cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    whens = entry.getElementsByTagName("gd:when")
103cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    instances = []
104cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    for w in whens:
105cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        startTime = w.getAttribute("startTime")
106cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        endTime = w.getAttribute("endTime")
107cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        instances.append((startTime,endTime))
108cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
109cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    instances = map(fixInstance, instances)
110cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    instances.sort()
111cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    if dtstart != "":
112cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        title = ""
113cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        for c in entry.getElementsByTagName('title')[0].childNodes:
114cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            title = title + c.nodeValue
115cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
116cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "            // " + title
117cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "            test(\"" + dtstart + "\","
118cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "                    \"" + rrule + "\","
119cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "                    \"" + makeZDate(START_DATE) \
120cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                                    + "\", \"" + makeZDate(END_DATE) + "\","
121cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "                    new String[] {"
122cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        for i in instances:
123cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            print "                        \"" + i + "\","
124cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print "                    });"
125cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        print
126cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
127cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
128