Django debug: set value implemented (PY-3418).

This commit is contained in:
Dmitry Trofimov
2011-05-24 21:04:48 +04:00
parent 899b2ae7b0
commit 75bbd0ead8
3 changed files with 81 additions and 72 deletions
+1 -71
View File
@@ -1,4 +1,5 @@
import inspect
from django_frame import DjangoTemplateFrame, get_template_file_name, get_template_line
from pydevd_comm import CMD_SET_BREAK
from pydevd_constants import DJANGO_SUSPEND, GetThreadId
from pydevd_file_utils import NormFileToServer
@@ -6,77 +7,6 @@ from runfiles import DictContains
from pydevd_breakpoints import LineBreakpoint
import traceback
def get_source(frame):
try:
return frame.f_locals['self'].source
except:
return None
def get_template_file_name(frame):
try:
source = get_source(frame)
return source[0].name
except:
return None
def get_template_line(frame):
source = get_source(frame)
file_name = get_template_file_name(frame)
try:
return offset_to_line_number(read_file(file_name), source[1][0])
except:
return None
class DjangoTemplateFrame:
def __init__(self, frame):
file_name = get_template_file_name(frame)
context = frame.f_locals['context']
self.f_code = FCode('Django Template', file_name)
self.f_lineno = get_template_line(frame)
self.f_back = frame
self.f_globals = {}
self.f_locals = collect_context(context)
self.f_trace = None
class FCode:
def __init__(self, name, filename):
self.co_name = name
self.co_filename = filename
def collect_context(context):
res = {}
for d in context.dicts:
for k,v in d.items():
res[k] = v
return res
def read_file(filename):
f = open(filename, "r")
s = f.read()
f.close()
return s
def offset_to_line_number(text, offset):
curLine = 1
curOffset = 0
while curOffset < offset:
if curOffset == len(text):
return -1
c = text[curOffset]
if c == '\n':
curLine += 1
elif c == '\r':
curLine += 1
if curOffset < len(text) and text[curOffset + 1] == '\n':
curOffset += 1
curOffset += 1
return curLine
class DjangoLineBreakpoint(LineBreakpoint):
def __init__(self, type, file, line, flag, condition, func_name, expression):
self.file = file
+75
View File
@@ -0,0 +1,75 @@
def read_file(filename):
f = open(filename, "r")
s = f.read()
f.close()
return s
def offset_to_line_number(text, offset):
curLine = 1
curOffset = 0
while curOffset < offset:
if curOffset == len(text):
return -1
c = text[curOffset]
if c == '\n':
curLine += 1
elif c == '\r':
curLine += 1
if curOffset < len(text) and text[curOffset + 1] == '\n':
curOffset += 1
curOffset += 1
return curLine
def get_source(frame):
try:
return frame.f_locals['self'].source
except:
return None
def get_template_file_name(frame):
try:
source = get_source(frame)
return source[0].name
except:
return None
def get_template_line(frame):
source = get_source(frame)
file_name = get_template_file_name(frame)
try:
return offset_to_line_number(read_file(file_name), source[1][0])
except:
return None
class DjangoTemplateFrame:
def __init__(self, frame):
file_name = get_template_file_name(frame)
context = frame.f_locals['context']
self.f_code = FCode('Django Template', file_name)
self.f_lineno = get_template_line(frame)
self.f_back = frame
self.f_globals = {}
self.f_locals = self.collect_context(context)
self.f_trace = None
def collect_context(self, context):
res = {}
for d in context.dicts:
for k,v in d.items():
res[k] = v
return res
def changeVariable(self, name, value):
context = self.f_back.f_locals['context']
for d in context.dicts:
for k,v in d.items():
if k == name:
d[k] = value
class FCode:
def __init__(self, name, filename):
self.co_name = name
self.co_filename = filename
+5 -1
View File
@@ -2,13 +2,13 @@
resolution/conversion to XML.
"""
import pickle
from django_frame import DjangoTemplateFrame
from pydevd_constants import * #@UnusedWildImport
from types import * #@UnusedWildImport
from console import pydevconsole
from code import compile_command
from code import InteractiveInterpreter
try:
from StringIO import StringIO
except ImportError:
@@ -516,6 +516,10 @@ def changeAttrExpression(thread_id, frame_id, attr, expression):
'''
frame = findFrame(thread_id, frame_id)
if isinstance(frame, DjangoTemplateFrame):
result = eval(expression, frame.f_globals, frame.f_locals)
frame.changeVariable(attr, result)
try:
expression = expression.replace('@LINE@', '\n')
#tests (needs proposed patch in python accepted)