Revision: 3422
Author: jussi.ao.malinen
Date: Mon May 24 07:35:24 2010
Log: 1) Added error messages for empty resource files 2) changed attribute table to parent in settings
http://code.google.com/p/robotframework/source/detail?r=3422

Modified:
 /trunk/src/robot/parsing/model.py
 /trunk/src/robot/parsing/populator.py
 /trunk/src/robot/parsing/settings.py
 /trunk/src/robot/running/importer.py
 /trunk/src/robot/running/namespace.py
 /trunk/utest/parsing/test_model.py
 /trunk/utest/parsing/test_populator.py
 /trunk/utest/running/test_userlibrary.py

=======================================
--- /trunk/src/robot/parsing/model.py   Mon May 24 07:26:21 2010
+++ /trunk/src/robot/parsing/model.py   Mon May 24 07:35:24 2010
@@ -49,7 +49,7 @@
     def report_invalid_syntax(self, table, message, level='ERROR'):
         initfile = getattr(self, 'initfile', None)
path = os.path.join(self.source, initfile) if initfile else self.source
-        LOGGER.write("Invalid syntax in file '%s' in table '%s': %s"
+        LOGGER.write("Invalid syntax in file '%s' in table '%s': %s."
                      % (path, table, message), level)


@@ -82,12 +82,20 @@
         self.keyword_table = KeywordTable(self)
         if self.source:
             FromFilePopulator(self).populate(source)
+            self._report_status()

     def __iter__(self):
         for table in [self.setting_table, self.variable_table,
                       self.keyword_table]:
             yield table

+    def _report_status(self):
+        if self.setting_table or self.variable_table or self.keyword_table:
+            LOGGER.info("Imported resource file '%s' (%d keywords)"
+                        % (self.source, len(self.keyword_table.keywords)))
+        else:
+ LOGGER.warn("Imported resource file '%s' is empty." % self.source)
+

 class TestDataDirectory(_TestData):

@@ -138,8 +146,11 @@


 class _WithSettings(object):
-    def setter_for(self, setting_name):
-        return self._setters[setting_name]
+
+    def get_setter(self, setting_name):
+        if setting_name in self._setters:
+            return self._setters[setting_name]
+ self.report_invalid_syntax("Non-existing setting '%s'" % setting_name)

     def is_setting(self, setting_name):
         return setting_name in self._setters
@@ -149,14 +160,14 @@

     def __init__(self, parent):
         _Table.__init__(self, parent)
-        self.doc = Documentation()
-        self.suite_setup = Fixture()
-        self.suite_teardown = Fixture()
-        self.test_setup = Fixture()
-        self.test_teardown = Fixture()
-        self.test_timeout = Timeout()
-        self.force_tags = Tags()
-        self.default_tags = Tags()
+        self.doc = Documentation(self)
+        self.suite_setup = Fixture(self)
+        self.suite_teardown = Fixture(self)
+        self.test_setup = Fixture(self)
+        self.test_teardown = Fixture(self)
+        self.test_timeout = Timeout(self)
+        self.force_tags = Tags(self)
+        self.default_tags = Tags(self)
         self.metadata = []
         self.imports = []
         self._setters = self._get_setters()
@@ -184,6 +195,9 @@
                         + self.metadata + self.imports:
             yield setting

+    def __nonzero__(self):
+        return any(setting.is_set() for setting in self)
+

 class TestCaseFileSettingTable(_SettingTable):

@@ -254,6 +268,9 @@
     def __iter__(self):
         return iter(self.variables)

+    def __nonzero__(self):
+        return bool(self.variables)
+

 class TestCaseTable(_Table):

@@ -268,6 +285,9 @@
     def __iter__(self):
         return iter(self.tests)

+    def __nonzero__(self):
+        return bool(self.tests)
+

 class KeywordTable(_Table):

@@ -276,12 +296,15 @@
         self.keywords = []

     def add(self, name):
-        self.keywords.append(UserKeyword(name))
+        self.keywords.append(UserKeyword(self, name))
         return self.keywords[-1]

     def __iter__(self):
         return iter(self.keywords)

+    def __nonzero__(self):
+        return bool(self.keywords)
+

 class TestCaseTableNotAllowed(object):

@@ -297,6 +320,7 @@
     def __iter__(self):
         return iter([])

+
 class Variable(object):

     def __init__(self, name, value, comment=None):
@@ -321,11 +345,11 @@
     def __init__(self, parent, name):
         self.parent = parent
         self.name = name
-        self.doc = Documentation()
-        self.tags = Tags()
-        self.setup = Fixture()
-        self.teardown = Fixture()
-        self.timeout = Timeout()
+        self.doc = Documentation(self)
+        self.tags = Tags(self)
+        self.setup = Fixture(self)
+        self.teardown = Fixture(self)
+        self.timeout = Timeout(self)
         self.steps = []
         self._setters = self._get_setters()

@@ -339,19 +363,33 @@
                                      'Tags': self.tags.set,
                                      'Timeout': self.timeout.set})

