mainsequence 8.0.2__tar.gz → 8.0.4__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 (139) hide show
  1. {mainsequence-8.0.2/mainsequence.egg-info → mainsequence-8.0.4}/PKG-INFO +1 -1
  2. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/models_foundry.py +7 -0
  3. {mainsequence-8.0.2 → mainsequence-8.0.4/mainsequence.egg-info}/PKG-INFO +1 -1
  4. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence.egg-info/SOURCES.txt +1 -0
  5. {mainsequence-8.0.2 → mainsequence-8.0.4}/pyproject.toml +1 -1
  6. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_code_repository_branch_contract.py +8 -1
  7. mainsequence-8.0.4/tests/test_code_repository_documentation_contract.py +75 -0
  8. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_code_repository_runtime_context.py +2 -0
  9. {mainsequence-8.0.2 → mainsequence-8.0.4}/LICENSE +0 -0
  10. {mainsequence-8.0.2 → mainsequence-8.0.4}/MANIFEST.in +0 -0
  11. {mainsequence-8.0.2 → mainsequence-8.0.4}/README.md +0 -0
  12. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  14. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  15. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  16. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  17. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  18. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  19. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  20. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  21. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  22. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  23. {mainsequence-8.0.2 → mainsequence-8.0.4}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  24. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/__init__.py +0 -0
  25. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/__main__.py +0 -0
  26. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/bootstrap.py +0 -0
  27. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/__init__.py +0 -0
  28. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/api.py +0 -0
  29. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/browser_auth.py +0 -0
  30. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/cli.py +0 -0
  31. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/code_repository_status.py +0 -0
  32. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/config.py +0 -0
  33. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/docker_utils.py +0 -0
  34. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/doctor.py +0 -0
  35. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/local_ops.py +0 -0
  36. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/migrations.py +0 -0
  37. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/model_filters.py +0 -0
  38. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/pydantic_cli.py +0 -0
  39. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/sdk_utils.py +0 -0
  40. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/ssh_utils.py +0 -0
  41. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/cli/ui.py +0 -0
  42. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/__init__.py +0 -0
  43. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/agent_runtime_models.py +0 -0
  44. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/base.py +0 -0
  45. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/client.py +0 -0
  46. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/compute_validation.py +0 -0
  47. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  48. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  49. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  50. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  51. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/dtype_codec.py +0 -0
  52. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/exceptions.py +0 -0
  53. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/metatables/__init__.py +0 -0
  54. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/metatables/core.py +0 -0
  55. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/models_helpers.py +0 -0
  56. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/models_user.py +0 -0
  57. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/observability.py +0 -0
  58. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/client/utils.py +0 -0
  59. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/code_repository_context.py +0 -0
  60. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/code_repository_skills.py +0 -0
  61. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/defaults.py +0 -0
  62. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/instrumentation/__init__.py +0 -0
  63. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/instrumentation/utils.py +0 -0
  64. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/logconf.py +0 -0
  65. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/__init__.py +0 -0
  66. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/__main__.py +0 -0
  67. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  68. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  69. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/future_registry.py +0 -0
  70. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/hashing.py +0 -0
  71. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  72. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  73. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/env.py +0 -0
  74. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/provider.py +0 -0
  75. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/registry.py +0 -0
  76. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  77. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  78. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  79. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  80. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  81. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/schema_names.py +0 -0
  82. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  83. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  84. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  85. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  86. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  87. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  88. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  89. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  90. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  91. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  92. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/repository_identity_security.py +0 -0
  93. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/runtime_flags.py +0 -0
  94. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence/scaffold_skills.py +0 -0
  95. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence.egg-info/dependency_links.txt +0 -0
  96. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence.egg-info/entry_points.txt +0 -0
  97. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence.egg-info/requires.txt +0 -0
  98. {mainsequence-8.0.2 → mainsequence-8.0.4}/mainsequence.egg-info/top_level.txt +0 -0
  99. {mainsequence-8.0.2 → mainsequence-8.0.4}/setup.cfg +0 -0
  100. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  101. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_auth_precedence.py +0 -0
  102. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_canonical_api_route_contract.py +0 -0
  103. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_cli.py +0 -0
  104. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_cli_browser_auth.py +0 -0
  105. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_cli_migrations.py +0 -0
  106. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_client.py +0 -0
  107. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  108. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_code_repository_skills.py +0 -0
  109. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_dependency_extras.py +0 -0
  110. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_duckdb_interface_dimensions.py +0 -0
  111. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_environment_resource_context.py +0 -0
  112. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_environment_response_contracts.py +0 -0
  113. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_filter_normalization.py +0 -0
  114. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_instrumentation.py +0 -0
  115. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_local_ops.py +0 -0
  116. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_logconf.py +0 -0
  117. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_meta_table_migrations.py +0 -0
  118. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_meta_tables_client_models.py +0 -0
  119. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  120. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_models_user_request_bound_auth.py +0 -0
  121. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_notification_uid_contract.py +0 -0
  122. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_observability_client.py +0 -0
  123. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_pod_project_resolution.py +0 -0
  124. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_scaffold_skills.py +0 -0
  125. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_scheduler_client_model.py +0 -0
  126. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_schema_names.py +0 -0
  127. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_secret_client_model.py +0 -0
  128. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_source_table_configuration.py +0 -0
  129. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_sqlite_interface_dimensions.py +0 -0
  130. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_ssh_utils.py +0 -0
  131. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  132. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_dimension_queries.py +0 -0
  133. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_update_configuration.py +0 -0
  134. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_update_configuration_client.py +0 -0
  135. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_update_flow.py +0 -0
  136. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_time_index_table_update_hard_cut.py +0 -0
  137. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_update_runner_uid_runtime.py +0 -0
  138. {mainsequence-8.0.2 → mainsequence-8.0.4}/tests/test_update_statistics.py +0 -0
  139. {mainsequence-8.0.2 → mainsequence-8.0.4}/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.0.2
