write and read in build information in json format

This commit is contained in:
Maximilian Keßler 2021-10-22 10:57:16 +02:00
parent b44af744b0
commit cf3edf33c4
2 changed files with 65 additions and 29 deletions

View File

@ -1,3 +1,4 @@
import json
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
@ -13,22 +14,35 @@ def pytex_msg(msg: str):
class TexFileToFormat: class TexFileToFormat:
def __init__(self, src_path: Path, build_dir: Path): def __init__(self, src_path: Path, build_dir: Path, latex_name: str, build_info: BuildInfo):
self.src_path = src_path self.src_path = src_path
self.build_path = build_dir self.build_path = build_dir
self.tex_name = latex_name # Still an identifier on how to name the package when being formatted
self.build_info = build_info
def format(self): def format(self):
if '.pysty' in self.src_path.name: if '.pysty' in self.src_path.name:
formatter = PyTeX.PackageFormatter( formatter = PyTeX.PackageFormatter(
package_name=self.src_path.with_suffix('').name, package_name=self.src_path.with_suffix('').name,
extra_header=[]) # TODO: extra header extra_header=self.build_info.header)
else: else:
formatter = PyTeX.ClassFormatter( formatter = PyTeX.ClassFormatter(
class_name=self.src_path.with_suffix('').name, class_name=self.src_path.with_suffix('').name,
extra_header=[]) # TODO extra_header=self.build_info.header)
pytex_msg('Writing file {}'.format(formatter.file_name)) pytex_msg('Writing file {}'.format(formatter.file_name))
formatter.make_default_macros() formatter.make_default_macros()
formatter.format_file(self.src_path, self.build_path) formatter.format_file(self.src_path, self.build_path)
info = {
'name': formatter.file_name,
'source file': self.src_path.name,
'build time': self.build_info.build_time,
'source version': self.build_info.packages_version,
'source commit hash': self.build_info.packages_hash,
'pytex version': self.build_info.pytex_version,
'pytex commit hash': self.build_info.pytex_hash,
'dirty': False
}
return info
def build( def build(
@ -60,7 +74,11 @@ def build(
pytex_repo=git.Repo(__file__, search_parent_directories=True), # TODO pytex_repo=git.Repo(__file__, search_parent_directories=True), # TODO
packages_repo=git.Repo(src_dir, search_parent_directories=True) # TODO packages_repo=git.Repo(src_dir, search_parent_directories=True) # TODO
) )
old_build_info = {} # TODO: read this in from file input_dir = src_dir if src_dir else input_file.parent
output_dir = build_dir if build_dir else input_file.parent
with open(output_dir / 'build_info.json') as f:
old_build_info = json.load(f)
# extra_header += ['WARNING: Local changes to git repository detected.', # extra_header += ['WARNING: Local changes to git repository detected.',
# ' The build will not be reproducible (!)'] # ' The build will not be reproducible (!)']
@ -79,40 +97,36 @@ def build(
for file in src_dir.glob('*.pycls'): for file in src_dir.glob('*.pycls'):
files.append(file) files.append(file)
input_dir = src_dir if src_dir else input_file.parent
output_dir = build_dir if build_dir else input_file.parent
sources_to_build = [] sources_to_build = []
for file in files: for file in files:
sources_to_build.append( sources_to_build.append(
TexFileToFormat( TexFileToFormat(
src_path=file, src_path=file,
build_dir=output_dir / file.parent.relative_to(input_dir) build_dir=output_dir / file.parent.relative_to(input_dir),
latex_name=latex_name,
build_info=current_build_info
)) ))
for source in sources_to_build: info_dict = {
source.format()
current_build_info = {
'build_time': '', 'build_time': '',
'packages': {
'built': '',
'skipped': ''
},
'classes': {
'built': '',
'skipped': ''
},
'LatexPackages': { 'LatexPackages': {
'version': '', 'version': current_build_info.packages_version,
'branch': '', 'commit': current_build_info.packages_hash,
'commit': '', 'dirty': False # TODO
'dirty': ''
}, },
'PyTeX': { 'PyTeX': {
'version': '', 'version': current_build_info.pytex_version,
'branch': '', 'commit': current_build_info.pytex_hash,
'commit': '', 'dirty': False # TODO
'dirty': '' },
} 'tex_sources': [
]
} }
for source in sources_to_build:
info = source.format()
info_dict['tex_sources'].append(info)
with open(output_dir / 'build_info.json', 'w') as f:
json.dump(info_dict, f, indent=4)
pytex_msg('Build done') pytex_msg('Build done')

View File

@ -32,7 +32,9 @@ class BuildInfo:
author: Optional[str] = None, author: Optional[str] = None,
pytex_repo: Optional[git.Repo] = None, pytex_repo: Optional[git.Repo] = None,
packages_repo: Optional[git.Repo] = None): packages_repo: Optional[git.Repo] = None):
self.author = author self.author = author
self.build_time = datetime.datetime.now().strftime('%Y/%m/%d %H:%M')
self._pytex_repo = pytex_repo self._pytex_repo = pytex_repo
self._packages_repo = packages_repo self._packages_repo = packages_repo
@ -54,6 +56,26 @@ class BuildInfo:
include_pytex_info_text=include_pytex_info_text include_pytex_info_text=include_pytex_info_text
) )
@property
def header(self):
return self._header
@property
def pytex_version(self):
return self._pytex_repo_version
@property
def packages_version(self):
return self._packages_repo_version
@property
def pytex_hash(self):
return self._pytex_repo_commit.hexsha
@property
def packages_hash(self):
return self._packages_repo_commit.hexsha
def get_repo_commits(self): def get_repo_commits(self):
if self._packages_repo: if self._packages_repo:
self._packages_repo_commit = get_latest_commit(self._packages_repo) self._packages_repo_commit = get_latest_commit(self._packages_repo)
@ -73,4 +95,4 @@ class BuildInfo:
include_license: bool = False, include_license: bool = False,
include_git_version: bool = False, include_git_version: bool = False,
include_pytex_info_text: bool = False): include_pytex_info_text: bool = False):
pass self._header = []