+    @property
+    def source(self):
+        return self.parent.source
+
+    @property
+    def directory(self):
+        return self.parent.directory
+
     def add_for_loop(self, data):
         self.steps.append(ForLoop(data))
         return self.steps[-1]

+    def report_invalid_syntax(self, message, level='ERROR'):
+        type = 'test case' if isinstance(self, TestCase) else 'keyword'
+ message = "Invalid syntax in %s '%s': %s" % (type, self.name, message)
+        self.parent.report_invalid_syntax(message, level)
+

 class UserKeyword(TestCase):

-    def __init__(self, name):
+    def __init__(self, parent, name):
+        self.parent = parent
         self.name = name
-        self.doc = Documentation()
-        self.args = Arguments()
-        self.return_ = Return()
-        self.timeout = Timeout()
+        self.doc = Documentation(self)
+        self.args = Arguments(self)
+        self.return_ = Return(self)
+        self.timeout = Timeout(self)
         self.steps = []
         self._setters = self._get_setters()

=======================================
--- /trunk/src/robot/parsing/populator.py       Mon May 24 05:10:22 2010
+++ /trunk/src/robot/parsing/populator.py       Mon May 24 07:35:24 2010
@@ -12,12 +12,6 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from robot.output import LOGGER
-
-
-def report_invalid_setting(msg):
-    LOGGER.error("Invalid setting %s." % msg)
-

 class Populator(object):
     """Explicit interface for all populators."""
@@ -78,11 +72,8 @@

     def _get_populator(self, row):
         row.handle_old_style_metadata()
-        first_cell = row.head
-        if self._table.is_setting(first_cell):
-            return SettingPopulator(self._table.setter_for(first_cell))
-        report_invalid_setting("'%s' in setting table" % (first_cell))
-        return NullPopulator()
+        setter = self._table.get_setter(row.head)
+        return SettingPopulator(setter) if setter else NullPopulator()


 class VariableTablePopulator(_TablePopulator):
@@ -206,14 +197,7 @@

     def _setting_setter(self, row):
         setting_name = row.test_or_user_keyword_setting_name()
-        if self._test_or_uk.is_setting(setting_name):
-            return self._test_or_uk.setter_for(setting_name)
-        self._log_invalid_setting(row.head)
-        return None
-
-    def _log_invalid_setting(self, value):
-        report_invalid_setting("'%s' in %s '%s'" % (value, self._item_type,
-                                                    self._test_or_uk.name))
+        return self._test_or_uk.get_setter(setting_name)


 class TestCasePopulator(_TestCaseUserKeywordPopulator):
=======================================
--- /trunk/src/robot/parsing/settings.py        Mon May 24 05:12:04 2010
+++ /trunk/src/robot/parsing/settings.py        Mon May 24 07:35:24 2010
@@ -15,8 +15,8 @@

 class _Setting(object):

