rbx.cp 0.9.1__tar.gz → 0.10.0__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 (245) hide show
  1. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/PKG-INFO +2 -1
  2. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/pyproject.toml +2 -1
  3. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/checkers.py +1 -1
  4. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/cli.py +1 -1
  5. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/builders.py +58 -4
  6. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/latex_jinja.py +38 -0
  7. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/schema.py +15 -2
  8. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/grading_context.py +9 -8
  9. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/shared/icpc.sty +35 -0
  10. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/LICENSE +0 -0
  11. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/README.md +0 -0
  12. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/__init__.py +0 -0
  13. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/annotations.py +0 -0
  14. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/autoenum.py +0 -0
  15. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/__init__.py +0 -0
  16. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/builder.py +0 -0
  17. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/cd.py +0 -0
  18. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/code.py +0 -0
  19. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/compile.py +0 -0
  20. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/conftest.py +0 -0
  21. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/__init__.py +0 -0
  22. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/build_contest_statements.py +0 -0
  23. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/contest_package.py +0 -0
  24. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/contest_utils.py +0 -0
  25. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/main.py +0 -0
  26. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/schema.py +0 -0
  27. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/contest/statements.py +0 -0
  28. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/creation.py +0 -0
  29. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/deferred.py +0 -0
  30. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/download.py +0 -0
  31. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/dump_schemas.py +0 -0
  32. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/environment.py +0 -0
  33. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/extensions.py +0 -0
  34. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/fields.py +0 -0
  35. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/formatting.py +0 -0
  36. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/generators.py +0 -0
  37. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/generators_test.py +0 -0
  38. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/git_utils.py +0 -0
  39. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/global_package.py +0 -0
  40. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/header.py +0 -0
  41. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/lang.py +0 -0
  42. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/lazy_importing_main.py +0 -0
  43. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/lazy_importing_test.py +0 -0
  44. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/linting.py +0 -0
  45. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/main.py +0 -0
  46. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/naming.py +0 -0
  47. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/package.py +0 -0
  48. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/__init__.py +0 -0
  49. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/boca/__init__.py +0 -0
  50. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/boca/extension.py +0 -0
  51. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/boca/packager.py +0 -0
  52. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/contest_main.py +0 -0
  53. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/main.py +0 -0
  54. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/moj/packager.py +0 -0
  55. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/packager.py +0 -0
  56. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/pkg/packager.py +0 -0
  57. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/polygon/packager.py +0 -0
  58. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  59. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/polygon/test.py +0 -0
  60. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/polygon/upload.py +0 -0
  61. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  62. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/presets/__init__.py +0 -0
  63. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/presets/fetch.py +0 -0
  64. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/presets/lock_schema.py +0 -0
  65. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/presets/schema.py +0 -0
  66. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/remote.py +0 -0
  67. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/retries.py +0 -0
  68. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/sanitizers/warning_stack.py +0 -0
  69. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/schema.py +0 -0
  70. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/setter_config.py +0 -0
  71. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/solutions.py +0 -0
  72. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/solutions_test.py +0 -0
  73. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/state.py +0 -0
  74. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/__init__.py +0 -0
  75. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/build_statements.py +0 -0
  76. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/expander.py +0 -0
  77. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/joiners.py +0 -0
  78. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/statements/latex.py +0 -0
  79. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/stats.py +0 -0
  80. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/stresses.py +0 -0
  81. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/stressing/__init__.py +0 -0
  82. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/stressing/finder_parser.py +0 -0
  83. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/stressing/generator_parser.py +0 -0
  84. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tasks.py +0 -0
  85. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/testcase_extractors.py +0 -0
  86. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/testcase_utils.py +0 -0
  87. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/testcases/__init__.py +0 -0
  88. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/testcases/main.py +0 -0
  89. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/__init__.py +0 -0
  90. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/boca/__init__.py +0 -0
  91. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/boca/main.py +0 -0
  92. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/boca/scrape.py +0 -0
  93. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/boca/scraper.py +0 -0
  94. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/tooling/main.py +0 -0
  95. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/__init__.py +0 -0
  96. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/captured_log.py +0 -0
  97. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/css/app.tcss +0 -0
  98. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/main.py +0 -0
  99. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/__init__.py +0 -0
  100. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/build.py +0 -0
  101. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/command.py +0 -0
  102. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/differ.py +0 -0
  103. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/error.py +0 -0
  104. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  105. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/run.py +0 -0
  106. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/run_explorer.py +0 -0
  107. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  108. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/selector.py +0 -0
  109. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/screens/test_explorer.py +0 -0
  110. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/utils/__init__.py +0 -0
  111. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/utils/run_ui.py +0 -0
  112. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/__init__.py +0 -0
  113. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/diff_box.py +0 -0
  114. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/file_log.py +0 -0
  115. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/interaction_box.py +0 -0
  116. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  117. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/test_output_box.py +0 -0
  118. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  119. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/unit.py +0 -0
  120. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/validators.py +0 -0
  121. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/box/validators_test.py +0 -0
  122. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/checker.py +0 -0
  123. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/clone.py +0 -0
  124. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/config.py +0 -0
  125. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/conftest.py +0 -0
  126. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/console.py +0 -0
  127. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/create.py +0 -0
  128. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/edit.py +0 -0
  129. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/__init__.py +0 -0
  130. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/caching.py +0 -0
  131. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/conftest.py +0 -0
  132. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/debug_context.py +0 -0
  133. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/__init__.py +0 -0
  134. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/cacher.py +0 -0
  135. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/digester.py +0 -0
  136. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/sandbox.py +0 -0
  137. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  138. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/sandboxes/isolate.py +0 -0
  139. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  140. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/sandboxes/timeit.py +0 -0
  141. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/storage.py +0 -0
  142. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/test.py +0 -0
  143. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/judge/testiso.py +0 -0
  144. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/limits.py +0 -0
  145. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/processing_context.py +0 -0
  146. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/profiling.py +0 -0
  147. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/steps.py +0 -0
  148. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/steps_with_caching.py +0 -0
  149. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading/steps_with_caching_run_test.py +0 -0
  150. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/grading_utils.py +0 -0
  151. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/hydration.py +0 -0
  152. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/main.py +0 -0
  153. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/metadata.py +0 -0
  154. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/providers/__init__.py +0 -0
  155. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/providers/codeforces.py +0 -0
  156. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/providers/provider.py +0 -0
  157. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/checkers/boilerplate.cpp +0 -0
  158. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/checkers/noop.cpp +0 -0
  159. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/default_config.json +0 -0
  160. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/default_setter_config.mac.yml +0 -0
  161. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/default_setter_config.yml +0 -0
  162. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/envs/default.rbx.yml +0 -0
  163. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/envs/isolate.rbx.yml +0 -0
  164. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/checker.sh +0 -0
  165. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compare.sh +0 -0
  166. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/c +0 -0
  167. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/cc +0 -0
  168. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/cpp +0 -0
  169. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/java +0 -0
  170. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/kt +0 -0
  171. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/py2 +0 -0
  172. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/compile/py3 +0 -0
  173. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/c +0 -0
  174. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/cc +0 -0
  175. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/cpp +0 -0
  176. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/java +0 -0
  177. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/kt +0 -0
  178. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/py2 +0 -0
  179. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactive/py3 +0 -0
  180. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  181. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/interactor_run.sh +0 -0
  182. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/bkp +0 -0
  183. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/c +0 -0
  184. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/cc +0 -0
  185. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/cpp +0 -0
  186. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/java +0 -0
  187. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/kt +0 -0
  188. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/py2 +0 -0
  189. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/run/py3 +0 -0
  190. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/safeexec.c +0 -0
  191. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/boca/safeexec_compile.sh +0 -0
  192. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  193. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  194. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  195. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  196. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  197. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  198. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  199. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  200. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  201. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  202. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  203. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  204. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  205. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  206. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  207. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  208. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  209. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  210. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/contest/.gitignore +0 -0
  211. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  212. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  213. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/contest/statement/instructions.tex +0 -0
  214. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/contest/statement/logo.png +0 -0
  215. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/env.rbx.yml +0 -0
  216. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  217. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/.gitignore +0 -0
  218. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/gens/gen.cpp +0 -0
  219. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/manual_tests/samples/000.in +0 -0
  220. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/manual_tests/samples/001.in +0 -0
  221. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  222. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/rbx.h +0 -0
  223. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  224. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
  225. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  226. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  227. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/testplan/random.py +0 -0
  228. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/testplan/random.txt +0 -0
  229. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  230. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  231. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/shared/contest_template.rbx.tex +0 -0
  232. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/presets/default/shared/problem_template.rbx.tex +0 -0
  233. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/templates/rbx.h +0 -0
  234. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/resources/templates/template.cpp +0 -0
  235. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/run.py +0 -0
  236. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/schema.py +0 -0
  237. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/submit.py +0 -0
  238. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/submitors/__init__.py +0 -0
  239. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/submitors/codeforces.py +0 -0
  240. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/submitors/submitor.py +0 -0
  241. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/test.py +0 -0
  242. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/testcase.py +0 -0
  243. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/testcase_rendering.py +0 -0
  244. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/testing_utils.py +0 -0
  245. {rbx_cp-0.9.1 → rbx_cp-0.10.0}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.9.1
