Skip to content

Commit 0122840

Browse files
committed
X
1 parent b90f670 commit 0122840

File tree

4 files changed

+31
-144
lines changed

4 files changed

+31
-144
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ share/python-wheels/
3333
.installed.cfg
3434
*.egg
3535
MANIFEST
36+
# auto-generated by setuptools-scm — do not commit
37+
bloom_lims/_scm_version.py
3638
dags/
3739
supabase.env
3840
.env

bloom_lims/_version.py

Lines changed: 25 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,41 @@
11
"""
2-
Dynamic version management for BLOOM LIMS.
2+
Version management for BLOOM LIMS.
33
4-
Fetches version from the most recent non-prerelease GitHub release.
5-
Caches result and provides fallback for offline/error scenarios.
4+
Version resolution priority:
5+
1. BLOOM_VERSION environment variable (override / CI)
6+
2. importlib.metadata (installed package)
7+
3. bloom_lims._scm_version (generated by setuptools-scm at build time)
8+
4. Hard fallback "0.0.0.dev0"
9+
10+
_scm_version.py is auto-generated — do not edit or commit it.
611
"""
712

8-
import logging
13+
from __future__ import annotations
14+
915
import os
10-
import re
1116
from functools import lru_cache
12-
from typing import Optional
13-
14-
logger = logging.getLogger(__name__)
15-
16-
# Fallback version if GitHub is unreachable (update when making releases)
17-
FALLBACK_VERSION = "0.11.2"
18-
19-
# GitHub repo info
20-
GITHUB_OWNER = "Daylily-Informatics"
21-
GITHUB_REPO = "bloom"
22-
23-
24-
def _parse_version_from_name(name: str) -> Optional[str]:
25-
"""
26-
Extract version number from release name.
27-
28-
Handles formats like:
29-
- "v0.10.7"
30-
- "v0.9.5 -- First Demo Version"
31-
- "0.8.4"
32-
"""
33-
if not name:
34-
return None
35-
36-
# Match version pattern: optional 'v', then numbers with dots
37-
match = re.match(r"v?(\d+\.\d+\.?\d*)", name.strip())
38-
if match:
39-
return match.group(1)
40-
return None
41-
42-
43-
def _fetch_version_from_github() -> Optional[str]:
44-
"""
45-
Fetch version from GitHub releases API.
46-
47-
Returns the version string of the most recent non-prerelease,
48-
non-draft release, or None if unavailable.
49-
"""
50-
try:
51-
import requests
52-
53-
url = f"https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/releases"
54-
response = requests.get(
55-
url,
56-
timeout=5,
57-
params={"per_page": 20},
58-
headers={"Accept": "application/vnd.github.v3+json"}
59-
)
60-
response.raise_for_status()
61-
62-
releases = response.json()
63-
64-
# Find first non-prerelease, non-draft release
65-
for release in releases:
66-
if release.get("prerelease", False) or release.get("draft", False):
67-
continue
68-
69-
# Try tag_name first, then name
70-
version = _parse_version_from_name(
71-
release.get("tag_name") or release.get("name", "")
72-
)
73-
if version:
74-
logger.debug(f"Fetched version {version} from GitHub releases")
75-
return version
76-
77-
logger.debug("No valid non-prerelease found in GitHub releases")
78-
return None
79-
80-
except ImportError:
81-
logger.debug("requests module not available for GitHub version fetch")
82-
return None
83-
except Exception as e:
84-
logger.debug(f"Failed to fetch version from GitHub: {e}")
85-
return None
8617

8718

8819
@lru_cache(maxsize=1)
8920
def get_version() -> str:
90-
"""
91-
Get the BLOOM LIMS version.
92-
93-
Priority:
94-
1. BLOOM_VERSION environment variable (for override/testing)
95-
2. Most recent non-prerelease GitHub release
96-
3. FALLBACK_VERSION constant
97-
98-
Result is cached for the lifetime of the process.
99-
"""
100-
# Allow override via environment variable
21+
"""Return the BLOOM LIMS version string."""
10122
env_version = os.environ.get("BLOOM_VERSION")
10223
if env_version:
103-
logger.debug(f"Using version from BLOOM_VERSION env var: {env_version}")
10424
return env_version
105-
106-
# Try fetching from GitHub
107-
github_version = _fetch_version_from_github()
108-
if github_version:
109-
return github_version
110-
111-
# Fall back to hardcoded version
112-
logger.debug(f"Using fallback version: {FALLBACK_VERSION}")
113-
return FALLBACK_VERSION
25+
26+
try:
27+
from importlib.metadata import version
28+
return version("bloom_lims")
29+
except Exception:
30+
pass
31+
32+
try:
33+
from bloom_lims._scm_version import __version__ as scm_version
34+
return scm_version
35+
except ImportError:
36+
pass
37+
38+
return "0.0.0.dev0"
11439

11540

11641
def clear_version_cache() -> None:

pyproject.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# =============================================================================
1313

1414
[build-system]
15-
requires = ["setuptools>=61.0", "wheel"]
15+
requires = ["setuptools>=61.0", "wheel", "setuptools-scm>=8.0"]
1616
build-backend = "setuptools.build_meta"
1717

1818
[project]
@@ -59,8 +59,9 @@ dev = [
5959
[project.scripts]
6060
bloom = "bloom_lims.cli:main"
6161

62-
[tool.setuptools.dynamic]
63-
version = {attr = "bloom_lims._version.FALLBACK_VERSION"}
62+
[tool.setuptools_scm]
63+
version_file = "bloom_lims/_scm_version.py"
64+
fallback_version = "0.0.0.dev0"
6465

6566
[tool.setuptools.packages.find]
6667
where = ["."]

setup.py

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)