mainsequence 3.18.6__tar.gz → 3.18.7__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 (179) hide show
  1. {mainsequence-3.18.6 → mainsequence-3.18.7}/PKG-INFO +1 -1
  2. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_tdag.py +53 -0
  3. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/PKG-INFO +1 -1
  4. {mainsequence-3.18.6 → mainsequence-3.18.7}/pyproject.toml +1 -1
  5. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_filter_normalization.py +124 -0
  6. {mainsequence-3.18.6 → mainsequence-3.18.7}/LICENSE +0 -0
  7. {mainsequence-3.18.6 → mainsequence-3.18.7}/README.md +0 -0
  8. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/AGENTS.md +0 -0
  9. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  10. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  11. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  12. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  13. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  14. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  15. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  16. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  17. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
  18. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  19. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
  20. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
  21. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
  22. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
  23. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  24. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  25. {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  26. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/__init__.py +0 -0
  27. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/__main__.py +0 -0
  28. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/bootstrap.py +0 -0
  29. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/__init__.py +0 -0
  30. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/api.py +0 -0
  31. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/browser_auth.py +0 -0
  32. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/cli.py +0 -0
  33. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/config.py +0 -0
  34. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/docker_utils.py +0 -0
  35. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/doctor.py +0 -0
  36. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/local_ops.py +0 -0
  37. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/model_filters.py +0 -0
  38. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/project_status.py +0 -0
  39. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/pydantic_cli.py +0 -0
  40. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/sdk_utils.py +0 -0
  41. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/ssh_utils.py +0 -0
  42. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/ui.py +0 -0
  43. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/__init__.py +0 -0
  44. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/agent.py +0 -0
  45. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/agent_runtime_models.py +0 -0
  46. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/base.py +0 -0
  47. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/client.py +0 -0
  48. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/__init__.py +0 -0
  49. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/app_component.py +0 -0
  50. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/data_models.py +0 -0
  51. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/workspace.py +0 -0
  52. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  53. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  54. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  55. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
  56. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/exceptions.py +0 -0
  57. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/fastapi/__init__.py +0 -0
  58. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/fastapi/auth.py +0 -0
  59. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_helpers.py +0 -0
  60. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_simple_tables.py +0 -0
  61. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_user.py +0 -0
  62. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_vam.py +0 -0
  63. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/utils.py +0 -0
  64. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/compute_validation.py +0 -0
  65. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/__init__.py +0 -0
  66. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/__init__.py +0 -0
  67. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
  68. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
  69. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
  70. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
  71. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
  72. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
  73. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
  74. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
  75. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
  76. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
  77. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
  78. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
  79. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
  80. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
  81. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
  82. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
  83. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
  84. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
  85. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/defaults.py +0 -0
  86. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instrumentation/__init__.py +0 -0
  87. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instrumentation/utils.py +0 -0
  88. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/__init__.py +0 -0
  89. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/data_interface/__init__.py +0 -0
  90. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/data_interface/data_interface.py +0 -0
  91. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/__init__.py +0 -0
  92. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/base_instrument.py +0 -0
  93. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/bond.py +0 -0
  94. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/callability.py +0 -0
  95. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
  96. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/json_codec.py +0 -0
  97. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/position.py +0 -0
  98. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/ql_fields.py +0 -0
  99. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/__init__.py +0 -0
  100. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
  101. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
  102. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
  103. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
  104. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/__init__.py +0 -0
  105. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
  106. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/indices.py +0 -0
  107. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
  108. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
  109. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/settings.py +0 -0
  110. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/utils.py +0 -0
  111. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/logconf.py +0 -0
  112. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/runtime_flags.py +0 -0
  113. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/__init__.py +0 -0
  114. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/__main__.py +0 -0
  115. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/base_persist_managers.py +0 -0
  116. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/config.py +0 -0
  117. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/configuration_models.py +0 -0
  118. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  119. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  120. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  121. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/filters.py +0 -0
  122. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/models.py +0 -0
  123. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  124. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  125. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  126. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/utils.py +0 -0
  127. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/filters.py +0 -0
  128. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/future_registry.py +0 -0
  129. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/pydantic_metadata.py +0 -0
  130. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/__init__.py +0 -0
  131. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/filters.py +0 -0
  132. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/models.py +0 -0
  133. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
  134. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/schema.py +0 -0
  135. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
  136. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/utils.py +0 -0
  137. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/__init__.py +0 -0
  138. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
  139. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
  140. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
  141. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
  142. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
  143. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
  144. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
  145. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
  146. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
  147. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
  148. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
  149. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
  150. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/enums.py +0 -0
  151. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/models.py +0 -0
  152. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
  153. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
  154. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
  155. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
  156. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/utils.py +0 -0
  157. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/SOURCES.txt +0 -0
  158. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/dependency_links.txt +0 -0
  159. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/entry_points.txt +0 -0
  160. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/requires.txt +0 -0
  161. {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/top_level.txt +0 -0
  162. {mainsequence-3.18.6 → mainsequence-3.18.7}/setup.cfg +0 -0
  163. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_auth_precedence.py +0 -0
  164. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_build_operations_hashing.py +0 -0
  165. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_cli.py +0 -0
  166. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_cli_browser_auth.py +0 -0
  167. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_client.py +0 -0
  168. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_command_center_app_component_models.py +0 -0
  169. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_command_center_models.py +0 -0
  170. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_dependency_extras.py +0 -0
  171. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_instruments.py +0 -0
  172. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_logconf.py +0 -0
  173. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_logged_user_components.py +0 -0
  174. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_models_user_request_bound_auth.py +0 -0
  175. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_pod_project_resolution.py +0 -0
  176. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_project_batch_jobs_from_file.py +0 -0
  177. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_run_configuration.py +0 -0
  178. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_simple_tables_configuration_hashing.py +0 -0
  179. {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_simple_tables_persistence.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.18.6
3
+ Version: 3.18.7
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
@@ -1167,6 +1167,59 @@ class DataNodeStorage(AbstractTable, LabelableObjectMixin, ShareableObjectMixin,
1167
1167
 
1168
1168
  return r.json() if r.content else None
1169
1169
 
1170
+ def delete_after_date(
1171
+ self,
1172
+ after_date: str | datetime.datetime,
1173
+ *,
1174
+ unique_identifier: str | None = None,
1175
+ unique_identifier_list: list[str] | None = None,
1176
+ timeout: int | None = None,
1177
+ ) -> dict[str, Any]:
1178
+ """
1179
+ Delete rows at or after a cutoff timestamp from this dynamic table.
1180
+
1181
+ This is a backend tail-delete operation:
1182
+
1183
+ - it hits `POST /orm/api/ts_manager/dynamic_table/{id}/delete_after_date/`
1184
+ - `after_date` is the inclusive cutoff
1185
+ - there is no `end_date`; this is not arbitrary range deletion
1186
+ - for multi-index tables, pass either `unique_identifier` for one
1187
+ identifier or `unique_identifier_list` for multiple identifiers to
1188
+ scope the tail delete
1189
+
1190
+ The authenticated user must have edit access to this DynamicTableMetaData.
1191
+
1192
+ The returned payload contains the authoritative post-delete table stats,
1193
+ including `deleted_count`, `table_empty`, and index metadata. Consumers
1194
+ can use those stats to update visible table metadata or refetch the table
1195
+ detail after the delete.
1196
+ """
1197
+ if self.id is None:
1198
+ raise ValueError("DataNodeStorage must have an id before deleting rows after a date.")
1199
+ if unique_identifier is not None and unique_identifier_list is not None:
1200
+ raise ValueError("Pass either unique_identifier or unique_identifier_list, not both.")
1201
+
1202
+ payload_body: dict[str, Any] = {
1203
+ "after_date": after_date.isoformat() if isinstance(after_date, datetime.datetime) else after_date
1204
+ }
1205
+ if unique_identifier is not None:
1206
+ payload_body["unique_identifier"] = unique_identifier
1207
+ if unique_identifier_list is not None:
1208
+ payload_body["unique_identifier_list"] = unique_identifier_list
1209
+
1210
+ cls = type(self)
1211
+ url = f"{cls.get_object_url()}/{self.id}/delete_after_date/"
1212
+ r = make_request(
1213
+ s=cls.build_session(),
1214
+ loaders=cls.LOADERS,
1215
+ r_type="POST",
1216
+ url=url,
1217
+ payload={"json": payload_body},
1218
+ time_out=timeout,
1219
+ )
1220
+ raise_for_response(r, payload=payload_body)
1221
+ return r.json()
1222
+
1170
1223
  def delete_table(self):
1171
1224
  data_source = PodDataSource._get_duck_db()
1172
1225
  duckdb_dynamic_data_source = DynamicTableDataSource.get_or_create_duck_db(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.18.6
3
+ Version: 3.18.7
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 = "3.18.6"
7
+ version = "3.18.7"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -214,6 +214,130 @@ def test_simple_table_storage_normalizes_namespace_filters():
214
214
  }
215
215
 
216
216
 
217
+ def test_data_node_storage_delete_after_date_posts_tail_delete(monkeypatch):
218
+ from mainsequence.client import models_tdag
219
+
220
+ captured = {}
221
+
222
+ class FakeResponse:
223
+ status_code = 200
224
+ content = b'{"ok": true}'
225
+
226
+ @staticmethod
227
+ def json():
228
+ return {
229
+ "ok": True,
230
+ "dynamic_table_id": 714,
231
+ "deleted_count": 123,
232
+ "table_empty": False,
233
+ "unique_identifier_list": ["AAPL", "MSFT"],
234
+ "stats": {
235
+ "last_time_index_value": "2026-03-31T23:59:00Z",
236
+ "earliest_index_value": "2024-01-01T00:00:00Z",
237
+ "multi_index_stats": None,
238
+ "multi_index_column_stats": None,
239
+ },
240
+ }
241
+
242
+ def _fake_make_request(*, s, loaders, r_type, url, payload, time_out=None):
243
+ captured["r_type"] = r_type
244
+ captured["url"] = url
245
+ captured["payload"] = payload
246
+ captured["timeout"] = time_out
247
+ return FakeResponse()
248
+
249
+ monkeypatch.setattr(models_tdag, "make_request", _fake_make_request)
250
+ monkeypatch.setattr(models_tdag.DataNodeStorage, "build_session", classmethod(lambda cls: object()))
251
+
252
+ storage = models_tdag.DataNodeStorage(
253
+ id=714,
254
+ storage_hash="prices_hash",
255
+ data_source=1,
256
+ source_class_name="PricesNode",
257
+ creation_date="2026-04-01T00:00:00Z",
258
+ )
259
+
260
+ result = storage.delete_after_date(
261
+ "2026-04-01T00:00:00Z",
262
+ unique_identifier_list=["AAPL", "MSFT"],
263
+ timeout=30,
264
+ )
265
+
266
+ assert result["ok"] is True
267
+ assert result["deleted_count"] == 123
268
+ assert captured == {
269
+ "r_type": "POST",
270
+ "url": f"{models_tdag.DataNodeStorage.get_object_url()}/714/delete_after_date/",
271
+ "payload": {
272
+ "json": {
273
+ "after_date": "2026-04-01T00:00:00Z",
274
+ "unique_identifier_list": ["AAPL", "MSFT"],
275
+ }
276
+ },
277
+ "timeout": 30,
278
+ }
279
+
280
+
281
+ def test_data_node_storage_delete_after_date_accepts_one_identifier(monkeypatch):
282
+ from mainsequence.client import models_tdag
283
+
284
+ captured = {}
285
+
286
+ class FakeResponse:
287
+ status_code = 200
288
+ content = b'{"ok": true}'
289
+
290
+ @staticmethod
291
+ def json():
292
+ return {"ok": True, "dynamic_table_id": 714, "deleted_count": 1}
293
+
294
+ def _fake_make_request(*, s, loaders, r_type, url, payload, time_out=None):
295
+ captured["payload"] = payload
296
+ return FakeResponse()
297
+
298
+ monkeypatch.setattr(models_tdag, "make_request", _fake_make_request)
299
+ monkeypatch.setattr(models_tdag.DataNodeStorage, "build_session", classmethod(lambda cls: object()))
300
+
301
+ storage = models_tdag.DataNodeStorage(
302
+ id=714,
303
+ storage_hash="prices_hash",
304
+ data_source=1,
305
+ source_class_name="PricesNode",
306
+ creation_date="2026-04-01T00:00:00Z",
307
+ )
308
+
309
+ storage.delete_after_date(
310
+ datetime.datetime(2026, 4, 1, 0, 0, tzinfo=datetime.UTC),
311
+ unique_identifier="AAPL",
312
+ )
313
+
314
+ assert captured["payload"] == {
315
+ "json": {
316
+ "after_date": "2026-04-01T00:00:00+00:00",
317
+ "unique_identifier": "AAPL",
318
+ }
319
+ }
320
+
321
+
322
+ def test_data_node_storage_delete_after_date_rejects_both_identifier_shapes():
323
+ from mainsequence.client.models_tdag import DataNodeStorage
324
+
325
+ storage = DataNodeStorage(
326
+ id=714,
327
+ storage_hash="prices_hash",
328
+ data_source=1,
329
+ source_class_name="PricesNode",
330
+ creation_date="2026-04-01T00:00:00Z",
331
+ )
332
+
333
+ with pytest.raises(ValueError, match="either unique_identifier or unique_identifier_list"):
334
+ storage.delete_after_date(
335
+ "2026-04-01T00:00:00Z",
336
+ unique_identifier="AAPL",
337
+ unique_identifier_list=["AAPL"],
338
+ )
339
+
340
+
217
341
  def test_data_node_update_normalizes_related_table_namespace_filters():
218
342
  from mainsequence.client.models_tdag import DataNodeUpdate
219
343
 
File without changes
File without changes
File without changes