3
+ Version: 0.10.0
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9.1,<4.0.0
@@ -31,6 +31,7 @@ Requires-Dist: ordered-set (>=4.1.0,<5.0.0)
31
31
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
32
32
  Requires-Dist: pydantic (==2.8.2)
33
33
  Requires-Dist: pydantic-xml[lxml] (>=2.11.0,<3.0.0)
34
+ Requires-Dist: pypandoc (>=1.15,<2.0)
34
35
  Requires-Dist: pyte (>=0.8.2,<0.9.0)
35
36
  Requires-Dist: python-iso639 (>=2024.4.27,<2025.0.0)
36
37
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "rbx.cp"
3
- version = "0.9.1"
3
+ version = "0.10.0"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -48,6 +48,7 @@ ruamel-yaml = "^0.18.14"
48
48
  lz4 = "^4.4.4"
49
49
  ordered-set = "^4.1.0"
50
50
  gitignore-parser = "^0.1.12"
51
+ pypandoc = "^1.15"
51
52
 
52
53
  [tool.poetry.scripts]
53
54
  rbc = "rbx.main:app"
@@ -30,7 +30,7 @@ def compile_checker(progress: Optional[StatusProgress] = None) -> str:
30
30
  try:
31
31
  digest = compile_item(checker, sanitized=SanitizationLevel.PREFER)
