Skip to content

Commit 21dc74a

Browse files
committed
fix multilink support of try_id_parsing=no and add test for multilink cases.
1 parent 773b46b commit 21dc74a

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

roundup/hyperdb.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,13 @@ class Multilink(_Pointer):
198198
'link' and 'unlink' events placed in their journal
199199
"""
200200

201-
def __init__(self, classname, do_journal = 'yes', required = False, quiet=False):
201+
def __init__(self, classname, do_journal = 'yes', required = False, quiet=False, try_id_parsing='yes'):
202202

203203
super(Multilink, self).__init__(classname,
204204
do_journal,
205205
required = required,
206-
default_value = [], quiet=quiet)
206+
default_value = [], quiet=quiet,
207+
try_id_parsing=try_id_parsing)
207208

208209
def from_raw(self, value, db, klass, propname, itemid, **kw):
209210
if not value:

test/test_hyperdbvals.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ def getprops(self):
2828
'link2': hyperdb.Link('test2'),
2929
'multilink': hyperdb.Multilink('test'),
3030
'multilink2': hyperdb.Multilink('test2'),
31+
'multilink3': hyperdb.Multilink('test', try_id_parsing='no'),
3132
}
3233
def getkey(self):
3334
return 'string'
3435
def lookup(self, value):
3536
if value == 'valid':
3637
return '1'
38+
if value == '2valid':
39+
return '2'
3740
raise KeyError
3841
def get(self, nodeid, propname):
3942
assert propname.startswith('multilink')
@@ -139,4 +142,50 @@ def testMultilink(self):
139142
self.assertEqual(self._test('multilink', '+valid', None), ['1'])
140143
self.assertEqual(self._test('multilink', '', None), [])
141144

145+
def testMultilink3(self):
146+
# note that all +1, -2 type references will fail with exceptions
147+
# '+1' is an id and try_id_parsing is set to no for multilink3
148+
# and the 'name/key' 1 or 2 doesn't exist.
149+
150+
self.assertEqual(self._test('multilink3', '', '1'), [])
151+
152+
with self.assertRaises(hyperdb.HyperdbValueError) as cm:
153+
self._test('multilink3', '1', '1')
154+
self.assertEqual(cm.exception.message,
155+
"property multilink3: '1' is not a test.")
156+
157+
self.assertEqual(self._test('multilink3', 'valid', '1'), ['1'])
158+
159+
self.assertRaises(hyperdb.HyperdbValueError, self._test, 'multilink3',
160+
'invalid', '1')
161+
162+
with self.assertRaises(hyperdb.HyperdbValueError) as cm:
163+
self._test('multilink3', '+1', '1')
164+
self.assertEqual(cm.exception.message,
165+
"property multilink3: '1' is not a test.")
166+
167+
self.assertEqual(self._test('multilink3', '+valid', '1'),
168+
['1', '2', '3'])
169+
170+
with self.assertRaises(hyperdb.HyperdbValueError) as cm:
171+
self._test('multilink3', '+1,-2', '1')
172+
self.assertEqual(cm.exception.message,
173+
"property multilink3: '1' is not a test.")
174+
175+
with self.assertRaises(hyperdb.HyperdbValueError) as cm:
176+
self._test('multilink3', '+valid,-2', '1')
177+
self.assertEqual(cm.exception.message,
178+
"property multilink3: '2' is not a test.")
179+
180+
self.assertEqual(self._test('multilink3', '+valid,-2valid', '1'), ['1', '3'])
181+
182+
self.assertEqual(self._test('multilink3', '+valid', None), ['1'])
183+
184+
self.assertEqual(self._test('multilink3', '', None), [])
185+
186+
with self.assertRaises(hyperdb.HyperdbValueError) as cm:
187+
result = self._test('multilink3', '-valid', None)
188+
self.assertEqual(cm.exception.message,
189+
"property multilink3: 'valid' is not currently an element")
190+
142191
# vim: set filetype=python ts=4 sw=4 et si

0 commit comments

Comments
 (0)