Mercurial > p > roundup > code
annotate roundup/support.py @ 3916:57ad3e2c2545
handle bad cookies
Roundup's cgi gets all cookies from all apps on the same server. some
apps aren't as well behaved as roundup and generate cookies that do
not follow the spec perfectly. This causes python's Cookie module to
throw an exception when trying to parse them. In the spirit of being
liberal in what we accept, we create a LiberalCookie class that can
handle those out-of-spec cookies and allow roundup to continue onward.
[SF#1691708]
code from S. Woodside
| author | Justus Pendleton <jpend@users.sourceforge.net> |
|---|---|
| date | Sat, 22 Sep 2007 21:20:57 +0000 |
| parents | 193f316dbbe9 |
| children | 0a05c4d9a221 |
| rev | line source |
|---|---|
| 2984 | 1 """Implements various support classes and functions used in a number of |
| 2 places in Roundup code. | |
| 3 """ | |
| 4 | |
| 5 __docformat__ = 'restructuredtext' | |
| 6 | |
|
3644
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
7 import os, time, sys, re |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
8 |
| 2984 | 9 class TruthDict: |
| 10 '''Returns True for valid keys, False for others. | |
| 11 ''' | |
| 12 def __init__(self, keys): | |
| 13 if keys: | |
| 14 self.keys = {} | |
| 15 for col in keys: | |
| 16 self.keys[col] = 1 | |
| 17 else: | |
| 18 self.__getitem__ = lambda name: 1 | |
| 19 | |
| 20 def __getitem__(self, name): | |
| 21 return self.keys.has_key(name) | |
| 22 | |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
23 def ensureParentsExist(dest): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
24 if not os.path.exists(os.path.dirname(dest)): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
25 os.makedirs(os.path.dirname(dest)) |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
26 |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
27 class PrioList: |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
28 '''Manages a sorted list. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
29 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
30 Currently only implements method 'append' and iteration from a |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
31 full list interface. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
32 Implementation: We manage a "sorted" status and sort on demand. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
33 Appending to the list will require re-sorting before use. |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
34 >>> p = PrioList() |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
35 >>> for i in 5,7,1,-1: |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
36 ... p.append(i) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
37 ... |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
38 >>> for k in p: |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
39 ... print k |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
40 ... |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
41 -1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
42 1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
43 5 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
44 7 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
45 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
46 ''' |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
47 def __init__(self): |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
48 self.list = [] |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
49 self.sorted = True |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
50 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
51 def append(self, item): |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
52 self.list.append(item) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
53 self.sorted = False |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
54 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
55 def __iter__(self): |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
56 if not self.sorted: |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
57 self.list.sort() |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
58 self.sorted = True |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3634
diff
changeset
|
59 return iter(self.list) |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
60 |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
61 class Progress: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
62 '''Progress display for console applications. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
63 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
64 See __main__ block at end of file for sample usage. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
65 ''' |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
66 def __init__(self, info, sequence): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
67 self.info = info |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
68 self.sequence = iter(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
69 self.total = len(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
70 self.start = self.now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
71 self.num = 0 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
72 self.stepsize = self.total / 100 or 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
73 self.steptimes = [] |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
74 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
75 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
76 def __iter__(self): return self |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
77 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
78 def next(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
79 self.num += 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
80 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
81 if self.num > self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
82 print self.info, 'done', ' '*(75-len(self.info)-6) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
83 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
84 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
85 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
86 if self.num % self.stepsize: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
87 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
88 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
89 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
90 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
91 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
92 def display(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
93 # figure how long we've spent - guess how long to go |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
94 now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
95 steptime = now - self.now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
96 self.steptimes.insert(0, steptime) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
97 if len(self.steptimes) > 5: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
98 self.steptimes.pop() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
99 steptime = sum(self.steptimes) / len(self.steptimes) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
100 self.now = now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
101 eta = steptime * ((self.total - self.num)/self.stepsize) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
102 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
103 # tell it like it is (or might be) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
104 if now - self.start > 3: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
105 M = eta / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
106 H = M / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
107 M = M % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
108 S = eta % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
109 if self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
110 s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info, |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
111 self.num * 100. / self.total, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
112 else: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
113 s = '%s 0%% (ETA %02d:%02d:%02d)'%(self.info, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
114 elif self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
115 s = '%s %2d%%'%(self.info, self.num * 100. / self.total) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
116 else: |
|
3589
1be293265e61
woo, that was quick
Richard Jones <richard@users.sourceforge.net>
parents:
3544
diff
changeset
|
117 s = '%s %d done'%(self.info, self.num) |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
118 sys.stdout.write(s + ' '*(75-len(s)) + '\r') |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
119 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
120 |
|
3644
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
121 LEFT = 'left' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
122 LEFTN = 'left no strip' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
123 RIGHT = 'right' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
124 CENTER = 'center' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
125 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
126 def align(line, width=70, alignment=LEFTN): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
127 ''' Code from http://www.faqts.com/knowledge_base/view.phtml/aid/4476 ''' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
128 if alignment == CENTER: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
129 line = line.strip() |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
130 space = width - len(line) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
131 return ' '*(space/2) + line + ' '*(space/2 + space%2) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
132 elif alignment == RIGHT: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
133 line = line.rstrip() |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
134 space = width - len(line) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
135 return ' '*space + line |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
136 else: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
137 if alignment == LEFT: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
138 line = line.lstrip() |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
139 space = width - len(line) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
140 return line + ' '*space |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
141 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
142 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
143 def format_line(columns, positions, contents, spacer=' | ', |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
144 collapse_whitespace=True, wsre=re.compile(r'\s+')): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
145 ''' Fill up a single row with data from the contents ''' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
146 l = [] |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
147 data = 0 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
148 for i in range(len(columns)): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
149 width, alignment = columns[i] |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
150 content = contents[i] |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
151 col = '' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
152 while positions[i] < len(content): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
153 word = content[positions[i]] |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
154 # if we hit a newline, honor it |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
155 if '\n' in word: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
156 # chomp |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
157 positions[i] += 1 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
158 break |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
159 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
160 # make sure this word fits |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
161 if col and len(word) + len(col) > width: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
162 break |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
163 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
164 # no whitespace at start-of-line |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
165 if collapse_whitespace and wsre.match(word) and not col: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
166 # chomp |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
167 positions[i] += 1 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
168 continue |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
169 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
170 col += word |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
171 # chomp |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
172 positions[i] += 1 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
173 if col: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
174 data = 1 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
175 col = align(col, width, alignment) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
176 l.append(col) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
177 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
178 if not data: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
179 return '' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
180 return spacer.join(l).rstrip() |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
181 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
182 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
183 def format_columns(columns, contents, spacer=' | ', collapse_whitespace=True, |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
184 splitre=re.compile(r'(\n|\r\n|\r|[ \t]+|\S+)')): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
185 ''' Format the contents into columns, with 'spacing' between the |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
186 columns |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
187 ''' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
188 assert len(columns) == len(contents), \ |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
189 'columns and contents must be same length' |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
190 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
191 # split the text into words, spaces/tabs and newlines |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
192 for i in range(len(contents)): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
193 contents[i] = splitre.findall(contents[i]) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
194 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
195 # now process line by line |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
196 l = [] |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
197 positions = [0]*len(contents) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
198 while 1: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
199 l.append(format_line(columns, positions, contents, spacer, |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
200 collapse_whitespace)) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
201 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
202 # are we done? |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
203 for i in range(len(contents)): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
204 if positions[i] < len(contents[i]): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
205 break |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
206 else: |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
207 break |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
208 return '\n'.join(l) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
209 |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
210 def wrap(text, width=75, alignment=LEFTN): |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
211 return format_columns(((width, alignment),), [text], |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
212 collapse_whitespace=False) |
|
f35ece8f8ff7
added StringHTMLProperty wrapped() method to wrap long lines in issue display
Richard Jones <richard@users.sourceforge.net>
parents:
3636
diff
changeset
|
213 |
|
3682
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
214 # Python2.3 backwards-compatibility-hack. Should be removed (and clients |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
215 # fixed to use built-in reversed/sorted) when we abandon support for |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
216 # python2.3 |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
217 try: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
218 reversed = reversed |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
219 except NameError: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
220 def reversed(x): |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
221 x = list(x) |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
222 x.reverse() |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
223 return x |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
224 |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
225 try: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
226 sorted = sorted |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
227 except NameError: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
228 def sorted(iter, cmp=None, key=None, reverse=False): |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
229 if key: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
230 l = [] |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
231 cnt = 0 # cnt preserves original sort-order |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
232 inc = [1, -1][bool(reverse)] # count down on reverse |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
233 for x in iter: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
234 l.append ((key(x), cnt, x)) |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
235 cnt += inc |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
236 else: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
237 l = list(iter) |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
238 if cmp: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
239 l.sort(cmp = cmp) |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
240 else: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
241 l.sort() |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
242 if reverse: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
243 l.reverse() |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
244 if key: |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
245 return [x[-1] for x in l] |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
246 return l |
|
193f316dbbe9
More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3644
diff
changeset
|
247 |
| 2984 | 248 # vim: set et sts=4 sw=4 : |
