mainsequence 4.4.10__tar.gz → 4.4.11__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 (161) hide show
  1. {mainsequence-4.4.10/mainsequence.egg-info → mainsequence-4.4.11}/PKG-INFO +1 -1
  2. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/base.py +1 -1
  3. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/metatables/core.py +28 -9
  4. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/models_foundry.py +3 -1
  5. {mainsequence-4.4.10 → mainsequence-4.4.11/mainsequence.egg-info}/PKG-INFO +1 -1
  6. {mainsequence-4.4.10 → mainsequence-4.4.11}/pyproject.toml +1 -1
  7. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_pod_project_resolution.py +38 -0
  8. {mainsequence-4.4.10 → mainsequence-4.4.11}/LICENSE +0 -0
  9. {mainsequence-4.4.10 → mainsequence-4.4.11}/README.md +0 -0
  10. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/AGENTS.md +0 -0
  11. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  12. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  13. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  14. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  15. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  16. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
  17. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
  18. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
  19. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  20. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  21. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  22. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  23. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  24. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  25. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  26. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  27. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  28. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  29. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  30. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  31. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  32. {mainsequence-4.4.10 → mainsequence-4.4.11}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  33. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/__init__.py +0 -0
  34. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/__main__.py +0 -0
  35. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/bootstrap.py +0 -0
  36. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/__init__.py +0 -0
  37. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/api.py +0 -0
  38. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/browser_auth.py +0 -0
  39. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/cli.py +0 -0
  40. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/config.py +0 -0
  41. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/docker_utils.py +0 -0
  42. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/doctor.py +0 -0
  43. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/local_ops.py +0 -0
  44. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/migrations.py +0 -0
  45. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/model_filters.py +0 -0
  46. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/project_status.py +0 -0
  47. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/pydantic_cli.py +0 -0
  48. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/sdk_utils.py +0 -0
  49. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/ssh_utils.py +0 -0
  50. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/cli/ui.py +0 -0
  51. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/__init__.py +0 -0
  52. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/agent_runtime_models.py +0 -0
  53. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/client.py +0 -0
  54. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/__init__.py +0 -0
  55. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/app_component.py +0 -0
  56. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/connections.py +0 -0
  57. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/__init__.py +0 -0
  58. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
  59. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
  60. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
  61. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/tabular.py +0 -0
  62. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/contracts/ui.py +0 -0
  63. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/data_models.py +0 -0
  64. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/providers/__init__.py +0 -0
  65. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
  66. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/__init__.py +0 -0
  67. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/bindings.py +0 -0
  68. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
  69. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/registry.py +0 -0
  70. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/table.py +0 -0
  71. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
  72. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/workspace.py +0 -0
  73. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  74. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
  75. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/workspaces/documents.py +0 -0
  76. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
  77. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/compute_validation.py +0 -0
  78. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  79. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  80. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  81. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  82. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/dtype_codec.py +0 -0
  83. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/exceptions.py +0 -0
  84. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/fastapi/__init__.py +0 -0
  85. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/fastapi/auth.py +0 -0
  86. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/metatables/__init__.py +0 -0
  87. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/models_helpers.py +0 -0
  88. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/models_user.py +0 -0
  89. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/client/utils.py +0 -0
  90. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/defaults.py +0 -0
  91. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/instrumentation/__init__.py +0 -0
  92. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/instrumentation/utils.py +0 -0
  93. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/logconf.py +0 -0
  94. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/__init__.py +0 -0
  95. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/__main__.py +0 -0
  96. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  97. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  98. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  99. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  100. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  101. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  102. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  103. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  104. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  105. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  106. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/future_registry.py +0 -0
  107. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/hashing.py +0 -0
  108. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  109. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  110. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/env.py +0 -0
  111. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/provider.py +0 -0
  112. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/registry.py +0 -0
  113. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  114. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  115. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  116. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  117. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  118. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/schema_names.py +0 -0
  119. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  120. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/runtime_flags.py +0 -0
  121. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence/scaffold_skills.py +0 -0
  122. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence.egg-info/SOURCES.txt +0 -0
  123. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence.egg-info/dependency_links.txt +0 -0
  124. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence.egg-info/entry_points.txt +0 -0
  125. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence.egg-info/requires.txt +0 -0
  126. {mainsequence-4.4.10 → mainsequence-4.4.11}/mainsequence.egg-info/top_level.txt +0 -0
  127. {mainsequence-4.4.10 → mainsequence-4.4.11}/setup.cfg +0 -0
  128. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_auth_precedence.py +0 -0
  129. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_build_operations_hashing.py +0 -0
  130. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_cli.py +0 -0
  131. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_cli_browser_auth.py +0 -0
  132. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_cli_migrations.py +0 -0
  133. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_client.py +0 -0
  134. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_command_center_app_component_models.py +0 -0
  135. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_command_center_data_models.py +0 -0
  136. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_command_center_models.py +0 -0
  137. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_command_center_table_contracts.py +0 -0
  138. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_command_center_tabular_transform.py +0 -0
  139. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  140. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_data_node_storage_dimension_queries.py +0 -0
  141. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_data_node_update_flow.py +0 -0
  142. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_dependency_extras.py +0 -0
  143. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_duckdb_interface_dimensions.py +0 -0
  144. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_filter_normalization.py +0 -0
  145. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_instrumentation.py +0 -0
  146. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_logconf.py +0 -0
  147. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_meta_table_migrations.py +0 -0
  148. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_meta_tables_client_models.py +0 -0
  149. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  150. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_models_user_request_bound_auth.py +0 -0
  151. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_project_batch_jobs_from_file.py +0 -0
  152. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_run_configuration.py +0 -0
  153. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_scaffold_skills.py +0 -0
  154. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_schema_names.py +0 -0
  155. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_secret_client_model.py +0 -0
  156. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_source_table_configuration.py +0 -0
  157. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_sqlite_interface_dimensions.py +0 -0
  158. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_update_runner_uid_runtime.py +0 -0
  159. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_update_statistics.py +0 -0
  160. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_update_uid_guards.py +0 -0
  161. {mainsequence-4.4.10 → mainsequence-4.4.11}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.10