-    def __init__(self, table=None, comment=None):
-        self.table = table
+    def __init__(self, parent=None, comment=None):
+        self.parent = parent
         self.comment = comment
         self._init()

@@ -25,11 +25,11 @@

     @property
     def source(self):
-        return self.table.source
+        return self.parent.source if self.parent else None

     @property
     def directory(self):
-        return self.table.directory
+        return self.parent.directory if self.parent else None

     def set(self, value, comment=None):
         self._set(value)
@@ -38,8 +38,11 @@
     def _set(self, value):
         self.value = value

+    def is_set(self):
+        return bool(self.value)
+
     def report_invalid_syntax(self, message, level='ERROR'):
-        self.table.report_invalid_syntax(message, level)
+        self.parent.report_invalid_syntax(message, level)

     def _string_value(self, value):
         return value if isinstance(value, basestring) else ' '.join(value)
@@ -86,19 +89,22 @@
             value = value[1:]
         self.message = self._concat_string_with_value(self.message, value)

+    def is_set(self):
+        return self.value is not None
+

 class Tags(_Setting):

-    def __init__(self, table=None, comment=None):
-        _Setting.__init__(self, table, comment)
-        self._value_set = False
+    def _init(self):
+        self.value = []
+        self._is_set = False

     def _set(self, value):
         self.value.extend(value)
-        self._value_set = True
+        self._is_set = True

     def is_set(self):
-        return self._value_set
+        return self._is_set


 class Arguments(_Setting):
@@ -111,17 +117,20 @@

 class Metadata(_Setting):

-    def __init__(self, table, name, value, comment):
-        self.table = table
+    def __init__(self, parent, name, value, comment=None):
+        self.parent = parent
         self.name = name
         self.value = self._string_value(value)
         self.comment = comment

+    def is_set(self):
+        return True
+

 class _Import(_Setting):

-    def __init__(self, table, name, args=None, alias=None, comment=None):
-        self.table = table
+    def __init__(self, parent, name, args=None, alias=None, comment=None):
+        self.parent = parent
         self.name = name
         self.args = args or []
         self.alias = alias
@@ -131,13 +140,16 @@
     def type(self):
         return type(self).__name__

+    def is_set(self):
+        return True
+

 class Library(_Import):

-    def __init__(self, table, name, args=None, alias=None, comment=None):
+    def __init__(self, parent, name, args=None, alias=None, comment=None):
         if args and not alias:
             args, alias = self._split_alias(args)
-        _Import.__init__(self, table, name, args, alias, comment)
+        _Import.__init__(self, parent, name, args, alias, comment)

     def _split_alias(self, args):
         if len(args) >= 2 and args[-2].upper() == 'WITH NAME':
@@ -147,13 +159,13 @@

 class Resource(_Import):

-    def __init__(self, table, name, invalid_args=None, comment=None):
+    def __init__(self, parent, name, invalid_args=None, comment=None):
         if invalid_args:
             name += ' ' + ' '.join(invalid_args)
-        _Import.__init__(self, table, name, comment=comment)
+        _Import.__init__(self, parent, name, comment=comment)


 class Variables(_Import):

-    def __init__(self, table, name, args=None, comment=None):
-        _Import.__init__(self, table, name, args, comment=comment)
+    def __init__(self, parent, name, args=None, comment=None):
+        _Import.__init__(self, parent, name, args, comment=comment)
=======================================
--- /trunk/src/robot/running/importer.py        Fri May 21 04:10:37 2010
+++ /trunk/src/robot/running/importer.py        Mon May 24 07:35:24 2010
@@ -42,11 +42,6 @@
         else:
             resource = ResourceFile(path)
             self._resources[path] = resource
