Author: Ronny Pfannschmidt <[email protected]>
Branch: 
Changeset: r186:34292f6ef484
Date: 2012-01-27 11:47 +0100
http://bitbucket.org/pypy/jitviewer/changeset/34292f6ef484/

Log:    shuffle around app code, so we have templates+static in the package

diff --git a/bin/jitviewer.py b/_jitviewer/app.py
copy from bin/jitviewer.py
copy to _jitviewer/app.py
--- a/bin/jitviewer.py
+++ b/_jitviewer/app.py
@@ -152,10 +152,8 @@
 
 
 class OverrideFlask(flask.Flask):
-    root_path = property(lambda self: self._root_path, lambda *args: None)
 
     def __init__(self, *args, **kwargs):
-        self._root_path = kwargs.pop('root_path')
         self.servers = []
         self.evil_monkeypatch()
         flask.Flask.__init__(self, *args, **kwargs)
@@ -172,7 +170,6 @@
         BaseServer.__init__ = __init__
 
 def main():
-    PATH = os.path.dirname(os.path.dirname((_jitviewer.__file__)))
     if not '__pypy__' in sys.builtin_module_names:
         print "Please run it using pypy-c"
         sys.exit(1)
@@ -195,7 +192,7 @@
     log, loops = import_log(filename, ParserWithHtmlRepr)
     parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
     storage.reconnect_loops(loops)
-    app = OverrideFlask('jitviewer', root_path=PATH)
+    app = OverrideFlask('_jitviewer')
     server = Server(filename, storage)
     app.debug = True
     app.route('/')(server.index)
diff --git a/static/DroidSansMono.ttf b/_jitviewer/static/DroidSansMono.ttf
rename from static/DroidSansMono.ttf
rename to _jitviewer/static/DroidSansMono.ttf
diff --git a/static/jquery-1.2.6.min.js b/_jitviewer/static/jquery-1.2.6.min.js
rename from static/jquery-1.2.6.min.js
rename to _jitviewer/static/jquery-1.2.6.min.js
diff --git a/static/jquery.min.js b/_jitviewer/static/jquery.min.js
rename from static/jquery.min.js
rename to _jitviewer/static/jquery.min.js
diff --git a/static/jquery.scrollTo-1.4.1.js 
b/_jitviewer/static/jquery.scrollTo-1.4.1.js
rename from static/jquery.scrollTo-1.4.1.js
rename to _jitviewer/static/jquery.scrollTo-1.4.1.js
diff --git a/static/jquery.scrollTo-1.4.2-min.js 
b/_jitviewer/static/jquery.scrollTo-1.4.2-min.js
rename from static/jquery.scrollTo-1.4.2-min.js
rename to _jitviewer/static/jquery.scrollTo-1.4.2-min.js
diff --git a/static/loop.js b/_jitviewer/static/loop.js
rename from static/loop.js
rename to _jitviewer/static/loop.js
diff --git a/static/pygments.css b/_jitviewer/static/pygments.css
rename from static/pygments.css
rename to _jitviewer/static/pygments.css
diff --git a/static/qt_workaround.css b/_jitviewer/static/qt_workaround.css
rename from static/qt_workaround.css
rename to _jitviewer/static/qt_workaround.css
diff --git a/static/script.js b/_jitviewer/static/script.js
rename from static/script.js
rename to _jitviewer/static/script.js
diff --git a/static/style.css b/_jitviewer/static/style.css
rename from static/style.css
rename to _jitviewer/static/style.css
diff --git a/templates/index.html b/_jitviewer/templates/index.html
rename from templates/index.html
rename to _jitviewer/templates/index.html
diff --git a/templates/loop.html b/_jitviewer/templates/loop.html
rename from templates/loop.html
rename to _jitviewer/templates/loop.html
diff --git a/bin/jitviewer.py b/bin/jitviewer.py
old mode 100755
new mode 100644
--- a/bin/jitviewer.py
+++ b/bin/jitviewer.py
@@ -1,241 +1,3 @@
 #!/usr/bin/env pypy
