rbx.cp 0.5.17__py3-none-any.whl → 0.5.18__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 CHANGED
@@ -124,6 +124,14 @@ def compile_item(
124
124
  if sanitized.should_sanitize():
125
125
  commands = add_sanitizer_flags(commands)
126
126
 
127
+ # Remove any memory constraints for a sanitized executable.
128
+ # Sanitizers are known to be memory-hungry.
129
+ sandbox_params.address_space = None
130
+
131
+ # Reset timeout configs since sanitizers are known to be time-hungry.
132
+ sandbox_params.timeout = None
133
+ sandbox_params.wallclock_timeout = None
134
+
127
135
  compiled_digest = DigestHolder()
128
136
 
129
137
  artifacts = GradingArtifacts()
@@ -214,12 +222,6 @@ def run_item(
214
222
  # Reset timeout configs since sanitizers are known to be time-hungry.
215
223
  sandbox_params.timeout = None
216
224
  sandbox_params.wallclock_timeout = None
217
- orig_execution_config = get_execution_config(language)
218
- if orig_execution_config.sandbox is not None:
219
- sandbox_params.timeout = orig_execution_config.sandbox.timeLimit
220
- sandbox_params.wallclock_timeout = (
221
- orig_execution_config.sandbox.wallTimeLimit
222
- )
223
225
  sanitized = True
224
226
 
225
227
  sandbox_params.set_stdall(
@@ -7,8 +7,7 @@ from typing import List, Optional, Tuple
7
7
  import typer
8
8
 
9
9
  from rbx import console, testing_utils
10
- from rbx.box import cd
11
- from rbx.box.contest import contest_utils
10
+ from rbx.box import cd, package
12
11
  from rbx.box.contest.contest_package import get_problems
13
12
  from rbx.box.contest.schema import Contest, ContestProblem, ContestStatement
14
13
  from rbx.box.schema import Package, Testcase
@@ -60,7 +59,7 @@ class ExtractedProblem:
60
59
 
61
60
  def _get_samples(problem: ContestProblem) -> List[Testcase]:
62
61
  with cd.new_package_cd(problem.get_path()):
63
- contest_utils.clear_package_cache()
62
+ package.clear_package_cache()
64
63
  return get_samples()
65
64
 
66
65
 
@@ -158,7 +157,7 @@ def _build_problem_statements(
158
157
  f'Building statement for problem {extracted_problem.problem.short_name}...'
159
158
  )
160
159
  with cd.new_package_cd(extracted_problem.problem.get_path()):
161
- contest_utils.clear_package_cache()
160
+ package.clear_package_cache()
162
161
  # TODO: respect steps override
163
162
  content, _ = build_statements.build_statement_bytes(
164
163
  extracted_problem.statement,
@@ -1,7 +1,8 @@
1
1
  import functools
2
2
  import pathlib
3
- from typing import List, Optional
3
+ from typing import List, Optional, Tuple
4
4
 
5
+ import ruyaml
5
6
  import typer
6
7
  from pydantic import ValidationError
7
8
 
@@ -81,3 +82,14 @@ def get_problems(contest: Contest) -> List[Package]:
81
82
  for problem in contest.problems:
82
83
  problems.append(find_problem_package_or_die(problem.get_path()))
83
84
  return problems
85
+
86
+
87
+ def get_ruyaml() -> Tuple[ruyaml.YAML, ruyaml.Any]:
88
+ contest_yaml_path = find_contest_yaml()
89
+ if contest_yaml_path is None:
90
+ console.console.print(
91
+ f'Contest not found in {pathlib.Path().absolute()}', style='error'
92
+ )
93
+ raise typer.Exit(1)
94
+ res = ruyaml.YAML()
95
+ return res, res.load(contest_yaml_path.read_text())
@@ -2,15 +2,6 @@ from rbx.box import environment, package
2
2
  from rbx.box.contest import contest_package
3
3
 
4
4
 
5
- def clear_package_cache():
6
- pkgs = [package]
7
-
8
- for pkg in pkgs:
9
- for fn in pkg.__dict__.values():
10
- if hasattr(fn, 'cache_clear'):
11
- fn.cache_clear()
12
-
13
-
14
5
  def clear_all_caches():
15
6
  pkgs = [package, environment, contest_package]
16
7
 
rbx/box/contest/main.py CHANGED
@@ -8,12 +8,11 @@ import typer
8
8
 
9
9
  from rbx import annotations, console, utils
10
10
  from rbx.box import cd, creation, presets
11
- from rbx.box.contest import contest_utils, statements
11
+ from rbx.box.contest import contest_package, contest_utils, statements
12
12
  from rbx.box.contest.contest_package import (
13
13
  find_contest,
14
14
  find_contest_package_or_die,
15
15
  find_contest_yaml,
16
- save_contest,
17
16
  within_contest,
18
17
  )
19
18
  from rbx.box.contest.schema import ContestProblem
@@ -145,16 +144,19 @@ def add(path: str, short_name: str, preset: Optional[str] = None):
145
144
  creation.create(name, preset=preset, path=pathlib.Path(path))
146
145
 
147
146
  contest = find_contest_package_or_die()
148
- # Reassign mutable object before saving.
149
- contest.problems = sorted(
150
- [
151
- *contest.problems,
152
- ContestProblem(short_name=short_name, path=pathlib.Path(path)),
153
- ],
154
- key=lambda p: p.short_name,
147
+
148
+ ru, contest = contest_package.get_ruyaml()
149
+
150
+ contest['problems'].append(
151
+ {
152
+ 'short_name': short_name,
153
+ 'path': path,
154
+ }
155
155
  )
156
+ dest = find_contest_yaml()
157
+ assert dest is not None
158
+ utils.save_ruyaml(dest, ru, contest)
156
159
 
157
- save_contest(contest)
158
160
  console.console.print(
159
161
  f'Problem [item]{name} ({short_name})[/item] added to contest at [item]{path}[/item].'
160
162
  )
@@ -165,25 +167,34 @@ def add(path: str, short_name: str, preset: Optional[str] = None):
165
167
  def remove(path_or_short_name: str):
166
168
  contest = find_contest_package_or_die()
167
169
 
168
- kept_problems = []
169
- removed_problems = []
170
- for problem in contest.problems:
170
+ removed_problem_idx = None
171
+ removed_problem = None
172
+ for i, problem in enumerate(contest.problems):
171
173
  if (
172
174
  problem.path == pathlib.Path(path_or_short_name)
173
175
  or problem.short_name == path_or_short_name
174
176
  ):
175
- removed_problems.append(problem)
176
- else:
177
- kept_problems.append(problem)
177
+ removed_problem_idx = i
178
+ removed_problem = problem
179
+ break
178
180
 
179
- contest.problems = kept_problems
180
- save_contest(contest)
181
-
182
- for problem in removed_problems:
183
- shutil.rmtree(str(problem.path), ignore_errors=True)
181
+ if removed_problem_idx is None or removed_problem is None:
184
182
  console.console.print(
185
- f'Problem [item]{problem.short_name}[/item] removed from contest at [item]{problem.path}[/item].'
183
+ f'[error]Problem [item]{path_or_short_name}[/item] not found in contest.[/error]'
186
184
  )
185
+ raise typer.Exit(1)
186
+
187
+ ru, contest = contest_package.get_ruyaml()
188
+
189
+ del contest['problems'][removed_problem_idx]
190
+ dest = find_contest_yaml()
191
+ assert dest is not None
192
+ utils.save_ruyaml(dest, ru, contest)
193
+
194
+ shutil.rmtree(str(removed_problem.path), ignore_errors=True)
195
+ console.console.print(
196
+ f'Problem [item]{removed_problem.short_name}[/item] removed from contest at [item]{removed_problem.path}[/item].'
197
+ )
187
198
 
188
199
 
189
200
  @app.command(
@@ -3,8 +3,7 @@ from typing import Annotated, List, Optional
3
3
  import typer
4
4
 
5
5
  from rbx import annotations, console
6
- from rbx.box import builder, cd, environment
7
- from rbx.box.contest import contest_utils
6
+ from rbx.box import builder, cd, environment, package
8
7
  from rbx.box.contest.build_contest_statements import build_statement
9
8
  from rbx.box.contest.contest_package import (
10
9
  find_contest_package_or_die,
@@ -50,7 +49,7 @@ def build(
50
49
  f'Processing problem [item]{problem.short_name}[/item]...'
51
50
  )
52
51
  with cd.new_package_cd(problem.get_path()):
53
- contest_utils.clear_package_cache()
52
+ package.clear_package_cache()
54
53
 
55
54
  if not builder.build(
56
55
  verification=verification, groups=set(['samples']), output=None
rbx/box/main.py CHANGED
@@ -508,10 +508,17 @@ def stress(
508
508
  groups_by_name[testgroup] = TestcaseGroup(
509
509
  name=testgroup, generatorScript=CodeItem(path=new_script_path)
510
510
  )
511
- console.console.print(
512
- f'[warning]A testgroup for [item]{new_script_path}[/item] will not be automatically added to the problem.rbx.yml file for you.\n'
513
- 'Please add it manually. [/warning]'
511
+ ru, problem_yml = package.get_ruyaml()
512
+ problem_yml['testcases'].append(
513
+ {
514
+ 'name': testgroup,
515
+ 'generatorScript': new_script_path.name,
516
+ }
514
517
  )
518
+ dest = package.find_problem_yaml()
519
+ assert dest is not None
520
+ utils.save_ruyaml(dest, ru, problem_yml)
521
+ package.clear_package_cache()
515
522
 
516
523
  if testgroup not in groups_by_name:
517
524
  break
rbx/box/package.py CHANGED
@@ -1,7 +1,9 @@
1
1
  import functools
2
2
  import pathlib
3
+ import sys
3
4
  from typing import Dict, List, Optional, Tuple
4
5
 
6
+ import ruyaml
5
7
  import typer
6
8
  from pydantic import ValidationError
7
9
 
@@ -119,6 +121,17 @@ def save_package(
119
121
  problem_yaml_path.write_text(utils.model_to_yaml(package))
120
122
 
121
123
 
124
+ def get_ruyaml() -> Tuple[ruyaml.YAML, ruyaml.Any]:
125
+ problem_yaml_path = find_problem_yaml()
126
+ if problem_yaml_path is None:
127
+ console.console.print(
128
+ f'Problem not found in {pathlib.Path().absolute()}', style='error'
129
+ )
130
+ raise typer.Exit(1)
131
+ res = ruyaml.YAML()
132
+ return res, res.load(problem_yaml_path.read_text())
133
+
134
+
122
135
  @functools.cache
123
136
  def get_problem_cache_dir(root: pathlib.Path = pathlib.Path()) -> pathlib.Path:
124
137
  cache_dir = find_problem(root) / '.box'
@@ -328,3 +341,12 @@ def get_compilation_files(code: CodeItem) -> List[Tuple[pathlib.Path, pathlib.Pa
328
341
  )
329
342
  )
330
343
  return res
344
+
345
+
346
+ def clear_package_cache():
347
+ pkgs = [sys.modules[__name__]]
348
+
349
+ for pkg in pkgs:
350
+ for fn in pkg.__dict__.values():
351
+ if hasattr(fn, 'cache_clear'):
352
+ fn.cache_clear()
@@ -6,7 +6,7 @@ import typer
6
6
 
7
7
  from rbx import annotations, console
8
8
  from rbx.box import cd, environment, package
9
- from rbx.box.contest import build_contest_statements, contest_package, contest_utils
9
+ from rbx.box.contest import build_contest_statements, contest_package
10
10
  from rbx.box.packaging.main import run_packager
11
11
  from rbx.box.packaging.packager import (
12
12
  BaseContestPackager,
@@ -33,7 +33,7 @@ def run_contest_packager(
33
33
  f'Processing problem [item]{problem.short_name}[/item]...'
34
34
  )
35
35
  with cd.new_package_cd(problem.get_path()):
36
- contest_utils.clear_package_cache()
36
+ package.clear_package_cache()
37
37
  package_path = run_packager(packager_cls, verification=verification)
38
38
  built_packages.append(
39
39
  BuiltProblemPackage(
rbx/box/solutions.py CHANGED
@@ -628,7 +628,7 @@ def _print_solution_outcome(
628
628
 
629
629
  if has_sanitizer_warnings:
630
630
  console.print(
631
- '[warning]WARNING[/warning] The solution had sanitizer errors or warnings, marked with [item]*[/item]. See their stderr for more details.'
631
+ '[warning]WARNING[/warning] The solution had sanitizer errors or warnings, marked with [warning]*[/warning]. See their stderr for more details.'
632
632
  )
633
633
 
634
634
  console.print(f'Time: {get_evals_formatted_time(evals)}')
@@ -725,7 +725,7 @@ async def _render_detailed_group_table(
725
725
  verdict = get_testcase_markup_verdict(eval)
726
726
  time = get_evals_formatted_time([eval])
727
727
  if eval.result.sanitizer_warnings:
728
- time = f'{time} [item]*[/item]'
728
+ time = f'{time} [warning]*[/warning]'
729
729
  evals_per_solution[str(solution.path)].append(eval)
730
730
  row.append(f'{verdict} {time}')
731
731
  table.add_row(*row)
@@ -830,7 +830,7 @@ async def print_run_report(
830
830
  console.print(f'{i}/', end='')
831
831
  console.print(get_testcase_markup_verdict(eval), end='')
832
832
  if eval.result.sanitizer_warnings:
833
- console.print('[item]*[/item]', end='')
833
+ console.print('[warning]*[/warning]', end='')
834
834
  console.print('', end=' ')
835
835
  group_evals.append(eval)
836
836
  solution_evals.append(eval)
@@ -200,14 +200,14 @@ def main():
200
200
  os.kill(sub_pid, 9)
201
201
  return
202
202
 
203
- signal.alarm(1)
203
+ signal.setitimer(signal.ITIMER_REAL, 0.3)
204
204
 
205
- signal.alarm(1)
205
+ signal.setitimer(signal.ITIMER_REAL, 0.3)
206
206
  signal.signal(signal.SIGALRM, handle_alarm)
207
207
  wait_and_finish(sub_pid, options, start_time, alarm_msg=alarm_msg)
208
208
 
209
209
  # Cancel alarm before exiting to avoid surprises.
210
- signal.alarm(0)
210
+ signal.setitimer(signal.ITIMER_REAL, 0)
211
211
 
212
212
  # Exit gracefully.
213
213
  sys.exit()
rbx/grading/steps.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import functools
2
2
  import pathlib
3
+ import re
3
4
  import shlex
4
5
  import shutil
5
6
  import subprocess
@@ -435,6 +436,21 @@ def _check_for_sanitizer_warnings(
435
436
  return any(_check_for_sanitizer_warnings_in_line(line.decode()) for line in f)
436
437
 
437
438
 
439
+ _WARNING_RE = re.compile(r'[^:]+:\d+:\d+:[ ]+warning:.*')
440
+
441
+
442
+ def _check_for_compilation_warnings_in_line(line: str) -> bool:
443
+ if line.startswith('./'):
444
+ return False
445
+ matched = _WARNING_RE.match(line) is not None
446
+ # if matched:
447
+ # console.print(
448
+ # '[warning]Compilation warning:[/warning]',
449
+ # utils.highlight_json_obj(line),
450
+ # )
451
+ return matched
452
+
453
+
438
454
  def _check_for_compilation_warnings(
439
455
  sandbox: SandboxBase, stderr_file: Optional[pathlib.Path]
440
456
  ) -> bool:
@@ -443,7 +459,9 @@ def _check_for_compilation_warnings(
443
459
  if not sandbox.file_exists(stderr_file):
444
460
  return False
445
461
  with sandbox.get_file(stderr_file) as f:
446
- return any(line.strip() for line in f)
462
+ return any(
463
+ _check_for_compilation_warnings_in_line(line.strip().decode()) for line in f
464
+ )
447
465
 
448
466
 
449
467
  def compile(
rbx/utils.py CHANGED
@@ -9,6 +9,7 @@ from typing import Any, Optional, Type, TypeVar
9
9
  import rich
10
10
  import rich.prompt
11
11
  import rich.status
12
+ import ruyaml
12
13
  import typer
13
14
  import yaml
14
15
  from fastapi.encoders import jsonable_encoder
@@ -91,6 +92,12 @@ def validate_field(model: Type[T], field: str, value: Any):
91
92
  )
92
93
 
93
94
 
95
+ def save_ruyaml(path: pathlib.Path, yml: ruyaml.YAML, data: ruyaml.Any):
96
+ path.parent.mkdir(parents=True, exist_ok=True)
97
+ with path.open('w') as f:
98
+ yml.dump(data, f)
99
+
100
+
94
101
  def confirm_on_status(status: Optional[rich.status.Status], *args, **kwargs) -> bool:
95
102
  if status:
96
103
  status.stop()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rbx.cp
3
- Version: 0.5.17
3
+ Version: 0.5.18
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9,<4.0
@@ -27,6 +27,7 @@ Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
27
27
  Requires-Dist: questionary (>=2.1.0,<3.0.0)
28
28
  Requires-Dist: requests (>=2.32.3,<3.0.0)
29
29
  Requires-Dist: rich (>=13.9.4,<14.0.0)
30
+ Requires-Dist: ruyaml (>=0.91.0,<0.92.0)
30
31
  Requires-Dist: textual (>=0.79.1,<0.80.0)
31
32
  Requires-Dist: typer (>=0.15.1,<0.16.0)
32
33
  Description-Content-Type: text/markdown
@@ -5,16 +5,16 @@ rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  rbx/box/builder.py,sha256=Fz-3DpKg4kfciOz-ZcxpYPRjDqKVzKN9q2NtFsHA6Rc,3241
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=LE-KDrYNIfdPPXGUU46_tO8hiwH7A_5cV2s8IUDxsNg,9802
8
+ rbx/box/code.py,sha256=XUyE8QY9qgKC6AwoRvnjo1TodchMzNL2EAXeXHT4mYM,9815
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
12
- rbx/box/contest/build_contest_statements.py,sha256=qnwymzqWmuey4t3tvoTPV1-dlujMs2bgcpl2V7Kbro4,11326
13
- rbx/box/contest/contest_package.py,sha256=vGmp3F9FVJkFj6rbfIZx5BjE_vtiIHBx2FkHdq1b31s,2651
14
- rbx/box/contest/contest_utils.py,sha256=vWv4iNWdJT5motAznfdNzl8o-tEoCU4xmdyaPTPJZuY,490
15
- rbx/box/contest/main.py,sha256=cUjLnGe6WFJIsQI3VnFL_JFZLMhrkea6FK1aMpylBHM,6985
12
+ rbx/box/contest/build_contest_statements.py,sha256=oulTAgTgvRiyn8DiDlEV48p7stFrJLCrMy8qTRE05c4,11281
13
+ rbx/box/contest/contest_package.py,sha256=OaUbpBtkhkgOPzJ1ccI_Vq4FMSaJvZm3gMOKfVY8oy4,3032
14
+ rbx/box/contest/contest_utils.py,sha256=TDE7I6YQJlu4dQd68wzOp019bNgqiT0RlM-LMQMjL9w,301
15
+ rbx/box/contest/main.py,sha256=6voYLTy3qXth_Yb477K9dySSK-rF0WvCbBrr7xn78A8,7329
16
16
  rbx/box/contest/schema.py,sha256=rxzjJasMWPKKhvSJs4eW4A2oCiA4gXgfF-MzqsbPslQ,4914
17
- rbx/box/contest/statements.py,sha256=Cb-ReKcK_xZc757ZiFV9fwgZt8LO_2roMtPiDsIoRVI,2949
17
+ rbx/box/contest/statements.py,sha256=Pe4uo1hxvEON8O11VAzsOP3DxUel0vmwiAmolh4ltEs,2910
18
18
  rbx/box/creation.py,sha256=mVHVVj8ozX9D5qpkLewE5WSjF6HtTm74Pkwubk-bATg,2259
19
19
  rbx/box/deferred.py,sha256=II3X9e87JCOZtmspnHh-n4PFqh-FsH_oc0XJHZ9ZYVQ,691
20
20
  rbx/box/download.py,sha256=MFP-R26JiYGAP89I0TK-0fYc69Fsd20tsBqgtRCy5AE,2234
@@ -22,11 +22,11 @@ rbx/box/environment.py,sha256=GjwnJwtkTdkHmUh1b23zagjLsTiJQAOpP36A93mA-zc,11159
22
22
  rbx/box/extensions.py,sha256=gIC73VbF1897er3iIMhaIw6GE8o1t43M7q97Iz7-_lg,503
23
23
  rbx/box/generators.py,sha256=YpwtT-SmbiBMdnNSGsJ6kXuF4vOEoqXOq9MC9T92Sng,16157
24
24
  rbx/box/generators_test.py,sha256=mQqHepAMYa6zV_PseQALI0nIX6AdQktt6lh94muFhNw,1758
25
- rbx/box/main.py,sha256=cOn3zMSn-iGozVUxaF5rZyZngAJWfTT8RrZLMfZM0R0,21772
26
- rbx/box/package.py,sha256=sdALOweAQtPaXln5NDuJ8esM85qWvJBa0J8WuUjeMLg,10541
25
+ rbx/box/main.py,sha256=OzBKO7Ys87CRs_4Slm3u7e1TrJ4ZfLUa3I27qfNbL_8,21948
26
+ rbx/box/package.py,sha256=gaqqiRL2l91GydJc4nrLQvhFNcxt7Di7KquiNJq6AiQ,11129
27
27
  rbx/box/packaging/boca/extension.py,sha256=hQhcbocNfW2ESv5RalS1wf6uvOoOfOnR_gHvbXUbSzY,852
28
28
  rbx/box/packaging/boca/packager.py,sha256=FOhSRg5K5Y4qNB0WyTR3DKgrpObf9I0JbyGpJHOtxpo,10673
29
- rbx/box/packaging/contest_main.py,sha256=VyJnnS7WET1-C7bFcxditdhG8Hl_x3YOf81fm5Af3Vo,2748
29
+ rbx/box/packaging/contest_main.py,sha256=Hbxh7geNqrePs5tWhPgdg5W2qhaW5yoreK_VP0Sm19k,2727
30
30
  rbx/box/packaging/main.py,sha256=CyjfuvwmRsJGk4lKVp2LT_WCQ5jZ5L_7NfZQEC40nuY,2228
31
31
  rbx/box/packaging/packager.py,sha256=suCT_SLnWa915rV2j8VFqzH43HGKRTr9mGGlrvj45aw,3267
32
32
  rbx/box/packaging/polygon/packager.py,sha256=HNpxP2nclLChSnrQtkT7tLwDdXHl1dzXMIF5RZwr9M4,10811
@@ -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=MerNqhIeOxRBUw0CEbtfNFsHEJVsILilAjEGwW0nujQ,13227
41
41
  rbx/box/setter_config.py,sha256=6nGTPMvnJ7y1sM-EBuI493NSZOIiOZ1DTypSXrL-HRY,3686
42
- rbx/box/solutions.py,sha256=FTdeMBZC1-Gj3eqqfvtt3RXH1CsA_QrYgbvKmbqdFus,30991
42
+ rbx/box/solutions.py,sha256=oY6NpveOK1H7jU1sokCFAz4xJzo-8t-YQYcNzqLjMUc,31009
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=24ZUM5H33NhmqnDL0ofA1anUKWxuZG1paA1tCV4AKns,11911
@@ -77,11 +77,11 @@ rbx/grading/judge/sandbox.py,sha256=0h3YCmGabf9OfORJgx6v2Bed4kE-i8FyuZkPux-sDVk,
77
77
  rbx/grading/judge/sandboxes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  rbx/grading/judge/sandboxes/isolate.py,sha256=9xgBuNfAvGtO2zME1FXRah2rcPvzDShsPG0TTuX_UDU,25649
79
79
  rbx/grading/judge/sandboxes/stupid_sandbox.py,sha256=2rFinUSafape4ad_r0TXBX0ZwnAfuVgEnDviozXbYlo,10155
80
- rbx/grading/judge/sandboxes/timeit.py,sha256=Ct3pxY2Uawaz4O3xIufD49DSTZnbTOhYIch1QcHLVdY,6558
80
+ rbx/grading/judge/sandboxes/timeit.py,sha256=xScfasI2lsSQGZVpIZ7qBZfi0IaKC-1k8wO5qFp7UoM,6634
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=v1qw5gqR3Cw-nEBuEowuT2iwrSbjcsNwi_CfkiDvtmk,22174
84
+ rbx/grading/steps.py,sha256=w7dtT65Gu5uRzuBNxKDP5MnieMggJ1TkagNgS03tfSI,22660
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
@@ -161,9 +161,9 @@ rbx/testdata/box1/wa.sol.cpp,sha256=qsHmvtLJOFI_sdvUT6ITqk7FJYqhrRTCmEIRdy4gSGE,
161
161
  rbx/testdata/caching/executable.py,sha256=WKRHNf_fprFJd1Fq1ubmQtR3mZzTYVNwKPLWuZ4HrWg,10
162
162
  rbx/testdata/compatible,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
163
  rbx/testing_utils.py,sha256=ZZLKMUHlZ4HwsuNY50jqSBJ9HhpnFdba7opjDsvXE1U,2084
164
- rbx/utils.py,sha256=w0XrC9Xl_2-242rn7jqPnkQOGobKnTOBQsYK_BJ1Azo,4187
165
- rbx_cp-0.5.17.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
166
- rbx_cp-0.5.17.dist-info/METADATA,sha256=pnPy7dsaqkQRWYQO5MLaKcJm7s_oiF0SNrJ_E2qob94,3249
167
- rbx_cp-0.5.17.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
168
- rbx_cp-0.5.17.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
169
- rbx_cp-0.5.17.dist-info/RECORD,,
164
+ rbx/utils.py,sha256=WlmnF4whc0-6ksVZoOhmom2bR2spT6zETFHjnpJOCsA,4383
165
+ rbx_cp-0.5.18.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
166
+ rbx_cp-0.5.18.dist-info/METADATA,sha256=20P5Jn38-CFMSoYc1lpOC7UsJu9Q-oSXD3kROvB8_M4,3290
167
+ rbx_cp-0.5.18.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
168
+ rbx_cp-0.5.18.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
169
+ rbx_cp-0.5.18.dist-info/RECORD,,