[pytango] 287/483: preparing 8.1.0
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:14:51 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 f48781f5c5df05f22225df6bd9c31c3a37fff1bf
Author: tiagocoutinho <tiagocoutinho at 4e9c00fd-8f2e-0410-aa12-93ce3db5e235>
Date: Tue Oct 29 14:27:04 2013 +0000
preparing 8.1.0
git-svn-id: http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk@24070 4e9c00fd-8f2e-0410-aa12-93ce3db5e235
---
MANIFEST.in | 8 +-
Makefile | 49 ++++-
doc/revision.rst | 453 ++++++++++++++++++++-------------------
setup.py | 205 +++++++++---------
src/boost/cpp/base_types.cpp | 2 +
src/boost/cpp/constants.cpp | 23 +-
src/boost/cpp/device_proxy.cpp | 4 +-
src/boost/python/device_proxy.py | 171 ++++++++-------
src/boost/python/pytango_init.py | 62 +++++-
src/boost/python/tango_gevent.py | 20 +-
src/boost/python/utils.py | 212 ++++++++++--------
11 files changed, 678 insertions(+), 531 deletions(-)
diff --git a/MANIFEST.in b/MANIFEST.in
index e917e44..4b8d750 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -12,8 +12,8 @@ graft tests
global-exclude *.pyc
global-exclude *.pyo
exclude setup.cfg
-exclude .project
-exclude .ropeproject
-exclude .pydevproject
-exclude images/*
+#exclude .project
+#exclude .ropeproject
+#exclude .pydevproject
+exclude images/
exclude src/precompiled_header.hpp.gch
diff --git a/Makefile b/Makefile
index 300c88d..1672209 100644
--- a/Makefile
+++ b/Makefile
@@ -61,6 +61,8 @@ else
NUMPY_INC = -I$(NUMPY_ROOT)/include
endif
+PYTANGO_NUMPY_VERSION = $(shell $(PY_EXC) -c "import sys, numpy; sys.stdout.write(numpy.__version__)")
+
ifndef prefix
ifdef user
_PY_DIR=$(shell $(PY_EXC) -c "import sys, os; sys.stdout.write(os.path.split(os.path.join(os.path.dirname(os.__file__)))[1])")
@@ -80,22 +82,40 @@ endif
CC = gcc
PY_INC := $(shell python$(PY_VER)-config --includes)
+
+ifdef optimize
+OPTIMIZE_CC = -g -O2
+OPTIMIZE_LN = -O2
+else
OPTIMIZE_CC = -g -O0
OPTIMIZE_LN = -O0
+endif
+
+TANGO_CFLAGS=`pkg-config --cflags-only-other tango`
+TANGO_LIBS=`pkg-config --libs-only-l tango`
+BOOST_LIB = boost_python-py$(PY_VER_S)
PRE_C_H := precompiled_header.hpp
PRE_C_H_O := $(OBJS_DIR)/$(PRE_C_H).gch
PRE_C := -include$(OBJS_DIR)/$(PRE_C_H)
-LN := g++ -pthread -shared -Wl,$(OPTIMIZE_LN) -Wl,-Bsymbolic-functions
+
+LN := g++ -pthread -shared -Wl,$(OPTIMIZE_LN) -Wl,-Bsymbolic-functions -z defs
LN_STATIC := g++ -pthread -static -Wl,$(OPTIMIZE_LN) -Wl,-Bsymbolic-functions
+
LN_VER := -Wl,-h -Wl,--strip-all
-BOOST_LIB := boost_python-py$(PY_VER_S)
-LN_LIBS := -ltango -llog4tango -lpthread -lrt -ldl -lomniORB4 -lomniDynamic4 -lomnithread -lCOS4 -l$(BOOST_LIB) -lzmq
+
+LN_LIBS := -l$(BOOST_LIB) -lpython$(PY_VER)
INCLUDE_DIRS =
+
ifdef TANGO_ROOT
LN_DIRS += -L$(TANGO_ROOT)/lib
INCLUDE_DIRS += -I$(TANGO_ROOT)/include -I$(TANGO_ROOT)/include/tango
+LN_LIBS += -ltango -lomniDynamic4 -lCOS4 -llog4tango -lzmq -lomniORB4 -lomnithread
+else
+LN_DIRS += `pkg-config --libs-only-L tango`
+INCLUDE_DIRS += `pkg-config --cflags-only-I tango`
+LN_LIBS += `pkg-config --libs-only-l tango`
endif
ifdef LOG4TANGO_ROOT
@@ -114,6 +134,7 @@ endif
ifdef ZMQ_ROOT
LN_DIRS += -L$(ZMQ_ROOT)/lib
+INCLUDE_DIRS += -I$(ZMQ_ROOT)/include
endif
INCLUDE_DIRS += \
@@ -122,14 +143,14 @@ INCLUDE_DIRS += \
$(PY_INC) \
$(NUMPY_INC)
-CCFLAGS := -pthread -fno-strict-aliasing -DNDEBUG $(OPTIMIZE_CC) -fwrapv -Wall -fPIC -std=c++0x -DPYTANGO_HAS_UNIQUE_PTR $(INCLUDE_DIRS)
+MACROS := -DNDEBUG -DPYTANGO_NUMPY_VERSION=\"$(PYTANGO_NUMPY_VERSION)\" -DPYTANGO_HAS_UNIQUE_PTR
+CFLAGS := -pthread -fno-strict-aliasing -fwrapv -Wall -fPIC $(OPTIMIZE_CC) $(MACROS) $(TANGO_CFLAGS) $(INCLUDE_DIRS)
+LNFLAGS := $(LN_DIRS) $(LN_LIBS)
LIB_NAME := _PyTango.so
LIB_NAME_STATIC := _PyTangoStatic.so
LIB_SYMB_NAME := $(LIB_NAME).dbg
-
-
OBJS := \
$(OBJS_DIR)/api_util.o \
$(OBJS_DIR)/archive_event_info.o \
@@ -207,6 +228,12 @@ command.h \
device_class.h \
device_impl.h
+ifdef optimize
+LINKER=$(LN) $(LNFLAGS) $(OBJS) $(LN_VER) -o $(OBJS_DIR)/$(LIB_NAME).full ; strip --strip-all -o $(OBJS_DIR)/$(LIB_NAME) $(OBJS_DIR)/$(LIB_NAME).full
+else
+LINKER=$(LN) $(LNFLAGS) $(OBJS) $(LN_VER) -o $(OBJS_DIR)/$(LIB_NAME)
+endif
+
#-----------------------------------------------------------------
all: build
@@ -215,23 +242,25 @@ build: init $(PRE_C_H_O) $(LIB_NAME)
init:
@echo Using python $(PY_VER)
+ @echo CFLAGS = $(CFLAGS)
+ @echo LNFLAGS = $(LNFLAGS)
@echo Preparing build directories...
@mkdir -p $(OBJS_DIR)
$(PRE_C_H_O): $(SRC_DIR)/$(PRE_C_H)
@echo Compiling pre-compiled header...
- @$(CC) $(CCFLAGS) -c $< -o $(PRE_C_H_O)
+ @$(CC) $(CFLAGS) -c $< -o $(PRE_C_H_O)
#
# Rule for API files
#
$(OBJS_DIR)/%.o: $(SRC_DIR)/%.cpp
@echo Compiling $(<F) ...
- @$(CC) $(CCFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(PRE_C)
+ @$(CC) $(CFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(PRE_C)
$(OBJS_DIR)/%.o: $(SRC_DIR)/server/%.cpp
@echo Compiling $(<F) ...
- @$(CC) $(CCFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(PRE_C)
+ @$(CC) $(CFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(PRE_C)
#
# The shared libs
@@ -239,7 +268,7 @@ $(OBJS_DIR)/%.o: $(SRC_DIR)/server/%.cpp
$(LIB_NAME): $(PRE_C_H_0) $(OBJS)
@echo Linking shared $(LIB_NAME) ...
- @$(LN) $(OBJS) $(LN_DIRS) $(LN_LIBS) -o $(OBJS_DIR)/$(LIB_NAME) $(LN_VER)
+ @$(LINKER)
clean:
@echo Cleaning ...
diff --git a/doc/revision.rst b/doc/revision.rst
index 0c2f5a1..d5548d8 100644
--- a/doc/revision.rst
+++ b/doc/revision.rst
@@ -12,7 +12,7 @@ Revision
History of modifications:
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
-| Date | Revision | Description | Author |
+| Date | Revision | Description | Author |
+==========+==================================================================================+=====================================================+=======================+
| 18/07/03 | 1.0 | Initial Version | M\. Ounsy |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
@@ -71,9 +71,9 @@ History of modifications:
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
| 20/05/13 | `8.16 <http://www.tango-controls.org/static/PyTango/v803/doc/html/index.html>`_ | Update to PyTango 8.0.3 | T\. Coutinho |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
-| 09/07/13 | `8.17 <http://www.tango-controls.org/static/PyTango/v804/doc/html/index.html>`_ | Update to PyTango 8.0.4 | T\. Coutinho |
+| 28/08/13 | `8.13 <http://www.tango-controls.org/static/PyTango/v723/doc/html/index.html>`_ | Update to PyTango 7.2.4 | T\. Coutinho |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
-| /07/13 | `8.18 <http://www.tango-controls.org/static/PyTango/v810/doc/html/index.html>`_ | Update to PyTango 8.1.0 | T\. Coutinho |
+| 26/09/13 | `8.18 <http://www.tango-controls.org/static/PyTango/v810/doc/html/index.html>`_ | Update to PyTango 8.1.0 | T\. Coutinho |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
.. _version-history:
@@ -81,224 +81,229 @@ History of modifications:
Version history
---------------
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| version | Changes |
-+============+==============================================================================================================================================================================+
-| 8.1.0 | Features: |
-| | - Implemented tango C++ 8.1 API |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.4 | Bug fixes: |
-| | - `598: [pytango][8.0.3] failed to build from source on s390 <https://sourceforge.net/p/tango-cs/bugs/598/>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.3 | Features: |
-| | - from sourceforge: |
-| | - `88: Implement Util::server_set_event_loop method in python <https://sourceforge.net/p/tango-cs/feature-requests/88>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3576353: [pytango] segfault on 'RestartServer' <https://sourceforge.net/tracker/?func=detail&aid=3576353&group_id=57612&atid=484769>`_ |
-| | - `3579062: [pytango] Attribute missing methods <https://sourceforge.net/tracker/?func=detail&aid=3579062&group_id=57612&atid=484769>`_ |
-| | - `3586337: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/tracker/?func=detail&aid=3586337&group_id=57612&atid=484769>`_ |
-| | - `3598514: DeviceProxy.__setattr__ break python's descriptors <https://sourceforge.net/tracker/?func=detail&aid=3598514&group_id=57612&atid=484769>`_ |
-| | - `3607779: [pytango] IPython 0.10 error <https://sourceforge.net/tracker/?func=detail&aid=3607779&group_id=57612&atid=484769>`_ |
-| | - `598: Import DLL by PyTango failed on windows <https://sourceforge.net/p/tango-cs/bugs/598/>`_ |
-| | - `605: [pytango] use distutils.version module <https://sourceforge.net/p/tango-cs/bugs/605/>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.2 | Bug fixes: |
-| | - from sourceforge: |
-| | - `3570970: [pytango] problem during the python3 building <https://sourceforge.net/tracker/?func=detail&aid=3570970&group_id=57612&atid=484769>`_ |
-| | - `3570971: [pytango] itango does not work without qtconsole <https://sourceforge.net/tracker/?func=detail&aid=3570971&group_id=57612&atid=484769>`_ |
-| | - `3570972: [pytango] warning/error when building 8.0.0 <https://sourceforge.net/tracker/?func=detail&aid=3570972&group_id=57612&atid=484769>`_ |
-| | - `3570975: [pytango] problem during use of python3 version <https://sourceforge.net/tracker/?func=detail&aid=3570975&group_id=57612&atid=484769>`_ |
-| | - `3574099: [pytango] compile error with gcc < 4.5 <https://sourceforge.net/tracker/?func=detail&aid=3574099&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.1 | *SKIPPED* |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.0 | Features: |
-| | - Implemented tango C++ 8.0 API |
-| | - Python 3k compatible |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3023857: DevEncoded write attribute not supported <https://sourceforge.net/tracker/?func=detail&aid=3023857&group_id=57612&atid=484769>`_ |
-| | - `3521545: [pytango] problem with tango profile <https://sourceforge.net/tracker/?func=detail&aid=3521545&group_id=57612&atid=484769>`_ |
-| | - `3530535: PyTango group writting fails <https://sourceforge.net/tracker/?func=detail&aid=3530535&group_id=57612&atid=484769>`_ |
-| | - `3564959: EncodedAttribute.encode_xxx() methods don't accept bytearray <https://sourceforge.net/tracker/?func=detail&aid=3564959&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.3 | Features: |
-| | - from sourceforge: |
-| | - `3495607: DeviceClass.device_name_factory is missing <https://sourceforge.net/tracker/?func=detail&aid=3495607&group_id=57612&atid=484772>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3103588: documentation of PyTango.Attribute.Group <https://sourceforge.net/tracker/?func=detail&aid=3103588&group_id=57612&atid=484769>`_ |
-| | - `3458336: Problem with pytango 7.2.2 <https://sourceforge.net/tracker/?func=detail&aid=3458336&group_id=57612&atid=484769>`_ |
-| | - `3463377: PyTango memory leak in read encoded attribute <https://sourceforge.net/tracker/?func=detail&aid=3463377&group_id=57612&atid=484769>`_ |
-| | - `3487930: [pytango] wrong python dependency <https://sourceforge.net/tracker/?func=detail&aid=3487930&group_id=57612&atid=484769>`_ |
-| | - `3511509: Attribute.set_value_date_quality for encoded does not work <https://sourceforge.net/tracker/?func=detail&aid=3511509&group_id=57612&atid=484769>`_ |
-| | - `3514457: [pytango] TANGO_HOST multi-host support <https://sourceforge.net/tracker/?func=detail&aid=3514457&group_id=57612&atid=484769>`_ |
-| | - `3520739: command_history(...) in PyTango <https://sourceforge.net/tracker/?func=detail&aid=3520739&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.2 | Features: |
-| | - from sourceforge: |
-| | - `3305251: DS dynamic attributes discards some Attr properties <https://sourceforge.net/tracker/?func=detail&aid=3305251&group_id=57612&atid=484769>`_ |
-| | - `3365792: DeviceProxy.<cmd_name> could be documented <https://sourceforge.net/tracker/?func=detail&aid=3365792&group_id=57612&atid=484772>`_ |
-| | - `3386079: add support for ipython 0.11 <https://sourceforge.net/tracker/?func=detail&aid=3386079&group_id=57612&atid=484772>`_ |
-| | - `3437654: throw python exception as tango exception <https://sourceforge.net/tracker/?func=detail&aid=3437654&group_id=57612&atid=484772>`_ |
-| | - `3447477: spock profile installation <https://sourceforge.net/tracker/?func=detail&aid=3447477&group_id=57612&atid=484772>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3372371: write attribute of DevEncoded doesn't work <https://sourceforge.net/tracker/?func=detail&aid=3372371&group_id=57612&atid=484769>`_ |
-| | - `3374026: [pytango] pyflakes warning <https://sourceforge.net/tracker/?func=detail&aid=3374026&group_id=57612&atid=484769>`_ |
-| | - `3404771: PyTango.MultiAttribute.get_attribute_list missing <https://sourceforge.net/tracker/?func=detail&aid=3404771&group_id=57612&atid=484769>`_ |
-| | - `3405580: PyTango.MultiClassAttribute missing <https://sourceforge.net/tracker/?func=detail&aid=3405580&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.1 | *SKIPPED* |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.0 | Features: |
-| | - from sourceforge: |
-| | - `3286678: Add missing EncodedAttribute JPEG methods <https://sourceforge.net/tracker/?func=detail&aid=3286678&group_id=57612&atid=484772>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.6 | Bug fixes: |
-| | - 7.1.5 distribution is missing some files |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.5 | Bug fixes: |
-| | - from sourceforge: |
-| | - `3284174: 7.1.4 does not build with gcc 4.5 and tango 7.2.6 <https://sourceforge.net/tracker/?func=detail&aid=3284174&group_id=57612&atid=484769>`_ |
-| | - `3284265: [pytango][7.1.4] a few files without licence and copyright <https://sourceforge.net/tracker/?func=detail&aid=3284265&group_id=57612&atid=484769>`_ |
-| | - `3284318: copyleft vs copyright <https://sourceforge.net/tracker/?func=detail&aid=3284318&group_id=57612&atid=484769>`_ |
-| | - `3284434: [pytango][doc] few ERROR during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284434&group_id=57612&atid=484769>`_ |
-| | - `3284435: [pytango][doc] few warning during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284435&group_id=57612&atid=484769>`_ |
-| | - `3284440: [pytango][spock] the profile can't be installed <https://sourceforge.net/tracker/?func=detail&aid=3284440&group_id=57612&atid=484769>`_ |
-| | - `3285185: PyTango Device Server does not load Class Properties values <https://sourceforge.net/tracker/?func=detail&aid=3285185&group_id=57612&atid=484769>`_ |
-| | - `3286055: PyTango 7.1.x DS using Tango C++ 7.2.x seg faults on exit <https://sourceforge.net/tracker/?func=detail&aid=3286055&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.4 | Features: |
-| | - from sourceforge: |
-| | - `3274309: Generic Callback for events <https://sourceforge.net/tracker/?func=detail&aid=3274309&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3011775: Seg Faults due to removed dynamic attributes <https://sourceforge.net/tracker/?func=detail&aid=3011775&group_id=57612&atid=484769>`_ |
-| | - `3105169: PyTango 7.1.3 does not compile with Tango 7.2.X <https://sourceforge.net/tracker/?func=detail&aid=3105169&group_id=57612&atid=484769>`_ |
-| | - `3107243: spock profile does not work with python 2.5 <https://sourceforge.net/tracker/?func=detail&aid=3107243&group_id=57612&atid=484769>`_ |
-| | - `3124427: PyTango.WAttribute.set_max_value() changes min value <https://sourceforge.net/tracker/?func=detail&aid=3124427&group_id=57612&atid=484769>`_ |
-| | - `3170399: Missing documentation about is_<attr>_allowed method <https://sourceforge.net/tracker/?func=detail&aid=3170399&group_id=57612&atid=484769>`_ |
-| | - `3189082: Missing get_properties() for Attribute class <https://sourceforge.net/tracker/?func=detail&aid=3189082&group_id=57612&atid=484769>`_ |
-| | - `3196068: delete_device() not called after server_admin.Kill() <https://sourceforge.net/tracker/?func=detail&aid=3196068&group_id=57612&atid=484769>`_ |
-| | - `3257286: Binding crashes when reading a WRITE string attribute <https://sourceforge.net/tracker/?func=detail&aid=3257286&group_id=57612&atid=484769>`_ |
-| | - `3267628: DP.read_attribute(, extract=List/tuple) write value is wrong <https://sourceforge.net/tracker/?func=detail&aid=3267628&group_id=57612&atid=484769>`_ |
-| | - `3274262: Database.is_multi_tango_host missing <https://sourceforge.net/tracker/?func=detail&aid=3274262&group_id=57612&atid=484769>`_ |
-| | - `3274319: EncodedAttribute is missing in PyTango (<= 7.1.3) <https://sourceforge.net/tracker/?func=detail&aid=3274319&group_id=57612&atid=484769>`_ |
-| | - `3277269: read_attribute(DevEncoded) is not numpy as expected <https://sourceforge.net/tracker/?func=detail&aid=3277269&group_id=57612&atid=484769>`_ |
-| | - `3278946: DeviceAttribute copy constructor is not working <https://sourceforge.net/tracker/?func=detail&aid=3278946&group_id=57612&atid=484769>`_ |
-| | |
-| | Documentation: |
-| | - Added :ref:`utilities` chapter |
-| | - Added :ref:`encoded` chapter |
-| | - Improved :ref:`server` chapter |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.3 | Features: |
-| | - tango logging with print statement |
-| | - tango logging with decorators |
-| | - from sourceforge: |
-| | - `3060380: ApiUtil should be exported to PyTango <https://sourceforge.net/tracker/?func=detail&aid=3060380&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - added licence header to all source code files |
-| | - spock didn't work without TANGO_HOST env. variable (it didn't recognize |
-| | tangorc) |
-| | - spock should give a proper message if it tries to be initialized outside |
-| | ipython |
-| | - from sourceforge: |
-| | - `3048798: licence issue GPL != LGPL <https://sourceforge.net/tracker/?func=detail&aid=3048798&group_id=57612&atid=484769>`_ |
-| | - `3073378: DeviceImpl.signal_handler raising exception crashes DS <https://sourceforge.net/tracker/?func=detail&aid=3073378&group_id=57612&atid=484769>`_ |
-| | - `3088031: Python DS unable to read DevVarBooleanArray property <https://sourceforge.net/tracker/?func=detail&aid=3088031&group_id=57612&atid=484769>`_ |
-| | - `3102776: PyTango 7.1.2 does not work with python 2.4 & boost 1.33.0 <https://sourceforge.net/tracker/?func=detail&aid=3102776&group_id=57612&atid=484769>`_ |
-| | - `3102778: Fix compilation warnings in linux <https://sourceforge.net/tracker/?func=detail&aid=3102778&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.2 | Features: |
-| | - from sourceforge: |
-| | - `2995964: Dynamic device creation <https://sourceforge.net/tracker/?func=detail&aid=2995964&group_id=57612&atid=484772>`_ |
-| | - `3010399: The DeviceClass.get_device_list that exists in C++ is missing <https://sourceforge.net/tracker/?func=detail&aid=3010399&group_id=57612&atid=484772>`_ |
-| | - `3023686: Missing DeviceProxy.<attribute name> <https://sourceforge.net/tracker/?func=detail&aid=3023686&group_id=57612&atid=484772>`_ |
-| | - `3025396: DeviceImpl is missing some CORBA methods <https://sourceforge.net/tracker/?func=detail&aid=3025396&group_id=57612&atid=484772>`_ |
-| | - `3032005: IPython extension for PyTango <https://sourceforge.net/tracker/?func=detail&aid=3032005&group_id=57612&atid=484772>`_ |
-| | - `3033476: Make client objects pickable <https://sourceforge.net/tracker/?func=detail&aid=3033476&group_id=57612&atid=484772>`_ |
-| | - `3039902: PyTango.Util.add_class would be useful <https://sourceforge.net/tracker/?func=detail&aid=3039902&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2975940: DS command with DevVarCharArray return type fails <https://sourceforge.net/tracker/?func=detail&aid=2975940&group_id=57612&atid=484769>`_ |
-| | - `3000467: DeviceProxy.unlock is LOCKING instead of unlocking! <https://sourceforge.net/tracker/?func=detail&aid=3000467&group_id=57612&atid=484769>`_ |
-| | - `3010395: Util.get_device_* methods don't work <https://sourceforge.net/tracker/?func=detail&aid=3010395&group_id=57612&atid=484769>`_ |
-| | - `3010425: Database.dev_name does not work <https://sourceforge.net/tracker/?func=detail&aid=3010425&group_id=57612&atid=484769>`_ |
-| | - `3016949: command_inout_asynch callback does not work <https://sourceforge.net/tracker/?func=detail&aid=3016949&group_id=57612&atid=484769>`_ |
-| | - `3020300: PyTango does not compile with gcc 4.1.x <https://sourceforge.net/tracker/?func=detail&aid=3020300&group_id=57612&atid=484769>`_ |
-| | - `3030399: Database put(delete)_attribute_alias generates segfault <https://sourceforge.net/tracker/?func=detail&aid=3030399&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.1 | Features: |
-| | - Improved setup script |
-| | - Interfaced with PyPI |
-| | - Cleaned build script warnings due to unclean python C++ macro definitions |
-| | - from sourceforge: |
-| | - `2985993: PyTango numpy command support <https://sourceforge.net/tracker/?func=detail&aid=2985993&group_id=57612&atid=484772>`_ |
-| | - `2971217: PyTango.GroupAttrReplyList slicing <https://sourceforge.net/tracker/?func=detail&aid=2971217&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2983299: Database.put_property() deletes the property <https://sourceforge.net/tracker/?func=detail&aid=2983299&group_id=57612&atid=484769>`_ |
-| | - `2953689: can not write_attribute scalar/spectrum/image <https://sourceforge.net/tracker/?func=detail&aid=2953689&group_id=57612&atid=484769>`_ |
-| | - `2953030: PyTango doc installation <https://sourceforge.net/tracker/?func=detail&aid=2953030&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.0 | Features: |
-| | - from sourceforge: |
-| | - `2908176: read_*, write_* and is_*_allowed() methods can now be defined <https://sourceforge.net/tracker/?func=detail&aid=2908176&group_id=57612&atid=484772>`_ |
-| | - `2941036: TimeVal conversion to time and datetime <https://sourceforge.net/tracker/?func=detail&aid=2941036&group_id=57612&atid=484772>`_ |
-| | - added str representation on Attr, Attribute, DeviceImpl and DeviceClass |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2903755: get_device_properties() bug reading DevString properties <https://sourceforge.net/tracker/?func=detail&aid=2903755group_id=57612&atid=484769>`_ |
-| | - `2909927: PyTango.Group.read_attribute() return values <https://sourceforge.net/tracker/?func=detail&aid=2909927&group_id=57612&atid=484769>`_ |
-| | - `2914194: DevEncoded does not work <https://sourceforge.net/tracker/?func=detail&aid=2914194&group_id=57612&atid=484769>`_ |
-| | - `2916397: PyTango.DeviceAttribute copy constructor does not work <https://sourceforge.net/tracker/?func=detail&aid=2916397&group_id=57612&atid=484769>`_ |
-| | - `2936173: PyTango.Group.read_attributes() fails <https://sourceforge.net/tracker/?func=detail&aid=2936173&group_id=57612&atid=484769>`_ |
-| | - `2949099: Missing PyTango.Except.print_error_stack <https://sourceforge.net/tracker/?func=detail&aid=2949099&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.0rc1 | Features: |
-| | - v = image_attribute.get_write_value() returns square sequences (arrays of |
-| | arrays, or numpy objects) now instead of flat lists. Also for spectrum |
-| | attributes a numpy is returned by default now instead. |
-| | - image_attribute.set_value(v) accepts numpy arrays now or square sequences |
-| | instead of just flat lists. So, dim_x and dim_y are useless now. Also the |
-| | numpy path is faster. |
-| | - new enum AttrSerialModel |
-| | - Attribute new methods: set(get)_attr_serial_model, set_change_event, |
-| | set_archive_event, is_change_event, is_check_change_event, |
-| | is_archive_criteria, is_check_archive_criteria, remove_configuration |
-| | - added support for numpy scalars in tango operations like write_attribute |
-| | (ex: now a DEV_LONG attribute can receive a numpy.int32 argument in a |
-| | write_attribute method call) |
-| | |
-| | Bug fixes: |
-| | - DeviceImpl.set_value for scalar attributes |
-| | - DeviceImpl.push_***_event |
-| | - server commands with DevVar***StringArray as parameter or as return type |
-| | - in windows,a bug in PyTango.Util prevented servers from starting up |
-| | - DeviceImpl.get_device_properties for string properties assigns only first |
-| | character of string to object member instead of entire string |
-| | - added missing methods to Util |
-| | - exported SubDevDiag class |
-| | - error in read/events of attributes of type DevBoolean READ_WRITE |
-| | - error in automatic unsubscribe events of DeviceProxy when the object |
-| | disapears (happens only on some compilers with some optimization flags) |
-| | - fix possible bug when comparing attribute names in DeviceProxy |
-| | - pretty print of DevFailed -> fix deprecation warning in python 2.6 |
-| | - device class properties where not properly fetched when there is no |
-| | property value defined |
-| | - memory leak when converting DevFailed exceptions from C++ to python |
-| | - python device server file without extension does not start |
-| | |
-| | Documentation: |
-| | - Improved FAQ |
-| | - Improved compilation chapter |
-| | - Improved migration information |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| version | Changes |
++==========+===================================================================================================================================================================+
+| 8.1.0 | Features: |
+| | - Implemented tango C++ 8.1 API |
+| | Bug fixes: |
+| | - `573: [pytango] python3 error with unregistered device <https://sourceforge.net/p/tango-cs/bugs/573/>`_ |
+| | - `611: URGENT fail to write attribute with PyTango 8.0.3 <https://sourceforge.net/p/tango-cs/bugs/611/>`_ |
+| | - `612: [pytango][8.0.3] failed to build from source on s390 <https://sourceforge.net/p/tango-cs/bugs/612/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.3 | Features: |
+| | - from sourceforge: |
+| | - `88: Implement Util::server_set_event_loop method in python <https://sourceforge.net/p/tango-cs/feature-requests/88>`_ |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `3576353: [pytango] segfault on 'RestartServer' <https://sourceforge.net/tracker/?func=detail&aid=3576353&group_id=57612&atid=484769>`_ |
+| | - `3579062: [pytango] Attribute missing methods <https://sourceforge.net/tracker/?func=detail&aid=3579062&group_id=57612&atid=484769>`_ |
+| | - `3586337: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/tracker/?func=detail&aid=3586337&group_id=57612&atid=484769>`_ |
+| | - `3598514: DeviceProxy.__setattr__ break python's descriptors <https://sourceforge.net/tracker/?func=detail&aid=3598514&group_id=57612&atid=484769>`_ |
+| | - `3607779: [pytango] IPython 0.10 error <https://sourceforge.net/tracker/?func=detail&aid=3607779&group_id=57612&atid=484769>`_ |
+| | - `598: Import DLL by PyTango failed on windows <https://sourceforge.net/p/tango-cs/bugs/598/>`_ |
+| | - `605: [pytango] use distutils.version module <https://sourceforge.net/p/tango-cs/bugs/605/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.2 | Bug fixes: |
+| | - from sourceforge: |
+| | - `3570970: [pytango] problem during the python3 building <https://sourceforge.net/tracker/?func=detail&aid=3570970&group_id=57612&atid=484769>`_ |
+| | - `3570971: [pytango] itango does not work without qtconsole <https://sourceforge.net/tracker/?func=detail&aid=3570971&group_id=57612&atid=484769>`_ |
+| | - `3570972: [pytango] warning/error when building 8.0.0 <https://sourceforge.net/tracker/?func=detail&aid=3570972&group_id=57612&atid=484769>`_ |
+| | - `3570975: [pytango] problem during use of python3 version <https://sourceforge.net/tracker/?func=detail&aid=3570975&group_id=57612&atid=484769>`_ |
+| | - `3574099: [pytango] compile error with gcc < 4.5 <https://sourceforge.net/tracker/?func=detail&aid=3574099&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.1 | *SKIPPED* |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.0 | Features: |
+| | - Implemented tango C++ 8.0 API |
+| | - Python 3k compatible |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `3023857: DevEncoded write attribute not supported <https://sourceforge.net/tracker/?func=detail&aid=3023857&group_id=57612&atid=484769>`_ |
+| | - `3521545: [pytango] problem with tango profile <https://sourceforge.net/tracker/?func=detail&aid=3521545&group_id=57612&atid=484769>`_ |
+| | - `3530535: PyTango group writting fails <https://sourceforge.net/tracker/?func=detail&aid=3530535&group_id=57612&atid=484769>`_ |
+| | - `3564959: EncodedAttribute.encode_xxx() methods don't accept bytearray <https://sourceforge.net/tracker/?func=detail&aid=3564959&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.4 | Bug fixes: |
+| | - from sourceforge: |
+| | - `551: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/p/tango-cs/bugs/551/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.3 | Features: |
+| | - from sourceforge: |
+| | - `3495607: DeviceClass.device_name_factory is missing <https://sourceforge.net/tracker/?func=detail&aid=3495607&group_id=57612&atid=484772>`_ |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `3103588: documentation of PyTango.Attribute.Group <https://sourceforge.net/tracker/?func=detail&aid=3103588&group_id=57612&atid=484769>`_ |
+| | - `3458336: Problem with pytango 7.2.2 <https://sourceforge.net/tracker/?func=detail&aid=3458336&group_id=57612&atid=484769>`_ |
+| | - `3463377: PyTango memory leak in read encoded attribute <https://sourceforge.net/tracker/?func=detail&aid=3463377&group_id=57612&atid=484769>`_ |
+| | - `3487930: [pytango] wrong python dependency <https://sourceforge.net/tracker/?func=detail&aid=3487930&group_id=57612&atid=484769>`_ |
+| | - `3511509: Attribute.set_value_date_quality for encoded does not work <https://sourceforge.net/tracker/?func=detail&aid=3511509&group_id=57612&atid=484769>`_ |
+| | - `3514457: [pytango] TANGO_HOST multi-host support <https://sourceforge.net/tracker/?func=detail&aid=3514457&group_id=57612&atid=484769>`_ |
+| | - `3520739: command_history(...) in PyTango <https://sourceforge.net/tracker/?func=detail&aid=3520739&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.2 | Features: |
+| | - from sourceforge: |
+| | - `3305251: DS dynamic attributes discards some Attr properties <https://sourceforge.net/tracker/?func=detail&aid=3305251&group_id=57612&atid=484769>`_ |
+| | - `3365792: DeviceProxy.<cmd_name> could be documented <https://sourceforge.net/tracker/?func=detail&aid=3365792&group_id=57612&atid=484772>`_ |
+| | - `3386079: add support for ipython 0.11 <https://sourceforge.net/tracker/?func=detail&aid=3386079&group_id=57612&atid=484772>`_ |
+| | - `3437654: throw python exception as tango exception <https://sourceforge.net/tracker/?func=detail&aid=3437654&group_id=57612&atid=484772>`_ |
+| | - `3447477: spock profile installation <https://sourceforge.net/tracker/?func=detail&aid=3447477&group_id=57612&atid=484772>`_ |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `3372371: write attribute of DevEncoded doesn't work <https://sourceforge.net/tracker/?func=detail&aid=3372371&group_id=57612&atid=484769>`_ |
+| | - `3374026: [pytango] pyflakes warning <https://sourceforge.net/tracker/?func=detail&aid=3374026&group_id=57612&atid=484769>`_ |
+| | - `3404771: PyTango.MultiAttribute.get_attribute_list missing <https://sourceforge.net/tracker/?func=detail&aid=3404771&group_id=57612&atid=484769>`_ |
+| | - `3405580: PyTango.MultiClassAttribute missing <https://sourceforge.net/tracker/?func=detail&aid=3405580&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.1 | *SKIPPED* |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.0 | Features: |
+| | - from sourceforge: |
+| | - `3286678: Add missing EncodedAttribute JPEG methods <https://sourceforge.net/tracker/?func=detail&aid=3286678&group_id=57612&atid=484772>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.6 | Bug fixes: |
+| | - 7.1.5 distribution is missing some files |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.5 | Bug fixes: |
+| | - from sourceforge: |
+| | - `3284174: 7.1.4 does not build with gcc 4.5 and tango 7.2.6 <https://sourceforge.net/tracker/?func=detail&aid=3284174&group_id=57612&atid=484769>`_ |
+| | - `3284265: [pytango][7.1.4] a few files without licence and copyright <https://sourceforge.net/tracker/?func=detail&aid=3284265&group_id=57612&atid=484769>`_ |
+| | - `3284318: copyleft vs copyright <https://sourceforge.net/tracker/?func=detail&aid=3284318&group_id=57612&atid=484769>`_ |
+| | - `3284434: [pytango][doc] few ERROR during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284434&group_id=57612&atid=484769>`_ |
+| | - `3284435: [pytango][doc] few warning during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284435&group_id=57612&atid=484769>`_ |
+| | - `3284440: [pytango][spock] the profile can't be installed <https://sourceforge.net/tracker/?func=detail&aid=3284440&group_id=57612&atid=484769>`_ |
+| | - `3285185: PyTango Device Server does not load Class Properties values <https://sourceforge.net/tracker/?func=detail&aid=3285185&group_id=57612&atid=484769>`_ |
+| | - `3286055: PyTango 7.1.x DS using Tango C++ 7.2.x seg faults on exit <https://sourceforge.net/tracker/?func=detail&aid=3286055&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.4 | Features: |
+| | - from sourceforge: |
+| | - `3274309: Generic Callback for events <https://sourceforge.net/tracker/?func=detail&aid=3274309&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `3011775: Seg Faults due to removed dynamic attributes <https://sourceforge.net/tracker/?func=detail&aid=3011775&group_id=57612&atid=484769>`_ |
+| | - `3105169: PyTango 7.1.3 does not compile with Tango 7.2.X <https://sourceforge.net/tracker/?func=detail&aid=3105169&group_id=57612&atid=484769>`_ |
+| | - `3107243: spock profile does not work with python 2.5 <https://sourceforge.net/tracker/?func=detail&aid=3107243&group_id=57612&atid=484769>`_ |
+| | - `3124427: PyTango.WAttribute.set_max_value() changes min value <https://sourceforge.net/tracker/?func=detail&aid=3124427&group_id=57612&atid=484769>`_ |
+| | - `3170399: Missing documentation about is_<attr>_allowed method <https://sourceforge.net/tracker/?func=detail&aid=3170399&group_id=57612&atid=484769>`_ |
+| | - `3189082: Missing get_properties() for Attribute class <https://sourceforge.net/tracker/?func=detail&aid=3189082&group_id=57612&atid=484769>`_ |
+| | - `3196068: delete_device() not called after server_admin.Kill() <https://sourceforge.net/tracker/?func=detail&aid=3196068&group_id=57612&atid=484769>`_ |
+| | - `3257286: Binding crashes when reading a WRITE string attribute <https://sourceforge.net/tracker/?func=detail&aid=3257286&group_id=57612&atid=484769>`_ |
+| | - `3267628: DP.read_attribute(, extract=List/tuple) write value is wrong <https://sourceforge.net/tracker/?func=detail&aid=3267628&group_id=57612&atid=484769>`_ |
+| | - `3274262: Database.is_multi_tango_host missing <https://sourceforge.net/tracker/?func=detail&aid=3274262&group_id=57612&atid=484769>`_ |
+| | - `3274319: EncodedAttribute is missing in PyTango (<= 7.1.3) <https://sourceforge.net/tracker/?func=detail&aid=3274319&group_id=57612&atid=484769>`_ |
+| | - `3277269: read_attribute(DevEncoded) is not numpy as expected <https://sourceforge.net/tracker/?func=detail&aid=3277269&group_id=57612&atid=484769>`_ |
+| | - `3278946: DeviceAttribute copy constructor is not working <https://sourceforge.net/tracker/?func=detail&aid=3278946&group_id=57612&atid=484769>`_ |
+| | |
+| | Documentation: |
+| | - Added :ref:`utilities` chapter |
+| | - Added :ref:`encoded` chapter |
+| | - Improved :ref:`server` chapter |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.3 | Features: |
+| | - tango logging with print statement |
+| | - tango logging with decorators |
+| | - from sourceforge: |
+| | - `3060380: ApiUtil should be exported to PyTango <https://sourceforge.net/tracker/?func=detail&aid=3060380&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - added licence header to all source code files |
+| | - spock didn't work without TANGO_HOST env. variable (it didn't recognize |
+| | tangorc) |
+| | - spock should give a proper message if it tries to be initialized outside |
+| | ipython |
+| | - from sourceforge: |
+| | - `3048798: licence issue GPL != LGPL <https://sourceforge.net/tracker/?func=detail&aid=3048798&group_id=57612&atid=484769>`_ |
+| | - `3073378: DeviceImpl.signal_handler raising exception crashes DS <https://sourceforge.net/tracker/?func=detail&aid=3073378&group_id=57612&atid=484769>`_ |
+| | - `3088031: Python DS unable to read DevVarBooleanArray property <https://sourceforge.net/tracker/?func=detail&aid=3088031&group_id=57612&atid=484769>`_ |
+| | - `3102776: PyTango 7.1.2 does not work with python 2.4 & boost 1.33.0 <https://sourceforge.net/tracker/?func=detail&aid=3102776&group_id=57612&atid=484769>`_ |
+| | - `3102778: Fix compilation warnings in linux <https://sourceforge.net/tracker/?func=detail&aid=3102778&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.2 | Features: |
+| | - from sourceforge: |
+| | - `2995964: Dynamic device creation <https://sourceforge.net/tracker/?func=detail&aid=2995964&group_id=57612&atid=484772>`_ |
+| | - `3010399: The DeviceClass.get_device_list that exists in C++ is missing <https://sourceforge.net/tracker/?func=detail&aid=3010399&group_id=57612&atid=484772>`_ |
+| | - `3023686: Missing DeviceProxy.<attribute name> <https://sourceforge.net/tracker/?func=detail&aid=3023686&group_id=57612&atid=484772>`_ |
+| | - `3025396: DeviceImpl is missing some CORBA methods <https://sourceforge.net/tracker/?func=detail&aid=3025396&group_id=57612&atid=484772>`_ |
+| | - `3032005: IPython extension for PyTango <https://sourceforge.net/tracker/?func=detail&aid=3032005&group_id=57612&atid=484772>`_ |
+| | - `3033476: Make client objects pickable <https://sourceforge.net/tracker/?func=detail&aid=3033476&group_id=57612&atid=484772>`_ |
+| | - `3039902: PyTango.Util.add_class would be useful <https://sourceforge.net/tracker/?func=detail&aid=3039902&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2975940: DS command with DevVarCharArray return type fails <https://sourceforge.net/tracker/?func=detail&aid=2975940&group_id=57612&atid=484769>`_ |
+| | - `3000467: DeviceProxy.unlock is LOCKING instead of unlocking! <https://sourceforge.net/tracker/?func=detail&aid=3000467&group_id=57612&atid=484769>`_ |
+| | - `3010395: Util.get_device_* methods don't work <https://sourceforge.net/tracker/?func=detail&aid=3010395&group_id=57612&atid=484769>`_ |
+| | - `3010425: Database.dev_name does not work <https://sourceforge.net/tracker/?func=detail&aid=3010425&group_id=57612&atid=484769>`_ |
+| | - `3016949: command_inout_asynch callback does not work <https://sourceforge.net/tracker/?func=detail&aid=3016949&group_id=57612&atid=484769>`_ |
+| | - `3020300: PyTango does not compile with gcc 4.1.x <https://sourceforge.net/tracker/?func=detail&aid=3020300&group_id=57612&atid=484769>`_ |
+| | - `3030399: Database put(delete)_attribute_alias generates segfault <https://sourceforge.net/tracker/?func=detail&aid=3030399&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.1 | Features: |
+| | - Improved setup script |
+| | - Interfaced with PyPI |
+| | - Cleaned build script warnings due to unclean python C++ macro definitions |
+| | - from sourceforge: |
+| | - `2985993: PyTango numpy command support <https://sourceforge.net/tracker/?func=detail&aid=2985993&group_id=57612&atid=484772>`_ |
+| | - `2971217: PyTango.GroupAttrReplyList slicing <https://sourceforge.net/tracker/?func=detail&aid=2971217&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2983299: Database.put_property() deletes the property <https://sourceforge.net/tracker/?func=detail&aid=2983299&group_id=57612&atid=484769>`_ |
+| | - `2953689: can not write_attribute scalar/spectrum/image <https://sourceforge.net/tracker/?func=detail&aid=2953689&group_id=57612&atid=484769>`_ |
+| | - `2953030: PyTango doc installation <https://sourceforge.net/tracker/?func=detail&aid=2953030&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.0 | Features: |
+| | - from sourceforge: |
+| | - `2908176: read_*, write_* and is_*_allowed() methods can now be defined <https://sourceforge.net/tracker/?func=detail&aid=2908176&group_id=57612&atid=484772>`_ |
+| | - `2941036: TimeVal conversion to time and datetime <https://sourceforge.net/tracker/?func=detail&aid=2941036&group_id=57612&atid=484772>`_ |
+| | - added str representation on Attr, Attribute, DeviceImpl and DeviceClass |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2903755: get_device_properties() bug reading DevString properties <https://sourceforge.net/tracker/?func=detail&aid=2903755group_id=57612&atid=484769>`_ |
+| | - `2909927: PyTango.Group.read_attribute() return values <https://sourceforge.net/tracker/?func=detail&aid=2909927&group_id=57612&atid=484769>`_ |
+| | - `2914194: DevEncoded does not work <https://sourceforge.net/tracker/?func=detail&aid=2914194&group_id=57612&atid=484769>`_ |
+| | - `2916397: PyTango.DeviceAttribute copy constructor does not work <https://sourceforge.net/tracker/?func=detail&aid=2916397&group_id=57612&atid=484769>`_ |
+| | - `2936173: PyTango.Group.read_attributes() fails <https://sourceforge.net/tracker/?func=detail&aid=2936173&group_id=57612&atid=484769>`_ |
+| | - `2949099: Missing PyTango.Except.print_error_stack <https://sourceforge.net/tracker/?func=detail&aid=2949099&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.0rc1 | Features: |
+| | - v = image_attribute.get_write_value() returns square sequences (arrays of |
+| | arrays, or numpy objects) now instead of flat lists. Also for spectrum |
+| | attributes a numpy is returned by default now instead. |
+| | - image_attribute.set_value(v) accepts numpy arrays now or square sequences |
+| | instead of just flat lists. So, dim_x and dim_y are useless now. Also the |
+| | numpy path is faster. |
+| | - new enum AttrSerialModel |
+| | - Attribute new methods: set(get)_attr_serial_model, set_change_event, |
+| | set_archive_event, is_change_event, is_check_change_event, |
+| | is_archive_criteria, is_check_archive_criteria, remove_configuration |
+| | - added support for numpy scalars in tango operations like write_attribute |
+| | (ex: now a DEV_LONG attribute can receive a numpy.int32 argument in a |
+| | write_attribute method call) |
+| | |
+| | Bug fixes: |
+| | - DeviceImpl.set_value for scalar attributes |
+| | - DeviceImpl.push_***_event |
+| | - server commands with DevVar***StringArray as parameter or as return type |
+| | - in windows,a bug in PyTango.Util prevented servers from starting up |
+| | - DeviceImpl.get_device_properties for string properties assigns only first |
+| | character of string to object member instead of entire string |
+| | - added missing methods to Util |
+| | - exported SubDevDiag class |
+| | - error in read/events of attributes of type DevBoolean READ_WRITE |
+| | - error in automatic unsubscribe events of DeviceProxy when the object |
+| | disapears (happens only on some compilers with some optimization flags) |
+| | - fix possible bug when comparing attribute names in DeviceProxy |
+| | - pretty print of DevFailed -> fix deprecation warning in python 2.6 |
+| | - device class properties where not properly fetched when there is no |
+| | property value defined |
+| | - memory leak when converting DevFailed exceptions from C++ to python |
+| | - python device server file without extension does not start |
+| | |
+| | Documentation: |
+| | - Improved FAQ |
+| | - Improved compilation chapter |
+| | - Improved migration information |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/setup.py b/setup.py
index 27b7809..f9995de 100644
--- a/setup.py
+++ b/setup.py
@@ -1,21 +1,21 @@
################################################################################
##
## This file is part of PyTango, a python binding for Tango
-##
+##
## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
+##
## PyTango is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
-##
+##
## PyTango is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
-##
+##
## You should have received a copy of the GNU Lesser General Public License
## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
##
@@ -83,16 +83,17 @@ def uniquify(seq):
return no_dups
def get_c_numpy():
- NUMPY_ROOT = os.environ.get('NUMPY_ROOT')
- if NUMPY_ROOT is not None:
- d = os.path.join(NUMPY_ROOT, 'include')
- if os.path.isdir(d):
- return d
if numpy is None:
- return None
- d = os.path.join(numpy.__path__[0], 'core', 'include')
- if os.path.isdir(d):
- return d
+ return
+ else:
+ get_include = getattr(numpy, "get_include", None)
+ if get_include is None:
+ get_include = getattr(numpy, "get_numpy_include", None)
+ if get_include is None:
+ return
+ inc = get_include()
+ if os.path.isdir(inc):
+ return inc
def has_c_numpy():
return get_c_numpy() is not None
@@ -104,9 +105,9 @@ def has_numpy(with_src=True):
return ret
def get_script_files():
-
- FILTER_OUT = (), # "winpostinstall.py",
-
+
+ FILTER_OUT = (), # "winpostinstall.py",
+
scripts_dir = abspath('scripts')
scripts = []
items = os.listdir(scripts_dir)
@@ -129,14 +130,14 @@ def get_script_files():
return scripts
class build(dftbuild):
-
+
user_options = dftbuild.user_options + \
[('without-ipython', None, "Tango IPython extension"),
('strip-lib', None, "strips the shared library of debugging symbols (Unix like systems only)"),
('no-doc', None, "do not build documentation") ]
-
+
boolean_options = dftbuild.boolean_options + ['without-ipython', 'strip-lib', 'no-doc']
-
+
def initialize_options (self):
dftbuild.initialize_options(self)
self.without_ipython = None
@@ -145,21 +146,21 @@ class build(dftbuild):
def finalize_options(self):
dftbuild.finalize_options(self)
-
+
def run(self):
if numpy is None:
self.warn('NOT using numpy: it is not available')
elif get_c_numpy() is None:
self.warn("NOT using numpy: numpy available but C source is not")
-
+
if IPython and not self.without_ipython:
if V(IPython.__version__) > V('0.10'):
self.distribution.py_modules.append('IPython.config.profile.tango.ipython_config')
else:
self.distribution.py_modules.append('IPython.Extensions.ipy_profile_tango')
-
+
dftbuild.run(self)
-
+
if self.strip_lib:
if os.name == 'posix':
has_objcopy = os.system("type objcopy") == 0
@@ -186,15 +187,15 @@ class build(dftbuild):
return False
if V(sphinx.__version__) <= V("0.6.5"):
print("Documentation will not be generated: sphinx version (%s) too low. Needs 0.6.6" % sphinx.__version__)
- return False
+ return False
setup_dir = os.path.dirname(os.path.abspath(__file__))
return os.path.isdir(os.path.join(setup_dir, 'doc'))
- sub_commands = dftbuild.sub_commands + [('build_doc', has_doc),]
+ sub_commands = dftbuild.sub_commands + [('build_doc', has_doc), ]
-class build_ext(dftbuild_ext):
-
+class build_ext(dftbuild_ext):
+
def build_extensions(self):
self.use_cpp_0x = False
if isinstance(self.compiler, UnixCCompiler):
@@ -202,11 +203,13 @@ class build_ext(dftbuild_ext):
while '-Wstrict-prototypes' in compiler_pars:
del compiler_pars[compiler_pars.index('-Wstrict-prototypes')]
#self.compiler.compiler_so = " ".join(compiler_pars)
-
+
# mimic tango check to activate C++0x extension
import subprocess
compiler = self.compiler.compiler
- pipe = subprocess.Popen(compiler + ["-dumpversion"], stdout=subprocess.PIPE).stdout
+ proc = subprocess.Popen(compiler + ["-dumpversion"], stdout=subprocess.PIPE)
+ pipe = proc.stdout
+ proc.wait()
gcc_ver = pipe.readlines()[0].decode().strip()
if V(gcc_ver) >= V("4.3.3"):
self.use_cpp_0x = True
@@ -220,12 +223,12 @@ class build_ext(dftbuild_ext):
if sphinx:
class build_doc(BuildDoc):
-
+
def run(self):
# make sure the python path is pointing to the newly built
# code so that the documentation is built on this and not a
# previously installed version
-
+
build = self.get_finalized_command('build')
sys.path.insert(0, os.path.abspath(build.build_lib))
sphinx.setup_command.BuildDoc.run(self)
@@ -236,14 +239,14 @@ class install_html(Command):
user_options = [
('install-dir=', 'd', 'base directory for installing HTML documentation files')]
-
+
def initialize_options(self):
self.install_dir = None
-
+
def finalize_options(self):
self.set_undefined_options('install',
('install_html', 'install_dir'))
-
+
def run(self):
build_doc = self.get_finalized_command('build_doc')
src_html_dir = abspath(build_doc.build_dir, 'html')
@@ -251,9 +254,9 @@ class install_html(Command):
class install(dftinstall):
-
+
user_options = dftinstall.user_options + \
- [('install-html=', None, "installation directory for HTML documentation"),]
+ [('install-html=', None, "installation directory for HTML documentation"), ]
def initialize_options(self):
dftinstall.initialize_options(self)
@@ -264,7 +267,7 @@ class install(dftinstall):
# We do a hack here. We cannot trust the 'install_base' value because it
# is not always the final target. For example, in unix, the install_base
# is '/usr' and all other install_* are directly relative to it. However,
- # in unix-local (like ubuntu) install_base is still '/usr' but, for
+ # in unix-local (like ubuntu) install_base is still '/usr' but, for
# example, install_data, is '$install_base/local' which breaks everything.
#
# The hack consists in using install_data instead of install_base since
@@ -272,10 +275,10 @@ class install(dftinstall):
# different systems.
if self.install_html is None:
self.install_html = os.path.join(self.install_data, 'share', 'doc', 'PyTango', 'html')
-
+
def has_html(self):
return sphinx is not None
-
+
sub_commands = list(dftinstall.sub_commands)
sub_commands.append(('install_html', has_html))
@@ -284,12 +287,12 @@ def main():
ZMQ_ROOT = LOG4TANGO_ROOT = BOOST_ROOT = OMNI_ROOT = TANGO_ROOT = '/usr'
TANGO_ROOT = os.environ.get('TANGO_ROOT', TANGO_ROOT)
- OMNI_ROOT = os.environ.get('OMNI_ROOT', OMNI_ROOT)
+ OMNI_ROOT = os.environ.get('OMNI_ROOT', OMNI_ROOT)
BOOST_ROOT = os.environ.get('BOOST_ROOT', BOOST_ROOT)
LOG4TANGO_ROOT = os.environ.get('LOG4TANGO_ROOT', LOG4TANGO_ROOT)
ZMQ_ROOT = os.environ.get('ZMQ_ROOT', ZMQ_ROOT)
numpy_c_include = get_c_numpy()
-
+
Release = get_release_info()
author = Release.authors['Coutinho']
@@ -317,9 +320,9 @@ def main():
package_data = {
'PyTango' : [],
}
-
+
scripts = get_script_files()
-
+
data_files = []
classifiers = [
@@ -380,26 +383,28 @@ def main():
macros = []
- if not has_numpy():
- macros.append( ('DISABLE_PYTANGO_NUMPY', None) )
+ if has_numpy():
+ macros.append(('PYTANGO_NUMPY_VERSION', numpy.__version__))
+ else:
+ macros.append(('DISABLE_PYTANGO_NUMPY', None))
library_dirs = []
- for f in (TANGO_ROOT,BOOST_ROOT,LOG4TANGO_ROOT,ZMQ_ROOT):
+ for f in (TANGO_ROOT, BOOST_ROOT, LOG4TANGO_ROOT, ZMQ_ROOT):
is64 = 8 * struct.calcsize("P") == 64
- d = os.path.join(f,'lib')
+ d = os.path.join(f, 'lib')
if is64:
- d = os.path.join(f,'lib64')
- try:
- if not os.stat(d): raise Exception('%s_doesnt_exist'%d)
- except: d = os.path.join(f,'lib')
+ d = os.path.join(f, 'lib64')
+ try:
+ if not os.stat(d): raise Exception('%s_doesnt_exist' % d)
+ except: d = os.path.join(f, 'lib')
library_dirs.append(d)
-
+
# library_dirs = [
# os.path.join(TANGO_ROOT, 'lib'),
# os.path.join(BOOST_ROOT, 'lib'),
# #os.path.join(LOG4TANGO_ROOT, 'lib'),
# os.path.join(ZMQ_ROOT, 'lib'),
-# ]
+# ]
if os.name == 'nt':
include_dirs += [ BOOST_ROOT ]
@@ -427,12 +432,12 @@ def main():
]
library_dirs += [ os.path.join(OMNI_ROOT, 'lib', 'x86_win32') ]
-
+
extra_compile_args += [
'/EHsc',
- '/wd4005', # supress redefinition of HAVE_STRFTIME between python and omniORB
- '/wd4996', # same as /D_SCL_SECURE_NO_WARNINGS
- '/wd4250', # supress base class inheritance warning
+ '/wd4005', # supress redefinition of HAVE_STRFTIME between python and omniORB
+ '/wd4996', # same as /D_SCL_SECURE_NO_WARNINGS
+ '/wd4250', # supress base class inheritance warning
]
extra_link_args += []
@@ -451,9 +456,9 @@ def main():
if please_debug:
extra_compile_args += ['-g', '-O0']
extra_link_args += ['-g' , '-O0']
-
+
include_dirs += [ os.path.join(BOOST_ROOT, 'include') ]
-
+
libraries += [
'pthread',
'rt',
@@ -463,9 +468,9 @@ def main():
'omnithread',
'COS4',
]
-
+
boost_library_name = 'boost_python'
-
+
if 'linux' in sys.platform:
dist_name = platform.linux_distribution()[0].lower()
debian_based = 'debian' in dist_name or 'ubuntu' in dist_name
@@ -480,8 +485,8 @@ def main():
omni_lib = os.path.join(OMNI_ROOT, 'lib')
if is64:
omni_lib = os.path.join(OMNI_ROOT, 'lib64')
- try:
- if not os.stat(d): raise Exception('%s_doesnt_exist'%d)
+ try:
+ if not os.stat(d): raise Exception('%s_doesnt_exist' % d)
except:
omni_lib = os.path.join(OMNI_ROOT, 'lib')
library_dirs += [ omni_lib ]
@@ -511,56 +516,56 @@ def main():
src_dir = abspath('src', 'boost', 'cpp')
client_dir = src_dir
server_dir = os.path.join(src_dir, 'server')
- _clientfiles = [ os.path.join(client_dir,fname) for fname in os.listdir(client_dir) if fname.endswith('.cpp') ]
+ _clientfiles = [ os.path.join(client_dir, fname) for fname in os.listdir(client_dir) if fname.endswith('.cpp') ]
_clientfiles.sort()
- _serverfiles = [ os.path.join(server_dir,fname) for fname in os.listdir(server_dir) if fname.endswith('.cpp') ]
+ _serverfiles = [ os.path.join(server_dir, fname) for fname in os.listdir(server_dir) if fname.endswith('.cpp') ]
_serverfiles.sort()
_cppfiles = _clientfiles + _serverfiles
-
+
_pytango = Extension(
- name = '_PyTango',
- sources = _cppfiles,
- include_dirs = include_dirs,
- library_dirs = library_dirs,
- libraries = libraries,
- define_macros = macros,
- extra_compile_args = extra_compile_args,
- extra_link_args = extra_link_args,
- language = 'c++',
- depends = [])
+ name='_PyTango',
+ sources=_cppfiles,
+ include_dirs=include_dirs,
+ library_dirs=library_dirs,
+ libraries=libraries,
+ define_macros=macros,
+ extra_compile_args=extra_compile_args,
+ extra_link_args=extra_link_args,
+ language='c++',
+ depends=[])
cmdclass = {'build' : build,
'build_ext' : build_ext,
'install_html' : install_html,
'install' : install }
-
+
if sphinx:
cmdclass['build_doc'] = build_doc
dist = setup(
- name = 'PyTango',
- version = Release.version,
- description = Release.description,
- long_description = Release.long_description,
- author = author[0],
- author_email = author[1],
- url = Release.url,
- download_url = Release.download_url,
- platforms = Release.platform,
- license = Release.license,
- packages = packages,
- package_dir = { 'PyTango' : os.path.join('src', 'boost', 'python') },
- py_modules = py_modules,
- classifiers = classifiers,
- package_data = package_data,
- data_files = data_files,
- scripts = scripts,
- provides = provides,
- keywords = Release.keywords,
- requires = requires,
- ext_package = 'PyTango',
- ext_modules = [_pytango],
- cmdclass = cmdclass)
+ name='PyTango',
+ version=Release.version,
+ description=Release.description,
+ long_description=Release.long_description,
+ author=author[0],
+ author_email=author[1],
+ url=Release.url,
+ download_url=Release.download_url,
+ platforms=Release.platform,
+ license=Release.license,
+ packages=packages,
+ package_dir={ 'PyTango' : os.path.join('src', 'boost', 'python') },
+ py_modules=py_modules,
+ classifiers=classifiers,
+ package_data=package_data,
+ data_files=data_files,
+ scripts=scripts,
+ provides=provides,
+ keywords=Release.keywords,
+ requires=requires,
+ ext_package='PyTango',
+ ext_modules=[_pytango],
+ cmdclass=cmdclass)
if __name__ == "__main__":
main()
diff --git a/src/boost/cpp/base_types.cpp b/src/boost/cpp/base_types.cpp
index 66e05b4..1869972 100644
--- a/src/boost/cpp/base_types.cpp
+++ b/src/boost/cpp/base_types.cpp
@@ -357,4 +357,6 @@ void export_base_types()
export_time_val();
def("raise_asynch_exception", &raise_asynch_exception);
+
+ def("_get_tango_lib_release", &Tango::_convert_tango_lib_release);
}
diff --git a/src/boost/cpp/constants.cpp b/src/boost/cpp/constants.cpp
index d4f4a36..f50b87f 100644
--- a/src/boost/cpp/constants.cpp
+++ b/src/boost/cpp/constants.cpp
@@ -43,6 +43,25 @@ void export_constants()
consts_scope.attr("NUMPY_SUPPORT") = true;
#endif
+#ifdef PYTANGO_NUMPY_VERSION
+ consts_scope.attr("NUMPY_VERSION") = PYTANGO_NUMPY_VERSION;
+#else
+ consts_scope.attr("NUMPY_VERSION") = "0.0.0";
+#endif
+
+
+ consts_scope.attr("PY_MAJOR_VERSION") = PY_MAJOR_VERSION;
+ consts_scope.attr("PY_MINOR_VERSION") = PY_MINOR_VERSION;
+ consts_scope.attr("PY_MICRO_VERSION") = PY_MICRO_VERSION;
+ consts_scope.attr("PY_VERSION") = PY_VERSION;
+ consts_scope.attr("PY_VERSION_HEX") = PY_VERSION_HEX;
+
+ consts_scope.attr("BOOST_MAJOR_VERSION") = BOOST_VERSION / 100000;
+ consts_scope.attr("BOOST_MINOR_VERSION") = BOOST_VERSION / 100 % 1000;
+ consts_scope.attr("BOOST_PATCH_VERSION") = BOOST_VERSION % 100;
+ // missing BOOST_VERSION => do it in python
+
+
//
// From tango_const.h
//
@@ -53,8 +72,10 @@ void export_constants()
consts_scope.attr("TANGO_VERSION_MAJOR") = TANGO_VERSION_MAJOR;
consts_scope.attr("TANGO_VERSION_MINOR") = TANGO_VERSION_MINOR;
consts_scope.attr("TANGO_VERSION_PATCH") = TANGO_VERSION_PATCH;
-
+ consts_scope.attr("TANGO_VERSION") = TgLibVers;
+
consts_scope.attr("TgLibVers") = TgLibVers;
+ consts_scope.attr("TgLibVersNb") = TgLibVersNb;
consts_scope.attr("DevVersion") = DevVersion;
consts_scope.attr("DefaultMaxSeq") = DefaultMaxSeq;
consts_scope.attr("DefaultBlackBoxDepth") = DefaultBlackBoxDepth;
diff --git a/src/boost/cpp/device_proxy.cpp b/src/boost/cpp/device_proxy.cpp
index eae6b5b..82dce1e 100644
--- a/src/boost/cpp/device_proxy.cpp
+++ b/src/boost/cpp/device_proxy.cpp
@@ -424,10 +424,10 @@ void export_device_proxy()
.def("get_device_db", &Tango::DeviceProxy::get_device_db,
bopy::return_value_policy<bopy::reference_existing_object>())
- .def("status", &PyDeviceProxy::status,
+ .def("_status", &PyDeviceProxy::status,
( arg_("self") ) )
- .def("state", &PyDeviceProxy::state,
+ .def("_state", &PyDeviceProxy::state,
( arg_("self") ) )
.def("adm_name", &Tango::DeviceProxy::adm_name,
diff --git a/src/boost/python/device_proxy.py b/src/boost/python/device_proxy.py
index 82ddd08..167a37b 100644
--- a/src/boost/python/device_proxy.py
+++ b/src/boost/python/device_proxy.py
@@ -1,21 +1,21 @@
################################################################################
##
## This file is part of PyTango, a python binding for Tango
-##
+##
## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
+##
## PyTango is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
-##
+##
## PyTango is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
-##
+##
## You should have received a copy of the GNU Lesser General Public License
## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
##
@@ -43,7 +43,7 @@ from ._PyTango import StdStringVector, DbData, DbDatum, AttributeInfo, \
from .utils import is_pure_str, is_non_str_seq, is_integer, \
seq_2_StdStringVector, StdStringVector_2_seq, seq_2_DbData, DbData_2_dict
-
+
from .utils import document_method as __document_method
from .utils import get_green_mode
@@ -52,7 +52,7 @@ from .tango_green import result, submit, green
def get_device_proxy(*args, **kwargs):
"""get_device_proxy(self, dev_name, green_mode=None, wait=True, timeout=True) -> DeviceProxy
- get_device_proxy(self, dev_name, need_check_acc, green_mode=None, wait=True, timeout=True) -> DeviceProxy
+ get_device_proxy(self, dev_name, need_check_acc, green_mode=None, wait=True, timeout=None) -> DeviceProxy
Returns a new :class:`~PyTango.DeviceProxy`.
There is no difference between using this function and the direct
@@ -109,14 +109,14 @@ def get_device_proxy(*args, **kwargs):
green_mode = kwargs.get('green_mode', get_green_mode())
wait = kwargs.pop('wait', True)
timeout = kwargs.pop('timeout', None)
-
+
d = submit(green_mode, DeviceProxy, *args, **kwargs)
return result(d, green_mode, wait=wait, timeout=timeout)
class __TangoInfo(object):
"""Helper class for when DeviceProxy.info() is not available"""
-
+
def __init__(self):
self.dev_class = self.dev_type = 'Device'
self.doc_url = 'http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/'
@@ -190,7 +190,7 @@ def __DeviceProxy__getattr(self, name):
# and the ugly trait_names could be removed.
if name[:2] == "__" or name == 'trait_names':
raise AttributeError(name)
-
+
name_l = name.lower()
cmd_info = None
if not hasattr(self, '__cmd_cache'):
@@ -202,28 +202,28 @@ def __DeviceProxy__getattr(self, name):
cmd_info = self.__cmd_cache[name_l]
except:
pass
-
+
if cmd_info is not None:
d, f = cmd_info
if f is None:
- doc = "%s(%s) -> %s\n\n" % (d.cmd_name, d.in_type, d.out_type)
+ doc = "%s(%s) -> %s\n\n" % (d.cmd_name, d.in_type, d.out_type)
doc += " - in (%s): %s\n" % (d.in_type, d.in_type_desc)
doc += " - out (%s): %s\n" % (d.out_type, d.out_type_desc)
- def f(*args,**kwds): return self.command_inout(name, *args, **kwds)
+ def f(*args, **kwds): return self.command_inout(name, *args, **kwds)
f.__doc__ = doc
self.__cmd_cache[name_l] = d, f
return f
-
+
find_attr = True
if not hasattr(self, '__attr_cache') or name_l not in self.__attr_cache:
try:
self.__refresh_attr_cache()
except:
find_attr = False
-
+
if not find_attr or name_l not in self.__attr_cache:
raise AttributeError(name)
-
+
return self.read_attribute(name).value
def __DeviceProxy__setattr(self, name, value):
@@ -232,7 +232,7 @@ def __DeviceProxy__setattr(self, name, value):
self.__refresh_attr_cache()
except:
return super(DeviceProxy, self).__setattr__(name, value)
-
+
if name.lower() in self.__attr_cache:
self.write_attribute(name, value)
else:
@@ -773,7 +773,7 @@ def __DeviceProxy__get_event_map(self):
self.__dict__['_subscribed_events'] = dict()
return self._subscribed_events
-def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesize, filters=[], stateless=False, extract_as=ExtractAs.Numpy):
+def __DeviceProxy__subscribe_event (self, attr_name, event_type, cb_or_queuesize, filters=[], stateless=False, extract_as=ExtractAs.Numpy):
"""
subscribe_event(self, attr_name, event, callback, filters=[], stateless=False, extract_as=Numpy) -> int
@@ -837,7 +837,7 @@ def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesiz
All other parameters are similar to the descriptions given in the
other subscribe_event() version.
"""
-
+
if isinstance(cb_or_queuesize, collections.Callable):
cb = __CallBackPushEvent()
cb.push_event = cb_or_queuesize
@@ -845,7 +845,7 @@ def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesiz
cb = __CallBackPushEvent()
cb.push_event = cb_or_queuesize.push_event
elif is_integer(cb_or_queuesize):
- cb = cb_or_queuesize # queuesize
+ cb = cb_or_queuesize # queuesize
else:
raise TypeError("Parameter cb_or_queuesize should be a number, a" + \
" callable object or an object with a 'push_event' method.")
@@ -986,6 +986,12 @@ def __DeviceProxy__write_attributes(self, *args, **kwargs):
def __DeviceProxy__ping(self, *args, **kwargs):
return self._ping(*args, **kwargs)
+def __DeviceProxy__state(self, *args, **kwargs):
+ return self._state(*args, **kwargs)
+
+def __DeviceProxy__status(self, *args, **kwargs):
+ return self._status(*args, **kwargs)
+
def __init_DeviceProxy():
DeviceProxy.__init_orig__ = DeviceProxy.__init__
DeviceProxy.__init__ = __DeviceProxy__init__
@@ -998,7 +1004,7 @@ def __init_DeviceProxy():
DeviceProxy.__getitem__ = __DeviceProxy__getitem
DeviceProxy.__setitem__ = __DeviceProxy__setitem
DeviceProxy.__contains__ = __DeviceProxy__contains
-
+
DeviceProxy._getAttributeNames = __DeviceProxy__getAttributeNames
DeviceProxy.__refresh_cmd_cache = __DeviceProxy__refresh_cmd_cache
@@ -1012,11 +1018,14 @@ def __init_DeviceProxy():
DeviceProxy.write_attributes_asynch = __DeviceProxy__write_attributes_asynch
DeviceProxy.write_attribute_asynch = __DeviceProxy__write_attribute_asynch
DeviceProxy.write_attribute_reply = DeviceProxy.write_attributes_reply
- DeviceProxy.write_read_attribute = green(__DeviceProxy__write_read_attribute)
DeviceProxy.write_attribute = green(__DeviceProxy__write_attribute)
DeviceProxy.write_attributes = green(__DeviceProxy__write_attributes)
+ DeviceProxy.write_read_attribute = green(__DeviceProxy__write_read_attribute)
- DeviceProxy.ping = green(__DeviceProxy__ping)
+ DeviceProxy.ping = green(__DeviceProxy__ping)
+
+ DeviceProxy.state = green(__DeviceProxy__state)
+ DeviceProxy.status = green(__DeviceProxy__status)
DeviceProxy.get_property = __DeviceProxy__get_property
DeviceProxy.put_property = __DeviceProxy__put_property
@@ -1028,16 +1037,16 @@ def __init_DeviceProxy():
DeviceProxy.__get_event_map = __DeviceProxy__get_event_map
DeviceProxy.__get_event_map_lock = __DeviceProxy__get_event_map_lock
- DeviceProxy.subscribe_event = __DeviceProxy__subscribe_event
- DeviceProxy.unsubscribe_event = __DeviceProxy__unsubscribe_event
+ DeviceProxy.subscribe_event = green(__DeviceProxy__subscribe_event)
+ DeviceProxy.unsubscribe_event = green(__DeviceProxy__unsubscribe_event)
DeviceProxy.__unsubscribe_event_all = __DeviceProxy__unsubscribe_event_all
DeviceProxy.get_events = __DeviceProxy__get_events
DeviceProxy.__str__ = __DeviceProxy__str
DeviceProxy.__repr__ = __DeviceProxy__str
-
+
DeviceProxy._get_info_ = __DeviceProxy___get_info_
-
+
def __doc_DeviceProxy():
def document_method(method_name, desc, append=True):
return __document_method(DeviceProxy, method_name, desc, append)
@@ -1120,7 +1129,7 @@ def __doc_DeviceProxy():
All DeviceInfo fields are strings except for the server_version
which is an integer"
- """ )
+ """)
document_method("get_device_db", """
get_device_db(self) -> Database
@@ -1131,7 +1140,7 @@ def __doc_DeviceProxy():
Return : (Database) object
New in PyTango 7.0.0
- """ )
+ """)
document_method("status", """
status(self) -> str
@@ -1140,7 +1149,7 @@ def __doc_DeviceProxy():
Parameters : None
Return : (str) describing the device status
- """ )
+ """)
document_method("state", """
state(self) -> DevState
@@ -1152,7 +1161,7 @@ def __doc_DeviceProxy():
Example :
dev_st = dev.state()
if dev_st == DevState.ON : ...
- """ )
+ """)
document_method("adm_name", """
adm_name(self) -> str
@@ -1162,7 +1171,7 @@ def __doc_DeviceProxy():
server, e.g restart it
New in PyTango 3.0.4
- """ )
+ """)
document_method("description", """
description(self) -> str
@@ -1171,13 +1180,13 @@ def __doc_DeviceProxy():
Parameters : None
Return : (str) describing the device
- """ )
+ """)
document_method("name", """
name(self) -> str
Return the device name from the device itself.
- """ )
+ """)
document_method("alias", """
alias(self) -> str
@@ -1186,7 +1195,7 @@ def __doc_DeviceProxy():
Otherwise, throws exception.
Return : (str) device alias
- """ )
+ """)
document_method("get_tango_lib_version", """
get_tango_lib_version(self) -> int
@@ -1198,17 +1207,17 @@ def __doc_DeviceProxy():
Possible return value are: 100,200,500,520,700,800,810,...
New in PyTango 8.1.0
- """ )
-
+ """)
+
document_method("ping", """
ping(self) -> int
A method which sends a ping to the device
Parameters : None
- Return : (int) time elapsed in milliseconds
+ Return : (int) time elapsed in microseconds
Throws : exception if device is not alive
- """ )
+ """)
document_method("black_box", """
black_box(self, n) -> sequence<str>
@@ -1222,7 +1231,7 @@ def __doc_DeviceProxy():
was executed
Example :
print(black_box(4))
- """ )
+ """)
#-------------------------------------
# Device methods
@@ -1248,7 +1257,7 @@ def __doc_DeviceProxy():
print(com_info.disp_level)
See CommandInfo documentation string form more detail
- """ )
+ """)
document_method("command_list_query", """
command_list_query(self) -> sequence<CommandInfo>
@@ -1257,7 +1266,7 @@ def __doc_DeviceProxy():
Parameters : None
Return : (CommandInfoList) Sequence of CommandInfo objects
- """ )
+ """)
document_method("import_info", """
import_info(self) -> DbDevImportInfo
@@ -1275,7 +1284,7 @@ def __doc_DeviceProxy():
All DbDevImportInfo fields are strings except for exported which
is an integer"
- """ )
+ """)
#-------------------------------------
# Property methods
@@ -1298,7 +1307,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
# get_attribute_config -> in code
# get_attribute_config_ex -> in code
@@ -1315,7 +1324,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
document_method("attribute_list_query", """
attribute_list_query(self) -> sequence<AttributeInfo>
@@ -1329,7 +1338,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
document_method("attribute_list_query_ex", """
attribute_list_query_ex(self) -> sequence<AttributeInfoEx>
@@ -1343,7 +1352,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
# set_attribute_config -> in code
@@ -1391,7 +1400,7 @@ def __doc_DeviceProxy():
*green_mode* parameter.
*wait* parameter.
*timeout* parameter.
- """ )
+ """)
document_method("read_attributes", """
read_attributes(self, attr_names, extract_as=ExtractAs.Numpy, green_mode=None, wait=True, timeout=None) -> sequence<DeviceAttribute>
@@ -1422,7 +1431,7 @@ def __doc_DeviceProxy():
*green_mode* parameter.
*wait* parameter.
*timeout* parameter.
- """ )
+ """)
document_method("write_attribute", """
write_attribute(self, attr_name, value, green_mode=None, wait=True, timeout=None) -> None
@@ -1453,7 +1462,7 @@ def __doc_DeviceProxy():
*green_mode* parameter.
*wait* parameter.
*timeout* parameter.
- """ )
+ """)
document_method("write_attributes", """
write_attributes(self, name_val, green_mode=None, wait=True, timeout=None) -> None
@@ -1482,7 +1491,7 @@ def __doc_DeviceProxy():
*green_mode* parameter.
*wait* parameter.
*timeout* parameter.
- """ )
+ """)
document_method("write_read_attribute", """
write_read_attribute(self, attr_name, value, extract_as=ExtractAs.Numpy, green_mode=None, wait=True, timeout=None) -> DeviceAttribute
@@ -1505,7 +1514,7 @@ def __doc_DeviceProxy():
*green_mode* parameter.
*wait* parameter.
*timeout* parameter.
- """ )
+ """)
#-------------------------------------
# History methods
@@ -1523,7 +1532,7 @@ def __doc_DeviceProxy():
Throws : NonSupportedFeature, ConnectionFailed,
CommunicationFailed, DevFailed from device
- """ )
+ """)
document_method("attribute_history", """
attribute_history(self, attr_name, depth, extract_as=ExtractAs.Numpy) -> sequence<DeviceAttributeHistory>
@@ -1540,7 +1549,7 @@ def __doc_DeviceProxy():
Throws : NonSupportedFeature, ConnectionFailed,
CommunicationFailed, DevFailed from device
- """ )
+ """)
#-------------------------------------
# Polling administration methods
@@ -1562,7 +1571,7 @@ def __doc_DeviceProxy():
- time since data in the ring buffer has not been updated
- delta time between the last records in the ring buffer
- exception parameters in case of the last execution failed
- """ )
+ """)
document_method("poll_command", """
poll_command(self, cmd_name, period) -> None
@@ -1573,7 +1582,7 @@ def __doc_DeviceProxy():
- cmd_name : (str) command name
- period : (int) polling period in milliseconds
Return : None
- """ )
+ """)
document_method("poll_attribute", """
poll_attribute(self, attr_name, period) -> None
@@ -1584,7 +1593,7 @@ def __doc_DeviceProxy():
- attr_name : (str) attribute name
- period : (int) polling period in milliseconds
Return : None
- """ )
+ """)
document_method("get_command_poll_period", """
get_command_poll_period(self, cmd_name) -> int
@@ -1594,7 +1603,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : polling period in milliseconds
- """ )
+ """)
document_method("get_attribute_poll_period", """
get_attribute_poll_period(self, attr_name) -> int
@@ -1604,7 +1613,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : polling period in milliseconds
- """ )
+ """)
document_method("is_command_polled", """
is_command_polled(self, cmd_name) -> bool
@@ -1614,7 +1623,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : boolean value
- """ )
+ """)
document_method("is_attribute_polled", """
is_attribute_polled(self, attr_name) -> bool
@@ -1624,7 +1633,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : boolean value
- """ )
+ """)
document_method("stop_poll_command", """
stop_poll_command(self, cmd_name) -> None
@@ -1634,7 +1643,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : None
- """ )
+ """)
document_method("stop_poll_attribute", """
stop_poll_attribute(self, attr_name) -> None
@@ -1644,7 +1653,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : None
- """ )
+ """)
#-------------------------------------
# Asynchronous methods
@@ -1695,7 +1704,7 @@ def __doc_DeviceProxy():
CommunicationFailed, DevFailed from device
New in PyTango 7.0.0
- """ )
+ """)
document_method("pending_asynch_call", """
pending_asynch_call(self) -> int
@@ -1703,7 +1712,7 @@ def __doc_DeviceProxy():
Return number of device asynchronous pending requests"
New in PyTango 7.0.0
- """ )
+ """)
# write_attributes_asynch -> in code
@@ -1744,8 +1753,8 @@ def __doc_DeviceProxy():
Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
New in PyTango 7.0.0
- """ )
-
+ """)
+
document_method("write_attribute_reply", """
write_attribute_reply(self, id) -> None
@@ -1783,7 +1792,7 @@ def __doc_DeviceProxy():
Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Logging administration methods
@@ -1812,7 +1821,7 @@ def __doc_DeviceProxy():
Throws : DevFailed from device
New in PyTango 7.0.0
- """ )
+ """)
document_method("remove_logging_target", """
remove_logging_target(self, target_type_target_name) -> None
@@ -1836,7 +1845,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_logging_target", """
get_logging_target(self) -> sequence<str>
@@ -1850,7 +1859,7 @@ def __doc_DeviceProxy():
Return : a squence<str> with the logging targets
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_logging_level", """
get_logging_level(self) -> int
@@ -1867,7 +1876,7 @@ def __doc_DeviceProxy():
Return : (int) representing the current logging level
New in PyTango 7.0.0
- """ )
+ """)
document_method("set_logging_level", """
set_logging_level(self, (int)level) -> None
@@ -1885,7 +1894,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Event methods
@@ -1911,7 +1920,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_last_event_date", """
get_last_event_date(self, event_id) -> TimeVal
@@ -1930,7 +1939,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
document_method("is_event_queue_empty", """
is_event_queue_empty(self, event_id) -> bool
@@ -1947,7 +1956,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Locking methods
@@ -1992,7 +2001,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("unlock", """
unlock(self, (bool)force) -> None
@@ -2011,7 +2020,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("locking_status", """
locking_status(self) -> str
@@ -2032,7 +2041,7 @@ def __doc_DeviceProxy():
Return : a string representing the current locking status
New in PyTango 7.0.0"
- """ )
+ """)
document_method("is_locked", """
is_locked(self) -> bool
@@ -2043,7 +2052,7 @@ def __doc_DeviceProxy():
Return : (bool) True if the device is locked. Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
document_method("is_locked_by_me", """
is_locked_by_me(self) -> bool
@@ -2056,7 +2065,7 @@ def __doc_DeviceProxy():
Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_locker", """
get_locker(self, lockinfo) -> bool
@@ -2072,7 +2081,7 @@ def __doc_DeviceProxy():
Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
def device_proxy_init(doc=True):
__init_DeviceProxy()
diff --git a/src/boost/python/pytango_init.py b/src/boost/python/pytango_init.py
index eaf6270..a11897b 100644
--- a/src/boost/python/pytango_init.py
+++ b/src/boost/python/pytango_init.py
@@ -1,21 +1,21 @@
################################################################################
##
## This file is part of PyTango, a python binding for Tango
-##
+##
## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
+##
## PyTango is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
-##
+##
## PyTango is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
-##
+##
## You should have received a copy of the GNU Lesser General Public License
## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
##
@@ -49,22 +49,62 @@ from .pytango_pprint import pytango_pprint_init
from .pyutil import pyutil_init
from .time_val import time_val_init
from ._PyTango import constants
+from ._PyTango import _get_tango_lib_release
__INITIALIZED = False
__DOC = True
+
def init_constants():
-
- tgver = tuple(map(int, constants.TgLibVers.split(".")))
- tgver_str = "0x%02d%02d%02d00" % (tgver[0], tgver[1], tgver[2])
- constants.TANGO_VERSION_HEX = int(tgver_str, 16)
-
+ import sys
+ import platform
+
+ tg_ver = tuple(map(int, constants.TgLibVers.split(".")))
+ tg_ver_str = "0x%02d%02d%02d00" % (tg_ver[0], tg_ver[1], tg_ver[2])
+ constants.TANGO_VERSION_HEX = int(tg_ver_str, 16)
+
+ BOOST_VERSION = ".".join(map(str, (constants.BOOST_MAJOR_VERSION,
+ constants.BOOST_MINOR_VERSION,
+ constants.BOOST_PATCH_VERSION)))
+ constants.BOOST_VERSION = BOOST_VERSION
+
+ class Compile(object):
+ PY_VERSION = constants.PY_VERSION
+ TANGO_VERSION = constants.TANGO_VERSION
+ BOOST_VERSION = constants.BOOST_VERSION
+ if constants.NUMPY_SUPPORT:
+ NUMPY_VERSION = '0.0.0'
+ else:
+ NUMPY_VERSION = None
+ #UNAME = tuple(map(str, json.loads(constants.UNAME)))
+
+ tg_rt_ver_nb = _get_tango_lib_release()
+ tg_rt_major_ver = tg_rt_ver_nb / 100
+ tg_rt_minor_ver = tg_rt_ver_nb / 10 % 10
+ tg_rt_patch_ver = tg_rt_ver_nb % 10
+ tg_rt_ver = ".".join(map(str, (tg_rt_major_ver, tg_rt_minor_ver,
+ tg_rt_patch_ver)))
+
+ class Runtime(object):
+ PY_VERSION = ".".join(map(str, sys.version_info[:3]))
+ TANGO_VERSION = tg_rt_ver
+ BOOST_VERSION = '0.0.0'
+ if constants.NUMPY_SUPPORT:
+ import numpy
+ NUMPY_VERSION = numpy.__version__
+ else:
+ NUMPY_VERSION = None
+ UNAME = platform.uname()
+
+ constants.Compile = Compile
+ constants.Runtime = Runtime
+
def init():
global __INITIALIZED
if __INITIALIZED:
return
-
+
global __DOC
doc = __DOC
init_constants()
@@ -86,7 +126,7 @@ def init():
pytango_pprint_init(doc=doc)
pyutil_init(doc=doc)
time_val_init(doc=doc)
-
+
# must come last: depends on device_proxy.init()
attribute_proxy_init(doc=doc)
diff --git a/src/boost/python/tango_gevent.py b/src/boost/python/tango_gevent.py
index 72789f6..dec4958 100644
--- a/src/boost/python/tango_gevent.py
+++ b/src/boost/python/tango_gevent.py
@@ -1,37 +1,39 @@
################################################################################
##
## This file is part of PyTango, a python binding for Tango
-##
+##
## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
+##
## PyTango is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
-##
+##
## PyTango is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
-##
+##
## You should have received a copy of the GNU Lesser General Public License
## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
##
################################################################################
-__all__ = ["get_global_threadpool", "get_global_executor", "submit", "spawn"]
+from __future__ import absolute_import
+
+__all__ = ["get_global_threadpool", "get_global_executor", "submit", "spawn"]
+
+import gevent
-__docformat__ = "restructuredtext"
def get_global_threadpool():
- import gevent
return gevent.get_hub().threadpool
-get_global_executor = get_global_threadpool
-
def spawn(fn, *args, **kwargs):
return get_global_threadpool().spawn(fn, *args, **kwargs)
+
+get_global_executor = get_global_threadpool
submit = spawn
diff --git a/src/boost/python/utils.py b/src/boost/python/utils.py
index c31b52e..584e754 100644
--- a/src/boost/python/utils.py
+++ b/src/boost/python/utils.py
@@ -1,21 +1,21 @@
################################################################################
##
## This file is part of PyTango, a python binding for Tango
-##
+##
## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
+##
## PyTango is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
-##
+##
## PyTango is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
-##
+##
## You should have received a copy of the GNU Lesser General Public License
## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
##
@@ -41,14 +41,14 @@ __all__ = [ "get_green_mode", "set_green_mode",
__docformat__ = "restructuredtext"
-import sys
import os
-import collections
+import sys
+import inspect
import numbers
import functools
-import inspect
-import traceback
import threading
+import traceback
+import collections
from ._PyTango import StdStringVector, StdDoubleVector, \
DbData, DbDevInfos, DbDevExportInfos, CmdArgType, AttrDataFormat, \
@@ -84,7 +84,7 @@ _array_str_types = (CmdArgType.DevVarStringArray,)
_array_bool_types = (CmdArgType.DevVarBooleanArray,)
_array_types = _array_numerical_types + _array_bool_types + _array_str_types + \
- (CmdArgType.DevVarCharArray,
+ (CmdArgType.DevVarCharArray,
CmdArgType.DevVarDoubleStringArray, CmdArgType.DevVarLongStringArray)
_binary_types = (CmdArgType.DevEncoded, CmdArgType.DevVarCharArray)
@@ -105,7 +105,14 @@ _scalar_to_array_type = {
CmdArgType.ConstDevString : CmdArgType.DevVarStringArray,
}
-__current_green_mode = GreenMode.Synchronous
+__default_green_mode = GreenMode.Synchronous
+try:
+ __current_green_mode = getattr(GreenMode,
+ os.environ.get("PYTANGO_GREEN_MODE",
+ "Synchronous").capitalize())
+except:
+ __current_green_mode = __default_green_mode
+
def set_green_mode(green_mode=None):
"""Sets the global default PyTango green mode.
@@ -122,6 +129,7 @@ def set_green_mode(green_mode=None):
green_mode = GreenMode.Synchronous
__current_green_mode = green_mode
+
def get_green_mode():
"""Returns the current global default PyTango green mode.
@@ -146,7 +154,7 @@ def get_tango_device_classes():
except AttributeError:
break
return __device_classes
-
+
__str_klasses = str,
__int_klasses = int,
__number_klasses = numbers.Number,
@@ -173,7 +181,7 @@ if constants.NUMPY_SUPPORT:
__int_klasses = tuple(list(__int_klasses) + [numpy.integer])
__number_klasses = tuple(list(__number_klasses) + [numpy.number])
__seq_klasses = tuple(list(__seq_klasses) + [numpy.ndarray])
-
+
__str_klasses = tuple(__str_klasses)
__int_klasses = tuple(__int_klasses)
__number_klasses = tuple(__number_klasses)
@@ -203,7 +211,7 @@ def is_scalar(tg_type):
:return: True if the given tango type is a scalar or False otherwise
:rtype: :py:obj:`bool`
"""
-
+
global _scalar_types
return tg_type in _scalar_types
@@ -500,10 +508,10 @@ def seqStr_2_obj(seq, tg_type, tg_format=None):
return _seqStr_2_obj_from_type(seq, tg_type)
def _seqStr_2_obj_from_type(seq, tg_type):
-
+
if is_pure_str(seq):
seq = seq,
-
+
# Scalar cases
global _scalar_int_types
if tg_type in _scalar_int_types:
@@ -519,7 +527,7 @@ def _seqStr_2_obj_from_type(seq, tg_type):
if tg_type == CmdArgType.DevBoolean:
return seq[0].lower() == 'true'
-
+
#sequence cases
if tg_type in (CmdArgType.DevVarCharArray, CmdArgType.DevVarStringArray):
return seq
@@ -542,7 +550,7 @@ def _seqStr_2_obj_from_type(seq, tg_type):
argout = []
for x in seq:
argout.append(x.lower() == 'true')
- return argout
+ return argout
return []
@@ -574,7 +582,7 @@ def _seqStr_2_obj_from_type_format(seq, tg_type, tg_format):
tmp.append(float(y))
argout.append(tmp)
return argout
-
+
#UNKNOWN_FORMAT
return _seqStr_2_obj_from_type(tg_type, seq)
@@ -624,7 +632,7 @@ def document_method(klass, method_name, d, add=True):
func.__doc__ = "%s\n%s" % (d, cpp_doc)
return
func.__doc__ = d
-
+
if func.__name__ != method_name:
try:
func.__name__ = method_name
@@ -673,28 +681,28 @@ class CaselessList(list):
def __init__(self, inlist=[]):
list.__init__(self)
for entry in inlist:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
- 'You supplied \"%s\" which is \"%s\"' %
+ 'You supplied \"%s\" which is \"%s\"' %
(entry, type(entry)))
self.append(entry)
def findentry(self, item):
"""A caseless way of checking if an item is in the list or not.
It returns None or the entry."""
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(item))
for entry in self:
if item.lower() == entry.lower(): return entry
return None
-
+
def __contains__(self, item):
"""A caseless way of checking if a list has a member in it or not."""
for entry in self:
if item.lower() == entry.lower(): return True
return False
-
+
def remove(self, item):
"""Remove the first occurence of an item, the caseless way."""
for entry in self:
@@ -702,7 +710,7 @@ class CaselessList(list):
list.remove(self, entry)
return
raise ValueError(': list.remove(x): x not in list')
-
+
def copy(self):
"""Return a CaselessList copy of self."""
return CaselessList(self)
@@ -710,29 +718,29 @@ class CaselessList(list):
def list(self):
"""Return a normal list version of self."""
return list(self)
-
+
def lowercopy(self):
"""Return a lowercase (list) copy of self."""
return [entry.lower() for entry in self]
-
+
def append(self, item):
"""Adds an item to the list and checks it's a string."""
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(item))
list.append(self, item)
-
+
def extend(self, item):
"""Extend the list with another list. Each member of the list must be
a string."""
- if not isinstance(item, list):
+ if not isinstance(item, list):
raise TypeError('You can only extend lists with lists. ' \
'You supplied \"%s\"' % type(item))
for entry in item:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(entry))
- list.append(self, entry)
+ list.append(self, entry)
def count(self, item):
"""Counts references to 'item' in a caseless manner.
@@ -742,7 +750,7 @@ class CaselessList(list):
for entry in self:
if item.lower() == entry.lower():
count += 1
- return count
+ return count
def index(self, item, minindex=0, maxindex=None):
"""Provide an index of first occurence of item in the list. (or raise
@@ -752,9 +760,9 @@ class CaselessList(list):
s.index(x[, i[, j]]) return smallest k such that s[k] == x and i <= k < j
"""
if maxindex == None: maxindex = len(self)
- minindex = max(0, minindex)-1
+ minindex = max(0, minindex) - 1
maxindex = min(len(self), maxindex)
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(item))
index = minindex
@@ -763,11 +771,11 @@ class CaselessList(list):
if item.lower() == self[index].lower():
return index
raise ValueError(': list.index(x): x not in list')
-
+
def insert(self, i, x):
"""s.insert(i, x) same as s[i:i] = [x]
Raises TypeError if x isn't a string."""
- if not isinstance(x, str):
+ if not isinstance(x, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(x))
list.insert(self, i, x)
@@ -781,15 +789,15 @@ class CaselessList(list):
the same length as the slice object requires.
"""
if isinstance(index, int):
- if not isinstance(value, str):
+ if not isinstance(value, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(value))
list.__setitem__(self, index, value)
elif isinstance(index, slice):
- if not hasattr(value, '__len__'):
+ if not hasattr(value, '__len__'):
raise TypeError('Value given to set slice is not a sequence object.')
for entry in value:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(entry))
list.__setitem__(self, index, value)
@@ -799,7 +807,7 @@ class CaselessList(list):
def __setslice__(self, i, j, sequence):
"""Called to implement assignment to self[i:j]."""
for entry in sequence:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(entry))
list.__setslice__(self, i, j, sequence)
@@ -818,7 +826,7 @@ class CaselessList(list):
return list.__getitem__(self, index)
else:
return CaselessList(list.__getitem__(self, index))
-
+
def __add__(self, item):
"""To add a list, and return a CaselessList.
Every element of item must be a string."""
@@ -828,7 +836,7 @@ class CaselessList(list):
"""To add a list, and return a CaselessList.
Every element of item must be a string."""
return CaselessList(list.__add__(self, item))
-
+
def __iadd__(self, item):
"""To add a list in place."""
for entry in item: self.append(entry)
@@ -849,59 +857,59 @@ class CaselessDict(dict):
if other:
# Doesn't do keyword args
if isinstance(other, dict):
- for k,v in other.items():
+ for k, v in other.items():
dict.__setitem__(self, k.lower(), v)
else:
- for k,v in other:
+ for k, v in other:
dict.__setitem__(self, k.lower(), v)
-
+
def __getitem__(self, key):
return dict.__getitem__(self, key.lower())
-
+
def __setitem__(self, key, value):
dict.__setitem__(self, key.lower(), value)
-
+
def __contains__(self, key):
return dict.__contains__(self, key.lower())
def __delitem__(self, k):
dict.__delitem__(self, k.lower())
-
+
def has_key(self, key):
return dict.has_key(self, key.lower())
-
+
def get(self, key, def_val=None):
return dict.get(self, key.lower(), def_val)
-
+
def setdefault(self, key, def_val=None):
return dict.setdefault(self, key.lower(), def_val)
-
+
def update(self, other):
- for k,v in other.items():
+ for k, v in other.items():
dict.__setitem__(self, k.lower(), v)
-
+
def fromkeys(self, iterable, value=None):
d = CaselessDict()
for k in iterable:
dict.__setitem__(d, k.lower(), value)
return d
-
+
def pop(self, key, def_val=None):
return dict.pop(self, key.lower(), def_val)
-
+
def keys(self):
return CaselessList(dict.keys(self))
__DEFAULT_FACT_IOR_FILE = "/tmp/rdifact.ior"
-__BASE_LINE = "notifd"
-__END_NOTIFD_LINE = "/DEVICE/notifd:"
+__BASE_LINE = "notifd"
+__END_NOTIFD_LINE = "/DEVICE/notifd:"
__NOTIFD_FACTORY_PREFIX = "notifd/factory/"
def notifd2db(notifd_ior_file=__DEFAULT_FACT_IOR_FILE, files=None, host=None, out=sys.stdout):
ior_string = ""
with file(notifd_ior_file) as ior_file:
ior_string = ior_file.read()
-
+
if files is None:
return _notifd2db_real_db(ior_string, host=host, out=out)
else:
@@ -921,7 +929,7 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
import PyTango
print("going to export notification service event factory to " \
"Tango database ...", file=out)
-
+
num_retries = 3
while num_retries > 0:
try:
@@ -935,16 +943,16 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
print(str(df), file=out)
return
print("Can't create Tango database object, retrying....", file=out)
-
+
if host is None:
import socket
host_name = socket.getfqdn()
-
+
global __NOTIFD_FACTORY_PREFIX
notifd_factory_name = __NOTIFD_FACTORY_PREFIX + host_name
-
+
args = notifd_factory_name, ior_string, host_name, str(os.getpid()), "1"
-
+
num_retries = 3
while num_retries > 0:
try:
@@ -963,7 +971,7 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
num_retries = 0
except Exception:
num_retries = 0
-
+
if num_retries == 0:
print("Failed to export notification service event factory " \
"to TANGO database", file=out)
@@ -994,12 +1002,12 @@ class EventCallBack(object):
def __init__(self, format="{date} {dev_name} {name} {type} {value}",
fd=sys.stdout, max_buf=100):
-
+
self._msg = format
self._fd = fd
self._evts = []
self._max_buf = max_buf
-
+
def get_events(self):
"""Returns the list of events received by this callback
@@ -1007,7 +1015,7 @@ class EventCallBack(object):
:rtype: sequence<obj>
"""
return self._evts
-
+
def push_event(self, evt):
"""Internal usage only"""
try:
@@ -1015,7 +1023,7 @@ class EventCallBack(object):
except Exception as e:
print("Unexpected error in callback for %s: %s" \
% (str(evt), str(e)), file=self._fd)
-
+
def _push_event(self, evt):
"""Internal usage only"""
self._append(evt)
@@ -1056,15 +1064,15 @@ class EventCallBack(object):
if len(evts) == self._max_buf:
evts.pop(0)
evts.append(evt)
-
+
def _get_value(self, evt):
"""Internal usage only"""
if evt.err:
e = evt.errors[0]
return "[%s] %s" % (e.reason, e.desc)
-
+
if isinstance(evt, EventData):
- return "[%s] %s" %(evt.attr_value.quality, str(evt.attr_value.value))
+ return "[%s] %s" % (evt.attr_value.quality, str(evt.attr_value.value))
elif isinstance(evt, AttrConfEventData):
cfg = evt.attr_conf
return "label='%s'; unit='%s'" % (cfg.label, cfg.unit)
@@ -1080,9 +1088,9 @@ def get_home():
New in PyTango 7.1.4
"""
- path=''
+ path = ''
try:
- path=os.path.expanduser("~")
+ path = os.path.expanduser("~")
except:
pass
if not os.path.isdir(path):
@@ -1114,10 +1122,10 @@ def _get_env_var(env_var_name):
New in PyTango 7.1.4
"""
-
+
if env_var_name in os.environ:
return os.environ[env_var_name]
-
+
fname = os.path.join(get_home(), '.tangorc')
if not os.path.exists(fname):
if os.name == 'posix':
@@ -1126,24 +1134,24 @@ def _get_env_var(env_var_name):
return None
for line in file(fname):
- strippedline = line.split('#',1)[0].strip()
-
+ strippedline = line.split('#', 1)[0].strip()
+
if not strippedline:
#empty line
continue
-
- tup = strippedline.split('=',1)
- if len(tup) !=2:
+
+ tup = strippedline.split('=', 1)
+ if len(tup) != 2:
# illegal line!
continue
-
+
key, val = map(str.strip, tup)
if key == env_var_name:
return val
def from_version_str_to_hex_str(version_str):
v = map(int, version_str.split('.'));
- return "0x%02d%02d%02d00" % (v[0],v[1],v[2])
+ return "0x%02d%02d%02d00" % (v[0], v[1], v[2])
def from_version_str_to_int(version_str):
return int(from_version_str_to_hex_str(version_str, 16))
@@ -1153,10 +1161,10 @@ def __server_run(classes, args=None, msg_stream=sys.stderr, util=None):
if msg_stream is None:
import io
msg_stream = io.BytesIO()
-
+
if args is None:
args = sys.argv
-
+
if util is None:
util = PyTango.Util(args)
@@ -1167,8 +1175,8 @@ def __server_run(classes, args=None, msg_stream=sys.stderr, util=None):
klass_klass = klass_info._DeviceClass
klass_name = klass_info._DeviceClassName
klass = klass_info
- util.add_class(klass_klass, klass, klass_name)
- else:
+ util.add_class(klass_klass, klass, klass_name)
+ else:
for klass_name, klass_info in classes.items():
if is_seq(klass_info):
klass_klass, klass = klass_info
@@ -1184,7 +1192,7 @@ def __server_run(classes, args=None, msg_stream=sys.stderr, util=None):
msg_stream.write("Ready to accept request\n")
u_instance.server_run()
return util
-
+
def server_run(classes, args=None, msg_stream=sys.stderr, verbose=False, util=None):
"""Provides a simple way to run a tango server. It handles exceptions
by writting a message to the msg_stream.
@@ -1245,7 +1253,7 @@ def server_run(classes, args=None, msg_stream=sys.stderr, verbose=False, util=No
.. versionchanged:: 8.0.3
Added `util` keyword parameter.
Returns util object"""
-
+
if msg_stream is None:
import io
msg_stream = io.BytesIO()
@@ -1265,3 +1273,29 @@ def server_run(classes, args=None, msg_stream=sys.stderr, verbose=False, util=No
write(traceback.format_exc())
write("\nExited\n")
+
+def info():
+ import PyTango.constants
+
+ Compile = PyTango.constants.Compile
+ Runtime = PyTango.constants.Runtime
+
+ msg = """\
+PyTango compiled with:
+ Python : {0.PY_VERSION}
+ Numpy : {0.NUMPY_VERSION}
+ Tango : {0.TANGO_VERSION}
+ Boost : {0.BOOST_VERSION}
+
+PyTango runtime is:
+ Python : {1.PY_VERSION}
+ Numpy : {1.NUMPY_VERSION}
+ Tango : {1.TANGO_VERSION}
+ Boost : {1.BOOST_VERSION}
+
+PyTango running on:
+{1.UNAME}
+"""
+ msg = msg.format(Compile, Runtime)
+
+ print(msg)
--
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