mainsequence 4.0.13__tar.gz → 4.0.14__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 (126) hide show
  1. {mainsequence-4.0.13 → mainsequence-4.0.14}/PKG-INFO +1 -1
  2. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/models_tdag.py +1 -1
  3. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/data_nodes.py +5 -0
  4. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/PKG-INFO +1 -1
  5. {mainsequence-4.0.13 → mainsequence-4.0.14}/pyproject.toml +1 -1
  6. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_update_statistics.py +52 -0
  7. {mainsequence-4.0.13 → mainsequence-4.0.14}/LICENSE +0 -0
  8. {mainsequence-4.0.13 → mainsequence-4.0.14}/README.md +0 -0
  9. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/AGENTS.md +0 -0
  10. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  11. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  12. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  13. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  14. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  15. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  16. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  17. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  18. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  19. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  20. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  21. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  22. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  23. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  24. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  25. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  26. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  27. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  28. {mainsequence-4.0.13 → mainsequence-4.0.14}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  29. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/__init__.py +0 -0
  30. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/__main__.py +0 -0
  31. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/bootstrap.py +0 -0
  32. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/__init__.py +0 -0
  33. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/api.py +0 -0
  34. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/browser_auth.py +0 -0
  35. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/cli.py +0 -0
  36. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/config.py +0 -0
  37. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/docker_utils.py +0 -0
  38. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/doctor.py +0 -0
  39. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/local_ops.py +0 -0
  40. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/model_filters.py +0 -0
  41. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/project_status.py +0 -0
  42. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/pydantic_cli.py +0 -0
  43. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/sdk_utils.py +0 -0
  44. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/ssh_utils.py +0 -0
  45. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/cli/ui.py +0 -0
  46. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/__init__.py +0 -0
  47. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/agent_runtime_models.py +0 -0
  48. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/base.py +0 -0
  49. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/client.py +0 -0
  50. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/__init__.py +0 -0
  51. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/app_component.py +0 -0
  52. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/connections.py +0 -0
  53. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/data_models.py +0 -0
  54. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/workspace.py +0 -0
  55. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  56. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  57. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  58. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  59. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/exceptions.py +0 -0
  60. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/fastapi/__init__.py +0 -0
  61. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/fastapi/auth.py +0 -0
  62. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/models_helpers.py +0 -0
  63. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/models_metatables.py +0 -0
  64. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/models_user.py +0 -0
  65. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/client/utils.py +0 -0
  66. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/compute_validation.py +0 -0
  67. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/defaults.py +0 -0
  68. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/instrumentation/__init__.py +0 -0
  69. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/instrumentation/utils.py +0 -0
  70. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/logconf.py +0 -0
  71. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/runtime_flags.py +0 -0
  72. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/__init__.py +0 -0
  73. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/__main__.py +0 -0
  74. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/base_persist_managers.py +0 -0
  75. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/config.py +0 -0
  76. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/configuration_models.py +0 -0
  77. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  78. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  79. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/filters.py +0 -0
  80. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/models.py +0 -0
  81. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  82. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  83. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  84. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/data_nodes/utils.py +0 -0
  85. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/filters.py +0 -0
  86. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/future_registry.py +0 -0
  87. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/meta_tables/__init__.py +0 -0
  88. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/meta_tables/compiled_sql.py +0 -0
  89. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/meta_tables/hashing.py +0 -0
  90. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/meta_tables/sqlalchemy_contracts.py +0 -0
  91. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/pydantic_metadata.py +0 -0
  92. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence/tdag/utils.py +0 -0
  93. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-4.0.13 → mainsequence-4.0.14}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-4.0.13 → mainsequence-4.0.14}/setup.cfg +0 -0
  99. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_auth_precedence.py +0 -0
  100. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_build_operations_hashing.py +0 -0
  101. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_cli.py +0 -0
  102. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_cli_browser_auth.py +0 -0
  103. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_client.py +0 -0
  104. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_command_center_app_component_models.py +0 -0
  105. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_command_center_data_models.py +0 -0
  106. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_command_center_models.py +0 -0
  107. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  108. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_data_node_search_join_filters.py +0 -0
  109. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_data_node_storage_dimension_queries.py +0 -0
  110. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_data_node_update_flow.py +0 -0
  111. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_filter_normalization.py +0 -0
  114. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_logconf.py +0 -0
  115. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_meta_tables_client_models.py +0 -0
  116. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  117. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_models_user_request_bound_auth.py +0 -0
  118. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_pod_project_resolution.py +0 -0
  119. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_project_batch_jobs_from_file.py +0 -0
  120. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_run_configuration.py +0 -0
  121. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_secret_client_model.py +0 -0
  122. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_source_table_configuration.py +0 -0
  123. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_sqlite_interface_dimensions.py +0 -0
  124. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_update_runner_uid_runtime.py +0 -0
  125. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_update_uid_guards.py +0 -0
  126. {mainsequence-4.0.13 → mainsequence-4.0.14}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.0.13
