Spaces:
Runtime error
Runtime error
"""Module for managing the version updates of a python package.""" | |
import os | |
import sys | |
import re | |
import logging | |
import shlex | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
def read_version(): | |
""" | |
Gets and extracts the version number from the '__init__.py' file of | |
a Python package. | |
Returns: | |
str or None: The version number of the package if found, otherwise None. | |
""" | |
with open('gpt_computer_assistant/__init__.py', 'r') as file: | |
for line in file: | |
match = re.search(r"__version__ = '(.*)'", line) | |
if match: | |
return match.group(1) | |
def increment_version(part, version): | |
""" | |
Simple function that increments the version number based on the given part | |
i.e., ('major', 'minor', or 'patch'). | |
Notes: | |
Splits the version string into major, minor, and patch components, then | |
increments the specified part by one | |
Args: | |
part (str): The part of the version number to increment | |
('major', 'minor', or 'patch'). | |
version (str): The current version number in 'major.minor.patch' format. | |
Returns: | |
str: String containing new changes made to the version. | |
""" | |
major, minor, patch = map(int, version.split('.')) | |
if part == 'major': | |
major += 1 | |
minor = 0 | |
patch = 0 | |
elif part == 'minor': | |
minor += 1 | |
patch = 0 | |
elif part == 'patch': | |
patch += 1 | |
return f'{major}.{minor}.{patch}' | |
def write_version(version): | |
""" | |
Updates the `__version__` variable in the `__init__.py` file of the | |
`gpt_computer_assistant` package. | |
Args: | |
version (str): The new version number to replace the existing one. | |
""" | |
with open('gpt_computer_assistant/__init__.py', 'r+') as file: | |
content = file.read() | |
content = re.sub(r"__version__ = '.*'", f"__version__ = '{version}'", content) | |
file.seek(0) | |
file.write(content) | |
def update_version(version): | |
""" | |
Updates the version number found in a list of files. | |
Args: | |
version (str): The new version number to replace the existing one. | |
""" | |
files = ['setup.py'] | |
for file in files: | |
with open(file, 'r+') as f: | |
content = f.read() | |
content = re.sub(r' version=".*"', f' version="{version}"', content) | |
f.seek(0) | |
f.write(content) | |
def create_tag(version): | |
""" | |
Uses the `os.system()` to create a `Git tag` for a specified version. | |
Args: | |
version (str): The version number for the git tag. | |
""" | |
os.system(f"git tag v{shlex.quote(version)}") | |
def create_commit(version): | |
""" | |
Uses `os.system()` to add and commit the changed version number | |
to the Git repository. | |
Args: | |
version (str): Version number included in the commit message. | |
""" | |
os.system("git add .") | |
os.system(f"git commit -m 'Changed version number with v{shlex.quote(version)}'") | |
def push(): | |
"""Pushes changes and tags to the repository.""" | |
os.system("git push") | |
os.system("git push --tag") | |
def main(): | |
"""The main function for managing version updates.""" | |
valid_parts = ['major', 'minor', 'patch'] | |
if len(sys.argv) != 2 or sys.argv[1] not in valid_parts: | |
logger.error(f"Usage: python version.py <{'|'.join(valid_parts)}>") | |
sys.exit(1) | |
part = sys.argv[1] | |
version = read_version() | |
new_version = increment_version(part, version) | |
write_version(new_version) | |
update_version(new_version) | |
create_commit(new_version) | |
create_tag(new_version) | |
push() | |
if __name__ == '__main__': | |
main() | |