mainsequence 8.1.2__tar.gz → 8.1.3__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-8.1.2/mainsequence.egg-info → mainsequence-8.1.3}/PKG-INFO +1 -1
  2. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/base.py +10 -1
  3. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/models_foundry.py +1 -0
  4. {mainsequence-8.1.2 → mainsequence-8.1.3/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-8.1.2 → mainsequence-8.1.3}/pyproject.toml +1 -1
  6. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_environment_resource_context.py +50 -0
  7. {mainsequence-8.1.2 → mainsequence-8.1.3}/LICENSE +0 -0
  8. {mainsequence-8.1.2 → mainsequence-8.1.3}/MANIFEST.in +0 -0
  9. {mainsequence-8.1.2 → mainsequence-8.1.3}/README.md +0 -0
  10. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/AGENTS.md +0 -0
  11. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  12. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  13. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  14. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  15. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  16. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  17. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  18. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  19. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  20. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  21. {mainsequence-8.1.2 → mainsequence-8.1.3}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  22. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/__init__.py +0 -0
  23. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/__main__.py +0 -0
  24. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/bootstrap.py +0 -0
  25. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/__init__.py +0 -0
  26. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/api.py +0 -0
  27. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/browser_auth.py +0 -0
  28. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/cli.py +0 -0
  29. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/code_repository_status.py +0 -0
  30. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/config.py +0 -0
  31. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/docker_utils.py +0 -0
  32. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/doctor.py +0 -0
  33. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/local_ops.py +0 -0
  34. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/migrations.py +0 -0
  35. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/model_filters.py +0 -0
  36. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/pydantic_cli.py +0 -0
  37. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/sdk_utils.py +0 -0
  38. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/ssh_utils.py +0 -0
  39. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/cli/ui.py +0 -0
  40. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/__init__.py +0 -0
  41. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/agent_runtime_models.py +0 -0
  42. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/client.py +0 -0
  43. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/compute_validation.py +0 -0
  44. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  45. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  46. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  47. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  48. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/dtype_codec.py +0 -0
  49. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/exceptions.py +0 -0
  50. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/metatables/__init__.py +0 -0
  51. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/metatables/core.py +0 -0
  52. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/models_helpers.py +0 -0
  53. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/models_user.py +0 -0
  54. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/observability.py +0 -0
  55. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/client/utils.py +0 -0
  56. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/code_repository_context.py +0 -0
  57. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/code_repository_skills.py +0 -0
  58. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/defaults.py +0 -0
  59. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/instrumentation/__init__.py +0 -0
  60. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/instrumentation/utils.py +0 -0
  61. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/logconf.py +0 -0
  62. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/__init__.py +0 -0
  63. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/__main__.py +0 -0
  64. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  65. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  66. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/future_registry.py +0 -0
  67. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/hashing.py +0 -0
  68. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  69. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  70. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/env.py +0 -0
  71. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/provider.py +0 -0
  72. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/registry.py +0 -0
  73. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  74. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  75. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  76. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  77. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  78. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/schema_names.py +0 -0
  79. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  80. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  81. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  82. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  83. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  84. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  85. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  86. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  87. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  88. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  89. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/repository_identity_security.py +0 -0
  90. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/runtime_flags.py +0 -0
  91. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence/scaffold_skills.py +0 -0
  92. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence.egg-info/SOURCES.txt +0 -0
  93. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence.egg-info/dependency_links.txt +0 -0
  94. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence.egg-info/entry_points.txt +0 -0
  95. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence.egg-info/requires.txt +0 -0
  96. {mainsequence-8.1.2 → mainsequence-8.1.3}/mainsequence.egg-info/top_level.txt +0 -0
  97. {mainsequence-8.1.2 → mainsequence-8.1.3}/setup.cfg +0 -0
  98. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  99. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_auth_precedence.py +0 -0
  100. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_canonical_api_route_contract.py +0 -0
  101. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_cli.py +0 -0
  102. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_cli_browser_auth.py +0 -0
  103. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_cli_migrations.py +0 -0
  104. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_client.py +0 -0
  105. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  106. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_code_repository_branch_contract.py +0 -0
  107. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_code_repository_documentation_contract.py +0 -0
  108. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_code_repository_runtime_context.py +0 -0
  109. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_code_repository_skills.py +0 -0
  110. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_dependency_extras.py +0 -0
  111. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_duckdb_interface_dimensions.py +0 -0
  112. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_environment_response_contracts.py +0 -0
  113. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_filter_normalization.py +0 -0
  114. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_instrumentation.py +0 -0
  115. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_local_ops.py +0 -0
  116. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_logconf.py +0 -0
  117. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_meta_table_migrations.py +0 -0
  118. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_meta_tables_client_models.py +0 -0
  119. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  120. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_models_user_request_bound_auth.py +0 -0
  121. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_notification_uid_contract.py +0 -0
  122. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_observability_client.py +0 -0
  123. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_pod_project_resolution.py +0 -0
  124. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_scaffold_skills.py +0 -0
  125. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_schema_names.py +0 -0
  126. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_secret_client_model.py +0 -0
  127. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_source_table_configuration.py +0 -0
  128. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_sqlite_interface_dimensions.py +0 -0
  129. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_ssh_utils.py +0 -0
  130. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  131. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_dimension_queries.py +0 -0
  132. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_update_configuration.py +0 -0
  133. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_update_configuration_client.py +0 -0
  134. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_update_flow.py +0 -0
  135. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_time_index_table_update_hard_cut.py +0 -0
  136. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_update_runner_uid_runtime.py +0 -0
  137. {mainsequence-8.1.2 → mainsequence-8.1.3}/tests/test_update_statistics.py +0 -0
  138. {mainsequence-8.1.2 → mainsequence-8.1.3}/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.1.2
