From 15b9c3af6b0d58f8d6bb0729a217dc6d9f4666e6 Mon Sep 17 00:00:00 2001 From: Qrius Date: Fri, 11 Apr 2025 17:14:32 +0200 Subject: Begin rewrite of internals to be more malleable --- src/skaldpress/filelist.py | 81 ++++----- src/skaldpress/main.py | 338 ++++++++++---------------------------- src/skaldpress/metadata_parser.py | 78 ++++----- src/smp/__init__.py | 8 +- src/smp/builtins.py | 105 ++++++++++-- src/smp/macro_processor.py | 145 ++++++++++++---- 6 files changed, 383 insertions(+), 372 deletions(-) (limited to 'src') diff --git a/src/skaldpress/filelist.py b/src/skaldpress/filelist.py index 285efb0..92180fa 100644 --- a/src/skaldpress/filelist.py +++ b/src/skaldpress/filelist.py @@ -5,7 +5,7 @@ from datetime import datetime from pathlib import Path from enum import Enum from typing import Any, Generator -from skaldpress.metadata_parser import get_all_meta +from skaldpress.metadata_parser import get_all_meta_iter class FileListFileTargetAction(Enum): @@ -99,28 +99,31 @@ def walk_filetree( elif entry.is_dir(): yield from walk_filetree(entry) except OSError as e: - raise Exception(f"DirectoryReadError: {e}") + raise Exception(f"DirectoryReadError: {directory} {e}") -def enrich_with_metadata(entries, template_dir, additional_metadata, read_metadata): - for entry in entries: - if not read_metadata: - yield entry[0], entry[1], {}, datetime.fromtimestamp( - entry[0].stat().st_mtime - ) - continue +def enrich_with_metadata( + file, path_relative, template_dir, additional_metadata, read_metadata +): + if not read_metadata: + return path_relative, {}, datetime.fromtimestamp(file.stat().st_mtime) - meta, extension, oldest_modified = get_all_meta( - entry[0], template_dir, additional_metadata - ) - if extension[0] != ".": - extension = "." + extension - rel_path = os.path.splitext(entry[1])[0] + extension + meta, extension, oldest_modified = get_all_meta_iter( + file, template_dir, additional_metadata + ) + + if "target_filename" in meta: + path_relative = meta["target_filename"] - yield entry[0], rel_path, meta, oldest_modified + if len(extension) > 0 and extension[0] != ".": + extension = "." + extension + path_relative = os.path.splitext(path_relative)[0] + extension -def make_filelist( + return path_relative, meta, oldest_modified + + +def make_filelist_iter( directory, # : DirEntry base_dir: Path, include: list[str], @@ -129,26 +132,28 @@ def make_filelist( read_metadata: bool, template_dir: str, additional_metadata: dict[str, Any], -) -> Generator[FileListFile, None, None]: - filelist_gen1 = ( - (x, x.path.replace(base_dir, "", 1)) for x in walk_filetree(directory) - ) - filelist_gen2 = ( - x for x in filelist_gen1 if not file_filtered(x[1], include, exclude) - ) - filelist_gen3 = enrich_with_metadata( - filelist_gen2, template_dir, additional_metadata, read_metadata - ) - filelist_gen4 = ( - FileListFile( - file_path=x[0], - file_rel=x[1], - change_time=x[3], - dependencies=[], - target_action=target_action, - metadata=x[2], +) -> list[FileListFile]: + + filelist = [] + for file in walk_filetree(directory): + path_relative = file.path.replace(base_dir, "", 1) + + if file_filtered(path_relative, include, exclude): + continue + + path_relative, meta, oldest_modified = enrich_with_metadata( + file, path_relative, template_dir, additional_metadata, read_metadata + ) + + filelist.append( + FileListFile( + file_path=file, + file_rel=path_relative, + change_time=oldest_modified, + dependencies=[], + target_action=target_action, + metadata=meta, + ) ) - for x in filelist_gen3 - ) - return filelist_gen4 + return filelist diff --git a/src/skaldpress/main.py b/src/skaldpress/main.py index 57da9e5..b58f4ad 100644 --- a/src/skaldpress/main.py +++ b/src/skaldpress/main.py @@ -1,75 +1,60 @@ import os import shutil +import sys +import traceback from argparse import ArgumentParser, ArgumentTypeError -from dataclasses import dataclass from functools import partial from itertools import chain from collections import deque import smp.macro_processor from copy import deepcopy -from skaldpress.metadata_parser import extract_parse_yaml_metadata from skaldpress.filelist import ( - make_filelist, + make_filelist_iter, FileList, FileListFileTargetAction, file_filtered, ) +from smp.builtins import ( + smp_builtin_read, + smp_builtin_add_metadata, +) from time import perf_counter -@dataclass -class CompiledFile: - content: str - metadata: dict - extension: str - stored_smp_state: dict - source_path: str - needs_recompilation: bool - - -COMPILED_FILES: list[CompiledFile] = list() -COMPILED_FILES_BY_TAG: dict[str, list[int]] = dict() - - -def sp_template(macro_processor, template, content): - with open(template, "r") as f: - file_content = f.read() - macro_processor.macros["CONTENT"] = content - return macro_processor.process_input(file_content) - - -# SMP Macro for getting all files with specific tag, this is only _really_ effective the second run -# -# Usage in files: -# all_tagged_by(,