32
32
  except Exception as e:
33
- console.console.print('[error]Failed compiling checker.[/error]')
33
+ console.console.print('[error]Failed compiling checker[/error]')
34
34
  raise typer.Exit(1) from e
35
35
  return digest
36
36
 
@@ -110,7 +110,7 @@ app.add_typer(
110
110
  @app.callback()
111
111
  def main(
112
112
  cache: Annotated[
113
- int,
113
+ grading_context.CacheLevel,
114
114
  typer.Option(
115
115
  '-c',
116
116
  '--cache',
@@ -4,8 +4,9 @@ import re
4
4
  import shutil
5
5
  import typing
6
6
  from abc import ABC, abstractmethod
7
- from typing import Any, Dict, List, Optional, Tuple
7
+ from typing import Any, Dict, List, Literal, Optional, Tuple
8
8
 
9
+ import pypandoc
9
10
  import typer
10
11
  from pydantic import BaseModel
11
12
 
@@ -15,6 +16,7 @@ from rbx.box.statements.latex_jinja import (
15
16
  JinjaDictWrapper,
16
17
  render_latex_template,
17
18
  render_latex_template_blocks,
19
+ render_markdown_template_blocks,
18
20
  )
19
21
  from rbx.box.statements.schema import (
20
22
  ConversionStep,
@@ -23,6 +25,7 @@ from rbx.box.statements.schema import (
23
25
  Statement,
24
26
  StatementType,
25
27
  TexToPDF,
28
+ rbxMarkdownToTeX,
26
29
  rbxToTeX,
27
30
  )
28
31
  from rbx.box.testcase_utils import (
@@ -207,13 +210,24 @@ def render_jinja(root: pathlib.Path, content: bytes, **kwargs) -> bytes:
207
210
 
208
211
 
209
212
  def render_jinja_blocks(
210
- root: pathlib.Path, content: bytes, **kwargs
213
+ root: pathlib.Path,
214
+ content: bytes,
215
+ mode: Literal['latex', 'markdown'] = 'latex',
216
+ **kwargs,
211
217
  ) -> StatementBlocks:
212
- temp_file = '__input__.tex'
218
+ if mode == 'latex':
219
+ temp_file = '__input__.tex'
220
+ renderer = render_latex_template_blocks
221
+ elif mode == 'markdown':
222
+ temp_file = '__input__.md'
223
+ renderer = render_markdown_template_blocks
224
+ else:
225
+ raise ValueError(f'Invalid mode: {mode}')
226
+
213
227
  temp_path = root / temp_file
214
228
  temp_path.write_bytes(content)
215
229
 
216
- result: Dict[str, str] = render_latex_template_blocks(
230
+ result: Dict[str, str] = renderer(
217
231
  str(root),
218
232
  temp_file,
219
233
  kwargs,
@@ -356,6 +370,45 @@ class rbxTeXBuilder(StatementBuilder):
356
370
  )
357
371
 
358
372
 
373
+ class rbxMarkdownToTeXBuilder(StatementBuilder):
374
+ def name(self) -> ConversionType:
375
+ return ConversionType.rbxMarkdownToTeX
376
+
377
+ def default_params(self) -> ConversionStep:
378
+ return rbxMarkdownToTeX(type=ConversionType.rbxMarkdownToTeX)
379
+
380
+ def input_type(self) -> StatementType:
381
+ return StatementType.rbxMarkdown
382
+
383
+ def output_type(self) -> StatementType:
384
+ return StatementType.rbxTeX
385
+
386
+ def handles_contest(self) -> bool:
387
+ # This builder cannot build contest statements.
388
+ return False
389
+
390
+ def build(
391
+ self,
392
+ input: bytes,
393
+ context: StatementBuilderContext,
394
+ item: StatementBuilderItem,
395
+ verbose: bool = False,
396
+ ) -> bytes:
397
+ problem = typing.cast(StatementBuilderProblem, item)
398
+
399
+ statement_blocks = render_jinja_blocks(
400
+ context.root, input, mode='markdown', **problem.build_inner_jinja_kwargs()
401
+ )
402
+ blocks = statement_blocks.blocks
403
+
404
+ result_str = ''
405
+ for name, content in blocks.items():
406
+ converted_content = pypandoc.convert_text(content, 'latex', 'markdown')
407
+ result_str += f'%- block {name}\n{converted_content}\n%- endblock\n\n'
408
+
409
+ return result_str.encode()
410
+
411
+
359
412
  class TeX2PDFBuilder(StatementBuilder):
360
413
  def name(self) -> ConversionType:
361
414
  return ConversionType.TexToPDF
@@ -413,6 +466,7 @@ BUILDER_LIST: List[StatementBuilder] = [
413
466
  TeX2PDFBuilder(),
414
467
  JinjaTeXBuilder(),
415
468
  rbxTeXBuilder(),
469
+ rbxMarkdownToTeXBuilder(),
416
470
  ]
417
471
  PROBLEM_BUILDER_LIST = [
418
472
  builder for builder in BUILDER_LIST if builder.handles_problem()
@@ -32,6 +32,12 @@ J2_ARGS = {
32
32
  'autoescape': False,
33
33
  }
34
34
 
35
+ J2_MD_ARGS = {
36
+ 'trim_blocks': True,
37
+ 'autoescape': False,
38
+ }
39
+
40
+
35
41
  ######################################################################
36
42
  # Latex escape regex constants
37
43
  ######################################################################
@@ -269,3 +275,35 @@ def render_latex_template_blocks(
269
275
  '[warning]This usually happens when accessing an undefined variable.[/warning]'
270
276
  )
271
277
  raise typer.Abort() from err
278
+
279
+
280
+ def render_markdown_template_blocks(
281
+ path_templates, template_filename, template_vars=None
282
+ ) -> Dict[str, str]:
283
+ """Render a markdown template, filling in its template variables
284
+
285
+ :param path_templates: the path to the template directory
286
+ :param template_filename: the name, rooted at the path_template_directory,
287
+ of the desired template for rendering
288
+ :param template_vars: dictionary of key:val for jinja2 variables
289
+ defaults to None for case when no values need to be passed
290
+ """
291
+ var_dict = template_vars if template_vars else {}
292
+ j2_env = jinja2.Environment(
293
+ loader=jinja2.FileSystemLoader(path_templates),
294
+ **J2_MD_ARGS, # type: ignore
295
+ undefined=StrictChainableUndefined,
296
+ )
297
+ add_builtin_filters(j2_env)
298
+ add_builtin_tests(j2_env)
299
+ template = j2_env.get_template(template_filename)
300
+ ctx = template.new_context(var_dict) # type: ignore
301
+ try:
302
+ return {key: ''.join(value(ctx)) for key, value in template.blocks.items()}
303
+ except jinja2.UndefinedError as err:
304
+ console.console.print('[error]Error while rendering Jinja2 template:', end=' ')
305
+ console.console.print(err)
306
+ console.console.print(
307
+ '[warning]This usually happens when accessing an undefined variable.[/warning]'
308
+ )
309
+ raise typer.Abort() from err
@@ -27,6 +27,8 @@ class ConversionType(str, Enum):
27
27
  rbxToTex = 'rbx-tex'
28
28
  """Conversion from rbxTeX to LaTeX."""
29
29
 
30
+ rbxMarkdownToTeX = 'rbx-md-tex'
31
+ """Conversion from rbxMarkdown to LaTeX."""
30
32
  TexToPDF = 'tex2pdf'
31
33
  """Conversion from LaTeX to PDF using pdfLaTeX."""
32
34
 
@@ -38,6 +40,12 @@ class ConversionType(str, Enum):
38
40
 
39
41
 
40
42
  ### Conversion nodes.
43
+ class rbxMarkdownToTeX(BaseModel):
44
+ """Configures the conversion between rbxMarkdown and LaTeX."""
45
+
46
+ type: Literal[ConversionType.rbxMarkdownToTeX]
47
+
48
+
41
49
  class rbxToTeX(BaseModel):
42
50
  """Configures the conversion between rbxTeX and LaTeX."""
43
51
 
@@ -75,15 +83,18 @@ class JoinTexToPDF(BaseModel):
75
83
  type: Literal[JoinerType.TexToPDF]
76
84
 
77
85
 
78
- ConversionStep = Union[TexToPDF, JinjaTeX, rbxToTeX]
86
+ ConversionStep = Union[TexToPDF, JinjaTeX, rbxToTeX, rbxMarkdownToTeX]
79
87
  Joiner = JoinTexToPDF
80
88
 
81
89
 
82
90
  ### Statement types
83
91
  class StatementType(AutoEnum):
84
- rbxTeX = alias('rbx-tex', 'rbx-tex', 'rbx') # type: ignore
92
+ rbxTeX = alias('rbx-tex') # type: ignore
85
93
  """Statement written in rbxTeX format."""
86
94
 
95
+ rbxMarkdown = alias('rbxMd', 'rbx-markdown', 'rbx-md') # type: ignore
96
+ """Statement written in rbxMarkdown format."""
97
+
87
98
  TeX = alias('tex')
88
99
  """Statement written in pure LaTeX format."""
89
100
 
@@ -98,6 +109,8 @@ class StatementType(AutoEnum):
98
109
  return '.tex'
99
110
  if self == StatementType.rbxTeX:
100
111
  return '.rbx.tex'
112
+ if self == StatementType.rbxMarkdown:
113
+ return '.rbx.md'
101
114
  if self == StatementType.JinjaTeX:
102
115
  return '.jinja.tex'
103
116
  if self == StatementType.PDF:
@@ -1,7 +1,8 @@
1
1
  import contextvars
2
- from enum import Enum
3
2
  from typing import Callable, Optional, Union
4
3
 
4
+ from rbx.autoenum import AutoEnum, alias
5
+
5
6
  Condition = Union[bool, Callable[[], bool]]
6
7
 
7
8
 
@@ -15,11 +16,11 @@ class ConditionedContext:
15
16
  return self.when()
16
17
 
17
18
 
18
- class CacheLevel(Enum):
19
- NO_CACHE = 0
20
- CACHE_TRANSIENTLY = 1
21
- CACHE_COMPILATION = 2
22
- CACHE_ALL = 3
19
+ class CacheLevel(AutoEnum):
20
+ NO_CACHE = alias('none')
21
+ CACHE_TRANSIENTLY = alias('transient')
22
+ CACHE_COMPILATION = alias('compilation')
23
+ CACHE_ALL = alias('all')
23
24
 
24
25
 
25
26
  cache_level_var = contextvars.ContextVar('cache_level', default=CacheLevel.CACHE_ALL)
@@ -30,11 +31,11 @@ def is_compilation_only() -> bool:
30
31
 
31
32
 
32
33
  def is_transient() -> bool:
33
- return cache_level_var.get().value <= CacheLevel.CACHE_TRANSIENTLY.value
34
+ return cache_level_var.get() == CacheLevel.CACHE_TRANSIENTLY or is_no_cache()
34
35
 
35
36
 
36
37
  def is_no_cache() -> bool:
37
- return cache_level_var.get().value <= CacheLevel.NO_CACHE.value
38
+ return cache_level_var.get() == CacheLevel.NO_CACHE
38
39
 
39
40
 
40
41
  class cache_level(ConditionedContext):
@@ -25,6 +25,41 @@
25
25
  \usepackage{pdftexcmds}
26
26
  \usepackage{amsmath}
27
27
 
28
+ % Additional pandoc packages
29
+ %\usepackage{lmodern} % or 'libertine' / 'times' for different fonts
30
+ \usepackage{amssymb}
31
+ \usepackage{microtype}
32
+ \usepackage{graphicx}
33
+ \usepackage{longtable}
34
+ \usepackage{booktabs}
35
+ \usepackage{array}
36
+ \usepackage{multirow}
37
+ \usepackage{tabularx}
38
+ \usepackage{fancyhdr}
39
+ \usepackage{listings}
40
+ \usepackage{parskip}
41
+
42
+ % Links
43
+ \hypersetup{
44
+ colorlinks=true,
45
+ linkcolor=blue,
46
+ urlcolor=blue,
47
+ citecolor=blue,
48
+ pdfborder={0 0 0}
49
+ }
50
+
51
+ % Pandoc shenanigans
52
+ \newsavebox\pandoc@box
53
+ \newcommand*\pandocbounded[1]{% scales image to fit in text height/width
54
+ \sbox\pandoc@box{#1}%
55
+ \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}%
56
+ \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}%
57
+ \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both
58
+ \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}%Add commentMore actions
59
+ \else\usebox{\pandoc@box}%
60
+ \fi%
61
+ }
62
+
28
63
  \captionsetup[figure]{labelformat=empty}
29
64
  \setlist[itemize]{noitemsep, nolistsep}
30
65
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes