[py-svn] r34089 - in py/dist/py/apigen: rest tracer tracer/testing

fijal at codespeak.net fijal at codespeak.net
Fri Nov 3 11:38:48 CET 2006


Author: fijal
Date: Fri Nov  3 11:38:47 2006
New Revision: 34089

Modified:
   py/dist/py/apigen/rest/genrest.py
   py/dist/py/apigen/tracer/description.py
   py/dist/py/apigen/tracer/testing/test_docgen.py
Log:
(guido, fijal) - Intermediate checkin of somehow changing semantics of __dict__ monitoring.


Modified: py/dist/py/apigen/rest/genrest.py
==============================================================================
--- py/dist/py/apigen/rest/genrest.py	(original)
+++ py/dist/py/apigen/rest/genrest.py	Fri Nov  3 11:38:47 2006
@@ -390,7 +390,10 @@
                 tbrest.append(Paragraph(Link(linkname, linktarget)))
             else:
                 tbrest.append(Paragraph(linkname))
-            source = line.code.source()
+            try:
+                source = line.code.source()
+            except IOError:
+                source = "*Cannot get source*"
             mangled = []
             for i, sline in enumerate(str(source).split('\n')):
                 if i == lineno:

Modified: py/dist/py/apigen/tracer/description.py
==============================================================================
--- py/dist/py/apigen/tracer/description.py	(original)
+++ py/dist/py/apigen/tracer/description.py	Fri Nov  3 11:38:47 2006
@@ -4,6 +4,7 @@
 
 import types
 import inspect
+import copy
 
 MAX_CALL_SITES = 20
 
@@ -42,9 +43,6 @@
     def __cmp__(self, other):
         return cmp(self._getval(), other._getval())
 
-class NoValue(object):
-    """used in MethodDesc.get_local_changes() when there is no value"""
-
 def cut_stack(stack, frame, upward_frame=None):
     if hasattr(frame, 'raw'):
         frame = frame.raw
@@ -234,7 +232,7 @@
     def __init__(self, *args, **kwargs):
         super(MethodDesc, self).__init__(*args, **kwargs)
         self.old_dict = {}
-        self.new_dict = {}
+        self.changeset = {}
 
     # right now it's not different than method desc, only code is different
     def getcode(self):
@@ -245,28 +243,47 @@
 
     def consider_start_locals(self, frame):
         # XXX recursion issues?
-        obj = frame.f_locals.get('self')
-        if not obj:
-            # static method
+        obj = frame.f_locals[self.pyobj.im_func.func_code.co_varnames[0]]
+        try:
+            if not obj:
+                # static method
+                return
+        except AttributeError:
             return
-        self.old_dict = obj.__dict__.copy()
+        #self.old_dict = self.perform_dict_copy(obj.__dict__)
+        self.old_dict = copy.deepcopy(obj.__dict__)
 
     def consider_end_locals(self, frame):
-        obj = frame.f_locals.get('self')
-        if not obj:
-            # static method
+        obj = frame.f_locals[self.pyobj.im_func.func_code.co_varnames[0]]
+        try:
+            if not obj:
+                # static method
+                return
+        except AttributeError:
             return
-        self.new_dict = obj.__dict__.copy()
+        # store the local changes
+        # update self.changeset
+        self.update_changeset(obj.__dict__)
 
     def get_local_changes(self):
-        changeset = {}
+        return self.changeset
+    
+    def set_changeset(changeset, key, value):
+        if key not in changeset:
+            changeset[key] = set([value])
+        else:
+            changeset[key].add(value)
+    set_changeset = staticmethod(set_changeset)
+    
+    def update_changeset(self, new_dict):
+        changeset = self.changeset
         for k, v in self.old_dict.iteritems():
-            if k not in self.new_dict:
-                changeset[k] = (v, NoValue)
-            elif self.new_dict[k] != v:
-                changeset[k] = (v, self.new_dict[k])
-        for k, v in self.new_dict.iteritems():
+            if k not in new_dict:
+                self.set_changeset(changeset, k, "deleted")
+            elif new_dict[k] != v:
+                self.set_changeset(changeset, k, "changed")
+        for k, v in new_dict.iteritems():
             if k not in self.old_dict:
-                changeset[k] = (NoValue, v)
+                self.set_changeset(changeset, k, "created")
         return changeset
 

Modified: py/dist/py/apigen/tracer/testing/test_docgen.py
==============================================================================
--- py/dist/py/apigen/tracer/testing/test_docgen.py	(original)
+++ py/dist/py/apigen/tracer/testing/test_docgen.py	Fri Nov  3 11:38:47 2006
@@ -160,8 +160,8 @@
     t.end_tracing()
     desc = ds.descs['testclass']
     methdesc = desc.fields['bar']
-    assert methdesc.old_dict != methdesc.new_dict
-    assert methdesc.get_local_changes() == {'foo': (0, 1)}
+    #assert methdesc.old_dict != methdesc.new_dict
+    assert methdesc.get_local_changes() == {'foo': set(['changed'])}
 
 def test_local_changes_nochange():
     class testclass(object):
@@ -177,4 +177,3 @@
     desc = ds.descs['testclass']
     methdesc = desc.fields['bar']
     assert methdesc.get_local_changes() == {}
-



More information about the pytest-commit mailing list