3
+ Version: 8.1.3
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -130,6 +130,8 @@ class BaseObjectOrm:
130
130
  DESTROY_QUERY_PARAM_DESCRIPTIONS: ClassVar[dict[str, str] | None] = None
131
131
  PUBLIC_LOOKUP_FIELD: ClassVar[str] = "uid"
132
132
  SDK_OWNED_CONTEXT_FIELDS: ClassVar[frozenset[str]] = frozenset()
133
+ # Opt in when collection responses intentionally omit detail-only fields.
134
+ HYDRATE_FILTER_GET_FROM_DETAIL: ClassVar[bool] = False
133
135
 
134
136
  END_POINTS = {
135
137
  "User": "users",
@@ -633,7 +635,14 @@ class BaseObjectOrm:
633
635
  if len(candidates) > 1:
634
636
  raise ApiError(f"Multiple objects returned for {cls.__name__} with filters={filters}")
635
637
 
636
- return candidates[0]
638
+ candidate = candidates[0]
639
+ if cls.HYDRATE_FILTER_GET_FROM_DETAIL:
640
+ return cls.get(
641
+ pk=candidate._public_detail_reference(),
642
+ timeout=timeout,
643
+ )
644
+
645
+ return candidate
637
646
 
638
647
  @classmethod
639
648
  def get_by_uid(cls, uid: str, timeout=None, **filters):
@@ -1083,6 +1083,7 @@ class Secret(
1083
1083
  BasePydanticModel,
1084
1084
  BaseObjectOrm,
1085
1085
  ):
1086
+ HYDRATE_FILTER_GET_FROM_DETAIL: ClassVar[bool] = True
1086
1087
  FILTERSET_FIELDS: ClassVar[dict[str, list[str]]] = {
1087
1088
  "uid": ["in", "exact"],
1088
1089
  "name": ["in", "exact"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.2
3
+ Version: 8.1.3
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.1.2"
7
+ version = "8.1.3"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -55,6 +55,7 @@ def test_environment_resource_reads_use_sdk_owned_scope(monkeypatch):
55
55
  detail = models_module.Secret.get_by_uid(_secret_payload()["uid"])
56
56
 
57
57
  assert listed[0].organization_environment_uid == ENVIRONMENT_UID
58
+ assert listed[0].value is None
58
59
  assert detail.organization_environment_name == "Development"
59
60
  assert requests[0]["payload"]["params"] == {
60
61
  "name": "API_KEY",
@@ -65,6 +66,55 @@ def test_environment_resource_reads_use_sdk_owned_scope(monkeypatch):
65
66
  }
66
67
 
67
68
 
69
+ def test_secret_get_by_name_hydrates_value_from_scoped_detail(monkeypatch):
70
+ requests = []
71
+
72
+ def fake_make_request(**kwargs):
73
+ requests.append(kwargs)
74
+ if kwargs["url"].rstrip("/").endswith("secrets"):
75
+ return _Response([_secret_payload()])
76
+ return _Response(_secret_payload() | {"value": "provider-secret"})
77
+
78
+ monkeypatch.setattr(base_module, "make_request", fake_make_request)
79
+
80
+ secret = models_module.Secret.get(name="API_KEY", timeout=17)
81
+
82
+ assert secret.value is not None
83
+ assert secret.value.get_secret_value() == "provider-secret"
84
+ assert "value" not in secret.model_dump()
85
+ assert len(requests) == 2
86
+ assert requests[0]["payload"]["params"] == {
87
+ "name": "API_KEY",
88
+ "organization_environment_uid": ENVIRONMENT_UID,
89
+ }
90
+ assert requests[1]["url"].endswith(f"/secrets/{_secret_payload()['uid']}/")
91
+ assert requests[1]["payload"]["params"] == {
92
+ "organization_environment_uid": ENVIRONMENT_UID,
93
+ }
94
+ assert [request["time_out"] for request in requests] == [17, 17]
95
+
96
+
97
+ @pytest.mark.parametrize("list_payload", [[], [_secret_payload(), _secret_payload()]])
98
+ def test_secret_get_by_name_preserves_unique_lookup_errors_without_detail_request(
99
+ monkeypatch,
100
+ list_payload,
101
+ ):
102
+ requests = []
103
+
104
+ def fake_make_request(**kwargs):
105
+ requests.append(kwargs)
106
+ return _Response(list_payload)
107
+
108
+ monkeypatch.setattr(base_module, "make_request", fake_make_request)
109
+
110
+ expected_error = base_module.DoesNotExist if not list_payload else base_module.ApiError
111
+ with pytest.raises(expected_error):
112
+ models_module.Secret.get(name="API_KEY")
113
+
114
+ assert len(requests) == 1
115
+ assert requests[0]["url"].rstrip("/").endswith("secrets")
116
+
117
+
68
118
  def test_environment_resource_create_delete_and_detail_actions_are_scoped(monkeypatch):
69
119
  requests = []
70
120
 
File without changes
File without changes
File without changes
File without changes