refactor files into better module structure

This commit is contained in:
Maximilian Keßler 2021-10-22 14:45:32 +02:00
parent de10ca7546
commit 4c3867e0f4
15 changed files with 140 additions and 133 deletions

View File

@ -1,9 +1,7 @@
from .config import LICENSE, DEFAULT_AUTHOR, PACKAGE_INFO_TEXT, PYTEX_INFO_TEXT
from .enums import Attributes, Args from .enums import Attributes, Args
__all__ = [ __all__ = [
'LICENSE', 'LICENSE',
'DEFAULT_AUTHOR',
'PACKAGE_INFO_TEXT', 'PACKAGE_INFO_TEXT',
'PYTEX_INFO_TEXT', 'PYTEX_INFO_TEXT',
'Args', 'Args',

View File

@ -0,0 +1,5 @@
from .build import build
__all__ = [
'build'
]

View File

@ -4,101 +4,9 @@ from typing import Optional
import git import git
import PyTeX from PyTeX.config.constants import BUILD_INFO_FILENAME
from .build_information import BuildInfo from .utils import BuildInfo, pytex_msg, TexFileToFormat
from PyTeX.build.git_hook.recent import is_recent
from PyTeX.build.git_hook.git_version import get_latest_commit
BUILD_INFO_FILENAME = 'build_info.json'
def pytex_msg(msg: str):
print('[PyTeX] ' + msg)
class TexFileToFormat:
def __init__(
self,
src_path: Path,
build_dir: Path,
latex_name: str,
current_build_info: BuildInfo,
last_build_info: Optional[dict],
allow_dirty: bool = False,
overwrite_existing_files: bool = False,
build_all: bool = False):
self.src_path = src_path
self.build_path = build_dir
self.tex_name = latex_name # Still an identifier on how to name the package when being formatted
self.current_build_info = current_build_info
self.last_build_info = last_build_info
self.allow_dirty = allow_dirty
self.overwrite_existing_files: overwrite_existing_files
self.build_all = build_all
self.dirty = not is_recent(self.src_path, self.current_build_info.package_repo, compare=None)
self.pytex_dirty: bool = self.current_build_info.pytex_repo.is_dirty(
working_tree=True,
untracked_files=True
)
if self.last_build_info:
self.recent: bool = is_recent(
file=self.src_path,
repo=self.current_build_info.package_repo,
compare=self.current_build_info.package_repo.commit(self.last_build_info['source commit hash'])
)
self.pytex_recent: bool = get_latest_commit(
self.current_build_info.pytex_repo
).hexsha == self.last_build_info['pytex commit hash']
else:
self.recent = False
self.pytex_recent = False
def format(self) -> dict:
if self.dirty or self.pytex_dirty:
if not self.allow_dirty:
raise Exception(
'{file} is dirty, but writing dirty files not allowed.'.format(
file=self.src_path.name if self.dirty else 'Submodule PyTeX')
)
# TODO: add this to the header...?
return self.__format() # Dirty files are always built, since we have no information about them
elif self.build_all:
return self.__format() # Build file since we build all of them
elif not self.pytex_recent or not self.recent:
return self.__format() # Build file since either pytex or package repo is not recent
elif self.last_build_info and self.last_build_info['dirty']:
return self.__format() # Build file since we do not know in what state it is
else:
return self.last_build_info
def __format(self) -> dict:
if '.pysty' in self.src_path.name:
formatter = PyTeX.PackageFormatter(
package_name=self.src_path.with_suffix('').name,
extra_header=self.current_build_info.header)
elif '.pycls' in self.src_path.name:
formatter = PyTeX.ClassFormatter(
class_name=self.src_path.with_suffix('').name,
extra_header=self.current_build_info.header)
else:
exit(1)
pytex_msg('Writing file {}'.format(formatter.file_name))
formatter.make_default_macros()
formatter.format_file(self.src_path, self.build_path)
info = {
'name': formatter.file_name,
'source file': self.src_path.name,
'build time': self.current_build_info.build_time,
'source version': self.current_build_info.packages_version,
'source commit hash': self.current_build_info.packages_hash,
'pytex version': self.current_build_info.pytex_version,
'pytex commit hash': self.current_build_info.pytex_hash,
'dirty': self.dirty
}
return info
def build( def build(

View File

@ -1,5 +0,0 @@
from .build import build
__all__ = [
'build'
]

View File

@ -1,10 +0,0 @@
BUILD_DETAILS = [
"Build details:",
" Build time: {build_time}",
" PyTeX version: {pytex_version} (commit {pytex_commit_hash})",
" LatexPackages version: {packages_version} (commit {packages_commit_hash})"
]
FILENAME_TYPE_PREPEND_AUTHOR = 'prepend-author'
FILENAME_TYPE_RAW_NAME = 'raw'
DATE_FORMAT = '%Y/%m/%d %H:%M'

View File

@ -0,0 +1,9 @@
from .build_information import BuildInfo
from .pytex_file import TexFileToFormat
from .pytex_msg import pytex_msg
__all__ = [
'BuildInfo',
'TexFileToFormat',
'pytex_msg'
]

View File

@ -4,22 +4,6 @@ from typing import Optional
from PyTeX.build.git_hook import git_describe, get_latest_commit from PyTeX.build.git_hook import git_describe, get_latest_commit
from .config import BUILD_DETAILS
def build_information():
repo = git.Repo()
repo_description = git_describe(get_latest_commit(repo))
pytex_repo = repo.submodule('PyTeX').module()
pytex_repo_description = git_describe(get_latest_commit(pytex_repo))
return list(map(lambda line: line.format(
build_time=datetime.datetime.now().strftime('%Y/%m/%d %H:%M'),
pytex_version=pytex_repo_description,
pytex_commit_hash=get_latest_commit(pytex_repo).hexsha[0:7],
packages_version=repo_description,
packages_commit_hash=get_latest_commit(repo).hexsha[0:7]
), BUILD_DETAILS)), repo_description
class BuildInfo: class BuildInfo:
def __init__( def __init__(

93
build/utils/pytex_file.py Normal file
View File

@ -0,0 +1,93 @@
from pathlib import Path
from typing import Optional
from PyTeX.build.git_hook import is_recent, get_latest_commit
from PyTeX import PackageFormatter, ClassFormatter
from .pytex_msg import pytex_msg
from .build_information import BuildInfo
class TexFileToFormat:
def __init__(
self,
src_path: Path,
build_dir: Path,
latex_name: str,
current_build_info: BuildInfo,
last_build_info: Optional[dict],
allow_dirty: bool = False,
overwrite_existing_files: bool = False,
build_all: bool = False):
self.src_path = src_path
self.build_path = build_dir
self.tex_name = latex_name # Still an identifier on how to name the package when being formatted
self.current_build_info = current_build_info
self.last_build_info = last_build_info
self.allow_dirty = allow_dirty
self.overwrite_existing_files: overwrite_existing_files
self.build_all = build_all
self.dirty = not is_recent(self.src_path, self.current_build_info.package_repo, compare=None)
self.pytex_dirty: bool = self.current_build_info.pytex_repo.is_dirty(
working_tree=True,
untracked_files=True
)
if self.last_build_info:
self.recent: bool = is_recent(
file=self.src_path,
repo=self.current_build_info.package_repo,
compare=self.current_build_info.package_repo.commit(self.last_build_info['source commit hash'])
)
self.pytex_recent: bool = get_latest_commit(
self.current_build_info.pytex_repo
).hexsha == self.last_build_info['pytex commit hash']
else:
self.recent = False
self.pytex_recent = False
def format(self) -> dict:
if self.dirty or self.pytex_dirty:
if not self.allow_dirty:
raise Exception(
'{file} is dirty, but writing dirty files not allowed.'.format(
file=self.src_path.name if self.dirty else 'Submodule PyTeX')
)
# TODO: add this to the header...?
return self.__format() # Dirty files are always built, since we have no information about them
elif self.build_all:
return self.__format() # Build file since we build all of them
elif not self.pytex_recent or not self.recent:
return self.__format() # Build file since either pytex or package repo is not recent
elif self.last_build_info and self.last_build_info['dirty']:
return self.__format() # Build file since we do not know in what state it is
else:
return self.last_build_info
def __format(self) -> dict:
if '.pysty' in self.src_path.name:
formatter = PackageFormatter(
package_name=self.src_path.with_suffix('').name,
author=self.current_build_info.author,
extra_header=self.current_build_info.header)
elif '.pycls' in self.src_path.name:
formatter = ClassFormatter(
class_name=self.src_path.with_suffix('').name,
author=self.current_build_info.author,
extra_header=self.current_build_info.header)
else:
exit(1)
pytex_msg('Writing file {}'.format(formatter.file_name))
formatter.make_default_macros()
formatter.format_file(self.src_path, self.build_path)
info = {
'name': formatter.file_name,
'source file': self.src_path.name,
'build time': self.current_build_info.build_time,
'source version': self.current_build_info.packages_version,
'source commit hash': self.current_build_info.packages_hash,
'pytex version': self.current_build_info.pytex_version,
'pytex commit hash': self.current_build_info.pytex_hash,
'dirty': self.dirty
}
return info

2
build/utils/pytex_msg.py Normal file
View File

@ -0,0 +1,2 @@
def pytex_msg(msg: str):
print('[PyTeX] ' + msg)

13
config/__init__.py Normal file
View File

@ -0,0 +1,13 @@
from .constants import FILENAME_TYPE_PREPEND_AUTHOR, FILENAME_TYPE_RAW_NAME, DATE_FORMAT, BUILD_INFO_FILENAME
from .header_parts import LICENSE, PACKAGE_INFO_TEXT, PYTEX_INFO_TEXT, BUILD_DETAILS
__all__ = [
'FILENAME_TYPE_PREPEND_AUTHOR',
'FILENAME_TYPE_RAW_NAME',
'DATE_FORMAT',
'BUILD_INFO_FILENAME',
'LICENSE',
'PACKAGE_INFO_TEXT',
'PYTEX_INFO_TEXT',
'BUILD_DETAILS'
]

4
config/constants.py Normal file
View File

@ -0,0 +1,4 @@
FILENAME_TYPE_PREPEND_AUTHOR = 'prepend-author'
FILENAME_TYPE_RAW_NAME = 'raw'
DATE_FORMAT = '%Y/%m/%d %H:%M'
BUILD_INFO_FILENAME = 'build_info.json'

View File

@ -1,5 +1,3 @@
DEFAULT_AUTHOR = 'Maximilian Keßler'
LICENSE = [ LICENSE = [
'Copyright © {year} {copyright_holders}', 'Copyright © {year} {copyright_holders}',
'', '',
@ -39,3 +37,10 @@ PYTEX_INFO_TEXT = [
"changes will not be versioned by Git and overwritten by the next build. Always", "changes will not be versioned by Git and overwritten by the next build. Always",
"edit the source file and build the {latex_file_type} again." "edit the source file and build the {latex_file_type} again."
] ]
BUILD_DETAILS = [
"Build details:",
" Build time: {build_time}",
" PyTeX version: {pytex_version} (commit {pytex_commit_hash})",
" LatexPackages version: {packages_version} (commit {packages_commit_hash})"
]

View File

@ -4,7 +4,7 @@ import PyTeX.macros
class ClassFormatter(PyTeX.formatter.TexFormatter): class ClassFormatter(PyTeX.formatter.TexFormatter):
def __init__(self, class_name: str, author: str = PyTeX.base.DEFAULT_AUTHOR, extra_header: [str] = []): def __init__(self, class_name: str, author: str, extra_header: [str] = []):
PyTeX.formatter.TexFormatter.__init__(self, class_name, author, extra_header, '.cls') PyTeX.formatter.TexFormatter.__init__(self, class_name, author, extra_header, '.cls')
def make_default_macros(self): def make_default_macros(self):

View File

@ -4,7 +4,7 @@ import PyTeX.macros
class PackageFormatter(PyTeX.formatter.TexFormatter): class PackageFormatter(PyTeX.formatter.TexFormatter):
def __init__(self, package_name: str, author: str = PyTeX.base.DEFAULT_AUTHOR, extra_header: [str] = []): def __init__(self, package_name: str, author: str, extra_header: [str] = []):
PyTeX.formatter.TexFormatter.__init__(self, package_name, author, extra_header, '.sty') PyTeX.formatter.TexFormatter.__init__(self, package_name, author, extra_header, '.sty')
def make_default_macros(self): def make_default_macros(self):

View File

@ -1,12 +1,13 @@
import PyTeX.formatter import PyTeX.formatter
import PyTeX.base import PyTeX.base
import PyTeX.config
def make_default_macros(formatter: PyTeX.formatter.TexFormatter, latex_file_type: str): def make_default_macros(formatter: PyTeX.formatter.TexFormatter, latex_file_type: str):
header = '%' * 80 + '\n' \ header = '%' * 80 + '\n' \
+ '\n'.join(map(lambda line: '% ' + line, + '\n'.join(map(lambda line: '% ' + line,
PyTeX.base.LICENSE + [''] + PyTeX.base.PACKAGE_INFO_TEXT + [ PyTeX.config.LICENSE + [''] + PyTeX.config.PACKAGE_INFO_TEXT + [
''] + PyTeX.base.PYTEX_INFO_TEXT ''] + PyTeX.config.PYTEX_INFO_TEXT
+ [''] + formatter.extra_header) + [''] + formatter.extra_header)
) \ ) \
+ '\n' + '%' * 80 + '\n\n' \ + '\n' + '%' * 80 + '\n\n' \