diff --git a/setup.py b/setup.py
index 029cbc472d9429be1e1d45d56d03504817b1dde1..1211b9b79b89c6b63d9cee2d5d7a1ebc6e43ca7c 100755
--- a/setup.py
+++ b/setup.py
@@ -132,6 +132,7 @@ def install_weboob():
'requests>=2.0.0',
'python-dateutil',
'PyYAML',
+ 'six',
]
try:
import Image
diff --git a/weboob/browser/browsers.py b/weboob/browser/browsers.py
index d7de961162a46f2136fbf1d726f8193d917823d0..712333db6d41bab0ff21148e31c09cb87a077922 100644
--- a/weboob/browser/browsers.py
+++ b/weboob/browser/browsers.py
@@ -51,7 +51,7 @@
from weboob.exceptions import BrowserHTTPSDowngrade, ModuleInstallError
from weboob.tools.log import getLogger
-from weboob.tools.compat import basestring, unicode
+from weboob.tools.compat import basestring, unicode, with_metaclass
from weboob.tools.json import json
from .cookies import WeboobCookieJar
@@ -614,7 +614,7 @@ def __new__(mcs, name, bases, attrs):
return new_class
-class PagesBrowser(DomainBrowser):
+class PagesBrowser(with_metaclass(_PagesBrowserMeta, DomainBrowser)):
r"""
A browser which works pages and keep state of navigation.
@@ -643,7 +643,6 @@ class PagesBrowser(DomainBrowser):
_urls = None
- __metaclass__ = _PagesBrowserMeta
def __getattr__(self, name):
if self._urls is not None and name in self._urls:
diff --git a/weboob/browser/elements.py b/weboob/browser/elements.py
index 496c3214873db399b001f46b2933fbfa12b48c41..82ce2cb3d140f4050bb963b9ff876728a1976900 100644
--- a/weboob/browser/elements.py
+++ b/weboob/browser/elements.py
@@ -28,7 +28,7 @@
import lxml.html
from weboob.tools.log import getLogger, DEBUG_FILTERS
-from weboob.tools.compat import basestring, unicode
+from weboob.tools.compat import basestring, unicode, with_metaclass
from weboob.browser.pages import NextPage
from .filters.standard import _Filter, CleanText
@@ -229,9 +229,7 @@ def __new__(mcs, name, bases, attrs):
return new_class
-class ItemElement(AbstractElement):
- __metaclass__ = _ItemElementMeta
-
+class ItemElement(with_metaclass(_ItemElementMeta, AbstractElement)):
_attrs = None
_loaders = None
klass = None
diff --git a/weboob/browser/filters/json.py b/weboob/browser/filters/json.py
index fc12b78494a07dc7cb8163fe1f77051065032f9d..803c90cf58dc81bc9751167c608b6425b670a67f 100644
--- a/weboob/browser/filters/json.py
+++ b/weboob/browser/filters/json.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see .
-from weboob.tools.compat import basestring
+from weboob.tools.compat import basestring, with_metaclass
from .standard import _Filter, _NO_DEFAULT, Filter, ParseError
@@ -36,9 +36,7 @@ def __getitem__(cls, name):
return cls(name)
-class Dict(Filter):
- __metaclass__ = _DictMeta
-
+class Dict(with_metaclass(_DictMeta, Filter)):
def __init__(self, selector=None, default=_NO_DEFAULT):
super(Dict, self).__init__(self, default=default)
if selector is None:
diff --git a/weboob/capabilities/base.py b/weboob/capabilities/base.py
index c3336a42e2f1681eef8c13639cdf6858faa15c97..d435a8a9872b7488ab94b324871fb87135f3cf4a 100644
--- a/weboob/capabilities/base.py
+++ b/weboob/capabilities/base.py
@@ -23,7 +23,7 @@
from decimal import Decimal
from copy import deepcopy, copy
-from weboob.tools.compat import unicode, long
+from weboob.tools.compat import unicode, long, with_metaclass
from weboob.tools.misc import to_unicode
@@ -316,7 +316,7 @@ def __new__(cls, name, bases, attrs):
return new_class
-class BaseObject(object):
+class BaseObject(with_metaclass(_BaseObjectMeta, object)):
"""
This is the base class for a capability object.
@@ -340,8 +340,6 @@ class Transfer(BaseObject):
The docstring is mandatory.
"""
- __metaclass__ = _BaseObjectMeta
-
id = None
backend = None
url = StringField('url')
diff --git a/weboob/tools/compat.py b/weboob/tools/compat.py
index 6b4c1d20b4bc0b9b4cd252bfcf3641569d969e8e..25d7769a5274f5a185942fcc5c992b7b73b57f50 100644
--- a/weboob/tools/compat.py
+++ b/weboob/tools/compat.py
@@ -18,7 +18,8 @@
# along with weboob. If not, see .
-__all__ = ['unicode', 'long', 'basestring', 'check_output', 'range']
+__all__ = ['unicode', 'long', 'basestring', 'check_output', 'range',
+ 'with_metaclass']
try:
@@ -44,3 +45,9 @@
from subprocess import check_output
+
+
+try:
+ from future.utils import with_metaclass
+except ImportError:
+ from six import with_metaclass