This file is indexed.

/usr/lib/python3/dist-packages/PyTango/attribute_proxy.py is in python3-pytango 8.1.1-1build3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
# ------------------------------------------------------------------------------
# This file is part of PyTango (http://www.tinyurl.com/PyTango)
#
# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
#
# Distributed under the terms of the GNU Lesser General Public License,
# either version 3 of the License, or (at your option) any later version.
# See LICENSE.txt for more info.
# ------------------------------------------------------------------------------

"""
This is an internal PyTango module. It completes the binding of
:class:`PyTango.AttributeProxy`.

To access these members use directly :mod:`PyTango` module and NOT 
PyTango.attribute_proxy.
"""

__all__ = [ "AttributeProxy", "attribute_proxy_init", "get_attribute_proxy" ]
            
__docformat__ = "restructuredtext"

import collections

from ._PyTango import StdStringVector, DbData, DbDatum, DeviceProxy
from ._PyTango import __AttributeProxy as _AttributeProxy
from .utils import seq_2_StdStringVector, seq_2_DbData, DbData_2_dict
from .utils import is_pure_str, is_non_str_seq
from .green import result, submit, get_green_mode


def get_attribute_proxy(*args, **kwargs):
    """
    get_attribute_proxy(self, full_attr_name, green_mode=None, wait=True, timeout=True) -> AttributeProxy
    get_attribute_proxy(self, device_proxy, attr_name, green_mode=None, wait=True, timeout=True) -> AttributeProxy

    Returns a new :class:`~PyTango.AttributeProxy`.
    There is no difference between using this function and the direct 
    :class:`~PyTango.AttributeProxy` constructor if you use the default kwargs.
     
    The added value of this function becomes evident when you choose a green_mode
    to be *Futures* or *Gevent*. The AttributeProxy constructor internally makes some
    network calls which makes it *slow*. By using one of the *green modes* as 
    green_mode you are allowing other python code to be executed in a cooperative way.

    :param full_attr_name: the full name of the attribute
    :type full_attr_name: str
    :param device_proxy: the :class:`~PyTango.DeviceProxy`
    :type device_proxy: DeviceProxy
    :param attr_name: attribute name for the given device proxy
    :type attr_name: str
    :param green_mode: determines the mode of execution of the device (including
                      the way it is created). Defaults to the current global
                      green_mode (check :func:`~PyTango.get_green_mode` and
                      :func:`~PyTango.set_green_mode`)
    :type green_mode: :obj:`~PyTango.GreenMode`
    :param wait: whether or not to wait for result. If green_mode
                 Ignored when green_mode is Synchronous (always waits).
    :type wait: bool
    :param timeout: The number of seconds to wait for the result.
                    If None, then there is no limit on the wait time.
                    Ignored when green_mode is Synchronous or wait is False.
    :type timeout: float
    :returns:
        if green_mode is Synchronous or wait is True:
            :class:`~PyTango.AttributeProxy`
        else if green_mode is Futures:
            :class:`concurrent.futures.Future`
        else if green_mode is Gevent:
            :class:`gevent.event.AsynchResult`
    :throws:
        * a *DevFailed* if green_mode is Synchronous or wait is True 
          and there is an error creating the attribute.
        * a *concurrent.futures.TimeoutError* if green_mode is Futures,
          wait is False, timeout is not None and the time to create the attribute
          has expired.                            
        * a *gevent.timeout.Timeout* if green_mode is Gevent, wait is False,
          timeout is not None and the time to create the attribute has expired.
    
    New in PyTango 8.1.0
    """
    # we cannot use the green wrapper because it consumes the green_mode and we
    # want to forward it to the DeviceProxy constructor
    green_mode = kwargs.get('green_mode', get_green_mode())
    wait = kwargs.pop('wait', True)
    timeout = kwargs.pop('timeout', None)
    
    d = submit(green_mode, AttributeProxy, *args, **kwargs)
    return result(d, green_mode, wait=wait, timeout=timeout)

def __AttributeProxy__get_property(self, propname, value=None):
    """
    get_property(self, propname, value) -> DbData
    
            Get a (list) property(ies) for an attribute.

            This method accepts the following types as propname parameter:
            1. string [in] - single property data to be fetched
            2. sequence<string> [in] - several property data to be fetched
            3. PyTango.DbDatum [in] - single property data to be fetched
            4. PyTango.DbData [in,out] - several property data to be fetched.
            5. sequence<DbDatum> - several property data to be feteched

            Note: for cases 3, 4 and 5 the 'value' parameter if given, is IGNORED.

            If value is given it must be a PyTango.DbData that will be filled with the
            property values

        Parameters :
            - propname : (str) property(ies) name(s)
            - value : (PyTango.DbData) (optional, default is None meaning that the
                      method will create internally a PyTango.DbData and return
                      it filled with the property values

        Return     : (DbData) containing the property(ies) value(s). If a
                     PyTango.DbData is given as parameter, it returns the same
                     object otherwise a new PyTango.DbData is returned

        Throws     : NonDbDevice, ConnectionFailed (with database),
                     CommunicationFailed (with database),
                     DevFailed from database device
    """

    if is_pure_str(propname) or isinstance(propname, StdStringVector):
        new_value = value
        if new_value is None:
            new_value = DbData()
        self._get_property(propname, new_value)
        return DbData_2_dict(new_value)
    elif isinstance(propname, DbDatum):
        new_value = DbData()
        new_value.append(propname)
        self._get_property(new_value)
        return DbData_2_dict(new_value)
    elif isinstance(propname, collections.Sequence):
        if isinstance(propname, DbData):
            self._get_property(propname)
            return DbData_2_dict(propname)

        if is_pure_str(propname[0]):
            new_propname = StdStringVector()
            for i in propname: new_propname.append(i)
            new_value = value
            if new_value is None:
                new_value = DbData()
            self._get_property(new_propname, new_value)
            return DbData_2_dict(new_value)
        elif isinstance(propname[0], DbDatum):
            new_value = DbData()
            for i in propname: new_value.append(i)
            self._get_property(new_value)
            return DbData_2_dict(new_value)

def __AttributeProxy__put_property(self, value):
    """
    put_property(self, value) -> None
    
            Insert or update a list of properties for this attribute.
            This method accepts the following types as value parameter:
            1. PyTango.DbDatum - single property data to be inserted
            2. PyTango.DbData - several property data to be inserted
            3. sequence<DbDatum> - several property data to be inserted
            4. dict<str, DbDatum> - keys are property names and value has data to be inserted
            5. dict<str, seq<str>> - keys are property names and value has data to be inserted
            6. dict<str, obj> - keys are property names and str(obj) is property value

        Parameters :
            - value : can be one of the following:
                1. PyTango.DbDatum - single property data to be inserted
                2. PyTango.DbData - several property data to be inserted
                3. sequence<DbDatum> - several property data to be inserted
                4. dict<str, DbDatum> - keys are property names and value has data to be inserted
                5. dict<str, seq<str>> - keys are property names and value has data to be inserted
                6. dict<str, obj> - keys are property names and str(obj) is property value

        Return     : None

        Throws     : ConnectionFailed, CommunicationFailed
                     DevFailed from device (DB_SQLError)
    """
    if isinstance(value, DbData):
        pass
    elif isinstance(value, DbDatum):
        new_value = DbData()
        new_value.append(value)
        value = new_value
    elif is_non_str_seq(value):
        new_value = seq_2_DbData(value)
    elif isinstance(value, collections.Mapping):
        new_value = DbData()
        for k, v in value.items():
            if isinstance(v, DbDatum):
                new_value.append(v)
                continue
            db_datum = DbDatum(k)
            if is_non_str_seq(v):
                seq_2_StdStringVector(v, db_datum.value_string)
            else:
                db_datum.value_string.append(str(v))
            new_value.append(db_datum)
        value = new_value
    else:
        raise TypeError('value must be a PyTango.DbDatum, PyTango.DbData,'\
                        'a sequence<DbDatum> or a dictionary')
    return self._put_property(value)

def __AttributeProxy__delete_property(self, value):
    """
    delete_property(self, value) -> None
    
        Delete a the given of properties for this attribute.
        This method accepts the following types as value parameter:
        
            1. string [in] - single property to be deleted
            2. PyTango.DbDatum [in] - single property data to be deleted
            3. PyTango.DbData [in] - several property data to be deleted
            4. sequence<string> [in]- several property data to be deleted
            5. sequence<DbDatum> [in] - several property data to be deleted
            6. dict<str, obj> [in] - keys are property names to be deleted
               (values are ignored)
            7. dict<str, DbDatum> [in] - several DbDatum.name are property names
               to be deleted (keys are ignored)
        
        Parameters :
            - value : can be one of the following:

                1. string [in] - single property data to be deleted
                2. PyTango.DbDatum [in] - single property data to be deleted
                3. PyTango.DbData [in] - several property data to be deleted
                4. sequence<string> [in]- several property data to be deleted
                5. sequence<DbDatum> [in] - several property data to be deleted
                6. dict<str, obj> [in] - keys are property names to be deleted
                   (values are ignored)
                7. dict<str, DbDatum> [in] - several DbDatum.name are property
                   names to be deleted (keys are ignored)
        
        Return     : None

        Throws     : ConnectionFailed, CommunicationFailed
                    DevFailed from device (DB_SQLError)
    """
    if isinstance(value, DbData) or isinstance(value, StdStringVector) or \
       is_pure_str(value):
        new_value = value
    elif isinstance(value, DbDatum):
        new_value = DbData()
        new_value.append(value)
    elif isinstance(value, collections.Sequence):
        new_value = DbData()
        for e in value:
            if isinstance(e, DbDatum):
                new_value.append(e)
            else:
                new_value.append(DbDatum(str(e)))
    elif isinstance(value, collections.Mapping):
        new_value = DbData()
        for k, v in value.items():
            if isinstance(v, DbDatum):
                new_value.append(v)
            else:
                new_value.append(DbDatum(k))
    else:
        raise TypeError('value must be a string, PyTango.DbDatum, '\
                        'PyTango.DbData, a sequence or a dictionary')

    return self._delete_property(new_value)

# It is easier to reimplement AttributeProxy in python using DeviceProxy than
# wrapping C++ AttributeProxy. However I still rely in the original
# AttributeProxy for the constructor (parsing strings if necessary) and some
# other things. With the _method_* functions defined later it is really easy.
# One reason to do it this way: get_device_proxy() will always return the
# same PyTango.DeviceProxy with this implementation. And then we can trust
# it's automatic event unsubscription to handle events.
class AttributeProxy(object):
    """
        AttributeProxy is the high level Tango object which provides the
        client with an easy-to-use interface to TANGO attributes.
        
        To create an AttributeProxy, a complete attribute name must be set
        in the object constructor.
        
        Example:
            att = AttributeProxy("tango/tangotest/1/long_scalar")

        Note: PyTango implementation of AttributeProxy is in part a
        python reimplementation of the AttributeProxy found on the C++ API.
    """
    def __init__(self, *args, **kwds):
        green_mode = kwds.pop('green_mode', get_green_mode())
        self.__attr_proxy = _AttributeProxy(*args, **kwds)
        # get_device_proxy() returns a different python object each time
        # we don't want a different object, so we save the current one.
        self.__dev_proxy = dp = self.__attr_proxy.get_device_proxy()
        dp.set_green_mode(green_mode)

    def get_device_proxy(self):
        """
        get_device_proxy(self) -> DeviceProxy
        
                A method which returns the device associated to the attribute
        
            Parameters : None
            
            Return     : (DeviceProxy)
        """
        return self.__dev_proxy

    def name(self):
        """
        name(self) -> str
            
                Returns the attribute name
                
            Parameters : None
            Return     : (str) with the attribute name
        """
        return self.__attr_proxy.name()

    def __str__(self):
        return "AttributeProxy(%s)" % self.name()

    def __repr__(self):
        return "AttributeProxy(%s)" % self.name()

def _method_dev_and_name(dp_fn_name, doc=True):
    def __new_fn(self, *args, **kwds):
        return getattr(self._AttributeProxy__dev_proxy, dp_fn_name)(self.name(), *args, **kwds)
    if doc:
        __new_fn.__doc__ =  "This method is a simple way to do:\n" + \
                            "\tself.get_device_proxy()."+dp_fn_name+ \
                            "(self.name(), ...)\n\n" + \
                            "For convenience, here is the documentation of DeviceProxy." + \
                            dp_fn_name + "(...):\n" + \
                            str(getattr(DeviceProxy, dp_fn_name).__doc__)
    __new_fn.__name__ = dp_fn_name
    return __new_fn

def _method_device(dp_fn_name, doc=True):
    def __new_fn(self, *args, **kwds):
        return getattr(self._AttributeProxy__dev_proxy, dp_fn_name)(*args, **kwds)
    if doc:
        __new_fn.__doc__ =  "This method is a simple way to do:\n" + \
                            "\tself.get_device_proxy()."+dp_fn_name+ \
                            "(...)\n\n" + \
                            "For convenience, here is the documentation of DeviceProxy." + \
                            dp_fn_name + "(...):\n" + \
                            str(getattr(DeviceProxy, dp_fn_name).__doc__)
    __new_fn.__name__ = dp_fn_name
    return __new_fn

def _method_attribute(dp_fn_name, doc=True):
    def __new_fn(self, *args, **kwds):
        return getattr(self._AttributeProxy__attr_proxy, dp_fn_name)(*args, **kwds)
    if doc:
        __new_fn.__doc__ =  getattr(_AttributeProxy, dp_fn_name).__doc__
    __new_fn.__name__ = dp_fn_name
    return __new_fn

def __init_AttributeProxy(doc=True):

    _AttributeProxy.get_property        = __AttributeProxy__get_property
    _AttributeProxy.put_property        = __AttributeProxy__put_property
    _AttributeProxy.delete_property     = __AttributeProxy__delete_property
    
    # General methods
    #AttributeProxy.name                manually defined
    AttributeProxy.status               = _method_device('status', doc=doc)
    AttributeProxy.state                = _method_device('state', doc=doc)
    AttributeProxy.ping                 = _method_device('ping', doc=doc)
    AttributeProxy.get_transparency_reconnection=_method_device('get_transparency_reconnection', doc=doc)
    AttributeProxy.set_transparency_reconnection=_method_device('set_transparency_reconnection', doc=doc)
    
    # Property methods
    AttributeProxy.get_property         = _method_attribute('get_property', doc=doc)
    AttributeProxy.put_property         = _method_attribute('put_property', doc=doc)
    AttributeProxy.delete_property      = _method_attribute('delete_property', doc=doc)
    
    # Attribute methods
    AttributeProxy.get_config           = _method_dev_and_name('get_attribute_config', doc=doc)
    AttributeProxy.set_config           = _method_device('set_attribute_config', doc=doc)
    
    AttributeProxy.write                = _method_dev_and_name('write_attribute', doc=doc)
    AttributeProxy.read                 = _method_dev_and_name('read_attribute', doc=doc)
    AttributeProxy.write_read           = _method_dev_and_name('write_read_attribute', doc=doc)

    # History methods...
    AttributeProxy.history              = _method_dev_and_name('attribute_history', doc=doc)

    # Polling administration methods
    AttributeProxy.poll                 = _method_dev_and_name('poll_attribute', doc=doc)
    AttributeProxy.get_poll_period      = _method_dev_and_name('get_attribute_poll_period', doc=doc)
    AttributeProxy.is_polled            = _method_dev_and_name('is_attribute_polled', doc=doc)
    AttributeProxy.stop_poll            = _method_dev_and_name('stop_poll_attribute', doc=doc)

    # Asynchronous methods
    AttributeProxy.read_asynch          = _method_dev_and_name('read_attribute_asynch', doc=doc)
    AttributeProxy.read_reply           = _method_device('read_attribute_reply', doc=doc)
    AttributeProxy.write_asynch         = _method_device('write_attribute_asynch', doc=doc)
    AttributeProxy.write_reply          = _method_device('write_attribute_reply', doc=doc)

    # Event methods
    AttributeProxy.subscribe_event      = _method_dev_and_name('subscribe_event', doc=doc)
    AttributeProxy.unsubscribe_event    = _method_device('unsubscribe_event', doc=doc)

    AttributeProxy.get_events           = _method_device('get_events', doc=doc)
    AttributeProxy.event_queue_size     = _method_device('event_queue_size', doc=doc)
    AttributeProxy.get_last_event_date  = _method_device('get_last_event_date', doc=doc)
    AttributeProxy.is_event_queue_empty = _method_device('is_event_queue_empty', doc=doc)

def attribute_proxy_init(doc=True):
    __init_AttributeProxy(doc=doc)