From 410bf3d519c81ce2edb82200e949c303f7d98e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Wed, 9 Feb 2022 01:22:25 +0100 Subject: [PATCH] set up version info after build --- PyTeX/build/build/builder.py | 73 ++++++++++++++++++++++-------- PyTeX/build/build/relative_path.py | 8 ++++ PyTeX/format/config.py | 2 +- 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/PyTeX/build/build/builder.py b/PyTeX/build/build/builder.py index ed56dc2..8732538 100644 --- a/PyTeX/build/build/builder.py +++ b/PyTeX/build/build/builder.py @@ -1,9 +1,11 @@ +import json from pathlib import Path from typing import Optional, Union, List, Tuple, Set import shutil from .enums import PyTeXRootDirType from .pytex_config import PyTeXConfig +from ...format.formatting_config import FormattingConfig from ...logger import logger from .constants import * from ..versioning.version_info.version_info import VersionInfo, FileVersionInfo @@ -35,6 +37,7 @@ class PyTeXBuilder: # Non-public attributes self._build_target_type: Optional[PyTeXRootDirType] = None self._old_version_info: Optional[VersionInfo] = None + self._new_version_info: VersionInfo = VersionInfo() self._output_files: List[PyTeXOutputFile] = [] self._pytex_files: List[PyTeXSourceFile] = [] self._files_to_clean: Set[RelativePath] = set() @@ -42,6 +45,10 @@ class PyTeXBuilder: self._files_to_build: Set[PyTeXSourceFile] = set() self._tmp_dir: Path = self._root_dir / '.pytex' + @classmethod + def is_ignored_in_build_dir(cls, path: RelativePath): + return path.relative_path.name == VERSION_INFO_FILE + def build_tex_sources(self) -> bool: self._build_target_type = PyTeXRootDirType.TEX_SOURCE return self._build() @@ -179,11 +186,12 @@ class PyTeXBuilder: for file in self.target_root.rglob('*') ] for file in out_dir_files: - if not file.relative_path.is_dir(): + if not file.is_dir(): version = self._old_version_lookup(file) if version.file_hash != md5(file.path): if self.pytex_config.clean_old_files: - raise NotImplementedError # Not ok + if not self.is_ignored_in_build_dir(file): + raise NotImplementedError # Not ok else: if self.pytex_config.overwrite_existing_files: self._files_to_overwrite.add(file) @@ -193,10 +201,13 @@ class PyTeXBuilder: raise NotImplementedError # Not ok iff we are going to write this file - def _dependencies_hash(self, pytex_output_file: PyTeXOutputFile) -> str: - t = pytex_output_file.dependencies - deps: Set[str] = set(t) - deps.add(pytex_output_file.source_file.relative_path.path.name) + def _dependencies_hash(self, file: Union[PyTeXOutputFile, PyTeXSourceFile]) -> str: + if isinstance(file, PyTeXOutputFile): + deps: Set[str] = set(file.dependencies) + deps.add(file.source_file.relative_path.path.name) + else: + deps = set(file.formatter.dependencies) + deps.add(file.relative_path.path.name) hashes = set() for dep in deps: hashes.add( @@ -207,26 +218,44 @@ class PyTeXBuilder: def _init_output_files(self): for source_file in self._pytex_files: for output_file in source_file.output_files: + h = output_file.with_root(self.target_root) + f = PyTeXOutputFile( + output_file=h, + source_file=source_file, + last_version_info=self._old_version_lookup(output_file) + ) self._output_files.append( - PyTeXOutputFile( - output_file=output_file, - source_file=source_file, - last_version_info=self._old_version_lookup(output_file) - ) + f ) def _compute_files_to_build(self): - self._files_to_build = { - output_file.source_file for output_file in self._output_files - if self._dependencies_hash(output_file) != output_file.last_version_info.sources_hash - or output_file.last_version_info.file_hash != output_file.file_hash - } + self._new_version_info.files = [] + for output_file in self._output_files: + if self._dependencies_hash(output_file) != output_file.last_version_info.sources_hash \ + or output_file.last_version_info.file_hash != output_file.file_hash: + self._files_to_build.add(output_file.source_file) + else: + self._new_version_info.files.append(output_file.last_version_info) # File will not change + # TODO actually, this is not totally correct def _build_files(self): for source_file in self._files_to_build: out_dir = self._tmp_dir / source_file.file_hash out_dir.mkdir(exist_ok=False, parents=True) - source_file.format(self._tmp_dir / source_file.file_hash) + new_config: List[Tuple[RelativePath, FormattingConfig]] = \ + source_file.format(self._tmp_dir / source_file.file_hash) + for output_file in source_file.output_files: + # TODO: handle this new config file + # TODO: handle git stuff / meta info stuff + file_version_info = FileVersionInfo() + file_version_info.relative_name = str(output_file.relative_path) + file_version_info.file_hash = str(md5( + self._tmp_dir / source_file.file_hash / output_file.relative_path.name + )) + file_version_info.sources_hash = self._dependencies_hash(source_file) + self._new_version_info.files.append( + file_version_info + ) def _move_files(self): for source_file in self._files_to_build: @@ -238,7 +267,11 @@ class PyTeXBuilder: tmp_dir / filename.relative_path.name, out_dir / filename.relative_path.name ) - shutil.rmtree(self._tmp_dir) + if self._tmp_dir.exists(): + shutil.rmtree(self._tmp_dir) + + def _write_version_info(self): + self._new_version_info.dump_as_json(self.target_root / VERSION_INFO_FILE) def _build(self) -> bool: logger.info("Starting build") @@ -247,9 +280,13 @@ class PyTeXBuilder: self._init_output_files() logger.info(f"Found {len(self._output_files)} potential files to build.") self._compute_files_to_build() + if len(self._files_to_build) == 0: + logger.info(f"Everything up to date, nothing to build!") + return True logger.info(f"Needing to build {len(self._files_to_build)} many files.") self._check_output_directory_integrity() logger.info(f"Starting build") self._build_files() self._move_files() + self._write_version_info() return True diff --git a/PyTeX/build/build/relative_path.py b/PyTeX/build/build/relative_path.py index baa4f7c..3d9501a 100644 --- a/PyTeX/build/build/relative_path.py +++ b/PyTeX/build/build/relative_path.py @@ -1,3 +1,4 @@ +from ctypes import Union from pathlib import Path from PyTeX.build.build.enums import PyTeXRootDirType @@ -14,6 +15,7 @@ class RelativePath: *args, **kwargs ): + pass self._path = Path(*args, **kwargs) self._root_dir = root_dir @@ -59,3 +61,9 @@ class RelativePath: return self.relative_to(self._root_dir) except ValueError as e: raise NotImplementedError + + def with_root(self, root: Path): + return RelativePath( + root, + root / self.relative_path + ) diff --git a/PyTeX/format/config.py b/PyTeX/format/config.py index 29c7daf..b07d562 100644 --- a/PyTeX/format/config.py +++ b/PyTeX/format/config.py @@ -79,7 +79,7 @@ class Config: else: simple_dict = self.to_json() if simple_dict is not None: - json.dump(simple_dict, config) + json.dump(simple_dict, config, indent=4) else: pass # TODO