lean-runtime 2.0.8__tar.gz → 2.0.9__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 (146) hide show
  1. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/CHANGELOG.md +5 -0
  2. {lean_runtime-2.0.8/lean_runtime.egg-info → lean_runtime-2.0.9}/PKG-INFO +1 -1
  3. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/cli.py +11 -1
  4. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/environments.py +14 -2
  5. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/runtime.py +8 -1
  6. {lean_runtime-2.0.8 → lean_runtime-2.0.9/lean_runtime.egg-info}/PKG-INFO +1 -1
  7. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/pyproject.toml +1 -1
  8. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_cli.py +15 -0
  9. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_prebuilt_policy.py +16 -0
  10. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/LICENSE +0 -0
  11. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/MANIFEST.in +0 -0
  12. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/README.md +0 -0
  13. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/catalog/environments.toml +0 -0
  14. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/catalog/locks/core-v4.32.2.lock.json +0 -0
  15. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/catalog/locks/mathlib-v4.30.0.lock.json +0 -0
  16. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/catalog/locks/mathlib-v4.31.0.lock.json +0 -0
  17. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/catalog/locks/mathlib-v4.32.2.lock.json +0 -0
  18. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/compatibility/README.md +0 -0
  19. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/compatibility/mathlib-4.32.2.json +0 -0
  20. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/compatibility/mathlib-4.32.2.toml +0 -0
  21. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/architecture.md +0 -0
  22. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/captures.md +0 -0
  23. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/case-study-v1.md +0 -0
  24. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/cli.md +0 -0
  25. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/development.md +0 -0
  26. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/environments.md +0 -0
  27. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/getting-started.md +0 -0
  28. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/index.md +0 -0
  29. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/local-projects.md +0 -0
  30. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/portable-copies.md +0 -0
  31. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/python-api.md +0 -0
  32. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/ready-programs.md +0 -0
  33. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/standalone-files.md +0 -0
  34. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/trust-and-limitations.md +0 -0
  35. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/docs/v1-precision.md +0 -0
  36. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/examples/mathlib.toml +0 -0
  37. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/__init__.py +0 -0
  38. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/__main__.py +0 -0
  39. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/_git.py +0 -0
  40. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/_paths.py +0 -0
  41. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/backends.py +0 -0
  42. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/bundles.py +0 -0
  43. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/comparison.py +0 -0
  44. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/decisions.py +0 -0
  45. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/diagnostics.py +0 -0
  46. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/__init__.py +0 -0
  47. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/analyzer.py +0 -0
  48. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/api.py +0 -0
  49. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/candidate.py +0 -0
  50. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/catalog.py +0 -0
  51. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/catalog_build.py +0 -0
  52. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/catalog_cli.py +0 -0
  53. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/catalog_manifest.py +0 -0
  54. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/data/catalog.json +0 -0
  55. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/defaults.py +0 -0
  56. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/engine.py +0 -0
  57. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/errors.py +0 -0
  58. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/module_inventory.py +0 -0
  59. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/planner.py +0 -0
  60. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/policy.py +0 -0
  61. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/probe.py +0 -0
  62. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/py.typed +0 -0
  63. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/result.py +0 -0
  64. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/schema_resources.py +0 -0
  65. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/schemas/catalog-v1.schema.json +0 -0
  66. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/schemas/plan-v1.schema.json +0 -0
  67. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/discovery/schemas/result-v1.schema.json +0 -0
  68. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/errors.py +0 -0
  69. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/events.py +0 -0
  70. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/facade.py +0 -0
  71. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/frontmatter.py +0 -0
  72. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/health.py +0 -0
  73. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/lake.py +0 -0
  74. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/lockfiles.py +0 -0
  75. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/locking.py +0 -0
  76. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/matrix.py +0 -0
  77. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/models.py +0 -0
  78. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/oci.py +0 -0
  79. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/policies.py +0 -0
  80. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/profiling.py +0 -0
  81. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/programs.py +0 -0
  82. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/projects.py +0 -0
  83. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/publisher_verification.py +0 -0
  84. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/py.typed +0 -0
  85. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/references.py +0 -0
  86. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/resolver.py +0 -0
  87. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/run_cli.py +0 -0
  88. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/schema_resources.py +0 -0
  89. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/serialization.py +0 -0
  90. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/specs.py +0 -0
  91. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/store.py +0 -0
  92. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/timings.py +0 -0
  93. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/toolchains.py +0 -0
  94. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/verification.py +0 -0
  95. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime/wire.py +0 -0
  96. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime.egg-info/SOURCES.txt +0 -0
  97. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime.egg-info/dependency_links.txt +0 -0
  98. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime.egg-info/entry_points.txt +0 -0
  99. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime.egg-info/requires.txt +0 -0
  100. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/lean_runtime.egg-info/top_level.txt +0 -0
  101. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/mkdocs.yml +0 -0
  102. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/cleanup-v1.schema.json +0 -0
  103. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/comparison-v1.schema.json +0 -0
  104. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/execution-v1.schema.json +0 -0
  105. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/inspect-v1.schema.json +0 -0
  106. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/matrix-v1.schema.json +0 -0
  107. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/profile-v1.schema.json +0 -0
  108. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/schemas/verify-v1.schema.json +0 -0
  109. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/scripts/run_compatibility.py +0 -0
  110. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/scripts/run_v1_case_study.py +0 -0
  111. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/scripts/smoke_wheel.py +0 -0
  112. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/setup.cfg +0 -0
  113. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/conftest.py +0 -0
  114. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/e2e/test_real_discovery.py +0 -0
  115. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_analyzer.py +0 -0
  116. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_catalog.py +0 -0
  117. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_catalog_build.py +0 -0
  118. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_discovery_schema_resources.py +0 -0
  119. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_engine.py +0 -0
  120. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_planner.py +0 -0
  121. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/discovery/test_policy.py +0 -0
  122. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_backend.py +0 -0
  123. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_bundles.py +0 -0
  124. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_diagnostics.py +0 -0
  125. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_environment_integration.py +0 -0
  126. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_events_health.py +0 -0
  127. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_facade.py +0 -0
  128. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_frontmatter.py +0 -0
  129. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_git.py +0 -0
  130. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_interactive.py +0 -0
  131. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_lockfiles.py +0 -0
  132. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_multifile.py +0 -0
  133. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_paths.py +0 -0
  134. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_programs.py +0 -0
  135. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_projects.py +0 -0
  136. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_references.py +0 -0
  137. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_run_cli.py +0 -0
  138. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_runtime.py +0 -0
  139. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_schema_resources.py +0 -0
  140. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_schemas.py +0 -0
  141. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_signatures.py +0 -0
  142. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_specs.py +0 -0
  143. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_store.py +0 -0
  144. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_toolchains.py +0 -0
  145. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_v1_precision.py +0 -0
  146. {lean_runtime-2.0.8 → lean_runtime-2.0.9}/tests/test_verification_inventory.py +0 -0
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.0.9 - 2026-08-10
6
+
7
+ - Allow callers and `build-and-publish --timeout` to raise the per-step limit
8
+ for artifact hydration and environment builds on slower platforms.
9
+
5
10
  ## 2.0.8 - 2026-08-10
