[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