11from __future__ import absolute_import , print_function
2- from cyaron import IO , log
2+ from .io import IO
3+ from . import log
34from cyaron .utils import *
45from cyaron .consts import *
56from cyaron .graders import CYaRonGraders
@@ -17,7 +18,7 @@ def __init__(self, name, mismatch):
1718 self .mismatch = mismatch
1819
1920 def __str__ (self ):
20- return ' In program: \ ' {}\ ' . {}' .format (self .name ,self .mismatch )
21+ return " In program: '{}'. {}" .format (self .name , self .mismatch )
2122
2223
2324class Compare :
@@ -37,7 +38,7 @@ def __process_file(file):
3738 file .output_file .seek (0 )
3839 return file .output_filename , file .output_file .read ()
3940 else :
40- with open (file , "r" , newline = ' \n ' ) as f :
41+ with open (file , "r" , newline = " \n " ) as f :
4142 return file , f .read ()
4243
4344 @staticmethod
@@ -50,26 +51,43 @@ def __normal_max_workers(workers):
5051
5152 @classmethod
5253 def output (cls , * files , ** kwargs ):
53- kwargs = unpack_kwargs ('output' , kwargs , ('std' , ('grader' , DEFAULT_GRADER ), ('max_workers' , - 1 ),
54- ('job_pool' , None ), ('stop_on_incorrect' , None )))
55- std = kwargs ['std' ]
56- grader = kwargs ['grader' ]
57- max_workers = kwargs ['max_workers' ]
58- job_pool = kwargs ['job_pool' ]
59- if kwargs ['stop_on_incorrect' ] is not None :
54+ kwargs = unpack_kwargs (
55+ "output" ,
56+ kwargs ,
57+ (
58+ "std" ,
59+ ("grader" , DEFAULT_GRADER ),
60+ ("max_workers" , - 1 ),
61+ ("job_pool" , None ),
62+ ("stop_on_incorrect" , None ),
63+ ),
64+ )
65+ std = kwargs ["std" ]
66+ grader = kwargs ["grader" ]
67+ max_workers = kwargs ["max_workers" ]
68+ job_pool = kwargs ["job_pool" ]
69+ if kwargs ["stop_on_incorrect" ] is not None :
6070 log .warn ("parameter stop_on_incorrect is deprecated and has no effect." )
6171
6272 if (max_workers is None or max_workers >= 0 ) and job_pool is None :
6373 max_workers = cls .__normal_max_workers (max_workers )
6474 try :
6575 from concurrent .futures import ThreadPoolExecutor
76+
6677 with ThreadPoolExecutor (max_workers = max_workers ) as job_pool :
67- return cls .output (* files , std = std , grader = grader , max_workers = max_workers , job_pool = job_pool )
78+ return cls .output (
79+ * files ,
80+ std = std ,
81+ grader = grader ,
82+ max_workers = max_workers ,
83+ job_pool = job_pool
84+ )
6885 except ImportError :
6986 pass
7087
7188 def get_std ():
7289 return cls .__process_file (std )[1 ]
90+
7391 if job_pool is not None :
7492 std = job_pool .submit (get_std ).result ()
7593 else :
@@ -86,61 +104,118 @@ def do(file):
86104
87105 @classmethod
88106 def program (cls , * programs , ** kwargs ):
89- kwargs = unpack_kwargs ('program' , kwargs , ('input' , ('std' , None ), ('std_program' , None ),
90- ('grader' , DEFAULT_GRADER ), ('max_workers' , - 1 ),
91- ('job_pool' , None ), ('stop_on_incorrect' , None )))
92- input = kwargs ['input' ]
93- std = kwargs ['std' ]
94- std_program = kwargs ['std_program' ]
95- grader = kwargs ['grader' ]
96- max_workers = kwargs ['max_workers' ]
97- job_pool = kwargs ['job_pool' ]
98- if kwargs ['stop_on_incorrect' ] is not None :
107+ kwargs = unpack_kwargs (
108+ "program" ,
109+ kwargs ,
110+ (
111+ "input" ,
112+ ("std" , None ),
113+ ("std_program" , None ),
114+ ("grader" , DEFAULT_GRADER ),
115+ ("max_workers" , - 1 ),
116+ ("job_pool" , None ),
117+ ("stop_on_incorrect" , None ),
118+ ),
119+ )
120+ input = kwargs ["input" ]
121+ std = kwargs ["std" ]
122+ std_program = kwargs ["std_program" ]
123+ grader = kwargs ["grader" ]
124+ max_workers = kwargs ["max_workers" ]
125+ job_pool = kwargs ["job_pool" ]
126+ if kwargs ["stop_on_incorrect" ] is not None :
99127 log .warn ("parameter stop_on_incorrect is deprecated and has no effect." )
100128
101129 if (max_workers is None or max_workers >= 0 ) and job_pool is None :
102130 max_workers = cls .__normal_max_workers (max_workers )
103131 try :
104132 from concurrent .futures import ThreadPoolExecutor
133+
105134 with ThreadPoolExecutor (max_workers = max_workers ) as job_pool :
106- return cls .program (* programs , input = input , std = std , std_program = std_program , grader = grader , max_workers = max_workers , job_pool = job_pool )
135+ return cls .program (
136+ * programs ,
137+ input = input ,
138+ std = std ,
139+ std_program = std_program ,
140+ grader = grader ,
141+ max_workers = max_workers ,
142+ job_pool = job_pool
143+ )
107144 except ImportError :
108145 pass
109146
110147 if not isinstance (input , IO ):
111- raise TypeError ("expect {}, got {}" .format (type (IO ).__name__ , type (input ).__name__ ))
148+ raise TypeError (
149+ "expect {}, got {}" .format (type (IO ).__name__ , type (input ).__name__ )
150+ )
112151 input .flush_buffer ()
113152 input .input_file .seek (0 )
114153
115154 if std_program is not None :
155+
116156 def get_std ():
117- with open (os .dup (input .input_file .fileno ()), 'r' , newline = '\n ' ) as input_file :
118- content = make_unicode (subprocess .check_output (std_program , shell = (not list_like (std_program )), stdin = input .input_file , universal_newlines = True ))
157+ with open (
158+ os .dup (input .input_file .fileno ()), "r" , newline = "\n "
159+ ) as input_file :
160+ content = make_unicode (
161+ subprocess .check_output (
162+ std_program ,
163+ shell = (not list_like (std_program )),
164+ stdin = input .input_file ,
165+ universal_newlines = True ,
166+ )
167+ )
119168 input_file .seek (0 )
120169 return content
170+
121171 if job_pool is not None :
122172 std = job_pool .submit (get_std ).result ()
123173 else :
124174 std = get_std ()
125175 elif std is not None :
176+
126177 def get_std ():
127178 return cls .__process_file (std )[1 ]
179+
128180 if job_pool is not None :
129181 std = job_pool .submit (get_std ).result ()
130182 else :
131183 std = get_std ()
132184 else :
133- raise TypeError ('program() missing 1 required non-None keyword-only argument: \' std\' or \' std_program\' ' )
185+ raise TypeError (
186+ "program() missing 1 required non-None keyword-only argument: 'std' or 'std_program'"
187+ )
134188
135189 def do (program_name ):
136190 timeout = None
137- if list_like (program_name ) and len (program_name ) == 2 and int_like (program_name [- 1 ]):
191+ if (
192+ list_like (program_name )
193+ and len (program_name ) == 2
194+ and int_like (program_name [- 1 ])
195+ ):
138196 program_name , timeout = program_name
139- with open (os .dup (input .input_file .fileno ()), 'r' , newline = '\n ' ) as input_file :
197+ with open (
198+ os .dup (input .input_file .fileno ()), "r" , newline = "\n "
199+ ) as input_file :
140200 if timeout is None :
141- content = make_unicode (subprocess .check_output (program_name , shell = (not list_like (program_name )), stdin = input_file , universal_newlines = True ))
201+ content = make_unicode (
202+ subprocess .check_output (
203+ program_name ,
204+ shell = (not list_like (program_name )),
205+ stdin = input_file ,
206+ universal_newlines = True ,
207+ )
208+ )
142209 else :
143- content = make_unicode (subprocess .check_output (program_name , shell = (not list_like (program_name )), stdin = input_file , universal_newlines = True , timeout = timeout ))
210+ content = make_unicode (
211+ subprocess .check_output (
212+ program_name ,
213+ shell = (not list_like (program_name )),
214+ stdin = input_file ,
215+ universal_newlines = True ,
216+ timeout = timeout ,
217+ )
218+ )
144219 input_file .seek (0 )
145220 cls .__compare_two (program_name , content , std , grader )
146221
0 commit comments