rbx.cp 0.16.2__tar.gz → 0.17.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 (230) hide show
  1. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/PKG-INFO +1 -1
  2. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/pyproject.toml +1 -1
  3. rbx_cp-0.17.0/rbx/__version__.py +1 -0
  4. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/cli.py +1 -3
  5. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/naming.py +32 -0
  6. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/boca/packager.py +20 -17
  7. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/main.py +2 -1
  8. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/packager.py +9 -4
  9. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/importer.py +21 -6
  10. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/packager.py +10 -9
  11. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/upload.py +2 -2
  12. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/presets/fetch.py +7 -2
  13. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/schema.py +6 -0
  14. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/builders.py +4 -1
  15. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/schema.py +5 -2
  16. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/converter.py +1 -1
  17. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/preset.rbx.yml +1 -1
  18. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/problem.rbx.yml +2 -1
  19. rbx_cp-0.16.2/rbx/__version__.py +0 -1
  20. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/LICENSE +0 -0
  21. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/README.md +0 -0
  22. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/__init__.py +0 -0
  23. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/annotations.py +0 -0
  24. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/autoenum.py +0 -0
  25. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/__init__.py +0 -0
  26. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/builder.py +0 -0
  27. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/cd.py +0 -0
  28. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/checkers.py +0 -0
  29. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/code.py +0 -0
  30. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/compile.py +0 -0
  31. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/__init__.py +0 -0
  32. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/build_contest_statements.py +0 -0
  33. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/contest_package.py +0 -0
  34. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/contest_utils.py +0 -0
  35. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/main.py +0 -0
  36. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/schema.py +0 -0
  37. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/contest/statements.py +0 -0
  38. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/creation.py +0 -0
  39. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/deferred.py +0 -0
  40. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/download.py +0 -0
  41. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/dump_schemas.py +0 -0
  42. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/environment.py +0 -0
  43. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/extensions.py +0 -0
  44. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/fields.py +0 -0
  45. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/formatting.py +0 -0
  46. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/generators.py +0 -0
  47. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/git_utils.py +0 -0
  48. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/global_package.py +0 -0
  49. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/header.py +0 -0
  50. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/lang.py +0 -0
  51. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/lazy_importing_main.py +0 -0
  52. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/limits_info.py +0 -0
  53. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/linting.py +0 -0
  54. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/main.py +0 -0
  55. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/package.py +0 -0
  56. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/__init__.py +0 -0
  57. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/boca/__init__.py +0 -0
  58. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/boca/boca_language_utils.py +0 -0
  59. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/boca/boca_outcome_utils.py +0 -0
  60. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/boca/extension.py +0 -0
  61. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/contest_main.py +0 -0
  62. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/importer.py +0 -0
  63. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/moj/packager.py +0 -0
  64. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/pkg/packager.py +0 -0
  65. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  66. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/test.py +0 -0
  67. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  68. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/presets/__init__.py +0 -0
  69. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/presets/lock_schema.py +0 -0
  70. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/presets/schema.py +0 -0
  71. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/remote.py +0 -0
  72. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/retries.py +0 -0
  73. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/sanitizers/issue_stack.py +0 -0
  74. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/sanitizers/warning_stack.py +0 -0
  75. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/setter_config.py +0 -0
  76. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/solutions.py +0 -0
  77. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/state.py +0 -0
  78. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/__init__.py +0 -0
  79. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/build_statements.py +0 -0
  80. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/expander.py +0 -0
  81. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/joiners.py +0 -0
  82. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/latex.py +0 -0
  83. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/statements/latex_jinja.py +0 -0
  84. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/stats.py +0 -0
  85. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/stresses.py +0 -0
  86. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/stressing/__init__.py +0 -0
  87. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/stressing/finder_parser.py +0 -0
  88. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/stressing/generator_parser.py +0 -0
  89. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tasks.py +0 -0
  90. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testcase_extractors.py +0 -0
  91. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testcase_utils.py +0 -0
  92. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testcases/__init__.py +0 -0
  93. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testcases/main.py +0 -0
  94. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testing/__init__.py +0 -0
  95. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testing/testing_package.py +0 -0
  96. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testing/testing_preset.py +0 -0
  97. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/testing/testing_shared.py +0 -0
  98. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/timing.py +0 -0
  99. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/__init__.py +0 -0
  100. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/__init__.py +0 -0
  101. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/debug_utils.py +0 -0
  102. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/main.py +0 -0
  103. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/manual_scrape.py +0 -0
  104. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/scrape.py +0 -0
  105. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/boca/scraper.py +0 -0
  106. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/tooling/main.py +0 -0
  107. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/__init__.py +0 -0
  108. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/captured_log.py +0 -0
  109. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/css/app.tcss +0 -0
  110. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/main.py +0 -0
  111. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/__init__.py +0 -0
  112. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/build.py +0 -0
  113. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/command.py +0 -0
  114. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/differ.py +0 -0
  115. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/error.py +0 -0
  116. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  117. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/run.py +0 -0
  118. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/run_explorer.py +0 -0
  119. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  120. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/selector.py +0 -0
  121. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/screens/test_explorer.py +0 -0
  122. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/utils/__init__.py +0 -0
  123. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/utils/run_ui.py +0 -0
  124. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/__init__.py +0 -0
  125. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/diff_box.py +0 -0
  126. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/file_log.py +0 -0
  127. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/interaction_box.py +0 -0
  128. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  129. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/test_output_box.py +0 -0
  130. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  131. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/unit.py +0 -0
  132. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/box/validators.py +0 -0
  133. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/config.py +0 -0
  134. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/console.py +0 -0
  135. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/__init__.py +0 -0
  136. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/caching.py +0 -0
  137. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/debug_context.py +0 -0
  138. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/grading_context.py +0 -0
  139. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/__init__.py +0 -0
  140. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/cacher.py +0 -0
  141. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/digester.py +0 -0
  142. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/program.py +0 -0
  143. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/sandbox.py +0 -0
  144. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  145. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  146. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/sandboxes/tee.py +0 -0
  147. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/judge/storage.py +0 -0
  148. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/limits.py +0 -0
  149. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/profiling.py +0 -0
  150. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/steps.py +0 -0
  151. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/grading/steps_with_caching.py +0 -0
  152. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/checkers/boilerplate.cpp +0 -0
  153. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/checkers/noop.cpp +0 -0
  154. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/default_config.json +0 -0
  155. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/default_setter_config.mac.yml +0 -0
  156. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/default_setter_config.yml +0 -0
  157. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/envs/default.rbx.yml +0 -0
  158. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/checker.sh +0 -0
  159. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compare.sh +0 -0
  160. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/c +0 -0
  161. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/cc +0 -0
  162. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/cpp +0 -0
  163. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/java +0 -0
  164. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/kt +0 -0
  165. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/py2 +0 -0
  166. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/compile/py3 +0 -0
  167. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/c +0 -0
  168. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/cc +0 -0
  169. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/cpp +0 -0
  170. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/java +0 -0
  171. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/kt +0 -0
  172. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/py2 +0 -0
  173. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactive/py3 +0 -0
  174. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  175. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/interactor_run.sh +0 -0
  176. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/bkp +0 -0
  177. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/c +0 -0
  178. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/cc +0 -0
  179. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/cpp +0 -0
  180. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/java +0 -0
  181. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/kt +0 -0
  182. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/py2 +0 -0
  183. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/run/py3 +0 -0
  184. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/safeexec.c +0 -0
  185. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/boca/safeexec_compile.sh +0 -0
  186. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  187. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  188. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  189. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  190. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  191. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  192. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  193. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  194. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  195. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  196. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  197. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  198. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  199. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  200. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  201. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  202. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  203. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  204. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/.gitignore +0 -0
  205. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  206. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  207. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/statement/info.rbx.tex +0 -0
  208. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/statement/instructions.tex +0 -0
  209. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/contest/statement/logo.png +0 -0
  210. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/env.rbx.yml +0 -0
  211. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/.gitignore +0 -0
  212. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/gens/gen.cpp +0 -0
  213. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/manual_tests/samples/000.in +0 -0
  214. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/manual_tests/samples/001.in +0 -0
  215. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/rbx.h +0 -0
  216. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  217. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/sols/wa-overflow.cpp +0 -0
  218. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  219. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/testlib.h +0 -0
  220. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/testplan/random.py +0 -0
  221. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/testplan/random.txt +0 -0
  222. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  223. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  224. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/shared/contest_template.rbx.tex +0 -0
  225. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/shared/icpc.sty +0 -0
  226. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/presets/default/shared/problem_template.rbx.tex +0 -0
  227. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/templates/rbx.h +0 -0
  228. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/resources/templates/template.cpp +0 -0
  229. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/testing_utils.py +0 -0
  230. {rbx_cp-0.16.2 → rbx_cp-0.17.0}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.16.2
