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}'))