mainsequence 4.0.12__tar.gz → 4.0.13__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.12 → mainsequence-4.0.13}/PKG-INFO +1 -1
  2. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/build_operations.py +14 -2
  3. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/PKG-INFO +1 -1
  4. {mainsequence-4.0.12 → mainsequence-4.0.13}/pyproject.toml +1 -1
  5. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_build_operations_hashing.py +19 -0
  6. {mainsequence-4.0.12 → mainsequence-4.0.13}/LICENSE +0 -0
  7. {mainsequence-4.0.12 → mainsequence-4.0.13}/README.md +0 -0
  8. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/AGENTS.md +0 -0
  9. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  10. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  11. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  12. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  13. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  14. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  15. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  16. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  17. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  18. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  19. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  20. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  21. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  22. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  23. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  24. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  25. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  26. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  27. {mainsequence-4.0.12 → mainsequence-4.0.13}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  28. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/__init__.py +0 -0
  29. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/__main__.py +0 -0
  30. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/bootstrap.py +0 -0
  31. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/__init__.py +0 -0
  32. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/api.py +0 -0
  33. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/browser_auth.py +0 -0
  34. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/cli.py +0 -0
  35. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/config.py +0 -0
  36. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/docker_utils.py +0 -0
  37. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/doctor.py +0 -0
  38. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/local_ops.py +0 -0
  39. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/model_filters.py +0 -0
  40. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/project_status.py +0 -0
  41. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/pydantic_cli.py +0 -0
  42. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/sdk_utils.py +0 -0
  43. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/ssh_utils.py +0 -0
  44. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/cli/ui.py +0 -0
  45. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/__init__.py +0 -0
  46. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/agent_runtime_models.py +0 -0
  47. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/base.py +0 -0
  48. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/client.py +0 -0
  49. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/__init__.py +0 -0
  50. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/app_component.py +0 -0
  51. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/connections.py +0 -0
  52. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/data_models.py +0 -0
  53. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/workspace.py +0 -0
  54. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  55. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  56. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  57. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  58. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/exceptions.py +0 -0
  59. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/fastapi/__init__.py +0 -0
  60. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/fastapi/auth.py +0 -0
  61. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/models_helpers.py +0 -0
  62. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/models_metatables.py +0 -0
  63. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/models_tdag.py +0 -0
  64. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/models_user.py +0 -0
  65. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/client/utils.py +0 -0
  66. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/compute_validation.py +0 -0
  67. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/defaults.py +0 -0
  68. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/instrumentation/__init__.py +0 -0
  69. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/instrumentation/utils.py +0 -0
  70. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/logconf.py +0 -0
  71. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/runtime_flags.py +0 -0
  72. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/__init__.py +0 -0
  73. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/__main__.py +0 -0
  74. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/base_persist_managers.py +0 -0
  75. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/config.py +0 -0
  76. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/configuration_models.py +0 -0
  77. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  78. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  79. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/filters.py +0 -0
  80. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/models.py +0 -0
  81. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  82. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  83. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  84. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/data_nodes/utils.py +0 -0
  85. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/filters.py +0 -0
  86. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/future_registry.py +0 -0
  87. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/meta_tables/__init__.py +0 -0
  88. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/meta_tables/compiled_sql.py +0 -0
  89. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/meta_tables/hashing.py +0 -0
  90. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/meta_tables/sqlalchemy_contracts.py +0 -0
  91. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/pydantic_metadata.py +0 -0
  92. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence/tdag/utils.py +0 -0
  93. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-4.0.12 → mainsequence-4.0.13}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-4.0.12 → mainsequence-4.0.13}/setup.cfg +0 -0
  99. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_auth_precedence.py +0 -0
  100. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_cli.py +0 -0
  101. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_cli_browser_auth.py +0 -0
  102. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_client.py +0 -0
  103. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_command_center_app_component_models.py +0 -0
  104. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_command_center_data_models.py +0 -0
  105. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_command_center_models.py +0 -0
  106. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  107. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_data_node_search_join_filters.py +0 -0
  108. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_data_node_storage_dimension_queries.py +0 -0
  109. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_data_node_update_flow.py +0 -0
  110. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_dependency_extras.py +0 -0
  111. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_duckdb_interface_dimensions.py +0 -0
  112. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_filter_normalization.py +0 -0
  113. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_logconf.py +0 -0
  114. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_meta_tables_client_models.py +0 -0
  115. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  116. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_models_user_request_bound_auth.py +0 -0
  117. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_pod_project_resolution.py +0 -0
  118. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_project_batch_jobs_from_file.py +0 -0
  119. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_run_configuration.py +0 -0
  120. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_secret_client_model.py +0 -0
  121. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_source_table_configuration.py +0 -0
  122. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_sqlite_interface_dimensions.py +0 -0
  123. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_update_runner_uid_runtime.py +0 -0
  124. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_update_statistics.py +0 -0
  125. {mainsequence-4.0.12 → mainsequence-4.0.13}/tests/test_update_uid_guards.py +0 -0
  126. {mainsequence-4.0.12 → mainsequence-4.0.13}/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.12
