# History of changes

Contributers: | T. Coutinho
Last Update: | Feb 18, 2020

## Document revisions

Date | Revision | Description | Author
--- | --- | --- | ---
18/07/03 | 1.0 | Initial Version | M. Ounsy
06/10/03 | 2.0 | Extension of the “Getting Started” paragraph | A. Buteau/M. Ounsy
14/10/03 | 3.0 | Added Exception Handling paragraph | M. Ounsy
13/06/05 | 4.0 | Ported to Latex, added events, AttributeProxy and ApiUtil | V. Forchì
13/06/05 | 4.1 | fixed bug with python 2.5 and and state events new Database constructor | V. Forchì
15/01/06 | 5.0 | Added Device Server classes | E.Taurel
15/03/07 | 6.0 | Added AttrInfoEx, AttributeConfig events, 64bits, write_attribute | T. Coutinho
21/03/07 | 6.1 | Added groups | T. Coutinho
15/06/07 | 6.2 | Added dynamic attributes doc | E. Taurel
06/05/08 | 7.0 | Update to Tango 6.1. Added DB methods, version info | T. Coutinho
10/07/09 | 8.0 | Update to Tango 7. Major refactoring. Migrated doc | T. Coutinho/R. Suñe
24/07/09 | 8.1 | Added migration info, added missing API doc | T. Coutinho/R. Suñe
21/09/09 | 8.2 | Added migration info, release of 7.0.0beta2 | T. Coutinho/R. Suñe
12/11/09 | 8.3 | Update to Tango 7.1. | T. Coutinho/R. Suñe
??/12/09 | 8.4 | Update to PyTango 7.1.0 rc1 | T. Coutinho/R. Suñe
19/02/10 | 8.5 | Update to PyTango 7.1.1 | T. Coutinho/R. Suñe
06/08/10 | 8.6 | Update to PyTango 7.1.2 | T. Coutinho
05/11/10 | 8.7 | Update to PyTango 7.1.3 | T. Coutinho
08/04/11 | 8.8 | Update to PyTango 7.1.4 | T. Coutinho
13/04/11 | 8.9 | Update to PyTango 7.1.5 | T. Coutinho
14/04/11 | 8.10 | Update to PyTango 7.1.6 | T. Coutinho
15/04/11 | 8.11 | Update to PyTango 7.2.0 | T. Coutinho
12/12/11 | 8.12 | Update to PyTango 7.2.2 | T. Coutinho
24/04/12 | 8.13 | Update to PyTango 7.2.3 | T. Coutinho
21/09/12 | 8.14 | Update to PyTango 8.0.0 | T. Coutinho
10/10/12 | 8.15 | Update to PyTango 8.0.2 | T. Coutinho
20/05/13 | 8.16 | Update to PyTango 8.0.3 | T. Coutinho
28/08/13 | 8.13 | Update to PyTango 7.2.4 | T. Coutinho
27/11/13 | 8.18 | Update to PyTango 8.1.1 | T. Coutinho
16/05/14 | 8.19 | Update to PyTango 8.1.2 | T. Coutinho
30/09/14 | 8.20 | Update to PyTango 8.1.4 | T. Coutinho
01/10/14 | 8.21 | Update to PyTango 8.1.5 | T. Coutinho
05/02/15 | 8.22 | Update to PyTango 8.1.6 | T. Coutinho
03/02/16 | 8.23 | Update to PyTango 8.1.8 | T. Coutinho
12/08/16 | 8.24 | Update to PyTango 8.1.9 | V. Michel
26/02/16 | 9.2.0a | Update to PyTango 9.2.0a | T. Coutinho
15/08/16 | 9.2.0 | 9.2.0 Release | V. Michel
23/01/17 | 9.2.1 | 9.2.1 Release | V. Michel
27/09/17 | 9.2.2 | 9.2.2 Release | G. Cuni/V. Michel/J. Moldes
30/05/18 | 9.2.3 | 9.2.3 Release | V. Michel
30/07/18 | 9.2.4 | 9.2.4 Release | V. Michel
28/11/18 | 9.2.5 | 9.2.5 Release | A. Joubert
13/03/19 | 9.3.0 | 9.3.0 Release | T. Coutinho

## Version history

Version | Changes
--- | ---

9.3.0

9.3.0 release.

Changes:
  - Pull Request #242: Improve Python version check for enum34 install
  - Pull Request #250: Develop 9.3.0
  - Pull Request #258: Change Travis CI builds to xenial
Bug fixes:
  - Pull Request #245: Change for collections abstract base class
  - Pull Request #247: Use IP address instead of hostname (fix #246)
  - Pull Request #252: Fix wrong link to tango dependency (#235)
  - Pull Request #254: Fix mapping of AttrWriteType WT_UNKNOWN
  - Pull Request #257: Fix some docs and docstrings
  - Pull Request #260: add ApiUtil.cleanup()
  - Pull Request #262: Fix compile error under Linux
  - Pull Request #263: Fix #251: Python 2 vs Python 3: DevString with bytes

9.2.5

9.2.5 release.

Changes:
  - Pull Request #212: Skip databaseds backends in PyTango compatibility module
  - Pull Request #221: DevEnum attributes can now be directly assigned labels
  - Pull Request #236: Cleanup db_access module
  - Pull Request #237: Add info about how to release a new version
Bug fixes:
  - Pull Request #209 (issue #207): Fix documentation warnings
  - Pull Request #211: Yet another fix to the gevent threadpool error wrapping
  - Pull Request #214 (issue #213): DevEncoded attribute should produce a bytes object in python 3
  - Pull Request #219: Fixing icons in documentation
  - Pull Request #220: Fix ‘DevFailed’ object does not support indexing
  - Pull Request #225 (issue #215): Fix exception propagation in python 3
  - Pull Request #226 (issue #216): Add missing converter from python bytes to char*
  - Pull Request #227: Gevent issue #1260 should be fixed by now
  - Pull Request #232: use special case-insensitive weak values dictionary for Tango nodes

9.2.4

9.2.4 release.

Changes:
  - Pull Request #194 (issue #188): Easier access to DevEnum attribute using python enum
  - Pull Request #199 (issue #195): Support python enum as dtype argument for attributes
  - Pull Request #205 (issue #202): Python 3.7 compatibility
Bug fixes:
  - Pull Request #193 (issue #192): Fix a gevent green mode memory leak introduced in v9.2.3

9.2.3

9.2.3 release.

Changes:
  - Pull Request #169: Use tango-controls theme for the documentation
  - Pull Request #170 (issue #171): Use a private gevent ThreadPool
  - Pull Request #180: Use same default encoding for python2 and python3 (utf-8)
Bug fixes:
  - Pull Request #178 (issue #177): Make CmdDoneEvent.argout writable
  - Pull Request #178: Add GIL control for ApiUtil.get_asynch_replies
  - Pull Request #187 (issue #186): Fix and extend client green mode

9.2.2

9.2.2 release.

Features:
  - Pull Request #104: Pipe Events
  - Pull Request #106: Implement pipe write (client and server, issue #9)
  - Pull Request #122: Dynamic commands
  - Pull Request #124: Add forward attribute
  - Pull Request #129: Implement mandatory property (issue #30)
Changes:
  - Pull Request #109: Device Interface Change Events
  - Pull Request #113: Adding asyncio green mode documentation and a how-to on contributing
  - Pull Request #114: Added PEP8-ified files in tango module.
  - Pull Request #115: Commands polling tests (client and server)
  - Pull Request #116: Attribute polling tests (client and server)
  - Pull Request #117: Use official tango-controls conda channel
  - Pull Request #125: Forward attribute example
  - Pull Request #134: Linting pytango (with pylint + flake8)
  - Pull Request #137: Codacy badge in README and code quality policy in How to Contribute
  - Pull Request #143: Added missing PipeEventData & DevIntrChangeEventData
Bug fixes:
  - Pull Request #85 (issue #84): Fix Gevent ThreadPool exceptions
  - Pull Request #94 (issue #93): Fix issues in setup file (GCC-7 build)
  - Pull Request #96: Filter badges from the long description
  - Pull Request #97: Fix/linker options
  - Pull Request #98: Refactor green mode for client and server APIs
  - Pull Request #101 (issue #100) check for None and return null string
  - Pull Request #102: Update server tests
  - Pull Request #103: Cache build objects to optimize travis builds
  - Pull Request #112 (issue #111): Use _DeviceClass as tango device class constructor
  - Pull Request #128 (issue #127): Set default worker in server.py
  - Pull Request #135: Better exception handling in server.run and test context (issue #131)
  - Pull Request #142 (issue #142): Added missing PipeEventData & DevIntrChangeEventData
  - Pull Request #148 (issue #144): Expose utils helpers
  - Pull Request #149: Fix return value of proxy.subscribe_event
  - Pull Request #158 (issue #155): Fix timestamp and casing in utils.EventCallback

