From 13b5aa0d2ad44f8294c8716f74b25ec68659b721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Mon, 7 Feb 2022 22:24:14 +0100 Subject: [PATCH] add proper version info object --- PyTeX/build/build/pytex_file.py | 19 +++- .../versioning/version_info/constants.py | 8 ++ .../versioning/version_info/version_info.py | 97 +++++++++++++++---- PyTeX/format/formatting_config.py | 16 +-- ...it_version_info.py => repo_status_info.py} | 2 +- 5 files changed, 110 insertions(+), 32 deletions(-) rename PyTeX/format/{git_version_info.py => repo_status_info.py} (98%) diff --git a/PyTeX/build/build/pytex_file.py b/PyTeX/build/build/pytex_file.py index 018eedb..39a5241 100644 --- a/PyTeX/build/build/pytex_file.py +++ b/PyTeX/build/build/pytex_file.py @@ -1,9 +1,10 @@ from pathlib import Path from typing import Optional, List, Dict, Tuple, Union -from PyTeX.build.paths import RelativePath +from .relative_path import RelativePath from PyTeX.format.formatterif import FormatterIF from PyTeX.build.build.enums import PyTeXFileType +from .hashing import md5 class PyTeXSourceFile: @@ -13,9 +14,19 @@ class PyTeXSourceFile: formatter: Optional[FormatterIF] = None, pytex_file_type: Optional[PyTeXFileType] = None ): - self._relative_path: RelativePath = None - self._pytex_file_type: PyTeXFileType = None - self._formatter: FormatterIF = None + self._relative_path: RelativePath = relative_path + self._pytex_file_type: Optional[PyTeXFileType] = None + self._formatter: Optional[FormatterIF] = None + self._file_hash: Optional[str] = None + + @property + def file_hash(self) -> str: + if self._file_hash is None: + self.update_file_hash() + return self._file_hash + + def update_file_hash(self): + self._file_hash = md5(self._relative_path.path) @property def relative_path(self): diff --git a/PyTeX/build/versioning/version_info/constants.py b/PyTeX/build/versioning/version_info/constants.py index 49ce1fc..50e58de 100644 --- a/PyTeX/build/versioning/version_info/constants.py +++ b/PyTeX/build/versioning/version_info/constants.py @@ -14,3 +14,11 @@ JSON_DIRTY = 'dirty' DEFAULT_VERSION = '0.0.0' DEFAULT_BRANCH = 'NO-BRANCH' DEFAULT_HASH = '0000000000000000000000000000000000000000000000000000000000000000' + +JSON_FILE_HASH = 'file_hash' +JSON_SOURCES_HASH = 'sources_hash' +JSON_RELATIVE_NAME = 'relative_name' +JSON_REPO_STATUS_INFO = 'repo_info' + +NO_RELATIVE_NAME = 'NO_NAME' +NO_BUILD_TIME = 'no_build_time' diff --git a/PyTeX/build/versioning/version_info/version_info.py b/PyTeX/build/versioning/version_info/version_info.py index 429c9a7..c3412f9 100644 --- a/PyTeX/build/versioning/version_info/version_info.py +++ b/PyTeX/build/versioning/version_info/version_info.py @@ -1,31 +1,90 @@ -from typing import Optional +from typing import Optional, List, Dict -from PyTeX.format.git_version_info import GitVersionInfo +from PyTeX.format.repo_status_info import RepoStatusInfo from .constants import * +from ....format.config import Config -class FileVersionInfo: - def __init__(self, dictionary: dict): - if JSON_MD5_CHECKSUM not in dictionary.keys(): - raise NotImplementedError +class FileVersionInfo(Config): + def __init__(self): + self._relative_name: Optional[str] = None + self._file_hash: Optional[str] = None + self._sources_hash: Optional[str] = None + + # Meta properties actually not needed for build itself + self._repo_status_info: Optional[RepoStatusInfo] = None + self._build_time: Optional[str] = None + + def set_from_json(self, content: Optional[Dict]): + content = self._fill_keys(content) + self._relative_name = content[JSON_RELATIVE_NAME] + self._file_hash = content[JSON_FILE_HASH] + self._sources_hash = content[JSON_SOURCES_HASH] + self._build_time = content[JSON_BUILD_TIME] + self._repo_status_info = RepoStatusInfo.from_json( + content[JSON_REPO_STATUS_INFO] + ) + + def to_json(self) -> Dict: + return { + JSON_RELATIVE_NAME: self._relative_name, + JSON_FILE_HASH: self._file_hash, + JSON_SOURCES_HASH: self._sources_hash, + JSON_BUILD_TIME: self._build_time, + JSON_REPO_STATUS_INFO: self._repo_status_info.to_json() + } + + @property + def file_hash(self) -> str: + if self._file_hash is None: + return DEFAULT_HASH else: - self._md5_checksum = dictionary[JSON_MD5_CHECKSUM] + return self._file_hash - self._source_repository_version: Optional[GitVersionInfo] = \ - GitVersionInfo(dictionary[JSON_REPOSITORY]) if JSON_REPOSITORY in dictionary.keys() \ - else None - self._pytex_repository_version: Optional[GitVersionInfo] = \ - GitVersionInfo(dictionary[JSON_PYTEX]) if JSON_PYTEX in dictionary.keys() \ - else None + @file_hash.setter + def file_hash(self, file_hash: str): + self._file_hash = file_hash @property - def md5_checksum(self) -> str: - return self._md5_checksum + def sources_hash(self) -> str: + if self._sources_hash is None: + return DEFAULT_HASH + else: + return self._sources_hash + + @sources_hash.setter + def sources_hash(self, sources_hash: str): + self._sources_hash = sources_hash @property - def source_repository_version(self) -> Optional[GitVersionInfo]: - return self._source_repository_version + def relative_name(self) -> str: + if self._relative_name is None: + return NO_RELATIVE_NAME + else: + return self._relative_name + + @relative_name.setter + def relative_name(self, relative_name: str): + self._relative_name = relative_name @property - def pytex_repository_version(self) -> Optional[GitVersionInfo]: - return self._pytex_repository_version + def repo_status_info(self) -> RepoStatusInfo: + if self._repo_status_info is None: + return RepoStatusInfo() + else: + return self._repo_status_info + + @repo_status_info.setter + def repo_status_info(self, repo_status_info: RepoStatusInfo): + self._repo_status_info = repo_status_info + + @property + def build_time(self) -> str: + if self._build_time is None: + return NO_BUILD_TIME + else: + return self._build_time + + @build_time.setter + def build_time(self, build_time: str): + self._build_time = build_time diff --git a/PyTeX/format/formatting_config.py b/PyTeX/format/formatting_config.py index 9392620..1d48619 100644 --- a/PyTeX/format/formatting_config.py +++ b/PyTeX/format/formatting_config.py @@ -4,21 +4,21 @@ from .constants import * from .enums import NamingScheme from .enums import TeXType, TeXFlavour from .generic_text import GenericText -from .git_version_info import GitVersionInfo +from .repo_status_info import RepoStatusInfo from .config import Config -class VersionInfo(Config): +class GitVersionInfo(Config): def __init__(self): - self._repo_version: Optional[GitVersionInfo] = None - self._pytex_version: Optional[GitVersionInfo] = None + self._repo_version: Optional[RepoStatusInfo] = None + self._pytex_version: Optional[RepoStatusInfo] = None def set_from_json(self, content: Optional[Dict]): content = self._fill_keys(content) - self._repo_version = GitVersionInfo.from_json( + self._repo_version = RepoStatusInfo.from_json( content[YAML_REPO] ) - self._pytex_version = GitVersionInfo.from_json( + self._pytex_version = RepoStatusInfo.from_json( content[YAML_PYTEX] ) @@ -29,14 +29,14 @@ class VersionInfo(Config): } @property - def pytex_version(self) -> Optional[GitVersionInfo]: + def pytex_version(self) -> Optional[RepoStatusInfo]: if self._pytex_version is None: return None else: return self._pytex_version @property - def repo_version(self) -> Optional[GitVersionInfo]: + def repo_version(self) -> Optional[RepoStatusInfo]: if self._repo_version is None: return None else: diff --git a/PyTeX/format/git_version_info.py b/PyTeX/format/repo_status_info.py similarity index 98% rename from PyTeX/format/git_version_info.py rename to PyTeX/format/repo_status_info.py index a14ff3c..fb05412 100644 --- a/PyTeX/format/git_version_info.py +++ b/PyTeX/format/repo_status_info.py @@ -4,7 +4,7 @@ from PyTeX.build.versioning.version_info.constants import * from .config import Config -class GitVersionInfo(Config): +class RepoStatusInfo(Config): def __init__(self): self._dirty: Optional[bool] = None