Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagecell
Path: blob/master/timing/test_scripts/sagecell.py
447 views
1
import random
2
from MultipartPostHandler import encode_request
3
from urllib2 import urlopen, Request
4
from urllib import urlencode
5
from json import loads
6
7
8
EVAL_PATH='/eval'
9
POLL_PATH='/output_poll'
10
FILE_PATH='/files'
11
12
13
class Session:
14
def __init__(self, server):
15
server=server.rstrip('/')
16
self.server=server
17
self.session=random.random()
18
19
def prepare_execution_request(self, code, files=None, sage_mode=True):
20
"""
21
Prepare an execution request prior to sending it.
22
23
We break up the preparation and sending phases so that it is easy
24
to time just the request.
25
"""
26
msg=[('session_id', self.session),
27
('commands', code),
28
('msg_id', random.random()),
29
('sage_mode', True if sage_mode else False)]
30
if files is not None:
31
for filename in files:
32
msg.append(('file', open(filename,"rb")))
33
request=Request(self.server+EVAL_PATH, msg)
34
return encode_request(request)
35
36
def send_execution_request(self, request):
37
"""
38
Send an execution request along with a number of files.
39
40
TODO: break into a "prepare" and "send" function for timing?
41
"""
42
result=urlopen(request).read()
43
if result:
44
try:
45
jsonresult=loads(result)
46
self.session = jsonresult["session_id"]
47
return jsonresult
48
except ValueError:
49
return result
50
else:
51
return result
52
53
def output_poll(self, sequence=0):
54
query=urlencode([('computation_id', self.session),
55
('sequence',sequence)])
56
url=self.server+POLL_PATH+'?'+query
57
return loads(urlopen(url).read())
58
59
def get_file(self, filename):
60
return urlopen(self.server+"%s/%s/%s"%(FILE_PATH,self.session,filename)).read()
61
62
63