rbx.cp 0.5.33__py3-none-any.whl → 0.5.34__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
@@ -190,7 +190,7 @@ def _check_stack_limit():
190
190
  ```
191
191
  function rbx() {{
192
192
  local rbx_bin=`bash -c "type -P rbx"`
193
- ulimit -s {target_text} && $rbx_bin $@
193
+ ulimit -s {target_text // 1024} && $rbx_bin $@
194
194
  }}
195
195
  ```
196
196
  """
@@ -22,6 +22,7 @@ from rbx.box.statements.builders import (
22
22
  StatementBuilderContest,
23
23
  StatementBuilderContext,
24
24
  StatementBuilderProblem,
25
+ StatementSample,
25
26
  prepare_assets,
26
27
  )
27
28
  from rbx.box.statements.joiners import (
@@ -51,7 +52,7 @@ class ExtractedProblem:
51
52
  return StatementBuilderProblem(
52
53
  package=self.package,
53
54
  statement=self.statement,
54
- samples=self.samples,
55
+ samples=StatementSample.from_testcases(self.samples),
55
56
  io_path=self.built_statement,
56
57
  short_name=self.problem.short_name,
57
58
  )
@@ -124,7 +125,7 @@ def get_builder_problems(
124
125
  StatementBuilderProblem(
125
126
  package=ex.package,
126
127
  statement=ex.statement,
127
- samples=ex.samples,
128
+ samples=StatementSample.from_testcases(ex.samples),
128
129
  )
129
130
  for ex in extracted_problems
130
131
  ]
rbx/box/package.py CHANGED
@@ -364,6 +364,13 @@ def get_compilation_files(code: CodeItem) -> List[Tuple[pathlib.Path, pathlib.Pa
364
364
  return res
365
365
 
366
366
 
367
+ @functools.cache
368
+ def get_empty_sentinel_path(root: pathlib.Path = pathlib.Path()) -> pathlib.Path:
369
+ path = get_problem_cache_dir(root) / '.empty'
370
+ path.write_text('')
371
+ return path
372
+
373
+
367
374
  def clear_package_cache():
368
375
  pkgs = [sys.modules[__name__]]
369
376
 
@@ -15,6 +15,7 @@ from rbx.box.statements.builders import (
15
15
  StatementBuilderContext,
16
16
  StatementBuilderProblem,
17
17
  StatementCodeLanguage,
18
+ StatementSample,
18
19
  prepare_assets,
19
20
  )
20
21
  from rbx.box.statements.schema import (
@@ -263,7 +264,9 @@ def build_statement_bytes(
263
264
  item=StatementBuilderProblem(
264
265
  package=pkg,
265
266
  statement=statement,
266
- samples=get_samples() if use_samples else [],
267
+ samples=StatementSample.from_testcases(
268
+ get_samples() if use_samples else []
269
+ ),
267
270
  short_name=short_name,
268
271
  ),
269
272
  verbose=False,
@@ -7,8 +7,9 @@ from abc import ABC, abstractmethod
7
7
  from typing import Any, Dict, List, Optional, Tuple
8
8
 
9
9
  import typer
10
+ from pydantic import BaseModel
10
11
 
11
- from rbx import console
12
+ from rbx import console, utils
12
13
  from rbx.box.schema import Package, Primitive, Testcase
13
14
  from rbx.box.statements.latex import (
14
15
  MAX_PDFLATEX_RUNS,
@@ -64,7 +65,25 @@ class StatementBuilderItem(ABC):
64
65
  pass
65
66
 
66
67
 
67
- class StatementSample(Testcase):
68
+ class StatementSample(BaseModel):
69
+ inputPath: pathlib.Path
70
+ outputPath: pathlib.Path
71
+ hasOutput: bool = True
72
+
73
+ @staticmethod
74
+ def from_testcase(testcase: Testcase) -> 'StatementSample':
75
+ return StatementSample(
76
+ inputPath=testcase.inputPath,
77
+ outputPath=testcase.outputPath or utils.get_empty_sentinel_path(),
78
+ hasOutput=testcase.outputPath is not None,
79
+ )
80
+
81
+ @staticmethod
82
+ def from_testcases(testcases: List[Testcase]) -> List['StatementSample']:
83
+ return [StatementSample.from_testcase(testcase) for testcase in testcases]
84
+
85
+
86
+ class ExplainedStatementSample(StatementSample):
68
87
  explanation: Optional[str] = None
69
88
 
70
89
 
@@ -72,7 +91,7 @@ class StatementSample(Testcase):
72
91
  class StatementBuilderProblem(StatementBuilderItem):
73
92
  package: Package
74
93
  statement: Statement
75
- samples: List[Testcase] = dataclasses.field(default_factory=list)
94
+ samples: List[StatementSample] = dataclasses.field(default_factory=list)
76
95
  short_name: Optional[str] = None
77
96
 
78
97
  # Will only be filled by contests.
@@ -301,8 +320,8 @@ class rbxTeXBuilder(StatementBuilder):
301
320
  problem_kwargs['problem']['blocks'] = blocks
302
321
  if statement_blocks.explanations is not None:
303
322
  problem_kwargs['problem']['samples'] = [
304
- StatementSample(
305
- **typing.cast(Testcase, sample).model_dump(),
323
+ ExplainedStatementSample(
324
+ **typing.cast(StatementSample, sample).model_dump(),
306
325
  explanation=statement_blocks.explanations.get(i),
307
326
  )
308
327
  for i, sample in enumerate(problem_kwargs['problem']['samples'])
rbx/utils.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import contextlib
2
2
  import fcntl
3
+ import functools
3
4
  import json
4
5
  import os
5
6
  import pathlib
@@ -98,6 +99,13 @@ def save_ruyaml(path: pathlib.Path, yml: ruyaml.YAML, data: ruyaml.Any):
98
99
  yml.dump(data, f)
99
100
 
100
101
 
102
+ @functools.cache
103
+ def get_empty_sentinel_path() -> pathlib.Path:
104
+ path = get_app_path() / '.empty'
105
+ path.write_text('')
106
+ return path
107
+
108
+
101
109
  @contextlib.contextmanager
102
110
  def no_progress(status: Optional[rich.status.Status]):
103
111
  if status:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.5.33
3
+ Version: 0.5.34
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9,<4.0
@@ -5,11 +5,11 @@ rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  rbx/box/builder.py,sha256=eynVPyRdpYtSNmr8MP7-8jspNH74lj-DclwtiIcJrvM,3280
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=lty0K5FGCZVUiqNFdqxTG1mZHmm1aP6PHzN9gXTFRjo,13404
8
+ rbx/box/code.py,sha256=UFy7jOeTvxtIu9pdVUDv2-D6IW-beJGPC3uCanIKZh0,13412
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=OvKTE2O1UchiBRPzbU94KdIn0whT00VUbyPzUDlJRJg,11290
12
+ rbx/box/contest/build_contest_statements.py,sha256=FjkO-TaT9YqkWySyQEaa69_ZwwyrsNvEBT5hE4qSFgk,11375
13
13
  rbx/box/contest/contest_package.py,sha256=OaUbpBtkhkgOPzJ1ccI_Vq4FMSaJvZm3gMOKfVY8oy4,3032
14
14
  rbx/box/contest/contest_utils.py,sha256=TDE7I6YQJlu4dQd68wzOp019bNgqiT0RlM-LMQMjL9w,301
15
15
  rbx/box/contest/main.py,sha256=fFYeZn8KTLt9j-OFFkcBeQWw8RsTLUauFV6drM2hT48,7404
@@ -24,7 +24,7 @@ rbx/box/formatting.py,sha256=3phFRHzqVXj4Ok1yDhCq6Clbw6KlqwJNpMhs--oTWFI,405
24
24
  rbx/box/generators.py,sha256=XJsWXNjtQXUDX2huAUsl-q7OWFyIPc42CyS557jLYxk,20594
25
25
  rbx/box/generators_test.py,sha256=BqWf-A0u0ifZJZlvrMuOHOHQPfMox2Jy6540GmnTnkc,1753
26
26
  rbx/box/main.py,sha256=9G21yVefrVLwM9NERozTe-w2xeEZROD2tDL82Gpc-AE,23722
27
- rbx/box/package.py,sha256=SSckCXo7Zh412_qjYhSNwConjhR0Sk8911qGJU34Hac,11851
27
+ rbx/box/package.py,sha256=Z_voytvhDknhRKiLf1UsomvdRxlDxdXANNbUzL1HcD8,12042
28
28
  rbx/box/packaging/boca/extension.py,sha256=hQhcbocNfW2ESv5RalS1wf6uvOoOfOnR_gHvbXUbSzY,852
29
29
  rbx/box/packaging/boca/packager.py,sha256=FOhSRg5K5Y4qNB0WyTR3DKgrpObf9I0JbyGpJHOtxpo,10673
30
30
  rbx/box/packaging/contest_main.py,sha256=Hbxh7geNqrePs5tWhPgdg5W2qhaW5yoreK_VP0Sm19k,2727
@@ -45,8 +45,8 @@ rbx/box/solutions.py,sha256=oSlKeublgwSeaz_qt79d9OQqKuK6MINxa4kkiavutZo,43974
45
45
  rbx/box/solutions_test.py,sha256=Cx7Goon_0sz_PaUcD8qa8gmjgzOVub6VHss3CB0GaA0,1524
46
46
  rbx/box/state.py,sha256=yTpjfASpnSXkRB3JiDNvCg5b9JNnNxuYT4uMcbdr59s,109
47
47
  rbx/box/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- rbx/box/statements/build_statements.py,sha256=upsMT-cAnSvbmKgtijdFc0OxPcyeBxRG92hY6dN-ZOk,11920
49
- rbx/box/statements/builders.py,sha256=W3VkmtjfzrT5MkIVXgfR9fM-OWK007ihm5hfzvp9cfc,10474
48
+ rbx/box/statements/build_statements.py,sha256=GyCI_aiQpWSqz_ihDq5XCYXVOiWFRLXqhOesSRlmU1E,12019
49
+ rbx/box/statements/builders.py,sha256=pKevMe3GwiXN_k0L2l155sY1rSLneSs0DLJ5T7WhxKQ,11152
50
50
  rbx/box/statements/joiners.py,sha256=ZbxomnMjEFT8yf5WSWUB4tBa3DL3AhjGEuh8uqHyDdg,2837
51
51
  rbx/box/statements/latex.py,sha256=LkcHwXjMFxbw--Gj9T1VkFKQFsXhY9dN7xZHpZycNW8,1346
52
52
  rbx/box/statements/latex_jinja.py,sha256=7WBfn1h8DpqCAmSE6Av64HfURMnJ2AO4QX1CD72sz5E,7096
@@ -164,9 +164,9 @@ rbx/testdata/box1/wa.sol.cpp,sha256=qsHmvtLJOFI_sdvUT6ITqk7FJYqhrRTCmEIRdy4gSGE,
164
164
  rbx/testdata/caching/executable.py,sha256=WKRHNf_fprFJd1Fq1ubmQtR3mZzTYVNwKPLWuZ4HrWg,10
165
165
  rbx/testdata/compatible,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
166
  rbx/testing_utils.py,sha256=ZZLKMUHlZ4HwsuNY50jqSBJ9HhpnFdba7opjDsvXE1U,2084
167
- rbx/utils.py,sha256=q1ZmfVCD6rdKVVZFBqwVetldSgGAbIh_KLHseBTUSiQ,4511
168
- rbx_cp-0.5.33.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
169
- rbx_cp-0.5.33.dist-info/METADATA,sha256=KVWJXsloAmLAEI9NyNRHAGrXLwG2JWtz1Wf_zPSDMN8,3263
170
- rbx_cp-0.5.33.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
171
- rbx_cp-0.5.33.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
172
- rbx_cp-0.5.33.dist-info/RECORD,,
167
+ rbx/utils.py,sha256=AITbkWpWtSp-x3Xept_aObfj_jPL7XL0JJoz5-F9Fp8,4671
168
+ rbx_cp-0.5.34.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
169
+ rbx_cp-0.5.34.dist-info/METADATA,sha256=iLu8QtrjNShKSOL-kXyqAys7nYVTJDSKH6NY9EyZpJE,3263
170
+ rbx_cp-0.5.34.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
171
+ rbx_cp-0.5.34.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
172
+ rbx_cp-0.5.34.dist-info/RECORD,,