Skip to content

Commit 8b58f65

Browse files
author
Richard Jones
committed
fixed MultiMapping
1 parent 745bf09 commit 8b58f65

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ are given with the most recent entry first.
44
2004-??-?? 0.7.0
55
Fixed:
66
- CSV export was busted
7+
- MultiMapping deviated from the Zope C implementation in a number of
8+
places (thanks Toby Sargeant)
79

810

911
2004-03-27 0.7.0b2

doc/index.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ Bernhard Reiter,
105105
Roy Rapoport,
106106
John P. Rouillard,
107107
Ollie Rutherfurd,
108+
Toby Sargeant,
108109
Florian Schulze,
109110
Dougal Scott,
110111
Stefan Seefeld,

roundup/cgi/MultiMapping.py

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,63 @@
1-
import operator
2-
31
class MultiMapping:
42
def __init__(self, *stores):
53
self.stores = list(stores)
4+
self.stores.reverse()
5+
66
def __getitem__(self, key):
77
for store in self.stores:
88
if store.has_key(key):
99
return store[key]
1010
raise KeyError, key
11+
12+
def __setitem__(self, key, val):
13+
self.stores[0][key] = val
14+
1115
_marker = []
16+
1217
def get(self, key, default=_marker):
1318
for store in self.stores:
1419
if store.has_key(key):
1520
return store[key]
1621
if default is self._marker:
1722
raise KeyError, key
1823
return default
24+
1925
def __len__(self):
20-
return reduce(operator.add, [len(x) for x in stores], 0)
26+
return len(self.items())
27+
28+
def has_key(self, key):
29+
for store in self.stores:
30+
if store.has_key(key):
31+
return 1
32+
return 0
33+
2134
def push(self, store):
22-
self.stores.append(store)
35+
self.stores = [store] + self.stores
36+
2337
def pop(self):
24-
return self.stores.pop()
38+
if not len(self.stores):
39+
return None
40+
store, self.stores = self.stores[0], self.stores[1:]
41+
return store
42+
43+
def keys(self):
44+
return [ _[0] for _ in self.items() ]
45+
46+
def values(self):
47+
return [ _[1] for _ in self.items() ]
48+
49+
def copy(self):
50+
copy = MultiMapping()
51+
copy.stores = [_.copy() for _ in self.stores]
52+
return copy
53+
54+
def items(self):
55+
l = []
56+
seen = {}
57+
for store in self.stores:
58+
for k, v in store.items():
59+
if not seen.has_key(k):
60+
l.append((k, v))
61+
seen[k] = 1
62+
return l
2563

0 commit comments

Comments
 (0)