aboutsummaryrefslogtreecommitdiffstats
path: root/libbe
diff options
context:
space:
mode:
authorW. Trevor King <wking@drexel.edu>2010-01-30 11:24:39 -0500
committerW. Trevor King <wking@drexel.edu>2010-01-30 11:24:39 -0500
commit77bcd2ab6cd0afafc4c9ce8ec720fa167f1baeaf (patch)
treedb01cd2ac294b12d71c0868688c9a831ff0e20e8 /libbe
parent3a1f36b08835772fb80141f57220b0460e1fc67b (diff)
downloadbugseverywhere-77bcd2ab6cd0afafc4c9ce8ec720fa167f1baeaf.tar.gz
libbe.command.html.HTMLGen._long_to_linked_user() handles failed conversion.
Before, anything matching libbe.util.id.REGEXP was convert-or-die. Now it's convert-or-no-op. Much safer ;). The new _long_to_linked_user doctest would have failed with the old implementation.
Diffstat (limited to 'libbe')
-rw-r--r--libbe/command/html.py36
-rw-r--r--libbe/util/id.py9
2 files changed, 41 insertions, 4 deletions
diff --git a/libbe/command/html.py b/libbe/command/html.py
index bac310f..47ee587 100644
--- a/libbe/command/html.py
+++ b/libbe/command/html.py
@@ -267,21 +267,53 @@ class HTMLGen (object):
return '\n'.join(comment_entries)
def _long_to_linked_user(self, text):
+ """
+ >>> import libbe.bugdir
+ >>> bd = libbe.bugdir.SimpleBugDir(memory=False)
+ >>> h = HTMLGen(bd)
+ >>> h._long_to_linked_user('A link #abc123/a#, and a non-link #x#y#.')
+ 'A link <a href="./a.html">abc/a</a>, and a non-link #x#y#.'
+ >>> bd.cleanup()
+ """
replacer = libbe.util.id.IDreplacer(
[self.bd], self._long_to_linked_user_replacer, wrap=False)
return re.sub(
libbe.util.id.REGEXP, replacer, text)
def _long_to_linked_user_replacer(self, bugdirs, long_id):
+ """
+ >>> import libbe.bugdir
+ >>> import libbe.util.id
+ >>> bd = libbe.bugdir.SimpleBugDir(memory=False)
+ >>> a = bd.bug_from_uuid('a')
+ >>> uuid_gen = libbe.util.id.uuid_gen
+ >>> libbe.util.id.uuid_gen = lambda : '0123'
+ >>> c = a.new_comment('comment for link testing')
+ >>> libbe.util.id.uuid_gen = uuid_gen
+ >>> c.uuid
+ '0123'
+ >>> h = HTMLGen(bd)
+ >>> h._long_to_linked_user_replacer([bd], 'abc123')
+ '#abc123#'
+ >>> h._long_to_linked_user_replacer([bd], 'abc123/a')
+ '<a href="./a.html">abc/a</a>'
+ >>> h._long_to_linked_user_replacer([bd], 'abc123/a/0123')
+ '<a href="./a.html#0123">abc/a/012</a>'
+ >>> h._long_to_linked_user_replacer([bd], 'x')
+ '#x#'
+ >>> h._long_to_linked_user_replacer([bd], '')
+ '##'
+ >>> bd.cleanup()
+ """
try:
p = libbe.util.id.parse_user(bugdirs[0], long_id)
short_id = libbe.util.id.long_to_short_user(bugdirs, long_id)
except (libbe.util.id.MultipleIDMatches,
libbe.util.id.NoIDMatches,
libbe.util.id.InvalidIDStructure), e:
- return long_id
+ return '#%s#' % long_id # re-wrap failures
if p['type'] == 'bugdir':
- return long_id
+ return '#%s#' % long_id
elif p['type'] == 'bug':
return '<a href="./%s.html">%s</a>' \
% (p['bug'], short_id)
diff --git a/libbe/util/id.py b/libbe/util/id.py
index 3c6c957..81f5396 100644
--- a/libbe/util/id.py
+++ b/libbe/util/id.py
@@ -69,7 +69,7 @@ HIERARCHY = ['bugdir', 'bug', 'comment']
class MultipleIDMatches (ValueError):
def __init__(self, id, common, matches):
msg = ('More than one id matches %s. '
- 'Please be more specific (%s/*).\n%s' % (id, common, matches))
+ 'Please be more specific (%s*).\n%s' % (id, common, matches))
ValueError.__init__(self, msg)
self.id = id
self.common = common
@@ -249,7 +249,12 @@ def child_uuids(child_storage_ids):
def long_to_short_user(bugdirs, id):
ids = _split(id, check_length=True)
- bugdir = [bd for bd in bugdirs if bd.uuid == ids[0]][0]
+ matching_bugdirs = [bd for bd in bugdirs if bd.uuid == ids[0]]
+ if len(matching_bugdirs) == 0:
+ raise NoIDMatches(id, [bd.uuid for bd in bugdirs])
+ elif len(matching_bugdirs) > 1:
+ raise MultipleIDMatches(id, '', [bd.uuid for bd in bugdirs])
+ bugdir = matching_bugdirs[0]
objects = [bugdir]
if len(ids) >= 2:
bug = bugdir.bug_from_uuid(ids[1])