3
+ Version: 4.0.13
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
@@ -41,6 +41,9 @@ if TYPE_CHECKING:
41
41
 
42
42
  build_model = lambda model_data: get_model_class(model_data["orm_class"])(**model_data)
43
43
 
44
+ POSTGRES_IDENTIFIER_MAX_LENGTH = 63
45
+ _HASH_SUFFIX_LENGTH = 33
46
+
44
47
 
45
48
  # 1. Create a "registry" function using the decorator
46
49
  @singledispatch
@@ -533,6 +536,15 @@ def extract_pydantic_fields_from_dict(d: Mapping[str, Any]) -> dict[str, dict[st
533
536
  return result
534
537
 
535
538
 
539
+ def _crop_hash_prefix(prefix: str, *, max_length: int = POSTGRES_IDENTIFIER_MAX_LENGTH) -> str:
540
+ max_prefix_length = max_length - _HASH_SUFFIX_LENGTH
541
+ if max_prefix_length <= 0:
542
+ raise ValueError("max_length must leave room for '_' plus the hash suffix.")
543
+
544
+ cropped_prefix = prefix[:max_prefix_length].rstrip("_")
545
+ return cropped_prefix or "hash"
546
+
547
+
536
548
  def create_config(
537
549
  ts_class_name: str,
538
550
  kwargs: dict[str, Any],
@@ -562,8 +574,8 @@ def create_config(
562
574
  # 4. Create the remote configuration by removing ignored keys
563
575
  remote_config = copy.deepcopy(dict_to_hash)
564
576
 
565
- update_prefix = (update_hash_prefix or ts_class_name).lower()
566
- storage_prefix = (storage_hash_prefix or ts_class_name).lower()
577
+ update_prefix = _crop_hash_prefix((update_hash_prefix or ts_class_name).lower())
578
+ storage_prefix = _crop_hash_prefix((storage_hash_prefix or ts_class_name).lower())
567
579
 
568
580
  # 5. Return all computed values in the structured dataclass
569
581
  return TimeSerieConfig(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.0.12
3
+ Version: 4.0.13
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.12"
7
+ version = "4.0.13"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -24,6 +24,25 @@ def _hashes(payload):
24
24
  return build_operations.hash_signature({"config": serialized_payload})
25
25
 
26
26
 
27
+ def test_create_config_crops_hash_prefix_to_postgres_identifier_limit(monkeypatch):
28
+ monkeypatch.setattr(build_operations, "POD_PROJECT", None, raising=False)
29
+
30
+ class_name = "VeryLongDataNodeClassNameThatWouldOverflowPostgresIdentifierLimit"
31
+
32
+ config = build_operations.create_config(
33
+ ts_class_name=class_name,
34
+ kwargs={"identifier": "prices"},
35
+ )
36
+
37
+ expected_prefix = class_name.lower()[:30].rstrip("_")
38
+ assert len(config.storage_hash) == 63
39
+ assert len(config.update_hash) == 63
40
+ assert config.storage_hash.startswith(f"{expected_prefix}_")
41
+ assert config.update_hash.startswith(f"{expected_prefix}_")
42
+ assert len(config.storage_hash.rsplit("_", 1)[1]) == 32
43
+ assert len(config.update_hash.rsplit("_", 1)[1]) == 32
44
+
45
+
27
46
  def test_nested_pydantic_runtime_only_fields_inside_lists_do_not_affect_hashes(monkeypatch):
28
47
  monkeypatch.setattr(build_operations, "POD_PROJECT", None, raising=False)
29
48
 
File without changes
File without changes
File without changes