diff --git a/.github/workflows/python_deploy_dev.yml b/.github/workflows/python_deploy_dev.yml index 059cceb..0a925af 100644 --- a/.github/workflows/python_deploy_dev.yml +++ b/.github/workflows/python_deploy_dev.yml @@ -23,6 +23,7 @@ jobs: source-repo-names: '["public-noremote-conda-dev"]' conda-channels: '["conda-forge"]' publish-repo-names: '["public-noremote-conda-dev"]' + build-experimental: true secrets: JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} diff --git a/.gitignore b/.gitignore index cc493e6..7d6a7d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Byte-compiled / optimized / DLL files +# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class @@ -144,3 +144,4 @@ dmypy.json #version ignore omf/_version.py +/_version.json diff --git a/pyproject.toml b/pyproject.toml index 1add93f..60514c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,21 +98,23 @@ style = "pep440" vcs = "git" [tool.poetry-dynamic-versioning.substitution] -files = ["omf/_version.py", "recipe.yaml"] +files = ["omf/_version.py", "_version.json"] patterns = [ - { value = '''(^__version__\s*(?::.*?)?=\s*['"])[^'"]*(['"])''', mode = "str" }, - { value = '''(^\s*version\s*(?::.*?)?:\s*['"])[^'"]*(['"])''', mode = "str" }, + '''(^__version__\s*(?::.*?)?=\s*['"])[^'"]*(['"])''', + '''(^{\s*"version"\s*:\s*")[^"]*("\s*})''', ] [tool.poetry-dynamic-versioning.files."omf/_version.py"] persistent-substitution = true initial-content = """ - # Version placeholder that will be replaced during substitution - __version__ = "0.0.0" + __version__ = "0.0.0.dev0" """ -[tool.poetry-dynamic-versioning.files."recipe.yaml"] +[tool.poetry-dynamic-versioning.files."_version.json"] persistent-substitution = true +initial-content = """ +{ "version": "0.0.0.dev0" } +""" [tool.ruff] target-version = "py312" diff --git a/recipe.yaml b/recipe.yaml index caca445..4c6a6a5 100644 --- a/recipe.yaml +++ b/recipe.yaml @@ -2,8 +2,9 @@ schema_version: 1 context: name: "mira-omf" - version: "0.0.0.dev0" # This will be replaced by the actual version in the build process - python_min: "3.12" + # Extract version from auto-generated _version.json + version: ${{ load_from_file("_version.json").version | trim }} + python_min: '3.12' module_name: omf package: diff --git a/tests/version_test.py b/tests/version_test.py index e17d2a4..5dff424 100644 --- a/tests/version_test.py +++ b/tests/version_test.py @@ -8,20 +8,28 @@ # ' # '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - from __future__ import annotations import importlib +import json +import re from pathlib import Path import pytest import yaml -from packaging.version import InvalidVersion, Version +from packaging.version import Version import omf -def get_conda_recipe_version(): +def _get_json_version() -> str: + version_json_path = Path(__file__).resolve().parents[1] / "_version.json" + with version_json_path.open(encoding="utf-8") as file: + version_json = json.load(file) + return version_json["version"] + + +def _get_conda_recipe_version_def() -> str: recipe_path = Path(__file__).resolve().parents[1] / "recipe.yaml" with recipe_path.open(encoding="utf-8") as file: @@ -29,12 +37,6 @@ def get_conda_recipe_version(): return recipe["context"]["version"] -def test_version_is_consistent(): - project_version = Version(omf.__version__) - conda_version = Version(get_conda_recipe_version()) - assert conda_version.base_version == project_version.base_version - - def _version_module_exists(): try: importlib.import_module("omf._version") @@ -43,6 +45,16 @@ def _version_module_exists(): return False +def test_conda_recipe_version_loads_json(): + conda_version_def = _get_conda_recipe_version_def() + regex = ( + r"\$\{\{\s*load_from_file\(\s*['\"](_version\.json)['\"]\s*\)" + r"\s*\.version\b.*\}\}" + ) + regex_match = re.match(regex, conda_version_def) + assert regex_match is not None + + @pytest.mark.skipif( _version_module_exists(), reason="omf._version can be found: package is built", @@ -60,28 +72,7 @@ def test_fallback_version_is_zero(): not _version_module_exists(), reason="omf._version cannot be found: uses a fallback version", ) -def test_conda_version_is_consistent(): +def test_version_json_is_consistent(): project_version = Version(omf.__version__) - conda_version = Version(get_conda_recipe_version()) - - assert conda_version.is_devrelease == project_version.is_devrelease - assert conda_version.is_prerelease == project_version.is_prerelease - assert conda_version.is_postrelease == project_version.is_postrelease - assert conda_version == project_version - - -def test_conda_version_is_pep440(): - version = Version(get_conda_recipe_version()) - assert version is not None - - -def validate_version(version_str): - try: - version = Version(version_str) - return (version.major, version.minor, version.micro, version.pre, version.post) - except InvalidVersion: - return None - - -def test_version_is_valid(): - assert validate_version(omf.__version__) is not None + json_version = Version(_get_json_version()) + assert project_version == json_version