mainsequence 4.3.26__tar.gz → 4.3.30__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 (138) hide show
  1. {mainsequence-4.3.26/mainsequence.egg-info → mainsequence-4.3.30}/PKG-INFO +1 -1
  2. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/metatables/core.py +20 -3
  3. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/models_foundry.py +0 -5
  4. {mainsequence-4.3.26 → mainsequence-4.3.30/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-4.3.26 → mainsequence-4.3.30}/pyproject.toml +1 -1
  6. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_dependency_extras.py +38 -0
  7. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_meta_tables_client_models.py +28 -0
  8. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_pod_project_resolution.py +36 -0
  9. {mainsequence-4.3.26 → mainsequence-4.3.30}/LICENSE +0 -0
  10. {mainsequence-4.3.26 → mainsequence-4.3.30}/README.md +0 -0
  11. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/AGENTS.md +0 -0
  12. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  13. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  15. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  16. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  17. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  18. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  19. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  20. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  21. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  22. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  23. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  24. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  25. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  26. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  27. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  28. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  29. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  30. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  31. {mainsequence-4.3.26 → mainsequence-4.3.30}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  32. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/__init__.py +0 -0
  33. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/__main__.py +0 -0
  34. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/bootstrap.py +0 -0
  35. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/__init__.py +0 -0
  36. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/api.py +0 -0
  37. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/browser_auth.py +0 -0
  38. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/cli.py +0 -0
  39. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/config.py +0 -0
  40. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/migrations.py +0 -0
  44. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/model_filters.py +0 -0
  45. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/project_status.py +0 -0
  46. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/pydantic_cli.py +0 -0
  47. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/sdk_utils.py +0 -0
  48. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/ssh_utils.py +0 -0
  49. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/cli/ui.py +0 -0
  50. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/__init__.py +0 -0
  51. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/agent_runtime_models.py +0 -0
  52. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/base.py +0 -0
  53. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/client.py +0 -0
  54. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/__init__.py +0 -0
  55. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/app_component.py +0 -0
  56. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/connections.py +0 -0
  57. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/data_models.py +0 -0
  58. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/workspace.py +0 -0
  59. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  60. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/compute_validation.py +0 -0
  61. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  62. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  63. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  64. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  65. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/dtype_codec.py +0 -0
  66. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/exceptions.py +0 -0
  67. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/fastapi/__init__.py +0 -0
  68. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/fastapi/auth.py +0 -0
  69. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/metatables/__init__.py +0 -0
  70. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/models_helpers.py +0 -0
  71. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/models_user.py +0 -0
  72. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/client/utils.py +0 -0
  73. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/defaults.py +0 -0
  74. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/instrumentation/__init__.py +0 -0
  75. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/instrumentation/utils.py +0 -0
  76. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/logconf.py +0 -0
  77. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/__init__.py +0 -0
  78. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/__main__.py +0 -0
  79. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  80. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  81. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  82. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  83. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  84. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  85. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  86. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  87. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  88. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  89. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/future_registry.py +0 -0
  90. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/hashing.py +0 -0
  91. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  92. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  93. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/env.py +0 -0
  94. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/provider.py +0 -0
  95. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/registry.py +0 -0
  96. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  97. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  98. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  99. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  100. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  101. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/schema_names.py +0 -0
  102. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  103. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence/runtime_flags.py +0 -0
  104. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence.egg-info/SOURCES.txt +0 -0
  105. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence.egg-info/dependency_links.txt +0 -0
  106. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence.egg-info/entry_points.txt +0 -0
  107. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence.egg-info/requires.txt +0 -0
  108. {mainsequence-4.3.26 → mainsequence-4.3.30}/mainsequence.egg-info/top_level.txt +0 -0
  109. {mainsequence-4.3.26 → mainsequence-4.3.30}/setup.cfg +0 -0
  110. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_auth_precedence.py +0 -0
  111. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_build_operations_hashing.py +0 -0
  112. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_cli.py +0 -0
  113. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_cli_browser_auth.py +0 -0
  114. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_cli_migrations.py +0 -0
  115. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_client.py +0 -0
  116. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_command_center_app_component_models.py +0 -0
  117. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_command_center_data_models.py +0 -0
  118. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_command_center_models.py +0 -0
  119. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  120. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_data_node_storage_dimension_queries.py +0 -0
  121. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_data_node_update_flow.py +0 -0
  122. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_duckdb_interface_dimensions.py +0 -0
  123. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_filter_normalization.py +0 -0
  124. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_instrumentation.py +0 -0
  125. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_logconf.py +0 -0
  126. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_meta_table_migrations.py +0 -0
  127. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  128. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_models_user_request_bound_auth.py +0 -0
  129. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_project_batch_jobs_from_file.py +0 -0
  130. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_run_configuration.py +0 -0
  131. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_schema_names.py +0 -0
  132. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_secret_client_model.py +0 -0
  133. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_source_table_configuration.py +0 -0
  134. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_sqlite_interface_dimensions.py +0 -0
  135. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_update_runner_uid_runtime.py +0 -0
  136. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_update_statistics.py +0 -0
  137. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_update_uid_guards.py +0 -0
  138. {mainsequence-4.3.26 → mainsequence-4.3.30}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.3.26
3
+ Version: 4.3.30
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -44,7 +44,7 @@ from ..dtype_codec import (
44
44
  serialize_remote_parameters,
45
45
  token_to_pandas_series,
46
46
  )
47
- from ..exceptions import raise_for_response
47
+ from ..exceptions import AuthenticationError, PermissionDeniedError, raise_for_response
48
48
  from ..utils import (
49
49
  TDAG_CONSTANTS,
50
50
  DateInfo,
@@ -488,7 +488,8 @@ class MetaTableOperationScope(BasePydanticModel):
488
488
  except Exception as exc:
489
489
  raise ValueError(
490
490
  "MetaTable compiled SQL scope requires data_source_uid or a "
491
- "configured project/session default data source."
491
+ "configured project/session default data source. "
492
+ f"Default data source resolution failed: {exc}"
492
493
  ) from exc
493
494
 
494
495
  uid = getattr(data_source, "uid", None) or getattr(data_source, "data_source_uid", None)
@@ -4597,6 +4598,14 @@ def _build_local_pod_project_resolution() -> _PodProjectResolution:
4597
4598
  )
4598
4599
  try:
4599
4600
  project = Project.get(pk=running_project_uid)
4601
+ except (AuthenticationError, PermissionDeniedError) as exc:
4602
+ raise RuntimeError(
4603
+ "Could not resolve the local project default data source because SDK "
4604
+ "authentication/authorization failed while loading project "
4605
+ f"{running_project_uid!r}. "
4606
+ "Run `mainsequence login` or export MAINSEQUENCE_ACCESS_TOKEN / "
4607
+ f"MAINSEQUENCE_REFRESH_TOKEN. Backend response: {exc}"
4608
+ ) from exc
4600
4609
  except DoesNotExist:
4601
4610
  return _PodProjectResolution(
4602
4611
  project=None,
@@ -4778,7 +4787,15 @@ def get_session_data_source() -> Any:
4778
4787
  SessionDataSource.set_remote_db()
4779
4788
  data_source = getattr(SessionDataSource, "data_source", None)
4780
4789
  if getattr(data_source, "related_resource", None) is None:
4781
- raise Exception("This Pod does not have a default data source")
4790
+ resolution = _resolve_local_pod_project()
4791
+ detail = (resolution.detail or "No local pod project attached.").strip()
4792
+ if detail and not detail.endswith("."):
4793
+ detail += "."
4794
+ raise RuntimeError(
4795
+ "Could not resolve a session default data source. "
4796
+ f"{detail} Run inside a configured Main Sequence project/session, "
4797
+ "or pass data_source_uid explicitly."
4798
+ )
4782
4799
  return data_source
4783
4800
 
4784
4801
 
@@ -1071,8 +1071,3 @@ class Constant(ShareableObjectMixin, BasePydanticModel, BaseObjectOrm):
1071
1071
  new_constant = cls.create(name=k, value=v)
1072
1072
  created_constants.append(new_constant)
1073
1073
  return created_constants
1074
-
1075
-
1076
- from . import metatables as _models_metatables # noqa: E402
1077
-
1078
- _models_metatables.SessionDataSource.set_remote_db()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.3.26
3
+ Version: 4.3.30
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "4.3.26"
7
+ version = "4.3.30"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -6,6 +6,16 @@ import pathlib
6
6
  import sys
7
7
  import types
8
8
 
9
+ import pytest
10
+
11
+
12
+ def _snapshot_mainsequence_modules() -> dict[str, types.ModuleType]:
13
+ return {
14
+ name: module
15
+ for name, module in sys.modules.items()
16
+ if name == "mainsequence" or name.startswith("mainsequence.")
17
+ }
18
+
9
19
 
10
20
  def _reset_mainsequence_modules() -> None:
11
21
  for name in tuple(sys.modules):
@@ -13,6 +23,14 @@ def _reset_mainsequence_modules() -> None:
13
23
  sys.modules.pop(name, None)
14
24
 
15
25
 
26
+ @pytest.fixture(autouse=True)
27
+ def _restore_mainsequence_modules_after_import_test():
28
+ snapshot = _snapshot_mainsequence_modules()
29
+ yield
30
+ _reset_mainsequence_modules()
31
+ sys.modules.update(snapshot)
32
+
33
+
16
34
  def _seed_mainsequence_packages() -> None:
17
35
  repo_root = pathlib.Path(__file__).resolve().parents[1]
18
36
  pkg_root = repo_root / "mainsequence"
@@ -52,6 +70,26 @@ def test_core_client_import_does_not_require_duckdb(monkeypatch):
52
70
  assert not hasattr(foundry_module, "DynamicTableDataSource")
53
71
 
54
72
 
73
+ def test_models_foundry_import_does_not_resolve_session_data_source(monkeypatch):
74
+ _reset_mainsequence_modules()
75
+ _seed_mainsequence_packages()
76
+
77
+ metatables_module = importlib.import_module("mainsequence.client.metatables")
78
+
79
+ def _fail_import_time_resolution():
80
+ raise AssertionError("models_foundry import must not resolve SessionDataSource")
81
+
82
+ monkeypatch.setattr(
83
+ metatables_module.SessionDataSource,
84
+ "set_remote_db",
85
+ _fail_import_time_resolution,
86
+ )
87
+
88
+ foundry_module = importlib.import_module("mainsequence.client.models_foundry")
89
+
90
+ assert hasattr(foundry_module, "Project")
91
+
92
+
55
93
  def test_duckdb_helper_points_to_local_data_extra(monkeypatch):
56
94
  _reset_mainsequence_modules()
57
95
  _seed_mainsequence_packages()
@@ -956,6 +956,34 @@ def test_compiled_sql_v1_scope_resolves_session_data_source(monkeypatch):
956
956
  )
