From e894a28cdf1d449cc7a6c9246fa4f65edb80a9dd Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 28 Dec 2012 18:52:45 +0100 Subject: [PATCH] py3: introduce new kivy.compat module for checking if we are on python3, and define new "types", like string_types. --- kivy/animation.py | 3 ++- kivy/compat.py | 14 ++++++++++++++ kivy/core/image/__init__.py | 5 +++-- kivy/properties.pyx | 15 +++++---------- kivy/tests/test_adapters.py | 5 +++-- 5 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 kivy/compat.py diff --git a/kivy/animation.py b/kivy/animation.py index d4259d725..03f398d6a 100644 --- a/kivy/animation.py +++ b/kivy/animation.py @@ -63,6 +63,7 @@ __all__ = ('Animation', 'AnimationTransition') from math import sqrt, cos, sin, pi from kivy.event import EventDispatcher from kivy.clock import Clock +from kivy.compat import string_types class Animation(EventDispatcher): @@ -105,7 +106,7 @@ class Animation(EventDispatcher): self._duration = kw.get('d', kw.get('duration', 1.)) self._transition = kw.get('t', kw.get('transition', 'linear')) self._step = kw.get('s', kw.get('step', 1. / 60.)) - if isinstance(self._transition, str): + if isinstance(self._transition, string_types): self._transition = getattr(AnimationTransition, self._transition) for key in ('d', 't', 's', 'step', 'duration', 'transition'): kw.pop(key, None) diff --git a/kivy/compat.py b/kivy/compat.py new file mode 100644 index 000000000..2c480971b --- /dev/null +++ b/kivy/compat.py @@ -0,0 +1,14 @@ +''' +Compatibility module for Python 2.7 and > 3.3 +============================================= +''' + +import sys + +#: True if the code is running on Python 3 interpreter. +is_py3 = sys.version >= '3' + +#: String types that can be used for checking if a object is a string +string_types = str +if not is_py3: + string_types = basestring diff --git a/kivy/core/image/__init__.py b/kivy/core/image/__init__.py index 51f831852..79cfc19cb 100644 --- a/kivy/core/image/__init__.py +++ b/kivy/core/image/__init__.py @@ -21,6 +21,7 @@ from kivy.clock import Clock from kivy.atlas import Atlas from kivy.resources import resource_find from kivy.utils import platform +from kivy.compat import string_types import zipfile try: import io as SIO @@ -420,10 +421,10 @@ class Image(EventDispatcher): self._size = self.texture.size elif isinstance(arg, ImageLoaderBase): self.image = arg - elif isinstance(arg, str): + elif isinstance(arg, string_types): self.filename = arg else: - raise Exception('Unable to load image type %s' % str(type(arg))) + raise Exception('Unable to load image type {0!r}'.format(arg)) # check if the image hase sequences for animation in it self._img_iterate() diff --git a/kivy/properties.pyx b/kivy/properties.pyx index 503d9848a..4f50f5cde 100644 --- a/kivy/properties.pyx +++ b/kivy/properties.pyx @@ -174,6 +174,7 @@ __all__ = ('Property', include "graphics/config.pxi" from weakref import ref +from kivy.compat import string_types cdef float g_dpi = -1 cdef float g_density = -1 @@ -491,16 +492,10 @@ cdef class StringProperty(Property): cdef check(self, EventDispatcher obj, value): if Property.check(self, obj, value): return True - IF PY3: - if not isinstance(value, str): - raise ValueError('%s.%s accept only str' % ( - obj.__class__.__name__, - self.name)) - ELSE: - if not isinstance(value, basestring): - raise ValueError('%s.%s accept only str/unicode' % ( - obj.__class__.__name__, - self.name)) + if not isinstance(value, string_types): + raise ValueError('%s.%s accept only str' % ( + obj.__class__.__name__, + self.name)) cdef inline void observable_list_dispatch(object self): cdef Property prop = self.prop diff --git a/kivy/tests/test_adapters.py b/kivy/tests/test_adapters.py index b362dc3a1..94bb45dc9 100644 --- a/kivy/tests/test_adapters.py +++ b/kivy/tests/test_adapters.py @@ -22,6 +22,7 @@ from kivy.properties import StringProperty from kivy.factory import Factory from kivy.lang import Builder +from kivy.compat import string_types from nose.tools import raises @@ -490,7 +491,7 @@ class AdaptersTestCase(unittest.TestCase): cat_data_item = list_adapter.get_data_item(0) self.assertEqual(cat_data_item, 'cat') - self.assertTrue(isinstance(cat_data_item, str)) + self.assertTrue(isinstance(cat_data_item, string_types)) view = list_adapter.get_view(0) self.assertTrue(isinstance(view, ListItemButton)) @@ -670,7 +671,7 @@ class AdaptersTestCase(unittest.TestCase): cat_data_item = list_adapter.get_data_item(0) self.assertEqual(cat_data_item, 'cat') - self.assertTrue(isinstance(cat_data_item, str)) + self.assertTrue(isinstance(cat_data_item, string_types)) view = list_adapter.get_view(0) self.assertTrue(isinstance(view, ListItemButton))