rbx.cp 0.17.4__tar.gz → 0.17.6__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.17.4 → rbx_cp-0.17.6}/PKG-INFO +1 -1
  2. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/pyproject.toml +1 -1
  3. rbx_cp-0.17.6/rbx/__version__.py +1 -0
  4. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/sanitizers/warning_stack.py +3 -3
  5. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/scraper.py +2 -1
  6. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/program.py +23 -3
  7. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/sandboxes/stupid_sandbox.py +3 -0
  8. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/preset.rbx.yml +1 -1
  9. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/utils.py +48 -16
  10. rbx_cp-0.17.4/rbx/__version__.py +0 -1
  11. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/LICENSE +0 -0
  12. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/README.md +0 -0
  13. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/__init__.py +0 -0
  14. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/annotations.py +0 -0
  15. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/autoenum.py +0 -0
  16. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/__init__.py +0 -0
  17. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/builder.py +0 -0
  18. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/cd.py +0 -0
  19. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/checkers.py +0 -0
  20. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/cli.py +0 -0
  21. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/code.py +0 -0
  22. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/compile.py +0 -0
  23. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/__init__.py +0 -0
  24. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/build_contest_statements.py +0 -0
  25. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/contest_package.py +0 -0
  26. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/contest_utils.py +0 -0
  27. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/main.py +0 -0
  28. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/schema.py +0 -0
  29. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/contest/statements.py +0 -0
  30. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/creation.py +0 -0
  31. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/deferred.py +0 -0
  32. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/download.py +0 -0
  33. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/dump_schemas.py +0 -0
  34. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/environment.py +0 -0
  35. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/extensions.py +0 -0
  36. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/fields.py +0 -0
  37. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/formatting.py +0 -0
  38. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/generators.py +0 -0
  39. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/git_utils.py +0 -0
  40. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/global_package.py +0 -0
  41. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/header.py +0 -0
  42. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/lang.py +0 -0
  43. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/lazy_importing_main.py +0 -0
  44. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/limits_info.py +0 -0
  45. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/linting.py +0 -0
  46. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/main.py +0 -0
  47. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/naming.py +0 -0
  48. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/package.py +0 -0
  49. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/__init__.py +0 -0
  50. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/boca/__init__.py +0 -0
  51. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/boca/boca_language_utils.py +0 -0
  52. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/boca/boca_outcome_utils.py +0 -0
  53. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/boca/extension.py +0 -0
  54. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/boca/packager.py +0 -0
  55. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/contest_main.py +0 -0
  56. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/importer.py +0 -0
  57. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/main.py +0 -0
  58. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/moj/packager.py +0 -0
  59. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/packager.py +0 -0
  60. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/pkg/packager.py +0 -0
  61. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/importer.py +0 -0
  62. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/packager.py +0 -0
  63. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  64. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/test.py +0 -0
  65. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/upload.py +0 -0
  66. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  67. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/presets/__init__.py +0 -0
  68. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/presets/fetch.py +0 -0
  69. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/presets/lock_schema.py +0 -0
  70. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/presets/schema.py +0 -0
  71. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/remote.py +0 -0
  72. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/retries.py +0 -0
  73. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/sanitizers/issue_stack.py +0 -0
  74. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/schema.py +0 -0
  75. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/setter_config.py +0 -0
  76. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/solutions.py +0 -0
  77. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/state.py +0 -0
  78. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/__init__.py +0 -0
  79. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/build_statements.py +0 -0
  80. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/builders.py +0 -0
  81. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/expander.py +0 -0
  82. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/joiners.py +0 -0
  83. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/latex.py +0 -0
  84. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/latex_jinja.py +0 -0
  85. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/statements/schema.py +0 -0
  86. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/stats.py +0 -0
  87. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/stresses.py +0 -0
  88. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/stressing/__init__.py +0 -0
  89. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/stressing/finder_parser.py +0 -0
  90. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/stressing/generator_parser.py +0 -0
  91. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tasks.py +0 -0
  92. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testcase_extractors.py +0 -0
  93. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testcase_utils.py +0 -0
  94. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testcases/__init__.py +0 -0
  95. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testcases/main.py +0 -0
  96. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testing/__init__.py +0 -0
  97. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testing/testing_package.py +0 -0
  98. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testing/testing_preset.py +0 -0
  99. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/testing/testing_shared.py +0 -0
  100. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/timing.py +0 -0
  101. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/__init__.py +0 -0
  102. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/__init__.py +0 -0
  103. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/debug_utils.py +0 -0
  104. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/main.py +0 -0
  105. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/manual_scrape.py +0 -0
  106. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/boca/scrape.py +0 -0
  107. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/converter.py +0 -0
  108. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/tooling/main.py +0 -0
  109. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/__init__.py +0 -0
  110. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/captured_log.py +0 -0
  111. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/css/app.tcss +0 -0
  112. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/main.py +0 -0
  113. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/__init__.py +0 -0
  114. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/build.py +0 -0
  115. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/command.py +0 -0
  116. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/differ.py +0 -0
  117. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/error.py +0 -0
  118. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  119. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/run.py +0 -0
  120. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/run_explorer.py +0 -0
  121. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  122. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/selector.py +0 -0
  123. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/screens/test_explorer.py +0 -0
  124. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/utils/__init__.py +0 -0
  125. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/utils/run_ui.py +0 -0
  126. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/__init__.py +0 -0
  127. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/diff_box.py +0 -0
  128. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/file_log.py +0 -0
  129. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/interaction_box.py +0 -0
  130. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  131. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/test_output_box.py +0 -0
  132. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  133. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/unit.py +0 -0
  134. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/box/validators.py +0 -0
  135. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/config.py +0 -0
  136. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/console.py +0 -0
  137. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/__init__.py +0 -0
  138. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/caching.py +0 -0
  139. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/debug_context.py +0 -0
  140. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/grading_context.py +0 -0
  141. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/__init__.py +0 -0
  142. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/cacher.py +0 -0
  143. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/digester.py +0 -0
  144. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/sandbox.py +0 -0
  145. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  146. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/sandboxes/tee.py +0 -0
  147. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/judge/storage.py +0 -0
  148. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/limits.py +0 -0
  149. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/profiling.py +0 -0
  150. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/steps.py +0 -0
  151. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/grading/steps_with_caching.py +0 -0
  152. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/checkers/boilerplate.cpp +0 -0
  153. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/checkers/noop.cpp +0 -0
  154. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/default_config.json +0 -0
  155. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/default_setter_config.mac.yml +0 -0
  156. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/default_setter_config.yml +0 -0
  157. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/envs/default.rbx.yml +0 -0
  158. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/checker.sh +0 -0
  159. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compare.sh +0 -0
  160. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/c +0 -0
  161. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/cc +0 -0
  162. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/cpp +0 -0
  163. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/java +0 -0
  164. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/kt +0 -0
  165. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/py2 +0 -0
  166. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/compile/py3 +0 -0
  167. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/c +0 -0
  168. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/cc +0 -0
  169. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/cpp +0 -0
  170. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/java +0 -0
  171. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/kt +0 -0
  172. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/py2 +0 -0
  173. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactive/py3 +0 -0
  174. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  175. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/interactor_run.sh +0 -0
  176. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/bkp +0 -0
  177. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/c +0 -0
  178. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/cc +0 -0
  179. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/cpp +0 -0
  180. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/java +0 -0
  181. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/kt +0 -0
  182. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/py2 +0 -0
  183. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/run/py3 +0 -0
  184. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/safeexec.c +0 -0
  185. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/boca/safeexec_compile.sh +0 -0
  186. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  187. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  188. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  189. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  190. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  191. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  192. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  193. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  194. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  195. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  196. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  197. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  198. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  199. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  200. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  201. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  202. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  203. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  204. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/.gitignore +0 -0
  205. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  206. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  207. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/statement/info.rbx.tex +0 -0
  208. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/statement/instructions.tex +0 -0
  209. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/contest/statement/logo.png +0 -0
  210. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/env.rbx.yml +0 -0
  211. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/.gitignore +0 -0
  212. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/gens/gen.cpp +0 -0
  213. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/manual_tests/samples/000.in +0 -0
  214. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/manual_tests/samples/001.in +0 -0
  215. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  216. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/rbx.h +0 -0
  217. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  218. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/sols/wa-overflow.cpp +0 -0
  219. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  220. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/testlib.h +0 -0
  221. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/testplan/random.py +0 -0
  222. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/testplan/random.txt +0 -0
  223. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  224. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  225. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/shared/contest_template.rbx.tex +0 -0
  226. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/shared/icpc.sty +0 -0
  227. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/presets/default/shared/problem_template.rbx.tex +0 -0
  228. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/templates/rbx.h +0 -0
  229. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/resources/templates/template.cpp +0 -0
  230. {rbx_cp-0.17.4 → rbx_cp-0.17.6}/rbx/testing_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.17.4
3
+ Version: 0.17.6
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.17.4"
3
+ version = "0.17.6"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -0,0 +1 @@
1
+ __version__ = '0.17.6'
@@ -29,9 +29,9 @@ class WarningStack:
29
29
  f = reference.get_file(cacher)
30
30
  if f is None:
31
31
  return
32
- with dest_path.open('wb') as fout:
33
- shutil.copyfileobj(f, fout)
34
- f.close()
32
+ with f:
33
+ with dest_path.open('wb') as fout:
34
+ shutil.copyfileobj(f, fout)
35
35
  self.sanitizer_warnings[code.path] = dest_path
36
36
 
37
37
  def clear(self):
@@ -359,7 +359,8 @@ class BocaScraper:
359
359
  form['problemnumber'] = f'{problem_index + 1}'
360
360
  form['problemname'] = problem_shortname
361
361
  form['confirmation'] = 'confirm'
362
- form['autojudge_new_sel'] = ['all']
362
+ if form.find_control('autojudge_new_sel'):
363
+ form['autojudge_new_sel'] = ['all']
363
364
  form['Submit3'] = 'Send'
364
365
 
365
366
  with file.open('rb') as f:
@@ -20,8 +20,12 @@ FileLike = Union[PathOrStr, IO[bytes], int]
20
20
  def _maybe_close_files(files):
21
21
  for fobj in files:
22
22
  if isinstance(fobj, int):
23
- continue
24
- fobj.close()
23
+ try:
24
+ os.close(fobj)
25
+ except OSError:
26
+ pass
27
+ else:
28
+ fobj.close()
25
29
 
26
30
 
27
31
  def _is_pathlike(obj: Any) -> bool:
@@ -250,6 +254,20 @@ class Program:
250
254
  threading.Thread(target=self._handle_wall, daemon=True).start()
251
255
  threading.Thread(target=self._handle_alarm, daemon=True).start()
252
256
 
257
+ def close_pipes(self):
258
+ if self.popen is None:
259
+ return
260
+ if self.params.io.input == subprocess.PIPE and self.pipes.input is not None:
261
+ self.pipes.input.close()
262
+ if self.params.io.output == subprocess.PIPE and self.pipes.output is not None:
263
+ self.pipes.output.close()
264
+ if self.params.io.stderr == subprocess.PIPE and self.pipes.stderr is not None:
265
+ self.pipes.stderr.close()
266
+
267
+ def close(self):
268
+ self.close_pipes()
269
+ _maybe_close_files(self._files)
270
+
253
271
  def process_exit(self, exitstatus, ru) -> ProgramResult:
254
272
  _maybe_close_files(self._files)
255
273
 
@@ -307,4 +325,6 @@ class Program:
307
325
  def wait(self):
308
326
  assert self.popen is not None
309
327
  _, exitstatus, ru = os.wait4(self.pid, 0)
310
- return self.process_exit(exitstatus, ru)
328
+ res = self.process_exit(exitstatus, ru)
329
+ self.close_pipes()
330
+ return res
@@ -335,6 +335,9 @@ class StupidSandbox(SandboxBase):
335
335
  else:
336
336
  raise RuntimeError(f'Unknown pid: {pid}')
337
337
 
