Skip to content

Commit 2b1020d

Browse files
committed
Updating testdynamic sample
1 parent ab7ad2d commit 2b1020d

File tree

4 files changed

+87
-43
lines changed

4 files changed

+87
-43
lines changed

testpy/admin.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
var url = window.location.pathname;
117117
var query = getQueryVariables(window.location.search);
118118
var state = rulesetState(url);
119+
119120
rulesetGraph(url, state).createVisual(query.size);
120121

121122
function getQueryVariables(query) {

testpy/durableVisual.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ function rulesetState(url) {
943943

944944
var update = function () {
945945
var i;
946-
var statusUrl = rulesetUrl + '/' + sid;
946+
var statusUrl = rulesetUrl + '/state/' + sid;
947947
d3.json(statusUrl, function (err, status) {
948948
if (err) {
949949
for (i = 0; i < errorEvents.length; ++i) {
@@ -963,7 +963,7 @@ function rulesetState(url) {
963963

964964
var timeout = function () {
965965
update();
966-
setTimeout(timeout, 5000);
966+
setTimeout(timeout, 2000);
967967
}
968968

969969
that.start = function () {
@@ -979,7 +979,7 @@ function rulesetGraph(url, state) {
979979
var nodes;
980980
var nodeDictionary = {};
981981
var sid = url.substring(0, url.lastIndexOf('/'));
982-
var ruleSetUrl = sid.substring(0, sid.lastIndexOf('/'));
982+
var rulesetUrl = sid.substring(0, sid.lastIndexOf('/'));
983983
sid= sid.substring(sid.lastIndexOf('/') + 1);
984984

985985
if (sid.indexOf('.') !== -1) {
@@ -1399,13 +1399,15 @@ function rulesetGraph(url, state) {
13991399
};
14001400

14011401
that.createVisual = function (frameSize, callback) {
1402-
d3.json(ruleSetUrl, function (err, ruleSet) {
1402+
d3.json(rulesetUrl + '/definition', function (err, ruleSet) {
14031403
if (err) {
1404+
alert(err)
14041405
var error;
14051406
try {
14061407
error = JSON.parse(err.responseText);
14071408
} catch (ex) {
14081409
error = { error: ex };
1410+
14091411
}
14101412

14111413
callback(error);
@@ -1432,7 +1434,7 @@ function rulesetGraph(url, state) {
14321434
y.domain([0, r]);
14331435
}
14341436

1435-
var title = ruleSetUrl.substring(1) + '/' + sid;
1437+
var title = rulesetUrl.substring(1) + '/' + sid;
14361438
if (nodes.type === 'stateChart') {
14371439
stateVisual(nodes, links, x, y, title, svg, state);
14381440
} else if (nodes.type === 'flowChart') {

testpy/testdynamic.html

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
alert('Server error ' + err.responseText);
2828
} else {
2929
d3.select('iframe')
30-
.attr('src', '/' + rulesetName + '/sample/admin.html?disableScratchpad=true&size=330');
30+
.attr('src', '/' + rulesetName + '/sample/admin.html?disableScratchpad=true&size=350');
3131
}
3232
});
3333
} catch (err) {
@@ -43,7 +43,7 @@
4343
}
4444
else {
4545
d3.select('iframe')
46-
.attr('src', '/' + rulesetName + '/sample/admin.html?disableScratchpad=true&size=330');
46+
.attr('src', '/' + rulesetName + '/sample/admin.html?disableScratchpad=true&size=350');
4747

4848
d3.select('textarea[id="rulesetpad"]')
4949
.text(JSON.stringify(result, null, 4));
@@ -56,17 +56,12 @@
5656
var messageText = document.getElementById('messagepad').value;
5757
var message = JSON.parse(messageText);
5858
var rulesetName = document.getElementById('name').value;
59-
server = d3.xhr('http://localhost:5000/' + rulesetName + '/events')
59+
server = d3.xhr('http://localhost:5000/' + rulesetName + '/events/sample')
6060
.header('content-type', 'application/json; charset=utf-8');
6161

6262
server.post(messageText, function(err, result) {
6363
if (err) {
6464
alert('Server error ' + err.responseText);
65-
} else {
66-
result = JSON.parse(result.responseText);
67-
if (result.outcome != 0) {
68-
alert('Server response ' + result.outcome);
69-
}
7065
}
7166
});
7267
} catch (err) {
@@ -118,7 +113,7 @@
118113
' }],\r\n' +
119114
' "to": "suspect",\r\n' +
120115
' "run": "suspect"\r\n' +
121-
' }\r\n' +
116+
' }\r\n' +
122117
' },\r\n' +
123118
' "suspect": {\r\n' +
124119
' "trigger": {\r\n' +
@@ -132,15 +127,10 @@
132127
' "fraud":{}\r\n' +
133128
'}\r\n');
134129

135-
body.append('iframe')
136-
.attr('width', 330)
137-
.attr('height', 329)
138-
.attr('scrolling', 'no')
139-
.attr('style', "border:1px solid grey");
140-
141130
body.append('br');
142131
body.append('br');
143132

133+
144134
body.append('input')
145135
.attr('type', 'button')
146136
.attr('id', 'approve')
@@ -156,6 +146,15 @@
156146
body.append('br');
157147
body.append('br');
158148

149+
body.append('iframe')
150+
.attr('width', 350)
151+
.attr('height', 350)
152+
.attr('scrolling', 'no')
153+
.attr('style', "border:1px solid grey");
154+
155+
body.append('br');
156+
body.append('br');
157+
159158
body.append('textarea')
160159
.attr('rows', '5')
161160
.attr('cols', '44')

testpy/testdynamic.py

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
import os
2-
import redis
32
import json
3+
from durable.lang import *
44
from durable import engine
5-
from durable import interface
6-
from werkzeug.routing import Rule
75
from werkzeug.wrappers import Request, Response
6+
from werkzeug.routing import Map, Rule
7+
from werkzeug.exceptions import HTTPException, NotFound
88
from werkzeug.wsgi import SharedDataMiddleware
9-
9+
from werkzeug.serving import run_simple
1010

1111
class Host(engine.Host):
1212

1313
def __init__(self):
1414
super(Host, self).__init__()
15-
self._redis_server = redis.Redis()
1615

1716
def get_action(self, action_name):
1817
def print_lamba(c):
@@ -21,25 +20,57 @@ def print_lamba(c):
2120

2221
return print_lamba;
2322

24-
def load_ruleset(self, ruleset_name):
25-
ruleset_definition = self._redis_server.hget('rulesets', ruleset_name)
26-
if ruleset_definition:
27-
return json.loads(ruleset_definition)
28-
else:
29-
raise Exception('Ruleset with name {0} not found'.format(ruleset_name))
3023

31-
def save_ruleset(self, ruleset_name, ruleset_definition):
32-
print('save ' + json.dumps(ruleset_definition))
33-
self._redis_server.hset('rulesets', ruleset_name, json.dumps(ruleset_definition))
24+
class Application(object):
25+
26+
def __init__(self):
27+
self._url_map = Map([Rule('/<ruleset_name>/definition', endpoint=self._ruleset_definition_request),
28+
Rule('/<ruleset_name>/state/<sid>', endpoint=self._state_request),
29+
Rule('/<ruleset_name>/events/<sid>', endpoint=self._events_request),
30+
Rule('/testdynamic.html', endpoint=self._dynamic_request),
31+
Rule('/durableVisual.js', endpoint=self._dynamic_request),
32+
Rule('/<ruleset_name>/<sid>/admin.html', endpoint=self._admin_request),
33+
Rule('/favicon.ico', endpoint=self._empty)])
3434

35+
self._host = Host();
3536

36-
class Application(interface.Application):
3737

38-
def __init__(self, host):
39-
super(Application, self).__init__(host, '127.0.0.1', 5000, [Rule('/testdynamic.html', endpoint=self._dynamic_request),
40-
Rule('/durableVisual.js', endpoint=self._dynamic_request),
41-
Rule('/<ruleset_name>/<sid>/admin.html', endpoint=self._admin_request),
42-
Rule('/favicon.ico', endpoint=self._empty)])
38+
def _ruleset_definition_request(self, environ, start_response, ruleset_name):
39+
def encode_promise(obj):
40+
if isinstance(obj, engine.Promise) or hasattr(obj, '__call__'):
41+
return 'function'
42+
raise TypeError(repr(obj) + " is not JSON serializable")
43+
44+
request = Request(environ)
45+
if request.method == 'GET':
46+
result = self._host.get_ruleset(ruleset_name)
47+
return Response(json.dumps(result.get_definition(), default=encode_promise))(environ, start_response)
48+
elif request.method == 'POST':
49+
ruleset_definition = json.loads(request.stream.read().decode('utf-8'))
50+
self._host.set_rulesets(ruleset_definition)
51+
52+
return Response()(environ, start_response)
53+
54+
def _state_request(self, environ, start_response, ruleset_name, sid):
55+
request = Request(environ)
56+
result = None
57+
if request.method == 'GET':
58+
result = self._host.get_state(ruleset_name, sid)
59+
return Response(json.dumps(result))(environ, start_response)
60+
elif request.method == 'POST':
61+
message = json.loads(request.stream.read().decode('utf-8'))
62+
message['sid'] = sid
63+
result = self._host.update_state(ruleset_name, message)
64+
return Response(json.dumps({'outcome': result}))(environ, start_response)
65+
66+
def _events_request(self, environ, start_response, ruleset_name, sid):
67+
request = Request(environ)
68+
result = None
69+
if request.method == 'POST':
70+
message = json.loads(request.stream.read().decode('utf-8'))
71+
message['sid'] = sid
72+
result = self._host.post(ruleset_name, message)
73+
return Response(json.dumps({'outcome': result}))(environ, start_response)
4374

4475
def _empty(self, environ, start_response):
4576
return Response()(environ, start_response)
@@ -55,8 +86,19 @@ def _admin_request(self, environ, start_response, ruleset_name, sid):
5586
middleware = SharedDataMiddleware(self._not_found, {'/{0}/{1}/'.format(ruleset_name, sid): os.path.dirname(__file__)})
5687
return middleware(environ, start_response)
5788

89+
def __call__(self, environ, start_response):
90+
request = Request(environ)
91+
adapter = self._url_map.bind_to_environ(environ)
92+
try:
93+
endpoint, values = adapter.match()
94+
return endpoint(environ, start_response, **values)
95+
except HTTPException as e:
96+
return e
97+
98+
def run(self):
99+
run_simple('127.0.0.1', 5000, self, threaded = True)
100+
101+
58102
if __name__ == '__main__':
59-
main_host = Host()
60-
main_host.run()
61-
main_app = Application(main_host)
103+
main_app = Application()
62104
main_app.run()

0 commit comments

Comments
 (0)