refactor files into better module structure
This commit is contained in:
parent
de10ca7546
commit
4c3867e0f4
15 changed files with 140 additions and 133 deletions
|
@ -1,9 +1,7 @@
|
|||
from .config import LICENSE, DEFAULT_AUTHOR, PACKAGE_INFO_TEXT, PYTEX_INFO_TEXT
|
||||
from .enums import Attributes, Args
|
||||
|
||||
__all__ = [
|
||||
'LICENSE',
|
||||
'DEFAULT_AUTHOR',
|
||||
'PACKAGE_INFO_TEXT',
|
||||
'PYTEX_INFO_TEXT',
|
||||
'Args',
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
from .build import build
|
||||
|
||||
__all__ = [
|
||||
'build'
|
||||
]
|
|
@ -4,101 +4,9 @@ from typing import Optional
|
|||
|
||||
import git
|
||||
|
||||
import PyTeX
|
||||
from PyTeX.config.constants import BUILD_INFO_FILENAME
|
||||
|
||||
from .build_information import BuildInfo
|
||||
|
||||
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
|
||||
from .utils import BuildInfo, pytex_msg, TexFileToFormat
|
||||
|
||||
|
||||
def build(
|
|
@ -1,5 +0,0 @@
|
|||
from .build import build
|
||||
|
||||
__all__ = [
|
||||
'build'
|
||||
]
|
|
@ -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'
|
|
@ -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'
|
||||
]
|
|
@ -4,22 +4,6 @@ from typing import Optional
|
|||
|
||||
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:
|
||||
def __init__(
|
93
build/utils/pytex_file.py
Normal file
93
build/utils/pytex_file.py
Normal 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
2
build/utils/pytex_msg.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
def pytex_msg(msg: str):
|
||||
print('[PyTeX] ' + msg)
|
13
config/__init__.py
Normal file
13
config/__init__.py
Normal 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
4
config/constants.py
Normal 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'
|
|
@ -1,5 +1,3 @@
|
|||
DEFAULT_AUTHOR = 'Maximilian Keßler'
|
||||
|
||||
LICENSE = [
|
||||
'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",
|
||||
"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})"
|
||||
]
|
|
@ -4,7 +4,7 @@ import PyTeX.macros
|
|||
|
||||
|
||||
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')
|
||||
|
||||
def make_default_macros(self):
|
||||
|
|
|
@ -4,7 +4,7 @@ import PyTeX.macros
|
|||
|
||||
|
||||
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')
|
||||
|
||||
def make_default_macros(self):
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
import PyTeX.formatter
|
||||
import PyTeX.base
|
||||
import PyTeX.config
|
||||
|
||||
|
||||
def make_default_macros(formatter: PyTeX.formatter.TexFormatter, latex_file_type: str):
|
||||
header = '%' * 80 + '\n' \
|
||||
+ '\n'.join(map(lambda line: '% ' + line,
|
||||
PyTeX.base.LICENSE + [''] + PyTeX.base.PACKAGE_INFO_TEXT + [
|
||||
''] + PyTeX.base.PYTEX_INFO_TEXT
|
||||
PyTeX.config.LICENSE + [''] + PyTeX.config.PACKAGE_INFO_TEXT + [
|
||||
''] + PyTeX.config.PYTEX_INFO_TEXT
|
||||
+ [''] + formatter.extra_header)
|
||||
) \
|
||||
+ '\n' + '%' * 80 + '\n\n' \
|
||||
|
|
Loading…
Reference in a new issue