upgrade to python3;add some validator examples

This commit is contained in:
2025-10-11 12:33:24 +08:00
parent 65632f0e60
commit 487c041148
25 changed files with 1492 additions and 317 deletions

View File

@@ -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)