mainsequence 8.1.20.dev1__tar.gz → 8.1.20.dev3__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 (141) hide show
  1. {mainsequence-8.1.20.dev1/mainsequence.egg-info → mainsequence-8.1.20.dev3}/PKG-INFO +1 -1
  2. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3/mainsequence.egg-info}/PKG-INFO +1 -1
  3. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/pyproject.toml +1 -1
  4. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_dev_release_version.py +28 -5
  5. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/LICENSE +0 -0
  6. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/MANIFEST.in +0 -0
  7. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/README.md +0 -0
  8. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/AGENTS.md +0 -0
  9. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  10. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  11. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  12. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  13. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  14. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  15. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  16. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  17. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  18. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  19. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  20. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/__init__.py +0 -0
  21. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/__main__.py +0 -0
  22. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/bootstrap.py +0 -0
  23. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/__init__.py +0 -0
  24. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/api.py +0 -0
  25. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/browser_auth.py +0 -0
  26. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/cli.py +0 -0
  27. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/code_repository_status.py +0 -0
  28. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/config.py +0 -0
  29. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/docker_utils.py +0 -0
  30. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/doctor.py +0 -0
  31. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/local_ops.py +0 -0
  32. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/migrations.py +0 -0
  33. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/model_filters.py +0 -0
  34. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/pydantic_cli.py +0 -0
  35. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/sdk_utils.py +0 -0
  36. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/ssh_utils.py +0 -0
  37. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/cli/ui.py +0 -0
  38. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/__init__.py +0 -0
  39. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/agent_runtime_models.py +0 -0
  40. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/base.py +0 -0
  41. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/client.py +0 -0
  42. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/compute_validation.py +0 -0
  43. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  44. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  45. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  46. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  47. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/dtype_codec.py +0 -0
  48. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/exceptions.py +0 -0
  49. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/github_issues.py +0 -0
  50. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/metatables/__init__.py +0 -0
  51. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/metatables/core.py +0 -0
  52. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/models_foundry.py +0 -0
  53. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/models_helpers.py +0 -0
  54. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/models_user.py +0 -0
  55. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/observability.py +0 -0
  56. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/client/utils.py +0 -0
  57. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/code_repository_context.py +0 -0
  58. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/code_repository_skills.py +0 -0
  59. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/defaults.py +0 -0
  60. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/instrumentation/__init__.py +0 -0
  61. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/instrumentation/utils.py +0 -0
  62. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/logconf.py +0 -0
  63. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/__init__.py +0 -0
  64. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/__main__.py +0 -0
  65. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  66. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  67. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/future_registry.py +0 -0
  68. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/hashing.py +0 -0
  69. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  70. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  71. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/env.py +0 -0
  72. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/provider.py +0 -0
  73. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/registry.py +0 -0
  74. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  75. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  76. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  77. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  78. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  79. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/schema_names.py +0 -0
  80. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  81. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  82. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  83. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  84. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  85. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  86. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  87. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  88. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  89. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  90. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/repository_identity_security.py +0 -0
  91. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/runtime_flags.py +0 -0
  92. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence/scaffold_skills.py +0 -0
  93. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/setup.cfg +0 -0
  99. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  100. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_auth_precedence.py +0 -0
  101. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_canonical_api_route_contract.py +0 -0
  102. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_cli.py +0 -0
  103. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_cli_browser_auth.py +0 -0
  104. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_cli_migrations.py +0 -0
  105. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_client.py +0 -0
  106. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  107. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_code_repository_branch_contract.py +0 -0
  108. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_code_repository_documentation_contract.py +0 -0
  109. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_code_repository_runtime_context.py +0 -0
  110. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_code_repository_skills.py +0 -0
  111. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_environment_resource_context.py +0 -0
  114. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_environment_response_contracts.py +0 -0
  115. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_filter_normalization.py +0 -0
  116. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_github_issues_client.py +0 -0
  117. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_instrumentation.py +0 -0
  118. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_local_ops.py +0 -0
  119. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_logconf.py +0 -0
  120. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_meta_table_migrations.py +0 -0
  121. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_meta_tables_client_models.py +0 -0
  122. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  123. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_models_user_request_bound_auth.py +0 -0
  124. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_notification_uid_contract.py +0 -0
  125. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_observability_client.py +0 -0
  126. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_pod_project_resolution.py +0 -0
  127. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_scaffold_skills.py +0 -0
  128. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_schema_names.py +0 -0
  129. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_secret_client_model.py +0 -0
  130. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_source_table_configuration.py +0 -0
  131. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_sqlite_interface_dimensions.py +0 -0
  132. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_ssh_utils.py +0 -0
  133. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  134. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_dimension_queries.py +0 -0
  135. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_update_configuration.py +0 -0
  136. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_update_configuration_client.py +0 -0
  137. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_update_flow.py +0 -0
  138. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_time_index_table_update_hard_cut.py +0 -0
  139. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_update_runner_uid_runtime.py +0 -0
  140. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/tests/test_update_statistics.py +0 -0
  141. {mainsequence-8.1.20.dev1 → mainsequence-8.1.20.dev3}/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.dev1