6
11
 
7
12
  - Add immutable, content-addressed provenance to ready-to-run program
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lean-runtime
3
- Version: 2.0.8
3
+ Version: 2.0.9
4
4
  Summary: Run Lean 4 proofs from Python or standalone files
5
5
  Author: Alejandro Radisic
6
6
  License-Expression: Apache-2.0
@@ -142,6 +142,12 @@ def parser() -> argparse.ArgumentParser:
142
142
  push.add_argument("--publish-to", required=True)
143
143
  push.add_argument("--tag", action="append", default=[])
144
144
  push.add_argument("--name")
145
+ push.add_argument(
146
+ "--timeout",
147
+ type=float,
148
+ default=1800,
149
+ help="maximum seconds for each artifact hydration and the environment build",
150
+ )
145
151
  push.add_argument(
146
152
  "--platform-only",
147
153
  action="store_true",
@@ -368,7 +374,11 @@ def main(argv: list[str] | None = None) -> int:
368
374
  _json(environment.inspect().to_dict())
369
375
  return 0
370
376
  if args.command == "build-and-publish":
371
- environment = runtime.open_exact(EnvironmentLock.load(args.lock), name=args.name)
377
+ environment = runtime.open_exact(
378
+ EnvironmentLock.load(args.lock),
379
+ name=args.name,
380
+ build_timeout=args.timeout,
381
+ )
372
382
  _json(
373
383
  runtime.publish_environment(
374
384
  environment.id,
@@ -1005,6 +1005,7 @@ class EnvironmentManager:
1005
1005
  *,
1006
1006
  name: str | None = None,
1007
1007
  build_profile: str = "release",
1008
+ build_timeout: float = 1800,
1008
1009
  cancel: threading.Event | None = None,
1009
1010
  ) -> Environment:
1010
1011
  self.store.publish_lock(lock)
@@ -1018,7 +1019,14 @@ class EnvironmentManager:
1018
1019
  with FileLock(self.store.lock_dir / f"{environment_id}.lock", timeout=1800, cancel=cancel):
1019
1020
  if not destination.is_dir():
1020
1021
  self._ensure_sources(lock)
1021
- self._materialize(lock, environment_id, destination, build_profile, cancel=cancel)
1022
+ self._materialize(
1023
+ lock,
1024
+ environment_id,
1025
+ destination,
1026
+ build_profile,
1027
+ build_timeout=build_timeout,
1028
+ cancel=cancel,
1029
+ )
1022
1030
  else:
1023
1031
  self.events.emit(
1024
1032
  "environment.cache_hit",
@@ -1061,6 +1069,7 @@ class EnvironmentManager:
1061
1069
  destination: Path,
1062
1070
  build_profile: str,
1063
1071
  *,
1072
+ build_timeout: float,
1064
1073
  cancel: threading.Event | None,
1065
1074
  ) -> None:
1066
1075
  stage = self.store.environments / f".staging-{os.getpid()}-{uuid.uuid4().hex}"
@@ -1086,7 +1095,10 @@ class EnvironmentManager:
1086
1095
  phase="acquisition",
1087
1096
  )
1088
1097
  clone_tree(source, packages_dir / package.name)
1089
- build_policy = ExecutionPolicy(timeout_seconds=1800, max_output_bytes=10_000_000)
1098
+ build_policy = ExecutionPolicy(
1099
+ timeout_seconds=build_timeout,
1100
+ max_output_bytes=10_000_000,
1101
+ )
1090
1102
  hydration: list[dict[str, Any]] = []
1091
1103
  for package in lock.packages:
1092
1104
  if not package.artifact_command:
@@ -170,6 +170,7 @@ class Runtime:
170
170
  *,
171
171
  name: str | None = None,
172
172
  build_profile: str = "release",
173
+ build_timeout: float = 1800,
173
174
  cancel: threading.Event | None = None,
174
175
  ) -> Environment:
