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)

Reply via email to