3
+ Version: 4.4.11
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
@@ -89,7 +89,7 @@ class BaseObjectOrm:
89
89
  "DataNodeUpdateDetails": "ts_manager/local_time_serie_update_details",
90
90
  "LocalTimeSerieHistoricalUpdate": "ts_manager/lts_historical_update",
91
91
  "DynamicTableDataSource": "ts_manager/dynamic_table_data_source",
92
- "DataSource": "pods/data_source",
92
+ "DataSource": "connections/data_source",
93
93
  "Project": "pods/projects",
94
94
  "Artifact": "pods/artifact",
95
95
  "Job": "pods/job",
@@ -142,6 +142,7 @@ MetaTableSchemaManagementMode = Literal[
142
142
  "external_registered",
143
143
  ]
144
144
  MetaTableOperation = Literal["select", "insert", "update", "delete", "upsert"]
145
+ StorageAccessMode = Literal["read_write", "read_only", "disabled"]
145
146
  COMPILED_SQL_V1 = "compiled-sql.v1"
146
147
  MetaTableCompiledSQLVersion = Literal["compiled-sql.v1"]
147
148
  MetaTableCompiledSQLDialect = Literal["postgresql"]
@@ -792,6 +793,8 @@ class ManagedMetaTableFinalizeResponse(BasePydanticModel):
792
793
 
793
794
 
794
795
  class DataSource(BasePydanticModel, BaseObjectOrm):
796
+ model_config = ConfigDict(extra="allow")
797
+
795
798
  uid: str | None = Field(
796
799
  None,
797
800
  description="Public uid of the data source.",
@@ -801,7 +804,7 @@ class DataSource(BasePydanticModel, BaseObjectOrm):
801
804
  description="Compatibility alias for the public data source uid.",
802
805
  )
803
806
  id: int | None = Field(None, description="The unique identifier of the Local Disk Source Lake")
804
- display_name: str
807
+ display_name: str | None = None
805
808
  organization: int | None = Field(
806
809
  None, description="The unique identifier of the Local Disk Source Lake"
807
810
  )
@@ -809,11 +812,26 @@ class DataSource(BasePydanticModel, BaseObjectOrm):
809
812
  None,
810
813
  description="Public uid of the owning organization.",
811
814
  )
812
- class_type: str
813
- status: str
815
+ class_type: str | None = None
816
+ status: str | None = None
817
+ storage_access_mode: StorageAccessMode | None = Field(
818
+ default="read_write",
819
+ description="Runtime storage access gate: read_write, read_only, or disabled.",
820
+ )
814
821
  extra_arguments: dict | None = None
815
822
 
816
823
  STATUS_AVAILABLE: ClassVar[str] = "AVAILABLE"
824
+ STORAGE_ACCESS_MODE_READ_WRITE: ClassVar[str] = "read_write"
825
+ STORAGE_ACCESS_MODE_READ_ONLY: ClassVar[str] = "read_only"
826
+ STORAGE_ACCESS_MODE_DISABLED: ClassVar[str] = "disabled"
827
+
828
+ @property
829
+ def allows_runtime_reads(self) -> bool:
830
+ return self.storage_access_mode in {"read_write", "read_only"}
831
+
832
+ @property
833
+ def allows_runtime_writes(self) -> bool:
834
+ return self.storage_access_mode == "read_write"
817
835
 
818
836
  @classmethod
819
837
  def get_or_create_duck_db(cls, time_out=None, *args, **kwargs):
@@ -1019,6 +1037,8 @@ class DataSource(BasePydanticModel, BaseObjectOrm):
1019
1037
 
1020
1038
 
1021
1039
  class DynamicTableDataSource(BasePydanticModel, BaseObjectOrm):
