Improve script handling.

- Display output in external viewer when script exits with error.

- Add a "changed" indicator to show if a request can be reverted.
This commit is contained in:
Aldo Cortesi 2011-02-02 11:44:28 +13:00
parent 8d37ff81e6
commit db99da6af5
3 changed files with 35 additions and 4 deletions

View File

@ -61,8 +61,11 @@ def format_flow(f, focus, padding=3):
] ]
if f.response or f.error or f.is_replay(): if f.response or f.error or f.is_replay():
txt.append("\n" + " "*(padding+2)) txt.append("\n" + " "*(padding+2))
met = ""
if f.is_replay(): if f.is_replay():
txt.append(("method", "[replay] ")) txt.append(("method", "[replay] "))
elif f.modified():
txt.append(("method", "[edited] "))
if not (f.response or f.error): if not (f.response or f.error):
txt.append(("text", "waiting for response...")) txt.append(("text", "waiting for response..."))
@ -504,6 +507,9 @@ class ConnectionView(WWrap):
try: try:
newflow, serr = self.flow.run_script(path) newflow, serr = self.flow.run_script(path)
except flow.RunException, e: except flow.RunException, e:
if e.errout:
serr = "Script error code: %s\n\n"%e.returncode + e.errout
self.master.spawn_external_viewer(serr, None)
self.master.statusbar.message("Script error: %s"%e) self.master.statusbar.message("Script error: %s"%e)
return return
if serr: if serr:

View File

@ -6,7 +6,12 @@ import subprocess, base64, sys
from contrib import bson from contrib import bson
import proxy, threading import proxy, threading
class RunException(Exception): pass class RunException(Exception):
def __init__(self, msg, returncode, errout):
Exception.__init__(self, msg)
self.returncode = returncode
self.errout = errout
class ReplayConnection: class ReplayConnection:
pass pass
@ -58,6 +63,7 @@ class Flow:
Returns a (flow, stderr output) tuple, or raises RunException if Returns a (flow, stderr output) tuple, or raises RunException if
there's an error. there's an error.
""" """
self.backup()
data = self.script_serialize() data = self.script_serialize()
try: try:
p = subprocess.Popen( p = subprocess.Popen(
@ -67,13 +73,21 @@ class Flow:
stderr=subprocess.PIPE, stderr=subprocess.PIPE,
) )
except OSError, e: except OSError, e:
raise RunException(e.args[1]) raise RunException(e.args[1], None, None)
so, se = p.communicate(data) so, se = p.communicate(data)
if p.returncode: if p.returncode:
raise RunException("Script returned error code %s"%p.returncode) raise RunException(
"Script returned error code %s"%p.returncode,
p.returncode,
se
)
f = Flow.script_deserialize(so) f = Flow.script_deserialize(so)
if not f: if not f:
raise RunException("Invalid response from script.") raise RunException(
"Invalid response from script.",
p.returncode,
se
)
return f, se return f, se
def dump(self): def dump(self):
@ -106,6 +120,14 @@ class Flow:
def __eq__(self, other): def __eq__(self, other):
return self.get_state() == other.get_state() return self.get_state() == other.get_state()
def modified(self):
# FIXME: Save a serialization in backup, compare current with
# backup to detect if flow has _really_ been modified.
if self._backup:
return True
else:
return False
def backup(self): def backup(self):
if not self._backup: if not self._backup:
self._backup = [ self._backup = [
@ -119,6 +141,7 @@ class Flow:
if self._backup: if self._backup:
restore = [i.copy() if i else None for i in self._backup] restore = [i.copy() if i else None for i in self._backup]
self.connection, self.request, self.response, self.error = restore self.connection, self.request, self.response, self.error = restore
self._backup = None
def match(self, pattern): def match(self, pattern):
if pattern: if pattern:

View File

@ -28,7 +28,9 @@ class uFlow(libpry.AutoTree):
def test_backup(self): def test_backup(self):
f = utils.tflow() f = utils.tflow()
assert not f.modified()
f.backup() f.backup()
assert f.modified()
f.revert() f.revert()
def test_getset_state(self): def test_getset_state(self):