3
+ Version: 8.0.4
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -503,6 +503,13 @@ class CodeRepositoryBranch(BasePydanticModel, BaseObjectOrm):
503
503
  uid: str
504
504
  code_repository_uid: str
505
505
  code_repository_name: str
506
+ code_repository_type: str = Field(
507
+ ...,
508
+ description=(
509
+ "Read-only projection of the immutable type owned by the parent "
510
+ "CodeRepository."
511
+ ),
512
+ )
506
513
  repository_branch: str
507
514
  metatables_data_source: _DataSource | None = None
508
515
  metatables_data_source_uid: str | None = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.0.2
3
+ Version: 8.0.4
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -100,6 +100,7 @@ tests/test_cli_migrations.py
100
100
  tests/test_client.py
101
101
  tests/test_code_repository_batch_jobs_from_file.py
102
102
  tests/test_code_repository_branch_contract.py
103
+ tests/test_code_repository_documentation_contract.py
103
104
  tests/test_code_repository_runtime_context.py
104
105
  tests/test_code_repository_skills.py
105
106
  tests/test_dependency_extras.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "8.0.2"
7
+ version = "8.0.4"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -35,6 +35,7 @@ def code_repository_branch_payload() -> dict:
35
35
  "uid": CODE_REPOSITORY_BRANCH_UID,
36
36
  "code_repository_uid": CODE_REPOSITORY_UID,
37
37
  "code_repository_name": "Analytics",
38
+ "code_repository_type": "python",
38
39
  "repository_branch": "main",
39
40
  "metatables_data_source": None,
40
41
  "metatables_data_source_uid": None,
@@ -70,6 +71,7 @@ def test_code_repository_is_only_the_logical_aggregate_contract():
70
71
  assert code_repository.primary_language == "python"
71
72
  assert code_repository.framework == "mainsequence"
72
73
  assert code_repository.branches[0].uid == CODE_REPOSITORY_BRANCH_UID
74
+ assert not hasattr(code_repository.branches[0], "code_repository_type")
73
75
  assert not hasattr(code_repository, "repository_branch")
74
76
 
75
77
  with pytest.raises(ValidationError):
@@ -107,16 +109,21 @@ def test_code_repository_branch_owns_branch_configuration():
107
109
  branch = models_foundry.CodeRepositoryBranch(**code_repository_branch_payload())
108
110
 
109
111
  assert branch.code_repository_uid == CODE_REPOSITORY_UID
112
+ assert branch.code_repository_type == "python"
110
113
  assert branch.repository_branch == "main"
111
114
  assert branch.default_base_image.uid == "61111111-1111-4111-8111-111111111111"
112
115
  assert branch.organization_environment_uid is None
113
116
  assert branch.organization_environment_name is None
114
- assert not hasattr(branch, "code_repository_type")
115
117
  assert not hasattr(branch, "primary_language")
116
118
  assert not hasattr(branch, "framework")
117
119
  assert not hasattr(branch, "git_ssh_url")
118
120
  assert not hasattr(branch, "labels")
119
121
 
122
+ payload = code_repository_branch_payload()
123
+ payload.pop("code_repository_type")
124
+ with pytest.raises(ValidationError):
125
+ models_foundry.CodeRepositoryBranch(**payload)
126
+
120
127
 
121
128
  def test_github_repository_binding_is_a_separate_registry_contract():