-""" A web-based browser of your log files. Run by
-
-    jitviewer.py <path to your log file> [port] [--qt]
-
-By default the script will run a web server, point your browser to
-http://localhost:5000
-
-If you pass --qt, this script will also start a lightweight PyQT/QWebKit based
-browser pointing at the jitviewer.  This assumes that CPython is installed in
-/usr/bin/python, and that PyQT with WebKit support is installed.
-
-Demo logfile available in this directory as 'log'.
-
-To produce the logfile for your program, run:
-
-    PYPYLOG=jit-log-opt,jit-backend-counts:mylogfile.log pypy myapp.py
-"""
-
-import sys
-import os.path
-
-try:
-    import _jitviewer
-except ImportError:
-    sys.path.insert(0, os.path.abspath(os.path.join(__file__, '..', '..')))
-
-try:
-    import pypy
-except ImportError:
-    import __pypy__
-    sys.path.append(os.path.join(__pypy__.__file__, '..', '..', '..'))
-    try:
-        import pypy
-    except ImportError:
-        raise ImportError('Could not import pypy module, make sure to '
-            'add the pypy module to PYTHONPATH')
-
-import jinja2
-if jinja2.__version__ < '2.6':
-    raise ImportError("Required jinja version is 2.6 (the git tip), older 
versions might segfault PyPy")
-
-import flask
-import inspect
-import threading
-import time
-from pypy.tool.logparser import extract_category
-from pypy.tool.jitlogparser.storage import LoopStorage
-from pypy.tool.jitlogparser.parser import adjust_bridges, import_log,\
-     parse_log_counts
-#
-from _jitviewer.parser import ParserWithHtmlRepr, FunctionHtml
-from _jitviewer.display import CodeRepr, CodeReprNoFile
-import _jitviewer
-
-CUTOFF = 30
-
-class CannotFindFile(Exception):
-    pass
-
-class DummyFunc(object):
-    def repr(self):
-        return '???'
-
-class Server(object):
-    def __init__(self, filename, storage):
-        self.filename = filename
-        self.storage = storage
-
-    def index(self):
-        all = flask.request.args.get('all', None)
-        loops = []
-        for index, loop in enumerate(self.storage.loops):
-            is_entry = False
-            try:
-                start, stop = loop.comment.find('('), loop.comment.rfind(')')
-                name = loop.comment[start + 1:stop]
-                func = FunctionHtml.from_operations(loop.operations, 
self.storage,
-                                                    limit=1,
-                                                    inputargs=loop.inputargs,
-                                                    loopname=name)
-            except CannotFindFile:
-                func = DummyFunc()
-            func.count = getattr(loop, 'count', '?')
-            loops.append((is_entry, index, func))
-        loops.sort(lambda a, b: cmp(b[2].count, a[2].count))
-        if len(loops) > CUTOFF:
-            extra_data = "Show all (%d) loops" % len(loops)
-        else:
-            extra_data = ""
-        if not all:
-            loops = loops[:CUTOFF]
-
-        qt_workaround = ('Qt/4.7.2' in flask.request.user_agent.string)
-        return flask.render_template('index.html', loops=loops,
-                                     filename=self.filename,
-                                     qt_workaround=qt_workaround,
-                                     extra_data=extra_data)
-
-    def loop(self):
-        no = int(flask.request.args.get('no', '0'))
-        orig_loop = self.storage.loops[no]
-        if hasattr(orig_loop, 'force_asm'):
-            orig_loop.force_asm()
-        ops = adjust_bridges(orig_loop, flask.request.args)
-        loop = FunctionHtml.from_operations(ops, self.storage,
-                                            inputargs=orig_loop.inputargs)
-        path = flask.request.args.get('path', '').split(',')
-        if path:
-            up = '"' + ','.join(path[:-1]) + '"'
-        else:
-            up = '""'
-        callstack = []
-        path_so_far = []
-        for e in path:
-            if e:
-                callstack.append((','.join(path_so_far),
-                                  '%s in %s at %d' % (loop.name,
-                                                      loop.filename,
-                                                      loop.startlineno)))
-                loop = loop.chunks[int(e)]
-                path_so_far.append(e)
-        callstack.append((','.join(path_so_far), '%s in %s at %d' % (loop.name,
-                                        loop.filename, loop.startlineno)))
-
-        if not loop.has_valid_code() or loop.filename is None:
-            startline = 0
-            source = CodeReprNoFile(loop)
-        else:
-            startline, endline = loop.linerange
-            code = self.storage.load_code(loop.filename)[(loop.startlineno,
-                                                          loop.name)]
-            if code.co_name == '<module>' and code.co_firstlineno == 1:
-                try:
-                    with open(code.co_filename) as f:
-                        source = CodeRepr(f.read(), code, loop)
-                except (IOError, OSError):
-                    source = CodeReprNoFile(loop)
-            else:
-                #try:
-                source = CodeRepr(inspect.getsource(code), code, loop)
-                #except:
-                #    source = CodeReprNoFile(loop)
-        d = {'html': flask.render_template('loop.html',
-                                           source=source,
-                                           current_loop=no,
-                                           upper_path=up,
-                                           show_upper_path=bool(path)),
-             'scrollto': startline,
-             'callstack': callstack}
-        return flask.jsonify(d)
-
-
-class OverrideFlask(flask.Flask):
-    root_path = property(lambda self: self._root_path, lambda *args: None)
-
-    def __init__(self, *args, **kwargs):
-        self._root_path = kwargs.pop('root_path')
-        self.servers = []
-        self.evil_monkeypatch()
-        flask.Flask.__init__(self, *args, **kwargs)
-
-    def evil_monkeypatch(self):
-        """
-        Evil way to fish the server started by flask, necessary to be able to 
shut
-        it down cleanly."""
-        from SocketServer import BaseServer
-        orig___init__ = BaseServer.__init__
-        def __init__(self2, *args, **kwds):
-            self.servers.append(self2)
-            orig___init__(self2, *args, **kwds)
-        BaseServer.__init__ = __init__
-
-def main():
-    PATH = os.path.dirname(os.path.dirname((_jitviewer.__file__)))
-    if not '__pypy__' in sys.builtin_module_names:
-        print "Please run it using pypy-c"
-        sys.exit(1)
-    #
-    server_mode = True
-    if '--qt' in sys.argv:
-        server_mode = False
-        sys.argv.remove('--qt')
-    #
-    if len(sys.argv) != 2 and len(sys.argv) != 3:
-        print __doc__
-        sys.exit(1)
-    filename = sys.argv[1]
-    extra_path = os.path.dirname(filename)
-    if len(sys.argv) != 3:
-        port = 5000
-    else:
-        port = int(sys.argv[2])
-    storage = LoopStorage(extra_path)
-    log, loops = import_log(filename, ParserWithHtmlRepr)
-    parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
-    storage.reconnect_loops(loops)
-    app = OverrideFlask('jitviewer', root_path=PATH)
-    server = Server(filename, storage)
-    app.debug = True
-    app.route('/')(server.index)
-    app.route('/loop')(server.loop)
-    def run():
-        app.run(use_reloader=False, host='0.0.0.0', port=port)
-
-    if server_mode:
-        run()
-    else:
-        url = "http://localhost:%d/"; % port
-        run_server_and_browser(app, run, url, filename)
-
-def run_server_and_browser(app, run, url, filename):
-    try:
-        # start the HTTP server in another thread
-        th = threading.Thread(target=run)
-        th.start()
-        #
-        # start the webkit browser in the main thread (actually, it's a 
subprocess)
-        time.sleep(0.5) # give the server some time to start
-        start_browser(url, filename)
-    finally:
-        # shutdown the HTPP server and wait until it completes
-        app.servers[0].shutdown()
-        th.join()
-
-def start_browser(url, filename):
-    import subprocess
-    qwebview_py = os.path.join(os.path.dirname(__file__), 'qwebview.py')
-    title = "jitviewer: " + filename
-    try:
-        return subprocess.check_call(['/usr/bin/python', qwebview_py, url, 
title])
-    except Exception, e:
-        print 'Cannot start the builtin browser: %s' % e
-        print "Please point your browser to: %s" % url
-        try:
-            raw_input("Press enter to quit and kill the server")
-        except KeyboardInterrupt:
-            pass
-
-if __name__ == '__main__':
-    main()
+from _jitviewer.app import main
+main()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to