rbx.cp 0.5.71__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.71 → rbx_cp-0.5.73}/PKG-INFO +1 -1
  2. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/pyproject.toml +1 -1
  3. {rbx_cp-0.5.71 → 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.71 → rbx_cp-0.5.73}/rbx/box/contest/main.py +24 -0
  6. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/download.py +19 -1
  7. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_explorer.py +1 -1
  8. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/checker.sh +1 -1
  9. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/c +47 -20
  10. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cc +47 -20
  11. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cpp +48 -20
  12. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/java +47 -20
  13. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/kt +47 -20
  14. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py2 +47 -20
  15. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py3 +49 -20
  16. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/c +2 -2
  17. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cc +2 -2
  18. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cpp +2 -2
  19. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/java +2 -2
  20. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/kt +2 -2
  21. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py2 +2 -2
  22. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py3 +2 -2
  23. rbx_cp-0.5.71/rbx/box/contest/contest_utils.py +0 -11
  24. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/LICENSE +0 -0
  25. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/README.md +0 -0
  26. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/__init__.py +0 -0
  27. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/annotations.py +0 -0
  28. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/autoenum.py +0 -0
  29. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/__init__.py +0 -0
  30. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/builder.py +0 -0
  31. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/cd.py +0 -0
  32. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/checkers.py +0 -0
  33. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/code.py +0 -0
  34. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/compile.py +0 -0
  35. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/conftest.py +0 -0
  36. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/__init__.py +0 -0
  37. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/build_contest_statements.py +0 -0
  38. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/contest_package.py +0 -0
  39. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/schema.py +0 -0
  40. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/statements.py +0 -0
  41. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/creation.py +0 -0
  42. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/deferred.py +0 -0
  43. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/dump_schemas.py +0 -0
  44. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/environment.py +0 -0
  45. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/extensions.py +0 -0
  46. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/formatting.py +0 -0
  47. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/generators.py +0 -0
  48. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/generators_test.py +0 -0
  49. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/git_utils.py +0 -0
  50. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/header.py +0 -0
  51. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/lazy_importing_main.py +0 -0
  52. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/lazy_importing_test.py +0 -0
  53. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/main.py +0 -0
  54. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/naming.py +0 -0
  55. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/package.py +0 -0
  56. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/extension.py +0 -0
  57. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/packager.py +0 -0
  58. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/upload.py +0 -0
  59. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/contest_main.py +0 -0
  60. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/main.py +0 -0
  61. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/moj/packager.py +0 -0
  62. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/packager.py +0 -0
  63. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/packager.py +0 -0
  64. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/polygon_api.py +0 -0
  65. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/test.py +0 -0
  66. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/upload.py +0 -0
  67. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  68. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/__init__.py +0 -0
  69. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/fetch.py +0 -0
  70. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/lock_schema.py +0 -0
  71. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/schema.py +0 -0
  72. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/remote.py +0 -0
  73. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/retries.py +0 -0
  74. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/sanitizers/warning_stack.py +0 -0
  75. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/schema.py +0 -0
  76. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/setter_config.py +0 -0
  77. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/solutions.py +0 -0
  78. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/solutions_test.py +0 -0
  79. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/state.py +0 -0
  80. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/__init__.py +0 -0
  81. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/build_statements.py +0 -0
  82. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/builders.py +0 -0
  83. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/joiners.py +0 -0
  84. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/latex.py +0 -0
  85. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/latex_jinja.py +0 -0
  86. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/schema.py +0 -0
  87. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stresses.py +0 -0
  88. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/__init__.py +0 -0
  89. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/finder_parser.py +0 -0
  90. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/generator_parser.py +0 -0
  91. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/tasks.py +0 -0
  92. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcase_extractors.py +0 -0
  93. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcase_utils.py +0 -0
  94. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcases/__init__.py +0 -0
  95. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcases/main.py +0 -0
  96. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/__init__.py +0 -0
  97. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/captured_log.py +0 -0
  98. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/css/app.tcss +0 -0
  99. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/main.py +0 -0
  100. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/__init__.py +0 -0
  101. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/build.py +0 -0
  102. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/command.py +0 -0
  103. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/differ.py +0 -0
  104. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/error.py +0 -0
  105. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/rich_log_modal.py +0 -0
  106. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run.py +0 -0
  107. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_test_explorer.py +0 -0
  108. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/selector.py +0 -0
  109. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/test_explorer.py +0 -0
  110. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/utils/__init__.py +0 -0
  111. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/utils/run_ui.py +0 -0
  112. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/__init__.py +0 -0
  113. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/diff_box.py +0 -0
  114. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/file_log.py +0 -0
  115. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/interaction_box.py +0 -0
  116. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/rich_log_box.py +0 -0
  117. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/test_output_box.py +0 -0
  118. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
  119. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/unit.py +0 -0
  120. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/validators.py +0 -0
  121. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/validators_test.py +0 -0
  122. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/checker.py +0 -0
  123. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/clone.py +0 -0
  124. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/config.py +0 -0
  125. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/conftest.py +0 -0
  126. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/console.py +0 -0
  127. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/create.py +0 -0
  128. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/edit.py +0 -0
  129. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/__init__.py +0 -0
  130. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/caching.py +0 -0
  131. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/conftest.py +0 -0
  132. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/__init__.py +0 -0
  133. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/cacher.py +0 -0
  134. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/digester.py +0 -0
  135. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandbox.py +0 -0
  136. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  137. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/isolate.py +0 -0
  138. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  139. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/timeit.py +0 -0
  140. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/storage.py +0 -0
  141. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/test.py +0 -0
  142. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/testiso.py +0 -0
  143. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/limits.py +0 -0
  144. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/processing_context.py +0 -0
  145. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps.py +0 -0
  146. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching.py +0 -0
  147. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching_run_test.py +0 -0
  148. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading_utils.py +0 -0
  149. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/hydration.py +0 -0
  150. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/main.py +0 -0
  151. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/metadata.py +0 -0
  152. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/__init__.py +0 -0
  153. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/codeforces.py +0 -0
  154. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/provider.py +0 -0
  155. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/checkers/boilerplate.cpp +0 -0
  156. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/checkers/noop.cpp +0 -0
  157. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_config.json +0 -0
  158. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.mac.yml +0 -0
  159. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.yml +0 -0
  160. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/envs/default.rbx.yml +0 -0
  161. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/envs/isolate.rbx.yml +0 -0
  162. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compare.sh +0 -0
  163. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/c +0 -0
  164. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cc +0 -0
  165. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cpp +0 -0
  166. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/java +0 -0
  167. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/kt +0 -0
  168. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/pas +0 -0
  169. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py2 +0 -0
  170. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py3 +0 -0
  171. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
  172. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/bkp +0 -0
  173. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
  174. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
  175. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
  176. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
  177. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
  178. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
  179. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
  180. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
  181. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
  182. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
  183. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
  184. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
  185. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
  186. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
  187. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
  188. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
  189. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
  190. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
  191. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  192. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  193. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
  194. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
  195. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  196. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/.gitignore +0 -0
  197. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/gen.cpp +0 -0
  198. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  199. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.py +0 -0
  200. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.txt +0 -0
  201. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  202. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
  203. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  204. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
  205. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
  206. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  207. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
  208. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
  209. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
  210. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  211. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  212. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/templates/rbx.h +0 -0
  213. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/templates/template.cpp +0 -0
  214. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/run.py +0 -0
  215. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/schema.py +0 -0
  216. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submit.py +0 -0
  217. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/__init__.py +0 -0
  218. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/codeforces.py +0 -0
  219. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/submitor.py +0 -0
  220. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/test.py +0 -0
  221. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testcase.py +0 -0
  222. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testcase_rendering.py +0 -0
  223. {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testing_utils.py +0 -0
  224. {rbx_cp-0.5.71 → 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.71
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.71 "
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
 
@@ -26,7 +26,7 @@ printf "%s" "${TestlibContent}" >testlib.h
26
26
  printf "%s" "${RbxHeaderContent}" >rbx.h
27
27
  printf "%s" "${CheckerContent}" >$CHECKER_PATH
28
28
 
29
- checker_hash=($(md5sum $CHECKER_PATH))
29
+ checker_hash=($(cat $CHECKER_PATH rbx.h testlib.h | md5sum))
30
30
  checker_cache="/tmp/boca-chk-${checker_hash}"
31
31
 
32
32
  echo "Polygon checker hash: $checker_hash"
@@ -81,10 +81,10 @@ fi
81
81
 
82
82
  time=$3
83
83
  if [ "$time" -gt "0" ]; then
84
- let "ttime = $time + 30"
84
+ let "ttime = $time * 4"
85
85
  else
86
86
  time=1
87
- ttime=30
87
+ ttime=4
88
88
  fi
89
89
 
90
90
  nruns=1
@@ -132,38 +132,65 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$SFPID
136
- ECSF=\$?
135
+ ECINT=0
136
+ ECSF=0
137
137
 
138
- wait \$INTPID
139
- ECINT=\$?
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
146
+ wait \$SFPID
147
+ ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
155
+ fi
140
156
 
141
157
  rm -rf fifo.in fifo.out
142
158
 
143
159
  echo "Ran solution as \$@" &>>stderr0
144
160
  echo "interactor exitcode \$ECINT" &>>stderr0
145
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
146
178
 
147
- RTE=0
148
- if [[ \$ECSF -eq -13 ]]; then
149
- RTE=0
150
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
151
- echo "Found EOF RTE" &>>stderr0
152
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
153
182
  fi
154
183
 
155
- ret=0
156
- 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
157
186
  echo "testlib exitcode \$ECINT" >stdout0
158
- ret=0
159
- elif [[ \$ECSF -ne 0 ]]; then
160
- ret=\$ECSF
187
+ finish 0
161
188
  elif [[ \$ECINT -ne 0 ]]; then
162
- ret=9
189
+ finish 9
163
190
  fi
164
191
 
165
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
166
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
167
194
  EOF
168
195
 
169
196
  chmod 755 runit.sh
@@ -81,10 +81,10 @@ fi
81
81
 
82
82
  time=$3
83
83
  if [ "$time" -gt "0" ]; then
84
- let "ttime = $time + 30"
84
+ let "ttime = $time * 4"
85
85
  else
86
86
  time=1
87
- ttime=30
87
+ ttime=4
88
88
  fi
89
89
 
90
90
  nruns=1
@@ -132,38 +132,65 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$SFPID
136
- ECSF=\$?
135
+ ECINT=0
136
+ ECSF=0
137
137
 
138
- wait \$INTPID
139
- ECINT=\$?
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
146
+ wait \$SFPID
147
+ ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
155
+ fi
140
156
 
141
157
  rm -rf fifo.in fifo.out
142
158
 
143
159
  echo "Ran solution as \$@" &>>stderr0
144
160
  echo "interactor exitcode \$ECINT" &>>stderr0
145
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
146
178
 
147
- RTE=0
148
- if [[ \$ECSF -eq -13 ]]; then
149
- RTE=0
150
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
151
- echo "Found EOF RTE" &>>stderr0
152
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
153
182
  fi
154
183
 
155
- ret=0
156
- 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
157
186
  echo "testlib exitcode \$ECINT" >stdout0
158
- ret=0
159
- elif [[ \$ECSF -ne 0 ]]; then
160
- ret=\$ECSF
187
+ finish 0
161
188
  elif [[ \$ECINT -ne 0 ]]; then
162
- ret=9
189
+ finish 9
163
190
  fi
164
191
 
165
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
166
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
167
194
  EOF
168
195
 
169
196
  chmod 755 runit.sh
@@ -81,10 +81,10 @@ fi
81
81
 
82
82
  time=$3
83
83
  if [ "$time" -gt "0" ]; then
84
- let "ttime = $time + 30"
84
+ let "ttime = $time * 4"
85
85
  else
86
86
  time=1
87
- ttime=30
87
+ ttime=4
88
88
  fi
89
89
 
90
90
  nruns=1
@@ -132,37 +132,65 @@ SFPID=\$!
132
132
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
133
  INTPID=\$!
134
134
 
135
- wait \$SFPID
136
- ECSF=\$?
135
+ ECINT=0
136
+ ECSF=0
137
137
 
138
- wait \$INTPID
139
- ECINT=\$?
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
146
+ wait \$SFPID
147
+ ECSF=\$?
148
+ ECINT=\$ECEXIT
149
+ EXITFIRST=interactor
150
+ else
151
+ wait \$INTPID
152
+ ECINT=\$?
153
+ ECSF=\$ECEXIT
154
+ EXITFIRST=solution
155
+ fi
140
156
 
141
157
  rm -rf fifo.in fifo.out
142
158
 
143
159
  echo "Ran solution as \$@" &>>stderr0
144
160
  echo "interactor exitcode \$ECINT" &>>stderr0
145
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
146
178
 
147
- RTE=0
148
- if [[ \$ECSF -eq -13 ]]; then
149
- RTE=0
150
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
151
- echo "Found EOF RTE" &>>stderr0
152
- RTE=1
179
+ # 2. Check for solution errors.
180
+ if [[ \$ECSF -ne 0 ]]; then
181
+ finish \$ECSF
153
182
  fi
154
- ret=0
155
- 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
156
186
  echo "testlib exitcode \$ECINT" >stdout0
157
- ret=0
158
- elif [[ \$ECSF -ne 0 ]]; then
159
- ret=\$ECSF
187
+ finish 0
160
188
  elif [[ \$ECINT -ne 0 ]]; then
161
- ret=9
189
+ finish 9
162
190
  fi
163
191
 
164
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
165
- exit \$ret
192
+ # 4. Finish with zero and later check output.
193
+ finish 0
166
194
  EOF
167
195
 
168
196
  chmod 755 runit.sh
@@ -99,10 +99,10 @@ fi
99
99
 
100
100
  time=$3
101
101
  if [ "$time" -gt "0" ]; then
102
- let "ttime = $time + 30"
102
+ let "ttime = $time * 4"
103
103
  else
104
104
  time=1
105
- ttime=30
105
+ ttime=4
106
106
  fi
107
107
 
108
108
  nruns=1
@@ -145,38 +145,65 @@ SFPID=\$!
145
145
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
146
146
  INTPID=\$!
147
147
 
148
- wait \$SFPID
149
- ECSF=\$?
148
+ ECINT=0
149
+ ECSF=0
150
150
 
151
- wait \$INTPID
152
- ECINT=\$?
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
159
+ wait \$SFPID
160
+ ECSF=\$?
161
+ ECINT=\$ECEXIT
162
+ EXITFIRST=interactor
163
+ else
164
+ wait \$INTPID
165
+ ECINT=\$?
166
+ ECSF=\$ECEXIT
167
+ EXITFIRST=solution
168
+ fi
153
169
 
154
170
  rm -rf fifo.in fifo.out
155
171
 
156
172
  echo "Ran solution as \$@" &>>stderr0
157
173
  echo "interactor exitcode \$ECINT" &>>stderr0
158
174
  echo "solution exitcode \$ECSF" &>>stderr0
175
+ echo "exit first \$EXITFIRST" &>>stderr0
176
+
177
+ finish() {
178
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
179
+ exit \$1
180
+ }
159
181
 
160
- RTE=0
161
- if [[ \$ECSF -eq -13 ]]; then
162
- RTE=0
163
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
164
- echo "Found EOF RTE" &>>stderr0
165
- RTE=1
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
166
190
  fi
167
191
 
168
- ret=0
169
- 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
170
199
  echo "testlib exitcode \$ECINT" >stdout0
171
- ret=0
172
- elif [[ \$ECSF -ne 0 ]]; then
173
- ret=\$ECSF
200
+ finish 0
174
201
  elif [[ \$ECINT -ne 0 ]]; then
175
- ret=9
202
+ finish 9
176
203
  fi
177
204
 
178
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
179
- exit \$ret
205
+ # 4. Finish with zero and later check output.
206
+ finish 0
180
207
  EOF
181
208
 
182
209
  chmod 755 runit.sh
@@ -91,10 +91,10 @@ fi
91
91
 
92
92
  time=$3
93
93
  if [ "$time" -gt "0" ]; then
94
- let "ttime = $time + 30"
94
+ let "ttime = $time * 4"
95
95
  else
96
96
  time=1
97
- ttime=30
97
+ ttime=4
98
98
  fi
99
99
 
100
100
  nruns=1
@@ -136,38 +136,65 @@ SFPID=\$!
136
136
  ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
137
137
  INTPID=\$!
138
138
 
139
- wait \$SFPID
140
- ECSF=\$?
139
+ ECINT=0
140
+ ECSF=0
141
141
 
142
- wait \$INTPID
143
- ECINT=\$?
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
150
+ wait \$SFPID
151
+ ECSF=\$?
152
+ ECINT=\$ECEXIT
153
+ EXITFIRST=interactor
154
+ else
155
+ wait \$INTPID
156
+ ECINT=\$?
157
+ ECSF=\$ECEXIT
158
+ EXITFIRST=solution
159
+ fi
144
160
 
145
161
  rm -rf fifo.in fifo.out
146
162
 
147
163
  echo "Ran solution as \$@" &>>stderr0
148
164
  echo "interactor exitcode \$ECINT" &>>stderr0
149
165
  echo "solution exitcode \$ECSF" &>>stderr0
166
+ echo "exit first \$EXITFIRST" &>>stderr0
167
+
168
+ finish() {
169
+ echo "exitting from runit.sh with exit code \$1" &>>stderr0
170
+ exit \$1
171
+ }
150
172
 
151
- RTE=0
152
- if [[ \$ECSF -eq -13 ]]; then
153
- RTE=0
154
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
155
- echo "Found EOF RTE" &>>stderr0
156
- RTE=1
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
157
181
  fi
158
182
 
159
- ret=0
160
- 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
161
190
  echo "testlib exitcode \$ECINT" >stdout0
162
- ret=0
163
- elif [[ \$ECSF -ne 0 ]]; then
164
- ret=\$ECSF
191
+ finish 0
165
192
  elif [[ \$ECINT -ne 0 ]]; then
166
- ret=9
193
+ finish 9
167
194
  fi
168
195
 
169
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
170
- exit \$ret
196
+ # 4. Finish with zero and later check output.
197
+ finish 0
171
198
  EOF
172
199
 
173
200
  chmod 755 runit.sh