[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