1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 """
16 Module implementing the "macro" dictionary class
17 """
18
19 import re
20
21 from conary.build.errors import MacroKeyError
22
24 - def __init__(self, macros={}, shadow=False, ignoreUnknown=False):
25 self.__tracked = {}
26 self.__track = False
27 self.__overrides = {}
28 self.__callbacks = {}
29 self.__ignoreUnknown = ignoreUnknown
30 if shadow:
31 self.__macros = macros
32 else:
33 self.__macros = {}
34 self.update(macros)
35
36 - def _get(self, key):
38
40 if isinstance(other, dict):
41 for key, item in other.iteritems():
42 self[key] = item
43 else:
44 for key, item in other:
45 self[key] = item
46
48 """ Add a callback to a particular macros. When that macro is
49 accessed, the callback function will be called with that macro's
50 name as an argument
51 """
52 self.__callbacks[name] = callback
53
55 del self.__callbacks[name]
56
74
75
76
77
78
80 self.__overrides[key] = value
81 self[key] = value
82
85
87 if name.startswith('_Macros'):
88 return dict.__getitem__(self, name)
89 repmethod = None
90 parts = name.split('.', 1)
91 if len(parts) > 1:
92 repmethod = parts[1]
93 name = parts[0]
94 if name in self.__callbacks:
95 self.__callbacks[name](name)
96 if name in self.__overrides:
97 return self.__repmethod(self.__overrides[name], repmethod)
98 if not name in self:
99
100 try:
101 value = self.__macros[name]
102 except KeyError:
103
104
105 if self.__ignoreUnknown:
106 return ''
107 raise MacroKeyError(name)
108
109 value = self.__macros[name]
110 self[name] = value
111 return self.__repmethod(value, repmethod)
112 else:
113 return self.__repmethod(dict.__getitem__(self, name) % self, repmethod)
114
116 if repmethod is None:
117 return name
118 if repmethod == 'literalRegex':
119 return re.escape(name)
120
121 raise MacroError, 'unknown representation method %s for %s' %(repmethod, name)
122
125
128
130 return self.__tracked.keys()
131
132 - def copy(self, shadow=True):
137
138
139
141 if self.__macros:
142
143
144 for key in self.__macros.keys():
145 dummy = self[key]
146 self.__macros = {}
147
156
160
164
168
171
172
182