|  | # | 
|  | # Usage: Fill in the configuration variables.  It will download the feed | 
|  | # for it, parse it, and print out test cases to add to the unit test. | 
|  | # | 
|  |  | 
|  | EMAIL = "[email protected]" | 
|  | PRIVATE_COOKIE = "432802670aefa458daf036597ec8136b" | 
|  | START_DATE = ("2006","01","01") | 
|  | END_DATE = ("2009","01","01") | 
|  |  | 
|  |  | 
|  |  | 
|  | import sys, urllib, re | 
|  | from xml.dom import minidom | 
|  |  | 
|  | def fmt(n): | 
|  | if n < 10: | 
|  | return "0" + str(n) | 
|  | else: | 
|  | return str(n) | 
|  |  | 
|  | def makeDate(d): | 
|  | return d[0] + "-" + d[1] + "-" + d[2] | 
|  |  | 
|  | def makeZDate(d): | 
|  | return d[0] + d[1] + d[2] + "T000000Z" | 
|  |  | 
|  | url = "http://www.google.com/calendar/feeds/[email protected]/private-" \ | 
|  | + PRIVATE_COOKIE + "/composite?start-min=" + makeDate(START_DATE) \ | 
|  | + "&start-max=" + makeDate(END_DATE) | 
|  |  | 
|  | #data = open("out.xml") | 
|  | data = urllib.urlopen(url) | 
|  |  | 
|  | DTSTART_TZID = re.compile("DTSTART;TZID=(.*):(.*)") | 
|  | DTSTART = re.compile("DTSTART:(.*)") | 
|  | DURATION = re.compile("DURATION:(.*)") | 
|  | RRULE = re.compile("RRULE:(.*)") | 
|  | TIME = re.compile("(....)-(..)-(..)T(..):(..):(..)....([+-])(..):(..)") | 
|  | TIMEZ = re.compile("(....)-(..)-(..)T(..):(..):(..)....Z") | 
|  |  | 
|  | def stripTimezone(str): | 
|  | lines = str.split("\n") | 
|  | drop = False | 
|  | result = [] | 
|  | for line in lines: | 
|  | if line == "BEGIN:VTIMEZONE": | 
|  | drop = True | 
|  | if not drop: | 
|  | result.append(line) | 
|  | if line == "END:VTIMEZONE": | 
|  | drop = False | 
|  | return result | 
|  |  | 
|  | def fixInstance(s): | 
|  | m = TIME.match(s[0]) | 
|  | if m: | 
|  | if m.group(7) == "+": | 
|  | sign = -1 | 
|  | else: | 
|  | sign = 1 | 
|  | hour = int(m.group(4)) + (sign * int(m.group(8))) | 
|  | return m.group(1) + m.group(2) + m.group(3) + "T" + fmt(hour) \ | 
|  | + m.group(5) + m.group(6) + "Z" | 
|  | m = TIMEZ.match(s[0]) | 
|  | if m: | 
|  | return m.group(1) + m.group(2) + m.group(3) + "T" + m.group(4) \ | 
|  | + m.group(5) + m.group(6) + "Z" | 
|  | return s[0] | 
|  |  | 
|  | dom = minidom.parse(data) | 
|  | root = dom.documentElement | 
|  |  | 
|  | entries = root.getElementsByTagName("entry") | 
|  |  | 
|  | for entry in entries: | 
|  | recurrences = entry.getElementsByTagName("gd:recurrence") | 
|  | dtstart = "" | 
|  | tzid = "" | 
|  | duration = "" | 
|  | rrule = "" | 
|  | if len(recurrences) > 0: | 
|  | recurrence = recurrences[0] | 
|  | s = "" | 
|  | for c in recurrence.childNodes: | 
|  | s = s + c.nodeValue | 
|  | lines = stripTimezone(s) | 
|  | for s in lines: | 
|  | re_dtstart = DTSTART_TZID.match(s) | 
|  | if re_dtstart: | 
|  | dtstart = re_dtstart.group(2) | 
|  | tzid = re_dtstart.group(1) | 
|  | re_dtstart = DTSTART.match(s) | 
|  | if re_dtstart: | 
|  | dtstart = re_dtstart.group(1) | 
|  | re_duration = DURATION.match(s) | 
|  | if re_duration: | 
|  | duration = re_duration.group(1) | 
|  | re_rrule = RRULE.match(s) | 
|  | if re_rrule: | 
|  | rrule = re_rrule.group(1) | 
|  | whens = entry.getElementsByTagName("gd:when") | 
|  | instances = [] | 
|  | for w in whens: | 
|  | startTime = w.getAttribute("startTime") | 
|  | endTime = w.getAttribute("endTime") | 
|  | instances.append((startTime,endTime)) | 
|  |  | 
|  | instances = map(fixInstance, instances) | 
|  | instances.sort() | 
|  | if dtstart != "": | 
|  | title = "" | 
|  | for c in entry.getElementsByTagName('title')[0].childNodes: | 
|  | title = title + c.nodeValue | 
|  |  | 
|  | print "            // " + title | 
|  | print "            test(\"" + dtstart + "\"," | 
|  | print "                    \"" + rrule + "\"," | 
|  | print "                    \"" + makeZDate(START_DATE) \ | 
|  | + "\", \"" + makeZDate(END_DATE) + "\"," | 
|  | print "                    new String[] {" | 
|  | for i in instances: | 
|  | print "                        \"" + i + "\"," | 
|  | print "                    });" | 
|  | print | 
|  |  | 
|  |  |