Skip to content

Commit bf40b46

Browse files
authored
Merge pull request #419 from MiraGeoscience/DEVOPS-1065
DEVOPS-1065: configure auto-versioning in local conda recipes
2 parents 4267f86 + 81ac69a commit bf40b46

5 files changed

Lines changed: 38 additions & 42 deletions

File tree

.github/workflows/python_deploy_dev.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
source-repo-names: '["public-noremote-conda-dev"]'
2424
conda-channels: '["conda-forge"]'
2525
publish-repo-names: '["public-noremote-conda-dev"]'
26+
build-experimental: true
2627
secrets:
2728
JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }}
2829
JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }}

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Byte-compiled / optimized / DLL files
1+
# Byte-compiled / optimized / DLL files
22
__pycache__/
33
*.py[cod]
44
*$py.class
@@ -147,3 +147,4 @@ pyproject-sha.toml
147147

148148
#version ignore
149149
simpeg_drivers/_version.py
150+
/_version.json

pyproject.toml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,21 +158,23 @@ style = "pep440"
158158
vcs = "git"
159159

160160
[tool.poetry-dynamic-versioning.substitution]
161-
files = ["simpeg_drivers/_version.py", "recipe.yaml"]
161+
files = ["simpeg_drivers/_version.py", "_version.json"]
162162
patterns = [
163-
{ value = '''(^__version__\s*(?::.*?)?=\s*['"])[^'"]*(['"])''', mode = "str" },
164-
{ value = '''(^\s*version\s*(?::.*?)?:\s*['"])[^'"]*(['"])''', mode = "str" },
163+
'''(^__version__\s*(?::.*?)?=\s*['"])[^'"]*(['"])''',
164+
'''(^{\s*"version"\s*:\s*")[^"]*("\s*})''',
165165
]
166166

167167
[tool.poetry-dynamic-versioning.files."simpeg_drivers/_version.py"]
168168
persistent-substitution = true
169169
initial-content = """
170-
# Version placeholder that will be replaced during substitution
171-
__version__ = "0.0.0"
170+
__version__ = "0.0.0.dev0"
172171
"""
173172

174-
[tool.poetry-dynamic-versioning.files."recipe.yaml"]
173+
[tool.poetry-dynamic-versioning.files."_version.json"]
175174
persistent-substitution = true
175+
initial-content = """
176+
{ "version": "0.0.0.dev0" }
177+
"""
176178

177179
[tool.ruff]
178180
target-version = "py312"

recipe.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ schema_version: 1
22

33
context:
44
name: "simpeg-drivers"
5-
version: "0.0.0.dev0" # This will be replaced by the actual version in the build process
6-
python_min: "3.12"
5+
# Extract version from auto-generated _version.json
6+
version: ${{ load_from_file("_version.json").version | trim }}
7+
python_min: '3.12'
78
module_name: ${{ name|lower|replace("-", "_") }}
89

910
package:

tests/version_test.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,35 @@
88
# '
99
# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1010

11-
1211
from __future__ import annotations
1312

1413
import importlib
14+
import json
15+
import re
1516
from pathlib import Path
1617

1718
import pytest
1819
import yaml
19-
from packaging.version import InvalidVersion, Version
20+
from packaging.version import Version
2021

2122
import simpeg_drivers
2223

2324

24-
def get_conda_recipe_version():
25+
def _get_json_version() -> str:
26+
version_json_path = Path(__file__).resolve().parents[1] / "_version.json"
27+
with version_json_path.open(encoding="utf-8") as file:
28+
version_json = json.load(file)
29+
return version_json["version"]
30+
31+
32+
def _get_conda_recipe_version_def() -> str:
2533
recipe_path = Path(__file__).resolve().parents[1] / "recipe.yaml"
2634

2735
with recipe_path.open(encoding="utf-8") as file:
2836
recipe = yaml.safe_load(file)
2937
return recipe["context"]["version"]
3038

3139

32-
def test_version_is_consistent():
33-
project_version = Version(simpeg_drivers.__version__)
34-
conda_version = Version(get_conda_recipe_version())
35-
assert conda_version.base_version == project_version.base_version
36-
37-
3840
def _version_module_exists():
3941
try:
4042
importlib.import_module("simpeg_drivers._version")
@@ -43,6 +45,16 @@ def _version_module_exists():
4345
return False
4446

4547

48+
def test_conda_recipe_version_loads_json():
49+
conda_version_def = _get_conda_recipe_version_def()
50+
regex = (
51+
r"\$\{\{\s*load_from_file\(\s*['\"](_version\.json)['\"]\s*\)"
52+
r"\s*\.version\b.*\}\}"
53+
)
54+
regex_match = re.match(regex, conda_version_def)
55+
assert regex_match is not None
56+
57+
4658
@pytest.mark.skipif(
4759
_version_module_exists(),
4860
reason="simpeg_drivers._version can be found: package is built",
@@ -60,28 +72,7 @@ def test_fallback_version_is_zero():
6072
not _version_module_exists(),
6173
reason="simpeg_drivers._version cannot be found: uses a fallback version",
6274
)
63-
def test_conda_version_is_consistent():
75+
def test_version_json_is_consistent():
6476
project_version = Version(simpeg_drivers.__version__)
65-
conda_version = Version(get_conda_recipe_version())
66-
67-
assert conda_version.is_devrelease == project_version.is_devrelease
68-
assert conda_version.is_prerelease == project_version.is_prerelease
69-
assert conda_version.is_postrelease == project_version.is_postrelease
70-
assert conda_version == project_version
71-
72-
73-
def test_conda_version_is_pep440():
74-
version = Version(get_conda_recipe_version())
75-
assert version is not None
76-
77-
78-
def validate_version(version_str):
79-
try:
80-
version = Version(version_str)
81-
return (version.major, version.minor, version.micro, version.pre, version.post)
82-
except InvalidVersion:
83-
return None
84-
85-
86-
def test_version_is_valid():
87-
assert validate_version(simpeg_drivers.__version__) is not None
77+
json_version = Version(_get_json_version())
78+
assert project_version == json_version

0 commit comments

Comments
 (0)