rbx.cp 0.5.3__tar.gz → 0.5.5__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 (163) hide show
  1. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/PKG-INFO +1 -1
  2. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/pyproject.toml +1 -1
  3. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/main.py +5 -3
  4. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/environment.py +1 -0
  5. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/generators.py +1 -1
  6. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/main.py +9 -2
  7. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/package.py +8 -0
  8. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/presets/__init__.py +1 -0
  9. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/LICENSE +0 -0
  10. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/README.md +0 -0
  11. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/__init__.py +0 -0
  12. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/annotations.py +0 -0
  13. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/autoenum.py +0 -0
  14. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/__init__.py +0 -0
  15. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/builder.py +0 -0
  16. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/cd.py +0 -0
  17. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/checkers.py +0 -0
  18. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/code.py +0 -0
  19. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/compile.py +0 -0
  20. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/conftest.py +0 -0
  21. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/__init__.py +0 -0
  22. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/build_contest_statements.py +0 -0
  23. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/contest_package.py +0 -0
  24. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/contest_utils.py +0 -0
  25. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/schema.py +0 -0
  26. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/contest/statements.py +0 -0
  27. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/creation.py +0 -0
  28. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/download.py +0 -0
  29. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/extensions.py +0 -0
  30. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/generators_test.py +0 -0
  31. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/boca/extension.py +0 -0
  32. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/boca/packager.py +0 -0
  33. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/contest_main.py +0 -0
  34. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/main.py +0 -0
  35. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/packager.py +0 -0
  36. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/polygon/packager.py +0 -0
  37. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/polygon/test.py +0 -0
  38. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/packaging/polygon/xml_schema.py +0 -0
  39. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/presets/fetch.py +0 -0
  40. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/presets/lock_schema.py +0 -0
  41. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/presets/schema.py +0 -0
  42. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/schema.py +0 -0
  43. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/solutions.py +0 -0
  44. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/solutions_test.py +0 -0
  45. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/__init__.py +0 -0
  46. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/build_statements.py +0 -0
  47. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/builders.py +0 -0
  48. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/joiners.py +0 -0
  49. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/latex.py +0 -0
  50. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/latex_jinja.py +0 -0
  51. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/statements/schema.py +0 -0
  52. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/stresses.py +0 -0
  53. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/stressing/__init__.py +0 -0
  54. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/stressing/finder_parser.py +0 -0
  55. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/stressing/generator_parser.py +0 -0
  56. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/testcases.py +0 -0
  57. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/ui/__init__.py +0 -0
  58. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/ui/captured_log.py +0 -0
  59. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/ui/css/app.tcss +0 -0
  60. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/ui/main.py +0 -0
  61. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/ui/run.py +0 -0
  62. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/validators.py +0 -0
  63. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/box/validators_test.py +0 -0
  64. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/checker.py +0 -0
  65. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/clone.py +0 -0
  66. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/config.py +0 -0
  67. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/conftest.py +0 -0
  68. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/console.py +0 -0
  69. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/create.py +0 -0
  70. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/edit.py +0 -0
  71. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/__init__.py +0 -0
  72. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/caching.py +0 -0
  73. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/conftest.py +0 -0
  74. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/__init__.py +0 -0
  75. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/cacher.py +0 -0
  76. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/digester.py +0 -0
  77. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/sandbox.py +0 -0
  78. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/sandboxes/__init__.py +0 -0
  79. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/sandboxes/isolate.py +0 -0
  80. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
  81. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/sandboxes/timeit.py +0 -0
  82. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/storage.py +0 -0
  83. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/test.py +0 -0
  84. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/judge/testiso.py +0 -0
  85. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/steps.py +0 -0
  86. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/steps_with_caching.py +0 -0
  87. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading/steps_with_caching_run_test.py +0 -0
  88. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/grading_utils.py +0 -0
  89. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/hydration.py +0 -0
  90. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/main.py +0 -0
  91. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/metadata.py +0 -0
  92. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/providers/__init__.py +0 -0
  93. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/providers/codeforces.py +0 -0
  94. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/providers/provider.py +0 -0
  95. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/checkers/boilerplate.cpp +0 -0
  96. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/default_config.json +0 -0
  97. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/envs/default.rbx.yml +0 -0
  98. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/envs/isolate.rbx.yml +0 -0
  99. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/checker.sh +0 -0
  100. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compare +0 -0
  101. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/c +0 -0
  102. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/cc +0 -0
  103. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/cpp +0 -0
  104. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/java +0 -0
  105. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/kt +0 -0
  106. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/pas +0 -0
  107. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/py2 +0 -0
  108. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/compile/py3 +0 -0
  109. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/c +0 -0
  110. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/cc +0 -0
  111. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/cpp +0 -0
  112. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/java +0 -0
  113. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/kt +0 -0
  114. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/py2 +0 -0
  115. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/packagers/boca/run/py3 +0 -0
  116. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
  117. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
  118. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
  119. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
  120. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/preset.rbx.yml +0 -0
  121. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/.gitignore +0 -0
  122. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/gen.cpp +0 -0
  123. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
  124. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/random.py +0 -0
  125. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/random.txt +0 -0
  126. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
  127. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
  128. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
  129. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
  130. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
  131. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
  132. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
  133. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
  134. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
  135. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/validator.cpp +0 -0
  136. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
  137. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/resources/templates/template.cpp +0 -0
  138. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/run.py +0 -0
  139. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/schema.py +0 -0
  140. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/submit.py +0 -0
  141. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/submitors/__init__.py +0 -0
  142. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/submitors/codeforces.py +0 -0
  143. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/submitors/submitor.py +0 -0
  144. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/test.py +0 -0
  145. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testcase.py +0 -0
  146. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testcase_rendering.py +0 -0
  147. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/gen1.cpp +0 -0
  148. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/gen2.cpp +0 -0
  149. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/genScript.py +0 -0
  150. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/hard-tle.sol.cpp +0 -0
  151. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/ole.cpp +0 -0
  152. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/problem.rbx.yml +0 -0
  153. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/re.sol.cpp +0 -0
  154. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/sol.cpp +0 -0
  155. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/tests/1.in +0 -0
  156. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/tle-and-incorrect.sol.cpp +0 -0
  157. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/tle.sol.cpp +0 -0
  158. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/validator.cpp +0 -0
  159. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/box1/wa.sol.cpp +0 -0
  160. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/caching/executable.py +0 -0
  161. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testdata/compatible +0 -0
  162. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/testing_utils.py +0 -0
  163. {rbx_cp-0.5.3 → rbx_cp-0.5.5}/rbx/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rbx.cp