-            LOGGER.info("Imported resource file '%s' (%d keywords)"
-                        % (path, len(resource.keyword_table.keywords)))
- # Resource file may contain only variables so we should not warn - # if there are no keywords. Importing an empty resource file fails
-            # already earlier so no need to check that here either.
         return self._resources[path]

     def _import_library(self, name, positional, named, lib):
=======================================
--- /trunk/src/robot/running/namespace.py       Mon May 24 02:18:12 2010
+++ /trunk/src/robot/running/namespace.py       Mon May 24 07:35:24 2010
@@ -140,9 +140,8 @@
                 self._report_replacing_vars_failed(import_setting, err)
         else:
             name = import_setting.name
- # FIXME: clean up. impoert_setting does not have direcory when created in import library or import variables
-        dir = import_setting.table and import_setting.directory or ''
-        return self._get_path(import_setting.type, name, dir)
+        basedir = import_setting.directory or ''
+        return self._get_path(import_setting.type, name, basedir)

     def _report_replacing_vars_failed(self, import_setting, err):
         raise DataError("Replacing variables from setting '%s' failed: %s"
=======================================
--- /trunk/utest/parsing/test_model.py  Mon May 24 04:48:47 2010
+++ /trunk/utest/parsing/test_model.py  Mon May 24 07:35:24 2010
@@ -207,7 +207,7 @@

     def setUp(self):
         self.table = TestCaseFile().keyword_table
-        self.kw = UserKeyword('name')
+        self.kw = UserKeyword(None, 'name')

     def test_init(self):
         assert_equal(self.table.keywords, [])
=======================================
--- /trunk/utest/parsing/test_populator.py      Mon May 24 05:10:22 2010
+++ /trunk/utest/parsing/test_populator.py      Mon May 24 07:35:24 2010
@@ -148,7 +148,9 @@

     def test_invalid_settings(self):
         self._create_table('Settings', [['In valid', 'val ue']])
- assert_equals(self._logger.value(), "Invalid setting 'In valid' in setting table.") + assert_equals(self._logger.value(), "Invalid syntax in file 'None' in " + "table 'Settings': Non-existing "
+                                            "setting 'In valid'.")

     def test_adding_import(self):
         self._create_table('settings', [['Library', 'FooBarness'],
@@ -269,12 +271,18 @@
     def test_invalid_test_settings(self):
         self._create_table('Test cases', [['My test name'],
                                           ['', '[Aasi]']])
- assert_equals(self._logger.value(), "Invalid setting '[Aasi]' in test case 'My test name'.") + assert_equals(self._logger.value(), "Invalid syntax in file 'None' in " + "table 'Test cases': Invalid syntax "
+                                            "in test case 'My test name': "
+                                            "Non-existing setting 'Aasi'.")

     def test_invalid_keyword_settings(self):
         self._create_table('Keywords', [['My User Keyword'],
                                         ['', '[ank ka]']])
- assert_equals(self._logger.value(), "Invalid setting '[ank ka]' in keyword 'My User Keyword'.") + assert_equals(self._logger.value(), "Invalid syntax in file 'None' in " + "table 'Keywords': Invalid syntax " + "in test case 'My User Keyword': " + "Non-existing setting 'ank ka'.")

     def test_creating_user_keywords(self):
         self._create_table('Keywords', [['My User Keyword'],
=======================================
--- /trunk/utest/running/test_userlibrary.py    Fri May 21 05:24:41 2010
+++ /trunk/utest/running/test_userlibrary.py    Mon May 24 07:35:24 2010
@@ -103,7 +103,7 @@
         assert_true(isinstance(handler, UserHandlerStub))

     def _get_userlibrary(self, source, *keyword_names):
- return userkeyword.UserLibrary([UserKeyword(name) for name in keyword_names]) + return userkeyword.UserLibrary([UserKeyword(None, name) for name in keyword_names])

     def _lib_has_embedded_arg_keyword(self, lib):
         assert_true(lib.handlers.has_key('Embedded ${arg}'))

Reply via email to