122
129
  repository = models_foundry.GitHubRepositoryBinding(
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from pathlib import Path
5
+
6
+ import pytest
7
+
8
+ REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
9
+ DOCUMENTATION_ROOTS = (
10
+ REPOSITORY_ROOT / "docs",
11
+ REPOSITORY_ROOT / "agent_scaffold",
12
+ )
13
+ HISTORICAL_IDENTIFIER_ALLOWLIST = {
14
+ Path("CHANGELOG.md"): frozenset({"project-context", "runtime_project_context"}),
15
+ }
16
+ RETIRED_PUBLIC_IDENTIFIERS = {
17
+ "project_context": re.compile(r"(?<![A-Za-z0-9_])project_context(?![A-Za-z0-9_])"),
18
+ "project-context": re.compile(r"(?<![A-Za-z0-9_])project-context(?![A-Za-z0-9_])"),
19
+ "runtime_project_context": re.compile(
20
+ r"(?<![A-Za-z0-9_])runtime_project_context(?![A-Za-z0-9_])"
21
+ ),
22
+ "get_project_runtime_context": re.compile(
23
+ r"(?<![A-Za-z0-9_])get_project_runtime_context(?![A-Za-z0-9_])"
24
+ ),
25
+ "ProjectAlembicVersion": re.compile(r"\bProjectAlembicVersion\b"),
26
+ "ProjectBranch": re.compile(r"\bProjectBranch\b"),
27
+ "MAIN_SEQUENCE_PROJECT": re.compile(r"\bMAIN_SEQUENCE_PROJECT[A-Z0-9_]*\b"),
28
+ "MAINSEQUENCE_PROJECT": re.compile(r"\bMAINSEQUENCE_PROJECT[A-Z0-9_]*\b"),
29
+ "organization_project_environment": re.compile(
30
+ r"\borganization_project_environment(?:_uid|_name)?\b"
31
+ ),
32
+ "project_to_agent": re.compile(r"\bproject_to_agent\b"),
33
+ "project-design": re.compile(r"\bproject-design\b"),
34
+ "project-code": re.compile(r"\bproject-code\b"),
35
+ "project-facing": re.compile(r"\bproject-facing\b"),
36
+ }
37
+
38
+
39
+ def _documentation_files() -> tuple[Path, ...]:
40
+ files = {REPOSITORY_ROOT / "README.md", REPOSITORY_ROOT / "CHANGELOG.md"}
41
+ for root in DOCUMENTATION_ROOTS:
42
+ files.update(root.rglob("*.md"))
43
+ return tuple(sorted(files))
44
+
45
+
46
+ @pytest.mark.parametrize(
47
+ "path",
48
+ _documentation_files(),
49
+ ids=lambda path: str(path.relative_to(REPOSITORY_ROOT)),
50
+ )
51
+ def test_current_documentation_excludes_retired_project_identifiers(path: Path) -> None:
52
+ relative_path = path.relative_to(REPOSITORY_ROOT)
53
+ allowed_identifiers = HISTORICAL_IDENTIFIER_ALLOWLIST.get(relative_path, frozenset())
54
+ text = path.read_text(encoding="utf-8")
55
+
56
+ unexpected = sorted(
57
+ identifier
58
+ for identifier, pattern in RETIRED_PUBLIC_IDENTIFIERS.items()
59
+ if identifier not in allowed_identifiers and pattern.search(text)
60
+ )
61
+
62
+ assert not unexpected, f"{relative_path} contains retired public identifiers: {unexpected}"
63
+
64
+
65
+ def test_code_repository_context_adr_describes_the_current_cutover() -> None:
66
+ adr = (
67
+ REPOSITORY_ROOT
68
+ / "docs"
69
+ / "adr"
70
+ / "0031-process-lifetime-code-repository-branch-context.md"
71
+ ).read_text(encoding="utf-8")
72
+
73
+ assert "get_code_repository_context()" in adr
74
+ assert "are the canonical public names" in adr
75
+ assert "names below describe the pre-cutover contract" not in adr
@@ -186,6 +186,7 @@ def test_code_repository_branch_git_context_uses_canonical_backend_action(monkey
186
186
  "uid": CODE_REPOSITORY_BRANCH_UID,
187
187
  "code_repository_uid": CODE_REPOSITORY_UID,
188
188
  "code_repository_name": "Example CodeRepository",
189
+ "code_repository_type": "python",
189
190
  "repository_branch": "main",
190
191
  "metatables_data_source": None,
191
192
  "metatables_data_source_uid": None,
@@ -224,6 +225,7 @@ def test_code_repository_branch_git_context_uses_canonical_backend_action(monkey
224
225
  "commit_sha": COMMIT_SHA,
225
226
  }
226
227
  assert resolution.code_repository_branch.uid == CODE_REPOSITORY_BRANCH_UID
228
+ assert resolution.code_repository_branch.code_repository_type == "python"
227
229
 
228
230
 
229
231
  def test_context_resolves_once_and_returns_identical_snapshot(monkeypatch):
File without changes
File without changes
File without changes
File without changes