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 +1 -1
- rbx/box/environment.py +18 -4
- rbx/box/package.py +9 -5
- rbx/box/packaging/boca/boca_language_utils.py +7 -1
- rbx/box/testing/testing_preset.py +1 -0
- rbx/box/tooling/boca/scraper.py +54 -0
- rbx/resources/presets/default/env.rbx.yml +6 -2
- rbx/resources/presets/default/preset.rbx.yml +1 -1
- rbx/resources/presets/default/problem/problem.rbx.yml +7 -7
- {rbx_cp-0.18.1.dist-info → rbx_cp-0.18.3.dist-info}/METADATA +1 -1
- {rbx_cp-0.18.1.dist-info → rbx_cp-0.18.3.dist-info}/RECORD +14 -14
- {rbx_cp-0.18.1.dist-info → rbx_cp-0.18.3.dist-info}/WHEEL +1 -1
- {rbx_cp-0.18.1.dist-info → rbx_cp-0.18.3.dist-info}/LICENSE +0 -0
- {rbx_cp-0.18.1.dist-info → rbx_cp-0.18.3.dist-info}/entry_points.txt +0 -0
rbx/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = '0.18.
|
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
|
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
|
-
|
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
|
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.
|
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
|
-
|
358
|
-
|
359
|
-
|
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
|
-
|
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
|
|
rbx/box/tooling/boca/scraper.py
CHANGED
@@ -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: "
|
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
|
@@ -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
|
20
|
+
- path: "sols/main*.*"
|
21
21
|
outcome: "ACCEPTED"
|
22
|
-
- path: "sols/ac
|
22
|
+
- path: "sols/ac-*.*"
|
23
23
|
outcome: "ACCEPTED"
|
24
|
-
- path: "sols/wa
|
24
|
+
- path: "sols/wa-*.*"
|
25
25
|
outcome: "WRONG_ANSWER"
|
26
|
-
- path: "sols/tle
|
26
|
+
- path: "sols/tle-*.*"
|
27
27
|
outcome: "TIME_LIMIT_EXCEEDED"
|
28
|
-
- path: "sols/mle
|
28
|
+
- path: "sols/mle-*.*"
|
29
29
|
outcome: "MEMORY_LIMIT_EXCEEDED"
|
30
|
-
- path: "sols/re
|
30
|
+
- path: "sols/re-*.*"
|
31
31
|
outcome: "RUNTIME_ERROR"
|
32
|
-
- path: "sols/fail
|
32
|
+
- path: "sols/fail-*.*"
|
33
33
|
outcome: "INCORRECT"
|
34
34
|
statements:
|
35
35
|
- name: "statement-en"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
rbx/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
rbx/__version__.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
204
|
-
rbx/resources/presets/default/preset.rbx.yml,sha256=
|
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=
|
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.
|
227
|
-
rbx_cp-0.18.
|
228
|
-
rbx_cp-0.18.
|
229
|
-
rbx_cp-0.18.
|
230
|
-
rbx_cp-0.18.
|
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,,
|
File without changes
|
File without changes
|