175
176
  environment_id = environment_identity(lock, build_profile)
@@ -203,7 +204,13 @@ class Runtime:
203
204
  "no compatible downloadable environment was found; availability=required "
204
205
  "does not permit a source build." + nearest
205
206
  )
206
- return self.environments.ensure(lock, name=name, build_profile=build_profile, cancel=cancel)
207
+ return self.environments.ensure(
208
+ lock,
209
+ name=name,
210
+ build_profile=build_profile,
211
+ build_timeout=build_timeout,
212
+ cancel=cancel,
213
+ )
207
214
 
208
215
  def environment(self, identifier: str) -> Environment:
209
216
  """Open a published environment without resolution or network access."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lean-runtime
3
- Version: 2.0.8
3
+ Version: 2.0.9
4
4
  Summary: Run Lean 4 proofs from Python or standalone files
5
5
  Author: Alejandro Radisic
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "lean-runtime"
7
- version = "2.0.8"
7
+ version = "2.0.9"
8
8
  description = "Run Lean 4 proofs from Python or standalone files"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -36,6 +36,21 @@ def test_removed_v1_commands_are_absent() -> None:
36
36
  assert commands.isdisjoint(removed)
37
37
 
38
38
 
39
+ def test_build_and_publish_accepts_environment_build_timeout() -> None:
40
+ arguments = parser().parse_args(
41
+ [
42
+ "build-and-publish",
43
+ "environment.lock.json",
44
+ "--publish-to",
45
+ "oci://cache",
46
+ "--timeout",
47
+ "3600",
48
+ ]
49
+ )
50
+
51
+ assert arguments.timeout == 3600
52
+
53
+
39
54
  def test_verbose_materialization_failure_includes_tool_output(capsys) -> None:
40
55
  failure = MaterializationError(
41
56
  "environment build failed",
@@ -62,6 +62,22 @@ def test_auto_falls_back_only_when_prebuilt_is_unavailable(
62
62
  assert runtime.open_exact(_lock()) is sentinel
63
63
 
64
64
 
65
+ def test_open_exact_forwards_environment_build_timeout(
66
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
67
+ ) -> None:
68
+ runtime = Runtime(home=tmp_path, availability="local", libraries=[])
69
+ captured: dict[str, object] = {}
70
+
71
+ def ensure(*_args: object, **kwargs: object) -> object:
72
+ captured.update(kwargs)
73
+ return object()
74
+
75
+ monkeypatch.setattr(runtime.environments, "ensure", ensure)
76
+ runtime.open_exact(_lock(), build_timeout=3600)
77
+
78
+ assert captured["build_timeout"] == 3600
79
+
80
+
65
81
  def test_auto_does_not_hide_prebuilt_integrity_failures(
66
82
  tmp_path: Path, monkeypatch: pytest.MonkeyPatch
67
83
  ) -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes