5 new revisions:

Revision: 43d22f2e90f2
Author:   Pekka Klärck
Date:     Wed Nov  9 12:25:21 2011
Log: Model: 1) Tests for suite/test/kw string representation. 2) Changed su...
http://code.google.com/p/robotframework/source/detail?r=43d22f2e90f2

Revision: 7ec9ce1f5993
Author:   Pekka Klärck
Date:     Wed Nov  9 12:37:57 2011
Log: WTF? A test module with mocks not used for anything? And a test what c...
http://code.google.com/p/robotframework/source/detail?r=7ec9ce1f5993

Revision: 60085d46d592
Author:   Pekka Klärck
Date:     Wed Nov  9 12:42:40 2011
Log: Message: 1) Changed robot.model.Message to be base for loggerhelper.Me...
http://code.google.com/p/robotframework/source/detail?r=60085d46d592

Revision: 9549fd0fa7f7
Author:   Pekka Klärck
Date:     Wed Nov  9 12:47:11 2011
Log: Model: Introduced ModelObject as a base class for model objects to red...
http://code.google.com/p/robotframework/source/detail?r=9549fd0fa7f7

Revision: 706e6b0f8127
Author:   Pekka Klärck
Date:     Wed Nov  9 13:21:18 2011
Log: Model: 1) Committed modelobject.py that was forgotten earlier. 2) Intr...
http://code.google.com/p/robotframework/source/detail?r=706e6b0f8127

==============================================================================
Revision: 43d22f2e90f2
Author:   Pekka Klärck
Date:     Wed Nov  9 12:25:21 2011
Log: Model: 1) Tests for suite/test/kw string representation. 2) Changed suite/test/kw.__str__ to return only ASCII.
http://code.google.com/p/robotframework/source/detail?r=43d22f2e90f2

Modified:
 /src/robot/model/keyword.py
 /src/robot/model/testcase.py
 /src/robot/model/testsuite.py
 /utest/model/test_keyword.py
 /utest/model/test_testcase.py
 /utest/model/test_testsuite.py

=======================================
--- /src/robot/model/keyword.py Wed Nov  9 08:49:18 2011
+++ /src/robot/model/keyword.py Wed Nov  9 12:25:21 2011
@@ -59,7 +59,7 @@
         return self.name

     def __str__(self):
-        return unicode(self).encode('UTF-8')
+        return unicode(self).encode('ASCII', 'replace')

     def __repr__(self):
         return repr(str(self))
=======================================
--- /src/robot/model/testcase.py        Wed Nov  9 08:49:18 2011
+++ /src/robot/model/testcase.py        Wed Nov  9 12:25:21 2011
@@ -62,7 +62,7 @@
         return self.name

     def __str__(self):
-        return unicode(self).encode('UTF-8')
+        return unicode(self).encode('ASCII', 'replace')

     def __repr__(self):
         return repr(str(self))
=======================================
--- /src/robot/model/testsuite.py       Wed Nov  9 09:48:30 2011
+++ /src/robot/model/testsuite.py       Wed Nov  9 12:25:21 2011
@@ -108,7 +108,7 @@
         return self.name

     def __str__(self):
-        return unicode(self).encode('UTF-8')
+        return unicode(self).encode('ASCII', 'replace')

     def __repr__(self):
         return repr(str(self))
=======================================
--- /utest/model/test_keyword.py        Wed Nov  9 08:52:02 2011
+++ /utest/model/test_keyword.py        Wed Nov  9 12:25:21 2011
@@ -25,6 +25,29 @@
         assert_equal(kw.keywords[1].keywords[0].id, 's1-t1-k1-k2-k1')


+class TestStringRepresentation(unittest.TestCase):
+
+    def setUp(self):
+        self.empty = Keyword()
+        self.ascii = Keyword(name='Kekkonen')
+        self.non_ascii = Keyword(name=u'hyv\xe4 nimi')
+
+    def test_unicode(self):
+        assert_equal(unicode(self.empty), '')
+        assert_equal(unicode(self.ascii), 'Kekkonen')
+        assert_equal(unicode(self.non_ascii), u'hyv\xe4 nimi')
+
+    def test_str(self):
+        assert_equal(str(self.empty), '')
+        assert_equal(str(self.ascii), 'Kekkonen')
+        assert_equal(str(self.non_ascii), 'hyv? nimi')
+
+    def test_repr(self):
+        assert_equal(repr(self.empty), "''")
+        assert_equal(repr(self.ascii), "'Kekkonen'")
+        assert_equal(repr(self.non_ascii), "'hyv? nimi'")
+
+
 class TestKeywords(unittest.TestCase):

     def test_setup(self):
=======================================
--- /utest/model/test_testcase.py       Wed Nov  9 08:52:02 2011
+++ /utest/model/test_testcase.py       Wed Nov  9 12:25:21 2011
@@ -36,5 +36,28 @@
         assert_equal(self.test.longname, 'suite.sub suite.test')


+class TestStringRepresentation(unittest.TestCase):
+
+    def setUp(self):
+        self.empty = TestCase()
+        self.ascii = TestCase(name='Kekkonen')
+        self.non_ascii = TestCase(name=u'hyv\xe4 nimi')
+
+    def test_unicode(self):
+        assert_equal(unicode(self.empty), '')
+        assert_equal(unicode(self.ascii), 'Kekkonen')
+        assert_equal(unicode(self.non_ascii), u'hyv\xe4 nimi')
+
+    def test_str(self):
+        assert_equal(str(self.empty), '')
+        assert_equal(str(self.ascii), 'Kekkonen')
+        assert_equal(str(self.non_ascii), 'hyv? nimi')
+
+    def test_repr(self):
+        assert_equal(repr(self.empty), "''")
+        assert_equal(repr(self.ascii), "'Kekkonen'")
+        assert_equal(repr(self.non_ascii), "'hyv? nimi'")
+
+
 if __name__ == '__main__':
     unittest.main()
=======================================
--- /utest/model/test_testsuite.py      Wed Nov  9 08:52:02 2011
+++ /utest/model/test_testsuite.py      Wed Nov  9 12:25:21 2011
@@ -73,5 +73,28 @@
         assert_equal(sub.id, 's1-s1')


+class TestStringRepresentation(unittest.TestCase):
+
+    def setUp(self):
+        self.empty = TestSuite()
+        self.ascii = TestSuite(name='Kekkonen')
+        self.non_ascii = TestSuite(name=u'hyv\xe4 nimi')
+
+    def test_unicode(self):
+        assert_equal(unicode(self.empty), '')
+        assert_equal(unicode(self.ascii), 'Kekkonen')
+        assert_equal(unicode(self.non_ascii), u'hyv\xe4 nimi')
+
+    def test_str(self):
+        assert_equal(str(self.empty), '')
+        assert_equal(str(self.ascii), 'Kekkonen')
+        assert_equal(str(self.non_ascii), 'hyv? nimi')
+
+    def test_repr(self):
+        assert_equal(repr(self.empty), "''")
+        assert_equal(repr(self.ascii), "'Kekkonen'")
+        assert_equal(repr(self.non_ascii), "'hyv? nimi'")
+
+
 if __name__ == '__main__':
     unittest.main()

==============================================================================
Revision: 7ec9ce1f5993
Author:   Pekka Klärck
Date:     Wed Nov  9 12:37:57 2011
Log: WTF? A test module with mocks not used for anything? And a test what cannot fail???
http://code.google.com/p/robotframework/source/detail?r=7ec9ce1f5993

Modified:
 /utest/output/test_loggerhelper.py

=======================================
--- /utest/output/test_loggerhelper.py  Mon Mar 30 04:19:06 2009
+++ /utest/output/test_loggerhelper.py  Wed Nov  9 12:37:57 2011
@@ -1,68 +1,15 @@
 import unittest

-from robot.errors import DataError
+from robot.errors import DataError
 from robot.output.loggerhelper import AbstractLogger


-class MockFile:
-
-    def __init__(self):
-        self.closed = False
-        self.messages = []
-        self.string = ""
-
-    def flush(self):
-        pass
-
-    def erase_data(self):
-        self.messages = []
-        self.string = ""
-
-    def write(self, line):
-        self.messages.append(line)
-        self.string += line
-
-    def close(self):
-        self.closed = True
-
-class SuiteMock:
- def __init__(self, name='', doc='', include=None, exclude=None, suites=None):
-        self.name = name
-        self.doc = doc
-        self.include = include or []
-        self.exclude = exclude or []
-        self.suites = suites or []
-
-class BasicMock:
-    def __init__(self, name='', doc='', tags=None):
-        self.name = name
-        self.doc = doc
-        self.tags = tags or []
-
-class StatisticsMock:
-
- def __init__(self, status='', message='', starttime='20051122 12:34:56.789',
-                 endtime='20051122 12:34:56.789'):
-        self.status = status
-        self.message = message
-        self.starttime = starttime
-        self.endtime = endtime
-
-
 class TestAbstractLogger(unittest.TestCase):
-
-    def test_set_threshold_invalid(self):
+
+    def test_set_invalid_threshold(self):
         logger = AbstractLogger('trace')
-        self.assertRaises(DataError, logger.set_level,'INVALID THRESHOLD')
-
-    def test_getattr_with_invalid(self):
-        logger = AbstractLogger('trace')
-        try:
-            logger.invalid('message')
-            raise AssertionError, 'AttributeError not raised'
-        except AttributeError:
-            pass
-
-
+        self.assertRaises(DataError, logger.set_level,'INVALID THRESHOLD')
+
+
 if __name__ == '__main__':
     unittest.main()

==============================================================================
Revision: 60085d46d592
Author:   Pekka Klärck
Date:     Wed Nov  9 12:42:40 2011
Log: Message: 1) Changed robot.model.Message to be base for loggerhelper.Message. 2) Also added string repr methods.
http://code.google.com/p/robotframework/source/detail?r=60085d46d592

Added:
 /utest/model/test_message.py
Modified:
 /src/robot/model/message.py
 /src/robot/output/loggerhelper.py

=======================================
--- /dev/null
+++ /utest/model/test_message.py        Wed Nov  9 12:42:40 2011
@@ -0,0 +1,27 @@
+import unittest
+
+from robot.model import Message
+from robot.utils.asserts import assert_equal
+
+
+class TestStringRepresentation(unittest.TestCase):
+
+    def setUp(self):
+        self.empty = Message()
+        self.ascii = Message('Kekkonen')
+        self.non_ascii = Message(u'hyv\xe4 nimi')
+
+    def test_unicode(self):
+        assert_equal(unicode(self.empty), '')
+        assert_equal(unicode(self.ascii), 'Kekkonen')
+        assert_equal(unicode(self.non_ascii), u'hyv\xe4 nimi')
+
+    def test_str(self):
+        assert_equal(str(self.empty), '')
+        assert_equal(str(self.ascii), 'Kekkonen')
+        assert_equal(str(self.non_ascii), 'hyv? nimi')
+
+    def test_repr(self):
+        assert_equal(repr(self.empty), "''")
+        assert_equal(repr(self.ascii), "'Kekkonen'")
+        assert_equal(repr(self.non_ascii), "'hyv? nimi'")
=======================================
--- /src/robot/model/message.py Wed Nov  9 08:49:18 2011
+++ /src/robot/model/message.py Wed Nov  9 12:42:40 2011
@@ -12,16 +12,34 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from robot.output.loggerhelper import Message as BaseMessage
+from robot import utils


-# TODO: Inheritance should work other way. This should be the base.
-class Message(BaseMessage):
-    __slots__ = []
+class Message(object):
+ __slots__ = ['level', 'html', 'timestamp', 'linkable', '_setter__message']

def __init__(self, message='', level='INFO', html=False, timestamp=None,
                  linkable=False):
- BaseMessage.__init__(self, message, level, html, timestamp, linkable)
+        self.message = message
+        self.level = level
+        self.html = html
+        self.timestamp = timestamp
+        self.linkable = linkable
+
+    @utils.setter
+    def message(self, msg):
+        if not isinstance(msg, basestring):
+            msg = utils.unic(msg)
+        return msg.replace('\r\n', '\n')

     def visit(self, visitor):
         visitor.visit_message(self)
+
+    def __unicode__(self):
+        return self.message
+
+    def __str__(self):
+        return unicode(self).encode('ASCII', 'replace')
+
+    def __repr__(self):
+        return repr(str(self))
=======================================
--- /src/robot/output/loggerhelper.py   Wed Nov  9 06:57:01 2011
+++ /src/robot/output/loggerhelper.py   Wed Nov  9 12:42:40 2011
@@ -15,6 +15,7 @@

 from robot import utils
 from robot.errors import DataError
+from robot.model import Message as BaseMessage


 LEVELS = {
@@ -61,21 +62,14 @@
         raise NotImplementedError(self.__class__)


-class Message(object):
- __slots__ = ['level', 'html', 'timestamp', 'linkable', '_setter__message']
+class Message(BaseMessage):
+    __slots__ = []

     def __init__(self, message, level='INFO', html=False, timestamp=None,
                  linkable=False):
-        self.message = message
-        self.level, self.html = self._get_level_and_html(level, html)
-        self.timestamp = self._get_timestamp(timestamp)
-        self.linkable = linkable
-
-    @utils.setter
-    def message(self, msg):
-        if not isinstance(msg, basestring):
-            msg = utils.unic(msg)
-        return msg.replace('\r\n', '\n')
+        level, html = self._get_level_and_html(level, html)
+        timestamp = self._get_timestamp(timestamp)
+ BaseMessage.__init__(self, message, level, html, timestamp, linkable)

     def _get_level_and_html(self, level, html):
         level = level.upper()

==============================================================================
Revision: 9549fd0fa7f7
Author:   Pekka Klärck
Date:     Wed Nov  9 12:47:11 2011
Log: Model: Introduced ModelObject as a base class for model objects to reduce duplication.
http://code.google.com/p/robotframework/source/detail?r=9549fd0fa7f7

Modified:
 /src/robot/model/keyword.py
 /src/robot/model/message.py
 /src/robot/model/testcase.py
 /src/robot/model/testsuite.py

=======================================
--- /src/robot/model/keyword.py Wed Nov  9 12:25:21 2011
+++ /src/robot/model/keyword.py Wed Nov  9 12:47:11 2011
@@ -16,9 +16,10 @@

 from itemlist import ItemList
 from message import Message
+from modelobject import ModelObject


-class Keyword(object):
+class Keyword(ModelObject):
     __slots__ = ['parent', 'name', 'doc', 'args', 'type', 'timeout',
                  '_setter__messages', '_setter__keywords']
     message_class = Message
=======================================
--- /src/robot/model/message.py Wed Nov  9 12:42:40 2011
+++ /src/robot/model/message.py Wed Nov  9 12:47:11 2011
@@ -14,8 +14,10 @@

 from robot import utils

-
-class Message(object):
+from modelobject import ModelObject
+
+
+class Message(ModelObject):
__slots__ = ['level', 'html', 'timestamp', 'linkable', '_setter__message']

def __init__(self, message='', level='INFO', html=False, timestamp=None,
@@ -37,9 +39,3 @@

     def __unicode__(self):
         return self.message
-
-    def __str__(self):
-        return unicode(self).encode('ASCII', 'replace')
-
-    def __repr__(self):
-        return repr(str(self))
=======================================
--- /src/robot/model/testcase.py        Wed Nov  9 12:25:21 2011
+++ /src/robot/model/testcase.py        Wed Nov  9 12:47:11 2011
@@ -16,9 +16,10 @@

 from tags import Tags
 from keyword import Keyword, Keywords
+from modelobject import ModelObject


-class TestCase(object):
+class TestCase(ModelObject):
     __slots__ = ['parent', 'name', 'doc', 'timeout', '_setter__tags',
                  '_setter__keywords']
     keyword_class = Keyword
@@ -58,11 +59,3 @@
     def visit(self, visitor):
         visitor.visit_test(self)

-    def __unicode__(self):
-        return self.name
-
-    def __str__(self):
-        return unicode(self).encode('ASCII', 'replace')
-
-    def __repr__(self):
-        return repr(str(self))
=======================================
--- /src/robot/model/testsuite.py       Wed Nov  9 12:25:21 2011
+++ /src/robot/model/testsuite.py       Wed Nov  9 12:47:11 2011
@@ -21,9 +21,10 @@
 from critical import Critical
 from tagsetter import TagSetter
 from filter import Filter
+from modelobject import ModelObject


-class TestSuite(object):
+class TestSuite(ModelObject):
     __slots__ = ['parent', 'source', '_name', 'doc', '_setter__metadata',
                  '_setter__suites', '_setter__tests', '_setter__keywords',
                  '_critical']
@@ -103,12 +104,3 @@

     def visit(self, visitor):
         visitor.visit_suite(self)
-
-    def __unicode__(self):
-        return self.name
-
-    def __str__(self):
-        return unicode(self).encode('ASCII', 'replace')
-
-    def __repr__(self):
-        return repr(str(self))

==============================================================================
Revision: 706e6b0f8127
Author:   Pekka Klärck
Date:     Wed Nov  9 13:21:18 2011
Log: Model: 1) Committed modelobject.py that was forgotten earlier. 2) Introduced SetterAwareType metaclass that automatically addes 'secret' setter attributes to __slots__.
http://code.google.com/p/robotframework/source/detail?r=706e6b0f8127

Added:
 /src/robot/model/modelobject.py
Modified:
 /src/robot/model/keyword.py
 /src/robot/model/message.py
 /src/robot/model/testcase.py
 /src/robot/model/testsuite.py
 /src/robot/utils/setter.py
 /utest/utils/test_setter.py