3
+ Version: 0.17.0
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.16.2"
3
+ version = "0.17.0"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -0,0 +1 @@
1
+ __version__ = '0.17.0'
@@ -109,9 +109,7 @@ app.add_typer(
109
109
 
110
110
  def version_callback(value: bool) -> None:
111
111
  if value:
112
- import importlib.metadata
113
-
114
- version = importlib.metadata.version('rbx.cp')
112
+ version = utils.get_version()
115
113
 
116
114
  console.console.print(f'rbx version {version}')
117
115
  raise typer.Exit()
@@ -1,8 +1,13 @@
1
1
  from typing import Optional, Tuple
2
2
 
3
+ import typer
4
+
3
5
  from rbx.box import package
4
6
  from rbx.box.contest import contest_package
5
7
  from rbx.box.contest.schema import ContestProblem
8
+ from rbx.box.schema import Package
9
+ from rbx.box.statements.schema import Statement
10
+ from rbx.console import console
6
11
 
7
12
 
8
13
  def get_problem_entry_in_contest() -> Optional[Tuple[int, ContestProblem]]:
@@ -44,3 +49,30 @@ def get_problem_name_with_contest_info() -> str:
44
49
  if contest is None or short_name is None:
45
50
  return problem.name
46
51
  return f'{contest.name}-{short_name}-{problem.name}'
52
+
53
+
54
+ def get_title(
55
+ lang: Optional[str] = None,
56
+ statement: Optional[Statement] = None,
57
+ pkg: Optional[Package] = None,
58
+ fallback_to_title: bool = False,
59
+ ) -> str:
60
+ if pkg is None:
61
+ pkg = package.find_problem_package_or_die()
62
+ title: Optional[str] = None
63
+ if lang is not None:
64
+ title = pkg.titles.get(lang)
65
+ if statement is not None:
66
+ title = statement.title or title
67
+ if title is None:
68
+ if fallback_to_title and pkg.titles:
69
+ if len(pkg.titles) != 1:
70
+ console.print(
71
+ '[error]Package has multiple titles and no statement. Could not infer which title to use.[/error]'
72
+ )
73
+ console.print(f'Available titles: {pkg.titles}')
74
+ raise typer.Exit(1)
75
+ title = list(pkg.titles.values())[0]
76
+ else:
77
+ title = pkg.name
78
+ return title
@@ -1,7 +1,7 @@
1
1
  import pathlib
2
2
  import shutil
3
3
  from math import fabs
4
- from typing import List
4
+ from typing import List, Optional
5
5
 
6
6
  import typer
7
7
 
@@ -29,27 +29,26 @@ class BocaPackager(BasePackager):
29
29
  def task_types(cls) -> List[TaskType]:
30
30
  return [TaskType.BATCH, TaskType.COMMUNICATION]
31
31
 
32
- def _get_main_statement(self) -> Statement:
32
+ def _get_main_statement(self) -> Optional[Statement]:
33
33
  pkg = package.find_problem_package_or_die()
34
34
 
35
35
  if not pkg.expanded_statements:
36
- console.console.print('[error]No statements found.[/error]')
37
- raise typer.Exit(1)
36
+ return None
38
37
 
39
38
  return pkg.expanded_statements[0]
40
39
 
41
40
  def _get_main_built_statement(
42
41
  self, built_statements: List[BuiltStatement]
43
- ) -> BuiltStatement:
42
+ ) -> Optional[BuiltStatement]:
44
43
  statement = self._get_main_statement()
