[pytango] 104/122: Update DeviceMeta to propagate automatically
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:18:23 UTC 2017
This is an automated email from the git hooks/post-receive script.
sbodomerle-guest pushed a commit to tag v9.2.1
in repository pytango.
commit 337d04c9f6afee18e42fd1248d87e9aad31ec233
Author: Vincent Michel <vincent.michel at maxlab.lu.se>
Date: Mon Jan 16 16:13:24 2017 +0100
Update DeviceMeta to propagate automatically
---
tango/server.py | 97 +++++++++++++++++++++++++++------------------------------
1 file changed, 46 insertions(+), 51 deletions(-)
diff --git a/tango/server.py b/tango/server.py
index 6784c73..35c3d3f 100644
--- a/tango/server.py
+++ b/tango/server.py
@@ -16,6 +16,7 @@ from __future__ import print_function
from __future__ import absolute_import
import sys
+import six
import copy
import inspect
import logging
@@ -412,7 +413,7 @@ class _DeviceClass(DeviceClass):
def __create_tango_deviceclass_klass(tango_device_klass, attrs=None):
klass_name = tango_device_klass.__name__
- if not issubclass(tango_device_klass, (Device)):
+ if not issubclass(tango_device_klass, (BaseDevice)):
msg = "{0} device must inherit from " \
"tango.server.Device".format(klass_name)
raise Exception(msg)
@@ -467,7 +468,7 @@ def __create_tango_deviceclass_klass(tango_device_klass, attrs=None):
return type(devclass_name, (_DeviceClass,), devclass_attrs)
-def __init_tango_device_klass(tango_device_klass, attrs=None,
+def _init_tango_device_klass(tango_device_klass, attrs=None,
tango_class_name=None):
klass_name = tango_device_klass.__name__
tango_deviceclass_klass = __create_tango_deviceclass_klass(
@@ -506,60 +507,43 @@ def inheritance_patch(attrs):
obj.fset = attrs.get(method_name)
-def DeviceMeta(name, bases, attrs):
+class DeviceMeta(type(LatestDeviceImpl)):
"""
- The :py:data:`metaclass` callable for :class:`Device`.Every
- sub-class of :class:`Device` must have associated this metaclass
- to itself in order to work properly (boost-python internal
- limitation).
-
- Example (python 2.x)::
-
- from tango.server import Device, DeviceMeta
-
- class PowerSupply(Device):
- __metaclass__ = DeviceMeta
-
- Example (python 3.x)::
-
- from tango.server import Device, DeviceMeta
-
- class PowerSupply(Device, metaclass=DeviceMeta):
- pass
+ The :py:data:`metaclass` callable for :class:`Device`.
This implementation of DeviceMeta makes device inheritance possible.
"""
- # Get metaclass
- LatestDeviceImplMeta = type(LatestDeviceImpl)
- # Attribute dictionary
- dct = {}
- # Filter object from bases
- bases = tuple(base for base in bases if base != object)
- # Add device to bases
- if Device not in bases:
- bases += (Device,)
- # Set tango objects as attributes
- for base in reversed(bases):
- for key, value in base.__dict__.items():
- if is_tango_object(value):
- dct[key] = value
- # Inheritance patch
- inheritance_patch(attrs)
- # Update attribute dictionary
- dct.update(attrs)
- # Create device class
- cls = LatestDeviceImplMeta(name, bases, dct)
- # Initialize device class
- __init_tango_device_klass(cls, dct)
- cls.TangoClassName = name
- # Return device class
- return cls
-
-
-class Device(LatestDeviceImpl):
+
+ def __new__(metacls, name, bases, attrs):
+ # Attribute dictionary
+ dct = {}
+ # Filter object from bases
+ bases = tuple(base for base in bases if base != object)
+ # Set tango objects as attributes
+ for base in reversed(bases):
+ for key, value in base.__dict__.items():
+ if is_tango_object(value):
+ dct[key] = value
+ # Inheritance patch
+ inheritance_patch(attrs)
+ # Update attribute dictionary
+ dct.update(attrs)
+ # Create device class
+ cls = type(LatestDeviceImpl).__new__(metacls, name, bases, dct)
+ # Initialize device class
+ _init_tango_device_klass(cls, dct)
+ cls.TangoClassName = name
+ # Return device class
+ return cls
+
+
+class BaseDevice(LatestDeviceImpl):
+ """
+ Base device class for the High level API.
+
+ It should not be used directly, since this class is not an
+ instance of MetaDevice. Use tango.server.Device instead.
"""
- High level DeviceImpl API. All Device specific classes should
- inherit from this class."""
def __init__(self, cl, name):
self._tango_properties = {}
@@ -1695,5 +1679,16 @@ def _create_asyncio_worker():
return LoopExecutor(loop=loop)
+# Instanciate DeviceMeta using BaseDevice
+ at six.add_metaclass(DeviceMeta)
+class Device(BaseDevice):
+ """
+ Device class for the high-level API.
+
+ All device specific classes should inherit from this class.
+ """
+ pass
+
+
# Avoid circular imports
from .tango_object import Server
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/pytango.git
More information about the debian-science-commits
mailing list