From d1ed1718c42e76c39ef8ebfb39d362104df215e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Sun, 6 Feb 2022 23:52:44 +0100 Subject: [PATCH] add to generic text. dump formatting config to json --- PyTeX/format/constants.py | 28 +++++++++++++ PyTeX/format/formatting_config.py | 69 ++++++++++++++++++++++++++++--- PyTeX/format/generic_text.py | 58 +++++++++++++++++++------- 3 files changed, 135 insertions(+), 20 deletions(-) diff --git a/PyTeX/format/constants.py b/PyTeX/format/constants.py index fdd8f56..79256c3 100644 --- a/PyTeX/format/constants.py +++ b/PyTeX/format/constants.py @@ -4,3 +4,31 @@ PYTEX_CONFIG_FILE_EXTENSION = '.conf' DICTIONARY_KEY_COLUMN_NAME = 'key' DICTIONARY_NAMING_PATTERN = 'translator-{dict_name}-dictionary-{language}.dict' FORMATTER_PREFIX = '!' + +YAML_INFO = 'info' +YAML_NAMING_SCHEME = 'name' +YAML_LICENSE = 'license' +YAML_INCLUDE_LICENSE = 'include' +YAML_DESCRIPTION = 'description' +YAML_EXTRA = 'extra' +YAML_HEADER = 'header' +YAML_INCLUDE_EXTRA_HEADER = 'include' +YAML_INCLUDE_BUILD_TIME = 'time' +YAML_INCLUDE_VERSION = 'version' +YAML_INCLUDE_INFO_TEXT = 'text' +YAML_INCLUDE_TIME = 'time' +YAML_AUTHOR = 'author' +YAML_VERSION = 'version' +YAML_PATH = 'path' +YAML_INCLUDE_DRV = 'drv' +YAML_INCLUDE_INS = 'ins' +YAML_DOCSTRIP_GUARDS = 'guards' +YAML_DEPENDENCIES = 'dependencies' +YAML_DOC_DEPENDENCIES = 'doc' +YAML_TEX_DEPENDENCIES = 'tex' +YAML_TEX_FLAVOUR = 'flavour' +YAML_TEX_TYPE = 'type' +YAML_TEXT = 'text' +YAML_REPO = 'repo' +YAML_PYTEX = 'pytex' +YAML_DOCSTRIP = 'docstrip' \ No newline at end of file diff --git a/PyTeX/format/formatting_config.py b/PyTeX/format/formatting_config.py index c1384a8..fd1b40d 100644 --- a/PyTeX/format/formatting_config.py +++ b/PyTeX/format/formatting_config.py @@ -6,6 +6,8 @@ from .enums import NamingScheme from .generic_text import GenericText from .formatterif import Config from .git_version_info import GitVersionInfo +from .constants import * +from .enums import TeXType, TeXFlavour class VersionInfo: @@ -35,12 +37,12 @@ class FormattingConfig(Config): self._description: Optional[str] = None self._include_extra_header: Optional[bool] = None - self._include_build_time: Optional[bool] = None self._include_pytex_version: Optional[bool] = None self._include_pytex_info_text: Optional[bool] = None self._include_repo_version: Optional[bool] = None self._include_repo_info_text: Optional[bool] = None self._include_time: Optional[bool] = None + self._include_license: Optional[bool] = None self._extra_header: Optional[GenericText] = None self._author: Optional[str] = None @@ -55,6 +57,12 @@ class FormattingConfig(Config): self._doc_dependencies: Optional[List[str]] = None self._tex_dependencies: Optional[List[str]] = None + self._tex_type: Optional[TeXType] = None + self._tex_flavour: Optional[TeXFlavour] = None + + def set_from_json(self, content: Dict): + pass + @classmethod def from_yaml(cls, content: Path): with open(content, 'r') as config: @@ -66,11 +74,60 @@ class FormattingConfig(Config): if isinstance(content, Path): with open(content, 'r') as config: content: Dict = json.load(config) - + config = FormattingConfig() + config.set_from_json(content) + return config def to_yaml(self) -> str: pass + def to_json(self) -> Dict: + return { + YAML_INFO: { + YAML_AUTHOR: self._author, + YAML_NAMING_SCHEME: self._naming_scheme, + YAML_TEX_FLAVOUR: self._tex_flavour, + YAML_TEX_TYPE: self._tex_type, + YAML_VERSION: self._version + }, + YAML_HEADER: { + YAML_EXTRA: { + YAML_INCLUDE_EXTRA_HEADER: self._include_extra_header, + YAML_PATH: self._extra_header.path, + YAML_TEXT: self._extra_header.real_text + }, + YAML_REPO: { + YAML_INCLUDE_INFO_TEXT: self._include_repo_info_text, + YAML_INCLUDE_VERSION: self._include_repo_version, + YAML_PATH: self._repo_info_text.path, + YAML_TEXT: self._repo_info_text.real_text + }, + YAML_PYTEX: { + YAML_INCLUDE_INFO_TEXT: self._include_pytex_info_text, + YAML_INCLUDE_VERSION: self._include_pytex_version, + YAML_PATH: self._pytex_info_text.path, + YAML_TEXT: self._pytex_info_text.real_text + }, + YAML_INCLUDE_TIME: self._include_time, + YAML_LICENSE: { + YAML_INCLUDE_LICENSE: self._include_license, + YAML_PATH: self._license.path, + YAML_TEXT: self._license.real_text + }, + YAML_DESCRIPTION: self._description + }, + YAML_DOCSTRIP: { + YAML_INCLUDE_DRV: self._include_drv, + YAML_INCLUDE_INS: self._include_ins, + YAML_DOCSTRIP_GUARDS: self._docstrip_guards + }, + YAML_DEPENDENCIES: { + YAML_DOC_DEPENDENCIES: self._doc_dependencies, + YAML_TEX_DEPENDENCIES: self._tex_dependencies + } + } + + @property def naming_scheme(self) -> NamingScheme: if self._naming_scheme is None: @@ -85,7 +142,7 @@ class FormattingConfig(Config): @property def license(self) -> GenericText: if self._license is None: - return GenericText([]) + return GenericText() else: return self._license @@ -162,7 +219,7 @@ class FormattingConfig(Config): @property def extra_header(self) -> GenericText: if self._extra_header is None: - return GenericText([]) + return GenericText() else: return self._extra_header @@ -195,7 +252,7 @@ class FormattingConfig(Config): @property def pytex_info_text(self) -> GenericText: if self._pytex_info_text is None: - return GenericText([]) + return GenericText() else: return self._pytex_info_text @@ -206,7 +263,7 @@ class FormattingConfig(Config): @property def repo_info_text(self) -> GenericText: if self._repo_info_text is None: - return GenericText([]) + return GenericText() else: return self._repo_info_text diff --git a/PyTeX/format/generic_text.py b/PyTeX/format/generic_text.py index 437b505..d7616d2 100644 --- a/PyTeX/format/generic_text.py +++ b/PyTeX/format/generic_text.py @@ -4,41 +4,57 @@ from ..logger import logger class GenericText: - def __init__(self, content: Union[List[str], Path]): + def __init__(self, content: Optional[Union[List[str], Path]] = None): if isinstance(content, List): self._content: Optional[List[str]] = content self._path = None - else: + self._initialized = True + if isinstance(content, Path): self._content: Optional[List[str]] = None self._path = content + self._initialized = True + else: + self._content = None + self._path = None + self._initialized = False @property def text(self) -> List[str]: - if self._content is None: - try: - with open(self._path, 'r') as file: - self._content = file.readlines() - except FileNotFoundError: - raise NotImplementedError - except: - raise NotImplementedError - return self._content + if self._initialized: + if self._content is None: + try: + with open(self._path, 'r') as file: + self._content = file.readlines() + except FileNotFoundError: + raise NotImplementedError + except: + raise NotImplementedError + return self._content + else: + return [] @text.setter - def text(self, content: Union[List[str], Path]) -> None: + def text(self, content: Union[List[str], Path, None]) -> None: if isinstance(content, List): self._content = content self._path = None - else: + self._initialized = True + elif isinstance(content, Path): self._content = None self._path = content + self._initialized = True + else: + self._content = None + self._path = None + self._initialized = False + @property def path(self) -> Optional[Path]: return self._path def format(self, **kwargs) -> str: lines = [] - for line in self._content: + for line in self.text: try: line = '% ' + line.format(**kwargs).rjust(77) + '%' if len(line) > 80: @@ -49,7 +65,21 @@ class GenericText: raise NotImplementedError return '\n'.join(lines) + def has_value(self) -> bool: + return self._initialized + + @property + def real_text(self) -> Optional[List[str]]: + if self.has_value(): + return self._content + else: + return None + def __add__(self, other): + if not self.has_value(): + return other + if not other.has_value(): + return self if isinstance(other, GenericText): return GenericText(self.text + other.text) else: