rbx.cp 0.18.1__py3-none-any.whl → 0.18.3__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/__version__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.18.1'
1
+ __version__ = '0.18.3'
rbx/box/environment.py CHANGED
@@ -294,21 +294,35 @@ def get_environment(env: Optional[str] = None) -> Environment:
294
294
 
295
295
 
296
296
  @functools.cache
297
- def get_language(name: str) -> EnvironmentLanguage:
297
+ def get_language_or_nil(name: str) -> Optional[EnvironmentLanguage]:
298
298
  for lang in get_environment().languages:
299
299
  if lang.name == name:
300
300
  return lang
301
- console.console.print(f'Language [item]{name}[/item] not found.', style='error')
301
+ return None
302
+
303
+
304
+ def get_language(name: str) -> EnvironmentLanguage:
305
+ lang = get_language_or_nil(name)
306
+ if lang is not None:
307
+ return lang
308
+ console.console.print(f'[error]Language [item]{name}[/item] not found.[/error]')
302
309
  raise typer.Exit()
303
310
 
304
311
 
305
312
  @functools.cache
306
- def get_language_by_extension(extension: str) -> EnvironmentLanguage:
313
+ def get_language_by_extension_or_nil(extension: str) -> Optional[EnvironmentLanguage]:
307
314
  for lang in get_environment().languages:
308
315
  if lang.extension == extension:
309
316
  return lang
317
+ return None
318
+
319
+
320
+ def get_language_by_extension(extension: str) -> EnvironmentLanguage:
321
+ lang = get_language_by_extension_or_nil(extension)
322
+ if lang is not None:
323
+ return lang
310
324
  console.console.print(
311
- f'Language with extension [item]{extension}[/item] not found.', style='error'
325
+ f'[error]Language with extension [item]{extension}[/item] not found.[/error]'
312
326
  )
313
327
  raise typer.Exit()
314
328
 
rbx/box/package.py CHANGED
@@ -10,7 +10,7 @@ from pydantic import ValidationError
10
10
 
11
11
  from rbx import console, utils
12
12
  from rbx.box import cd, global_package
13
- from rbx.box.environment import get_sandbox_type
13
+ from rbx.box.environment import get_language_by_extension, get_sandbox_type
14
14
  from rbx.box.global_package import get_cache_fingerprint
15
15
  from rbx.box.sanitizers import issue_stack
16
16
  from rbx.box.schema import (
@@ -354,11 +354,15 @@ def get_solutions(root: pathlib.Path = pathlib.Path()) -> List[Solution]:
354
354
  if '*' in str(entry.path):
355
355
  for file in sorted(root.glob(str(entry.path))):
356
356
  relative_file = file.relative_to(root)
357
- add_solution(
358
- Solution.model_copy(
359
- entry, update={'path': relative_file}, deep=True
357
+ if (
358
+ entry.language is not None
359
+ or get_language_by_extension(relative_file.suffix[1:]) is not None
360
+ ):
361
+ add_solution(
362
+ Solution.model_copy(
363
+ entry, update={'path': relative_file}, deep=True
364
+ )
360
365
  )
361
- )
362
366
  continue
363
367
  add_solution(entry)
364
368
  return res
@@ -5,12 +5,18 @@ from rbx.box.packaging.boca.extension import BocaLanguage, BocaLanguageExtension
5
5
 
6
6
 
7
7
  def get_rbx_language_from_boca_language(boca_language: BocaLanguage) -> str:
8
+ # First by BOCA language name.
8
9
  for language in get_environment().languages:
9
10
  language_extension = language.get_extension_or_default(
10
- language.name, BocaLanguageExtension
11
+ 'boca', BocaLanguageExtension
11
12
  )
12
13
  if language_extension.bocaLanguage == boca_language:
13
14
  return language.name
15
+ # Then by rbx language extension.
16
+ for language in get_environment().languages:
17
+ if language.extension == boca_language:
18
+ return language.name
19
+ # Then by rbx language name.
14
20
  return boca_language
15
21
 
16
22
 
@@ -9,6 +9,7 @@ class TestingPreset(TestingShared):
9
9
  def __init__(self, root: PathOrStr):
10
10
  super().__init__(root)
11
11
  self._yml = None
12
+ self.initialize()
12
13
 
13
14
  def initialize(self):
14
15
  if not self.yml_path.exists():
@@ -16,6 +16,13 @@ from throttlex import Throttler
16
16
 
17
17
  from rbx import console, utils
18
18
  from rbx.box import naming
19
+ from rbx.box.environment import (
20
+ get_environment,
21
+ get_language_or_nil,
22
+ )
23
+ from rbx.box.packaging.boca.boca_language_utils import (
24
+ get_rbx_language_from_boca_language,
25
+ )
19
26
  from rbx.box.tooling.boca.debug_utils import pretty_print_request_data
20
27
  from rbx.grading.steps import Outcome
21
28
 
@@ -104,6 +111,24 @@ class BocaDetailedRun(BocaRun):
104
111
  autojudge_answer: str
105
112
 
106
113
 
114
+ def get_boca_languages() -> List[BocaLanguage]:
115
+ env = get_environment()
116
+ res = []
117
+ for bocaLanguage in env.extensions.boca.languages:
118
+ rbxLanguage = get_rbx_language_from_boca_language(bocaLanguage)
119
+ rbxLanguage = get_language_or_nil(rbxLanguage)
120
+ if rbxLanguage is None:
121
+ continue
122
+ res.append(
123
+ BocaLanguage(
124
+ index=len(res) + 1,
125
+ name=rbxLanguage.readableName,
126
+ extension=bocaLanguage,
127
+ )
128
+ )
129
+ return res
130
+
131
+
107
132
  class BocaScraper:
108
133
  def __init__(
109
134
  self,
@@ -778,6 +803,35 @@ class BocaScraper:
778
803
  self.open(req)
779
804
  self.log('Main site configured successfully')
780
805
 
806
+ def configure_languages(self, languages: List[BocaLanguage]):
807
+ self.open(
808
+ f'{self.base_url}/admin/language.php',
809
+ error_msg='Error while configuring languages in BOCA',
810
+ )
811
+ try:
812
+ self.br.select_form(name='form1')
813
+ except mechanize.FormNotFoundError:
814
+ self.error(
815
+ 'Languages configuration form not found in BOCA website. This might happen when the login failed.'
816
+ )
817
+
818
+ reqs = []
819
+ for language in languages:
820
+ form = typing.cast(mechanize.HTMLForm, self.br.form)
821
+ form.set_all_readonly(False)
822
+ form['confirmation'] = 'confirm'
823
+
824
+ form['langnumber'] = f'{language.index}'
825
+ form['langname'] = language.name
826
+ form['langextension'] = language.extension
827
+
828
+ reqs.append(self.br.click(name='Submit3', type='submit'))
829
+
830
+ for req in reqs:
831
+ pretty_print_request_data(req)
832
+ self.open(req)
833
+ self.log('Languages configured successfully')
834
+
781
835
  def create_judge_account(self, password: str = 'boca'):
782
836
  _, html = self.open(
783
837
  f'{self.base_url}/admin/user.php',
@@ -22,6 +22,9 @@ languages:
22
22
  command: "./{executable}"
23
23
  fileMapping:
24
24
  compilable: "compilable.cpp"
25
+ extensions:
26
+ boca:
27
+ bocaLanguage: "cc"
25
28
  - name: "c"
26
29
  readableName: "C"
27
30
  extension: "c"
@@ -55,7 +58,7 @@ languages:
55
58
  fileMapping:
56
59
  compilable: "Main.java"
57
60
  executable: "Main.jar"
58
- - name: "kotlin"
61
+ - name: "kt"
59
62
  readableName: "Kotlin"
60
63
  extension: "kt"
61
64
  compilation:
@@ -70,8 +73,9 @@ languages:
70
73
  executable: "Main.jar"
71
74
  extensions:
72
75
  boca:
73
- languages: ["c", "cpp", "java", "py3", "kt"]
76
+ languages: ["c", "cc", "cpp", "java", "py3", "kt"]
74
77
  flags:
75
78
  c: "-O2 -lm -static"
76
79
  cc: "-std=c++20 -O2 -lm -static"
80
+ cpp: "-std=c++20 -O2 -lm -static"
77
81
  preferContestLetter: true
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # yaml-language-server: $schema=https://rsalesc.github.io/rbx/schemas/Preset.json
3
3
  name: "default"
4
- min_version: "0.18.1"
4
+ min_version: "0.18.3"
5
5
  uri: "rsalesc/rbx/rbx/resources/presets/default"
6
6
  problem: "problem"
7
7
  contest: "contest"
@@ -17,19 +17,19 @@ testcases:
17
17
  generatorScript:
18
18
  path: "testplan/random.py" # Generator script written programatically.
19
19
  solutions:
20
- - path: "sols/main.cpp"
20
+ - path: "sols/main*.*"
21
21
  outcome: "ACCEPTED"
22
- - path: "sols/ac-*.cpp"
22
+ - path: "sols/ac-*.*"
23
23
  outcome: "ACCEPTED"
24
- - path: "sols/wa-*.cpp"
24
+ - path: "sols/wa-*.*"
25
25
  outcome: "WRONG_ANSWER"
26
- - path: "sols/tle-*.cpp"
26
+ - path: "sols/tle-*.*"
27
27
  outcome: "TIME_LIMIT_EXCEEDED"
28
- - path: "sols/mle-*.cpp"
28
+ - path: "sols/mle-*.*"
29
29
  outcome: "MEMORY_LIMIT_EXCEEDED"
30
- - path: "sols/re-*.cpp"
30
+ - path: "sols/re-*.*"
31
31
  outcome: "RUNTIME_ERROR"
32
- - path: "sols/fail-*.cpp"
32
+ - path: "sols/fail-*.*"
33
33
  outcome: "INCORRECT"
34
34
  statements:
35
35
  - name: "statement-en"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.18.1
3
+ Version: 0.18.3
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9.1,<4.0.0
@@ -1,5 +1,5 @@
1
1
  rbx/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- rbx/__version__.py,sha256=2o8cZebVQq3IlZWOsEUKQhQ2rd7qwhVQIKyXuLPJU84,23
2
+ rbx/__version__.py,sha256=HIE5Jc7SwUm2bW0faT5SNcHY73Dx3WUhAQX-Zx0vGlg,23
3
3
  rbx/annotations.py,sha256=_TkLhgZWiUyon3bonHwUo03ls1jY8LwgcR4bVgtgnc0,3519
4
4
  rbx/autoenum.py,sha256=cusv8ClXRlDVvhZ8eDrtYcL_2peXlHugAey_ht8roXk,12025
5
5
  rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -20,7 +20,7 @@ rbx/box/creation.py,sha256=oTAC11XV2Pw2YAlF_d11Eo7A1fD6ItlpFMpLEzMLyFI,1331
20
20
  rbx/box/deferred.py,sha256=II3X9e87JCOZtmspnHh-n4PFqh-FsH_oc0XJHZ9ZYVQ,691
21
21
  rbx/box/download.py,sha256=tLW5gLVeLk0gHMEMwScSoHIXQPkXuPsqXzItsrsnUZY,3070
22
22
  rbx/box/dump_schemas.py,sha256=HXJ195h4e017DpfoFfW3MRDukON2ZhcKtJjkRPX-dX4,649
23
- rbx/box/environment.py,sha256=RBxFrcsjiMh80B6Pv21n047Yl96Vegwgo3HtPA-3QAE,14358
23
+ rbx/box/environment.py,sha256=Sl3keR8ngb78L34m4PHG_QvGH0VC1Rsjia_9ft65YZE,14732
24
24
  rbx/box/extensions.py,sha256=Von8kIeXvNFTkGlMRMTvL2HIHPwlkuiMswr-ydbGV1w,519
25
25
  rbx/box/fields.py,sha256=Gsox7Q1M7I8I2FtKvwiAfYUC6USpwghk8fel2Q9Eyhg,2291
26
26
  rbx/box/formatting.py,sha256=i3vXHpo_L_VpVPxOe4wHlai1WhlDJlfxUexS9DC0Szg,1249
@@ -34,10 +34,10 @@ rbx/box/limits_info.py,sha256=NTtcZTlDzemOtQQXbNbLORpl3RM9nYHc2-cGMnGYfF8,5370
34
34
  rbx/box/linting.py,sha256=wRE0hKCduTBHZYBFmmis_d9AMTsDu0Q-AjByCeTnkrY,3187
35
35
  rbx/box/main.py,sha256=a8CYi77kOywPFly4-ucEIJLXQW-1NFp91kK2fA42YTE,86
36
36
  rbx/box/naming.py,sha256=M6aYLIge8PHhIuCX50rwGe5VRzgUL--2BVtymIqeeXs,2389
37
- rbx/box/package.py,sha256=cNOvwE5_hedUFc9c2oHSCW0cj7qkxWXhEpqqhCbwUAc,15390
37
+ rbx/box/package.py,sha256=pzViArUFKvQ_S_EWtuigDMZrDx1ymXGqbQ7H9Ieqmik,15611
38
38
  rbx/box/packaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  rbx/box/packaging/boca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- rbx/box/packaging/boca/boca_language_utils.py,sha256=bd5-KxN-0h6yg74Jx3NUsgwf_euBU95zC2GLw0MAFS4,1071
40
+ rbx/box/packaging/boca/boca_language_utils.py,sha256=aLL58PLso1zdWuYBvTsFMT_IuJOHtTYe2CYtDQApey8,1300
41
41
  rbx/box/packaging/boca/boca_outcome_utils.py,sha256=MhO7aKTJ1weCgSJBA9MF_ejK3HFBFwC5dIsiR4wA1Mw,310
42
42
  rbx/box/packaging/boca/extension.py,sha256=EQALNEOv4zVDXSKs_dk11n92y7cBZVn8TogIK683lE0,890
43
43
  rbx/box/packaging/boca/packager.py,sha256=8dTGP6RMaWqd3a_3Tl2tEW-OuDgktXYsO8qoSuHHkPY,13909
@@ -85,7 +85,7 @@ rbx/box/testcases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
85
85
  rbx/box/testcases/main.py,sha256=_I7h_obRcpNLRQ6dDJDIE5NAvTyn5nBOhdsBhRA_PvU,5442
86
86
  rbx/box/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  rbx/box/testing/testing_package.py,sha256=szNc8GcxI0ywCjzV8fOuZh5F0fMtQ6_tLOfivF7hu10,15401
88
- rbx/box/testing/testing_preset.py,sha256=pY8Vh0Y9emZXv6LPqYkXtARCBeTDvKe6c8-CX7mN_t8,5766
88
+ rbx/box/testing/testing_preset.py,sha256=ODY0B8poW1ZvEb1xmxvC1-fny6RcbEjS50PtsTvPd00,5792
89
89
  rbx/box/testing/testing_shared.py,sha256=W4JCUo_tKvGRDSeeUx6THjGkzngSqjQlPjn_FYTa-kU,2720
90
90
  rbx/box/timing.py,sha256=vvghTagSTM9UiL98Tin6MMhDfE_9WMH8Vs-eFryMcIE,10268
91
91
  rbx/box/tooling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -94,7 +94,7 @@ rbx/box/tooling/boca/debug_utils.py,sha256=Rs1ptMWsy32jl_DJZASeOfyqh8HCJdhIXufdb
94
94
  rbx/box/tooling/boca/main.py,sha256=knl1rpaHIwA63KkzMJMZQrejzMpbTPBhYqGx1IpuNm4,289
95
95
  rbx/box/tooling/boca/manual_scrape.py,sha256=iuNtOHrWczdaWNNRMKGYkgr-wSwgtjZedpz5-sX5IRQ,724
96
96
  rbx/box/tooling/boca/scrape.py,sha256=7p4DW0smqX0_6o-C1KFIAve3YI7zfIZkP0Y9kAgHDLE,956
97
- rbx/box/tooling/boca/scraper.py,sha256=Tak3VMMveMu-1OiOiXg1mlL2URjk4lCIPudhCu0Im1o,33742
97
+ rbx/box/tooling/boca/scraper.py,sha256=sVovn0pc8J3Euj8M-MzEX9QtRbmgj6PvchJZ1HbiNFA,35508
98
98
  rbx/box/tooling/converter.py,sha256=cTRUuZ7GToMuAUo6VE7tOtaeNkXHJZE29me0yopvvsY,2544
99
99
  rbx/box/tooling/main.py,sha256=uj6XHjJMF3nyb4enbbTK8XbUAuiRLT_RP1kVwSMqV5E,2003
100
100
  rbx/box/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -200,13 +200,13 @@ rbx/resources/presets/default/contest/statement/contest.rbx.tex,sha256=Jx6op_WdV
200
200
  rbx/resources/presets/default/contest/statement/info.rbx.tex,sha256=Wz8Tbmi2lPWMgDbJsJolUi1xaQMwSnHmpZ3JwAy_Tb0,998
201
201
  rbx/resources/presets/default/contest/statement/instructions.tex,sha256=JG_eR13ukZgEahrrmrbg40H8cUzpoUE8QLocihN-fZ8,2414
202
202
  rbx/resources/presets/default/contest/statement/logo.png,sha256=RLNYmZoc-BR6AZKkmr4UEg3h01YeFzvy604jMAQC7aA,414485
203
- rbx/resources/presets/default/env.rbx.yml,sha256=af11icSgwlw80ouYpY_2Eb5N1D4J-v1QKLeIes5Bi94,2008
204
- rbx/resources/presets/default/preset.rbx.yml,sha256=ULKYyTybsFPOivzfWfGHwLeUPkC3f6tGLkJI_1zxuBM,520
203
+ rbx/resources/presets/default/env.rbx.yml,sha256=iOV0L8rRHoU6RJGGabjh0a7z54lRrS-JmzAe4R-t0MI,2105
204
+ rbx/resources/presets/default/preset.rbx.yml,sha256=S24hjmIuS5X-5kVsGSHb4PSt8Bn77hDia4EnYmfqa1Y,520
205
205
  rbx/resources/presets/default/problem/.gitignore,sha256=1rt95y9Q7ZHIQn28JyZQUdD5zkpRosjAl9ZqoQmX2cE,149
206
206
  rbx/resources/presets/default/problem/gens/gen.cpp,sha256=rn6sGRjZ1sFE1Rq02r6488iquY9xTrutcvLv4d1sohA,178
207
207
  rbx/resources/presets/default/problem/manual_tests/samples/000.in,sha256=w66OEtCJGqjUNj8cJrqgImgGVm8W_OlIUtF255ds-ow,4
208
208
  rbx/resources/presets/default/problem/manual_tests/samples/001.in,sha256=P4QInDX87xXoDWu4PVIzUeNW5LtTlUKbMCvJ9uZOPGw,20
209
- rbx/resources/presets/default/problem/problem.rbx.yml,sha256=DkGgyy7bAjR8ZPlKjXmF3POv_m9MR3qUqd7WzE88GUI,2218
209
+ rbx/resources/presets/default/problem/problem.rbx.yml,sha256=f7_PgPWvT0_7TZGPQsMhtzSXo_-iWN-uQQNk6dv1xuU,2205
210
210
  rbx/resources/presets/default/problem/rbx.h,sha256=iMNSI9tKGK8KJkl0Cgw1jhGdlRjqN_frFs-MFFS5Oq8,3760
211
211
  rbx/resources/presets/default/problem/sols/main.cpp,sha256=AW-j65DiFYUN18rddTKCWc_VyYCMgCbjZ0jAJ-0JLuA,124
212
212
  rbx/resources/presets/default/problem/sols/wa-overflow.cpp,sha256=Bj7tejPIlXG_JqUHWY1zi9TDbHdRZzgT_JDbCLRdhbQ,136
@@ -223,8 +223,8 @@ rbx/resources/templates/rbx.h,sha256=0AZds9R0PmuPgnlTENb33Y81LW0LlnmOJFaoN8oG3Yo
223
223
  rbx/resources/templates/template.cpp,sha256=xXWpWo7fa7HfmPNqkmHcmv3i46Wm0ZL-gPmkRfGvLn4,317
224
224
  rbx/testing_utils.py,sha256=vNNdaytowJfuopszVHeFzVtHWlPfipPW4zpqCOvdZKU,2908
225
225
  rbx/utils.py,sha256=zOXjEkEN9tlzLliWpssNTSmcvdgveUWDdo427qI3dhM,12225
226
- rbx_cp-0.18.1.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
227
- rbx_cp-0.18.1.dist-info/METADATA,sha256=N6exVvO8bgDLebW5exIGhjnDdiEuv6-N_Q_vAGC3iRQ,4845
228
- rbx_cp-0.18.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
229
- rbx_cp-0.18.1.dist-info/entry_points.txt,sha256=Gw2_BZ5Jon61biaH_ETbAQGXy8fR5On9gw2U4A1erpo,40
230
- rbx_cp-0.18.1.dist-info/RECORD,,
226
+ rbx_cp-0.18.3.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
227
+ rbx_cp-0.18.3.dist-info/METADATA,sha256=0wX2MVzc6Bs2Ut4bXz9yszTYOI6-7pZe1eAiYDePOcw,4845
228
+ rbx_cp-0.18.3.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
229
+ rbx_cp-0.18.3.dist-info/entry_points.txt,sha256=Gw2_BZ5Jon61biaH_ETbAQGXy8fR5On9gw2U4A1erpo,40
230
+ rbx_cp-0.18.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any