[pypy-svn] r29299 - in pypy/dist/pypy/translator/js: . demo demo/jsdemo demo/jsdemo/templates modules modules/test proxy/testme test tools

fijal at codespeak.net fijal at codespeak.net
Sat Jun 24 20:32:29 CEST 2006


Author: fijal
Date: Sat Jun 24 20:32:22 2006
New Revision: 29299

Added:
   pypy/dist/pypy/translator/js/modules/start_bnb.py
Modified:
   pypy/dist/pypy/translator/js/commproxy.py   (contents, props changed)
   pypy/dist/pypy/translator/js/demo/   (props changed)
   pypy/dist/pypy/translator/js/demo/__init__.py   (props changed)
   pypy/dist/pypy/translator/js/demo/dev.cfg
   pypy/dist/pypy/translator/js/demo/jsdemo/   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/__init__.py   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/autopath.py   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py   (contents, props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/controllers.py   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/proxy.py   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/templates/   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/templates/__init__.py   (props changed)
   pypy/dist/pypy/translator/js/demo/jsdemo/templates/bnb.kid
   pypy/dist/pypy/translator/js/jsbuiltin.py
   pypy/dist/pypy/translator/js/modules/mochikit.py   (props changed)
   pypy/dist/pypy/translator/js/modules/test/test_xmlhttp.py   (contents, props changed)
   pypy/dist/pypy/translator/js/proxy/testme/servermessage.py
   pypy/dist/pypy/translator/js/test/runtest.py
   pypy/dist/pypy/translator/js/test/tgtest.py
   pypy/dist/pypy/translator/js/tools/   (props changed)
Log:
Fixed several small issues, added first runnable version of bnb.


Modified: pypy/dist/pypy/translator/js/commproxy.py
==============================================================================
--- pypy/dist/pypy/translator/js/commproxy.py	(original)
+++ pypy/dist/pypy/translator/js/commproxy.py	Sat Jun 24 20:32:22 2006
@@ -12,7 +12,9 @@
     data = %(data)s;
     str = "?"
     for(i in data) {
-        str += i + "=" + data[i].toString() + ";";
+        if (data[i]) {
+            str += i + "=" + data[i].toString() + ";";
+        }
     }
     x.open("GET", '%(call)s' + str, true);
     //x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
@@ -37,6 +39,20 @@
 }
 """
 
+MOCHIKIT_BODY = """
+%(class)s.prototype.%(method)s = function ( %(args)s ) {
+    var data,str;
+    data = %(data)s;
+    str = "?"
+    for(i in data) {
+        if (data[i]) {
+            str += i + "=" + data[i].toString() + ";";
+        }
+    }
+    loadJSONDoc('%(call)s' + str).addCallback(callback);
+}
+"""
+
 class XmlHttp(object):
     """ Class for rendering xmlhttp request communication
     over normal js code
@@ -55,12 +71,18 @@
         ilasm.end_function()
     
     def render_method(self, method_name, method, ilasm):
+        USE_MOCHIKIT = True # FIXME: some option?
+        
         args, retval = method.args, method.retval.name
         real_args = list(arg.name for arg in args)
         # FIXME: dirty JS here
         data = "{%s}" % ",".join(["'%s':%s" % (i,i) for i in real_args if i != 'callback'])
         real_callback = Variable("callback").name
-        ilasm.codegenerator.write(CALLBACK_BODY % {'real_callback':real_callback})
-        ilasm.codegenerator.write(METHOD_BODY % {'class':self.name, 'method':method_name,\
-            'args':",".join(real_args), 'data':data, 'call':'http://localhost:8080/'+method_name,\
-            'real_callback':real_callback})
+        if USE_MOCHIKIT:
+            ilasm.codegenerator.write(MOCHIKIT_BODY % {'class':self.name, 'method':method_name,\
+                'args':','.join(real_args), 'data':data, 'call':method_name})
+        else:
+            ilasm.codegenerator.write(CALLBACK_BODY % {'real_callback':real_callback})
+            ilasm.codegenerator.write(METHOD_BODY % {'class':self.name, 'method':method_name,\
+                'args':",".join(real_args), 'data':data, 'call':'http://localhost:8080/'+method_name,\
+                'real_callback':real_callback})

