rbx.cp 0.5.72__tar.gz → 0.5.73__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 (224) hide show
  1. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/PKG-INFO +1 -1
  2. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/pyproject.toml +1 -1
  3. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/cli.py +15 -8
  4. rbx_cp-0.5.73/rbx/box/contest/contest_utils.py +36 -0
  5. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/main.py +24 -0
  6. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/download.py +19 -1
  7. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_explorer.py +1 -1
  8. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/c +42 -21
  9. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cc +42 -21
  10. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cpp +43 -21
  11. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/java +42 -21
  12. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/kt +42 -21
  13. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py2 +42 -21
  14. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py3 +44 -21
  15. rbx_cp-0.5.72/rbx/box/contest/contest_utils.py +0 -11
  16. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/LICENSE +0 -0
  17. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/README.md +0 -0
  18. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/__init__.py +0 -0
  19. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/annotations.py +0 -0
  20. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/autoenum.py +0 -0
  21. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/__init__.py +0 -0
  22. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/builder.py +0 -0
  23. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/cd.py +0 -0
  24. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/checkers.py +0 -0
  25. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/code.py +0 -0
  26. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/compile.py +0 -0
  27. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/conftest.py +0 -0
  28. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/__init__.py +0 -0
  29. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/build_contest_statements.py +0 -0
  30. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/contest_package.py +0 -0
  31. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/schema.py +0 -0
  32. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/contest/statements.py +0 -0
  33. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/creation.py +0 -0
  34. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/deferred.py +0 -0
  35. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/dump_schemas.py +0 -0
  36. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/environment.py +0 -0
  37. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/extensions.py +0 -0
  38. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/formatting.py +0 -0
  39. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/generators.py +0 -0
  40. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/generators_test.py +0 -0
  41. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/git_utils.py +0 -0
  42. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/header.py +0 -0
  43. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/lazy_importing_main.py +0 -0
  44. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/lazy_importing_test.py +0 -0
  45. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/main.py +0 -0
  46. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/naming.py +0 -0
  47. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/package.py +0 -0
  48. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/boca/extension.py +0 -0
  49. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/boca/packager.py +0 -0
  50. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/boca/upload.py +0 -0
  51. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/contest_main.py +0 -0
  52. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/main.py +0 -0
  53. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/moj/packager.py +0 -0
  54. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/packager.py +0 -0
  55. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/packager.py +0 -0
  56. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  57. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/test.py +0 -0
  58. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/upload.py +0 -0
  59. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  60. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/presets/__init__.py +0 -0
  61. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/presets/fetch.py +0 -0
  62. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/presets/lock_schema.py +0 -0
  63. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/presets/schema.py +0 -0
  64. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/remote.py +0 -0
  65. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/retries.py +0 -0
  66. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/sanitizers/warning_stack.py +0 -0
  67. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/schema.py +0 -0
  68. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/setter_config.py +0 -0
  69. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/solutions.py +0 -0
  70. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/solutions_test.py +0 -0
  71. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/state.py +0 -0
  72. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/__init__.py +0 -0
  73. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/build_statements.py +0 -0
  74. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/builders.py +0 -0
  75. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/joiners.py +0 -0
  76. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/latex.py +0 -0
  77. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/latex_jinja.py +0 -0
  78. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/statements/schema.py +0 -0
  79. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/stresses.py +0 -0
  80. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/stressing/__init__.py +0 -0
  81. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/stressing/finder_parser.py +0 -0
  82. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/stressing/generator_parser.py +0 -0
  83. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/tasks.py +0 -0
  84. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/testcase_extractors.py +0 -0
  85. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/testcase_utils.py +0 -0
  86. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/testcases/__init__.py +0 -0
  87. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/testcases/main.py +0 -0
  88. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/__init__.py +0 -0
  89. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/captured_log.py +0 -0
  90. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/css/app.tcss +0 -0
  91. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/main.py +0 -0
  92. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/__init__.py +0 -0
  93. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/build.py +0 -0
  94. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/command.py +0 -0
  95. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/differ.py +0 -0
  96. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/error.py +0 -0
  97. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  98. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/run.py +0 -0
  99. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  100. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/selector.py +0 -0
  101. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/screens/test_explorer.py +0 -0
  102. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/utils/__init__.py +0 -0
  103. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/utils/run_ui.py +0 -0
  104. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/__init__.py +0 -0
  105. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/diff_box.py +0 -0
  106. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/file_log.py +0 -0
  107. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/interaction_box.py +0 -0
  108. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  109. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/test_output_box.py +0 -0
  110. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  111. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/unit.py +0 -0
  112. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/validators.py +0 -0
  113. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/box/validators_test.py +0 -0
  114. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/checker.py +0 -0
  115. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/clone.py +0 -0
  116. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/config.py +0 -0
  117. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/conftest.py +0 -0
  118. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/console.py +0 -0
  119. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/create.py +0 -0
  120. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/edit.py +0 -0
  121. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/__init__.py +0 -0
  122. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/caching.py +0 -0
  123. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/conftest.py +0 -0
  124. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/__init__.py +0 -0
  125. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/cacher.py +0 -0
  126. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/digester.py +0 -0
  127. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/sandbox.py +0 -0
  128. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  129. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/isolate.py +0 -0
  130. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  131. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/timeit.py +0 -0
  132. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/storage.py +0 -0
  133. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/test.py +0 -0
  134. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/judge/testiso.py +0 -0
  135. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/limits.py +0 -0
  136. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/processing_context.py +0 -0
  137. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/steps.py +0 -0
  138. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching.py +0 -0
  139. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching_run_test.py +0 -0
  140. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/grading_utils.py +0 -0
  141. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/hydration.py +0 -0
  142. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/main.py +0 -0
  143. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/metadata.py +0 -0
  144. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/providers/__init__.py +0 -0
  145. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/providers/codeforces.py +0 -0
  146. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/providers/provider.py +0 -0
  147. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/checkers/boilerplate.cpp +0 -0
  148. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/checkers/noop.cpp +0 -0
  149. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/default_config.json +0 -0
  150. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.mac.yml +0 -0
  151. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.yml +0 -0
  152. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/envs/default.rbx.yml +0 -0
  153. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/envs/isolate.rbx.yml +0 -0
  154. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/checker.sh +0 -0
  155. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compare.sh +0 -0
  156. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/c +0 -0
  157. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cc +0 -0
  158. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cpp +0 -0
  159. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/java +0 -0
  160. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/kt +0 -0
  161. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/pas +0 -0
  162. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py2 +0 -0
  163. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py3 +0 -0
  164. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  165. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/bkp +0 -0
  166. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/c +0 -0
  167. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cc +0 -0
  168. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cpp +0 -0
  169. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/java +0 -0
  170. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/kt +0 -0
  171. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py2 +0 -0
  172. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py3 +0 -0
  173. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  174. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  175. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  176. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  177. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  178. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  179. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  180. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  181. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  182. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  183. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  184. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  185. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  186. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  187. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  188. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  189. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  190. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  191. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  192. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  193. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
  194. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
  195. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  196. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/.gitignore +0 -0
  197. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/gen.cpp +0 -0
  198. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  199. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.py +0 -0
  200. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.txt +0 -0
  201. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  202. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
  203. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  204. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
  205. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
  206. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  207. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
  208. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
  209. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
  210. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  211. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  212. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/templates/rbx.h +0 -0
  213. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/resources/templates/template.cpp +0 -0
  214. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/run.py +0 -0
  215. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/schema.py +0 -0
  216. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/submit.py +0 -0
  217. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/submitors/__init__.py +0 -0
  218. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/submitors/codeforces.py +0 -0
  219. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/submitors/submitor.py +0 -0
  220. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/test.py +0 -0
  221. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/testcase.py +0 -0
  222. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/testcase_rendering.py +0 -0
  223. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/testing_utils.py +0 -0
  224. {rbx_cp-0.5.72 → rbx_cp-0.5.73}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.5.72
