rbx.cp 0.5.49__tar.gz → 0.5.50__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 (194) hide show
  1. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/PKG-INFO +1 -1
  2. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/pyproject.toml +1 -1
  3. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/cli.py +1 -0
  4. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/main.py +3 -0
  5. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/solutions.py +40 -11
  6. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/testcase_utils.py +12 -0
  7. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/testcases/main.py +2 -0
  8. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/unit.py +31 -9
  9. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/LICENSE +0 -0
  10. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/README.md +0 -0
  11. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/__init__.py +0 -0
  12. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/annotations.py +0 -0
  13. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/autoenum.py +0 -0
  14. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/__init__.py +0 -0
  15. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/builder.py +0 -0
  16. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/cd.py +0 -0
  17. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/checkers.py +0 -0
  18. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/code.py +0 -0
  19. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/compile.py +0 -0
  20. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/conftest.py +0 -0
  21. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/__init__.py +0 -0
  22. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/build_contest_statements.py +0 -0
  23. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/contest_package.py +0 -0
  24. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/contest_utils.py +0 -0
  25. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/main.py +0 -0
  26. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/schema.py +0 -0
  27. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/contest/statements.py +0 -0
  28. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/creation.py +0 -0
  29. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/deferred.py +0 -0
  30. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/download.py +0 -0
  31. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/environment.py +0 -0
  32. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/extensions.py +0 -0
  33. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/formatting.py +0 -0
  34. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/generators.py +0 -0
  35. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/generators_test.py +0 -0
  36. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/lazy_importing_main.py +0 -0
  37. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/lazy_importing_test.py +0 -0
  38. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/main.py +0 -0
  39. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/naming.py +0 -0
  40. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/package.py +0 -0
  41. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/boca/extension.py +0 -0
  42. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/boca/packager.py +0 -0
  43. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/contest_main.py +0 -0
  44. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/moj/packager.py +0 -0
  45. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/packager.py +0 -0
  46. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/polygon/packager.py +0 -0
  47. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/polygon/test.py +0 -0
  48. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  49. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/presets/__init__.py +0 -0
  50. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/presets/fetch.py +0 -0
  51. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/presets/lock_schema.py +0 -0
  52. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/presets/schema.py +0 -0
  53. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/retries.py +0 -0
  54. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/sanitizers/warning_stack.py +0 -0
  55. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/schema.py +0 -0
  56. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/setter_config.py +0 -0
  57. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/solutions_test.py +0 -0
  58. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/state.py +0 -0
  59. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/__init__.py +0 -0
  60. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/build_statements.py +0 -0
  61. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/builders.py +0 -0
  62. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/joiners.py +0 -0
  63. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/latex.py +0 -0
  64. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/latex_jinja.py +0 -0
  65. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/statements/schema.py +0 -0
  66. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/stresses.py +0 -0
  67. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/stressing/__init__.py +0 -0
  68. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/stressing/finder_parser.py +0 -0
  69. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/stressing/generator_parser.py +0 -0
  70. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/tasks.py +0 -0
  71. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/testcase_extractors.py +0 -0
  72. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/testcases/__init__.py +0 -0
  73. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/ui/__init__.py +0 -0
  74. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/ui/captured_log.py +0 -0
  75. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/ui/css/app.tcss +0 -0
  76. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/ui/main.py +0 -0
  77. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/ui/run.py +0 -0
  78. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/validators.py +0 -0
  79. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/box/validators_test.py +0 -0
  80. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/checker.py +0 -0
  81. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/clone.py +0 -0
  82. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/config.py +0 -0
  83. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/conftest.py +0 -0
  84. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/console.py +0 -0
  85. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/create.py +0 -0
  86. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/edit.py +0 -0
  87. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/__init__.py +0 -0
  88. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/caching.py +0 -0
  89. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/conftest.py +0 -0
  90. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/__init__.py +0 -0
  91. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/cacher.py +0 -0
  92. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/digester.py +0 -0
  93. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/sandbox.py +0 -0
  94. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  95. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/sandboxes/isolate.py +0 -0
  96. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  97. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/sandboxes/timeit.py +0 -0
  98. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/storage.py +0 -0
  99. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/test.py +0 -0
  100. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/judge/testiso.py +0 -0
  101. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/processing_context.py +0 -0
  102. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/steps.py +0 -0
  103. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/steps_with_caching.py +0 -0
  104. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading/steps_with_caching_run_test.py +0 -0
  105. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/grading_utils.py +0 -0
  106. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/hydration.py +0 -0
  107. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/main.py +0 -0
  108. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/metadata.py +0 -0
  109. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/providers/__init__.py +0 -0
  110. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/providers/codeforces.py +0 -0
  111. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/providers/provider.py +0 -0
  112. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/checkers/boilerplate.cpp +0 -0
  113. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/default_config.json +0 -0
  114. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/default_setter_config.mac.yml +0 -0
  115. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/default_setter_config.yml +0 -0
  116. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/envs/default.rbx.yml +0 -0
  117. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/envs/isolate.rbx.yml +0 -0
  118. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/checker.sh +0 -0
  119. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compare.sh +0 -0
  120. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/c +0 -0
  121. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/cc +0 -0
  122. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/cpp +0 -0
  123. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/java +0 -0
  124. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/kt +0 -0
  125. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/pas +0 -0
  126. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/py2 +0 -0
  127. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/compile/py3 +0 -0
  128. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/c +0 -0
  129. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/cc +0 -0
  130. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/cpp +0 -0
  131. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/java +0 -0
  132. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/kt +0 -0
  133. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/py2 +0 -0
  134. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactive/py3 +0 -0
  135. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  136. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/bkp +0 -0
  137. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/c +0 -0
  138. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/cc +0 -0
  139. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/cpp +0 -0
  140. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/java +0 -0
  141. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/kt +0 -0
  142. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/py2 +0 -0
  143. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/boca/run/py3 +0 -0
  144. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  145. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  146. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  147. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  148. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  149. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  150. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  151. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  152. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  153. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  154. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  155. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  156. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  157. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  158. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  159. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  160. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  161. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  162. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  163. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  164. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
  165. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
  166. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  167. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/.gitignore +0 -0
  168. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/gen.cpp +0 -0
  169. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  170. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/random.py +0 -0
  171. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/random.txt +0 -0
  172. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  173. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
  174. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  175. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
  176. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
  177. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  178. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
  179. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
  180. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
  181. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  182. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  183. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/resources/templates/template.cpp +0 -0
  184. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/run.py +0 -0
  185. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/schema.py +0 -0
  186. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/submit.py +0 -0
  187. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/submitors/__init__.py +0 -0
  188. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/submitors/codeforces.py +0 -0
  189. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/submitors/submitor.py +0 -0
  190. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/test.py +0 -0
  191. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/testcase.py +0 -0
  192. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/testcase_rendering.py +0 -0
  193. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/testing_utils.py +0 -0
  194. {rbx_cp-0.5.49 → rbx_cp-0.5.50}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.5.49
3
+ Version: 0.5.50
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9,<4.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "rbx.cp"
3
- version = "0.5.49"
3
+ version = "0.5.50"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -747,6 +747,7 @@ async def validate(
747
747
  rich_help_panel='Testing',
748
748
  help='Run unit tests for the validator and checker.',
749
749
  )
750
+ @package.within_problem
750
751
  def unit_tests():
751
752
  from rbx.box import unit
752
753
 
@@ -64,6 +64,7 @@ async def run_packager(
64
64
 
65
65
 
66
66
  @app.command('polygon', help='Build a package for Polygon.')
67
+ @package.within_problem
67
68
  @syncer.sync
68
69
  async def polygon(
69
70
  verification: environment.VerificationParam,
@@ -74,6 +75,7 @@ async def polygon(
74
75
 
75
76
 
76
77
  @app.command('boca', help='Build a package for BOCA.')
78
+ @package.within_problem
77
79
  @syncer.sync
78
80
  async def boca(
79
81
  verification: environment.VerificationParam,
@@ -84,6 +86,7 @@ async def boca(
84
86
 
85
87
 
86
88
  @app.command('moj', help='Build a package for MOJ.')
89
+ @package.within_problem
87
90
  @syncer.sync
88
91
  async def moj(
89
92
  verification: environment.VerificationParam,
@@ -47,7 +47,12 @@ from rbx.box.tasks import (
47
47
  run_solution_on_testcase,
48
48
  )
49
49
  from rbx.box.testcase_extractors import extract_generation_testcases
50
- from rbx.box.testcase_utils import TestcaseEntry, find_built_testcases
50
+ from rbx.box.testcase_utils import (
51
+ TestcaseEntry,
52
+ find_built_testcases,
53
+ parse_interaction,
54
+ print_interaction,
55
+ )
51
56
  from rbx.grading.steps import (
52
57
  Evaluation,
53
58
  Outcome,
@@ -323,6 +328,19 @@ def _produce_solution_items(
323
328
  return res
324
329
 
325
330
 
331
+ def print_best_output(output_files: List[pathlib.Path], empty_warning: bool = False):
332
+ for output_file in output_files:
333
+ if not output_file.is_file():
334
+ continue
335
+ if output_file.suffix == '.pio':
336
+ print_interaction(parse_interaction(output_file))
337
+ else:
338
+ console.console.print(output_file.read_text())
339
+ return
340
+ if empty_warning:
341
+ console.console.print('[warning]Solution produced no output.[/warning]')
342
+
343
+
326
344
  def run_solutions(
327
345
  progress: Optional[StatusProgress] = None,
328
346
  tracked_solutions: Optional[Set[str]] = None,
@@ -528,6 +546,7 @@ def _run_interactive_solutions(
528
546
  output_dir=output_dir,
529
547
  interactor_digest=interactor_digest,
530
548
  verification=verification,
549
+ capture_pipes=True,
531
550
  )
532
551
 
533
552
  yield EvaluationItem(
@@ -589,18 +608,28 @@ async def run_and_print_interactive_solutions(
589
608
  )
590
609
 
591
610
  stdout_path = eval.log.stdout_absolute_path
592
- if print:
611
+ if print and stdout_path is not None:
612
+ if pkg.type == TaskType.COMMUNICATION:
613
+ console.console.rule('Interaction', style='status')
614
+ output_files = [
615
+ stdout_path.with_suffix('.pio'),
616
+ stdout_path.with_suffix('.pout'),
617
+ ]
618
+ print_best_output(output_files, empty_warning=True)
619
+
593
620
  console.console.rule('Output', style='status')
594
- if (
595
- eval.testcase.output is not None
596
- and stdout_path is not None
597
- and stdout_path.is_file()
598
- ):
599
- console.console.print(stdout_path.read_text())
600
- else:
601
- console.console.print('[warning]Solution produced no output.[/warning]')
621
+ output_files = [stdout_path]
622
+ print_best_output(output_files, empty_warning=True)
602
623
  elif stdout_path is not None:
603
- console.console.print(f'[status]Output:[/status] {stdout_path}')
624
+ if stdout_path.with_suffix('.pout').is_file():
625
+ stdout_path = stdout_path.with_suffix('.pout')
626
+
627
+ if stdout_path.is_file():
628
+ console.console.print(f'[status]Output:[/status] {stdout_path}')
629
+ if stdout_path.with_suffix('.pio').is_file():
630
+ console.console.print(
631
+ f'[status]Interaction:[/status] {stdout_path.with_suffix(".pio")}'
632
+ )
604
633
  if eval.log.stderr_absolute_path is not None:
605
634
  console.console.print(
606
635
  f'[status]Stderr:[/status] {eval.log.stderr_absolute_path}'
@@ -2,6 +2,8 @@ import pathlib
2
2
  import shutil
3
3
  from typing import List, Optional, Tuple
4
4
 
5
+ import rich
6
+ import rich.text
5
7
  import typer
6
8
  from pydantic import BaseModel
7
9
 
@@ -209,3 +211,13 @@ def parse_interaction(file: pathlib.Path) -> TestcaseInteraction:
209
211
  prefixes=(interactor_prefix, solution_prefix),
210
212
  entries=entries,
211
213
  )
214
+
215
+
216
+ def print_interaction(interaction: TestcaseInteraction):
217
+ for entry in interaction.entries:
218
+ text = rich.text.Text(entry.data)
219
+ if entry.pipe == 0:
220
+ text.stylize('status')
221
+ else:
222
+ text.stylize('info')
223
+ console.console.print(text, end='')
@@ -90,6 +90,7 @@ async def _generate_for_editing(
90
90
 
91
91
 
92
92
  @app.command('view, v', help='View a testcase in your default editor.')
93
+ @package.within_problem
93
94
  @syncer.sync
94
95
  async def view(
95
96
  tc: Annotated[
@@ -126,6 +127,7 @@ async def view(
126
127
 
127
128
 
128
129
  @app.command('info, i', help='Show information about testcases.')
130
+ @package.within_problem
129
131
  @syncer.sync
130
132
  async def info(
131
133
  pattern: Annotated[
@@ -29,6 +29,16 @@ class CheckerTestEntry(BaseModel):
29
29
  answer: Optional[pathlib.Path] = None
30
30
  outcome: ExpectedOutcome
31
31
 
32
+ def running_tests_formatted_string(self) -> str:
33
+ res = []
34
+ if self.input:
35
+ res.append(f'[item]{self.input}[/item]')
36
+ if self.output:
37
+ res.append(f'[item]{self.output}[/item]')
38
+ if self.answer:
39
+ res.append(f'[item]{self.answer}[/item]')
40
+ return ', '.join(res)
41
+
32
42
 
33
43
  def _extract_validator_test_entries(
34
44
  tests: List[ValidatorTest],
@@ -91,13 +101,16 @@ async def run_validator_unit_tests(progress: StatusProgress):
91
101
  if val is not None:
92
102
  vals.append(val)
93
103
 
104
+ console.console.rule('Validator tests', style='info')
105
+ if not entries:
106
+ console.console.print(']No validator unit tests found.')
107
+ return
108
+
94
109
  compiled_validators = validators.compile_validators(vals, progress=progress)
95
110
 
96
111
  if progress:
97
112
  progress.update('Running validator unit tests...')
98
113
 
99
- console.console.rule('Validator tests', style='info')
100
-
101
114
  for i, test in enumerate(entries):
102
115
  val = _get_validator_for_test(test)
103
116
  if val is None:
@@ -127,7 +140,10 @@ async def run_validator_unit_tests(progress: StatusProgress):
127
140
  if info.ok:
128
141
  console.console.print(' [status]Actual[/status] VALID')
129
142
  else:
130
- console.console.print(f' [status]Actual[/status] {info.message}')
143
+ console.console.print(' [status]Actual[/status] INVALID')
144
+
145
+ if info.message:
146
+ console.console.print(f' [status]Message[/status] {info.message}')
131
147
 
132
148
 
133
149
  async def run_checker_unit_tests(progress: StatusProgress):
@@ -141,15 +157,19 @@ async def run_checker_unit_tests(progress: StatusProgress):
141
157
  )
142
158
  return
143
159
 
160
+ console.console.rule('Checker tests', style='info')
161
+
162
+ entries = _extract_checker_test_entries(pkg.unitTests.checker)
163
+ if not entries:
164
+ console.console.print('No checker unit tests found.')
165
+ return
166
+
144
167
  compiled_digest = checkers.compile_checker(progress=progress)
145
168
 
146
169
  if progress:
147
170
  progress.update('Running checker unit tests...')
148
171
 
149
- console.console.rule('Checker tests', style='info')
150
-
151
172
  empty_file = package.get_empty_sentinel_path()
152
- entries = _extract_checker_test_entries(pkg.unitTests.checker)
153
173
 
154
174
  for i, test in enumerate(entries):
155
175
  result = await checkers.check(
@@ -169,13 +189,15 @@ async def run_checker_unit_tests(progress: StatusProgress):
169
189
  else '[error]FAIL[/error]'
170
190
  )
171
191
 
172
- console.console.print(f'{markup} Unit test [item]#{i + 1}[/item]')
192
+ console.console.print(
193
+ f'{markup} Unit test [item]#{i + 1}[/item] ({test.running_tests_formatted_string()})'
194
+ )
173
195
  console.console.print(f' [status]Expected[/status] {test.outcome.name}')
174
196
 
175
197
  if not test.outcome.match(result.outcome):
176
198
  console.console.print(f' [status]Actual[/status] {result.outcome.name}')
177
- if result.message:
178
- console.console.print(f' [status]Message[/status] {result.message}')
199
+ if result.message:
200
+ console.console.print(f' [status]Message[/status] {result.message}')
179
201
 
180
202
 
181
203
  @syncer.sync
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes