Revision: 2150
Author: jprantan
Date: Mon Aug 10 05:33:52 2009
Log: Added implementation for giving error messages when keyword match
multiple embedded keywords. Issue 370.
http://code.google.com/p/robotframework/source/detail?r=2150
Modified:
/trunk/src/robot/running/namespace.py
/trunk/src/robot/running/userkeyword.py
=======================================
--- /trunk/src/robot/running/namespace.py Tue Aug 4 07:06:11 2009
+++ /trunk/src/robot/running/namespace.py Mon Aug 10 05:33:52 2009
@@ -180,18 +180,12 @@
return None
def _get_handler_from_test_case_file_user_keywords(self, name):
- try:
+ if self.suite.user_keywords.has_handler(name):
return self.suite.user_keywords.get_handler(name)
- except DataError:
- return None
def _get_handler_from_resource_file_user_keywords(self, name):
- found = []
- for lib in self._userlibs:
- try:
- found.append(lib.get_handler(name))
- except DataError:
- pass
+ found = [ lib.get_handler(name)
+ for lib in self._userlibs if lib.has_handler(name) ]
if not found:
return None
if len(found) == 1:
=======================================
--- /trunk/src/robot/running/userkeyword.py Tue Aug 4 14:00:03 2009
+++ /trunk/src/robot/running/userkeyword.py Mon Aug 10 05:33:52 2009
@@ -58,27 +58,46 @@
self.handlers[handler.name] = handler
def has_handler(self, name):
- try:
- self.get_handler(name)
- except DataError:
- return False
- else:
+ if BaseLibrary.has_handler(self, name):
return True
-
+ for template in self.embedded_arg_handlers:
+ try:
+ EmbeddedArgs(name, template)
+ except TypeError:
+ pass
+ else:
+ return True
+ return False
+
def get_handler(self, name):
try:
return BaseLibrary.get_handler(self, name)
except DataError, error:
- return self._try_to_get_embedded_arg_handler(name, error)
-
- def _try_to_get_embedded_arg_handler(self, name, error):
+ found = self._get_embedded_arg_handlers(name)
+ if not found:
+ raise error
+ if len(found) == 1:
+ return found[0]
+ self._raise_multiple_matching_keywords_found(name, found)
+
+ def _get_embedded_arg_handlers(self, name):
+ found = []
for template in self.embedded_arg_handlers:
try:
- return EmbeddedArgs(name, template)
+ found.append(EmbeddedArgs(name, template))
except TypeError:
pass
- raise error
-
+ return found
+
+ def _raise_multiple_matching_keywords_found(self, name, found):
+ names = utils.seq2str([f.orig_name for f in found])
+ if self.name is None:
+ where = "Test case file"
+ else:
+ where = "Resource file '%s'" % self.name
+ raise DataError("%s contains multiple keywords matching
name '%s'\n"
+ "Found: %s" % (where, name, names))
+
class UserHandler(BaseHandler):
@@ -203,6 +222,7 @@
raise TypeError('Does not match given name')
self.embedded_args = zip(template.embedded_args, match.groups())
self.name = name
+ self.orig_name = template.name
self.longname = template.longname[:-len(template.name)] + name
self._copy_attrs_from_template(template)