Modified: pypy/dist/pypy/translator/js/demo/dev.cfg
==============================================================================
--- pypy/dist/pypy/translator/js/demo/dev.cfg	(original)
+++ pypy/dist/pypy/translator/js/demo/dev.cfg	Sat Jun 24 20:32:22 2006
@@ -26,12 +26,12 @@
 
 # Some server parameters that you may want to tweak
 server.socketPort=8080
-server.socketHost="127.0.0.1"
+#server.socketHost=""
 
 # Disable the debug output at the end on pages.
 # logDebugInfoFilter.on = False
 server.logFile="server.log"
-server.logToScreen=True
+server.logToScreen=False
 
 server.environment="production" #"development"
 #autoreload.package="testme"

Modified: pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py
==============================================================================
--- pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	(original)
+++ pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	Sat Jun 24 20:32:22 2006
@@ -4,10 +4,120 @@
 
 import turbogears
 import cherrypy
-from pypy.jsdemo.jsdemo.controllers import Root
-from pypy.rpython.ootypesystem.bltregistry import BasicExternal
+from pypy.translator.js.demo.jsdemo.controllers import Root
+from pypy.rpython.ootypesystem.bltregistry import BasicExternal, MethodDesc
+
+from pypy.translator.js.proxy.testme.servermessage import ServerMessage, PMSG_INLINE_FRAME
+from pypy.translator.js.proxy.testme.msgstruct import *
+from cherrypy import session
+
+import re, time, sys, os, urllib, socket
+
+class SortY(object):
+    def __init__(self, data):
+        self.data = data
+    
+    def __cmp__(self, other):
+        return cmp(self.data['y'], other.data['y'])
 
 # Needed double inheritance for both server job
 # and semi-transparent communication proxy
 class BnbRoot(Root, BasicExternal):
