This file is indexed.

/usr/share/doc/python-traits/examples/tutorials/traits_4.0/delegation/delegation.py is in python-traits 4.1.0-1.

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
#  Copyright (c) 2007, Enthought, Inc.
#  License: BSD Style.

#--(Delegation Fixes and Improvements)------------------------------------------
"""
Delegation Fixes and Improvements
=================================

In previous versions of Traits there were a number of problems (i.e. bugs) in
the delegation support that made delegation virtually unusable in some
situations.

As a result, one of the primary goals of Traits 3.0 was to fix all known
problems with delegation, thus allowing it to reclaim its role as one of the
five keys pillars of the Traits package (those pillars being *initialization*,
*validation*, *notification*, *delegation* and *visualization*).

We are happy to report that not only have all known bugs been fixed, but a
previously unsupported, though often requested, feature has been added as well.

Delegation Event Notification
-----------------------------

Previously, many Traits users implicitly assumed that changes made to a
*delegatee* trait would generate a change notification on any *delegater* trait
(no matter how many such traits there might be). Unfortunately, this was not
the case.

However, starting with Traits 3.0, this feature has now been implemented. An
example of what this means is shown below::

    class Parent ( HasTraits ):

        first_name = Str
        last_name  = Str

    class Child ( HasTraits ):

        mother = Instance( Parent )
        father = Instance( Parent )

        first_name = Str
        last_name  = Delegate( 'father' )

In this example, we've created two classes, **Parent** and **Child**, and the
value of the **Child** class's *last_name* trait delegates its value to its
*father* object's *last_name* trait.

Next, we'll set up a simple set of test objects::

    mom = Parent( first_name = 'Julia', last_name = 'Wilson' )
    dad = Parent( first_name = 'William', last_name = 'Chase' )
    son = Child( mother = mom, father = dad, first_name = 'John' )

Finally, we'll set up a notification handler on the *son* object's *last_name*
trait and then try out various combinations of setting both the *father* and
*son* object's *last_name* trait to see in which cases the notification handler
is called::

    def name_changed ( name ):
        print 'Your last name has been changed to %s.' % name

    # Set up a change notification handler on the son's last name:
    son.on_trait_change( name_changed, 'last_name' )

    # This should cause the son's last name to change as well:
    print "Changing dad's last name to Jones."
    dad.last_name = 'Jones'

    # This change override's the father's last name for the son:
    print "Changing son's last name to Thomas."
    son.last_name = 'Thomas'

    # This should no longer have any effect on the son's last name:
    print "Changing dad's last name to Riley."
    dad.last_name = 'Riley'

    # Son decide's to revert his name back to his father's name:
    print "Reverting son's last name."
    del son.last_name

    # Now changing the father's name should affect the son again:
    print "Changing dad's last name to Simmons."
    dad.last_name = 'Simmons'

For the actual results of running this code, refer to the **Output** tab. Note
that for each case in which an explicit or implicit change is made to the *son*
object's *last_name* trait, a corresponding call is made to the change
notification handler.

"""
# FIXME - this need to be redone without traitsui

#--<Imports>--------------------------------------------------------------------

from traits.api import *

#--[Parent Class]---------------------------------------------------------------

class Parent ( HasTraits ):

    first_name = Str
    last_name  = Str

#--[Child Class]----------------------------------------------------------------

class Child ( HasTraits ):

    mother = Instance( Parent )
    father = Instance( Parent )

    first_name = Str
    last_name  = Delegate( 'father' )

#--[Example*]-------------------------------------------------------------------

mom = Parent( first_name = 'Julia', last_name = 'Wilson' )
dad = Parent( first_name = 'William', last_name = 'Chase' )
son = Child( mother = mom, father = dad, first_name = 'John' )

def name_changed ( name ):
    print 'Your last name has been changed to %s.' % name

# Set up a change notification handler on the son's last name:
son.on_trait_change( name_changed, 'last_name' )

# This should cause the son's last name to change as well:
print "Changing dad's last name to Jones."
dad.last_name = 'Jones'

# This change override's the father's last name for the son:
print "Changing son's last name to Thomas."
son.last_name = 'Thomas'

# This should no longer have any effect on the son's last name:
print "Changing dad's last name to Riley."
dad.last_name = 'Riley'

# Son decide's to revert his name back to his father's name:
print "Reverting son's last name."
del son.last_name

# Now changing the father's name should affect the son again:
print "Changing dad's last name to Simmons."
dad.last_name = 'Simmons'