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.
- {mainsequence-3.18.6 → mainsequence-3.18.7}/PKG-INFO +1 -1
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_tdag.py +53 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-3.18.6 → mainsequence-3.18.7}/pyproject.toml +1 -1
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_filter_normalization.py +124 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/LICENSE +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/README.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/__main__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/bootstrap.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/api.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/cli.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/config.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/cli/ui.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/agent.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/base.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/client.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_simple_tables.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_user.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/models_vam.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/compute_validation.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/defaults.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/data_interface/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/data_interface/data_interface.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/base_instrument.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/bond.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/callability.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/json_codec.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/position.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/ql_fields.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/indices.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/settings.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/logconf.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/__main__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/base_persist_managers.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/config.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/configuration_models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/filters.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/filters.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/future_registry.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/pydantic_metadata.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/filters.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/schema.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/enums.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/utils.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/setup.cfg +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_auth_precedence.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_cli.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_client.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_command_center_models.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_dependency_extras.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_instruments.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_logconf.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_logged_user_components.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_run_configuration.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_simple_tables_configuration_hashing.py +0 -0
- {mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_simple_tables_persistence.py +0 -0
|
@@ -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(
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/dashboards/streamlit/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/agent_scaffold/skills/maintenance/local_journal/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/app_component.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/data_models.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/command_center/workspace_snapshot.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/duckdb.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/client/data_sources_interfaces/timescale.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/config.toml
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/favicon.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/assets/logo.png
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/components/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/dashboards/streamlit/pages/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/data_interface/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/base_instrument.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/callability.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/json_codec.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/position.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/instruments/ql_fields.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/nodes.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/interest_rates/etl/registry.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/bond_pricer.py
RENAMED
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/indices.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/instruments/pricing_models/swap_pricer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/build_operations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/data_nodes/persist_managers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/tdag/simple_tables/persist_managers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/contrib/prices/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/mainsequence/virtualfundbuilder/portfolio_nodes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_command_center_app_component_models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.6 → mainsequence-3.18.7}/tests/test_simple_tables_configuration_hashing.py
RENAMED
|
File without changes
|
|
File without changes
|