mainsequence 8.1.20.dev12__tar.gz → 8.1.20.dev14__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 (142) hide show
  1. {mainsequence-8.1.20.dev12/mainsequence.egg-info → mainsequence-8.1.20.dev14}/PKG-INFO +1 -1
  2. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/models_helpers.py +18 -8
  3. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/models_user.py +6 -3
  4. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/pyproject.toml +1 -1
  6. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_filter_normalization.py +64 -0
  7. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/LICENSE +0 -0
  8. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/MANIFEST.in +0 -0
  9. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/README.md +0 -0
  10. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/AGENTS.md +0 -0
  11. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  12. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  13. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  14. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  15. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  16. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  17. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  18. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  19. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  20. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  21. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  22. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/__init__.py +0 -0
  23. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/__main__.py +0 -0
  24. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/bootstrap.py +0 -0
  25. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/__init__.py +0 -0
  26. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/api.py +0 -0
  27. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/browser_auth.py +0 -0
  28. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/cli.py +0 -0
  29. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/code_repository_status.py +0 -0
  30. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/config.py +0 -0
  31. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/docker_utils.py +0 -0
  32. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/doctor.py +0 -0
  33. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/local_ops.py +0 -0
  34. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/migrations.py +0 -0
  35. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/model_filters.py +0 -0
  36. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/pydantic_cli.py +0 -0
  37. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/sdk_utils.py +0 -0
  38. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/ssh_utils.py +0 -0
  39. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/cli/ui.py +0 -0
  40. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/__init__.py +0 -0
  41. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/agent_runtime_models.py +0 -0
  42. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/base.py +0 -0
  43. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/client.py +0 -0
  44. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/compute_validation.py +0 -0
  45. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  46. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  47. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  48. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  49. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/dtype_codec.py +0 -0
  50. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/exceptions.py +0 -0
  51. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/github_issues.py +0 -0
  52. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/metatables/__init__.py +0 -0
  53. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/metatables/core.py +0 -0
  54. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/models_foundry.py +0 -0
  55. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/observability.py +0 -0
  56. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/client/utils.py +0 -0
  57. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/code_repository_context.py +0 -0
  58. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/code_repository_skills.py +0 -0
  59. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/defaults.py +0 -0
  60. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/instrumentation/__init__.py +0 -0
  61. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/instrumentation/utils.py +0 -0
  62. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/logconf.py +0 -0
  63. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/__init__.py +0 -0
  64. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/__main__.py +0 -0
  65. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  66. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  67. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/future_registry.py +0 -0
  68. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/hashing.py +0 -0
  69. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  70. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  71. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/env.py +0 -0
  72. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/provider.py +0 -0
  73. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/registry.py +0 -0
  74. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  75. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  76. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  77. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  78. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  79. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/schema_names.py +0 -0
  80. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  81. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  82. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  83. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  84. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  85. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  86. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  87. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  88. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  89. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  90. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/repository_identity_security.py +0 -0
  91. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/runtime_flags.py +0 -0
  92. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence/scaffold_skills.py +0 -0
  93. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/setup.cfg +0 -0
  99. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  100. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_auth_precedence.py +0 -0
  101. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_canonical_api_route_contract.py +0 -0
  102. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_cli.py +0 -0
  103. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_cli_browser_auth.py +0 -0
  104. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_cli_migrations.py +0 -0
  105. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_client.py +0 -0
  106. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  107. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_code_repository_branch_contract.py +0 -0
  108. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_code_repository_documentation_contract.py +0 -0
  109. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_code_repository_runtime_context.py +0 -0
  110. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_code_repository_skills.py +0 -0
  111. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_dev_release_version.py +0 -0
  113. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_duckdb_interface_dimensions.py +0 -0
  114. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_environment_resource_context.py +0 -0
  115. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_environment_response_contracts.py +0 -0
  116. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_github_issues_client.py +0 -0
  117. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_instrumentation.py +0 -0
  118. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_local_ops.py +0 -0
  119. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_logconf.py +0 -0
  120. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_meta_table_migrations.py +0 -0
  121. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_meta_tables_client_models.py +0 -0
  122. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  123. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_models_user_request_bound_auth.py +0 -0
  124. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_notification_uid_contract.py +0 -0
  125. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_observability_client.py +0 -0
  126. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_pod_project_resolution.py +0 -0
  127. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_scaffold_skills.py +0 -0
  128. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_schema_names.py +0 -0
  129. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_secret_client_model.py +0 -0
  130. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_source_table_configuration.py +0 -0
  131. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_sqlite_interface_dimensions.py +0 -0
  132. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_ssh_utils.py +0 -0
  133. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  134. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_dimension_queries.py +0 -0
  135. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_update_configuration.py +0 -0
  136. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_update_configuration_client.py +0 -0
  137. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_update_flow.py +0 -0
  138. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_time_index_table_update_hard_cut.py +0 -0
  139. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_tolerant_response_reading.py +0 -0
  140. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_update_runner_uid_runtime.py +0 -0
  141. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_update_statistics.py +0 -0
  142. {mainsequence-8.1.20.dev12 → mainsequence-8.1.20.dev14}/tests/test_update_uid_guards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev12
3
+ Version: 8.1.20.dev14
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -287,10 +287,13 @@ class Job(CurrentCodeRepositoryBranchCollectionMixin, BaseObjectOrm, BasePydanti
287
287
  examples=[3600, 14400],
288
288
  )
289
289
 
