Skip to content

Commit d5f7980

Browse files
authored
Merge branch 'master' into dev
2 parents ea647b7 + c92f60d commit d5f7980

File tree

18 files changed

+1194
-471
lines changed

18 files changed

+1194
-471
lines changed

.github/workflows/test.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: Python package
2+
3+
on:
4+
- push
5+
- pull_request
6+
7+
jobs:
8+
build:
9+
strategy:
10+
matrix:
11+
platform: [ubuntu-20.04, windows-latest]
12+
runs-on: ${{ matrix.platform }}
13+
steps:
14+
- uses: actions/checkout@v3
15+
- name: Set up Python 3.6
16+
uses: actions/setup-python@v4
17+
with:
18+
python-version: '3.6'
19+
- name: Set up Python 3.8
20+
uses: actions/setup-python@v4
21+
with:
22+
python-version: '3.8'
23+
- name: Set up Python 3.10
24+
uses: actions/setup-python@v4
25+
with:
26+
python-version: '3.10'
27+
- name: Set up Python 3.12
28+
uses: actions/setup-python@v4
29+
with:
30+
python-version: '3.12'
31+
- name: Install dependencies
32+
run: |
33+
python -m pip install --upgrade pip
34+
python -m pip install tox
35+
- name: Test with tox
36+
run: python -m tox

.gitignore

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
config.py
22
*.in
33
*.out
4+
*.exe
45

56
# Created by .ignore support plugin (hsz.mobi)
67
### Python template
@@ -131,4 +132,11 @@ docs/_build/
131132
target/
132133

133134
# Pycharm
134-
venv
135+
venv/
136+
137+
*.DS_Store
138+
139+
# VS Code
140+
.vscode
141+
142+
.python-version

.pylintrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[MASTER]
2+
py-version=3.5
3+
disable=R0902,R0903,R0913,R0917,R0912

cyaron/__init__.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@
55
"""
66

77
from __future__ import absolute_import
8+
9+
from random import choice, randint, random, randrange, uniform
10+
11+
#from .visual import visualize
12+
from . import log
13+
from .compare import Compare
14+
from .consts import *
15+
from .graph import Edge, Graph
816
from .io import IO
9-
from .graph import Graph, Edge
10-
from .string import String
17+
from .math import *
18+
from .merger import Merger
19+
from .polygon import Polygon
1120
from .sequence import Sequence
21+
from .string import String
1222
from .utils import *
13-
from .consts import *
1423
from .vector import Vector
15-
from .polygon import Polygon
16-
from .compare import Compare
17-
from .math import *
18-
from .merger import Merger
19-
#from .visual import visualize
20-
from . import log
21-
from random import randint, randrange, uniform, choice, random

cyaron/compare.py

Lines changed: 105 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import absolute_import, print_function
2-
from cyaron import IO, log
2+
from .io import IO
3+
from . import log
34
from cyaron.utils import *
45
from cyaron.consts import *
56
from 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

2324
class 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

Comments
 (0)