3
+ Version: 0.5.73
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.72"
3
+ version = "0.5.73"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -60,7 +60,7 @@ app.add_typer(
60
60
  )
61
61
  app.add_typer(
62
62
  download.app,
63
- name='download',
63
+ name='download, down',
64
64
  cls=annotations.AliasGroup,
65
65
  help='Download an asset from supported repositories (sub-command).',
66
66
  rich_help_panel='Management',
@@ -104,12 +104,10 @@ def main(
104
104
  help='Whether to compile and run testlib components with sanitizers enabled. '
105
105
  'If you want to run the solutions with sanitizers enabled, use the "-s" flag in the corresponding run command.',
106
106
  ),
107
- debug_logs: bool = typer.Option(
108
- False,
109
- '--debug-logs',
110
- '--debug',
111
- '-d',
112
- help='Whether to save extra debug logs along with the evaluation results.',
107
+ capture: bool = typer.Option(
108
+ True,
109
+ '--capture',
110
+ help='Whether to save extra logs and outputs from interactive solutions.',
113
111
  ),
114
112
  ):
115
113
  if cd.is_problem_package() and not package.is_cache_valid():
@@ -125,7 +123,7 @@ def main(
125
123
  '[warning]Sanitizers are running just for testlib components.\n'
126
124
  'If you want to run the solutions with sanitizers enabled, use the [item]-s[/item] flag in the corresponding run command.[/warning]'
127
125
  )
128
- state.STATE.debug_logs = debug_logs
126
+ state.STATE.debug_logs = capture
129
127
 
130
128
 
131
129
  @app.command('ui', hidden=True)
@@ -136,6 +134,15 @@ def ui():
136
134
  ui_pkg.start()
137
135
 
138
136
 
137
+ @app.command(
138
+ 'on',
139
+ help='Run a command in the context of a problem (or a set of problems) of a contest.',
140
+ context_settings={'allow_extra_args': True, 'ignore_unknown_options': True},
141
+ )
142
+ def on(ctx: typer.Context, problems: str) -> None:
143
+ contest.on(ctx, problems)
144
+
145
+
139
146
  @app.command('diff', hidden=True)
140
147
  def diff(path1: pathlib.Path, path2: pathlib.Path):
141
148
  from rbx.box.ui import main as ui_pkg
@@ -0,0 +1,36 @@
1
+ from typing import List
2
+
3
+ from rbx.box import environment, package
4
+ from rbx.box.contest import contest_package
5
+ from rbx.box.contest.schema import ContestProblem
6
+
7
+
8
+ def match_problem(problems: str, contest_problem: ContestProblem) -> bool:
9
+ short_name = contest_problem.short_name.lower()
10
+ problems = problems.lower()
11
+ if problems == '*':
12
+ return True
13
+ if '-' in problems:
14
+ start, end = problems.split('-')
15
+ return start <= short_name <= end
16
+ problem_set = set(p.strip().lower() for p in problems.split(','))
17
+ return short_name in problem_set
18
+
19
+
20
+ def get_problems_of_interest(problems: str) -> List[ContestProblem]:
21
+ contest = contest_package.find_contest_package_or_die()
22
+ problems_of_interest = []
23
+
24
+ for p in contest.problems:
25
+ if match_problem(problems, p):
26
+ problems_of_interest.append(p)
27
+ return problems_of_interest
28
+
29
+
30
+ def clear_all_caches():
31
+ pkgs = [package, environment, contest_package]
32
+
33
+ for pkg in pkgs:
34
+ for fn in pkg.__dict__.values():
35
+ if hasattr(fn, 'cache_clear'):
36
+ fn.cache_clear()
@@ -232,3 +232,27 @@ def each(ctx: typer.Context) -> None:
232
232
  console.console.print(
233
233
  '[error]One of the commands above failed. Check the output![/error]'
234
234
  )
235
+
236
+
237
+ @app.command(
238
+ 'on',
239
+ help='Run a command in the problem (or in a set of problems) of a context.',
240
+ context_settings={'allow_extra_args': True, 'ignore_unknown_options': True},
241
+ )
242
+ @within_contest
243
+ def on(ctx: typer.Context, problems: str) -> None:
244
+ command = ' '.join(['rbx'] + ctx.args)
245
+ problems_of_interest = contest_utils.get_problems_of_interest(problems)
246
+
247
+ if not problems_of_interest:
248
+ console.console.print(
249
+ f'[error]No problems found in contest matching [item]{problems}[/item].[/error]'
250
+ )
251
+ raise typer.Exit(1)
252
+
253
+ for p in problems_of_interest:
254
+ console.console.print(
255
+ f'[status]Running [item]{command}[/item] for [item]{p.short_name}[/item]...[/status]'
256
+ )
257
+ subprocess.call(command, cwd=p.get_path(), shell=True)
258
+ console.console.print()
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import typer
6
6
 
7
7
  from rbx import annotations, console
8
- from rbx.box import header, package
8
+ from rbx.box import header, package, remote
9
9
  from rbx.box.schema import CodeItem
10
10
  from rbx.config import get_builtin_checker, get_jngen, get_testlib
11
11
  from rbx.grading import steps
@@ -72,3 +72,21 @@ def checker(name: str):
72
72
  console.console.print(
73
73
  f'[success]Downloaded [item]{name}[/item] into current package.[/success]'
74
74
  )
75
+
76
+
77
+ @app.command('remote, r', help='Download a remote code.')
78
+ @package.within_problem
79
+ def remote_cmd(
80
+ name: str,
81
+ output: Optional[str] = typer.Option(
82
+ None,
83
+ '-o',
84
+ '--output',
85
+ help='Whether to not build outputs for tests and run checker.',
86
+ ),
87
+ ):
88
+ path = remote.expand_file(name)
89
+
90
+ if output is not None:
91
+ pathlib.Path(output).parent.mkdir(parents=True, exist_ok=True)
92
+ shutil.copy(str(path), output)
@@ -46,7 +46,7 @@ class RunExplorerScreen(Screen):
46
46
  if pkg.type == TaskType.COMMUNICATION:
47
47
  tips.display = True
48
48
  tips.write(
49
- 'This is an interactive problem.\nYou can use the [bold blue]rbx -d run[/bold blue] command to capture the interaction between the processes and see them here.'
49
+ 'This is an interactive problem.\nYou can use the [bold blue]rbx --capture run[/bold blue] command to capture the interaction between the processes and see them here.'
50
50
  )
51
51
  yield tips
52
52
 
@@ -132,16 +132,26 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$INTPID
136
- ECINT=\$?
137
-
135
+ ECINT=0
138
136
  ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
137
+
138
+ wait -p EXITID -n \$SFPID \$INTPID
139
+ ECEXIT=\$?
140
+ if [[ \$ECEXIT -ne 0 ]]; then
141
+ kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
142
+ fi
143
+
144
+ EXITFIRST=none
145
+ if [[ \$EXITID -eq \$INTPID ]]; then
143
146
  wait \$SFPID
144
147
  ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
145
155
  fi
146
156
 
147
157
  rm -rf fifo.in fifo.out
@@ -149,27 +159,38 @@ rm -rf fifo.in fifo.out
149
159
  echo "Ran solution as \$@" &>>stderr0
150
160
  echo "interactor exitcode \$ECINT" &>>stderr0
151
161
  echo "solution exitcode \$ECSF" &>>stderr0
162
+ echo "exit first \$EXITFIRST" &>>stderr0
163
+
164
+ finish() {
165
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
166
+ exit \$1
167
+ }
168
+
169
+ # 1. Check for interactor errors.
170
+ if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
171
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
172
+ echo "testlib exitcode \$ECINT" >stdout0
173
+ finish 0
174
+ elif [[ \$ECINT -ne 0 ]]; then
175
+ finish 9
176
+ fi
177
+ fi
152
178
 
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
159
182
  fi
160
183
 
161
- ret=0
162
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
184
+ # 3. Check for interactor without looking at solution output.
185
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
163
186
  echo "testlib exitcode \$ECINT" >stdout0
164
- ret=0
165
- elif [[ \$ECSF -ne 0 ]]; then
166
- ret=\$ECSF
187
+ finish 0
167
188
  elif [[ \$ECINT -ne 0 ]]; then
168
- ret=9
189
+ finish 9
169
190
  fi
170
191
 
171
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
172
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
173
194
  EOF
174
195
 
175
196
  chmod 755 runit.sh
@@ -132,16 +132,26 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$INTPID
136
- ECINT=\$?
137
-
135
+ ECINT=0
138
136
  ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
137
+
138
+ wait -p EXITID -n \$SFPID \$INTPID
139
+ ECEXIT=\$?
140
+ if [[ \$ECEXIT -ne 0 ]]; then
141
+ kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
142
+ fi
143
+
144
+ EXITFIRST=none
145
+ if [[ \$EXITID -eq \$INTPID ]]; then
143
146
  wait \$SFPID
144
147
  ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
145
155
  fi
146
156
 
147
157
  rm -rf fifo.in fifo.out
@@ -149,27 +159,38 @@ rm -rf fifo.in fifo.out
149
159
  echo "Ran solution as \$@" &>>stderr0
150
160
  echo "interactor exitcode \$ECINT" &>>stderr0
151
161
  echo "solution exitcode \$ECSF" &>>stderr0
162
+ echo "exit first \$EXITFIRST" &>>stderr0
163
+
164
+ finish() {
165
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
166
+ exit \$1
167
+ }
168
+
169
+ # 1. Check for interactor errors.
170
+ if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
171
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
172
+ echo "testlib exitcode \$ECINT" >stdout0
173
+ finish 0
174
+ elif [[ \$ECINT -ne 0 ]]; then
175
+ finish 9
176
+ fi
177
+ fi
152
178
 
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
159
182
  fi
160
183
 
161
- ret=0
162
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
184
+ # 3. Check for interactor without looking at solution output.
185
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
163
186
  echo "testlib exitcode \$ECINT" >stdout0
164
- ret=0
165
- elif [[ \$ECSF -ne 0 ]]; then
166
- ret=\$ECSF
187
+ finish 0
167
188
  elif [[ \$ECINT -ne 0 ]]; then
168
- ret=9
189
+ finish 9
169
190
  fi
170
191
 
171
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
172
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
173
194
  EOF
174
195
 
175
196
  chmod 755 runit.sh
@@ -132,16 +132,26 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$INTPID
136
- ECINT=\$?
137
-
135
+ ECINT=0
138
136
  ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
137
+
138
+ wait -p EXITID -n \$SFPID \$INTPID
139
+ ECEXIT=\$?
140
+ if [[ \$ECEXIT -ne 0 ]]; then
141
+ kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
142
+ fi
143
+
144
+ EXITFIRST=none
145
+ if [[ \$EXITID -eq \$INTPID ]]; then
143
146
  wait \$SFPID
144
147
  ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
145
155
  fi
146
156
 
147
157
  rm -rf fifo.in fifo.out
@@ -149,26 +159,38 @@ rm -rf fifo.in fifo.out
149
159
  echo "Ran solution as \$@" &>>stderr0
150
160
  echo "interactor exitcode \$ECINT" &>>stderr0
151
161
  echo "solution exitcode \$ECSF" &>>stderr0
162
+ echo "exit first \$EXITFIRST" &>>stderr0
163
+
164
+ finish() {
165
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
166
+ exit \$1
167
+ }
168
+
169
+ # 1. Check for interactor errors.
170
+ if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
171
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
172
+ echo "testlib exitcode \$ECINT" >stdout0
173
+ finish 0
174
+ elif [[ \$ECINT -ne 0 ]]; then
175
+ finish 9
176
+ fi
177
+ fi
152
178
 
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
159
182
  fi
160
- ret=0
161
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
183
+
184
+ # 3. Check for interactor without looking at solution output.
185
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
162
186
  echo "testlib exitcode \$ECINT" >stdout0
163
- ret=0
164
- elif [[ \$ECSF -ne 0 ]]; then
165
- ret=\$ECSF
187
+ finish 0
166
188
  elif [[ \$ECINT -ne 0 ]]; then
167
- ret=9
189
+ finish 9
168
190
  fi
169
191
 
170
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
171
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
172
194
  EOF
173
195
 
174
196
  chmod 755 runit.sh
@@ -145,16 +145,26 @@ SFPID=\$!
145
145
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
146
146
  INTPID=\$!
147
147
 
148
- wait \$INTPID
149
- ECINT=\$?
150
-
148
+ ECINT=0
151
149
  ECSF=0
152
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
153
- # kill the solution
154
- kill -9 \$SFPID
155
- else
150
+
151
+ wait -p EXITID -n \$SFPID \$INTPID
152
+ ECEXIT=\$?
153
+ if [[ \$ECEXIT -ne 0 ]]; then
154
+ kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
155
+ fi
156
+
157
+ EXITFIRST=none
158
+ if [[ \$EXITID -eq \$INTPID ]]; then
156
159
  wait \$SFPID
157
160
  ECSF=\$?
161
+ ECINT=\$ECEXIT
162
+ EXITFIRST=interactor
163
+ else
164
+ wait \$INTPID
165
+ ECINT=\$?
166
+ ECSF=\$ECEXIT
167
+ EXITFIRST=solution
158
168
  fi
159
169
 
160
170
  rm -rf fifo.in fifo.out
@@ -162,27 +172,38 @@ rm -rf fifo.in fifo.out
162
172
  echo "Ran solution as \$@" &>>stderr0
163
173
  echo "interactor exitcode \$ECINT" &>>stderr0
164
174
  echo "solution exitcode \$ECSF" &>>stderr0
175
+ echo "exit first \$EXITFIRST" &>>stderr0
165
176
 
166
- RTE=0
167
- if [[ \$ECSF -eq -13 ]]; then
168
- RTE=0
169
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
170
- echo "Found EOF RTE" &>>stderr0
171
- RTE=1
177
+ finish() {
178
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
179
+ exit \$1
180
+ }
181
+
182
+ # 1. Check for interactor errors.
183
+ if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
184
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
185
+ echo "testlib exitcode \$ECINT" >stdout0
186
+ finish 0
187
+ elif [[ \$ECINT -ne 0 ]]; then
188
+ finish 9
189
+ fi
172
190
  fi
173
191
 
174
- ret=0
175
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
192
+ # 2. Check for solution errors.
193
+ if [[ \$ECSF -ne 0 ]]; then
194
+ finish \$ECSF
195
+ fi
196
+
197
+ # 3. Check for interactor without looking at solution output.
198
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
176
199
  echo "testlib exitcode \$ECINT" >stdout0
177
- ret=0
178
- elif [[ \$ECSF -ne 0 ]]; then
179
- ret=\$ECSF
200
+ finish 0
180
201
  elif [[ \$ECINT -ne 0 ]]; then
181
- ret=9
202
+ finish 9
182
203
  fi
183
204
 
184
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
185
- exit \$ret
205
+ # 4. Finish with zero and later check output.
206
+ finish 0
186
207
  EOF
187
208
 
188
209
  chmod 755 runit.sh
@@ -136,16 +136,26 @@ SFPID=\$!
136
136
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
137
137
  INTPID=\$!
138
138
 
139
- wait \$INTPID
140
- ECINT=\$?
141
-
139
+ ECINT=0
142
140
  ECSF=0
143
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
144
- # kill the solution
145
- kill -9 \$SFPID
146
- else
141
+
142
+ wait -p EXITID -n \$SFPID \$INTPID
143
+ ECEXIT=\$?
144
+ if [[ \$ECEXIT -ne 0 ]]; then
145
+ kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
146
+ fi
147
+
148
+ EXITFIRST=none
149
+ if [[ \$EXITID -eq \$INTPID ]]; then
147
150
  wait \$SFPID
148
151
  ECSF=\$?
152
+ ECINT=\$ECEXIT
153
+ EXITFIRST=interactor
154
+ else
155
+ wait \$INTPID
156
+ ECINT=\$?
157
+ ECSF=\$ECEXIT
158
+ EXITFIRST=solution
149
159
  fi
150
160
 
151
161
  rm -rf fifo.in fifo.out
@@ -153,27 +163,38 @@ rm -rf fifo.in fifo.out
153
163
  echo "Ran solution as \$@" &>>stderr0
154
164
  echo "interactor exitcode \$ECINT" &>>stderr0
155
165
  echo "solution exitcode \$ECSF" &>>stderr0
166
+ echo "exit first \$EXITFIRST" &>>stderr0
156
167
 
157
- RTE=0
158
- if [[ \$ECSF -eq -13 ]]; then
159
- RTE=0
160
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
161
- echo "Found EOF RTE" &>>stderr0
162
- RTE=1
168
+ finish() {
169
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
170
+ exit \$1
171
+ }
172
+
173
+ # 1. Check for interactor errors.
174
+ if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
175
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
176
+ echo "testlib exitcode \$ECINT" >stdout0
177
+ finish 0
178
+ elif [[ \$ECINT -ne 0 ]]; then
179
+ finish 9
180
+ fi
163
181
  fi
164
182
 
165
- ret=0
166
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
183
+ # 2. Check for solution errors.
184
+ if [[ \$ECSF -ne 0 ]]; then
185
+ finish \$ECSF
186
+ fi
187
+
188
+ # 3. Check for interactor without looking at solution output.
189
+ if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
167
190
  echo "testlib exitcode \$ECINT" >stdout0
168
- ret=0
169
- elif [[ \$ECSF -ne 0 ]]; then
170
- ret=\$ECSF
191
+ finish 0
171
192
  elif [[ \$ECINT -ne 0 ]]; then
172
- ret=9
193
+ finish 9
173
194
  fi
174
195
 
175
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
176
- exit \$ret
196
+ # 4. Finish with zero and later check output.
197
+ finish 0
177
198
  EOF
178
199
 
179
200
  chmod 755 runit.sh