from abc import ABC, abstractmethod import json import re class FileHandler(ABC): @classmethod def from_file_path(cls, file_path): config_file_type = file_path.split('.')[-1] match config_file_type: case 'json': file_handler = JsonFileHandler() case 'gradle': file_handler = GradleFileHandler() case _: raise Exception(f'The file type "{config_file_type}" is not implemented') file_handler.config_file_path = file_path file_handler.config_file_type = config_file_type return file_handler @abstractmethod def parse(self) -> tuple[list[int], bool]: pass @abstractmethod def write(self): pass class JsonFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: with open(self.config_file_path, 'r') as json_file: json_version = json.load(json_file)['version'] is_snapshot = False if '-SNAPSHOT' in json_version: is_snapshot = True json_version = json_version.replace('-SNAPSHOT', '') version = [int(x) for x in json_version.split('.')] return version, is_snapshot def write(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() class GradleFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: 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 write(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() a = FileHandler.from_file_path('build.gradle') print(type(a))