-    @turbogears.expose
+    _serverMessage = {}
+
+    host = 'localhost'
+    try:
+        port = re.findall('value=".*"', urllib.urlopen('http://%s:8000' % host).read())[0]
+    except IOError:
+        import sys
+        log("ERROR: Can't connect to BnB server on %s:8000" % host)
+        sys.exit()
+    port = int(port[7:-1])
+    
+    _methods = {
+        'get_message' : MethodDesc( [('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]})
+    }
+    
+    def serverMessage(self):
+        sessionid = session['_id']
+        if sessionid not in self._serverMessage:
+            self._serverMessage[sessionid] = ServerMessage('static/images')
+        return self._serverMessage[sessionid]
+    
+    @turbogears.expose(html="jsdemo.templates.bnb")
+    def index(self):
+        import time
+        self.last_frames = set()
+        return dict(now=time.ctime(), onload=self.jsname, code=self.jssource)
+    
+    def sessionSocket(self, close=False):
+        sm = self.serverMessage()
+        if sm.socket is None:
+            player_id = 0 #XXX hardcoded for now
+            sm.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            sm.socket.connect((self.host, self.port))
+            sm.socket.send(message(CMSG_PROTO_VERSION, 2))  #, version a kuku
+            sm.socket.send(message(CMSG_ENABLE_SOUND, 0))   #, has_sound
+            sm.socket.send(message(CMSG_ENABLE_MUSIC, 0))   #, has_music
+            sm.socket.send(message(CMSG_UDP_PORT, "\\"))    #, port
+            sm.socket.send(message(CMSG_PING))              #so server starts sending data
+            #sm.socket.send(message(CMSG_ADD_PLAYER, player_id))
+            #sm.socket.send(message(CMSG_PLAYER_NAME, player_id, 'PyPy'))
+            #XXX todo: session.socket.close() after a timeout
+        return sm.socket
+    
+    @turbogears.expose(format="json")
+    def get_message(self):
+        #XXX hangs if not first sending CMSG_PING!
+        sm   = self.serverMessage()
+        size = 10000 #XXX should really loop until all data is handled
+        data = sm.data + self.sessionSocket().recv(size)
+        while sm.n_header_lines > 0 and '\n' in data:
+            sm.n_header_lines -= 1
+            header_line, data = data.split('\n',1)
+            #log('RECEIVED HEADER LINE: %s' % header_line)
+
+        #log('RECEIVED DATA CONTAINS %d BYTES' % len(data))
+        messages = []
+        while data:
+            values, data = decodemessage(data)
+            if not values:
+                break  # incomplete message
+            messageOutput = sm.dispatch(*values)
+            if messageOutput:
+                if type(messageOutput) is type([]):
+                    messages += messageOutput
+                else:
+                    messages.append(messageOutput)
+        sm.data = data
+        #log('RECEIVED DATA REMAINING CONTAINS %d BYTES' % len(data))
+
+        len_before = len(messages)
+        #XXX we could do better by not generating only the last inline_frame message anyway!
+        inline_frames = [i for i,msg in enumerate(messages) if msg['type'] == PMSG_INLINE_FRAME]
+        for i in reversed(inline_frames[:-1]):
+            del messages[i]
+
+        #if messages:
+        #    log('MESSAGES:lenbefore=%d, inline_frames=%s, lenafter=%d' % (
+        #        len_before, inline_frames, len(messages)))
+        to_append = []
+        next_last = set()
+        keep_sprites = []
+        for i, msg in enumerate(messages):
+            if msg['type'] == PMSG_INLINE_FRAME:
+                for next in msg['sprites']:
+#                    if not next in self.last_frames:
+                        # sort them by y axis
+                    to_append.append(SortY({'type':'sprite', 'x':str(next[1]), 'y':str(next[2]), 'icon_code':str(next[0])}))
+                    #next_last.add(next)
+                del messages[i]
+        
+        self.last_frames = next_last
+        to_append.sort()
+        messages += [i.data for i in to_append]
+        
+        messages.append({'type':'end_frame'})
+        return dict(messages=messages)
+
+BnbRootInstance = BnbRoot()

Modified: pypy/dist/pypy/translator/js/demo/jsdemo/templates/bnb.kid
==============================================================================
--- pypy/dist/pypy/translator/js/demo/jsdemo/templates/bnb.kid	(original)
+++ pypy/dist/pypy/translator/js/demo/jsdemo/templates/bnb.kid	Sat Jun 24 20:32:22 2006
@@ -13,14 +13,14 @@
             result = ${onload}();
         } catch ( e ) {
             exc = e;
+            xml = new XMLHttpRequest();
+            xml.open('GET', '/send_result?result=0;exc='+exc, true);
+            xml.send(null);
         }
-        xml = new XMLHttpRequest();
-        xml.open('GET', 'http://localhost:8080/send_result?result='+result+';exc='+exc, true);
-        xml.send(null);
     }
     </script>
 </head>
-<body bgcolor="#FFFFFF" onLoad="call_fun()">
+<body onload="${onload}()">
   <p>This is a test!</p><br/>
   <p>Code:</p><br/>
   <pre>

Modified: pypy/dist/pypy/translator/js/jsbuiltin.py
==============================================================================
--- pypy/dist/pypy/translator/js/jsbuiltin.py	(original)
+++ pypy/dist/pypy/translator/js/jsbuiltin.py	Sat Jun 24 20:32:22 2006
@@ -44,6 +44,12 @@
             },
             ootype.Dict: {
                 'll_get' : ListGetitem,
+                'll_set' : ListSetitem,
+                'll_contains' : ListContains,
+            },
+            ootype.Record: {
+                'll_get' : ListGetitem,
+                'll_set' : ListSetitem,
                 'll_contains' : ListContains,
             }
         }

