Source code for uetools.commands.fmt

import logging
import sys
from dataclasses import dataclass

from argklass.arguments import add_arguments
from argklass.command import Command, newparser

from uetools.format.base import Formatter
from uetools.format.cooking import CookingFormatter
from uetools.format.tests import TestFormatter

log = logging.getLogger()


profiles = {
    None: Formatter,
    "cooking": CookingFormatter,
    "tests": TestFormatter,
}


[docs] @dataclass class Arguments: profile: str = None file: str = None fail_on_error: bool = False col: int = 24
[docs] class Format(Command): """Format UnrealEngine log output. It will attempt to align log output to make them more readable. Attributes ---------- profile: str Formatting profile to use (None, cooking, tests) file: str File to format, if none it will use stdin fail_on_error: the program will exit with an error code if errors were found col: int The size of the category column Examples -------- .. code-block:: console uecli fmt --profile cooking --file RTSGame.log ../UnrealEditor ... | uecli fmt [ 0][L][LogWindows ] Failed to load 'aqProf.dll' (GetLastError=126) [ 0][L][LogWindows ] File 'aqProf.dll' does not exist [ 0][L][LogProfilingDebugging] Loading WinPixEventRuntime.dll for PIX profiling (from ../../../Engine/Binaries/ThirdParty/Windows/WinPixEventRuntime/x64). [ 0][D][LogConfig ] Loading HoloLens ini files took 0.02 seconds [ 0][D][LogConfig ] Loading Android ini files took 0.02 seconds [ 0][D][LogConfig ] Loading Unix ini files took 0.03 seconds [ 0][D][LogConfig ] Loading Windows ini files took 0.03 seconds [ 0][D][LogConfig ] Loading TVOS ini files took 0.03 seconds [ 0][D][LogConfig ] Loading Linux ini files took 0.03 seconds [ 0][D][LogConfig ] Loading LinuxArm64 ini files took 0.03 seconds [ 0][L][LogPluginManager ] Mounting Engine plugin FastBuildController """ name: str = "format"
[docs] @staticmethod def arguments(subparsers): parser = newparser(subparsers, Format) add_arguments(parser, Arguments)
def __init__(self, profile=None): self.profile = profile
[docs] @staticmethod def execute(args): fmt = profiles.get(args.profile, Formatter)(args.col) if args.file is not None: with open(args.file, encoding="utf-8") as file: for line in file: fmt.match_regex(line) if args.fail_on_error and len(fmt.bad_logs) > 0: return 1 return 0 for line in sys.stdin: fmt.match_regex(line) print("-" * 80) print(" Summary") print("=" * 80) for line in fmt.bad_logs: print(" - ", end="") Formatter.format(fmt, **line) print("=" * 80) if args.fail_on_error and len(fmt.bad_logs) > 0: return 1 return 0
logging.basicConfig(level=logging.CRITICAL) COMMANDS = Format