957
957
 
958
958
 
959
+ def test_compiled_sql_v1_scope_preserves_session_data_source_auth_failure(monkeypatch):
960
+ def _raise_auth_failure():
961
+ raise RuntimeError(
962
+ "Could not resolve the local project default data source because SDK "
963
+ "authentication/authorization failed."
964
+ )
965
+
966
+ monkeypatch.setattr(meta_table_models, "get_session_data_source", _raise_auth_failure)
967
+
968
+ with pytest.raises(ValidationError) as exc_info:
969
+ build_operation(
970
+ operation="select",
971
+ sql="SELECT asset.symbol FROM public.asset AS asset",
972
+ scope={
973
+ "tables": [
974
+ {
975
+ "metaTableUid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
976
+ "alias": "asset",
977
+ }
978
+ ]
979
+ },
980
+ )
981
+
982
+ message = str(exc_info.value)
983
+ assert "Default data source resolution failed" in message
984
+ assert "SDK authentication/authorization failed" in message
985
+
986
+
959
987
  def test_compiled_sql_v1_serializes_typed_temporal_parameters():
960
988
  operation = build_operation(
961
989
  operation="select",
@@ -4,6 +4,7 @@ import pytest
4
4
 
5
5
  import mainsequence.client.metatables as models_metatables
6
6
  import mainsequence.client.models_foundry as models_foundry
7
+ from mainsequence.client.exceptions import AuthenticationError
7
8
  from mainsequence.meta_tables.data_nodes import build_operations
8
9
 
9
10
  PROJECT_UID = "1d0530c0-65d1-4db0-856b-dc29d8260a09"
@@ -154,6 +155,41 @@ def test_set_remote_db_warns_once_for_lookup_failure(monkeypatch):
154
155
  assert debugs == []
155
156
 
156
157
 
158
+ def test_resolve_local_pod_project_raises_auth_failure(monkeypatch):
159
+ monkeypatch.setenv("MAIN_SEQUENCE_PROJECT_UID", PROJECT_UID)
160
+ monkeypatch.delenv("MAIN_SEQUENCE_PROJECT_ID", raising=False)
161
+
162
+ def _project_get(*args, **kwargs):
163
+ raise AuthenticationError("No auth configured.")
164
+
165
+ monkeypatch.setattr(models_foundry.Project, "get", _project_get)
166
+
167
+ with pytest.raises(RuntimeError) as exc_info:
168
+ models_metatables._resolve_local_pod_project()
169
+
170
+ message = str(exc_info.value)
171
+ assert "SDK authentication/authorization failed" in message
172
+ assert f"project {PROJECT_UID!r}" in message
173
+ assert "mainsequence login" in message
174
+ assert "No auth configured." in message
175
+
176
+
177
+ def test_get_session_data_source_reports_missing_project_uid(monkeypatch):
178
+ monkeypatch.delenv("MAIN_SEQUENCE_PROJECT_UID", raising=False)
179
+ monkeypatch.delenv("MAIN_SEQUENCE_PROJECT_ID", raising=False)
180
+ monkeypatch.setattr(models_metatables, "SessionDataSource", models_metatables.PodDataSource())
181
+ monkeypatch.setattr(models_metatables.logger, "debug", lambda message: None)
182
+
183
+ with pytest.raises(RuntimeError) as exc_info:
184
+ models_metatables.get_session_data_source()
185
+
186
+ message = str(exc_info.value)
187
+ assert "Could not resolve a session default data source." in message
188
+ assert "MAIN_SEQUENCE_PROJECT_UID is not configured." in message
189
+ assert "pass data_source_uid explicitly" in message
190
+ assert "This Pod does not have a default data source" not in message
191
+
192
+
157
193
  def test_data_source_create_duckdb_makes_creation_explicit(monkeypatch):
158
194
  captured = {}
159
195
  monkeypatch.setattr(models_metatables, "bios_uuid", lambda: "host-123")
File without changes
File without changes
File without changes