File: i_context_adapter.py

package info (click to toggle)
python-apptools 4.4.0-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,652 kB
  • sloc: python: 16,657; makefile: 77
file content (140 lines) | stat: -rw-r--r-- 4,667 bytes parent folder | download | duplicates (4)
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
#-------------------------------------------------------------------------------
#
#  Defines an adapter from an codetools.contexts.api.IContext
#  to an ITemplateDataContext.
#
#  Written by: David C. Morrill
#  Modified by: Robert Kern
#
#  Date: 11/16/2007
#
#  (c) Copyright 2007 by Enthought, Inc.
#
#-------------------------------------------------------------------------------

""" Defines an adapter from an codetools.contexts.api.IContext to an
    ITemplateDataContext.
"""

#-------------------------------------------------------------------------------
#  Imports:
#-------------------------------------------------------------------------------

from traits.api \
    import Adapter, Str, List, adapts

from traits.protocols.api \
    import AdaptationError, adapt

from codetools.contexts.api \
    import IContext

from apptools.template.itemplate_data_context \
    import ITemplateDataContext, ITemplateDataContextError

from helper \
    import path_for

#-------------------------------------------------------------------------------
#  'IContextAdapter' class:
#-------------------------------------------------------------------------------

class IContextAdapter ( Adapter ):
    """ Defines an adapter from an codetools.contexts.api.IContext
        to an ITemplateDataContext.
    """

    adapts( IContext, ITemplateDataContext )

    #-- ITemplateDataContext Interface Implementation --------------------------

    # The path to this data context (does not include the 'data_context_name'):
    data_context_path = Str

    # The name of the data context:
    data_context_name = Str

    # A list of the names of the data values in this context:
    data_context_values = List( Str )

    # The list of the names of the sub-contexts of this context:
    data_contexts = List( Str )

    def get_data_context_value ( self, name ):
        """ Returns the data value with the specified *name*. Raises a
            **ITemplateDataContextError** if *name* is not defined as a data
            value in the context.

            Parameters
            ----------
            name : A string specifying the name of the context data value to
                be returned.

            Returns
            -------
            The data value associated with *name* in the context. The type of
            the data is application dependent.

            Raises **ITemplateDataContextError** if *name* is not associated
            with a data value in the context.
        """
        try:
            if name in self.data_context_values:
                return self.adaptee[ name ]

            raise ITemplateDataContextError(
                      "No value named '%s' found." % name )
        except Exception, excp:
            raise ITemplateDataContextError( str( excp ) )

    def get_data_context ( self, name ):
        """ Returns the **ITemplateDataContext** value associated with the
            specified *name*. Raises **ITemplateDataContextError** if *name* is
            not defined as a data context in the context.

            Parameters
            ----------
            name : A string specifying the name of the data context to be
                returned.

            Returns
            -------
            The **ITemplateDataContext** associated with *name* in the context.

            Raises **ITemplateDataContextError** if *name* is not associated
            with a data context in the context.
        """
        try:
            if name in self.data_contexts:
                bdca = IContextAdapter( self.adaptee[ name ] )
                bdca.data_context_path = path_for( self.data_context_path,
                                                   self.data_context_name )
                return bdca

            raise ITemplateDataContextError(
                      "No context named '%s' found." % name )
        except Exception, excp:
            raise ITemplateDataContextError( str( excp ) )

    #-- Traits Event Handlers --------------------------------------------------

    def _adaptee_changed ( self, context ):
        """ Handles being bound to a IContext object.
        """
        self.data_context_name = context.name
        values   = []
        contexts = []
        for name in context.keys():
            value = context[ name ]
            try:
                adapt( value, IContext )
            except AdaptationError:
                # Is not a subcontext.
                values.append( name )
            else:
                # Is a subcontext.
                contexts.append( name )

        self.data_context_values = values
        self.data_contexts       = contexts