rbx.cp 0.5.63__py3-none-any.whl → 0.5.65__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rbx/box/cli.py +24 -13
- rbx/box/contest/build_contest_statements.py +2 -1
- rbx/box/formatting.py +29 -0
- rbx/box/packaging/boca/upload.py +18 -0
- rbx/box/packaging/main.py +4 -3
- rbx/box/setter_config.py +4 -0
- rbx/box/solutions.py +48 -15
- rbx/box/statements/build_statements.py +2 -1
- rbx/box/testcase_utils.py +6 -1
- {rbx_cp-0.5.63.dist-info → rbx_cp-0.5.65.dist-info}/METADATA +1 -1
- {rbx_cp-0.5.63.dist-info → rbx_cp-0.5.65.dist-info}/RECORD +14 -14
- {rbx_cp-0.5.63.dist-info → rbx_cp-0.5.65.dist-info}/LICENSE +0 -0
- {rbx_cp-0.5.63.dist-info → rbx_cp-0.5.65.dist-info}/WHEEL +0 -0
- {rbx_cp-0.5.63.dist-info → rbx_cp-0.5.65.dist-info}/entry_points.txt +0 -0
rbx/box/cli.py
CHANGED
@@ -3,7 +3,7 @@ import shlex
|
|
3
3
|
import shutil
|
4
4
|
import sys
|
5
5
|
import tempfile
|
6
|
-
from typing import Annotated, Optional
|
6
|
+
from typing import Annotated, List, Optional
|
7
7
|
|
8
8
|
import rich
|
9
9
|
import rich.prompt
|
@@ -32,6 +32,7 @@ from rbx.box.packaging import main as packaging
|
|
32
32
|
from rbx.box.schema import CodeItem, ExpectedOutcome, TestcaseGroup
|
33
33
|
from rbx.box.solutions import (
|
34
34
|
estimate_time_limit,
|
35
|
+
expand_solutions,
|
35
36
|
get_exact_matching_solutions,
|
36
37
|
get_matching_solutions,
|
37
38
|
pick_solutions,
|
@@ -178,10 +179,10 @@ async def build(verification: environment.VerificationParam):
|
|
178
179
|
@syncer.sync
|
179
180
|
async def run(
|
180
181
|
verification: environment.VerificationParam,
|
181
|
-
|
182
|
-
Optional[str],
|
182
|
+
solutions: Annotated[
|
183
|
+
Optional[List[str]],
|
183
184
|
typer.Argument(
|
184
|
-
help='Path to
|
185
|
+
help='Path to solutions to run. If not specified, will run all solutions.'
|
185
186
|
),
|
186
187
|
] = None,
|
187
188
|
outcome: Optional[str] = typer.Option(
|
@@ -235,11 +236,16 @@ async def run(
|
|
235
236
|
str(solution.path)
|
236
237
|
for solution in get_matching_solutions(ExpectedOutcome(outcome))
|
237
238
|
}
|
238
|
-
if
|
239
|
-
tracked_solutions =
|
239
|
+
if solutions:
|
240
|
+
tracked_solutions = set(solutions)
|
240
241
|
|
241
242
|
if choice:
|
242
|
-
tracked_solutions = set(
|
243
|
+
tracked_solutions = set(
|
244
|
+
await pick_solutions(
|
245
|
+
tracked_solutions,
|
246
|
+
extra_solutions=await expand_solutions(solutions or []),
|
247
|
+
)
|
248
|
+
)
|
243
249
|
if not tracked_solutions:
|
244
250
|
console.console.print('[error]No solutions selected. Exiting.[/error]')
|
245
251
|
raise typer.Exit(1)
|
@@ -395,10 +401,10 @@ async def time(
|
|
395
401
|
@syncer.sync
|
396
402
|
async def irun(
|
397
403
|
verification: environment.VerificationParam,
|
398
|
-
|
399
|
-
Optional[str],
|
404
|
+
solutions: Annotated[
|
405
|
+
Optional[List[str]],
|
400
406
|
typer.Argument(
|
401
|
-
help='Path to
|
407
|
+
help='Path to solutions to run. If not specified, will run all solutions.'
|
402
408
|
),
|
403
409
|
] = None,
|
404
410
|
outcome: Optional[str] = typer.Option(
|
@@ -466,11 +472,16 @@ async def irun(
|
|
466
472
|
str(solution.path)
|
467
473
|
for solution in get_matching_solutions(ExpectedOutcome(outcome))
|
468
474
|
}
|
469
|
-
if
|
470
|
-
tracked_solutions =
|
475
|
+
if solutions:
|
476
|
+
tracked_solutions = set(solutions)
|
471
477
|
|
472
478
|
if choice:
|
473
|
-
tracked_solutions = set(
|
479
|
+
tracked_solutions = set(
|
480
|
+
await pick_solutions(
|
481
|
+
tracked_solutions,
|
482
|
+
extra_solutions=await expand_solutions(solutions or []),
|
483
|
+
)
|
484
|
+
)
|
474
485
|
if not tracked_solutions:
|
475
486
|
console.console.print('[error]No solutions selected. Exiting.[/error]')
|
476
487
|
raise typer.Exit(1)
|
@@ -10,6 +10,7 @@ from rbx import console, testing_utils
|
|
10
10
|
from rbx.box import cd, package
|
11
11
|
from rbx.box.contest.contest_package import get_problems
|
12
12
|
from rbx.box.contest.schema import Contest, ContestProblem, ContestStatement
|
13
|
+
from rbx.box.formatting import href
|
13
14
|
from rbx.box.schema import Package, Testcase
|
14
15
|
from rbx.box.statements import build_statements
|
15
16
|
from rbx.box.statements.build_statements import (
|
@@ -344,6 +345,6 @@ def build_statement(
|
|
344
345
|
console.console.print(
|
345
346
|
f'Statement built successfully for language '
|
346
347
|
f'[item]{statement.language}[/item] at '
|
347
|
-
f'
|
348
|
+
f'{href(statement_path)}'
|
348
349
|
)
|
349
350
|
return statement_path
|
rbx/box/formatting.py
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
import os
|
2
|
+
import pathlib
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
from rbx.box import setter_config
|
6
|
+
|
7
|
+
|
8
|
+
def href(url: os.PathLike[str], text: Optional[str] = None, style: str = 'item') -> str:
|
9
|
+
custom_text = False
|
10
|
+
if text is None:
|
11
|
+
text = str(url)
|
12
|
+
else:
|
13
|
+
custom_text = True
|
14
|
+
|
15
|
+
if not custom_text:
|
16
|
+
if not setter_config.get_setter_config().hyperlinks:
|
17
|
+
return f'[{style}]{text}[/{style}]'
|
18
|
+
if os.environ.get('TERM') in ['vscode']:
|
19
|
+
return f'[{style}]{text}[/{style}]'
|
20
|
+
|
21
|
+
if isinstance(url, pathlib.Path):
|
22
|
+
url = url.resolve()
|
23
|
+
|
24
|
+
url_str = str(url)
|
25
|
+
if pathlib.Path(url_str).exists():
|
26
|
+
url_str = f'file://{url_str}'
|
27
|
+
return f'[{style}][link={url_str}]{text}[/link][/{style}]'
|
28
|
+
|
29
|
+
|
1
30
|
def get_formatted_memory(memory_in_bytes: int, mib_decimal_places: int = 0) -> str:
|
2
31
|
if memory_in_bytes < 1024 * 1024:
|
3
32
|
if memory_in_bytes < 1024:
|
rbx/box/packaging/boca/upload.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import datetime
|
2
|
+
import functools
|
2
3
|
import hashlib
|
3
4
|
import os
|
4
5
|
import pathlib
|
@@ -41,6 +42,8 @@ class BocaUploader:
|
|
41
42
|
self.username = _parse_env_var('BOCA_USERNAME', username)
|
42
43
|
self.password = _parse_env_var('BOCA_PASSWORD', password)
|
43
44
|
|
45
|
+
self.loggedIn = False
|
46
|
+
|
44
47
|
self.br = mechanize.Browser()
|
45
48
|
self.br.set_handle_robots(False)
|
46
49
|
self.br.addheaders = [ # type: ignore
|
@@ -140,6 +143,9 @@ class BocaUploader:
|
|
140
143
|
return self.log_response_alert(response, error_msg)
|
141
144
|
|
142
145
|
def login(self):
|
146
|
+
if self.loggedIn:
|
147
|
+
return
|
148
|
+
|
143
149
|
_, html = self.open(
|
144
150
|
f'{self.base_url}', error_msg='Error while opening BOCA login page'
|
145
151
|
)
|
@@ -157,6 +163,8 @@ class BocaUploader:
|
|
157
163
|
login_url = f'{self.base_url}?name={self.username}&password={pwd_hash}'
|
158
164
|
self.open(login_url, error_msg='Error while logging in to BOCA')
|
159
165
|
|
166
|
+
self.loggedIn = True
|
167
|
+
|
160
168
|
def upload(self, file: pathlib.Path) -> bool:
|
161
169
|
self.open(
|
162
170
|
f'{self.base_url}/admin/problem.php',
|
@@ -226,6 +234,7 @@ class BocaUploader:
|
|
226
234
|
console.console.print(
|
227
235
|
f'[warning]Potentially transient error while uploading problem to BOCA. Retrying ({tries}/{RETRIES})...[/warning]'
|
228
236
|
)
|
237
|
+
self.loggedIn = False
|
229
238
|
continue
|
230
239
|
|
231
240
|
ok = True
|
@@ -245,3 +254,12 @@ class BocaUploader:
|
|
245
254
|
'[warning]Check [item]https://www.php.net/manual/en/ini.core.php#ini.sect.file-uploads[/item] for more information.[/warning]'
|
246
255
|
)
|
247
256
|
raise typer.Exit(1)
|
257
|
+
|
258
|
+
|
259
|
+
@functools.lru_cache
|
260
|
+
def get_boca_uploader(
|
261
|
+
base_url: Optional[str] = None,
|
262
|
+
username: Optional[str] = None,
|
263
|
+
password: Optional[str] = None,
|
264
|
+
) -> BocaUploader:
|
265
|
+
return BocaUploader(base_url, username, password)
|
rbx/box/packaging/main.py
CHANGED
@@ -7,6 +7,7 @@ import typer
|
|
7
7
|
|
8
8
|
from rbx import annotations, console
|
9
9
|
from rbx.box import environment, header, package
|
10
|
+
from rbx.box.formatting import href
|
10
11
|
from rbx.box.naming import get_problem_name_with_contest_info
|
11
12
|
from rbx.box.package import get_build_path
|
12
13
|
from rbx.box.packaging.packager import BasePackager, BuiltStatement
|
@@ -62,7 +63,7 @@ async def run_packager(
|
|
62
63
|
console.console.print(
|
63
64
|
f'[success]Problem packaged for [item]{packager.name()}[/item]![/success]'
|
64
65
|
)
|
65
|
-
console.console.print(f'Package was saved at
|
66
|
+
console.console.print(f'Package was saved at {href(result_path)}')
|
66
67
|
return result_path
|
67
68
|
|
68
69
|
|
@@ -105,9 +106,9 @@ async def boca(
|
|
105
106
|
result_path = await run_packager(BocaPackager, verification=verification)
|
106
107
|
|
107
108
|
if upload:
|
108
|
-
from rbx.box.packaging.boca.upload import
|
109
|
+
from rbx.box.packaging.boca.upload import get_boca_uploader
|
109
110
|
|
110
|
-
uploader =
|
111
|
+
uploader = get_boca_uploader()
|
111
112
|
uploader.login_and_upload(result_path)
|
112
113
|
|
113
114
|
|
rbx/box/setter_config.py
CHANGED
@@ -71,6 +71,10 @@ class SetterConfig(BaseModel):
|
|
71
71
|
default={},
|
72
72
|
description='Substitutions to apply to commands before running them.',
|
73
73
|
)
|
74
|
+
hyperlinks: bool = Field(
|
75
|
+
default=True,
|
76
|
+
description='Whether to use hyperlinks in the terminal output.',
|
77
|
+
)
|
74
78
|
|
75
79
|
def substitute_command(self, command: str, sanitized: bool = False) -> str:
|
76
80
|
exe = shlex.split(command)[0]
|
rbx/box/solutions.py
CHANGED
@@ -26,7 +26,7 @@ from rbx.box.deferred import Deferred
|
|
26
26
|
from rbx.box.environment import (
|
27
27
|
VerificationLevel,
|
28
28
|
)
|
29
|
-
from rbx.box.formatting import get_formatted_memory, get_formatted_time
|
29
|
+
from rbx.box.formatting import get_formatted_memory, get_formatted_time, href
|
30
30
|
from rbx.box.generators import (
|
31
31
|
GenerationMetadata,
|
32
32
|
expand_generator_call,
|
@@ -166,7 +166,7 @@ def compile_solutions(
|
|
166
166
|
):
|
167
167
|
continue
|
168
168
|
if progress:
|
169
|
-
progress.update(f'Compiling solution
|
169
|
+
progress.update(f'Compiling solution {href(solution.path)}...')
|
170
170
|
try:
|
171
171
|
compiled_solutions[solution.path] = compile_item(
|
172
172
|
solution,
|
@@ -176,7 +176,7 @@ def compile_solutions(
|
|
176
176
|
)
|
177
177
|
except:
|
178
178
|
console.console.print(
|
179
|
-
f'[error]Failed compiling solution
|
179
|
+
f'[error]Failed compiling solution {href(solution.path)}.[/error]'
|
180
180
|
)
|
181
181
|
raise
|
182
182
|
|
@@ -204,7 +204,7 @@ def _run_solution(
|
|
204
204
|
|
205
205
|
if progress:
|
206
206
|
progress.update(
|
207
|
-
f'Running solution
|
207
|
+
f'Running solution {href(solution.path)} on test [item]{group.name}[/item] / [item]{i}[/item]...'
|
208
208
|
)
|
209
209
|
|
210
210
|
async def run_fn(i=i, testcase=testcase, output_path=output_path):
|
@@ -726,20 +726,53 @@ def _get_solution_repr(sol: Solution) -> List[Tuple[str, str]]:
|
|
726
726
|
]
|
727
727
|
|
728
728
|
|
729
|
-
async def
|
729
|
+
async def expand_solutions(sols: List[str]) -> List[Solution]:
|
730
730
|
pkg = package.find_problem_package_or_die()
|
731
|
-
|
732
|
-
tracked_solutions = set(str(sol.path) for sol in pkg.solutions)
|
731
|
+
seen_sols = set(str(sol.path) for sol in pkg.solutions)
|
733
732
|
|
733
|
+
# Dedup sols.
|
734
|
+
sols = [sol for sol in sols if str(sol) not in seen_sols]
|
735
|
+
|
736
|
+
# Ensure sols exist.
|
737
|
+
sols = [sol for sol in sols if pathlib.Path(sol).is_file()]
|
738
|
+
|
739
|
+
return [
|
740
|
+
Solution(path=pathlib.Path(sol), outcome=ExpectedOutcome.ACCEPTED)
|
741
|
+
for sol in sols
|
742
|
+
]
|
743
|
+
|
744
|
+
|
745
|
+
async def pick_solutions(
|
746
|
+
tracked_solutions: Optional[Set[str]],
|
747
|
+
extra_solutions: Optional[Iterable[Solution]] = None,
|
748
|
+
) -> List[str]:
|
749
|
+
extra_sols = set(extra_solutions) if extra_solutions is not None else set()
|
750
|
+
|
751
|
+
pkg = package.find_problem_package_or_die()
|
734
752
|
# Store in a separate list to maintain order with the package declaration.
|
735
753
|
import questionary
|
736
754
|
|
737
755
|
choices = [
|
738
|
-
questionary.Choice(
|
756
|
+
questionary.Choice(
|
757
|
+
title=_get_solution_repr(sol),
|
758
|
+
value=str(sol.path),
|
759
|
+
checked=tracked_solutions is None or str(sol.path) in tracked_solutions,
|
760
|
+
)
|
739
761
|
for sol in pkg.solutions
|
740
|
-
if str(sol.path) in tracked_solutions
|
741
762
|
]
|
742
763
|
|
764
|
+
seen_sols = set(str(sol.path) for sol in pkg.solutions)
|
765
|
+
|
766
|
+
if extra_sols:
|
767
|
+
# Add only new solutions.
|
768
|
+
choices.extend(
|
769
|
+
questionary.Choice(
|
770
|
+
title=_get_solution_repr(sol), value=str(sol.path), checked=True
|
771
|
+
)
|
772
|
+
for sol in extra_sols
|
773
|
+
if str(sol.path) not in seen_sols
|
774
|
+
)
|
775
|
+
|
743
776
|
picked = await questionary.checkbox('Select solutions', choices=choices).ask_async()
|
744
777
|
if picked is None:
|
745
778
|
raise typer.Abort()
|
@@ -1026,8 +1059,8 @@ def _print_solution_header(
|
|
1026
1059
|
solution: SolutionSkeleton,
|
1027
1060
|
console: rich.console.Console,
|
1028
1061
|
):
|
1029
|
-
console.print(f'
|
1030
|
-
console.print(f'({solution.runs_dir})')
|
1062
|
+
console.print(f'{href(solution.path)}', end=' ')
|
1063
|
+
console.print(f'({href(solution.runs_dir, style="info")})')
|
1031
1064
|
|
1032
1065
|
|
1033
1066
|
@dataclasses.dataclass
|
@@ -1052,14 +1085,14 @@ class TimingSummary:
|
|
1052
1085
|
def print(self, console: rich.console.Console, tl: Optional[int] = None):
|
1053
1086
|
if self.slowest_good is not None:
|
1054
1087
|
console.print(
|
1055
|
-
f'Slowest [success]OK[/success] solution: {self.slowest_good.time} ms,
|
1088
|
+
f'Slowest [success]OK[/success] solution: {self.slowest_good.time} ms, {href(self.slowest_good.solution.path)}'
|
1056
1089
|
)
|
1057
1090
|
if self.fastest_slow is not None:
|
1058
1091
|
fastest_slow = self.fastest_slow.time
|
1059
1092
|
if tl is not None and self.fastest_slow.time > tl:
|
1060
1093
|
fastest_slow = f'>{tl}'
|
1061
1094
|
console.print(
|
1062
|
-
f'Fastest [error]slow[/error] solution: {fastest_slow} ms,
|
1095
|
+
f'Fastest [error]slow[/error] solution: {fastest_slow} ms, {href(self.fastest_slow.solution.path)}'
|
1063
1096
|
)
|
1064
1097
|
|
1065
1098
|
|
@@ -1184,7 +1217,7 @@ async def _render_detailed_group_table(
|
|
1184
1217
|
) -> rich.table.Table:
|
1185
1218
|
table = rich.table.Table()
|
1186
1219
|
for solution in skeleton.solutions:
|
1187
|
-
table.add_column(f'
|
1220
|
+
table.add_column(f'{href(solution.path)}', justify='full')
|
1188
1221
|
|
1189
1222
|
padded_rows = []
|
1190
1223
|
|
@@ -1424,7 +1457,7 @@ async def estimate_time_limit(
|
|
1424
1457
|
|
1425
1458
|
if not timings:
|
1426
1459
|
console.print(
|
1427
|
-
f'[warning]No timings for solution
|
1460
|
+
f'[warning]No timings for solution {href(solution.path)}.[/warning]'
|
1428
1461
|
)
|
1429
1462
|
continue
|
1430
1463
|
|
@@ -8,6 +8,7 @@ import typer
|
|
8
8
|
|
9
9
|
from rbx import annotations, console
|
10
10
|
from rbx.box import environment, naming, package
|
11
|
+
from rbx.box.formatting import href
|
11
12
|
from rbx.box.schema import Package
|
12
13
|
from rbx.box.statements.builders import (
|
13
14
|
BUILDER_LIST,
|
@@ -302,7 +303,7 @@ def build_statement(
|
|
302
303
|
console.console.print(
|
303
304
|
f'Statement built successfully for language '
|
304
305
|
f'[item]{statement.language}[/item] at '
|
305
|
-
f'
|
306
|
+
f'{href(statement_path)}'
|
306
307
|
)
|
307
308
|
return statement_path
|
308
309
|
|
rbx/box/testcase_utils.py
CHANGED
@@ -172,6 +172,7 @@ def parse_interaction(file: pathlib.Path) -> TestcaseInteraction:
|
|
172
172
|
)
|
173
173
|
raise typer.Exit(1) from None
|
174
174
|
|
175
|
+
# Crop file.
|
175
176
|
rest = f.read()
|
176
177
|
start = 0
|
177
178
|
|
@@ -202,13 +203,17 @@ def parse_interaction(file: pathlib.Path) -> TestcaseInteraction:
|
|
202
203
|
nxt_start, _ = nxt
|
203
204
|
return (pipe, (prefix_end, nxt_start))
|
204
205
|
|
205
|
-
|
206
|
+
# TODO: optimize
|
207
|
+
blocks = 0
|
208
|
+
MAX_BLOCKS = 1024
|
209
|
+
while blocks < MAX_BLOCKS:
|
206
210
|
block = _find_next_block()
|
207
211
|
if block is None:
|
208
212
|
break
|
209
213
|
pipe, (st, nd) = block
|
210
214
|
entries.append(TestcaseInteractionEntry(data=rest[st:nd], pipe=pipe))
|
211
215
|
start = nd
|
216
|
+
blocks += 1
|
212
217
|
|
213
218
|
return TestcaseInteraction(
|
214
219
|
prefixes=(interactor_prefix, solution_prefix),
|
@@ -5,12 +5,12 @@ rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
rbx/box/builder.py,sha256=MDm2qqmhedAbhn3rWP6cDwbBsGhV6sz_2sg1zLkPDw0,3613
|
6
6
|
rbx/box/cd.py,sha256=KGaqXHnv2hCumZS2VdMezFfwFEQcSq0rt05_KZtuQAo,1570
|
7
7
|
rbx/box/checkers.py,sha256=aGciafGNQ39UqndTEJRT3J8ngv_UigYxOT30yMzCwEI,12752
|
8
|
-
rbx/box/cli.py,sha256=
|
8
|
+
rbx/box/cli.py,sha256=gCgXxUA243WmG7hXuDeGb0D9tF11dwzPtxobzKQM2DA,27445
|
9
9
|
rbx/box/code.py,sha256=2oC1JbZiwfeg53ZICPig-KJYchqFRIZz-inlM-cLc7Q,19911
|
10
10
|
rbx/box/compile.py,sha256=OJLthDQ921w9vyoE6Gk1Df54i5RwtRJ2YG-8XEfefcs,2489
|
11
11
|
rbx/box/conftest.py,sha256=sEmciXSeDC-wmrZ1JSxbsUenKNP_VWW32mrCun2pY3I,1070
|
12
12
|
rbx/box/contest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
-
rbx/box/contest/build_contest_statements.py,sha256=
|
13
|
+
rbx/box/contest/build_contest_statements.py,sha256=DtbzLShc8zzbjE-1sBFtPY3JGhSwm48q6eSOPYWSVxQ,11399
|
14
14
|
rbx/box/contest/contest_package.py,sha256=OaUbpBtkhkgOPzJ1ccI_Vq4FMSaJvZm3gMOKfVY8oy4,3032
|
15
15
|
rbx/box/contest/contest_utils.py,sha256=TDE7I6YQJlu4dQd68wzOp019bNgqiT0RlM-LMQMjL9w,301
|
16
16
|
rbx/box/contest/main.py,sha256=u76kAQSVWEuyGLqVgyjXwYxJwHXAeEHMwbM7MfenKvE,7574
|
@@ -22,7 +22,7 @@ rbx/box/download.py,sha256=DxAiAk4lDYWEz1C9UTvZzHTq6hgm4fxGezApm2IkCTM,2601
|
|
22
22
|
rbx/box/dump_schemas.py,sha256=3j5t47_vJmXj0BCczxDX6ByOcsfolGEDNCBXlPpk86w,593
|
23
23
|
rbx/box/environment.py,sha256=Kp69MekUwwoVpupnafUcN5KAbP-ZTCwe0OQXt1h0FN8,11859
|
24
24
|
rbx/box/extensions.py,sha256=Von8kIeXvNFTkGlMRMTvL2HIHPwlkuiMswr-ydbGV1w,519
|
25
|
-
rbx/box/formatting.py,sha256=
|
25
|
+
rbx/box/formatting.py,sha256=pPijbtoF2zK-8_y_Q7TOxMJAojZcMmFew4aCCSVfNRQ,1154
|
26
26
|
rbx/box/generators.py,sha256=RE0-D91BB-3rNDQXvCFWzU9iMhKIc_ALp960oGfM-rY,13780
|
27
27
|
rbx/box/generators_test.py,sha256=J7aBfuJhU84MWDWzgReRoOuQw_hVa09B8gTKAvL2XVo,1987
|
28
28
|
rbx/box/git_utils.py,sha256=VlUgzuHOCnrjjiJQnDB32qDHbHw_zkwgA7wm4bloibc,750
|
@@ -34,9 +34,9 @@ rbx/box/naming.py,sha256=pOG37X_wQM9CCSYwJIUf-b-ZHEs_nchO7wQEdP_quJg,1367
|
|
34
34
|
rbx/box/package.py,sha256=pRsA5UsKNnD2uJcm8x01uQHUbCxoLbJvhoeqf3nyrew,14290
|
35
35
|
rbx/box/packaging/boca/extension.py,sha256=EQALNEOv4zVDXSKs_dk11n92y7cBZVn8TogIK683lE0,890
|
36
36
|
rbx/box/packaging/boca/packager.py,sha256=kiCcP9roRCiDU0Xr5PDKO83W1yN6cyg-EKMF9fxE0EY,11950
|
37
|
-
rbx/box/packaging/boca/upload.py,sha256=
|
37
|
+
rbx/box/packaging/boca/upload.py,sha256=y3DNMLNZyAwMdfBLUZRzxnr8cHwLegpH_NtgKW2Zwvw,9260
|
38
38
|
rbx/box/packaging/contest_main.py,sha256=UsRfIdNmOf0iLUbzgjxzyECfMuCQINstG1SCClGHaUQ,2808
|
39
|
-
rbx/box/packaging/main.py,sha256=
|
39
|
+
rbx/box/packaging/main.py,sha256=kLFcMz0xOTZgtJh6P0Rr-zfq0NCbvx7HiQQ_0YmsvGg,3826
|
40
40
|
rbx/box/packaging/moj/packager.py,sha256=FjghOe5CPlaF1GqK0NZgWVV_eYWpdTmz88bh04yeAyI,8708
|
41
41
|
rbx/box/packaging/packager.py,sha256=da2haC1L9cG30myneMrRIAdGubtid0Xmy38BHKPCZZ4,3633
|
42
42
|
rbx/box/packaging/polygon/packager.py,sha256=GfZ-Dc2TDKkb3QNnfOy8yxldho2L401Ao06oWg--Gcs,11714
|
@@ -51,12 +51,12 @@ rbx/box/presets/schema.py,sha256=mZmSPkQsw7eQM0lQN6er1MO_LiW1ObwwAZFDK0F5fxE,196
|
|
51
51
|
rbx/box/retries.py,sha256=cZcNYLVHFDbhbeqMzxITgo8SYY8qzyxm0tIYcmWl1Ek,4877
|
52
52
|
rbx/box/sanitizers/warning_stack.py,sha256=RI97_GJgdjTKIXY_r0EKp5h0qQQSDSdNDh5K7zINrqs,2861
|
53
53
|
rbx/box/schema.py,sha256=y736-wZdGw56T6eDC_m7NAm2XRUdauBXJRQkQO79fpc,16264
|
54
|
-
rbx/box/setter_config.py,sha256=
|
55
|
-
rbx/box/solutions.py,sha256=
|
54
|
+
rbx/box/setter_config.py,sha256=9iObg6BwxQhFAhIOk31Jc0BDDpRYVGf3SyLIOsWIltM,4393
|
55
|
+
rbx/box/solutions.py,sha256=LQio9FJL51XlEZ20QohWpgTbBiyTN7tZ72eY-K3p3DY,49981
|
56
56
|
rbx/box/solutions_test.py,sha256=PX1TQoRzNd9mi1SGsG7WFrpqFgNrNX5Kwt0mkwFdoOA,1749
|
57
57
|
rbx/box/state.py,sha256=MMf3DvfQji0jKEliCHct2Tpp_0epL1tvP8HbHNArQIc,166
|
58
58
|
rbx/box/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
-
rbx/box/statements/build_statements.py,sha256=
|
59
|
+
rbx/box/statements/build_statements.py,sha256=lu3mwm-ZID0N_t_6FIrCcMFjlqa5JR49PQ28dq2C3s8,12169
|
60
60
|
rbx/box/statements/builders.py,sha256=6lYV-cnC-NXMnJf1wasbq_AMbjdIuPpMirm7QsjZI6s,11825
|
61
61
|
rbx/box/statements/joiners.py,sha256=jItNXkAbTjFQpPMgfDMW86n3vMTbaE8sgo9I8Yf4Txg,2886
|
62
62
|
rbx/box/statements/latex.py,sha256=LkcHwXjMFxbw--Gj9T1VkFKQFsXhY9dN7xZHpZycNW8,1346
|
@@ -68,7 +68,7 @@ rbx/box/stressing/finder_parser.py,sha256=jXpYNa4FyugzmHi3r96Uv4rU1krRQJc5Ihr9jf
|
|
68
68
|
rbx/box/stressing/generator_parser.py,sha256=oHZryjR3YohgaSO9WEirQ7b2e-98WgZStF0N99W4Thw,7380
|
69
69
|
rbx/box/tasks.py,sha256=sVPR6a3CSU28pN6bMjZcZATYZBV7JlZvhvxcPRH8-MI,10514
|
70
70
|
rbx/box/testcase_extractors.py,sha256=J43eG7vpxc5nP_2yhrXJODkd4EYlV4WiYVbM6hzipY4,11944
|
71
|
-
rbx/box/testcase_utils.py,sha256=
|
71
|
+
rbx/box/testcase_utils.py,sha256=0HydSzmy1Olqws6iPMkX6dnPnl45sPZf83SlrjQxs40,7816
|
72
72
|
rbx/box/testcases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
73
|
rbx/box/testcases/main.py,sha256=_I7h_obRcpNLRQ6dDJDIE5NAvTyn5nBOhdsBhRA_PvU,5442
|
74
74
|
rbx/box/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -212,8 +212,8 @@ rbx/testcase.py,sha256=yKOq3CAJZ1YTmInvnoIs0u1iJnRj_X85XiWbLI-p9d8,1951
|
|
212
212
|
rbx/testcase_rendering.py,sha256=nfmv6dSEqd4aR3TsaODwkKGK6AXty_DDKtWf_ejiQpI,2084
|
213
213
|
rbx/testing_utils.py,sha256=x_PqD8Zd2PkN91NxVHUnSTs044-1WK5KKtttKQBXpFs,2083
|
214
214
|
rbx/utils.py,sha256=SfR844_i0ebRDMkmS_w1YdZiWPc6h2RGADygewlWRbA,4845
|
215
|
-
rbx_cp-0.5.
|
216
|
-
rbx_cp-0.5.
|
217
|
-
rbx_cp-0.5.
|
218
|
-
rbx_cp-0.5.
|
219
|
-
rbx_cp-0.5.
|
215
|
+
rbx_cp-0.5.65.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
216
|
+
rbx_cp-0.5.65.dist-info/METADATA,sha256=TBx0q_SnA7K1cbAXvTbdgdLbCgTq7phrGbGBJSiKefk,3604
|
217
|
+
rbx_cp-0.5.65.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
218
|
+
rbx_cp-0.5.65.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
|
219
|
+
rbx_cp-0.5.65.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|