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.
- {mainsequence-8.0.1/mainsequence.egg-info → mainsequence-8.0.2}/PKG-INFO +1 -1
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/cli.py +9 -2
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/local_ops.py +5 -4
- {mainsequence-8.0.1 → mainsequence-8.0.2/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-8.0.1 → mainsequence-8.0.2}/pyproject.toml +1 -1
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli.py +6 -1
- mainsequence-8.0.2/tests/test_local_ops.py +123 -0
- mainsequence-8.0.1/tests/test_local_ops.py +0 -59
- {mainsequence-8.0.1 → mainsequence-8.0.2}/LICENSE +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/MANIFEST.in +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/README.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/__main__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/bootstrap.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/api.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/code_repository_status.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/config.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/cli/ui.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/base.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/client.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/models_user.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/observability.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/code_repository_context.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/code_repository_skills.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/defaults.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/logconf.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/repository_identity_security.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/setup.cfg +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_auth_precedence.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_canonical_api_route_contract.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_cli_migrations.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_client.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_branch_contract.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_runtime_context.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_skills.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_dependency_extras.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_environment_resource_context.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_environment_response_contracts.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_filter_normalization.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_instrumentation.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_logconf.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_notification_uid_contract.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_observability_client.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_scheduler_client_model.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_schema_names.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_secret_client_model.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_ssh_utils.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_access_dimension_audit.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_dimension_queries.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration_client.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_flow.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_hard_cut.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_statistics.py +0 -0
- {mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_update_uid_guards.py +0 -0
|
@@ -10292,7 +10292,9 @@ def code_repository_freeze_env(
|
|
|
10292
10292
|
),
|
|
10293
10293
|
):
|
|
10294
10294
|
"""
|
|
10295
|
-
Export
|
|
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,
|
|
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 =
|
|
186
|
-
no_dev: bool =
|
|
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
|
|
191
|
+
Export the locked runtime dependency closure using uv.
|
|
192
192
|
|
|
193
|
-
|
|
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
|
"""
|
|
@@ -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]
|
|
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
|
|
File without changes
|
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
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
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/__init__.py
RENAMED
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/duckdb.py
RENAMED
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/local_paths.py
RENAMED
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/client/data_sources_interfaces/sqlite.py
RENAMED
|
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
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/__init__.py
RENAMED
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/migrations/templates/env.py.mako
RENAMED
|
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
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/mainsequence/meta_tables/time_index_table_updates/utils.py
RENAMED
|
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
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/tests/fixtures/time_index_table_update_hash_v2_golden.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_code_repository_batch_jobs_from_file.py
RENAMED
|
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
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_access_dimension_audit.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration.py
RENAMED
|
File without changes
|
{mainsequence-8.0.1 → mainsequence-8.0.2}/tests/test_time_index_table_update_configuration_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|