9.2.1

9.2.1 release.

Features:
  - Pull Requests #70: Add test_context and test_utils modules, used for pytango unit-testing
Changes:
  - Issue #51: Refactor platform specific code in setup file
  - Issue #67: Comply with PEP 440 for pre-releases
  - Pull Request #70: Add unit-testing for the server API
  - Pull Request #70: Configure Travis CI for continuous integration
  - Pull Request #76: Add unit-testing for the client API
  - Pull Request #78: Update the python version classifiers
  - Pull Request #80: Move tango object server to its own module
  - Pull Request #90: The metaclass definition for tango devices is no longer mandatory
Bug fixes:
  - Issue #24: Fix dev_status dangling pointer bug
  - Issue #57: Fix dev_state/status to be gevent safe
  - Issue #58: Server gevent mode internal call hangs
  - Pull Request #62: Several fixes in tango.databaseds
  - Pull Request #63: Follow up on issue #21 (Fix Group.get_device method)
  - Issue #64: Fix AttributeProxy.__dev_proxy to be initialized with python internals
  - Issue #74: Fix hanging with an asynchronous tango server fails to start
  - Pull Request #81: Fix DeviceImpl documentation
  - Issue #82: Fix attribute completion for device proxies with IPython >= 4
  - Issue #84: Fix gevent threadpool exceptions

9.2.0

9.2.0 release.

Features:

> - Issue #37: Add display_level and polling_period as optional arguments to command decorator

Bug fixes:

> - Fix cache problem when using DeviceProxy through an AttributeProxy
> - Fix compilation on several platforms
> - Issue #19: Defining new members in DeviceProxy has side effects
> - Fixed bug in beacon.add_device
> - Fix for get_device_list if server_name is ‘*’
> - Fix get_device_attribute_property2 if prop_attr is not None
> - Accept StdStringVector in put_device_property
> - Map ‘int’ to DevLong64 and ‘uint’ to DevULong64
> - Issue #22: Fix push_data_ready_event() deadlock
> - Issue #28: Fix compilation error for constants.cpp
> - Issue #21: Fix Group.get_device method
> - Issue #33: Fix internal server documentation

Changes:
  - Move ITango to another project
  - Use setuptools instead of distutils
  - Add six as a requirement
  - Refactor directory structure
  - Rename PyTango module to tango (import PyTango still works for backward compatibility)
  - Add a ReST readme for GitHub and PyPI
ITango changes (moved to another project):
  - Fix itango event logger for python 3
  - Avoid deprecation warning with IPython 4.x
  - Use entry points instead of scripts

9.2.0a

9.2 alpha release. Missing:

> - writtable pipes (client and server)
> - dynamic commands (server)
> - device interface change event (client and server)
> - pipe event (client and server)

Bug fixes:

> - 776: [pytango][8.1.8] SyntaxError: invalid syntax

8.1.9

Features:

> - PR #2: asyncio support for both client and server API
> - PR #6: Expose AutoTangoMonitor and AutoTangoAllowThreads

Bug fixes:

> - PR #31: Get -l flags from pkg-config
> - PR #15: Rename itango script to itango3 for python3
> - PR #14: Avoid deprecation warning with IPython 4.x

8.1.8

Features:

> - PR #3: Add a run_server class method to Device
> - PR #4: Add device inheritance
> - 110: device property with auto update in database

Bug fixes:

> - 690: Description attribute property
> - 700: [pytango] useless files in the source distribution
> - 701: Memory leak in command with list argument
> - 704: Assertion failure when calling command with string array input type
> - 705: Support boost_python lib name on Gentoo
> - 714: Memory leak in PyTango for direct server command calls
> - 718: OverflowErrors with float types in 8.1.6
> - 724: PyTango DeviceProxy.command_inout(<str>) memory leaks
> - 736: pytango FTBFS with python 3.4
> - 747: PyTango event callback in gevent mode gets called in non main thread

8.1.6

Bug fixes:

> - 698: PyTango.Util discrepancy
> - 697: PyTango.server.run does not accept old Device style classes

8.1.5

Bug fixes:

> - 687: [pytango] 8.1.4 unexpected files in the source package
> - 688: PyTango 8.1.4 new style server commands don’t work

8.1.4

Features:

> - 107: Nice to check Tango/PyTango version at runtime

Bug fixes:

> - 659: segmentation fault when unsubscribing from events
> - 664: problem while installing PyTango 8.1.1 with pip (using pip 1.4.1)
> - 678: [pytango] 8.1.2 unexpected files in the source package
> - 679: PyTango.server tries to import missing __builtin__ module on Python 3
> - 680: Cannot import PyTango.server.run
> - 686: Device property substitution for a multi-device server

8.1.3 | SKIPPED

8.1.2

Features:

> - 98: PyTango.server.server_run needs additional post_init_callback parameter
> - 102: DevEncoded attribute should support a python buffer object
> - 103: Make creation of *EventData objects possible in PyTango

Bug fixes:

> - 641: python3 error handling issue
> - 648: PyTango unicode method parameters fail
> - 649: write_attribute of spectrum/image fails in PyTango without numpy
> - 650: [pytango] 8.1.1 not compatible with ipyton 1.2.0-rc1
> - 651: PyTango segmentation fault when run a DS that use attr_data.py
> - 660: command_inout_asynch (polling mode) fails
> - 666: PyTango shutdown sometimes blocks.

8.1.1

Features:

> - Implemented tango C++ 8.1 API

Bug fixes:

> - 527: set_value() for ULong64
> - 573: [pytango] python3 error with unregistered device
> - 611: URGENT fail to write attribute with PyTango 8.0.3
> - 612: [pytango][8.0.3] failed to build from source on s390
> - 615: Threading problem when setting a DevULong64 attribute
> - 622: PyTango broken when running on Ubuntu 13
> - 626: attribute_history extraction can raised an exception
> - 628: Problem in installing PyTango 8.0.3 on Scientific Linux 6
> - 635: Reading of ULong64 attributes does not work
> - 636: PyTango log messages are not filtered by level
> - 637: [pytango] segfault doing write_attribute on Group

8.1.0 | SKIPPED

8.0.3

Features:
  - 88: Implement Util::server_set_event_loop method in python

Bug fixes:

> - 3576353: [pytango] segfault on ‘RestartServer’
> - 3579062: [pytango] Attribute missing methods
> - 3586337: [pytango] Some DeviceClass methods are not python safe
> - 3598514: DeviceProxy.__setattr__ break python’s descriptors
> - 3607779: [pytango] IPython 0.10 error
> - 598: Import DLL by PyTango failed on windows
> - 605: [pytango] use distutils.version module

8.0.2

Bug fixes:

> - 3570970: [pytango] problem during the python3 building
> - 3570971: [pytango] itango does not work without qtconsole
> - 3570972: [pytango] warning/error when building 8.0.0
> - 3570975: [pytango] problem during use of python3 version
> - 3574099: [pytango] compile error with gcc < 4.5

8.0.1 | SKIPPED

8.0.0

Features:

> - Implemented tango C++ 8.0 API
> - Python 3k compatible

Bug fixes:

> - 3023857: DevEncoded write attribute not supported
> - 3521545: [pytango] problem with tango profile
> - 3530535: PyTango group writting fails
> - 3564959: EncodedAttribute.encode_xxx() methods don’t accept bytearray

7.2.4

Bug fixes:

> - 551: [pytango] Some DeviceClass methods are not python safe

7.2.3

Features:

> - 3495607: DeviceClass.device_name_factory is missing

Bug fixes:

> - 3103588: documentation of PyTango.Attribute.Group
> - 3458336: Problem with pytango 7.2.2
> - 3463377: PyTango memory leak in read encoded attribute
> - 3487930: [pytango] wrong python dependency
> - 3511509: Attribute.set_value_date_quality for encoded does not work
> - 3514457: [pytango] TANGO_HOST multi-host support
> - 3520739: command_history(…) in PyTango

7.2.2

Features:

> - 3305251: DS dynamic attributes discards some Attr properties
> - 3365792: DeviceProxy.<cmd_name> could be documented
> - 3386079: add support for ipython 0.11
> - 3437654: throw python exception as tango exception
> - 3447477: spock profile installation

Bug fixes:

> - 3372371: write attribute of DevEncoded doesn’t work
> - 3374026: [pytango] pyflakes warning
> - 3404771: PyTango.MultiAttribute.get_attribute_list missing
> - 3405580: PyTango.MultiClassAttribute missing

7.2.1 | SKIPPED

7.2.0

Features:

> - 3286678: Add missing EncodedAttribute JPEG methods

7.1.6

Bug fixes:

> - 7.1.5 distribution is missing some files

7.1.5

Bug fixes:

> - 3284174: 7.1.4 does not build with gcc 4.5 and tango 7.2.6
> - 3284265: [pytango][7.1.4] a few files without licence and copyright
> - 3284318: copyleft vs copyright
> - 3284434: [pytango][doc] few ERROR during the doc generation
> - 3284435: [pytango][doc] few warning during the doc generation
> - 3284440: [pytango][spock] the profile can’t be installed
> - 3285185: PyTango Device Server does not load Class Properties values
> - 3286055: PyTango 7.1.x DS using Tango C++ 7.2.x seg faults on exit

7.1.4

Features:

> - 3274309: Generic Callback for events

Bug fixes:

> - 3011775: Seg Faults due to removed dynamic attributes
> - 3105169: PyTango 7.1.3 does not compile with Tango 7.2.X
> - 3107243: spock profile does not work with python 2.5
> - 3124427: PyTango.WAttribute.set_max_value() changes min value
> - 3170399: Missing documentation about is_<attr>_allowed method
> - 3189082: Missing get_properties() for Attribute class
> - 3196068: delete_device() not called after server_admin.Kill()
> - 3257286: Binding crashes when reading a WRITE string attribute
> - 3267628: DP.read_attribute(, extract=List/tuple) write value is wrong
> - 3274262: Database.is_multi_tango_host missing
> - 3274319: EncodedAttribute is missing in PyTango (<= 7.1.3)
> - 3277269: read_attribute(DevEncoded) is not numpy as expected
> - 3278946: DeviceAttribute copy constructor is not working

Documentation:

> - Added The Utilities API chapter
> - Added Encoded API chapter
> - Improved Write a server (original API) chapter

7.1.3

Features:

> - tango logging with print statement
> - tango logging with decorators
> - from sourceforge:
> - 3060380: ApiUtil should be exported to PyTango

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
> - 3048798: licence issue GPL != LGPL
> - 3073378: DeviceImpl.signal_handler raising exception crashes DS
> - 3088031: Python DS unable to read DevVarBooleanArray property
> - 3102776: PyTango 7.1.2 does not work with python 2.4 & boost 1.33.0
> - 3102778: Fix compilation warnings in linux

7.1.2

Features:

> - 2995964: Dynamic device creation
> - 3010399: The DeviceClass.get_device_list that exists in C++ is missing
> - 3023686: Missing DeviceProxy.<attribute name>
> - 3025396: DeviceImpl is missing some CORBA methods
> - 3032005: IPython extension for PyTango
> - 3033476: Make client objects pickable
> - 3039902: PyTango.Util.add_class would be useful

Bug fixes:

> - 2975940: DS command with DevVarCharArray return type fails
> - 3000467: DeviceProxy.unlock is LOCKING instead of unlocking!
> - 3010395: Util.get_device_* methods don’t work
> - 3010425: Database.dev_name does not work
> - 3016949: command_inout_asynch callback does not work
> - 3020300: PyTango does not compile with gcc 4.1.x
> - 3030399: Database put(delete)_attribute_alias generates segfault

7.1.1

Features:

> - Improved setup script
> - Interfaced with PyPI
> - Cleaned build script warnings due to unclean python C++ macro definitions
> - 2985993: PyTango numpy command support
> - 2971217: PyTango.GroupAttrReplyList slicing

Bug fixes:

> - 2983299: Database.put_property() deletes the property
> - 2953689: can not write_attribute scalar/spectrum/image
> - 2953030: PyTango doc installation

7.1.0

Features:

> - 2908176: read_*, write_* and is_*_allowed() methods can now be defined
> - 2941036: TimeVal conversion to time and datetime
> - added str representation on Attr, Attribute, DeviceImpl and DeviceClass

Bug fixes:

> - 2903755: get_device_properties() bug reading DevString properties
> - 2909927: PyTango.Group.read_attribute() return values
> - 2914194: DevEncoded does not work
> - 2916397: PyTango.DeviceAttribute copy constructor does not work
> - 2936173: PyTango.Group.read_attributes() fails
> - 2949099: Missing PyTango.Except.print_error_stack

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