Author: chrisz
Date: Wed Apr 25 08:51:06 2007
New Revision: 6505
Modified:
Webware/trunk/.pylintrc
Webware/trunk/WebKit/.checksrc.config
Webware/trunk/WebKit/Examples/AjaxPage.py
Webware/trunk/WebKit/Examples/AjaxSuggest.py
Webware/trunk/WebKit/Examples/JSONRPCExample.py
Webware/trunk/WebKit/Examples/XMLRPCExample.py
Webware/trunk/WebKit/Examples/ajaxcall.js
Webware/trunk/WebKit/Examples/ajaxpoll.js
Webware/trunk/WebKit/Examples/ajaxsuggest.css
Webware/trunk/WebKit/Examples/ajaxsuggest.js
Webware/trunk/WebKit/Examples/jsonrpc.js
Webware/trunk/WebKit/JSONRPCServlet.py
Webware/trunk/WebKit/XMLRPCServlet.py
Log:
Standardized method names of XMLRPCServlet, JSONRPCServlet and AjaxPage.
Renamed ajax_methods and json_methods to exposedMethods, as in XMLRPCServlet.
Modified: Webware/trunk/.pylintrc
==============================================================================
--- Webware/trunk/.pylintrc (original)
+++ Webware/trunk/.pylintrc Wed Apr 25 08:51:06 2007
@@ -127,11 +127,11 @@
# Regular expression which should only match correct method names
#method-rgx=[a-z_][a-z0-9_]{2,30}$
-method-rgx=_?[a-z][a-zA-Z0-9]{2,30}|(__.*__)$
+method-rgx=(_?[a-z][a-zA-Z0-9]{2,30}|(__.*__))$
# Regular expression which should only match correct instance attribute names
#attr-rgx=[a-z_][a-z0-9_]{2,30}$
-attr-rgx=_[a-z][a-zA-Z0-9]{2,30}$
+attr-rgx=(_[a-z][a-zA-Z0-9]{2,30}$|(__.*__))$
# Regular expression which should only match correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$
Modified: Webware/trunk/WebKit/.checksrc.config
==============================================================================
--- Webware/trunk/WebKit/.checksrc.config (original)
+++ Webware/trunk/WebKit/.checksrc.config Wed Apr 25 08:51:06 2007
@@ -10,14 +10,13 @@
'ExtraParens':
['Image'],
'ExtraUnder':
- ['AjaxPage', 'HTTPServer', 'JSONRPCServlet', 'XMLRPCServlet'],
+ ['HTTPServer'],
'LineSize':
['Properties'],
'NoBlankLines':
['Image'],
'NoUnderAttr':
- ['HTTPExceptions', 'HTTPServer',
- 'ImportManager', 'ImportSpy', 'XMLRPCServlet'],
+ ['HTTPExceptions', 'HTTPServer', 'ImportManager', 'ImportSpy'],
'UncapFN':
['stress', 'index', 'stop', 'url1', 'url2', 'url3', 'util'],
}
Modified: Webware/trunk/WebKit/Examples/AjaxPage.py
==============================================================================
--- Webware/trunk/WebKit/Examples/AjaxPage.py (original)
+++ Webware/trunk/WebKit/Examples/AjaxPage.py Wed Apr 25 08:51:06 2007
@@ -1,10 +1,10 @@
-#
-# AjaxPage.py
-#
-# Written by John Dickinson based on ideas from
-# Apple Developer Connection and DivMod Nevow.
-# Some changes by Robert Forkel and Christoph Zwerschke.
-#
+"""AJAX page template class
+
+Written by John Dickinson based on ideas from
+Apple Developer Connection and DivMod Nevow.
+Some changes by Robert Forkel and Christoph Zwerschke.
+
+"""
import traceback, time, random
from MiscUtils import StringIO
@@ -19,19 +19,19 @@
object
except NameError: # fallback for Python < 2.2
class object: pass
- std_isinstance = isinstance
+ _isinstance = isinstance
def isinstance(obj, cinf):
if type(cinf) == type(()):
- for ci in cinf:
+ for i in cinf:
if type(obj) == type(object):
- if std_isinstance(obj, ci):
+ if _isinstance(obj, i):
return 1
else:
- if type(obj) == type(ci):
+ if type(obj) == type(i):
return 1
return 0
else:
- return std_isinstance(obj, cinf)
+ return _isinstance(obj, cinf)
def quoteJs(what):
@@ -57,16 +57,16 @@
def __str__(self):
return self._name
- def __call__(self, *a, **kw):
- args = ','.join([quoteJs(i) for i in a])
- kw_args = ','.join(['%s=%s' % (k, quoteJs(v)) for k, v in kw.items()])
- if args and kw_args:
- all_args = '%s,%s' % (args, kw_args)
- elif not kw_args:
- all_args = args
+ def __call__(self, *args, **kw):
+ args = ','.join([quoteJs(i) for i in args])
+ kwArgs = ','.join(['%s=%s' % (k, quoteJs(v)) for k, v in kw.items()])
+ if args and kwArgs:
+ allArgs = '%s,%s' % (args, kwArgs)
+ elif not kwArgs:
+ allArgs = args
elif not args:
- all_args = kw_args
- return self.__class__('%s(%s)' % (self, all_args))
+ allArgs = kwArgs
+ return self.__class__('%s(%s)' % (self, allArgs))
def __getitem__(self, index):
return self.__class__('%s[%s]' % (self, quoteJs(index)))
@@ -80,7 +80,7 @@
AjaxPage can be used to make coding XMLHttpRequest() applications easier.
- Subclasses should override the method ajax_methods() which returns a list
+ Subclasses should override the method exposedMethods() which returns a list
of method names. These method names refer to Webware Servlet methods that
are able to be called by an Ajax-enabled web page. This is very similar
in functionality to Webware's actions.
@@ -102,7 +102,7 @@
'window document alert this'.split())
setTag, setClass, setID, setValue, setReadonly = map(PyJs,
'setTag setClass setID setValue setReadonly'.split())
- call, call_form = map(PyJs, ('ajax_call', 'ajax_call_form'))
+ call, callForm = map(PyJs, ('ajax_call', 'ajax_call_form'))
# Response Queue for timed out queries:
_responseQueue = {}
@@ -115,16 +115,16 @@
self.writeln(s % 'poll')
def actions(self):
- a = BaseClass.actions(self)
- a.append('ajax_call')
+ actions = BaseClass.actions(self)
+ actions.append('ajaxCall')
if self._clientPolling:
- a.append('ajax_poll')
- return a
+ actions.append('ajaxPoll')
+ return actions
- def ajax_methods(self):
+ def exposedMethods(self):
return []
- def ajax_clientPollingInterval(self):
+ def clientPollingInterval(self):
"""Set the interval for the client polling.
You should always make it a little random to avoid synchronization.
@@ -132,7 +132,7 @@
"""
return random.choice(range(3, 8))
- def ajax_call(self):
+ def ajaxCall(self):
"""Execute method with arguments on the server side.
The method name is passed in the field _call_,
@@ -149,8 +149,8 @@
if type(args) != type([]):
args = [args]
if self._clientPolling and self._responseTimeout:
- start_time = time.time()
- if call in self.ajax_methods():
+ startTime = time.time()
+ if call in self.exposedMethods():
try:
method = getattr(self, call)
except AttributeError:
@@ -173,10 +173,10 @@
else:
cmd = self.alert('Ajax call missing call parameter.')
if self._clientPolling and self._responseTimeout:
- in_time = time.time() - start_time < self._responseTimeout
+ inTime = time.time() - startTime < self._responseTimeout
else:
- in_time = 1
- if in_time:
+ inTime = 1
+ if inTime:
# If the computation of the method did not last very long,
# deliver it immediately back to the client with this response:
if self._debug:
@@ -190,7 +190,7 @@
sid = self.session().identifier()
self._responseQueue.setdefault(sid, []).append(cmd)
- def ajax_poll(self):
+ def ajaxPoll(self):
"""Return queued Javascript functions to be executed on the client side.
This is polled by the client in random intervals in order to get
@@ -201,7 +201,7 @@
sid = self.session().identifier()
# Set the timeout until the next time this method is called
# by the client, using the Javascript wait variable:
- cmd = ['wait=%s' % self.ajax_clientPollingInterval()]
+ cmd = ['wait=%s' % self.clientPollingInterval()]
if self._responseQueue.has_key(sid): # add in other commands
cmd.extend(map(str, self._responseQueue[sid]))
self._responseQueue[sid] = []
@@ -214,7 +214,7 @@
cmd = 'dying=true;'
self.write(cmd) # write out at least the wait variable
- def ajax_push(self, cmd):
+ def ajaxPush(self, cmd):
"""Push Javascript commands to be executed on the client side.
Client polling must be activitated if you want to use this.
@@ -226,14 +226,10 @@
sid = self.session().identifier()
self._responseQueue.setdefault(sid, []).append(cmd)
- def preAction(self, action_name):
- if action_name.startswith('ajax_'):
- pass
- else:
- BaseClass.preAction(self, action_name)
-
- def postAction(self, action_name):
- if action_name.startswith('ajax_'):
- pass
- else:
- BaseClass.postAction(self, action_name)
+ def preAction(self, actionName):
+ if actionName not in ('ajaxCall', 'ajaxPoll'):
+ BaseClass.preAction(self, actionName)
+
+ def postAction(self, actionName):
+ if actionName not in ('ajaxCall', 'ajaxPoll'):
+ BaseClass.postAction(self, actionName)
Modified: Webware/trunk/WebKit/Examples/AjaxSuggest.py
==============================================================================
--- Webware/trunk/WebKit/Examples/AjaxSuggest.py (original)
+++ Webware/trunk/WebKit/Examples/AjaxSuggest.py Wed Apr 25 08:51:06 2007
@@ -10,22 +10,22 @@
from AjaxPage import AjaxPage
-max_suggestions = 10
-max_words = 5000
-max_letters = 5
+maxSuggestions = 10
+maxWords = 5000
+maxLetters = 5
# Create some random "words":
suggestions = []
-for i in range(max_words):
+for i in range(maxWords):
word = []
- for j in range(max_letters):
+ for j in range(maxLetters):
word.append(chr(randint(97, 122)))
suggestions.append(''.join(word))
class AjaxSuggest(AjaxPage):
- clientPolling = None # we have no long-running queries
+ _clientPolling = None # we have no long-running queries
def writeJavaScript(self):
AjaxPage.writeJavaScript(self)
@@ -39,10 +39,10 @@
return AjaxPage.htBodyArgs(self) + ' onload="initPage();"'
def writeContent(self):
- self.writeln('<h2>Ajax "Suggest" Example</h2>')
+ self.writeln('<h2>Ajax "Suggest" Example</h2>')
if self.request().hasField('query'):
self.writeln('''
-<p>You have just entered the word <q class="red">%s</q>.</p>
+<p>You have just entered the word <b class="in_red">"%s"</b>.</p>
<p>If you like, you can try again:</p>'''
% self.htmlEncode(self.request().field('query')))
else:
@@ -57,7 +57,7 @@
<input type="text" name="query" id="query" onkeyup="getSuggestions();" autocomplete="off">
<input type="submit" value="Submit"></div><div class="hide" id="suggestions"></div></form>''')
- def ajax_methods(self):
+ def exposedMethods(self):
"""Register the suggest method for use with Ajax."""
return ['suggest']
@@ -74,4 +74,4 @@
s = filter(lambda w, prefix=prefix:
w.startswith(prefix), suggestions) or ['none']
return "handleSuggestions([%s]);" % ",".join(
- map(lambda w: "'%s'" % w, s[:max_suggestions]))
+ map(lambda w: "'%s'" % w, s[:maxSuggestions]))
Modified: Webware/trunk/WebKit/Examples/JSONRPCExample.py
==============================================================================
--- Webware/trunk/WebKit/Examples/JSONRPCExample.py (original)
+++ Webware/trunk/WebKit/Examples/JSONRPCExample.py Wed Apr 25 08:51:06 2007
@@ -27,6 +27,6 @@
def lowercase(self, msg):
return msg.lower()
- def json_methods(self):
- return JSONRPCServlet.json_methods(self) + [
+ def exposedMethods(self):
+ return JSONRPCServlet.exposedMethods(self) + [
'echo', 'reverse', 'uppercase', 'lowercase']
Modified: Webware/trunk/WebKit/Examples/XMLRPCExample.py
==============================================================================
--- Webware/trunk/WebKit/Examples/XMLRPCExample.py (original)
+++ Webware/trunk/WebKit/Examples/XMLRPCExample.py Wed Apr 25 08:51:06 2007
@@ -7,7 +7,7 @@
To try it out, use something like the following:
>>> import xmlrpclib
- >>> server = xmlrpclib.Server('http://localhost/cgi-bin/WebKit.cgi/Examples/XMLRPCExample')
+ >>> server = xmlrpclib.Server('http://localhost:8080/Examples/XMLRPCExample')
>>> server.multiply(10,20)
200
>>> server.add(10,20)
Modified: Webware/trunk/WebKit/Examples/ajaxcall.js
==============================================================================
--- Webware/trunk/WebKit/Examples/ajaxcall.js (original)
+++ Webware/trunk/WebKit/Examples/ajaxcall.js Wed Apr 25 08:51:06 2007
@@ -10,7 +10,7 @@
if (request_url.indexOf('?') >= 0) {
request_url = request_url.substr(0, request_url.indexOf('?'));
}
-request_url += "?_action_=ajax_"
+request_url += "?_action_=ajax"
var request_id = 0;
function getRequester() {
@@ -66,7 +66,7 @@
}
req = getRequester();
if (req) {
- openConnection(req, request_url + "call&_call_=" + call + args);
+ openConnection(req, request_url + "Call&_call_=" + call + args);
}
}
@@ -89,7 +89,7 @@
}
req = getRequester();
if (req) {
- openConnection(req, request_url + "call&_call_=" + call + args);
+ openConnection(req, request_url + "Call&_call_=" + call + args);
}
}
Modified: Webware/trunk/WebKit/Examples/ajaxpoll.js
==============================================================================
--- Webware/trunk/WebKit/Examples/ajaxpoll.js (original)
+++ Webware/trunk/WebKit/Examples/ajaxpoll.js Wed Apr 25 08:51:06 2007
@@ -34,7 +34,7 @@
}
}
}
- var url = request_url + 'poll&_req_=' + ++request_id;
+ var url = request_url + 'Poll&_req_=' + ++request_id;
req.open("GET", url, true);
req.send(null);
}
Modified: Webware/trunk/WebKit/Examples/ajaxsuggest.css
==============================================================================
--- Webware/trunk/WebKit/Examples/ajaxsuggest.css (original)
+++ Webware/trunk/WebKit/Examples/ajaxsuggest.css Wed Apr 25 08:51:06 2007
@@ -1,15 +1,35 @@
/* Style sheet for the AjaxSuggest example. */
-.red {
- color: #f00;
+.in_red {
+ color: #a33;
}
-.suggest_link {
+.suggest_button_normal {
+ color: #000;
+ background-color: #ddd;
+ text-align: center;
+ font-size: smaller;
+ padding: 1px 4px;
+ border: 2px outset #666;
+}
+
+.suggest_button_over {
+ color: #ddd;
+ background-color: #36c;
+ text-align: center;
+ font-size: smaller;
+ padding: 1px 4px;
+ border: 2px outset #666;
+}
+
+.suggest_link_normal {
+ color: #000;
background-color: #fff;
padding: 2px 4px;
}
.suggest_link_over {
+ color: #fff;
background-color: #36c;
padding: 2px 4px;
}
@@ -22,7 +42,6 @@
#suggestions {
cursor: pointer;
position: absolute;
- background-color: #fff;
text-align: left;
border: 1px solid #666;
}
Modified: Webware/trunk/WebKit/Examples/ajaxsuggest.js
==============================================================================
--- Webware/trunk/WebKit/Examples/ajaxsuggest.js (original)
+++ Webware/trunk/WebKit/Examples/ajaxsuggest.js Wed Apr 25 08:51:06 2007
@@ -21,9 +21,9 @@
function handleSuggestions(res) {
if (res.length > 0) {
var e = document.getElementById('suggestions');
- e.innerHTML = '<div onmouseover="suggestOver(this)" onmouseout="suggestOut(this)" onclick="clearSuggestions()" class="suggest_link red">close</div>';
- for (i=0; i < res.length; i++) {
- e.innerHTML += '<div onmouseover="suggestOver(this)" onmouseout="suggestOut(this)" onclick="setQuery(this.innerHTML)" class="suggest_link">' + res[i] + '</div>';
+ e.innerHTML = '<div onmouseover="suggestOver(this)" onmouseout="suggestOut(this)" onclick="clearSuggestions()" class="suggest_button_normal">close</div>';
+ for (i=0; i<res.length; i++) {
+ e.innerHTML += '<div onmouseover="suggestOver(this)" onmouseout="suggestOut(this)" onclick="setQuery(this.innerHTML)" class="suggest_link_normal">' + res[i] + '</div>';
}
e.className = 'show';
} else {
@@ -32,11 +32,11 @@
}
function suggestOver(div_node) {
- div_node.className = div_node.className.replace('suggest_link', 'suggest_link_over');
+ div_node.className = div_node.className.replace('_normal', '_over');
}
function suggestOut(div_node) {
- div_node.className = div_node.className.replace('suggest_link_over', 'suggest_link');
+ div_node.className = div_node.className.replace('_over', '_normal');
}
function clearSuggestions() {
Modified: Webware/trunk/WebKit/Examples/jsonrpc.js
==============================================================================
--- Webware/trunk/WebKit/Examples/jsonrpc.js (original)
+++ Webware/trunk/WebKit/Examples/jsonrpc.js Wed Apr 25 08:51:06 2007
@@ -1,7 +1,7 @@
/*
* JSON-RPC JavaScript client
*
- * $Id: jsonrpc.js,v 1.36.2.3 2006/03/08 15:09:37 mclark Exp $
+ * Based on: jsonrpc.js,v 1.36.2.3 2006/03/08
*
* Copyright (c) 2003-2004 Jan-Klaas Kollhof
* Copyright (c) 2005 Michael Clark, Metaparadigm Pte Ltd
Modified: Webware/trunk/WebKit/JSONRPCServlet.py
==============================================================================
--- Webware/trunk/WebKit/JSONRPCServlet.py (original)
+++ Webware/trunk/WebKit/JSONRPCServlet.py Wed Apr 25 08:51:06 2007
@@ -1,6 +1,8 @@
-#
-# JSON-RPC servlet class written by Jean-Francois Pieronne
-#
+"""JSON-RPC servlet base class
+
+Written by Jean-Francois Pieronne
+
+"""
import traceback
from MiscUtils import StringIO
@@ -43,31 +45,31 @@
def respondToGet(self, transaction):
if self._allowGet:
- self.error("GET method not allowed")
+ self.writeError("GET method not allowed")
HTTPContent.respondToGet(self, transaction)
def defaultAction(self):
- self.json_call()
+ self.jsonCall()
def actions(self):
actions = HTTPContent.actions(self)
- actions.append('json_call')
+ actions.append('jsonCall')
return actions
- def json_methods(self):
+ def exposedMethods(self):
return []
- def json_error(self, msg):
+ def writeError(self, msg):
self.write(simplejson.dumps({'id': self._id, 'code': -1, 'error': msg}))
- def json_result(self, data):
+ def writeResult(self, data):
data = simplejson.dumps({'id': self._id, 'result': data})
if not self._allowEval:
data = 'throw new Error' \
'("Direct evaluation not allowed");\n/*%s*/' % (data,)
self.write(data)
- def json_call(self):
+ def jsonCall(self):
"""Execute method with arguments on the server side.
Returns Javascript function to be executed by the client immediately.
@@ -77,24 +79,24 @@
data = simplejson.loads(request.rawInput().read())
self._id, call, params = data["id"], data["method"], data["params"]
if call == 'system.listMethods':
- self.json_result(self.json_methods())
- elif call in self.json_methods():
+ self.writeResult(self.exposedMethods())
+ elif call in self.exposedMethods():
try:
method = getattr(self, call)
except AttributeError:
- self.json_error('%s, although an approved method, '
+ self.writeError('%s, although an approved method, '
'was not found' % call)
else:
try:
if self._debug:
self.log("json call %s(%s)" % (call, params))
- self.json_result(method(*params))
+ self.writeResult(method(*params))
except Exception:
err = StringIO()
traceback.print_exc(file=err)
e = err.getvalue()
- self.json_error('%s was called, '
+ self.writeError('%s was called, '
'but encountered an error: %s' % (call, e))
err.close()
else:
- self.json_error('%s is not an approved method' % call)
+ self.writeError('%s is not an approved method' % call)
Modified: Webware/trunk/WebKit/XMLRPCServlet.py
==============================================================================
--- Webware/trunk/WebKit/XMLRPCServlet.py (original)
+++ Webware/trunk/WebKit/XMLRPCServlet.py Wed Apr 25 08:51:06 2007
@@ -1,12 +1,17 @@
-# This requires the free xml-rpc library available from
-# http://www.pythonware.com/products/xmlrpc/
-#
-# See Examples/XMLRPCExample.py for sample usage.
-#
+"""XML-RPC servlet base class
+
+Written by Geoffrey Talvola
+
+This requires the xml-rpc library available from
+http://www.pythonware.com/products/xmlrpc/
+which was was added to the standard Python library in Python 2.2.
+
+See Examples/XMLRPCExample.py for sample usage.
+
+"""
-# Sometimes xmlrpclib is installed as a package, sometimes not.
-# So we'll make sure it works either way.
try:
+ # may be a part of a package in Python < 2.2, check this first
from xmlrpclib import xmlrpclib
except ImportError:
import xmlrpclib
|