1040
+ model_config = ConfigDict(extra="allow", use_enum_values=True)
1041
+
1022
1042
  uid: str | None = Field(
1023
1043
  None,
1024
1044
  description="Public uid of the dynamic table data source.",
@@ -1027,15 +1047,14 @@ class DynamicTableDataSource(BasePydanticModel, BaseObjectOrm):
1027
1047
  None,
1028
1048
  description="Backend numeric row identifier of the time-indexed data source.",
1029
1049
  )
1030
- related_resource: DataSource
1031
- related_resource_class_type: str
1032
-
1033
- class Config:
1034
- use_enum_values = True
1050
+ related_resource: DataSource | None = None
1051
+ related_resource_class_type: str | None = None
1035
1052
 
1036
1053
  def model_dump_json(self, **json_dumps_kwargs) -> str:
1037
1054
  dump = self.model_dump()
1038
- dump["related_resource"] = self.related_resource.model_dump()
1055
+ dump["related_resource"] = (
1056
+ self.related_resource.model_dump() if self.related_resource is not None else None
1057
+ )
1039
1058
  return json.dumps(dump, **json_dumps_kwargs)
1040
1059
 
1041
1060
  def _public_uid(self) -> str:
@@ -10,7 +10,7 @@ from uuid import UUID
10
10
  import pandas as pd
11
11
  import yaml
12
12
  from cachetools import TTLCache, cachedmethod
13
- from pydantic import Field, SecretStr
13
+ from pydantic import ConfigDict, Field, SecretStr
14
14
 
15
15
  from mainsequence.logconf import logger
16
16
 
@@ -143,6 +143,8 @@ class ProjectQuickSearchResult(BasePydanticModel):
143
143
 
144
144
 
145
145
  class Project(LabelableObjectMixin, ShareableObjectMixin, BasePydanticModel, BaseObjectOrm):
146
+ model_config = ConfigDict(extra="allow")
147
+
146
148
  FILTERSET_FIELDS: ClassVar[dict[str, list[str]]] = {
147
149
  "project_name": ["in", "exact", "contains"],
148
150
  "uid": ["in", "exact"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.10
3
+ Version: 4.4.11
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.4.10"
7
+ version = "4.4.11"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -25,6 +25,7 @@ def _project_payload_public() -> dict:
25
25
  "project_name": "Markets Repository",
26
26
  "data_source": {
27
27
  "uid": DATA_SOURCE_UID,
28
+ "backend_can_add_fields": "ignored",
28
29
  "related_resource": {
29
30
  "uid": DATA_SOURCE_UID,
30
31
  "data_source_uid": DATA_SOURCE_UID,
@@ -32,6 +33,8 @@ def _project_payload_public() -> dict:
32
33
  "organization_uid": ORGANIZATION_UID,
33
34
  "class_type": "timescale_db_remote",
34
35
  "status": "AVAILABLE",
36
+ "storage_access_mode": "read_write",
37
+ "backend_can_add_nested_fields": "ignored",
35
38
  },
36
39
  "related_resource_class_type": "timescale_db_remote",
37
40
  },
@@ -39,6 +42,7 @@ def _project_payload_public() -> dict:
39
42
  "is_initialized": True,
40
43
  "created_by": "user-4",
41
44
  "labels": ["markets"],
45
+ "backend_can_add_project_fields": "ignored",
42
46
  }
43
47
 
44
48
 
@@ -53,6 +57,40 @@ def test_project_deserializes_public_uid_serializer_payload():
53
57
  assert project.data_source.related_resource.data_source_uid == DATA_SOURCE_UID
54
58
  assert project.data_source.related_resource.organization_uid == ORGANIZATION_UID
55
59
  assert project.data_source.related_resource.class_type == "timescale_db_remote"
60
+ assert project.data_source.related_resource.storage_access_mode == "read_write"
61
+ assert project.data_source.related_resource.allows_runtime_reads is True
62
+ assert project.data_source.related_resource.allows_runtime_writes is True
63
+
64
+
65
+ def test_project_deserializes_nullable_datasource_related_resource_edge_case():
66
+ payload = _project_payload_public()
67
+ payload["data_source"]["related_resource"] = {
68
+ "uid": None,
69
+ "data_source_uid": None,
70
+ "display_name": None,
71
+ "organization_uid": None,
72
+ "class_type": None,
73
+ "status": None,
74
+ "storage_access_mode": None,
75
+ }
76
+
77
+ project = models_foundry.Project(**payload)
78
+
79
+ assert project.data_source is not None
80
+ assert project.data_source.related_resource is not None
81
+ assert project.data_source.related_resource.storage_access_mode is None
82
+ assert project.data_source.related_resource.allows_runtime_reads is False
83
+ assert project.data_source.related_resource.allows_runtime_writes is False
84
+
85
+
86
+ def test_project_deserializes_null_datasource_related_resource_edge_case():
87
+ payload = _project_payload_public()
88
+ payload["data_source"]["related_resource"] = None
89
+
90
+ project = models_foundry.Project(**payload)
91
+
92
+ assert project.data_source is not None
93
+ assert project.data_source.related_resource is None
56
94
 
57
95
 
58
96
  def test_data_node_update_get_or_create_uses_current_project_uid(monkeypatch):
File without changes
File without changes
File without changes