rbx.cp 0.5.47__tar.gz → 0.5.49__tar.gz
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_cp-0.5.47 → rbx_cp-0.5.49}/PKG-INFO +1 -1
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/pyproject.toml +1 -1
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/environment.py +1 -1
- rbx_cp-0.5.49/rbx/box/naming.py +22 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/boca/extension.py +1 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/boca/packager.py +10 -4
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/moj/packager.py +2 -12
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/packager.py +8 -1
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/schema.py +8 -13
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/build_statements.py +2 -1
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/unit.py +74 -6
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/steps.py +1 -1
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/LICENSE +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/README.md +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/annotations.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/autoenum.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/builder.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/cd.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/checkers.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/cli.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/code.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/compile.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/conftest.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/build_contest_statements.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/contest_package.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/contest_utils.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/contest/statements.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/creation.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/deferred.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/download.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/extensions.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/formatting.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/generators.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/generators_test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/lazy_importing_main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/lazy_importing_test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/package.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/contest_main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/polygon/packager.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/polygon/test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/packaging/polygon/xml_schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/presets/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/presets/fetch.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/presets/lock_schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/presets/schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/retries.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/sanitizers/warning_stack.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/setter_config.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/solutions.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/solutions_test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/state.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/builders.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/joiners.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/latex.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/latex_jinja.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/statements/schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/stresses.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/stressing/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/stressing/finder_parser.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/stressing/generator_parser.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/tasks.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/testcase_extractors.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/testcase_utils.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/testcases/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/testcases/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/ui/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/ui/captured_log.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/ui/css/app.tcss +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/ui/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/ui/run.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/validators.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/box/validators_test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/checker.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/clone.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/config.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/conftest.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/console.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/create.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/edit.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/caching.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/conftest.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/cacher.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/digester.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/sandbox.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/sandboxes/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/sandboxes/isolate.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/sandboxes/timeit.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/storage.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/judge/testiso.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/processing_context.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/steps_with_caching.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading/steps_with_caching_run_test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/grading_utils.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/hydration.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/main.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/metadata.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/providers/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/providers/codeforces.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/providers/provider.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/checkers/boilerplate.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/default_config.json +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/default_setter_config.mac.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/default_setter_config.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/envs/default.rbx.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/envs/isolate.rbx.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/checker.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compare.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/c +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/cc +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/java +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/kt +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/pas +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/py2 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/compile/py3 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/c +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/cc +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/java +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/kt +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/py2 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactive/py3 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/bkp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/c +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/cc +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/java +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/kt +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/py2 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/boca/run/py3 +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/preset.rbx.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/.gitignore +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/gen.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/random.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/random.txt +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/validator.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/templates/template.cpp +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/run.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/schema.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/submit.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/submitors/__init__.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/submitors/codeforces.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/submitors/submitor.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/test.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/testcase.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/testcase_rendering.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/testing_utils.py +0 -0
- {rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/utils.py +0 -0
@@ -343,7 +343,7 @@ def get_extension(name: str, _: Type[T]) -> Optional[T]:
|
|
343
343
|
pkg = get_environment()
|
344
344
|
if pkg.extensions is None:
|
345
345
|
return None
|
346
|
-
if hasattr(pkg.extensions, name):
|
346
|
+
if not hasattr(pkg.extensions, name):
|
347
347
|
return None
|
348
348
|
return getattr(pkg.extensions, name)
|
349
349
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from rbx.box import package
|
4
|
+
from rbx.box.contest import contest_package
|
5
|
+
|
6
|
+
|
7
|
+
def get_problem_shortname() -> Optional[str]:
|
8
|
+
contest = contest_package.find_contest_package()
|
9
|
+
if contest is None:
|
10
|
+
return None
|
11
|
+
problem_path = package.find_problem()
|
12
|
+
contest_path = contest_package.find_contest()
|
13
|
+
|
14
|
+
for problem in contest.problems:
|
15
|
+
if problem.path is None:
|
16
|
+
continue
|
17
|
+
if (problem_path / 'problem.rbx.yml').samefile(
|
18
|
+
contest_path / problem.path / 'problem.rbx.yml'
|
19
|
+
):
|
20
|
+
return problem.short_name
|
21
|
+
|
22
|
+
return None
|
@@ -11,6 +11,7 @@ class BocaExtension(BaseModel):
|
|
11
11
|
languages: typing.List[BocaLanguage] = list(typing.get_args(BocaLanguage))
|
12
12
|
flags: typing.Dict[BocaLanguage, str] = {}
|
13
13
|
maximumTimeError: float = _MAX_REP_ERROR
|
14
|
+
preferContestLetter: bool = False
|
14
15
|
|
15
16
|
def flags_with_defaults(self) -> typing.Dict[BocaLanguage, str]:
|
16
17
|
res: typing.Dict[BocaLanguage, str] = {
|
@@ -6,7 +6,7 @@ from typing import List
|
|
6
6
|
import typer
|
7
7
|
|
8
8
|
from rbx import console
|
9
|
-
from rbx.box import package
|
9
|
+
from rbx.box import naming, package
|
10
10
|
from rbx.box.environment import get_extension_or_default
|
11
11
|
from rbx.box.packaging.boca.extension import BocaExtension, BocaLanguage
|
12
12
|
from rbx.box.packaging.packager import BasePackager, BuiltStatement
|
@@ -52,14 +52,20 @@ class BocaPackager(BasePackager):
|
|
52
52
|
raise typer.Exit(1)
|
53
53
|
|
54
54
|
def _get_problem_name(self) -> str:
|
55
|
-
pkg = package.find_problem_package_or_die()
|
56
55
|
# BOCA forces Java class names to be the name of the problem.
|
57
|
-
return
|
56
|
+
return self.package_basename().replace('-', '_')
|
57
|
+
|
58
|
+
def _get_problem_basename(self) -> str:
|
59
|
+
extension = get_extension_or_default('boca', BocaExtension)
|
60
|
+
shortname = naming.get_problem_shortname()
|
61
|
+
if extension.preferContestLetter and shortname is not None:
|
62
|
+
return shortname
|
63
|
+
return self._get_problem_name()
|
58
64
|
|
59
65
|
def _get_problem_info(self) -> str:
|
60
66
|
statement = self._get_main_statement()
|
61
67
|
return (
|
62
|
-
f'basename={self.
|
68
|
+
f'basename={self._get_problem_basename()}\n'
|
63
69
|
f'fullname={statement.title}\n'
|
64
70
|
f'descfile={self._get_problem_name()}.pdf\n'
|
65
71
|
)
|
@@ -24,14 +24,6 @@ class MojPackager(BocaPackager):
|
|
24
24
|
def task_types(cls) -> List[TaskType]:
|
25
25
|
return [TaskType.COMMUNICATION, TaskType.BATCH]
|
26
26
|
|
27
|
-
def _get_problem_info(self) -> str:
|
28
|
-
statement = self._get_main_statement()
|
29
|
-
return (
|
30
|
-
f'basename={self._get_problem_name()}\n'
|
31
|
-
f'fullname={statement.title}\n'
|
32
|
-
f'descfile={self._get_problem_name()}.pdf\n'
|
33
|
-
)
|
34
|
-
|
35
27
|
def _get_tl(self) -> str:
|
36
28
|
extension = get_extension_or_default('boca', BocaExtension)
|
37
29
|
|
@@ -237,8 +229,6 @@ class MojPackager(BocaPackager):
|
|
237
229
|
(outputs_path / f'{i + 1:03d}').touch()
|
238
230
|
|
239
231
|
# Zip all.
|
240
|
-
shutil.make_archive(
|
241
|
-
str(build_path / self._get_problem_name()), 'zip', into_path
|
242
|
-
)
|
232
|
+
shutil.make_archive(str(build_path / self.package_basename()), 'zip', into_path)
|
243
233
|
|
244
|
-
return (build_path / self.
|
234
|
+
return (build_path / self.package_basename()).with_suffix('.zip')
|
@@ -3,7 +3,7 @@ import pathlib
|
|
3
3
|
from abc import ABC, abstractmethod
|
4
4
|
from typing import List, Tuple
|
5
5
|
|
6
|
-
from rbx.box import package
|
6
|
+
from rbx.box import naming, package
|
7
7
|
from rbx.box.contest import contest_package
|
8
8
|
from rbx.box.contest.schema import ContestProblem, ContestStatement
|
9
9
|
from rbx.box.generators import get_all_built_testcases
|
@@ -50,6 +50,13 @@ class BasePackager(ABC):
|
|
50
50
|
res.add(statement.language)
|
51
51
|
return list(res)
|
52
52
|
|
53
|
+
def package_basename(self):
|
54
|
+
pkg = package.find_problem_package_or_die()
|
55
|
+
shortname = naming.get_problem_shortname()
|
56
|
+
if shortname is not None:
|
57
|
+
return f'{shortname}-{pkg.name}'
|
58
|
+
return pkg.name
|
59
|
+
|
53
60
|
def statement_types(self) -> List[StatementType]:
|
54
61
|
return [StatementType.PDF]
|
55
62
|
|
@@ -356,8 +356,8 @@ class LimitModifiers(BaseModel):
|
|
356
356
|
class ValidatorTest(BaseModel):
|
357
357
|
model_config = ConfigDict(extra='forbid')
|
358
358
|
|
359
|
-
|
360
|
-
description='
|
359
|
+
glob: str = Field(
|
360
|
+
description='A glob pattern for the input files to be used as unit test input for the validator.'
|
361
361
|
)
|
362
362
|
outcome: ValidatorOutcome = Field(
|
363
363
|
default=ValidatorOutcome.VALID,
|
@@ -373,17 +373,12 @@ class ValidatorTest(BaseModel):
|
|
373
373
|
class CheckerTest(BaseModel):
|
374
374
|
model_config = ConfigDict(extra='forbid')
|
375
375
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
description='The solution output file to be used as unit test output for the checker. If not specified, will pass an empty file.',
|
383
|
-
)
|
384
|
-
answer: Optional[pathlib.Path] = Field(
|
385
|
-
default=None,
|
386
|
-
description='The answer file to be used as unit test answer for the checker. If not specified, will pass an empty file.',
|
376
|
+
glob: str = Field(
|
377
|
+
description="""
|
378
|
+
A glob pattern for the files to be used as unit test input for the checker.
|
379
|
+
This glob should simultaneously match the input, output, and answer files (.in, .out, .ans).
|
380
|
+
If one of them is not present, an empty file will be used instead.
|
381
|
+
""",
|
387
382
|
)
|
388
383
|
|
389
384
|
outcome: ExpectedOutcome = Field(
|
@@ -7,7 +7,7 @@ import syncer
|
|
7
7
|
import typer
|
8
8
|
|
9
9
|
from rbx import annotations, console
|
10
|
-
from rbx.box import environment, package
|
10
|
+
from rbx.box import environment, naming, package
|
11
11
|
from rbx.box.schema import Package
|
12
12
|
from rbx.box.statements.builders import (
|
13
13
|
BUILDER_LIST,
|
@@ -291,6 +291,7 @@ def build_statement(
|
|
291
291
|
output_type=output_type,
|
292
292
|
use_samples=use_samples,
|
293
293
|
is_editorial=is_editorial,
|
294
|
+
short_name=naming.get_problem_shortname(),
|
294
295
|
)
|
295
296
|
statement_path = (
|
296
297
|
package.get_build_path()
|
@@ -1,14 +1,79 @@
|
|
1
|
-
|
1
|
+
import pathlib
|
2
|
+
from typing import List, Optional, Set
|
2
3
|
|
3
4
|
import syncer
|
5
|
+
from pydantic import BaseModel
|
4
6
|
|
5
7
|
from rbx import console
|
6
8
|
from rbx.box import checkers, package, validators
|
7
|
-
from rbx.box.schema import
|
9
|
+
from rbx.box.schema import (
|
10
|
+
CheckerTest,
|
11
|
+
CodeItem,
|
12
|
+
ExpectedOutcome,
|
13
|
+
Testcase,
|
14
|
+
ValidatorOutcome,
|
15
|
+
ValidatorTest,
|
16
|
+
)
|
8
17
|
from rbx.utils import StatusProgress
|
9
18
|
|
10
19
|
|
11
|
-
|
20
|
+
class ValidatorTestEntry(BaseModel):
|
21
|
+
input: pathlib.Path
|
22
|
+
outcome: ValidatorOutcome
|
23
|
+
validator: Optional[CodeItem]
|
24
|
+
|
25
|
+
|
26
|
+
class CheckerTestEntry(BaseModel):
|
27
|
+
input: Optional[pathlib.Path] = None
|
28
|
+
output: Optional[pathlib.Path] = None
|
29
|
+
answer: Optional[pathlib.Path] = None
|
30
|
+
outcome: ExpectedOutcome
|
31
|
+
|
32
|
+
|
33
|
+
def _extract_validator_test_entries(
|
34
|
+
tests: List[ValidatorTest],
|
35
|
+
) -> List[ValidatorTestEntry]:
|
36
|
+
res: List[ValidatorTestEntry] = []
|
37
|
+
for test in tests:
|
38
|
+
for input in pathlib.Path().glob(str(test.glob)):
|
39
|
+
if not input.is_file():
|
40
|
+
continue
|
41
|
+
res.append(
|
42
|
+
ValidatorTestEntry(
|
43
|
+
input=input, outcome=test.outcome, validator=test.validator
|
44
|
+
)
|
45
|
+
)
|
46
|
+
return sorted(res, key=lambda x: x.input.name)
|
47
|
+
|
48
|
+
|
49
|
+
def _extract_checker_test_entries(tests: List[CheckerTest]) -> List[CheckerTestEntry]:
|
50
|
+
res: List[CheckerTestEntry] = []
|
51
|
+
seen: Set[pathlib.Path] = set()
|
52
|
+
for test in tests:
|
53
|
+
for file in pathlib.Path().glob(str(test.glob)):
|
54
|
+
if not file.is_file():
|
55
|
+
continue
|
56
|
+
if file.suffix not in ['.in', '.out', '.ans']:
|
57
|
+
continue
|
58
|
+
basefile = file.with_suffix('')
|
59
|
+
if basefile in seen:
|
60
|
+
continue
|
61
|
+
seen.add(basefile)
|
62
|
+
input = basefile.with_suffix('.in')
|
63
|
+
output = basefile.with_suffix('.out')
|
64
|
+
answer = basefile.with_suffix('.ans')
|
65
|
+
res.append(
|
66
|
+
CheckerTestEntry(
|
67
|
+
input=input if input.is_file() else None,
|
68
|
+
output=output if output.is_file() else None,
|
69
|
+
answer=answer if answer.is_file() else None,
|
70
|
+
outcome=test.outcome,
|
71
|
+
)
|
72
|
+
)
|
73
|
+
return res
|
74
|
+
|
75
|
+
|
76
|
+
def _get_validator_for_test(test: ValidatorTestEntry) -> Optional[CodeItem]:
|
12
77
|
pkg = package.find_problem_package_or_die()
|
13
78
|
if test.validator is not None:
|
14
79
|
return test.validator
|
@@ -18,8 +83,10 @@ def _get_validator_for_test(test: ValidatorTest) -> Optional[CodeItem]:
|
|
18
83
|
async def run_validator_unit_tests(progress: StatusProgress):
|
19
84
|
pkg = package.find_problem_package_or_die()
|
20
85
|
|
86
|
+
entries = _extract_validator_test_entries(pkg.unitTests.validator)
|
87
|
+
|
21
88
|
vals: List[CodeItem] = []
|
22
|
-
for test in
|
89
|
+
for test in entries:
|
23
90
|
val = _get_validator_for_test(test)
|
24
91
|
if val is not None:
|
25
92
|
vals.append(val)
|
@@ -31,7 +98,7 @@ async def run_validator_unit_tests(progress: StatusProgress):
|
|
31
98
|
|
32
99
|
console.console.rule('Validator tests', style='info')
|
33
100
|
|
34
|
-
for i, test in enumerate(
|
101
|
+
for i, test in enumerate(entries):
|
35
102
|
val = _get_validator_for_test(test)
|
36
103
|
if val is None:
|
37
104
|
console.console.print(
|
@@ -82,8 +149,9 @@ async def run_checker_unit_tests(progress: StatusProgress):
|
|
82
149
|
console.console.rule('Checker tests', style='info')
|
83
150
|
|
84
151
|
empty_file = package.get_empty_sentinel_path()
|
152
|
+
entries = _extract_checker_test_entries(pkg.unitTests.checker)
|
85
153
|
|
86
|
-
for i, test in enumerate(
|
154
|
+
for i, test in enumerate(entries):
|
87
155
|
result = await checkers.check(
|
88
156
|
compiled_digest,
|
89
157
|
run_log=None,
|
@@ -332,7 +332,7 @@ def _expand_part(part: str, sandbox: SandboxBase) -> List[str]:
|
|
332
332
|
|
333
333
|
def _split_and_expand(command: str, sandbox: SandboxBase) -> List[str]:
|
334
334
|
res = []
|
335
|
-
parts = shlex.split(command.format(memory=sandbox.params.address_space))
|
335
|
+
parts = shlex.split(command.format(memory=sandbox.params.address_space or 2048))
|
336
336
|
for part in parts:
|
337
337
|
res.extend(_expand_part(part, sandbox))
|
338
338
|
return res
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/statement/contest.rbx.tex
RENAMED
File without changes
|
File without changes
|
{rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/contest/statement/template.rbx.tex
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/projecao.png
RENAMED
File without changes
|
{rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/statement.rbx.tex
RENAMED
File without changes
|
{rbx_cp-0.5.47 → rbx_cp-0.5.49}/rbx/resources/presets/default/problem/statement/template.rbx.tex
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|