Added: pypy/dist/pypy/translator/js/modules/start_bnb.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/js/modules/start_bnb.py	Sat Jun 24 20:32:22 2006
@@ -0,0 +1,114 @@
+""" bub-n-bros testing utility
+"""
+
+import py
+
+from pypy.translator.js.test.runtest import compile_function
+from pypy.translator.js.modules.dom import Node, get_document, setTimeout, alert
+from pypy.translator.js.modules.xmlhttp import XMLHttpRequest
+from pypy.translator.js import conftest
+from pypy.translator.js.modules.mochikit import logDebug, createLoggingPane
+from pypy.translator.js.modules.dom import get_document
+
+import time
+
+if not conftest.option.browser:
+    py.test.skip("Works only in browser (right now?)")
+
+from pypy.translator.js.demo.jsdemo.bnb import BnbRootInstance
+        
+##def msg_dispatcher(data):
+##    for i in data['messages']:
+##        logDebug(i['type'])
+##    BnbRootInstance.get_message(msg_dispatcher)
+##
+##def test_mochikit():
+##    def mochikit():
+##        createLoggingPane(True)
+##        BnbRootInstance.get_message(msg_dispatcher)
+##
+##    from pypy.translator.js.proxy.testme.controllers import Root
+##    fn = compile_function(mochikit, [], root = Root)
+##    fn()
+
+class SpriteContainer(object):
+    """ Class containing all sprites
+    """
+    def __init__(self):
+        self.sprite_queues = {}
+        self.used = {}
+        self.filenames = {}
+        self.icon_codes = []
+    
+    def add_icon(self, icon_code, filename):
+        self.filenames[icon_code] = filename
+        self.sprite_queues[icon_code] = []
+        self.used[icon_code] = []
+        # FIXME: Need to write down DictIterator once...
+        self.icon_codes.append(icon_code)
+    
+    def get_sprite(self, icon_code):
+        #logDebug(str(len(self.sprite_queues[icon_code])))
+        try:
+            elem = self.sprite_queues[icon_code].pop()
+            elem.style.visibility = "visible"
+            self.used[icon_code].append(elem)
+            return elem
+        except IndexError:
+            img = get_document().createElement("img")
+            img.setAttribute("src", self.filenames[icon_code])
+            img.setAttribute("style", 'position:absolute; left:0px; top:0px; visibility:visible')
+            self.sprite_queues[icon_code].append(img)
+            get_document().getElementById("playfield").appendChild(img)
+            return img
+    
+    def revive(self):
+        for i in self.icon_codes:
+            for j in self.sprite_queues[i]:
+                j.style.visibility = "hidden"
+            self.sprite_queues[i] = self.sprite_queues[i] + self.used[i]
+            self.used[i] = []
+        
+sc = SpriteContainer();
+
+def process_message(msg):
+    if msg['type'] == 'def_playfield':
+        bgcolor = '#000000'
+        get_document().body.setAttribute('bgcolor', bgcolor)
+        div = get_document().createElement("div")
+        div.setAttribute("id", "playfield")
+        div.setAttribute('width', msg['width'])
+        div.setAttribute('height', msg['height'])
+        div.setAttribute('style', 'position:absolute; top:0px; left:0px')
+        get_document().body.appendChild(div)
+    elif msg['type'] == 'def_icon':
+##        img = get_document().createElement("img")
+##        img.setAttribute("src", msg["filename"])
+##        img.setAttribute("style", 'position:absolute; left:0; top:0')
+##        img.setAttribute("id", msg["icon_code"])
+##        get_document().getElementById("playfield").appendChild(img)
+        sc.add_icon(msg['icon_code'], msg['filename'])
+    elif msg['type'] == 'sprite':
+        #img = get_document().getElementById(msg["icon_code"])
+        #logDebug(str(img.left) + " " + str(img.right))
+        img = sc.get_sprite(msg['icon_code'])
+        img.style.left = msg['x'] + 'px'
+        img.style.top = msg['y'] + 'px'
+    elif msg['type'] == 'end_frame':
+        pass
+        sc.revive()
+
+def bnb_dispatcher(msgs):
+    BnbRootInstance.get_message(bnb_dispatcher)
+    for msg in msgs['messages']:
+        process_message(msg)
+    
+def test_some():
+    def bnb():
+        #get_document().
+        createLoggingPane(True)
+        BnbRootInstance.get_message(bnb_dispatcher)
+    
+    from pypy.translator.js.demo.jsdemo.bnb import BnbRoot
+    fn = compile_function(bnb, [], root = BnbRoot)
+    fn()

