rbx.cp 0.5.51__tar.gz → 0.5.52__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.51 → rbx_cp-0.5.52}/PKG-INFO +3 -1
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/pyproject.toml +3 -1
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/cli.py +6 -4
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/code.py +1 -1
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/environment.py +11 -1
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/main.py +4 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/solutions.py +31 -9
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/stresses.py +9 -6
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/ui/captured_log.py +9 -5
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/ui/css/app.tcss +1 -1
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/ui/run.py +19 -18
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/testing_utils.py +2 -2
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/LICENSE +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/README.md +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/annotations.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/autoenum.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/builder.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/cd.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/checkers.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/compile.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/conftest.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/build_contest_statements.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/contest_package.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/contest_utils.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/contest/statements.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/creation.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/deferred.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/download.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/extensions.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/formatting.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/generators.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/generators_test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/header.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/lazy_importing_main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/lazy_importing_test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/naming.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/package.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/boca/extension.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/boca/packager.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/contest_main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/moj/packager.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/packager.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/polygon/packager.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/polygon/polygon_api.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/polygon/test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/polygon/upload.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/packaging/polygon/xml_schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/presets/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/presets/fetch.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/presets/lock_schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/presets/schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/retries.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/sanitizers/warning_stack.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/setter_config.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/solutions_test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/state.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/build_statements.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/builders.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/joiners.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/latex.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/latex_jinja.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/statements/schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/stressing/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/stressing/finder_parser.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/stressing/generator_parser.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/tasks.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/testcase_extractors.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/testcase_utils.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/testcases/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/testcases/main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/ui/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/ui/main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/unit.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/validators.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/box/validators_test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/checker.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/clone.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/config.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/conftest.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/console.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/create.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/edit.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/caching.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/conftest.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/cacher.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/digester.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/sandbox.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/sandboxes/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/sandboxes/isolate.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/sandboxes/timeit.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/storage.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/judge/testiso.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/processing_context.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/steps.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/steps_with_caching.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading/steps_with_caching_run_test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/grading_utils.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/hydration.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/main.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/metadata.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/providers/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/providers/codeforces.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/providers/provider.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/checkers/boilerplate.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/default_config.json +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/default_setter_config.mac.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/default_setter_config.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/envs/default.rbx.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/envs/isolate.rbx.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/checker.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compare.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/c +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/cc +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/java +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/kt +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/pas +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/py2 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/compile/py3 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/c +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/cc +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/java +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/kt +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/py2 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactive/py3 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/bkp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/c +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/cc +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/java +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/kt +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/py2 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/boca/run/py3 +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/preset.rbx.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/.gitignore +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/gen.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/random.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/random.txt +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/validator.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/templates/rbx.h +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/templates/template.cpp +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/run.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/schema.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/submit.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/submitors/__init__.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/submitors/codeforces.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/submitors/submitor.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/test.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/testcase.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/testcase_rendering.py +0 -0
- {rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: rbx.cp
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.52
|
4
4
|
Summary:
|
5
5
|
Author: Roberto Sales
|
6
6
|
Requires-Python: >=3.9,<4.0
|
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.11
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
13
|
+
Requires-Dist: async-lru (>=2.0.5,<3.0.0)
|
13
14
|
Requires-Dist: chardet (>=5.2.0,<6.0.0)
|
14
15
|
Requires-Dist: fastapi (>=0.115.8,<0.116.0)
|
15
16
|
Requires-Dist: filelock (>=3.14.0,<4.0.0)
|
@@ -19,6 +20,7 @@ Requires-Dist: lark (>=1.2.2,<2.0.0)
|
|
19
20
|
Requires-Dist: latexbuild (>=0.2.2,<0.3.0)
|
20
21
|
Requires-Dist: mechanize (>=0.4.10,<0.5.0)
|
21
22
|
Requires-Dist: more-itertools (>=10.5.0,<11.0.0)
|
23
|
+
Requires-Dist: nest-asyncio (>=1.6.0,<2.0.0)
|
22
24
|
Requires-Dist: pydantic (==2.8.2)
|
23
25
|
Requires-Dist: pydantic-xml[lxml] (>=2.11.0,<3.0.0)
|
24
26
|
Requires-Dist: pyte (>=0.8.2,<0.9.0)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "rbx.cp"
|
3
|
-
version = "0.5.
|
3
|
+
version = "0.5.52"
|
4
4
|
description = ""
|
5
5
|
packages = [
|
6
6
|
{include = "rbx"}
|
@@ -34,6 +34,8 @@ lark = "^1.2.2"
|
|
34
34
|
chardet = "^5.2.0"
|
35
35
|
ruyaml = "^0.91.0"
|
36
36
|
syncer = "^2.0.3"
|
37
|
+
async-lru = "^2.0.5"
|
38
|
+
nest-asyncio = "^1.6.0"
|
37
39
|
|
38
40
|
[tool.poetry.scripts]
|
39
41
|
rbc = "rbx.main:app"
|
@@ -122,10 +122,12 @@ def main(
|
|
122
122
|
state.STATE.debug_logs = debug_logs
|
123
123
|
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
@app.command('ui', hidden=True)
|
126
|
+
@package.within_problem
|
127
|
+
def ui():
|
128
|
+
from rbx.box.ui import main as ui_pkg
|
129
|
+
|
130
|
+
ui_pkg.start()
|
129
131
|
|
130
132
|
|
131
133
|
@app.command(
|
@@ -4,7 +4,7 @@ from enum import Enum
|
|
4
4
|
from typing import Annotated, List, Optional, Type, TypeVar
|
5
5
|
|
6
6
|
import typer
|
7
|
-
from pydantic import BaseModel, ConfigDict, ValidationError
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field, ValidationError
|
8
8
|
|
9
9
|
from rbx import config, console, utils
|
10
10
|
from rbx.box.extensions import Extensions, LanguageExtensions
|
@@ -143,6 +143,13 @@ class EnvironmentLanguage(BaseModel):
|
|
143
143
|
return self.get_extension(name, cls) or cls()
|
144
144
|
|
145
145
|
|
146
|
+
class TimingConfig(BaseModel):
|
147
|
+
model_config = ConfigDict(extra='forbid')
|
148
|
+
|
149
|
+
# Formula to use to calculate the time limit for the environment.
|
150
|
+
formula: str = 'step_up(max(fastest * 3, slowest * 1.5), 100)'
|
151
|
+
|
152
|
+
|
146
153
|
class Environment(BaseModel):
|
147
154
|
model_config = ConfigDict(extra='forbid')
|
148
155
|
|
@@ -167,6 +174,9 @@ class Environment(BaseModel):
|
|
167
174
|
# Identifier of the preset that should be used when creating new problems.
|
168
175
|
preset: str = 'default'
|
169
176
|
|
177
|
+
# Timing configuration for the environment.
|
178
|
+
timing: TimingConfig = Field(default_factory=TimingConfig)
|
179
|
+
|
170
180
|
# Extensions to be added to the environment.
|
171
181
|
extensions: Optional[Extensions] = None
|
172
182
|
|
@@ -5,7 +5,7 @@ import dataclasses
|
|
5
5
|
import pathlib
|
6
6
|
import shutil
|
7
7
|
from collections.abc import Iterator
|
8
|
-
from typing import Dict, Iterable, List, Optional, Set, Tuple
|
8
|
+
from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
|
9
9
|
|
10
10
|
import rich
|
11
11
|
import rich.live
|
@@ -16,7 +16,7 @@ import typer
|
|
16
16
|
from pydantic import BaseModel
|
17
17
|
|
18
18
|
from rbx import console, utils
|
19
|
-
from rbx.box import checkers, package
|
19
|
+
from rbx.box import checkers, environment, package
|
20
20
|
from rbx.box.code import (
|
21
21
|
SanitizationLevel,
|
22
22
|
compile_item,
|
@@ -1244,6 +1244,16 @@ async def print_run_report(
|
|
1244
1244
|
return ok
|
1245
1245
|
|
1246
1246
|
|
1247
|
+
def _step_up(x: Any, step: int) -> int:
|
1248
|
+
x = int(x)
|
1249
|
+
return (x + step - 1) // step * step
|
1250
|
+
|
1251
|
+
|
1252
|
+
def _step_down(x: Any, step: int) -> int:
|
1253
|
+
x = int(x)
|
1254
|
+
return x // step * step
|
1255
|
+
|
1256
|
+
|
1247
1257
|
async def estimate_time_limit(
|
1248
1258
|
console: rich.console.Console,
|
1249
1259
|
result: RunSolutionResult,
|
@@ -1262,12 +1272,12 @@ async def estimate_time_limit(
|
|
1262
1272
|
for solution in result.skeleton.solutions:
|
1263
1273
|
timings = []
|
1264
1274
|
for evals in structured_evaluations[str(solution.path)].values():
|
1265
|
-
for
|
1266
|
-
if
|
1275
|
+
for ev in evals:
|
1276
|
+
if ev is None:
|
1267
1277
|
continue
|
1268
|
-
|
1269
|
-
if
|
1270
|
-
timings.append(int(
|
1278
|
+
ev = await ev()
|
1279
|
+
if ev.log.time is not None:
|
1280
|
+
timings.append(int(ev.log.time * 1000))
|
1271
1281
|
|
1272
1282
|
if not timings:
|
1273
1283
|
console.print(
|
@@ -1301,7 +1311,19 @@ async def estimate_time_limit(
|
|
1301
1311
|
f'Slowest language: {slowest_language} ({slowest_language_time} ms)'
|
1302
1312
|
)
|
1303
1313
|
|
1304
|
-
|
1305
|
-
|
1314
|
+
env = environment.get_environment()
|
1315
|
+
estimated_tl = int(
|
1316
|
+
eval(
|
1317
|
+
env.timing.formula,
|
1318
|
+
{
|
1319
|
+
'fastest': fastest_time,
|
1320
|
+
'slowest': slowest_time,
|
1321
|
+
'step_up': _step_up,
|
1322
|
+
'step_down': _step_down,
|
1323
|
+
},
|
1324
|
+
)
|
1325
|
+
)
|
1306
1326
|
|
1327
|
+
console.print(f'Using formula: {env.timing.formula}')
|
1328
|
+
console.print(f'[success]Estimated time limit:[/success] {estimated_tl} ms')
|
1307
1329
|
return estimated_tl
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import functools
|
2
1
|
import time
|
3
2
|
from shutil import rmtree
|
4
3
|
from typing import List, Optional
|
5
4
|
|
5
|
+
import async_lru
|
6
6
|
import syncer
|
7
7
|
import typer
|
8
8
|
from pydantic import BaseModel
|
@@ -147,7 +147,7 @@ async def run_stress(
|
|
147
147
|
else None,
|
148
148
|
)
|
149
149
|
|
150
|
-
@
|
150
|
+
@async_lru.alru_cache
|
151
151
|
async def run_solution_fn(
|
152
152
|
solution: str,
|
153
153
|
retry_index: Optional[int] = None,
|
@@ -197,7 +197,7 @@ async def run_stress(
|
|
197
197
|
raise typer.Exit(1)
|
198
198
|
expected_output_path = main_testcase_log.stdout_absolute_path
|
199
199
|
|
200
|
-
@
|
200
|
+
@async_lru.alru_cache
|
201
201
|
async def run_solution_and_checker_fn(
|
202
202
|
call: finder_parser.FinderCall,
|
203
203
|
input_path=input_path,
|
@@ -242,9 +242,12 @@ async def run_stress(
|
|
242
242
|
checker_result=eval.result,
|
243
243
|
)
|
244
244
|
|
245
|
-
|
246
|
-
|
247
|
-
|
245
|
+
@syncer.sync
|
246
|
+
async def run_fn(*args, **kwargs):
|
247
|
+
# Wrap the runner in a syncer.sync to make it work with the finder parser.
|
248
|
+
return await run_solution_and_checker_fn(*args, **kwargs)
|
249
|
+
|
250
|
+
runner = finder_parser.FinderTreeRunner(runner=run_fn)
|
248
251
|
finder_outcome: finder_parser.FinderOutcome = runner.transform(parsed_finder)
|
249
252
|
|
250
253
|
internal_error_results = [
|
@@ -8,7 +8,7 @@ import re
|
|
8
8
|
import signal
|
9
9
|
import struct
|
10
10
|
import termios
|
11
|
-
from typing import Callable, List, Optional
|
11
|
+
from typing import Callable, List, Optional, Tuple
|
12
12
|
|
13
13
|
import pyte
|
14
14
|
import textual
|
@@ -321,10 +321,14 @@ class LogDisplay(ScrollView, can_focus=True):
|
|
321
321
|
loop.remove_reader(pout)
|
322
322
|
event.set()
|
323
323
|
|
324
|
-
async def cleanup():
|
324
|
+
async def cleanup(wait_tp: Optional[Tuple[int, int]] = None):
|
325
|
+
if self.exitcode is not None:
|
326
|
+
return
|
325
327
|
try:
|
326
328
|
loop.remove_reader(pout)
|
327
|
-
|
329
|
+
if wait_tp is None:
|
330
|
+
wait_tp = os.waitpid(pid, os.WNOHANG)
|
331
|
+
_, exitstatus = wait_tp
|
328
332
|
exitcode = os.waitstatus_to_exitcode(exitstatus)
|
329
333
|
self.exitcode = exitcode
|
330
334
|
except ChildProcessError:
|
@@ -352,8 +356,8 @@ class LogDisplay(ScrollView, can_focus=True):
|
|
352
356
|
async def wait():
|
353
357
|
while True:
|
354
358
|
try:
|
355
|
-
if os.waitpid(pid, os.WNOHANG) != (0, 0):
|
356
|
-
await cleanup()
|
359
|
+
if (wait_tp := os.waitpid(pid, os.WNOHANG)) != (0, 0):
|
360
|
+
await cleanup(wait_tp)
|
357
361
|
except ChildProcessError:
|
358
362
|
break
|
359
363
|
await asyncio.sleep(0.5)
|
@@ -4,7 +4,7 @@ from typing import Optional, Set
|
|
4
4
|
import textual
|
5
5
|
from rich.text import Text
|
6
6
|
from textual.app import ComposeResult
|
7
|
-
from textual.containers import Center,
|
7
|
+
from textual.containers import Center, Grid
|
8
8
|
from textual.coordinate import Coordinate
|
9
9
|
from textual.screen import Screen
|
10
10
|
from textual.widgets import Button, DataTable, Footer, Header, SelectionList
|
@@ -57,12 +57,12 @@ class SolutionReportScreen(Screen):
|
|
57
57
|
cursor_type='row', cursor_foreground_priority='renderable'
|
58
58
|
)
|
59
59
|
if self.log_display_state is not None:
|
60
|
-
yield LogDisplay()
|
60
|
+
yield LogDisplay(id='build-output')
|
61
61
|
|
62
62
|
def on_mount(self):
|
63
|
-
self.query_one(
|
64
|
-
|
65
|
-
).border_title = 'Test generation and validation'
|
63
|
+
# self.query_one(
|
64
|
+
# '#build-output', Container
|
65
|
+
# ).border_title = 'Test generation and validation'
|
66
66
|
for solution, table in zip(
|
67
67
|
self.skeleton.solutions,
|
68
68
|
self.query(DataTable),
|
@@ -86,8 +86,7 @@ class SolutionReportScreen(Screen):
|
|
86
86
|
return i
|
87
87
|
raise
|
88
88
|
|
89
|
-
def process(self, item: EvaluationItem):
|
90
|
-
textual.log(item)
|
89
|
+
async def process(self, item: EvaluationItem):
|
91
90
|
pkg = package.find_problem_package_or_die()
|
92
91
|
sol_idx_in_skeleton = self._find_solution_index_in_skeleton(
|
93
92
|
pkg.solutions[item.solution_index]
|
@@ -102,12 +101,12 @@ class SolutionReportScreen(Screen):
|
|
102
101
|
|
103
102
|
table.update_cell_at(
|
104
103
|
Coordinate(row=row_idx, column=2),
|
105
|
-
get_testcase_markup_verdict(item.eval),
|
104
|
+
get_testcase_markup_verdict(await item.eval()),
|
106
105
|
update_width=True,
|
107
106
|
)
|
108
107
|
table.update_cell_at(
|
109
108
|
Coordinate(row=row_idx, column=3),
|
110
|
-
get_evals_formatted_time([item.eval]),
|
109
|
+
get_evals_formatted_time([await item.eval()]),
|
111
110
|
update_width=True,
|
112
111
|
)
|
113
112
|
|
@@ -158,11 +157,11 @@ class RunScreen(Screen):
|
|
158
157
|
def on_screen_resume(self):
|
159
158
|
self.query_one('#run-sols', SelectionList).focus()
|
160
159
|
|
161
|
-
def on_button_pressed(self, _: Button.Pressed):
|
162
|
-
self.action_run()
|
160
|
+
async def on_button_pressed(self, _: Button.Pressed):
|
161
|
+
await self.action_run()
|
163
162
|
|
164
163
|
@textual.work(thread=True)
|
165
|
-
def _run_solutions(self, tracked_solutions: Set[str], check: bool):
|
164
|
+
async def _run_solutions(self, tracked_solutions: Set[str], check: bool):
|
166
165
|
main_solution = package.get_main_solution()
|
167
166
|
if check and main_solution is None:
|
168
167
|
console.console.print(
|
@@ -176,9 +175,11 @@ class RunScreen(Screen):
|
|
176
175
|
exitcode = self.app.call_from_thread(build)
|
177
176
|
|
178
177
|
if exitcode != 0:
|
179
|
-
textual.log('early quit')
|
178
|
+
textual.log(f'early quit: {exitcode}')
|
180
179
|
return
|
181
180
|
|
181
|
+
textual.log('build finished ok, running solutions')
|
182
|
+
|
182
183
|
res = run_solutions(tracked_solutions=tracked_solutions, check=check)
|
183
184
|
|
184
185
|
async def mount_report_widget() -> SolutionReportScreen:
|
@@ -191,15 +192,15 @@ class RunScreen(Screen):
|
|
191
192
|
)
|
192
193
|
return screen
|
193
194
|
|
194
|
-
new_screen =
|
195
|
+
new_screen = await mount_report_widget()
|
195
196
|
|
196
|
-
def
|
197
|
-
new_screen.process(item)
|
197
|
+
async def process_item(item: EvaluationItem):
|
198
|
+
await new_screen.process(item)
|
198
199
|
|
199
200
|
for item in res.items:
|
200
|
-
self.app.call_from_thread(
|
201
|
+
self.app.call_from_thread(process_item, item)
|
201
202
|
|
202
|
-
def action_run(self):
|
203
|
+
async def action_run(self):
|
203
204
|
sols = self.query_one('#run-sols', SelectionList)
|
204
205
|
config = self.query_one('#run-config', SelectionList)
|
205
206
|
|
@@ -17,9 +17,9 @@ def get_testdata_path() -> pathlib.Path:
|
|
17
17
|
|
18
18
|
|
19
19
|
def clear_all_functools_cache():
|
20
|
-
from rbx.box import environment, package
|
20
|
+
from rbx.box import environment, header, package
|
21
21
|
|
22
|
-
pkgs = [environment, package]
|
22
|
+
pkgs = [environment, package, header]
|
23
23
|
|
24
24
|
for pkg in pkgs:
|
25
25
|
for fn in pkg.__dict__.values():
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/contest/statement/contest.rbx.tex
RENAMED
File without changes
|
File without changes
|
{rbx_cp-0.5.51 → rbx_cp-0.5.52}/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.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/projecao.png
RENAMED
File without changes
|
{rbx_cp-0.5.51 → rbx_cp-0.5.52}/rbx/resources/presets/default/problem/statement/statement.rbx.tex
RENAMED
File without changes
|
{rbx_cp-0.5.51 → rbx_cp-0.5.52}/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
|