3
+ Version: 8.1.20.dev3
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev1
3
+ Version: 8.1.20.dev3
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.dev1"
7
+ version = "8.1.20.dev3"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -66,25 +66,48 @@ def test_latest_final_requires_at_least_one_installable_release():
66
66
  dev_release_version.latest_final_version({"9.0.0": []})
67
67
 
68
68
 
69
- def test_dev_version_carries_the_next_patch_number():
70
- assert dev_release_version.dev_version(Version("8.1.19"), 41) == "8.1.20.dev41"
69
+ def test_dev_version_is_the_declared_version_with_a_dev_serial():
70
+ assert (
71
+ dev_release_version.dev_version(Version("8.1.20"), Version("8.1.19"), 41) == "8.1.20.dev41"
72
+ )
73
+
74
+
75
+ def test_a_planned_minor_release_keeps_its_own_number():
76
+ assert dev_release_version.dev_version(Version("8.2.0"), Version("8.1.19"), 7) == "8.2.0.dev7"
77
+
78
+
79
+ @pytest.mark.parametrize("declared", ["8.1.19", "8.1.18"])
80
+ def test_a_declared_version_that_is_already_released_is_refused(declared):
81
+ # The repository once declared 8.1.19 while it published 8.1.20.devN, so no
82
+ # final 8.1.20 could be built from it. A missing bump now stops the build.
83
+ with pytest.raises(dev_release_version.DevVersionError, match="already released"):
84
+ dev_release_version.dev_version(Version(declared), Version("8.1.19"), 41)
71
85
 
72
86
 
73
87
  def test_dev_version_sorts_between_the_current_and_the_next_release():
74
- computed = Version(dev_release_version.dev_version(Version("8.1.19"), 41))
88
+ computed = Version(dev_release_version.dev_version(Version("8.1.20"), Version("8.1.19"), 41))
75
89
 
76
90
  assert Version("8.1.19") < computed < Version("8.1.20")
77
91
 
78
92
 
79
93
  def test_dev_version_is_a_development_release_so_pip_skips_it_by_default():
80
- computed = Version(dev_release_version.dev_version(Version("8.1.19"), 41))
94
+ computed = Version(dev_release_version.dev_version(Version("8.1.20"), Version("8.1.19"), 41))
81
95
 
82
96
  assert computed.is_devrelease
83
97
 
84
98
 
85
99
  def test_dev_version_rejects_a_negative_run_number():
86
100
  with pytest.raises(dev_release_version.DevVersionError):
87
- dev_release_version.dev_version(Version("8.1.19"), -1)
101
+ dev_release_version.dev_version(Version("8.1.20"), Version("8.1.19"), -1)
102
+
103
+
104
+ def test_the_version_after_a_release_is_the_next_patch():
105
+ assert dev_release_version.next_patch(Version("8.1.20")) == "8.1.21"
106
+
107
+
108
+ def test_a_declared_development_version_is_refused():
109
+ with pytest.raises(dev_release_version.DevVersionError):
110
+ dev_release_version.declared_release("8.1.20.dev41")
88
111
 
89
112
 
90
113
  def test_apply_version_rewrites_only_the_project_version():