Usage is simply
VERSION_PATH=<package name> python <(curl -Ls https://bit.ly/set__version__)
This will set the __version__
variable in <package name/__init__.py
based on either the VERSION
or GITHUB_REF
environment variables.
#!/usr/bin/env python3 | |
""" | |
see https://gist.github.com/samuelcolvin/e49096dc93396be60d2e972e8799410d for details | |
""" | |
import os | |
import re | |
import sys | |
from pathlib import Path | |
version_regex = re.compile(r'^(__version__ ?= ?).+$', flags=re.M) | |
def main(version_path_env_var='VERSION_PATH', version_env_vars=('VERSION', 'GITHUB_REF')) -> str: | |
version_path = os.getenv(version_path_env_var) | |
if not version_path: | |
return f'✖ "{version_path_env_var}" env variable not found' | |
version_path = Path(version_path) | |
if version_path.is_dir(): | |
version_path = version_path / '__init__.py' | |
if not version_path.is_file(): | |
return f'✖ "{version_path}" file does not exist' | |
version = None | |
for var in version_env_vars: | |
version_ref = os.getenv(var) | |
if version_ref: | |
version = re.sub('^refs/tags/v*', '', version_ref.lower()) | |
break | |
if not version: | |
return f'✖ "{version_env_vars}" env variables not found' | |
content = version_path.read_text() | |
if not version_regex.search(content): | |
return f'✖ "{version_path}" does not contain a "__version__ = ..." line' | |
content = re.sub(version_regex, fr"\1'{version}'", content) | |
print(f'✔ writing version "{version}", to {version_path}') | |
version_path.write_text(content) | |
if __name__ == '__main__': | |
err = main() | |
if err: | |
print(err, file=sys.stderr) | |
sys.exit(1) |