[pytango] 358/483: Implement feature request #98
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:14:59 UTC 2017
This is an automated email from the git hooks/post-receive script.
sbodomerle-guest pushed a commit to annotated tag bliss_8.10
in repository pytango.
commit 230f4918d779ac2cdb13e9aa21d829deb88b6456
Author: tiagocoutinho <tiagocoutinho at 4e9c00fd-8f2e-0410-aa12-93ce3db5e235>
Date: Fri Feb 14 09:47:51 2014 +0000
Implement feature request #98
git-svn-id: http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk@24938 4e9c00fd-8f2e-0410-aa12-93ce3db5e235
---
doc/revision.rst | 5 +++-
src/boost/python/server.py | 68 ++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 67 insertions(+), 6 deletions(-)
diff --git a/doc/revision.rst b/doc/revision.rst
index 02b70dc..7c18440 100644
--- a/doc/revision.rst
+++ b/doc/revision.rst
@@ -86,7 +86,10 @@ Version history
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| version | Changes |
+==========+===================================================================================================================================================================+
-| 8.1.2 | Bug fixes: |
+| 8.1.2 | Features: |
+| | - `98: PyTango.server.server_run needs additional post_init_callback parameter <https://sourceforge.net/p/tango-cs/feature-requests/98>`_ |
+| | |
+| | Bug fixes: |
| | - `641: python3 error handling issue <https://sourceforge.net/p/tango-cs/bugs/641/>`_ |
| | - `648: PyTango unicode method parameters fail <https://sourceforge.net/p/tango-cs/bugs/648/>`_ |
| | - `649: write_attribute of spectrum/image fails in PyTango without numpy <https://sourceforge.net/p/tango-cs/bugs/649/>`_ |
diff --git a/src/boost/python/server.py b/src/boost/python/server.py
index ce61449..895ed2e 100644
--- a/src/boost/python/server.py
+++ b/src/boost/python/server.py
@@ -183,8 +183,10 @@ __all__ = ["DeviceMeta", "Device", "LatestDeviceImpl", "attribute", "command",
"device_property", "class_property", "server_run"]
import __builtin__
+
import sys
import inspect
+import operator
import functools
import traceback
@@ -675,8 +677,33 @@ class class_property(_property):
pass
+def __to_cb(post_init_callback):
+ if post_init_callback is None:
+ return lambda : None
+
+ err_msg = "post_init_callback must be a callable or " \
+ "sequence <callable [, args, [, kwargs]]>"
+ if operator.isCallable(post_init_callback):
+ return post_init_callback
+ elif is_non_str_seq(post_init_callback):
+ length = len(post_init_callback)
+ if length < 1 or length > 3:
+ raise TypeError(err_msg)
+ cb = post_init_callback[0]
+ if not operator.isCallable(cb):
+ raise TypeError(err_msg)
+ args, kwargs = [], {}
+ if length > 1:
+ args = post_init_callback[1]
+ if length > 2:
+ kwargs = post_init_callback[2]
+ return functools.partial(cb, *args, **kwargs)
+
+ raise TypeError(err_msg)
+
+
def __server_run(classes, args=None, msg_stream=sys.stdout, util=None,
- event_loop=None):
+ event_loop=None, post_init_callback=None):
import PyTango
if msg_stream is None:
import io
@@ -685,6 +712,8 @@ def __server_run(classes, args=None, msg_stream=sys.stdout, util=None,
if args is None:
args = sys.argv
+ post_init_callback = __to_cb(post_init_callback)
+
if util is None:
util = PyTango.Util(args)
@@ -707,28 +736,36 @@ def __server_run(classes, args=None, msg_stream=sys.stdout, util=None,
klass_name = klass_info._DeviceClassName
klass = klass_info
util.add_class(klass_klass, klass, klass_name)
+
u_instance = PyTango.Util.instance()
if event_loop is not None:
u_instance.server_set_event_loop(event_loop)
u_instance.server_init()
+ post_init_callback()
msg_stream.write("Ready to accept request\n")
u_instance.server_run()
return util
def server_run(classes, args=None, msg_stream=sys.stdout,
- verbose=False, util=None, event_loop=None):
+ verbose=False, util=None, event_loop=None,
+ post_init_callback=None):
"""Provides a simple way to run a tango server. It handles exceptions
by writting a message to the msg_stream.
The `classes` parameter can be either a sequence of :class:`~PyTango.server.Device`
classes or a dictionary where:
+
+ The optional `post_init_callback` can be a callable (without arguments)
+ or a tuple where the first element is the callable, the second is a list
+ of arguments(optional) and the third is a dictionary of keyword arguments
+ (also optional). Examples::
* key is the tango class name
* value is either:
#. a :class:`~PyTango.server.Device` class or
#. a a sequence of two elements :class:`~PyTango.DeviceClass`, :class:`~PyTango.DeviceImpl`
-
+
Example 1: registering and running a PowerSupply inheriting from :class:`~PyTango.server.Device`::
from PyTango import server_run
@@ -772,6 +809,10 @@ def server_run(classes, args=None, msg_stream=sys.stdout,
:param event_loop: event_loop callable
:type event_loop: callable
+ :param post_init_callback: an optional callback that is executed between
+ the calls Util.server_init and Util.server_run
+ :type post_init_callback: callable or tuple (see description above)
+
:return: The Util singleton object
:rtype: :class:`~PyTango.Util`
@@ -784,14 +825,19 @@ def server_run(classes, args=None, msg_stream=sys.stdout,
.. versionchanged:: 8.1.1
Changed default msg_stream from *stderr* to *stdout*
Added `event_loop` keyword parameter.
- Returns util object"""
+ Returns util object
+ .. versionchanged:: 8.1.2
+ Added `post_init_callback` keyword parameter
+ """
if msg_stream is None:
import io
msg_stream = io.BytesIO()
write = msg_stream.write
try:
- return __server_run(classes, args=args, util=util, event_loop=event_loop)
+ return __server_run(classes, args=args, msg_stream=msg_stream,
+ util=util, event_loop=event_loop,
+ post_init_callback=post_init_callback)
except KeyboardInterrupt:
write("Exiting: Keyboard interrupt\n")
except DevFailed as df:
@@ -803,3 +849,15 @@ def server_run(classes, args=None, msg_stream=sys.stdout,
if verbose:
write(traceback.format_exc())
write("\nExited\n")
+
+def run(classes, args=None, msg_stream=sys.stdout,
+ verbose=False, util=None, event_loop=None,
+ post_init_callback=None):
+ """Just an alias to :func:`~PyTango.server.server_run`
+ """
+ return server_run(classes, args=args, msg_stream=msg_stream,
+ verbose=verbose, util=util, event_loop=event_loop,
+ post_init_callback=post_init_callback)
+
+run.__doc__ += server_run.__doc__
+
--
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