290
- related_image_uid: str = Field(
290
+ related_image_uid: str | None = Field(
291
291
  ...,
292
- description="Public UID of the exact persisted execution image.",
293
- examples=["f3cb8477-df47-49cb-a151-80b746fb1243"],
292
+ description=(
293
+ "Public UID of the exact persisted execution image. Null while the "
294
+ "backend has not bound one to the job."
295
+ ),
296
+ examples=["f3cb8477-df47-49cb-a151-80b746fb1243", None],
294
297
  )
295
298
  image_status: str = Field(
296
299
  ...,
@@ -952,14 +955,21 @@ class JobRun(
952
955
  description="The commit hash associated with the code version used for this run.",
953
956
  examples=["a1b2c3d4e5f6g7h8i9j0"],
954
957
  )
955
- runtime_image_uid: str = Field(
958
+ runtime_image_uid: str | None = Field(
956
959
  ...,
957
- description="Public UID of the immutable image snapshot executed by this run.",
960
+ description=(
961
+ "Public UID of the immutable image snapshot executed by this run. "
962
+ "Null for a run the backend has not resolved an image for."
963
+ ),
964
+ examples=["6cfdb152-923e-45b9-a150-c4541c68b0d1", None],
958
965
  )
959
- runtime_image_digest: str = Field(
966
+ runtime_image_digest: str | None = Field(
960
967
  ...,
961
- description="Immutable digest of the image snapshot executed by this run.",
962
- examples=["sha256:" + "a" * 64],
968
+ description=(
969
+ "Immutable digest of the image snapshot executed by this run. Null "
970
+ "for a run the backend has not resolved an image for."
971
+ ),
972
+ examples=["sha256:" + "a" * 64, None],
963
973
  )
964
974
 
965
975
  command_args: list[str] = Field(
@@ -123,11 +123,14 @@ class Organization(UserApiBaseObjectOrm, BasePydanticModel):
123
123
  description="Optional public or internal URL for the organization.",
124
124
  examples=[STANDARD_BACKEND_URL],
125
125
  )
126
- organization_domain: str = Field(
126
+ organization_domain: str | None = Field(
127
127
  ...,
128
128
  title="Organization Domain",
129
- description="Primary email or identity domain associated with the organization.",
130
- examples=["main-sequence.io"],
129
+ description=(
130
+ "Primary email or identity domain associated with the organization. "
131
+ "Null for an organization that has no domain set."
132
+ ),
133
+ examples=["main-sequence.io", None],
131
134
  )
132
135
  identity_platform_tenant_id: str | None = Field(
133
136
  None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev12
3
+ Version: 8.1.20.dev14
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "8.1.20.dev12"
7
+ version = "8.1.20.dev14"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -2928,6 +2928,70 @@ def test_job_run_requires_immutable_runtime_image_snapshot():
2928
2928
  )
2929
2929
 
2930
2930
 
2931
+ def test_nullable_response_fields_accept_null_from_the_backend():
2932
+ """#131: fields the backend documents as nullable must parse when null."""
2933
+ job = models_helpers_mod.Job.model_validate(
2934
+ {
2935
+ "uid": "7d0ab07c-d1c0-4b7f-9c69-3c1a41c0a4da",
2936
+ "name": "Daily prices",
2937
+ "code_repository_branch_uid": "5a28020a-0f1b-47ee-aab8-334286234bea",
2938
+ "related_image_uid": None,
2939
+ "image_status": "building",
2940
+ "automatic_deployment": True,
2941
+ }
2942
+ )
2943
+ assert job.related_image_uid is None
2944
+
2945
+ run = models_helpers_mod.JobRun.model_validate(
2946
+ {
2947
+ "name": "daily-prices-run",
2948
+ "unique_identifier": "jobrun_1",
2949
+ "code_repository_uid": None,
2950
+ "code_repository_name": None,
2951
+ "code_repository_branch_uid": None,
2952
+ "code_repository_branch_name": None,
2953
+ "organization_environment_uid": ENVIRONMENT_UID,
2954
+ "runtime_image_uid": None,
2955
+ "runtime_image_digest": None,
2956
+ }
2957
+ )
2958
+ assert run.runtime_image_uid is None
2959
+ assert run.runtime_image_digest is None
2960
+
2961
+ organization_payload = {
2962
+ "uid": "8f5d6b54-2f5e-4a8b-bb10-0b17f3f4c123",
2963
+ "name": "Main Sequence",
2964
+ "url": "https://backend.test",
2965
+ "organization_domain": None,
2966
+ "identity_platform_tenant_id": None,
2967
+ "has_pending_invoices": False,
2968
+ "production_environment_uid": "00000000-0000-4000-8000-000000000002",
2969
+ }
2970
+ organization = models_user_mod.Organization.model_validate(organization_payload)
2971
+ assert organization.organization_domain is None
2972
+
2973
+ user = models_user_mod.User.model_validate(
2974
+ {
2975
+ "id": 4,
2976
+ "uid": "fdf409f7-d16f-4f71-986b-9057db6c7eca",
2977
+ "username": "jose",
2978
+ "email": "jose@main-sequence.io",
2979
+ "profile_picture": None,
2980
+ "last_login": None,
2981
+ "api_request_limit": 10000,
2982
+ "mfa_enabled": False,
2983
+ "organization": organization_payload,
2984
+ "plan": None,
2985
+ "groups": [],
2986
+ "phone_number": None,
2987
+ "organization_teams": [],
2988
+ "is_active": True,
2989
+ "date_joined": "2026-01-01T00:00:00Z",
2990
+ }
2991
+ )
2992
+ assert user.organization.organization_domain is None
2993
+
2994
+
2931
2995
  def test_resource_release_model_supports_automatic_deployment_payloads():
2932
2996
  release_uid = "2f4c4c3d-5669-4da5-9d86-b84633c1e6ed"
2933
2997
  resource_uid = "857bec7b-dd77-4272-aecd-13fc2138eacc"