338
+ for p in (interactor, program, solution_tee, interactor_tee):
339
+ p.close()
340
+
338
341
  return typing.cast(Tuple[SandboxLog, SandboxLog], tuple(results))
339
342
 
340
343
  def cleanup(self, delete=False):
@@ -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.17.4"
4
+ min_version: "0.17.6"
5
5
  uri: "rsalesc/rbx/rbx/resources/presets/default"
6
6
  problem: "problem"
7
7
  contest: "contest"
@@ -1,13 +1,11 @@
1
1
  import contextlib
2
2
  import enum
3
- import fcntl
4
3
  import functools
5
4
  import json
6
5
  import os
7
6
  import os.path
8
7
  import pathlib
9
8
  import re
10
- import resource
11
9
  import shutil
12
10
  import subprocess
13
11
  import sys
@@ -75,19 +73,41 @@ def check_version_compatibility(required: str) -> SemVerCompatibility:
75
73
  return check_version_compatibility_between(installed, required)
76
74
 
77
75
 
78
- def print_open_fd_count() -> int:
76
+ def print_open_fd_count(id: Optional[str] = None) -> int:
79
77
  import psutil
80
78
 
81
79
  try:
82
- current_process = psutil.Process()
83
- open_fds = len(current_process.open_files())
84
- print(f'Number of opened file descriptors: {open_fds}')
80
+ open_fds = get_open_fds()
81
+ print(f'Number of opened file descriptors for {id or "..."}: {open_fds}')
85
82
  except psutil.AccessDenied:
86
83
  print('Access denied. Run with appropriate permissions (e.g., sudo) if needed.')
87
84
  except Exception as e:
88
85
  print(f'An error occurred: {e}')
89
86
 
90
87
 
88
+ class FdLeakDetector:
89
+ def __init__(self, id: Optional[str] = None, diff: bool = False):
90
+ self.open_fds = 0
91
+ self.id = id
92
+ self.diff = diff
93
+
94
+ def __enter__(self):
95
+ self.open_fds = get_open_fds()
96
+ return self
97
+
98
+ def __exit__(self, *args, **kwargs):
99
+ open_fds = get_open_fds()
100
+ if open_fds > self.open_fds:
101
+ print(
102
+ f'File descriptor leak detected for {self.id or "..."}: {open_fds - self.open_fds} new file descriptors opened'
103
+ )
104
+ elif self.diff and open_fds < self.open_fds:
105
+ print(
106
+ f'File descriptor diff detected for {self.id or "..."}: {self.open_fds - open_fds} file descriptors closed'
107
+ )
108
+ self.open_fds = open_fds
109
+
110
+
91
111
  def create_and_write(path: pathlib.Path, *args, **kwargs):
92
112
  path.parent.mkdir(parents=True, exist_ok=True)
93
113
  path.write_text(*args, **kwargs)
@@ -256,16 +276,28 @@ def confirm_on_status(status: Optional[rich.status.Status], *args, **kwargs) ->
256
276
  return res
257
277
 
258
278
 
259
- def get_open_fds():
260
- fds = []
261
- soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
262
- for fd in range(0, soft):
263
- try:
264
- fcntl.fcntl(fd, fcntl.F_GETFD)
265
- except IOError:
266
- continue
267
- fds.append(fd)
268
- return fds
279
+ def get_open_fds() -> int:
280
+ import psutil
281
+
282
+ try:
283
+ current_process = psutil.Process()
284
+ open_fds = current_process.num_fds()
285
+ return open_fds
286
+ except psutil.AccessDenied:
287
+ return 0
288
+ except Exception as e:
289
+ print(f'An error occurred: {e}')
290
+ return 0
291
+
292
+ # fds = []
293
+ # soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
294
+ # for fd in range(0, soft):
295
+ # try:
296
+ # fcntl.fcntl(fd, fcntl.F_GETFD)
297
+ # except IOError:
298
+ # continue
299
+ # fds.append(fd)
300
+ # return fds
269
301
 
270
302
 
271
303
  def command_exists(command):
@@ -1 +0,0 @@
1
- __version__ = '0.17.4'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes