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