upgrade to python3;add some validator examples
This commit is contained in:
@@ -1,10 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import logging, os, sys, socket, time, xmlrpclib, bz2, Cookie
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import socket
|
||||
import time
|
||||
import xmlrpc.client as xmlrpclib
|
||||
import bz2
|
||||
import http.cookies as Cookie
|
||||
import unittest
|
||||
from engineconfig import getConfig
|
||||
from entity import Submit, Problem, TestCase, PresetCode, DataFile
|
||||
|
||||
class DataSourceError(Exception): pass
|
||||
|
||||
class DataSourceError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class DataSource:
|
||||
|
||||
@@ -17,12 +29,14 @@ class DataSource:
|
||||
|
||||
def _get_config_retry(self):
|
||||
ret = self.config.retry
|
||||
if ret < 1: ret = 1
|
||||
if ret < 1:
|
||||
ret = 1
|
||||
return ret
|
||||
|
||||
def _get_config_retry_wait(self):
|
||||
ret = self.config.retry_wait
|
||||
if ret < 0.1: ret = 0.1
|
||||
if ret < 0.1:
|
||||
ret = 0.1
|
||||
return ret
|
||||
|
||||
def _do_action(self, func, args):
|
||||
@@ -32,7 +46,7 @@ class DataSource:
|
||||
while retry > 0:
|
||||
try:
|
||||
ret = func(*args)
|
||||
except DataSourceError, e:
|
||||
except DataSourceError:
|
||||
self.logger.exception("DataSourceError")
|
||||
if retry > 0:
|
||||
time.sleep(retry_wait)
|
||||
@@ -74,7 +88,7 @@ class DataSource:
|
||||
ret.append(TestCase(self, row))
|
||||
return ret
|
||||
|
||||
def get_test(self, tid, raw = True):
|
||||
def get_test(self, tid, raw=True):
|
||||
func = self.driver.get_test
|
||||
args = (tid, )
|
||||
row = self._do_action(func, args)
|
||||
@@ -87,13 +101,13 @@ class DataSource:
|
||||
func = self.driver.get_presetcodes
|
||||
args = (pid, lang)
|
||||
rows = self._do_action(func, args)
|
||||
return map(lambda row: PresetCode(self, row), rows)
|
||||
return list(map(lambda row: PresetCode(self, row), rows))
|
||||
|
||||
def get_datafiles(self, pid):
|
||||
func = self.driver.get_datafiles
|
||||
args = (pid, )
|
||||
rows = self._do_action(func, args)
|
||||
return map(lambda row: DataFile(self, row), rows)
|
||||
return list(map(lambda row: DataFile(self, row), rows))
|
||||
|
||||
def get_datafile_data(self, datafileid):
|
||||
func = self.driver.get_datafile_data
|
||||
@@ -139,7 +153,7 @@ class DataSource:
|
||||
class JspAuthTransport(xmlrpclib.Transport):
|
||||
def __init__(self):
|
||||
xmlrpclib.Transport.__init__(self)
|
||||
self.__cookies = Cookie.SmartCookie()
|
||||
self.__cookies = Cookie.SimpleCookie()
|
||||
|
||||
def request(self, host, handler, request_body, verbose=0):
|
||||
# issue XML-RPC request
|
||||
@@ -168,17 +182,17 @@ class JspAuthTransport(xmlrpclib.Transport):
|
||||
|
||||
|
||||
def get_jsession_id(self):
|
||||
if self.__cookies.has_key('MoodleSession'):
|
||||
if 'MoodleSession' in self.__cookies:
|
||||
return self.__cookies['MoodleSession'].value
|
||||
return None
|
||||
|
||||
|
||||
def __sendJsessionCookie(self, connection):
|
||||
if self.__cookies.has_key('MoodleSession'):
|
||||
if 'MoodleSession' in self.__cookies:
|
||||
connection.putheader(
|
||||
'Cookie',
|
||||
'MoodleSession=%s' % self.__cookies['MoodleSession'].value)
|
||||
if self.__cookies.has_key('MoodleSessionTest'):
|
||||
if 'MoodleSessionTest' in self.__cookies:
|
||||
connection.putheader(
|
||||
'Cookie',
|
||||
'MoodleSessionTest=%s' % self.__cookies['MoodleSessionTest'].value)
|
||||
@@ -209,9 +223,9 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.get_judge_id()
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_judge_id')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -219,9 +233,9 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.reset_submits(judgeid)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to reset_submits')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -230,12 +244,12 @@ class XmlRpcDataSource:
|
||||
try:
|
||||
submits = self.server.oj.get_submits(judgeid, limit)
|
||||
for submit in submits:
|
||||
if not isinstance(submit['code'], (str, unicode)):
|
||||
if not isinstance(submit['code'], str):
|
||||
submit['code'] = submit['code'].__str__()
|
||||
return submits
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
time.sleep(self.config.retry_wait)
|
||||
self.logger.exception('Failed to get_submits')
|
||||
|
||||
@@ -243,9 +257,9 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.get_problem(problemid)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_problem')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -254,15 +268,15 @@ class XmlRpcDataSource:
|
||||
try:
|
||||
tests = self.server.oj.get_tests(problemid, full)
|
||||
for test in tests:
|
||||
if not isinstance(test['input'], (str, unicode)):
|
||||
if not isinstance(test['input'], str):
|
||||
test['input'] = test['input'].__str__()
|
||||
if not isinstance(test['output'], (str, unicode)):
|
||||
if not isinstance(test['output'], str):
|
||||
test['output'] = test['output'].__str__()
|
||||
self.logger.debug('Got %d test case(s)', len(tests))
|
||||
return tests
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_tests')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -270,16 +284,16 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
test = self.server.oj.get_gztest(testid)
|
||||
if not isinstance(test['input'], (str, unicode)):
|
||||
if not isinstance(test['input'], str):
|
||||
test['input'] = test['input'].__str__()
|
||||
if not isinstance(test['output'], (str, unicode)):
|
||||
if not isinstance(test['output'], str):
|
||||
test['output'] = test['output'].__str__()
|
||||
test['input'] = bz2.decompress(test['input'])
|
||||
test['output'] = bz2.decompress(test['output'])
|
||||
return test
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_tests')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -288,13 +302,13 @@ class XmlRpcDataSource:
|
||||
try:
|
||||
codes = self.server.oj.get_presetcodes(problemid, lang)
|
||||
for code in codes:
|
||||
if not isinstance(code['code'], (str, unicode)):
|
||||
if not isinstance(code['code'], str):
|
||||
code['code'] = code['code'].__str__()
|
||||
self.logger.debug('Got %d presetcodes', len(codes))
|
||||
return codes
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_presetcodes')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -304,9 +318,9 @@ class XmlRpcDataSource:
|
||||
files = self.server.oj.get_datafiles(problemid)
|
||||
self.logger.debug('Got %d datafiles', len(files))
|
||||
return files
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_datafiles')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -315,9 +329,9 @@ class XmlRpcDataSource:
|
||||
try:
|
||||
data = self.server.oj.get_datafile_data(datafileid)
|
||||
return str(data)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_datafiles')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -327,24 +341,24 @@ class XmlRpcDataSource:
|
||||
try:
|
||||
return self.server.oj.update_submit_compilemessage(
|
||||
id, compilemsg)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to update_submit_compilemessage')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
def update_submit_test_results(self, id, results):
|
||||
for r in results:
|
||||
if not isinstance(r['stdout'], (str, unicode)): r['stdout'] = ''
|
||||
if not isinstance(r['stderr'], (str, unicode)): r['stderr'] = ''
|
||||
if not isinstance(r['stdout'], str): r['stdout'] = ''
|
||||
if not isinstance(r['stderr'], str): r['stderr'] = ''
|
||||
r['stdout'] = xmlrpclib.Binary(r['stdout'])
|
||||
r['stderr'] = xmlrpclib.Binary(r['stderr'])
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.update_submit_test_results(id, results)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to update_submit_compilemessage')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -355,9 +369,9 @@ class XmlRpcDataSource:
|
||||
mc.oj.update_submit_status(id, newstatus)
|
||||
try:
|
||||
return mc()
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
raise DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to update_submits_status')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -365,9 +379,9 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.get_submit_status(sid)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
return DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_submit_status')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -375,13 +389,13 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
msg = self.server.oj.get_submit_compilemessage(sid)
|
||||
if isinstance(msg, (str, unicode)):
|
||||
if isinstance(msg, str):
|
||||
return msg
|
||||
else:
|
||||
return msg.__str__()
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
return DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_submit_status')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
@@ -389,16 +403,16 @@ class XmlRpcDataSource:
|
||||
while True:
|
||||
try:
|
||||
return self.server.oj.get_submit(sid)
|
||||
except xmlrpclib.Error, e:
|
||||
except xmlrpclib.Error as e:
|
||||
return DataSourceError(e)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
self.logger.exception('Failed to get_submit')
|
||||
time.sleep(self.config.retry_wait)
|
||||
|
||||
class DataSourceTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
execfile(os.path.join('..', 'testdata', 'test_config.py'))
|
||||
exec(open(os.path.join('..', 'testdata', 'test_config.py')).read())
|
||||
self.config = getConfig()
|
||||
self.datasource = self.config.datasources[0]
|
||||
self.dbname = os.path.join('..', 'testdata', self.config.testdb)
|
||||
|
||||
Reference in New Issue
Block a user