rbx.cp 0.13.6__tar.gz → 0.13.8__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.
Files changed (225) hide show
  1. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/PKG-INFO +1 -1
  2. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/pyproject.toml +1 -1
  3. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/code.py +2 -2
  4. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/upload.py +7 -1
  5. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/latex_jinja.py +1 -1
  6. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testcase_extractors.py +2 -2
  7. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testcase_utils.py +9 -7
  8. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testing/testing_package.py +152 -1
  9. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testing/testing_shared.py +4 -1
  10. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/sandboxes/stupid_sandbox.py +4 -1
  11. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/contest/contest.rbx.yml +4 -0
  12. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/problem.rbx.yml +2 -0
  13. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/shared/contest_template.rbx.tex +8 -2
  14. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/shared/icpc.sty +18 -5
  15. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/shared/problem_template.rbx.tex +7 -1
  16. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/LICENSE +0 -0
  17. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/README.md +0 -0
  18. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/__init__.py +0 -0
  19. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/annotations.py +0 -0
  20. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/autoenum.py +0 -0
  21. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/__init__.py +0 -0
  22. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/builder.py +0 -0
  23. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/cd.py +0 -0
  24. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/checkers.py +0 -0
  25. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/cli.py +0 -0
  26. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/compile.py +0 -0
  27. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/__init__.py +0 -0
  28. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/build_contest_statements.py +0 -0
  29. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/contest_package.py +0 -0
  30. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/contest_utils.py +0 -0
  31. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/main.py +0 -0
  32. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/schema.py +0 -0
  33. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/contest/statements.py +0 -0
  34. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/creation.py +0 -0
  35. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/deferred.py +0 -0
  36. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/download.py +0 -0
  37. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/dump_schemas.py +0 -0
  38. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/environment.py +0 -0
  39. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/extensions.py +0 -0
  40. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/fields.py +0 -0
  41. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/formatting.py +0 -0
  42. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/generators.py +0 -0
  43. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/git_utils.py +0 -0
  44. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/global_package.py +0 -0
  45. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/header.py +0 -0
  46. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/lang.py +0 -0
  47. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/lazy_importing_main.py +0 -0
  48. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/linting.py +0 -0
  49. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/main.py +0 -0
  50. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/naming.py +0 -0
  51. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/package.py +0 -0
  52. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/__init__.py +0 -0
  53. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/boca/__init__.py +0 -0
  54. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/boca/extension.py +0 -0
  55. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/boca/packager.py +0 -0
  56. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/contest_main.py +0 -0
  57. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/importer.py +0 -0
  58. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/main.py +0 -0
  59. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/moj/packager.py +0 -0
  60. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/packager.py +0 -0
  61. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/pkg/packager.py +0 -0
  62. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/importer.py +0 -0
  63. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/packager.py +0 -0
  64. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  65. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/test.py +0 -0
  66. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  67. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/presets/__init__.py +0 -0
  68. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/presets/fetch.py +0 -0
  69. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/presets/lock_schema.py +0 -0
  70. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/presets/schema.py +0 -0
  71. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/remote.py +0 -0
  72. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/retries.py +0 -0
  73. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/sanitizers/warning_stack.py +0 -0
  74. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/schema.py +0 -0
  75. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/setter_config.py +0 -0
  76. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/solutions.py +0 -0
  77. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/state.py +0 -0
  78. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/__init__.py +0 -0
  79. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/build_statements.py +0 -0
  80. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/builders.py +0 -0
  81. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/expander.py +0 -0
  82. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/joiners.py +0 -0
  83. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/latex.py +0 -0
  84. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/statements/schema.py +0 -0
  85. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/stats.py +0 -0
  86. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/stresses.py +0 -0
  87. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/stressing/__init__.py +0 -0
  88. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/stressing/finder_parser.py +0 -0
  89. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/stressing/generator_parser.py +0 -0
  90. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tasks.py +0 -0
  91. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testcases/__init__.py +0 -0
  92. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testcases/main.py +0 -0
  93. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testing/__init__.py +0 -0
  94. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/testing/testing_preset.py +0 -0
  95. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/__init__.py +0 -0
  96. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/boca/__init__.py +0 -0
  97. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/boca/main.py +0 -0
  98. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/boca/scrape.py +0 -0
  99. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/boca/scraper.py +0 -0
  100. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/converter.py +0 -0
  101. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/tooling/main.py +0 -0
  102. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/__init__.py +0 -0
  103. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/captured_log.py +0 -0
  104. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/css/app.tcss +0 -0
  105. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/main.py +0 -0
  106. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/__init__.py +0 -0
  107. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/build.py +0 -0
  108. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/command.py +0 -0
  109. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/differ.py +0 -0
  110. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/error.py +0 -0
  111. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  112. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/run.py +0 -0
  113. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/run_explorer.py +0 -0
  114. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  115. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/selector.py +0 -0
  116. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/screens/test_explorer.py +0 -0
  117. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/utils/__init__.py +0 -0
  118. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/utils/run_ui.py +0 -0
  119. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/__init__.py +0 -0
  120. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/diff_box.py +0 -0
  121. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/file_log.py +0 -0
  122. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/interaction_box.py +0 -0
  123. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  124. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/test_output_box.py +0 -0
  125. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  126. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/unit.py +0 -0
  127. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/box/validators.py +0 -0
  128. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/config.py +0 -0
  129. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/console.py +0 -0
  130. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/__init__.py +0 -0
  131. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/caching.py +0 -0
  132. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/debug_context.py +0 -0
  133. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/grading_context.py +0 -0
  134. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/__init__.py +0 -0
  135. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/cacher.py +0 -0
  136. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/digester.py +0 -0
  137. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/program.py +0 -0
  138. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/sandbox.py +0 -0
  139. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  140. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/sandboxes/tee.py +0 -0
  141. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/judge/storage.py +0 -0
  142. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/limits.py +0 -0
  143. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/profiling.py +0 -0
  144. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/steps.py +0 -0
  145. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/grading/steps_with_caching.py +0 -0
  146. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/providers/__init__.py +0 -0
  147. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/providers/codeforces.py +0 -0
  148. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/providers/provider.py +0 -0
  149. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/checkers/boilerplate.cpp +0 -0
  150. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/checkers/noop.cpp +0 -0
  151. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/default_config.json +0 -0
  152. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/default_setter_config.mac.yml +0 -0
  153. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/default_setter_config.yml +0 -0
  154. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/envs/default.rbx.yml +0 -0
  155. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/checker.sh +0 -0
  156. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compare.sh +0 -0
  157. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/c +0 -0
  158. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/cc +0 -0
  159. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/cpp +0 -0
  160. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/java +0 -0
  161. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/kt +0 -0
  162. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/py2 +0 -0
  163. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/compile/py3 +0 -0
  164. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/c +0 -0
  165. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/cc +0 -0
  166. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/cpp +0 -0
  167. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/java +0 -0
  168. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/kt +0 -0
  169. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/py2 +0 -0
  170. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactive/py3 +0 -0
  171. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  172. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/interactor_run.sh +0 -0
  173. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/bkp +0 -0
  174. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/c +0 -0
  175. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/cc +0 -0
  176. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/cpp +0 -0
  177. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/java +0 -0
  178. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/kt +0 -0
  179. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/py2 +0 -0
  180. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/run/py3 +0 -0
  181. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/safeexec.c +0 -0
  182. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/boca/safeexec_compile.sh +0 -0
  183. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  184. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  185. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  186. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  187. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  188. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  189. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  190. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  191. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  192. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  193. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  194. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  195. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  196. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  197. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  198. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  199. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  200. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  201. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/contest/.gitignore +0 -0
  202. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  203. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/contest/statement/instructions.tex +0 -0
  204. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/contest/statement/logo.png +0 -0
  205. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/env.rbx.yml +0 -0
  206. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  207. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/.gitignore +0 -0
  208. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/gens/gen.cpp +0 -0
  209. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/manual_tests/samples/000.in +0 -0
  210. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/manual_tests/samples/001.in +0 -0
  211. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/rbx.h +0 -0
  212. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  213. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  214. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  215. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/testplan/random.py +0 -0
  216. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/testplan/random.txt +0 -0
  217. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  218. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  219. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/templates/rbx.h +0 -0
  220. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/resources/templates/template.cpp +0 -0
  221. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/submitors/__init__.py +0 -0
  222. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/submitors/codeforces.py +0 -0
  223. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/submitors/submitor.py +0 -0
  224. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/testing_utils.py +0 -0
  225. {rbx_cp-0.13.6 → rbx_cp-0.13.8}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.13.6
3
+ Version: 0.13.8
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9.1,<4.0.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "rbx.cp"
3
- version = "0.13.6"
3
+ version = "0.13.8"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -174,7 +174,7 @@ def _ignore_warning_in_cxx_input(input: GradingFileInput):
174
174
  input.src = preprocessed_path
175
175
 
176
176
 
177
- def _maybe_rename_java_class(
177
+ def maybe_rename_java_class(
178
178
  compilable_path: pathlib.Path, file_mapping: FileMapping
179
179
  ) -> pathlib.Path:
180
180
  mapped_path = PosixPath(file_mapping.compilable)
@@ -540,7 +540,7 @@ def compile_item(
540
540
  download.maybe_add_testlib(code, artifacts)
541
541
  download.maybe_add_jngen(code, artifacts)
542
542
  download.maybe_add_rbx_header(code, artifacts)
543
- compilable_path = _maybe_rename_java_class(compilable_path, file_mapping)
543
+ compilable_path = maybe_rename_java_class(compilable_path, file_mapping)
544
544
  artifacts.inputs.append(
545
545
  GradingFileInput(src=compilable_path, dest=PosixPath(file_mapping.compilable))
546
546
  )
@@ -247,9 +247,15 @@ def _get_statement_for_language(language: str) -> Optional[Statement]:
247
247
  def _get_statement_blocks(statement: Statement) -> StatementBlocks:
248
248
  # TODO: actually try to convert to rbxTeX
249
249
  assert statement.type == StatementType.rbxTeX
250
+ pkg = package.find_problem_package_or_die()
251
+ # TODO: pull this from a library, too hacky at the moment
250
252
  builder_problem = StatementBuilderProblem(
251
- package=package.find_problem_package_or_die(),
253
+ package=pkg,
252
254
  statement=statement,
255
+ vars={
256
+ **pkg.expanded_vars,
257
+ **statement.expanded_vars,
258
+ },
253
259
  )
254
260
  with tempfile.TemporaryDirectory() as temp_dir:
255
261
  return render_jinja_blocks(
@@ -119,7 +119,7 @@ def scientific_notation(
119
119
  mult, exp, rest = _process_zeroes(value)
120
120
  if exp < zeroes:
121
121
  return str(value)
122
- res = '10' if exp == 1 else f'10^{exp}'
122
+ res = '10' if exp == 1 else f'10^{{{exp}}}'
123
123
  if rest > 0 and len(str(rest)) + 1 >= len(str(value)):
124
124
  # Should not convert numbers like 532 to 5*10^2 + 32.
125
125
  return str(value)
@@ -30,7 +30,7 @@ def _get_group_output(
30
30
  return group_path / f'{subgroup_prefix}{i:03d}.out'
31
31
 
32
32
 
33
- async def _run_generator_script(testcase: TestcaseSubgroup) -> str:
33
+ async def run_generator_script(testcase: TestcaseSubgroup) -> str:
34
34
  assert testcase.generatorScript is not None
35
35
 
36
36
  cacher = package.get_file_cacher()
@@ -240,7 +240,7 @@ async def run_testcase_visitor(visitor: TestcaseVisitor):
240
240
 
241
241
  # Run generator script.
242
242
  if subgroup.generatorScript is not None:
243
- script = await _run_generator_script(subgroup)
243
+ script = await run_generator_script(subgroup)
244
244
 
245
245
  # Run each line from generator script.
246
246
  for generator_name, args, line_number in _extract_script_lines(script):
@@ -40,6 +40,8 @@ class TestcaseEntry(BaseModel):
40
40
 
41
41
 
42
42
  class TestcasePattern(BaseModel):
43
+ __test__ = False
44
+
43
45
  group_prefix: List[str]
44
46
  index: Optional[int] = None
45
47
 
@@ -179,10 +181,10 @@ def parse_interaction(file: pathlib.Path) -> TestcaseInteraction:
179
181
 
180
182
  while line := f.readline().strip():
181
183
  if line.startswith(interactor_prefix):
182
- stripped = line[len(interactor_prefix) :].strip()
184
+ stripped = line[len(interactor_prefix) :].rstrip()
183
185
  entries.append(TestcaseInteractionEntry(data=stripped, pipe=0))
184
186
  elif line.startswith(solution_prefix):
185
- stripped = line[len(solution_prefix) :].strip()
187
+ stripped = line[len(solution_prefix) :].rstrip()
186
188
  entries.append(TestcaseInteractionEntry(data=stripped, pipe=1))
187
189
  else:
188
190
  raise TestcaseInteractionParsingError(
@@ -202,11 +204,11 @@ def get_alternate_interaction_texts(
202
204
  solution_entries = []
203
205
  for entry in interaction.entries:
204
206
  if entry.pipe == 1:
205
- solution_entries.append(entry.data)
206
- interactor_entries.extend(['\n'] * entry.data.count('\n'))
207
+ solution_entries.append(entry.data + '\n')
208
+ interactor_entries.extend(['\n'] * (entry.data.count('\n') + 1))
207
209
  else:
208
- interactor_entries.append(entry.data)
209
- solution_entries.extend(['\n'] * entry.data.count('\n'))
210
+ interactor_entries.append(entry.data + '\n')
211
+ solution_entries.extend(['\n'] * (entry.data.count('\n') + 1))
210
212
  return ''.join(interactor_entries), ''.join(solution_entries)
211
213
 
212
214
 
@@ -217,4 +219,4 @@ def print_interaction(interaction: TestcaseInteraction):
217
219
  text.stylize('status')
218
220
  else:
219
221
  text.stylize('info')
220
- console.console.print(text, end='')
222
+ console.console.print(text)
@@ -1,6 +1,6 @@
1
1
  import pathlib
2
2
  from dataclasses import dataclass
3
- from typing import Dict, List, Optional
3
+ from typing import Any, Dict, List, Optional
4
4
 
5
5
  from rbx import console, utils
6
6
  from rbx.box import package, presets
@@ -10,11 +10,14 @@ from rbx.box.schema import (
10
10
  CodeItem,
11
11
  ExpectedOutcome,
12
12
  Generator,
13
+ GeneratorCall,
13
14
  Interactor,
14
15
  Package,
15
16
  Solution,
16
17
  TaskType,
18
+ Testcase,
17
19
  TestcaseGroup,
20
+ TestcaseSubgroup,
18
21
  ValidatorOutcome,
19
22
  ValidatorTest,
20
23
  )
@@ -229,6 +232,154 @@ class TestingPackage(TestingShared):
229
232
  ]
230
233
  self.save()
231
234
 
235
+ def add_testgroup_with_subgroups(
236
+ self,
237
+ name: str,
238
+ subgroups: List[Dict[str, Any]],
239
+ validator: Optional[PathOrStr] = None,
240
+ extra_validators: Optional[List[PathOrStr]] = None,
241
+ ):
242
+ """Add a testgroup with subgroups.
243
+
244
+ Args:
245
+ name: Name of the testgroup
246
+ subgroups: List of subgroup definitions, each containing fields like:
247
+ - name: subgroup name
248
+ - generators: list of generator calls
249
+ - testcases: list of testcase objects
250
+ - testcaseGlob: glob pattern
251
+ - generatorScript: generator script path
252
+ - extraValidators: list of extra validators
253
+ """
254
+
255
+ subgroup_objects = []
256
+ for subgroup_data in subgroups:
257
+ subgroup_dict = {'name': subgroup_data['name']}
258
+
259
+ if 'generators' in subgroup_data:
260
+ subgroup_dict['generators'] = [
261
+ GeneratorCall(name=gen['name'], args=gen.get('args'))
262
+ for gen in subgroup_data['generators']
263
+ ]
264
+
265
+ if 'testcases' in subgroup_data:
266
+ subgroup_dict['testcases'] = [
267
+ Testcase(
268
+ inputPath=pathlib.Path(tc['inputPath']),
269
+ outputPath=pathlib.Path(tc['outputPath'])
270
+ if tc.get('outputPath')
271
+ else None,
272
+ )
273
+ for tc in subgroup_data['testcases']
274
+ ]
275
+
276
+ if 'testcaseGlob' in subgroup_data:
277
+ subgroup_dict['testcaseGlob'] = subgroup_data['testcaseGlob']
278
+
279
+ if 'generatorScript' in subgroup_data:
280
+ subgroup_dict['generatorScript'] = CodeItem(
281
+ path=pathlib.Path(subgroup_data['generatorScript'])
282
+ )
283
+
284
+ if 'extraValidators' in subgroup_data:
285
+ subgroup_dict['extraValidators'] = [
286
+ CodeItem(path=pathlib.Path(v))
287
+ for v in subgroup_data['extraValidators']
288
+ ]
289
+
290
+ subgroup_objects.append(TestcaseSubgroup(**subgroup_dict))
291
+
292
+ self.yml.testcases = self.yml.testcases + [
293
+ TestcaseGroup(
294
+ name=name,
295
+ subgroups=subgroup_objects,
296
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
297
+ extraValidators=[
298
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
299
+ ]
300
+ if extra_validators
301
+ else [],
302
+ )
303
+ ]
304
+ self.save()
305
+
306
+ def add_testgroup_with_manual_testcases(
307
+ self,
308
+ name: str,
309
+ testcases: List[Dict[str, str]],
310
+ validator: Optional[PathOrStr] = None,
311
+ extra_validators: Optional[List[PathOrStr]] = None,
312
+ ):
313
+ """Add a testgroup with manually defined testcases.
314
+
315
+ Args:
316
+ name: Name of the testgroup
317
+ testcases: List of testcase definitions, each containing:
318
+ - inputPath: path to input file
319
+ - outputPath: optional path to output file
320
+ """
321
+
322
+ testcase_objects = []
323
+ for tc_data in testcases:
324
+ testcase_objects.append(
325
+ Testcase(
326
+ inputPath=pathlib.Path(tc_data['inputPath']),
327
+ outputPath=pathlib.Path(tc_data['outputPath'])
328
+ if tc_data.get('outputPath')
329
+ else None,
330
+ )
331
+ )
332
+
333
+ self.yml.testcases = self.yml.testcases + [
334
+ TestcaseGroup(
335
+ name=name,
336
+ testcases=testcase_objects,
337
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
338
+ extraValidators=[
339
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
340
+ ]
341
+ if extra_validators
342
+ else [],
343
+ )
344
+ ]
345
+ self.save()
346
+
347
+ def add_testgroup_with_generators(
348
+ self,
349
+ name: str,
350
+ generators: List[Dict[str, str]],
351
+ validator: Optional[PathOrStr] = None,
352
+ extra_validators: Optional[List[PathOrStr]] = None,
353
+ ):
354
+ """Add a testgroup with generator calls.
355
+
356
+ Args:
357
+ name: Name of the testgroup
358
+ generators: List of generator definitions, each containing:
359
+ - name: generator name
360
+ - args: optional generator arguments
361
+ """
362
+
363
+ generator_objects = []
364
+ for gen_data in generators:
365
+ generator_objects.append(
366
+ GeneratorCall(name=gen_data['name'], args=gen_data.get('args'))
367
+ )
368
+
369
+ self.yml.testcases = self.yml.testcases + [
370
+ TestcaseGroup(
371
+ name=name,
372
+ generators=generator_objects,
373
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
374
+ extraValidators=[
375
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
376
+ ]
377
+ if extra_validators
378
+ else [],
379
+ )
380
+ ]
381
+ self.save()
382
+
232
383
  def get_build_testgroup_path(self, name: str) -> pathlib.Path:
233
384
  return self.root / 'build' / 'tests' / name
234
385
 
@@ -55,7 +55,10 @@ class TestingShared:
55
55
  return filename
56
56
 
57
57
  def relpath(self, path: PathOrStr) -> pathlib.Path:
58
- return pathlib.Path(path).relative_to(self.root)
58
+ path = pathlib.Path(path)
59
+ if not path.is_relative_to(self.root):
60
+ return path
61
+ return path.relative_to(self.root)
59
62
 
60
63
  def add_from_testdata(self, path: PathOrStr, src: PathOrStr):
61
64
  testdata_path = get_testdata_path()
@@ -316,7 +316,10 @@ class StupidSandbox(SandboxBase):
316
316
  interactor_tee.pipes.output.close()
317
317
 
318
318
  if idx == 0 and program_result.exitcode != 0:
319
- os.killpg(group_id, signal.SIGKILL)
319
+ try:
320
+ os.killpg(group_id, signal.SIGKILL)
321
+ except Exception:
322
+ pass
320
323
  elif pid == program.pid:
321
324
  program_result = program.process_exit(status, ru)
322
325
  results[0] = self._get_sandbox_log(program_result, params)
@@ -17,6 +17,10 @@ statements:
17
17
  configure:
18
18
  - type: "rbx-tex" # Convert rbxTeX to TeX
19
19
  template: "statement/template.rbx.tex"
20
+ vars:
21
+ # Turn into false to hide time limits and memory limits in the problem statement.
22
+ # Useful for ICPC-style contests where you distribute a separate info sheet.
23
+ show_limits: true
20
24
  - name: "editorial-en"
21
25
  extends: "statement-en"
22
26
  override:
@@ -31,6 +31,8 @@ statements:
31
31
  configure:
32
32
  - type: "rbx-tex" # Convert rbxTeX to TeX
33
33
  template: "statement/template.rbx.tex"
34
+ vars:
35
+ show_limits: true
34
36
  stresses:
35
37
  - name: "stress"
36
38
  generator:
@@ -1,10 +1,16 @@
1
- %- if vars.show_problem is truthy or vars.editorial is falsy
1
+ %- if problem.vars.show_problem is truthy or problem.vars.editorial is falsy
2
2
  \includeProblem
3
3
  %- if problem.short_name is defined
4
4
  [\VAR{problem.short_name}]
5
5
  %- endif
6
6
  {\VAR{problem.title | escape}}{
7
7
 
8
+ %- if problem.vars.show_limits is truthy
9
+ \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
10
+ %- else
11
+ \vspace{0.55cm}
12
+ %- endif
13
+
8
14
  \VAR{problem.blocks.legend}
9
15
 
10
16
  %- if problem.blocks.input is defined
@@ -20,7 +26,7 @@
20
26
  %- endif
21
27
 
22
28
  %- if problem.samples
23
- \vspace{0.3cm}
29
+ \vspace{0.1cm}
24
30
  \subsection*{\strExamples}
25
31
  %- for sample in problem.samples
26
32
  %- if sample.interaction is not none
@@ -16,6 +16,7 @@
16
16
  \let\mytitleformat\titleformat
17
17
  \let\titleformat\relax
18
18
  \usepackage{logicpuzzle}
19
+ \let\titleformat\mytitleformat
19
20
  \usepackage{enumitem}
20
21
  \usepackage{amsfonts}
21
22
  \usepackage[brazil]{babel}
@@ -76,6 +77,11 @@
76
77
 
77
78
  \setlength{\voffset}{-1in}
78
79
 
80
+ % Increase section text sizes
81
+ \titleformat{\section}{\LARGE\bfseries}{\thesection}{1em}{}
82
+ \titleformat{\subsection}{\Large\bfseries}{\thesubsection}{1em}{}
83
+ \titleformat{\subsubsection}{\normalsize\bfseries}{\thesubsubsection}{1em}{}
84
+
79
85
  \newcommand{\insereArquivo}[1]{
80
86
  \ifnum0\pdffilesize{#1}>0
81
87
  \VerbatimInput[xleftmargin=0mm,numbers=none,obeytabs=true]{#1}\vspace{.5em}
@@ -139,6 +145,15 @@
139
145
  #3
140
146
  }
141
147
 
148
+ \newcommand{\includeLimits}[2]{
149
+ \vspace{0.2cm}
150
+ \begin{center}
151
+ \textit{\strTimeLimit: #1}\\
152
+ \textit{\strMemoryLimit: #2}
153
+ \end{center}
154
+ \vspace{0.25cm}
155
+ }
156
+
142
157
  \newcommand{\inputdesc}[1]{
143
158
  \subsection*{\strInput}
144
159
  {#1} }
@@ -271,11 +286,9 @@
271
286
  \newcounter{pcounter}\setcounter{pcounter}{0}
272
287
  \newcounter{qcounter}\setcounter{qcounter}{0}
273
288
 
274
- \usepackage{titlesec}
275
-
276
- \titlespacing\section{0pt}{6pt plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
277
- \titlespacing\subsection{0pt}{6pt plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
278
- \titlespacing\subsubsection{0pt}{6t plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
289
+ \titlespacing\section{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
290
+ \titlespacing\subsection{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
291
+ \titlespacing\subsubsection{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
279
292
 
280
293
  \newcommand{\InsertTitlePage}
281
294
  {
@@ -15,6 +15,12 @@
15
15
  %- endif
16
16
  {\VAR{problem.title | escape}}{
17
17
 
18
+ %- if problem.vars.show_limits is truthy
19
+ \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
20
+ %- else
21
+ \vspace{0.55cm}
22
+ %- endif
23
+
18
24
  \VAR{problem.blocks.legend}
19
25
 
20
26
  %- if problem.blocks.input is defined
@@ -30,7 +36,7 @@
30
36
  %- endif
31
37
 
32
38
  %- if problem.samples
33
- \vspace{0.3cm}
39
+ \vspace{0.1cm}
34
40
  \subsection*{\strExamples}
35
41
  %- for sample in problem.samples
36
42
  %- if sample.interaction is not none
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes