rbx.cp 0.5.23__py3-none-any.whl → 0.5.25__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/code.py +26 -6
- rbx/box/main.py +72 -34
- rbx/box/package.py +5 -9
- rbx/box/solutions.py +39 -9
- rbx/grading/steps.py +11 -4
- {rbx_cp-0.5.23.dist-info → rbx_cp-0.5.25.dist-info}/METADATA +1 -1
- {rbx_cp-0.5.23.dist-info → rbx_cp-0.5.25.dist-info}/RECORD +10 -10
- {rbx_cp-0.5.23.dist-info → rbx_cp-0.5.25.dist-info}/LICENSE +0 -0
- {rbx_cp-0.5.23.dist-info → rbx_cp-0.5.25.dist-info}/WHEEL +0 -0
- {rbx_cp-0.5.23.dist-info → rbx_cp-0.5.25.dist-info}/entry_points.txt +0 -0
rbx/box/code.py
CHANGED
@@ -75,7 +75,7 @@ def is_executable_sanitized(executable: DigestOrSource) -> bool:
|
|
75
75
|
|
76
76
|
def add_sanitizer_flags_to_command(command: str) -> str:
|
77
77
|
if is_cxx_command(command):
|
78
|
-
return command + ' -fsanitize=address,undefined -fno-omit-frame-pointer'
|
78
|
+
return command + ' -fsanitize=address,undefined -fno-omit-frame-pointer -g'
|
79
79
|
return command
|
80
80
|
|
81
81
|
|
@@ -122,11 +122,31 @@ def _add_warning_pragmas(code: str) -> str:
|
|
122
122
|
)
|
123
123
|
|
124
124
|
|
125
|
+
def _add_warning_pragmas_around(code: str) -> str:
|
126
|
+
flags = CXX_WARNING_FLAGS.split()
|
127
|
+
pragma_lines = '\n'.join(
|
128
|
+
[
|
129
|
+
f'#pragma GCC diagnostic ignored "{flag}"'
|
130
|
+
for flag in flags
|
131
|
+
if not flag.startswith('-Wno-')
|
132
|
+
]
|
133
|
+
)
|
134
|
+
|
135
|
+
return (
|
136
|
+
'#pragma GCC diagnostic push\n'
|
137
|
+
+ pragma_lines
|
138
|
+
+ '\n'
|
139
|
+
+ code
|
140
|
+
+ '\n'
|
141
|
+
+ '#pragma GCC diagnostic pop\n'
|
142
|
+
)
|
143
|
+
|
144
|
+
|
125
145
|
def _ignore_warning_in_cxx_input(input: GradingFileInput):
|
126
|
-
if input.src is None or input.src.suffix not in ('.
|
146
|
+
if input.src is None or input.src.suffix not in ('.h', '.hpp'):
|
127
147
|
return
|
128
148
|
preprocessed_path = package.get_problem_preprocessed_path(input.src)
|
129
|
-
preprocessed_path.write_text(
|
149
|
+
preprocessed_path.write_text(_add_warning_pragmas_around(input.src.read_text()))
|
130
150
|
input.src = preprocessed_path
|
131
151
|
|
132
152
|
|
@@ -185,9 +205,6 @@ def compile_item(
|
|
185
205
|
GradingFileInput(src=generator_path, dest=PosixPath(file_mapping.compilable))
|
186
206
|
)
|
187
207
|
|
188
|
-
for input in artifacts.inputs:
|
189
|
-
_ignore_warning_in_cxx_input(input)
|
190
|
-
|
191
208
|
artifacts.outputs.append(
|
192
209
|
GradingFileOutput(
|
193
210
|
src=PosixPath(file_mapping.executable),
|
@@ -196,6 +213,9 @@ def compile_item(
|
|
196
213
|
)
|
197
214
|
)
|
198
215
|
|
216
|
+
for input in artifacts.inputs:
|
217
|
+
_ignore_warning_in_cxx_input(input)
|
218
|
+
|
199
219
|
if not steps_with_caching.compile(
|
200
220
|
commands,
|
201
221
|
params=sandbox_params,
|
rbx/box/main.py
CHANGED
@@ -42,6 +42,7 @@ from rbx.box.solutions import (
|
|
42
42
|
estimate_time_limit,
|
43
43
|
get_exact_matching_solutions,
|
44
44
|
get_matching_solutions,
|
45
|
+
pick_solutions,
|
45
46
|
print_run_report,
|
46
47
|
run_and_print_interactive_solutions,
|
47
48
|
run_solutions,
|
@@ -143,6 +144,13 @@ def run(
|
|
143
144
|
'-s',
|
144
145
|
help='Whether to compile the solutions with sanitizers enabled.',
|
145
146
|
),
|
147
|
+
choice: bool = typer.Option(
|
148
|
+
False,
|
149
|
+
'--choice',
|
150
|
+
'--choose',
|
151
|
+
'-c',
|
152
|
+
help='Whether to pick solutions interactively.',
|
153
|
+
),
|
146
154
|
):
|
147
155
|
main_solution = package.get_main_solution()
|
148
156
|
if check and main_solution is None:
|
@@ -174,31 +182,37 @@ def run(
|
|
174
182
|
if override_tl is None:
|
175
183
|
raise typer.Exit(1)
|
176
184
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
)
|
185
|
+
if sanitized:
|
186
|
+
console.console.print(
|
187
|
+
'[warning]Sanitizers are running, so the time limit for the problem will be dropped, '
|
188
|
+
'and the environment default time limit will be used instead.[/warning]'
|
189
|
+
)
|
183
190
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
191
|
+
tracked_solutions = None
|
192
|
+
if outcome is not None:
|
193
|
+
tracked_solutions = {
|
194
|
+
str(solution.path)
|
195
|
+
for solution in get_matching_solutions(ExpectedOutcome(outcome))
|
196
|
+
}
|
197
|
+
if solution:
|
198
|
+
tracked_solutions = {solution}
|
192
199
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
200
|
+
if sanitized and tracked_solutions is None:
|
201
|
+
console.console.print(
|
202
|
+
'[warning]Sanitizers are running, and no solutions were specified to run. Will only run [item]ACCEPTED[/item] solutions.'
|
203
|
+
)
|
204
|
+
tracked_solutions = {
|
205
|
+
str(solution.path)
|
206
|
+
for solution in get_exact_matching_solutions(ExpectedOutcome.ACCEPTED)
|
207
|
+
}
|
208
|
+
|
209
|
+
if choice:
|
210
|
+
tracked_solutions = set(pick_solutions(tracked_solutions))
|
211
|
+
if not tracked_solutions:
|
212
|
+
console.console.print('[error]No solutions selected. Exiting.[/error]')
|
213
|
+
raise typer.Exit(1)
|
201
214
|
|
215
|
+
with utils.StatusProgress('Running solutions...') as s:
|
202
216
|
solution_result = run_solutions(
|
203
217
|
progress=s,
|
204
218
|
tracked_solutions=tracked_solutions,
|
@@ -338,6 +352,13 @@ def irun(
|
|
338
352
|
'-s',
|
339
353
|
help='Whether to compile the solutions with sanitizers enabled.',
|
340
354
|
),
|
355
|
+
choice: bool = typer.Option(
|
356
|
+
False,
|
357
|
+
'--choice',
|
358
|
+
'--choose',
|
359
|
+
'-c',
|
360
|
+
help='Whether to pick solutions interactively.',
|
361
|
+
),
|
341
362
|
):
|
342
363
|
if not print:
|
343
364
|
console.console.print(
|
@@ -373,18 +394,26 @@ def irun(
|
|
373
394
|
for solution in get_exact_matching_solutions(ExpectedOutcome.ACCEPTED)
|
374
395
|
}
|
375
396
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
397
|
+
if choice:
|
398
|
+
tracked_solutions = set(pick_solutions(tracked_solutions))
|
399
|
+
if not tracked_solutions:
|
400
|
+
console.console.print('[error]No solutions selected. Exiting.[/error]')
|
401
|
+
raise typer.Exit(1)
|
402
|
+
|
403
|
+
with utils.StatusProgress('Running solutions...') as s:
|
404
|
+
asyncio.run(
|
405
|
+
run_and_print_interactive_solutions(
|
406
|
+
progress=s,
|
407
|
+
tracked_solutions=tracked_solutions,
|
408
|
+
check=check,
|
409
|
+
verification=VerificationLevel(verification),
|
410
|
+
generator=generators.get_call_from_string(generator)
|
411
|
+
if generator is not None
|
412
|
+
else None,
|
413
|
+
print=print,
|
414
|
+
sanitized=sanitized,
|
415
|
+
)
|
386
416
|
)
|
387
|
-
)
|
388
417
|
|
389
418
|
|
390
419
|
@app.command('create, c', help='Create a new problem package.')
|
@@ -551,7 +580,10 @@ def stress(
|
|
551
580
|
@app.command('compile', help='Compile an asset given its path.')
|
552
581
|
@package.within_problem
|
553
582
|
def compile_command(
|
554
|
-
path: Annotated[
|
583
|
+
path: Annotated[
|
584
|
+
Optional[str],
|
585
|
+
typer.Argument(help='Path to the asset to compile.'),
|
586
|
+
] = None,
|
555
587
|
sanitized: bool = typer.Option(
|
556
588
|
False,
|
557
589
|
'--sanitized',
|
@@ -565,6 +597,12 @@ def compile_command(
|
|
565
597
|
help='Whether to compile the asset with warnings enabled.',
|
566
598
|
),
|
567
599
|
):
|
600
|
+
if path is None:
|
601
|
+
path = questionary.path("What's the path to your asset?").ask()
|
602
|
+
if path is None:
|
603
|
+
console.console.print('[error]No path specified.[/error]')
|
604
|
+
raise typer.Exit(1)
|
605
|
+
|
568
606
|
compile.any(path, sanitized, warnings)
|
569
607
|
|
570
608
|
|
rbx/box/package.py
CHANGED
@@ -163,16 +163,12 @@ def get_problem_preprocessed_path(
|
|
163
163
|
) -> pathlib.Path:
|
164
164
|
root_resolved = root.resolve()
|
165
165
|
item_resolved = item.resolve()
|
166
|
+
|
166
167
|
if not item_resolved.is_relative_to(root_resolved):
|
167
|
-
|
168
|
-
|
169
|
-
)
|
170
|
-
|
171
|
-
path = (
|
172
|
-
get_problem_cache_dir(root)
|
173
|
-
/ '.preprocessed'
|
174
|
-
/ item_resolved.relative_to(root_resolved)
|
175
|
-
)
|
168
|
+
final_path = pathlib.Path('remote') / item_resolved.name
|
169
|
+
else:
|
170
|
+
final_path = item_resolved.relative_to(root_resolved)
|
171
|
+
path = get_problem_cache_dir(root) / '.preprocessed' / final_path
|
176
172
|
path.parent.mkdir(parents=True, exist_ok=True)
|
177
173
|
return path
|
178
174
|
|
rbx/box/solutions.py
CHANGED
@@ -7,6 +7,7 @@ import shutil
|
|
7
7
|
from collections.abc import Iterator
|
8
8
|
from typing import Dict, Iterable, List, Optional, Set, Tuple
|
9
9
|
|
10
|
+
import questionary
|
10
11
|
import rich
|
11
12
|
import rich.live
|
12
13
|
import rich.markup
|
@@ -410,6 +411,7 @@ def run_solutions(
|
|
410
411
|
|
411
412
|
|
412
413
|
def _run_interactive_solutions(
|
414
|
+
progress: Optional[StatusProgress] = None,
|
413
415
|
tracked_solutions: Optional[Set[str]] = None,
|
414
416
|
verification: VerificationLevel = VerificationLevel.NONE,
|
415
417
|
generator: Optional[GeneratorCall] = None,
|
@@ -423,7 +425,7 @@ def _run_interactive_solutions(
|
|
423
425
|
|
424
426
|
checker_digest = checkers.compile_checker() if check else None
|
425
427
|
compiled_solutions = compile_solutions(
|
426
|
-
tracked_solutions=tracked_solutions, sanitized=sanitized
|
428
|
+
progress=progress, tracked_solutions=tracked_solutions, sanitized=sanitized
|
427
429
|
)
|
428
430
|
|
429
431
|
main_solution_digest = None
|
@@ -498,6 +500,7 @@ def _run_interactive_solutions(
|
|
498
500
|
|
499
501
|
|
500
502
|
async def run_and_print_interactive_solutions(
|
503
|
+
progress: Optional[StatusProgress] = None,
|
501
504
|
tracked_solutions: Optional[Set[str]] = None,
|
502
505
|
verification: VerificationLevel = VerificationLevel.NONE,
|
503
506
|
generator: Optional[GeneratorCall] = None,
|
@@ -507,6 +510,7 @@ async def run_and_print_interactive_solutions(
|
|
507
510
|
):
|
508
511
|
pkg = package.find_problem_package_or_die()
|
509
512
|
items = _run_interactive_solutions(
|
513
|
+
progress=progress,
|
510
514
|
tracked_solutions=tracked_solutions,
|
511
515
|
verification=verification,
|
512
516
|
check=check,
|
@@ -515,6 +519,9 @@ async def run_and_print_interactive_solutions(
|
|
515
519
|
print=print,
|
516
520
|
)
|
517
521
|
|
522
|
+
if progress:
|
523
|
+
progress.stop()
|
524
|
+
|
518
525
|
for item in items:
|
519
526
|
sol = pkg.solutions[item.solution_index]
|
520
527
|
_print_solution_header(sol, console.console, is_irun=True)
|
@@ -540,6 +547,16 @@ async def run_and_print_interactive_solutions(
|
|
540
547
|
console.console.print()
|
541
548
|
|
542
549
|
|
550
|
+
def pick_solutions(tracked_solutions: Optional[Set[str]]) -> List[str]:
|
551
|
+
pkg = package.find_problem_package_or_die()
|
552
|
+
if tracked_solutions is None:
|
553
|
+
tracked_solutions = set(str(sol.path) for sol in pkg.solutions)
|
554
|
+
|
555
|
+
return questionary.checkbox(
|
556
|
+
'Select solutions', choices=list(tracked_solutions)
|
557
|
+
).ask()
|
558
|
+
|
559
|
+
|
543
560
|
def get_outcome_style_verdict(outcome: Outcome) -> str:
|
544
561
|
if outcome == Outcome.ACCEPTED:
|
545
562
|
return 'green'
|
@@ -554,21 +571,25 @@ def get_outcome_style_verdict(outcome: Outcome) -> str:
|
|
554
571
|
return 'magenta'
|
555
572
|
|
556
573
|
|
557
|
-
def
|
574
|
+
def get_outcome_markup_verdict(outcome: Outcome) -> str:
|
558
575
|
res = '✓'
|
559
|
-
if
|
576
|
+
if outcome != Outcome.ACCEPTED:
|
560
577
|
res = '✗'
|
561
|
-
if
|
578
|
+
if outcome == Outcome.TIME_LIMIT_EXCEEDED:
|
562
579
|
res = '⧖'
|
563
|
-
if
|
580
|
+
if outcome == Outcome.RUNTIME_ERROR:
|
564
581
|
res = '✗'
|
565
|
-
style = get_outcome_style_verdict(
|
582
|
+
style = get_outcome_style_verdict(outcome)
|
566
583
|
res = f'[{style}]{res}[/{style}]'
|
584
|
+
return res
|
585
|
+
|
586
|
+
|
587
|
+
def get_testcase_markup_verdict(eval: Evaluation) -> str:
|
567
588
|
# if eval.log.stdout_absolute_path:
|
568
589
|
# output_path = eval.log.stdout_absolute_path.resolve()
|
569
590
|
# output_link = f'file://{output_path}'
|
570
591
|
# res = f'[link={output_link}]{res}[/link]'
|
571
|
-
return
|
592
|
+
return get_outcome_markup_verdict(eval.result.outcome)
|
572
593
|
|
573
594
|
|
574
595
|
def _get_evals_time_in_ms(evals: List[Evaluation]) -> int:
|
@@ -632,6 +653,10 @@ def get_evals_formatted_memory(evals: List[Evaluation]) -> str:
|
|
632
653
|
return get_formatted_memory(max_memory)
|
633
654
|
|
634
655
|
|
656
|
+
def get_worst_outcome(evals: List[Evaluation]) -> Outcome:
|
657
|
+
return Outcome.worst_outcome(eval.result.outcome for eval in evals)
|
658
|
+
|
659
|
+
|
635
660
|
def _print_solution_outcome(
|
636
661
|
solution: Solution,
|
637
662
|
evals: List[Evaluation],
|
@@ -880,7 +905,11 @@ async def _render_detailed_group_table(
|
|
880
905
|
solution, non_null_evals, verification
|
881
906
|
)
|
882
907
|
formatted_memory = get_evals_formatted_memory(non_null_evals)
|
883
|
-
|
908
|
+
worst_outcome = get_worst_outcome(non_null_evals)
|
909
|
+
verdict = get_outcome_markup_verdict(worst_outcome)
|
910
|
+
summary_row.append(
|
911
|
+
('', verdict, formatted_time, '/', formatted_memory, '')
|
912
|
+
)
|
884
913
|
padded_rows.append(summary_row)
|
885
914
|
|
886
915
|
for row in _render_padded_rows(padded_rows):
|
@@ -1020,12 +1049,13 @@ async def print_run_report(
|
|
1020
1049
|
)
|
1021
1050
|
console.print()
|
1022
1051
|
|
1023
|
-
|
1052
|
+
cur_ok = _print_solution_outcome(
|
1024
1053
|
solution,
|
1025
1054
|
solution_evals,
|
1026
1055
|
console,
|
1027
1056
|
verification=verification,
|
1028
1057
|
)
|
1058
|
+
ok = ok and cur_ok
|
1029
1059
|
console.print()
|
1030
1060
|
|
1031
1061
|
await _print_timing(console, result.skeleton, structured_evaluations)
|
rbx/grading/steps.py
CHANGED
@@ -6,7 +6,7 @@ import shutil
|
|
6
6
|
import subprocess
|
7
7
|
import sys
|
8
8
|
from enum import Enum
|
9
|
-
from typing import IO, Any, Dict, List, Optional, Tuple, Union
|
9
|
+
from typing import IO, Any, Dict, Iterable, List, Optional, Tuple, Union
|
10
10
|
|
11
11
|
import typer
|
12
12
|
from pydantic import BaseModel
|
@@ -24,13 +24,20 @@ MAX_STDOUT_LEN = 1024 * 1024 * 128 # 128 MB
|
|
24
24
|
class Outcome(Enum):
|
25
25
|
ACCEPTED = 'accepted'
|
26
26
|
WRONG_ANSWER = 'wrong-answer'
|
27
|
-
JUDGE_FAILED = 'judge-failed'
|
28
|
-
RUNTIME_ERROR = 'runtime-error'
|
29
|
-
TIME_LIMIT_EXCEEDED = 'time-limit-exceeded'
|
30
27
|
MEMORY_LIMIT_EXCEEDED = 'memory-limit-exceeded'
|
28
|
+
TIME_LIMIT_EXCEEDED = 'time-limit-exceeded'
|
29
|
+
RUNTIME_ERROR = 'runtime-error'
|
31
30
|
OUTPUT_LIMIT_EXCEEDED = 'output-limit-exceeded'
|
31
|
+
JUDGE_FAILED = 'judge-failed'
|
32
32
|
INTERNAL_ERROR = 'internal-error'
|
33
33
|
|
34
|
+
@classmethod
|
35
|
+
def worst_outcome(cls, outcomes: Iterable['Outcome']) -> 'Outcome':
|
36
|
+
def _outcome_to_int(o: 'Outcome') -> int:
|
37
|
+
return cls._member_names_.index(o.name)
|
38
|
+
|
39
|
+
return max(outcomes, key=_outcome_to_int)
|
40
|
+
|
34
41
|
|
35
42
|
class DigestHolder(BaseModel):
|
36
43
|
value: Optional[str] = None
|
@@ -5,7 +5,7 @@ rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
rbx/box/builder.py,sha256=0TiRQJoHqLHAI8QwBrscbaJmhdcmialVtP_oEkfHcs0,3260
|
6
6
|
rbx/box/cd.py,sha256=9a_SOnzoJBXxxffp4Wbf3UKXIwKuN3Hvj7K6SocALwE,1194
|
7
7
|
rbx/box/checkers.py,sha256=VpgDzevOK7hrffG2zJGxquNiu-a9Fl3wquLn7xadcK0,6285
|
8
|
-
rbx/box/code.py,sha256=
|
8
|
+
rbx/box/code.py,sha256=N2pjerRsESDqQ0G8NNeUJQgXxlJTZwNmanhhXZn5tN8,11531
|
9
9
|
rbx/box/compile.py,sha256=OJLthDQ921w9vyoE6Gk1Df54i5RwtRJ2YG-8XEfefcs,2489
|
10
10
|
rbx/box/conftest.py,sha256=sEmciXSeDC-wmrZ1JSxbsUenKNP_VWW32mrCun2pY3I,1070
|
11
11
|
rbx/box/contest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -22,8 +22,8 @@ rbx/box/environment.py,sha256=47NtyuVC6zSQKAtQaXPEXvqcD-KJiuWRpWF8pYvcG4c,11158
|
|
22
22
|
rbx/box/extensions.py,sha256=gIC73VbF1897er3iIMhaIw6GE8o1t43M7q97Iz7-_lg,503
|
23
23
|
rbx/box/generators.py,sha256=bzURQrNEscCO8_3BYXCyGK9ZneX4-eOJZP5JJV28f3I,16350
|
24
24
|
rbx/box/generators_test.py,sha256=mQqHepAMYa6zV_PseQALI0nIX6AdQktt6lh94muFhNw,1758
|
25
|
-
rbx/box/main.py,sha256=
|
26
|
-
rbx/box/package.py,sha256=
|
25
|
+
rbx/box/main.py,sha256=MPMIyd8IzuwMJX1XSPESp1Ky33WCtxVmyhtHzSJQtAU,23199
|
26
|
+
rbx/box/package.py,sha256=SSckCXo7Zh412_qjYhSNwConjhR0Sk8911qGJU34Hac,11851
|
27
27
|
rbx/box/packaging/boca/extension.py,sha256=hQhcbocNfW2ESv5RalS1wf6uvOoOfOnR_gHvbXUbSzY,852
|
28
28
|
rbx/box/packaging/boca/packager.py,sha256=FOhSRg5K5Y4qNB0WyTR3DKgrpObf9I0JbyGpJHOtxpo,10673
|
29
29
|
rbx/box/packaging/contest_main.py,sha256=Hbxh7geNqrePs5tWhPgdg5W2qhaW5yoreK_VP0Sm19k,2727
|
@@ -39,7 +39,7 @@ rbx/box/presets/schema.py,sha256=mZmSPkQsw7eQM0lQN6er1MO_LiW1ObwwAZFDK0F5fxE,196
|
|
39
39
|
rbx/box/sanitizers/warning_stack.py,sha256=RI97_GJgdjTKIXY_r0EKp5h0qQQSDSdNDh5K7zINrqs,2861
|
40
40
|
rbx/box/schema.py,sha256=mPEOchzoGDwk_S9wUw1DKqwJWJ0S5GTxQnZIlm9BFwo,13709
|
41
41
|
rbx/box/setter_config.py,sha256=6nGTPMvnJ7y1sM-EBuI493NSZOIiOZ1DTypSXrL-HRY,3686
|
42
|
-
rbx/box/solutions.py,sha256=
|
42
|
+
rbx/box/solutions.py,sha256=nnirg9ifs2EdyhXVhSZ0rUhobZMdRF-WdYfLbdNyTwI,37523
|
43
43
|
rbx/box/solutions_test.py,sha256=Cx7Goon_0sz_PaUcD8qa8gmjgzOVub6VHss3CB0GaA0,1524
|
44
44
|
rbx/box/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
45
|
rbx/box/statements/build_statements.py,sha256=upsMT-cAnSvbmKgtijdFc0OxPcyeBxRG92hY6dN-ZOk,11920
|
@@ -81,7 +81,7 @@ rbx/grading/judge/sandboxes/timeit.py,sha256=xScfasI2lsSQGZVpIZ7qBZfi0IaKC-1k8wO
|
|
81
81
|
rbx/grading/judge/storage.py,sha256=FirqjwDqb0m0h2OTFyWrZL7CQ4XjZNxhqB4JpnDIhZY,9485
|
82
82
|
rbx/grading/judge/test.py,sha256=ll0Iw7zyOpGdKPD_PGH7dvUkb4stQLu-ikbQnqJvuAc,944
|
83
83
|
rbx/grading/judge/testiso.py,sha256=v14DtkWiZFJ9AKMzrb0_vZKPWDt8jz8iIw1Z2O-Advk,1397
|
84
|
-
rbx/grading/steps.py,sha256=
|
84
|
+
rbx/grading/steps.py,sha256=EKH9k5buU69f8wgek6rAk72oAnDJ22nOp2Rw-touk_Q,23037
|
85
85
|
rbx/grading/steps_with_caching.py,sha256=5cI71VSjEaDzCPQikpamG_EjZqkkFKKdBtyJeA4QB7Q,1531
|
86
86
|
rbx/grading/steps_with_caching_run_test.py,sha256=nRzB4OcXkb-kQ4WCj0iTGVfBACllxZ0Ek5RSwfoJRgo,15262
|
87
87
|
rbx/grading_utils.py,sha256=lL2KtSkOsMElqrRoApQTbFcqVOeHVWUDTMCa3IsLpC4,4484
|
@@ -162,8 +162,8 @@ rbx/testdata/caching/executable.py,sha256=WKRHNf_fprFJd1Fq1ubmQtR3mZzTYVNwKPLWuZ
|
|
162
162
|
rbx/testdata/compatible,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
163
163
|
rbx/testing_utils.py,sha256=ZZLKMUHlZ4HwsuNY50jqSBJ9HhpnFdba7opjDsvXE1U,2084
|
164
164
|
rbx/utils.py,sha256=WlmnF4whc0-6ksVZoOhmom2bR2spT6zETFHjnpJOCsA,4383
|
165
|
-
rbx_cp-0.5.
|
166
|
-
rbx_cp-0.5.
|
167
|
-
rbx_cp-0.5.
|
168
|
-
rbx_cp-0.5.
|
169
|
-
rbx_cp-0.5.
|
165
|
+
rbx_cp-0.5.25.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
166
|
+
rbx_cp-0.5.25.dist-info/METADATA,sha256=EVWrYcC_J1TlCXE7aXFyRLTbcezWHkauiwvrva1kF_o,3290
|
167
|
+
rbx_cp-0.5.25.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
168
|
+
rbx_cp-0.5.25.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
|
169
|
+
rbx_cp-0.5.25.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|