import json from enum import Enum import re def init_project(): # validate_values() version = Version.from_file('build.gradle') version.increment(ReleaseLevel.SNAPSHOT) version.write() def prepare_release(): pass def release_in_git(): pass class ReleaseLevel(Enum): MAJOR = 0 MINOR = 1 PATCH = 2 SNAPSHOT = 3 class Version(): def __init__(self, version, is_snapshot): self.version = version self.is_snapshot = is_snapshot @classmethod def from_file(cls, config_file_path): ret_cls = cls(None, False) ret_cls.config_file_path = config_file_path ret_cls.config_file_type = config_file_path.split('.')[-1] ret_cls.parse() return ret_cls def parse(self): match self.config_file_type: case 'json': self.__parse_json() case 'gradle': self.__parse_gradle() case _: raise Exception(f'The file type "{self.config_file_type}" is not implemented') def __parse_json(self): with open(self.config_file_path, 'r') as json_file: json_version = json.load(json_file)['version'] if '-SNAPSHOT' in json_version: self.is_snapshot = True json_version = json_version.replace('-SNAPSHOT', '') self.version = [int(x) for x in json_version.split('.')] def __parse_gradle(self): with open(self.config_file_path, 'r') as gradle_file: contents = gradle_file.read() version_line = re.search("\nversion = .*\n", contents) if version_line is None: raise Exception("Version not found in gradle file") version_line = version_line.group() version_string = re.search('[0-9]*\\.[0-9]*\\.[0-9]*(-SNAPSHOT)?', version_line) if version_string is None: raise Exception("Version not found in gradle file") version_string = version_string.group() if '-SNAPSHOT' in version_string: self.is_snapshot = True version_string = version_string.replace('-SNAPSHOT', '') self.version = [int(x) for x in version_string.split('.')] def increment(self, level: ReleaseLevel): self.is_snapshot = False match level: case ReleaseLevel.SNAPSHOT: self.is_snapshot = True case ReleaseLevel.PATCH: self.version[ReleaseLevel.PATCH.value] += 1 case ReleaseLevel.MINOR: self.version[ReleaseLevel.PATCH.value] = 0 self.version[ReleaseLevel.MINOR.value] += 1 case ReleaseLevel.MAJOR: self.version[ReleaseLevel.PATCH.value] = 0 self.version[ReleaseLevel.MINOR.value] = 0 self.version[ReleaseLevel.MAJOR.value] += 1 def write(self): match self.config_file_type: case 'json': self.__write_json() case 'gradle': self.__write_gradle() case _: raise Exception(f'The file type "{self.config_file_type}" is not implemented') def __write_json(self): with open(self.config_file_path, 'r+') as json_file: json_data = json.load(json_file) json_data['version'] = self.get() json_file.seek(0) json.dump(json_data, json_file, indent=4) json_file.truncate() def __write_gradle(self): with open(self.config_file_path, 'r+') as gradle_file: gradle_contents = gradle_file.read() version_substitute = re.sub("\nversion = .*\n", f'\nversion = "{self.get()}"\n', gradle_contents) gradle_file.seek(0) gradle_file.write(version_substitute) gradle_file.truncate() def get(self) -> str: version_string = ".".join([str(x) for x in self.version]) if self.is_snapshot: version_string += "-SNAPSHOT" return version_string