source: branch/logging/log.py @ 1477

Last change on this file since 1477 was 1477, checked in by toby, 7 years ago

variable change logging finally works

  • Property svn:eol-style set to native
File size: 10.2 KB
Line 
1'Module to provide logging services'
2import wx
3G2loggingData = {}
4G2logList = [None]
5
6class VarLogEntry(object):
7    def __init__(self,treeRefs,indexRefs,value):
8        self.treeRefs = treeRefs
9        self.indexRefs = indexRefs
10        self.value = value
11
12def LogVarChange(result,key):
13    if hasattr(result,'treeRefs'):
14        lastLog = G2logList[-1]
15        fullrefs = result.indexRefs+[key]
16        if type(lastLog) is VarLogEntry:
17            if lastLog.treeRefs == result.treeRefs and lastLog.indexRefs == fullrefs:
18                lastLog.value = result[key]
19                print 'update last to ',result[key]
20                return
21        G2logList.append(VarLogEntry(result.treeRefs,fullrefs,result[key]))
22        print 'treeRefs',result.treeRefs,'indexRefs',fullrefs,'new value=',result[key]
23    else:
24        print key,'no provenance'
25
26class G2TreeCtrl(wx.TreeCtrl):
27    '''Create a wrapper around the standard TreeCtrl so we can "trap"
28    various events'''
29    def __init__(self,parent=None,*args,**kwargs):
30        super(self.__class__,self).__init__(parent=parent,*args,**kwargs)
31        G2loggingData['frame'] = parent.GetParent()
32        G2loggingData['tree'] = self
33        G2loggingData['root'] = self.root = self.AddRoot('Loaded Data: ')
34
35    def GetItemPyData(self,*args,**kwargs):
36        data = super(self.__class__,self).GetItemPyData(*args,**kwargs)
37        item = args[0]
38        textlist = [self.GetItemText(item)]
39        parent = self.GetItemParent(item)
40        while parent:
41            if parent == G2loggingData['root']: break
42            textlist.insert(0,self.GetItemText(parent))
43            parent = self.GetItemParent(parent)
44        #print 'GetItemPyData from ',textlist,
45        #data._treeorigin = textlist
46        #print type(data)
47        if type(data) is dict:
48            #print 'dict'
49            return dictLogged(data,textlist)
50            #return data
51        if type(data) is list:
52            #print 'list'
53            return listLogged(data,textlist)
54        if type(data) is tuple:
55            return listLogged(list(data),textlist)
56        #print 'other'
57        return data
58
59# class loggedDict(object):
60#     def __init__(self,dictobj,treeRefs,indexRefs=[]):
61#         self.treeRefs = treeRefs
62#         self.indexRefs = indexRefs
63#         self.obj = dictobj
64
65#     def __getitem__(self,*args,**kwargs):
66#         print 'getitem',args,kwargs,'...',
67#         val = self.obj.__getitem__(*args,**kwargs)
68# #        if type(val) is dict and len(args) == 1:
69# #            print 'dict'
70# #            return loggedDict(val,self.treeRefs,self.indexRefs+[args[0]])
71# #        elif type(val) is list and len(args) == 1:
72# #            print 'list'
73# #            return loggedList(val,self.treeRefs,self.indexRefs+[args[0]])
74# #        else:
75# #            print type(val),val
76# #            return val
77#         return val
78#     def get(self,*args,**kwargs):
79#         print 'get',args,kwargs
80#         val = self.obj.get(*args,**kwargs)
81#         if val is None: return None
82#         return self.__getitem__(*args,**kwargs)
83#     def __setitem__(self,*args,**kwargs):
84#         self.obj.__setitem__(*args,**kwargs)
85
86       
87#     def __repr__(self):
88#         return "loggedDict with "+str(len(self.obj))+" members; from "+str(self.treeRefs)+" indexed by "+str(self.indexRefs)
89
90#     def __str__(self):
91#         return str(self.obj)
92
93#     def clear(self,*args,**kwargs):
94#         return self.obj.clear(*args,**kwargs)
95#     def copy(self,*args,**kwargs):
96#         return self.obj.copy(*args,**kwargs)
97#     def fromkeys(self,*args,**kwargs):
98#         return self.obj.fromkey(*args,**kwargs)
99#     def has_key(self,*args,**kwargs):
100#         return self.obj.has_key(*args,**kwargs)
101#     def items(self,*args,**kwargs):
102#         return self.obj.items(*args,**kwargs)
103#     def iteritems(self,*args,**kwargs):
104#         return self.obj.iteritems(*args,**kwargs)
105#     def iterkeys(self,*args,**kwargs):
106#         return self.obj.iterkeys(*args,**kwargs)
107#     def itervalues(self,*args,**kwargs):
108#         return self.obj.itervalues(*args,**kwargs)
109#     def keys(self,*args,**kwargs):
110#         return self.obj.keys(*args,**kwargs)
111#     def pop(self,*args,**kwargs):
112#         return self.obj.pop(*args,**kwargs)
113#     def popitem(self,*args,**kwargs):
114#         return self.obj.popitem(*args,**kwargs)
115#     def setdefault(self,*args,**kwargs):
116#         return self.obj.setdefault(*args,**kwargs)
117#     def update(self,*args,**kwargs):
118#         return self.obj.update(*args,**kwargs)
119#     def values(self,*args,**kwargs):
120#         return self.obj.values(*args,**kwargs)
121#     def viewitems(self,*args,**kwargs):
122#         return self.obj.viewitems(*args,**kwargs)
123#     def viewkeys(self,*args,**kwargs):
124#         return self.obj.viewkeys(*args,**kwargs)
125#     def viewvalues(self,*args,**kwargs):
126#         return self.obj.viewvalues(*args,**kwargs)
127
128   
129
130# class loggedList(object):
131#     def __init__(self,listobj,treeRefs,indexRefs=[]):
132#         self.treeRefs = treeRefs
133#         self.indexRefs = indexRefs
134#         self.obj = listobj
135
136#     def __getitem__(self,*args,**kwargs):
137#         print 'list getitem',args,kwargs,'...',
138#         val = self.obj.__getitem__(*args,**kwargs)
139#         # if type(val) is dict and len(args) == 1:
140#         #     print 'dict'
141#         #     return loggedDict(val,self.treeRefs,self.indexRefs+[args[0]])
142#         # elif type(val) is list and len(args) == 1:
143#         #     print 'list'
144#         #     return loggedList(val,self.treeRefs,self.indexRefs+[args[0]])
145#         # else:
146#         #     print type(val),val
147#         #     return val
148#         return val
149
150#     def __len__(self,*args,**kwargs):
151#         return self.obj.__len__(*args,**kwargs)
152
153#     def __setitem__(self,*args,**kwargs):
154#         return self.obj.__setitem__(*args,**kwargs)
155       
156#     def __repr__(self):
157#         return "loggedList with "+str(len(self.obj))+" members; from "+str(self.treeRefs)+" indexed by "+str(self.indexRefs)
158
159#     def __str__(self):
160#         return str(self.obj)
161
162###############
163def _wrapper(func):
164    def _wrapped(self, *args, **kwargs):
165        return getattr(self.obj, func)(*args, **kwargs)
166    return _wrapped
167
168class DictMeta(type):
169    def __new__(cls, name, bases, dct):
170        default_attrs = dir(object) + ['__getitem__', '__str__']
171        for attr in dir(dict):
172            if attr not in default_attrs:
173                dct[attr] = _wrapper(attr)
174        return type.__new__(cls, name, bases, dct)
175
176class dictLogged(object):
177    __metaclass__ = DictMeta
178
179    def __init__(self, obj, treeRefs, indexRefs=[]):
180        self.treeRefs = treeRefs
181        self.indexRefs = indexRefs
182        self.obj = obj
183
184    def __getitem__(self,key):
185        #print "logging", key,
186        val = self.obj.__getitem__(key)   
187        if type(val) is tuple:
188            print 'Converting to list',key
189            val = list(val)
190            self.obj[key] = val
191        if type(val) is dict:
192            #print 'dict'
193            return dictLogged(val,self.treeRefs,self.indexRefs+[key])
194        elif type(val) is list:
195            #print 'list'
196            return listLogged(val,self.treeRefs,self.indexRefs+[key])
197        elif type(val) is tuple:
198            print type(val),val
199            raise Exception
200            return val
201        else:
202            #print type(val)
203            return val
204#        return val
205
206    def __str__(self):
207        return self.obj.__str__() + " : " + str(self.treeRefs) + ',' + str(self.indexRefs)
208
209class ListMeta(type):
210    def __new__(cls, name, bases, dct):
211        default_attrs = dir(object) + ['__getitem__', '__str__']
212        for attr in dir(list):
213            if attr not in default_attrs:
214                dct[attr] = _wrapper(attr)
215        return type.__new__(cls, name, bases, dct)
216
217class listLogged(object):
218    __metaclass__ = ListMeta
219
220    def __init__(self, obj, treeRefs, indexRefs=[]):
221        self.treeRefs = treeRefs
222        self.indexRefs = indexRefs
223        self.obj = obj
224
225    def __getitem__(self,key):
226        #print "logging", key,
227        val = self.obj.__getitem__(key)   
228        if type(val) is tuple:
229            print 'Converting to list',key,
230            val = list(val)
231            self.obj[key] = val
232        if type(val) is dict:
233            #print 'dict'
234            return dictLogged(val,self.treeRefs,self.indexRefs+[key])
235        elif type(val) is list:
236            #print 'list'
237            return listLogged(val,self.treeRefs,self.indexRefs+[key])
238        elif type(val) is tuple:
239            print type(val),val
240            raise Exception
241        else:
242            #print type(val)
243            return val
244        return self.obj.__getitem__(key)   
245
246    def __str__(self):
247        return self.obj.__str__() + " : " + str(self.treeRefs) + ',' + str(self.indexRefs)
248###############
249
250   
251def SimTreeEvent(treekeylist):
252    # lookup key from list of items
253    parent = G2loggingData['root']
254    for txt in treekeylist:
255        item = GetPatternTreeItemId(G2loggingData['frame'],parent,txt)
256        if not item:
257            print 'Not found',txt
258            return
259        else:
260            parent = item
261    else:
262        print 'found',G2loggingData['tree'].GetItemText(item)
263        print item
264        #code = wx.EVT_TREE_SEL_CHANGED.typeId
265        #clickEvent = wx.TreeEvent(code, G2loggingData['tree'].GetId())
266        #print clickEvent
267        #clickEvent.SetItem(item)
268        #G2loggingData['tree'].GetEventHandler().ProcessEvent(clickEvent)
269    G2loggingData['tree'].SelectItem(item)   
270def SimTabPress(wintitle,tabname):
271    if G2loggingData['frame'].dataFrame.GetTitle() != wintitle:
272            print G2loggingData['frame'].dataFrame.GetTitle(),' != ','Phase Data for CuCr2O4'
273            raise Exception('tab in wrong window')
274    for PageNum in range(G2loggingData['frame'].dataDisplay.GetPageCount()):
275        if tabname == G2loggingData['frame'].dataDisplay.GetPageText(PageNum):
276            G2loggingData['frame'].dataDisplay.SetSelection(PageNum)
277            return
278    else:
279        print tabname,'not in',[
280            G2loggingData['frame'].dataDisplay.GetPageText(PageNum) for
281            PageNum in range(G2loggingData['frame'].dataDisplay.GetPageCount())]
282        raise Exception('tab not found')
283def LogTabPress(G2frame,page):
284    print 'Log page tab'
285    print G2frame.dataFrame.GetTitle() 
286    print G2frame.dataDisplay.GetPageText(page)
287       
Note: See TracBrowser for help on using the repository browser.