Modified: pypy/dist/pypy/translator/js/modules/test/test_xmlhttp.py
==============================================================================
--- pypy/dist/pypy/translator/js/modules/test/test_xmlhttp.py	(original)
+++ pypy/dist/pypy/translator/js/modules/test/test_xmlhttp.py	Sat Jun 24 20:32:22 2006
@@ -32,4 +32,3 @@
     fn = compile_function(run_double_proxy, [], root = ProxyRoot)
     result = fn()
     assert result == 8
-

Modified: pypy/dist/pypy/translator/js/proxy/testme/servermessage.py
==============================================================================
--- pypy/dist/pypy/translator/js/proxy/testme/servermessage.py	(original)
+++ pypy/dist/pypy/translator/js/proxy/testme/servermessage.py	Sat Jun 24 20:32:22 2006
@@ -40,7 +40,9 @@
     base_gfx_url = 'static/images/'
     gfx_extension = 'gif'
 
-    def __init__(self):
+    def __init__(self, base_gfx_dir = None):
+        if base_gfx_dir:
+            self.base_gfx_dir = base_gfx_dir
         self.socket = None
         self.data   = ''
         self.n_header_lines = 2

Modified: pypy/dist/pypy/translator/js/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/js/test/runtest.py	Sat Jun 24 20:32:22 2006
@@ -25,7 +25,7 @@
     return True
 
 class compile_function(object):
-    def __init__(self, function, annotation, stackless=False, view=False, html=None, is_interactive=False, root = None):
+    def __init__(self, function, annotation, stackless=False, view=False, html=None, is_interactive=False, root = None, run_browser = True):
         if not use_browsertest and not _CLI_is_on_path():
             py.test.skip('Javascript CLI (js) not found')
 
@@ -70,7 +70,7 @@
             else:
                 global port
                 from pypy.translator.js.test.tgtest import run_tgtest
-                out = run_tgtest(self, tg_root = self.root, port=port).results
+                out = run_tgtest(self, tg_root = self.root, port=port, run_browser=run_browser).results
                 assert out[1] == 'undefined' or out[1] == ""
                 output = out[0]
                 port += 1

Modified: pypy/dist/pypy/translator/js/test/tgtest.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/tgtest.py	(original)
+++ pypy/dist/pypy/translator/js/test/tgtest.py	Sat Jun 24 20:32:22 2006
@@ -17,10 +17,11 @@
 conf_file = os.path.join(os.path.dirname(controllers.__file__), "..", "dev.cfg")
 
 class run_tgtest(object):
-    def __init__(self, compiled_fun, tg_root = None, port = 8080):
+    def __init__(self, compiled_fun, tg_root = None, port = 8080, run_browser=True):
         def cont():
             cherrypy.server.wait()
-            webbrowser.open("http://localhost:%d/" % port)
+            if run_browser:
+                webbrowser.open("http://localhost:%d/" % port)
             cherrypy.root.wait_for_results()
             self.results = cherrypy.root.results
             cherrypy.server.stop()



More information about the Pypy-commit mailing list