mainsequence 8.0.1__tar.gz → 8.0.2__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 (139) hide show
  1. {mainsequence-8.0.1/mainsequence.egg-info → mainsequence-8.0.2}/PKG-INFO +1 -1
  2. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/cli.py +9 -2
  3. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/local_ops.py +5 -4
  4. {mainsequence-8.0.1 → mainsequence-8.0.2/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-8.0.1 → mainsequence-8.0.2}/pyproject.toml +1 -1
  6. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli.py +6 -1
  7. mainsequence-8.0.2/tests/test_local_ops.py +123 -0
  8. mainsequence-8.0.1/tests/test_local_ops.py +0 -59
  9. {mainsequence-8.0.1 → mainsequence-8.0.2}/LICENSE +0 -0
  10. {mainsequence-8.0.1 → mainsequence-8.0.2}/MANIFEST.in +0 -0
  11. {mainsequence-8.0.1 → mainsequence-8.0.2}/README.md +0 -0
  12. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  14. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  15. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  16. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  17. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  18. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  19. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  20. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  21. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  22. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  23. {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  24. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/__init__.py +0 -0
  25. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/__main__.py +0 -0
  26. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/bootstrap.py +0 -0
  27. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/__init__.py +0 -0
  28. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/api.py +0 -0
  29. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/browser_auth.py +0 -0
  30. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/code_repository_status.py +0 -0
  31. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/config.py +0 -0
  32. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/docker_utils.py +0 -0
  33. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/doctor.py +0 -0
  34. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/migrations.py +0 -0
  35. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/model_filters.py +0 -0
  36. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/pydantic_cli.py +0 -0
  37. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/sdk_utils.py +0 -0
  38. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/ssh_utils.py +0 -0
  39. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/ui.py +0 -0
  40. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/__init__.py +0 -0
  41. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/agent_runtime_models.py +0 -0
  42. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/base.py +0 -0
  43. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/client.py +0 -0
  44. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/compute_validation.py +0 -0
  45. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  46. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  47. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  48. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  49. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/dtype_codec.py +0 -0
  50. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/exceptions.py +0 -0
  51. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/metatables/__init__.py +0 -0
  52. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/metatables/core.py +0 -0
  53. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_foundry.py +0 -0
  54. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_helpers.py +0 -0
  55. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_user.py +0 -0
  56. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/observability.py +0 -0
  57. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/utils.py +0 -0
  58. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/code_repository_context.py +0 -0
  59. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/code_repository_skills.py +0 -0
  60. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/defaults.py +0 -0
  61. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/instrumentation/__init__.py +0 -0
  62. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/instrumentation/utils.py +0 -0
  63. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/logconf.py +0 -0
  64. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/__init__.py +0 -0
  65. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/__main__.py +0 -0
  66. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  67. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  68. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/future_registry.py +0 -0
  69. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/hashing.py +0 -0
  70. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  71. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  72. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/env.py +0 -0
  73. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/provider.py +0 -0
  74. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/registry.py +0 -0
  75. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  76. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  77. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  78. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  79. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  80. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/schema_names.py +0 -0
  81. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  82. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  83. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  84. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  85. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  86. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  87. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  88. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  89. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  90. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  91. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/repository_identity_security.py +0 -0
  92. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/runtime_flags.py +0 -0
  93. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/scaffold_skills.py +0 -0
  94. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/SOURCES.txt +0 -0
  95. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/dependency_links.txt +0 -0
  96. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/entry_points.txt +0 -0
  97. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/requires.txt +0 -0
  98. {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/top_level.txt +0 -0
  99. {mainsequence-8.0.1 → mainsequence-8.0.2}/setup.cfg +0 -0
  100. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  101. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_auth_precedence.py +0 -0
  102. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_canonical_api_route_contract.py +0 -0
  103. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli_browser_auth.py +0 -0
  104. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli_migrations.py +0 -0
  105. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_client.py +0 -0
  106. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  107. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_branch_contract.py +0 -0
  108. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_runtime_context.py +0 -0
  109. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_skills.py +0 -0
  110. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_dependency_extras.py +0 -0
  111. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_duckdb_interface_dimensions.py +0 -0
  112. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_environment_resource_context.py +0 -0
  113. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_environment_response_contracts.py +0 -0
  114. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_filter_normalization.py +0 -0
  115. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_instrumentation.py +0 -0
  116. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_logconf.py +0 -0
  117. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_table_migrations.py +0 -0
  118. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_tables_client_models.py +0 -0
  119. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  120. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_models_user_request_bound_auth.py +0 -0
  121. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_notification_uid_contract.py +0 -0
  122. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_observability_client.py +0 -0
  123. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_pod_project_resolution.py +0 -0
  124. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_scaffold_skills.py +0 -0
  125. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_scheduler_client_model.py +0 -0
  126. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_schema_names.py +0 -0
  127. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_secret_client_model.py +0 -0
  128. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_source_table_configuration.py +0 -0
  129. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_sqlite_interface_dimensions.py +0 -0
  130. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_ssh_utils.py +0 -0
  131. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  132. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_dimension_queries.py +0 -0
  133. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration.py +0 -0
  134. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration_client.py +0 -0
  135. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_flow.py +0 -0
  136. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_hard_cut.py +0 -0
  137. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_runner_uid_runtime.py +0 -0
  138. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_statistics.py +0 -0
  139. {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_uid_guards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.0.1
3
+ Version: 8.0.2
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -10292,7 +10292,9 @@ def code_repository_freeze_env(
10292
10292
  ),
10293
10293
  ):
10294
10294
  """
10295
- Export pinned dependencies into `requirements.txt` using `uv`.
10295
+ Export locked runtime dependencies into `requirements.txt` using `uv`.
10296
+
10297
+ Development dependency groups are excluded from the runtime export.
10296
10298
 
10297
10299
  Parameters
10298
10300
  ----------
@@ -10321,7 +10323,12 @@ def code_repository_freeze_env(
10321
10323
 
10322
10324
  with status("Exporting requirements.txt via uv..."):
10323
10325
  uv_export_requirements(
10324
- uv, cwd=code_repository_dir, locked=False, no_dev=False, output_file="requirements.txt"
10326
+ uv,
10327
+ cwd=code_repository_dir,
10328
+ locked=True,
10329
+ no_dev=True,
10330
+ no_hashes=True,
10331
+ output_file="requirements.txt",
10325
10332
  )
10326
10333
 
10327
10334
  success(f"Wrote: {code_repository_dir / 'requirements.txt'}")
@@ -182,15 +182,16 @@ def git_origin(code_repository_dir: pathlib.Path) -> str:
182
182
  def uv_export_requirements(
183
183
  uv_path: pathlib.Path,
184
184
  cwd: pathlib.Path,
185
- locked: bool = False,
186
- no_dev: bool = False,
185
+ locked: bool = True,
186
+ no_dev: bool = True,
187
187
  no_hashes: bool = True,
188
188
  output_file: str = "requirements.txt",
189
189
  ) -> None:
190
190
  """
191
- Export requirements using uv with compatibility fallbacks.
191
+ Export the locked runtime dependency closure using uv.
192
192
 
193
- The VS Code extension uses slightly different flags in different places; we try:
193
+ Development dependencies are excluded by default. For uv output flag
194
+ compatibility, try:
194
195
  1) modern: --format requirements-txt -o requirements.txt
195
196
  2) fallback: --format requirements.txt --output-file requirements.txt
196
197
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.0.1
3
+ Version: 8.0.2
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "8.0.1"
7
+ version = "8.0.2"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -10562,7 +10562,12 @@ def test_code_repository_freeze_env(cli_mod, runner, monkeypatch, tmp_path):
10562
10562
  result = runner.invoke(cli_mod.app, ["code-repository", "freeze-env", "--path", str(target)])
10563
10563
  assert result.exit_code == 0
10564
10564
  assert len(calls) == 1
10565
- assert calls[0][2]["output_file"] == "requirements.txt"
10565
+ assert calls[0][2] == {
10566
+ "locked": True,
10567
+ "no_dev": True,
10568
+ "no_hashes": True,
10569
+ "output_file": "requirements.txt",
10570
+ }
10566
10571
 
10567
10572
 
10568
10573
  @pytest.mark.parametrize(
@@ -0,0 +1,123 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import pathlib
5
+ import shutil
6
+ import subprocess
7
+
8
+ import pytest
9
+
10
+ from mainsequence.cli import local_ops
11
+
12
+
13
+ def _write_uv_fixture_package(path: pathlib.Path, name: str) -> None:
14
+ path.mkdir()
15
+ (path / "pyproject.toml").write_text(
16
+ "\n".join(
17
+ [
18
+ "[project]",
19
+ f'name = "{name}"',
20
+ 'version = "1.0.0"',
21
+ 'requires-python = ">=3.13"',
22
+ "",
23
+ ]
24
+ ),
25
+ encoding="utf-8",
26
+ )
27
+
28
+
29
+ def test_uv_export_requirements_excludes_dev_group_from_locked_export(monkeypatch, tmp_path):
30
+ uv_binary = shutil.which("uv")
31
+ if uv_binary is None:
32
+ pytest.skip("uv is required for the locked export integration test")
33
+
34
+ _write_uv_fixture_package(tmp_path / "runtime-package", "runtime-package")
35
+ _write_uv_fixture_package(tmp_path / "dev-package", "dev-package")
36
+ (tmp_path / "pyproject.toml").write_text(
37
+ """\
38
+ [project]
39
+ name = "export-fixture"
40
+ version = "1.0.0"
41
+ requires-python = ">=3.13"
42
+ dependencies = ["runtime-package"]
43
+
44
+ [dependency-groups]
45
+ dev = ["dev-package"]
46
+
47
+ [tool.uv]
48
+ package = false
49
+
50
+ [tool.uv.sources]
51
+ runtime-package = { path = "runtime-package" }
52
+ dev-package = { path = "dev-package" }
53
+ """,
54
+ encoding="utf-8",
55
+ )
56
+ monkeypatch.setenv("UV_OFFLINE", "1")
57
+ subprocess.run(
58
+ [uv_binary, "lock", "--offline"],
59
+ cwd=tmp_path,
60
+ check=True,
61
+ capture_output=True,
62
+ text=True,
63
+ )
64
+
65
+ local_ops.uv_export_requirements(pathlib.Path(uv_binary), tmp_path)
66
+
67
+ requirements = (tmp_path / "requirements.txt").read_text(encoding="utf-8")
68
+ command_header = next(line for line in requirements.splitlines() if "uv export" in line)
69
+ assert "--locked" in command_header
70
+ assert "--no-dev" in command_header
71
+ assert "--no-hashes" in command_header
72
+ assert "runtime-package" in requirements
73
+ assert "dev-package" not in requirements
74
+
75
+
76
+ def test_uv_preview_patch_version_uses_read_only_json_command(monkeypatch, tmp_path):
77
+ calls = []
78
+ uv_path = pathlib.Path("/tools/uv")
79
+ env = {"UV_CACHE_DIR": "/cache"}
80
+
81
+ def fake_run(command, **kwargs):
82
+ calls.append((command, kwargs))
83
+ return subprocess.CompletedProcess(
84
+ command,
85
+ 0,
86
+ stdout=json.dumps({"package_name": "demo", "version": "1.2.4"}),
87
+ stderr="",
88
+ )
89
+
90
+ monkeypatch.setattr(local_ops.subprocess, "run", fake_run)
91
+
92
+ assert local_ops.uv_preview_patch_version(uv_path, tmp_path, env) == "1.2.4"
93
+ assert calls == [
94
+ (
95
+ [
96
+ "/tools/uv",
97
+ "version",
98
+ "--bump",
99
+ "patch",
100
+ "--dry-run",
101
+ "--output-format",
102
+ "json",
103
+ ],
104
+ {
105
+ "cwd": str(tmp_path),
106
+ "env": env,
107
+ "capture_output": True,
108
+ "text": True,
109
+ },
110
+ )
111
+ ]
112
+
113
+
114
+ @pytest.mark.parametrize("stdout", ["not-json", "{}", "[]"])
115
+ def test_uv_preview_patch_version_rejects_invalid_output(monkeypatch, tmp_path, stdout):
116
+ monkeypatch.setattr(
117
+ local_ops.subprocess,
118
+ "run",
119
+ lambda *args, **kwargs: subprocess.CompletedProcess(args[0], 0, stdout=stdout, stderr=""),
120
+ )
121
+
122
+ with pytest.raises(RuntimeError, match="preview returned"):
123
+ local_ops.uv_preview_patch_version(pathlib.Path("uv"), tmp_path)
@@ -1,59 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import pathlib
5
- import subprocess
6
-
7
- import pytest
8
-
9
- from mainsequence.cli import local_ops
10
-
11
-
12
- def test_uv_preview_patch_version_uses_read_only_json_command(monkeypatch, tmp_path):
13
- calls = []
14
- uv_path = pathlib.Path("/tools/uv")
15
- env = {"UV_CACHE_DIR": "/cache"}
16
-
17
- def fake_run(command, **kwargs):
18
- calls.append((command, kwargs))
19
- return subprocess.CompletedProcess(
20
- command,
21
- 0,
22
- stdout=json.dumps({"package_name": "demo", "version": "1.2.4"}),
23
- stderr="",
24
- )
25
-
26
- monkeypatch.setattr(local_ops.subprocess, "run", fake_run)
27
-
28
- assert local_ops.uv_preview_patch_version(uv_path, tmp_path, env) == "1.2.4"
29
- assert calls == [
30
- (
31
- [
32
- "/tools/uv",
33
- "version",
34
- "--bump",
35
- "patch",
36
- "--dry-run",
37
- "--output-format",
38
- "json",
39
- ],
40
- {
41
- "cwd": str(tmp_path),
42
- "env": env,
43
- "capture_output": True,
44
- "text": True,
45
- },
46
- )
47
- ]
48
-
49
-
50
- @pytest.mark.parametrize("stdout", ["not-json", "{}", "[]"])
51
- def test_uv_preview_patch_version_rejects_invalid_output(monkeypatch, tmp_path, stdout):
52
- monkeypatch.setattr(
53
- local_ops.subprocess,
54
- "run",
55
- lambda *args, **kwargs: subprocess.CompletedProcess(args[0], 0, stdout=stdout, stderr=""),
56
- )
57
-
58
- with pytest.raises(RuntimeError, match="preview returned"):
59
- local_ops.uv_preview_patch_version(pathlib.Path("uv"), tmp_path)
File without changes
File without changes
File without changes
File without changes