mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Django debug: set value implemented (PY-3418).
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user