=======================================
--- /dev/null
+++ /src/robot/model/modelobject.py     Wed Nov  9 13:21:18 2011
@@ -0,0 +1,28 @@
+#  Copyright 2008-2011 Nokia Siemens Networks Oyj
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+from robot.utils.setter import SetterAwareType
+
+
+class ModelObject(object):
+    __metaclass__ = SetterAwareType
+
+    def __unicode__(self):
+        return self.name
+
+    def __str__(self):
+        return unicode(self).encode('ASCII', 'replace')
+
+    def __repr__(self):
+        return repr(str(self))
=======================================
--- /src/robot/model/keyword.py Wed Nov  9 12:47:11 2011
+++ /src/robot/model/keyword.py Wed Nov  9 13:21:18 2011
@@ -20,8 +20,7 @@


 class Keyword(ModelObject):
-    __slots__ = ['parent', 'name', 'doc', 'args', 'type', 'timeout',
-                 '_setter__messages', '_setter__keywords']
+    __slots__ = ['parent', 'name', 'doc', 'args', 'type', 'timeout']
     message_class = Message

     def __init__(self, name='', doc='', args=None, type='kw', timeout=''):
=======================================
--- /src/robot/model/message.py Wed Nov  9 12:47:11 2011
+++ /src/robot/model/message.py Wed Nov  9 13:21:18 2011
@@ -18,7 +18,7 @@


 class Message(ModelObject):
- __slots__ = ['level', 'html', 'timestamp', 'linkable', '_setter__message']
+    __slots__ = ['level', 'html', 'timestamp', 'linkable']

def __init__(self, message='', level='INFO', html=False, timestamp=None,
                  linkable=False):
=======================================
--- /src/robot/model/testcase.py        Wed Nov  9 12:47:11 2011
+++ /src/robot/model/testcase.py        Wed Nov  9 13:21:18 2011
@@ -20,8 +20,7 @@


 class TestCase(ModelObject):
-    __slots__ = ['parent', 'name', 'doc', 'timeout', '_setter__tags',
-                 '_setter__keywords']
+    __slots__ = ['parent', 'name', 'doc', 'timeout']
     keyword_class = Keyword

     def __init__(self, name='', doc='', tags=None, timeout=''):
=======================================
--- /src/robot/model/testsuite.py       Wed Nov  9 12:47:11 2011
+++ /src/robot/model/testsuite.py       Wed Nov  9 13:21:18 2011
@@ -25,9 +25,7 @@


 class TestSuite(ModelObject):
-    __slots__ = ['parent', 'source', '_name', 'doc', '_setter__metadata',
-                 '_setter__suites', '_setter__tests', '_setter__keywords',
-                 '_critical']
+    __slots__ = ['parent', 'source', '_name', 'doc', '_critical']
     test_class = TestCase
     keyword_class = Keyword

=======================================
--- /src/robot/utils/setter.py  Wed Nov  9 06:57:01 2011
+++ /src/robot/utils/setter.py  Wed Nov  9 13:21:18 2011
@@ -32,3 +32,13 @@
             return
         setattr(instance, self.attr_name, self.method(instance, value))

+
+class SetterAwareType(type):
+
+    def __new__(cls, name, bases, dct):
+        slots = dct.get('__slots__')
+        if slots is not None:
+            for item in dct.values():
+                if isinstance(item, setter):
+                    slots.append(item.attr_name)
+        return type.__new__(cls, name, bases, dct)
=======================================
--- /utest/utils/test_setter.py Sat Nov  5 12:24:38 2011
+++ /utest/utils/test_setter.py Wed Nov  9 13:21:18 2011
@@ -1,7 +1,7 @@
 import unittest
-from robot.utils.asserts import assert_equal, assert_raises
-
-from robot.utils import setter
+from robot.utils.asserts import assert_equal, assert_raises_with_msg
+
+from robot.utils.setter import setter, SetterAwareType


 class Example(object):
@@ -9,16 +9,32 @@
     def attr(self, value):
         return value * 2

+class ExampleWithSlots(object):
+    __slots__ = []
+    __metaclass__ = SetterAwareType
+    @setter
+    def attr(self, value):
+        return value * 2
+

 class TestSetter(unittest.TestCase):

+    def setUp(self):
+        self.item = Example()
+
     def test_setting(self):
-        e = Example()
-        e.attr = 1
-        assert_equal(e.attr, 2)
+        self.item.attr = 1
+        assert_equal(self.item.attr, 2)

     def test_notset(self):
-        assert_raises(AttributeError, getattr, Example(), 'attr')
+        assert_raises_with_msg(AttributeError, 'attr',
+                               getattr, self.item, 'attr')
+
+
+class TestSetterAwareType(TestSetter):
+
+    def setUp(self):
+        self.item = ExampleWithSlots()


 if __name__ == '__main__':

Reply via email to