44
+ if statement is None:
45
+ return None
46
+
45
47
  for built_statement in built_statements:
46
48
  if built_statement.statement == statement:
47
49
  return built_statement
48
50
 
49
- console.console.print(
50
- '[error]Main statement not found among built statements.[/error]'
51
- )
52
- raise typer.Exit(1)
51
+ return None
53
52
 
54
53
  def _get_problem_name(self) -> str:
55
54
  # BOCA forces Java class names to be the name of the problem.
@@ -64,9 +63,11 @@ class BocaPackager(BasePackager):
64
63
 
65
64
  def _get_problem_info(self) -> str:
66
65
  statement = self._get_main_statement()
66
+ lang = statement.language if statement is not None else None
67
+ title = naming.get_title(lang, statement, fallback_to_title=True)
67
68
  return (
68
69
  f'basename={self._get_problem_basename()}\n'
69
- f'fullname={statement.title}\n'
70
+ f'fullname={title}\n'
70
71
  f'descfile={self._get_problem_basename()}.pdf\n'
71
72
  )
72
73
 
@@ -322,13 +323,15 @@ class BocaPackager(BasePackager):
322
323
  (tests_path / language).write_text('exit 0\n')
323
324
 
324
325
  # Problem statement
325
- description_path = into_path / 'description'
326
- description_path.mkdir(parents=True, exist_ok=True)
327
- (description_path / 'problem.info').write_text(self._get_problem_info())
328
- shutil.copyfile(
329
- self._get_main_built_statement(built_statements).path,
330
- (description_path / self._get_problem_basename()).with_suffix('.pdf'),
331
- )
326
+ main_built_statement = self._get_main_built_statement(built_statements)
327
+ if main_built_statement is not None:
328
+ description_path = into_path / 'description'
329
+ description_path.mkdir(parents=True, exist_ok=True)
330
+ (description_path / 'problem.info').write_text(self._get_problem_info())
331
+ shutil.copyfile(
332
+ self._get_main_built_statement(built_statements).path,
333
+ (description_path / self._get_problem_basename()).with_suffix('.pdf'),
334
+ )
332
335
 
333
336
  # Copy solutions
334
337
  solutions_path = into_path / 'solutions'
@@ -26,7 +26,8 @@ async def polygon(
26
26
  None,
27
27
  '--language',
28
28
  '-l',
29
- help='If set, will use the given language as the main language.',
29
+ help='If set, will use the given language as the main language. '
30
+ 'Leave unset if your problem has no statements.',
30
31
  ),
31
32
  upload_as_english: bool = typer.Option(
32
33
  False,
@@ -3,7 +3,7 @@ import pathlib
3
3
  import shutil
4
4
  import tempfile
5
5
  from abc import ABC, abstractmethod
6
- from typing import List, Tuple, Type
6
+ from typing import List, Optional, Tuple, Type
7
7
 
8
8
  import typer
9
9
 
@@ -94,12 +94,17 @@ class BasePackager(ABC):
94
94
  res.extend(tests_per_group[group.name])
95
95
  return res
96
96
 
97
- def get_statement_for_language(self, lang: str) -> Statement:
97
+ def get_statement_for_language_or_null(self, lang: str) -> Optional[Statement]:
98
98
  pkg = package.find_problem_package_or_die()
99
99
  for statement in pkg.expanded_statements:
100
100
  if statement.language == lang:
101
101
  return statement
102
- raise
102
+ return None
103
+
104
+ def get_statement_for_language_or_die(self, lang: str) -> Statement:
105
+ statement = self.get_statement_for_language_or_null(lang)
106
+ if statement is None:
107
+ raise ValueError(f'No statement for language {lang} found.')
103
108
 
104
109
 
105
110
  class BaseContestPackager(ABC):
@@ -210,7 +215,7 @@ async def run_packager(
210
215
  for statement_type in statement_types:
211
216
  languages = packager.languages()
212
217
  for language in languages:
213
- statement = packager.get_statement_for_language(language)
218
+ statement = packager.get_statement_for_language_or_die(language)
214
219
  statement_path = build_statement(statement, pkg, statement_type)
215
220
  built_statements.append(
216
221
  BuiltStatement(statement, statement_path, statement_type)
@@ -70,6 +70,14 @@ def _populate_tests(
70
70
  ]
71
71
 
72
72
 
73
+ def _populate_titles(problem: Problem, pkg: Package):
74
+ titles = {}
75
+ for name in problem.names:
76
+ iso639_code = lang.lang_to_code(name.language)
77
+ titles[iso639_code] = name.value
78
+ pkg.titles = titles
79
+
80
+
73
81
  def _populate_statements(
74
82
  problem: Problem,
75
83
  pkg: Package,
@@ -83,9 +91,6 @@ def _populate_statements(
83
91
  found_main = False
84
92
 
85
93
  for statement in pdf_statements:
86
- if statement.language not in name_per_language:
87
- continue
88
- name = name_per_language[statement.language]
89
94
  statement_path = into_path / _get_statement_path(statement)
90
95
  statement_path.parent.mkdir(parents=True, exist_ok=True)
91
96
  shutil.copy(pkg_path / statement.path, statement_path)
@@ -93,8 +98,7 @@ def _populate_statements(
93
98
  iso639_code = lang.lang_to_code(statement.language)
94
99
 
95
100
  pkg_statement = BoxStatement(
96
- name=f'statement-{name.language}',
97
- title=name.value,
101
+ name=f'statement-{statement.language}',
98
102
  language=iso639_code,
99
103
  path=_get_statement_path(statement),
100
104
  type=StatementType.PDF,
@@ -110,7 +114,8 @@ def _populate_statements(
110
114
  found_main = True
111
115
  continue
112
116
 
113
- if name.main and not found_main:
117
+ name = name_per_language.get(statement.language)
118
+ if name is not None and name.main and not found_main:
114
119
  # If main statement, add it to the front of the list
115
120
  pkg_statements = [pkg_statement] + pkg_statements
116
121
  found_main = True
@@ -124,8 +129,17 @@ def _populate_statements(
124
129
  console.console.print(
125
130
  f'[error]Main statement of language [item]{main_language}[/item] not found.[/error]',
126
131
  )
132
+ console.console.print(
133
+ 'If you want no statement in your imported package, '
134
+ 'leave the [item]--main-language[/item] flag unset.'
135
+ )
127
136
  raise typer.Exit(1)
128
137
 
138
+ if not pkg_statements:
139
+ console.console.print(
140
+ '[warning]Imported problem has no statements. Continuing without a statement.[/warning]',
141
+ )
142
+
129
143
 
130
144
  def _is_cpp_source(source: File) -> bool:
131
145
  if source.type is None:
@@ -224,6 +238,7 @@ class PolygonImporter(BaseImporter):
224
238
  )
225
239
 
226
240
  _populate_tests(testset, pkg, pkg_path, into_path)
241
+ _populate_titles(problem, pkg)
227
242
  _populate_statements(problem, pkg, pkg_path, into_path, self.main_language)
228
243
  _copy_checker(problem, pkg, pkg_path, into_path)
229
244
  _copy_interactor(problem, pkg, pkg_path, into_path)
@@ -5,7 +5,7 @@ from typing import List, Optional
5
5
  import typer
6
6
 
7
7
  from rbx import console, utils
8
- from rbx.box import header, limits_info, package
8
+ from rbx.box import header, limits_info, naming, package
9
9
  from rbx.box.lang import code_to_lang, code_to_langs, is_valid_lang_code
10
10
  from rbx.box.packaging.packager import (
11
11
  BaseContestPackager,
@@ -62,7 +62,7 @@ class PolygonPackager(BasePackager):
62
62
 
63
63
  lang_codes = set()
64
64
  for statement in pkg.expanded_statements:
65
- lang_codes.add(statement.title)
65
+ lang_codes.add(statement.language)
66
66
 
67
67
  for lang in langs:
68
68
  if lang not in lang_codes:
@@ -72,14 +72,15 @@ class PolygonPackager(BasePackager):
72
72
  )
73
73
  raise typer.Exit(1)
74
74
 
75
+ def _get_name(self, lang: str) -> polygon_schema.Name:
76
+ statement = self.get_statement_for_language_or_null(lang)
77
+ return polygon_schema.Name(
78
+ language=code_to_langs([lang])[0],
79
+ value=naming.get_title(lang, statement),
80
+ )
81
+
75
82
  def _get_names(self) -> List[polygon_schema.Name]:
76
- names = [
77
- polygon_schema.Name(
78
- language=code_to_langs([lang])[0],
79
- value=self.get_statement_for_language(lang).title,
80
- )
81
- for lang in self.languages()
82
- ]
83
+ names = [self._get_name(lang) for lang in self.languages()]
83
84
 
84
85
  _select_main_language(names, self.main_language)
85
86
 
@@ -8,7 +8,7 @@ import rich.progress
8
8
  import typer
9
9
 
10
10
  from rbx import console
11
- from rbx.box import header, limits_info, package
11
+ from rbx.box import header, limits_info, naming, package
12
12
  from rbx.box.generators import get_all_built_testcases
13
13
  from rbx.box.lang import code_to_langs, is_valid_lang_code
14
14
  from rbx.box.packaging.polygon import polygon_api as api
@@ -353,7 +353,7 @@ def _upload_statement(
353
353
  blocks = _get_statement_blocks(statement)
354
354
  polygon_statement = api.Statement(
355
355
  encoding='utf-8',
356
- name=statement.title,
356
+ name=naming.get_title(statement.language, statement, pkg),
357
357
  legend=blocks.blocks.get('legend') or '',
358
358
  input=blocks.blocks.get('input') or '',
359
359
  output=blocks.blocks.get('output') or '',
@@ -4,6 +4,9 @@ from typing import Optional
4
4
 
5
5
  from pydantic import BaseModel
6
6
 
7
+ from rbx import utils
8
+ from rbx.box import git_utils
9
+
7
10
  _RBX_REMOTE_URI = 'https://github.com/rsalesc/rbx'
8
11
 
9
12
 
@@ -86,8 +89,10 @@ def get_preset_fetch_info(uri: Optional[str]) -> Optional[PresetFetchInfo]:
86
89
  match = compiled.match(s)
87
90
  if match is None:
88
91
  return None
89
- # Treat as a plain local preset name (no implicit tool tag resolution).
90
- return PresetFetchInfo(name=s)
92
+ tool_tag = git_utils.latest_remote_tag(
93
+ _RBX_REMOTE_URI, before=utils.get_version()
94
+ )
95
+ return PresetFetchInfo(name=s, tool_tag=tool_tag)
91
96
 
92
97
  extractors = [
93
98
  get_github_fetch_info,
@@ -508,6 +508,12 @@ class Package(BaseModel):
508
508
  # Name of the problem.
509
509
  name: str = NameField(description='The name of the problem.')
510
510
 
511
+ titles: Dict[str, str] = Field(
512
+ default={},
513
+ description='Titles for the problem in each language. '
514
+ 'Languages should be specified as lowercase ISO 639-1 codes.',
515
+ )
516
+
511
517
  type: TaskType = Field(
512
518
  default=TaskType.BATCH, description='The type of the problem.'
513
519
  )
@@ -11,6 +11,7 @@ import typer
11
11
  from pydantic import BaseModel
12
12
 
13
13
  from rbx import console, utils
14
+ from rbx.box import naming
14
15
  from rbx.box.fields import Primitive
15
16
  from rbx.box.schema import LimitsProfile, Package, Testcase
16
17
  from rbx.box.statements.latex_jinja import (
@@ -130,7 +131,9 @@ class StatementBuilderProblem(StatementBuilderItem):
130
131
  'statement': self.statement,
131
132
  'samples': self.samples,
132
133
  'vars': JinjaDictWrapper.from_dict(self.vars or {}, wrapper_key='vars'),
133
- 'title': self.statement.title or self.package.name,
134
+ 'title': naming.get_title(
135
+ self.statement.language, self.statement, self.package
136
+ ),
134
137
  'limits': self.limits,
135
138
  }
136
139
  if self.short_name is not None:
@@ -132,8 +132,11 @@ class Statement(BaseModel):
132
132
  default='en', description='Language code of this statement (ISO 639-1).'
133
133
  )
134
134
 
135
- title: str = Field(
136
- default='', description='Name of the problem, as it appears in the statement.'
135
+ title: Optional[str] = Field(
136
+ default=None,
137
+ description='Title of the problem, as it appears in the statement. '
138
+ 'Can be left unset if the problem has no title or if title comes '
139
+ 'from the `titles` field of the package.',
137
140
  )
138
141
 
139
142
  path: pathlib.Path = Field(
@@ -63,7 +63,7 @@ async def convert(
63
63
  built_statements = []
64
64
  for statement_type in packager.statement_types():
65
65
  for language in packager.languages():
66
- statement = packager.get_statement_for_language(language)
66
+ statement = packager.get_statement_for_language_or_die(language)
67
67
  statement_path = build_statement(statement, pkg, statement_type)
68
68
  built_statements.append(
69
69
  BuiltStatement(statement, statement_path, statement_type)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # yaml-language-server: $schema=https://rsalesc.github.io/rbx/schemas/Preset.json
3
3
  name: "default"
4
- min_version: "0.16.2"
4
+ min_version: "0.17.0"
5
5
  uri: "rsalesc/rbx/rbx/resources/presets/default"
6
6
  problem: "problem"
7
7
  contest: "contest"
@@ -3,6 +3,8 @@
3
3
  name: "new-problem"
4
4
  timeLimit: 1000 # ms
5
5
  memoryLimit: 256 # MiB
6
+ titles:
7
+ en: "New problem"
6
8
  checker: {path: "wcmp.cpp"} # Download others from testlib with `rbx download checker`
7
9
  validator: {path: "validator.cpp"}
8
10
  testcases:
@@ -31,7 +33,6 @@ solutions:
31
33
  outcome: "INCORRECT"
32
34
  statements:
33
35
  - name: "statement-en"
34
- title: "New Problem"
35
36
  path: "statement/statement.rbx.tex" # Open this file to edit your statement.
36
37
  type: "rbxTeX"
37
38
  language: "en"
@@ -1 +0,0 @@
1
- __version__ = '0.16.2'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes