[z3-checkins] r26127 - z3/jsonserver/branch/merge/utils
reebalazs at codespeak.net
reebalazs at codespeak.net
Sat Apr 22 11:48:10 CEST 2006
Author: reebalazs
Date: Sat Apr 22 11:48:09 2006
New Revision: 26127
Modified:
z3/jsonserver/branch/merge/utils/tcpwatch
Log:
Add json support to tcpwatch
Modified: z3/jsonserver/branch/merge/utils/tcpwatch
==============================================================================
--- z3/jsonserver/branch/merge/utils/tcpwatch (original)
+++ z3/jsonserver/branch/merge/utils/tcpwatch Sat Apr 22 11:48:09 2006
@@ -89,6 +89,134 @@
RECV_BUFFER_SIZE = 8192
show_cr = 0
+# Support for jsonic read
+# To use the json_read, minjson, zope.component and zope.interface
+# must be installable from the python level. If this does not happen,
+# we provide a simple conversion that however will not always work.
+try:
+ from minjson import read as json_read
+ # best to try these imports too, right away
+ import zope.component
+ import zope.interface
+except ImportError:
+ print "Could not import minjson, applying fallback function."
+ def json_read(txt):
+ class Null:
+ def __repr__(self):
+ return 'null'
+ class True:
+ def __repr__(self):
+ return 'true'
+ class False:
+ def __repr__(self):
+ return 'false'
+ return eval(txt, {'null': Null(), 'true': True(), 'false': False()}, {})
+
+def json_prettify(line):
+ # Try to prettify JSON output
+ # return None if unsuccesful
+ try:
+ ob = json_read(line)
+ except:
+ pass
+ else:
+ stream = StringIO()
+ writer = Writer(stream)
+ prettify(writer, ob)
+ return stream.getvalue()
+
+# --
+# Prettifyer
+# --
+
+import re
+from textwrap import dedent
+from cStringIO import StringIO
+
+class Writer:
+
+ def __init__(self, stream, baseindent=4):
+ self.stream = stream
+ self.indent = 0
+ self.baseindent = baseindent
+ self.isnewline = True
+ self.nrnewlines = 0
+
+ re_multi = re.compile(r'(\n)')
+
+ def write(self, txt, keepindents=False):
+ if self.isnewline:
+ self.stream.write('\n' * self.nrnewlines)
+ self.stream.write(' ' * self.indent)
+ self.isnewline = False
+ self.nrnewlines = 0
+ else:
+ # if a continuation line, then we always keep indents.
+ keepindents = True
+ if not keepindents:
+ # (new lines are getting dedented, continuations not.)
+ txt = dedent(txt)
+ # see if there are more lines
+ lines = self.re_multi.split(txt)
+ if len(lines) > 1:
+ # more lines
+ for line in lines:
+ if line == '\n':
+ self.newline()
+ else:
+ self.write(line, keepindents=True)
+ else:
+ # single line
+ self.stream.write(txt)
+
+ def newline(self):
+ self.isnewline = True
+ self.nrnewlines += 1
+
+ def indenton(self, levels=1):
+ self.indent += self.baseindent * levels
+
+ def indentoff(self, levels=1):
+ self.indent -= self.baseindent * levels
+
+ def add_remark(self, text, remark, pos=65):
+ if remark is not None:
+ # remark will be indented to position, or later if text is longer.
+ return text.ljust(pos - 2 - self.indent) + ' # ' + remark
+ else:
+ return text
+
+def prettify(writer, value):
+ if isinstance(value, (list, tuple)):
+ writer.indenton()
+ if isinstance(value, list):
+ writer.write('[')
+ else:
+ writer.write('(')
+ writer.newline()
+ for elem in value:
+ prettify(writer, elem)
+ writer.write(',')
+ writer.newline()
+ if isinstance(value, list):
+ writer.write(']')
+ else:
+ writer.write(')')
+ writer.indentoff()
+ elif isinstance(value, dict):
+ writer.indenton()
+ writer.write('{')
+ writer.newline()
+ for k, v in value.iteritems():
+ prettify(writer, k)
+ writer.write(': ')
+ prettify(writer, v)
+ writer.write(',')
+ writer.newline()
+ writer.write('}')
+ writer.indentoff()
+ else:
+ writer.write(repr(value))
#############################################################################
#
@@ -347,6 +475,18 @@
data = data.replace('\r', '')
lines = data.split('\n')
lines = map(escape, lines)
+ # Try to prettify JSON output
+ if lines:
+ result = json_prettify(lines[-1])
+ if result:
+ if getattr(self, '_colorized', True):
+ if from_client:
+ result = '\x1b[0;32m' + result + '\x1b[0m'
+ else:
+ result = '\x1b[0;31m' + result + '\x1b[0m'
+ del lines[-1]
+ lines.extend(result.splitlines())
+
s = ('\n%s' % arrow).join(lines)
self.write(s)
@@ -520,6 +660,8 @@
self.textbox.tag_config("server", foreground="#770000")
self.textbox.tag_config(
"serveresc", foreground="#770000", background="#dddddd")
+ self.textbox.tag_config("clientjson", foreground="#00dd00")
+ self.textbox.tag_config("serverjson", foreground="#dd0000")
self.textbox.insert(Tkinter.END, startup_text, "message")
self.textbox.pack(side='right', fill=Tkinter.BOTH, expand=1)
self.pack(fill=Tkinter.BOTH, expand=1)
@@ -627,6 +769,17 @@
else:
segments.append(ss)
+
+ # Try to prettify JSON output
+ jsondata = None
+ if data:
+ lines = data.splitlines()
+ result = json_prettify(lines[-1])
+ if result:
+ data = '\n'.join(lines[:-1]) + '\n'
+ jsondata = result + '\n'
+ print data
+
# Escape the input data.
was_escaped = 0
start_idx = 0
@@ -646,6 +799,10 @@
if not extra_color:
output.append((''.join(segments),
from_client and 'client' or 'server'))
+
+ # Append the json data
+ if jsondata:
+ output.append((jsondata, from_client and 'clientjson' or 'serverjson'))
# Send output to the frame.
self._output.extend(output)
More information about the z3-checkins
mailing list