3
+ Version: 4.0.14
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
@@ -2866,7 +2866,7 @@ class UpdateStatistics(BaseUpdateStatistics):
2866
2866
  return dimension_range_map
2867
2867
 
2868
2868
  def get_last_update_for_identity(self, identity_value):
2869
- return self._progress_stats()[identity_value] or self._initial_fallback_date
2869
+ return self._progress_stats().get(identity_value)
2870
2870
 
2871
2871
  def get_earliest_update_for_identity(self, identity_value):
2872
2872
  stats = self._progress_stats().get(identity_value)
@@ -987,8 +987,13 @@ class DataNode(DataAccessMixin, ABC):
987
987
  """
988
988
  return self.data_node_storage.sourcetableconfiguration.get_data_updates()
989
989
 
990
+ def prepare_update_statistics(self, update_statistics: UpdateStatistics) -> UpdateStatistics:
991
+ """Hook for subclasses to scope or enrich update statistics before update()."""
992
+ return update_statistics
993
+
990
994
  def _set_update_statistics(self, update_statistics: UpdateStatistics) -> UpdateStatistics:
991
995
  """Attach generic update statistics."""
996
+ update_statistics = self.prepare_update_statistics(update_statistics)
992
997
  self.update_statistics = update_statistics
993
998
  return update_statistics
994
999
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.0.13
3
+ Version: 4.0.14
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.0.13"
7
+ version = "4.0.14"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,6 +5,7 @@ import pytest
5
5
  from pydantic import ValidationError
6
6
 
7
7
  from mainsequence.client.models_tdag import UpdateStatistics
8
+ from mainsequence.tdag.data_nodes.data_nodes import DataNode
8
9
 
9
10
 
10
11
  def _dt(hour: int) -> datetime.datetime:
@@ -81,6 +82,57 @@ def test_update_statistics_two_index_normalizes_progress():
81
82
  assert stats.index_progress["asset-3"] == _dt(3)
82
83
 
83
84
 
85
+ def test_update_statistics_missing_identity_has_no_last_update():
86
+ stats = UpdateStatistics(index_progress={"asset-1": "2026-05-01T02:00:00Z"})
87
+ stats._initial_fallback_date = _dt(0)
88
+
89
+ assert stats.get_last_update_for_identity("asset-2") is None
90
+
91
+
92
+ def test_base_data_node_attaches_update_statistics_without_forcing_fallback_date():
93
+ class ExampleNode(DataNode):
94
+ OFFSET_START = _dt(0)
95
+
96
+ def dependencies(self):
97
+ return {}
98
+
99
+ def update(self):
100
+ return None
101
+
102
+ node = object.__new__(ExampleNode)
103
+ stats = UpdateStatistics(index_progress={})
104
+
105
+ returned = node._set_update_statistics(stats)
106
+
107
+ assert returned is stats
108
+ assert node.update_statistics is stats
109
+ assert stats._initial_fallback_date is None
110
+
111
+
112
+ def test_base_data_node_update_statistics_prepare_hook_can_set_fallback_date():
113
+ class ExampleNode(DataNode):
114
+ OFFSET_START = _dt(0)
115
+
116
+ def prepare_update_statistics(self, update_statistics):
117
+ update_statistics._initial_fallback_date = self.get_offset_start()
118
+ return update_statistics
119
+
120
+ def dependencies(self):
121
+ return {}
122
+
123
+ def update(self):
124
+ return None
125
+
126
+ node = object.__new__(ExampleNode)
127
+ stats = UpdateStatistics(index_progress={})
128
+
129
+ returned = node._set_update_statistics(stats)
130
+
131
+ assert returned is stats
132
+ assert node.update_statistics is stats
133
+ assert stats._initial_fallback_date == _dt(0)
134
+
135
+
84
136
  def test_update_statistics_builds_canonical_dimension_range_map_for_nested_progress():
85
137
  stats = UpdateStatistics(
86
138
  index_progress={
File without changes
File without changes
File without changes