3
- Version: 0.5.3
3
+ Version: 0.5.5
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.3"
3
+ version = "0.5.5"
4
4
  description = ""
5
5
  packages = [
6
6
  {include = "rbx"}
@@ -133,20 +133,22 @@ def add(name: str, short_name: str, preset: Optional[str] = None):
133
133
  preset_lock = presets.get_preset_lock()
134
134
  if preset is None and preset_lock is not None:
135
135
  preset = preset_lock.preset_name
136
- creation.create(name, preset=preset, path=pathlib.Path(short_name))
136
+ creation.create(name, preset=preset, path=pathlib.Path(name))
137
137
 
138
138
  contest = find_contest_package_or_die()
139
139
  # Reassign mutable object before saving.
140
140
  contest.problems = sorted(
141
141
  [
142
142
  *contest.problems,
143
- ContestProblem(short_name=short_name, path=pathlib.Path(short_name)),
143
+ ContestProblem(short_name=short_name, path=pathlib.Path(name)),
144
144
  ],
145
145
  key=lambda p: p.short_name,
146
146
  )
147
147
 
148
148
  save_contest(contest)
149
- console.console.print(f'Problem [item]{short_name}[/item] added to contest.')
149
+ console.console.print(
150
+ f'Problem [item]{name} ({short_name})[/item] added to contest.'
151
+ )
150
152
 
151
153
 
152
154
  @app.command(
@@ -212,6 +212,7 @@ def install_environment(name: str, file: pathlib.Path):
212
212
  )
213
213
  raise typer.Exit(1)
214
214
 
215
+ get_environment_path(name).parent.mkdir(parents=True, exist_ok=True)
215
216
  get_environment_path(name).write_bytes(file.read_bytes())
216
217
  console.console.print(
217
218
  f'[success]Environment [item]{name}[/item] was installed from [item]{file}[/item].'
@@ -349,7 +349,7 @@ def generate_standalone(
349
349
 
350
350
  raise typer.Exit(1)
351
351
 
352
- validator = package.get_validator()
352
+ validator = package.get_validator_or_nil()
353
353
  # Run validator, if it is available.
354
354
  if validator is not None and validate:
355
355
  if validator_digest is None:
@@ -266,10 +266,17 @@ def stress(
266
266
  ),
267
267
  ] = None,
268
268
  timeout: Annotated[
269
- int, typer.Option(help='For how many seconds to run the stress test.')
269
+ int,
270
+ typer.Option(
271
+ '--timeout',
272
+ '--time',
273
+ '-t',
274
+ help='For how many seconds to run the stress test.',
275
+ ),
270
276
  ] = 10,
271
277
  findings: Annotated[
272
- int, typer.Option(help='How many breaking tests to look for.')
278
+ int,
279
+ typer.Option('--findings', '-n', help='How many breaking tests to look for.'),
273
280
  ] = 1,
274
281
  verbose: bool = typer.Option(
275
282
  False,
@@ -209,6 +209,14 @@ def get_validator(root: pathlib.Path = pathlib.Path()) -> CodeItem:
209
209
  return package.validator
210
210
 
211
211
 
212
+ @functools.cache
213
+ def get_validator_or_nil(root: pathlib.Path = pathlib.Path()) -> Optional[CodeItem]:
214
+ package = find_problem_package_or_die(root)
215
+ if package.validator is None:
216
+ return None
217
+ return package.validator
218
+
219
+
212
220
  @functools.cache
213
221
  def get_checker(root: pathlib.Path = pathlib.Path()) -> CodeItem:
214
222
  package = find_problem_package_or_die(root)
@@ -316,6 +316,7 @@ def _install(root: pathlib.Path = pathlib.Path(), force: bool = False):
316
316
  should_copy_env = False
317
317
 
318
318
  if should_copy_env:
319
+ get_environment_path(preset.name).parent.mkdir(parents=True, exist_ok=True)
319
320
  shutil.rmtree(get_environment_path(preset.name), ignore_errors=True)
320
321
  shutil.copyfile(str(root / preset.env), get_environment_path(preset.name))
321
322
 
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes