Mercurial > pyntnclick
annotate pyweek-upload.py @ 560:28f03563f4db pyntnclick
Provide stubby access to sound and resource object from GameDescription on state and scene objects.
author | Simon Cross <hodgestar+bzr@gmail.com> |
---|---|
date | Sat, 11 Feb 2012 14:47:44 +0200 |
parents | d1b86d5849a0 |
children |
rev | line source |
---|---|
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
1 ''' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
2 Upload script specifically engineered for the PyWeek challenge. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
3 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
4 Handles authentication and gives upload progress feedback. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
5 ''' |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
6 import cStringIO |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
7 import getopt |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
8 import httplib |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
9 import os |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
10 import socket |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
11 import sys |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
12 import time |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
13 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
14 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
15 class Upload: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
16 def __init__(self, filename): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
17 self.filename = filename |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
18 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
19 boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
20 sep_boundary = '\n--' + boundary |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
21 end_boundary = sep_boundary + '--' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
22 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
23 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
24 def mimeEncode(data, sep_boundary=sep_boundary, end_boundary=end_boundary): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
25 '''Take the mapping of data and construct the body of a |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
26 multipart/form-data message with it using the indicated boundaries. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
27 ''' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
28 ret = cStringIO.StringIO() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
29 for key, value in data.items(): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
30 # handle multiple entries for the same name |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
31 if type(value) != type([]): |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
32 value = [value] |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
33 for value in value: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
34 ret.write(sep_boundary) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
35 if isinstance(value, Upload): |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
36 ret.write('\nContent-Disposition: form-data; name="%s"' % key) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
37 filename = os.path.basename(value.filename) |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
38 ret.write('; filename="%s"\n\n' % filename) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
39 value = open(os.path.join(value.filename), "rb").read() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
40 else: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
41 ret.write('\nContent-Disposition: form-data; name="%s"' % key) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
42 ret.write("\n\n") |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
43 value = str(value) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
44 ret.write(str(value)) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
45 if value and value[-1] == '\r': |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
46 ret.write('\n') # write an extra newline |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
47 ret.write(end_boundary) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
48 return ret.getvalue() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
49 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
50 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
51 class Progress: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
52 def __init__(self, info, data): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
53 self.info = info |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
54 self.tosend = len(data) |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
55 self.total = self.tosend / 1024 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
56 self.data = cStringIO.StringIO(data) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
57 self.start = self.now = time.time() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
58 self.sent = 0 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
59 self.num = 0 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
60 self.stepsize = self.total / 100 or 1 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
61 self.steptimes = [] |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
62 self.display() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
63 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
64 def __iter__(self): |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
65 return self |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
66 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
67 def next(self): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
68 self.num += 1 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
69 if self.sent >= self.tosend: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
70 print self.info, 'done', ' ' * (75 - len(self.info) - 6) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
71 sys.stdout.flush() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
72 raise StopIteration |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
73 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
74 chunk = self.data.read(1024) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
75 self.sent += len(chunk) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
76 #print (self.num, self.stepsize, self.total, self.sent, self.tosend) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
77 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
78 if self.num % self.stepsize: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
79 return chunk |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
80 self.display() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
81 return chunk |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
82 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
83 def display(self): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
84 # figure how long we've spent - guess how long to go |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
85 now = time.time() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
86 steptime = now - self.now |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
87 self.steptimes.insert(0, steptime) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
88 if len(self.steptimes) > 5: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
89 self.steptimes.pop() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
90 steptime = sum(self.steptimes) / len(self.steptimes) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
91 self.now = now |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
92 eta = steptime * ((self.total - self.num) / self.stepsize) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
93 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
94 # tell it like it is (or might be) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
95 if now - self.start > 3: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
96 M = eta / 60 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
97 H = M / 60 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
98 M = M % 60 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
99 S = eta % 60 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
100 if self.total: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
101 s = '%s %2d%% (ETA %02d:%02d:%02d)' % (self.info, |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
102 self.num * 100. / self.total, H, M, S) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
103 else: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
104 s = '%s 0%% (ETA %02d:%02d:%02d)' % (self.info, H, M, S) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
105 elif self.total: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
106 s = '%s %2d%%' % (self.info, self.num * 100. / self.total) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
107 else: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
108 s = '%s %d done' % (self.info, self.num) |
538 | 109 sys.stdout.write(s + ' ' * (75 - len(s)) + '\r') |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
110 sys.stdout.flush() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
111 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
112 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
113 class progressHTTPConnection(httplib.HTTPConnection): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
114 def progress_send(self, str): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
115 """Send `str' to the server.""" |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
116 if self.sock is None: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
117 self.connect() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
118 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
119 p = Progress('Uploading', str) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
120 for chunk in p: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
121 sent = 0 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
122 while sent != len(chunk): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
123 try: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
124 sent += self.sock.send(chunk) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
125 except socket.error, v: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
126 if v[0] == 32: # Broken pipe |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
127 self.close() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
128 raise |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
129 p.display() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
130 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
131 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
132 class progressHTTP(httplib.HTTP): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
133 _connection_class = progressHTTPConnection |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
134 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
135 def _setup(self, conn): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
136 httplib.HTTP._setup(self, conn) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
137 self.progress_send = self._conn.progress_send |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
138 |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
139 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
140 def http_request(data, server, port, url): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
141 h = progressHTTP(server, port) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
142 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
143 data = mimeEncode(data) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
144 h.putrequest('POST', url) |
538 | 145 h.putheader('Content-type', 'multipart/form-data; boundary=%s' % boundary) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
146 h.putheader('Content-length', str(len(data))) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
147 h.putheader('Host', server) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
148 h.endheaders() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
149 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
150 h.progress_send(data) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
151 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
152 errcode, errmsg, headers = h.getreply() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
153 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
154 f = h.getfile() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
155 response = f.read().strip() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
156 f.close() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
157 |
538 | 158 print '%s %s' % (errcode, errmsg) |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
159 if response: |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
160 print response |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
161 |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
162 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
163 def usage(): |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
164 print '''This program is to be used to upload files to the PyWeek system. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
165 You may use it to upload screenshots or code submissions. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
166 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
167 REQUIRED ARGUMENTS: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
168 -u username |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
169 -p password |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
170 -d description of file |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
171 -c file to upload |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
172 -e entry short name |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
173 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
174 OPTIONAL ARGUMENTS: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
175 -s file is a screenshot |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
176 -f file is FINAL submission |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
177 -h override default host name (www.pyweek.org) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
178 -P override default host port (80) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
179 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
180 In order to qualify for judging at the end of the challenge, you MUST |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
181 upload your source and check the "Final Submission" checkbox. |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
182 ''' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
183 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
184 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
185 if __name__ == '__main__': |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
186 try: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
187 optlist, args = getopt.getopt(sys.argv[1:], 'e:u:p:sfd:h:P:c:') |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
188 except getopt.GetoptError, message: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
189 print message |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
190 usage() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
191 sys.exit(1) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
192 host = 'www.pyweek.org' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
193 port = 80 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
194 data = dict(version=2) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
195 optional = {} |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
196 url = None |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
197 for opt, arg in optlist: |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
198 if opt == '-u': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
199 data['user'] = arg |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
200 elif opt == '-p': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
201 data['password'] = arg |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
202 elif opt == '-s': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
203 optional['is_screenshot'] = 'yes' |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
204 elif opt == '-f': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
205 optional['is_final'] = 'yes' |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
206 elif opt == '-d': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
207 data['description'] = arg |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
208 elif opt == '-c': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
209 data['content_file'] = Upload(arg) |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
210 elif opt == '-e': |
538 | 211 url = '/e/%s/oup/' % arg |
531
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
212 elif opt == '-h': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
213 host = arg |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
214 elif opt == '-P': |
60c345d19daf
PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents:
0
diff
changeset
|
215 port = int(arg) |
0
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
216 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
217 if len(data) < 4 or url is None: |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
218 print 'Required argument missing' |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
219 usage() |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
220 sys.exit(1) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
221 |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
222 data.update(optional) |
f2c3b516741b
Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
223 http_request(data, host, port, url) |