--- a/ldcheck.py Sat Jun 08 01:51:50 2019 +0300 +++ b/ldcheck.py Sat Jun 08 11:17:17 2019 +0300 @@ -1,66 +1,47 @@ #!/usr/bin/env python3 +''' + Main LDCheck commandline program. +''' from sys import version_info if version_info < (3, 4): raise RuntimeError('Python 3.4 or newer required') -from colours import load_colours from geometry import * -from pathlib import Path import linetypes import header import parse - -from os.path import realpath -script_directory = Path(realpath(__file__)).parent - -def load_config(filename): - from configobj import ConfigObj - from copy import deepcopy - config = ConfigObj(filename, encoding = 'UTF8') - read_config = deepcopy(config) - if 'libraries' not in config: - config['libraries'] = ['/path/to/ldraw'] - if config != read_config: - config.write() - check_library_paths(config) - return config - -def library_paths(config): - for library_path_string in config['libraries']: - yield Path(library_path_string).expanduser() +import config +import colours -def check_library_paths(config): - from sys import exit - problems = False - have_paths = False - for library_path in library_paths(config): - have_paths = True - if not library_path.exists(): - problems = True - print(str.format( - 'Library path {} does not exist', - library_path, - )) - elif not library_path.exists(): - problems = True - print(str.format( - 'Library path {} is not a directory', - library_path, - )) - if not have_paths: - print('No LDraw path specified') - problems = True - if problems: - print('Please fix ldcheck.cfg') - exit(1) - -def find_ldconfig_ldr_paths(config): - for library_path in library_paths(config): - yield from [ - library_path / path - for path in ['LDConfig.ldr', 'ldconfig.ldr'] - if (library_path / path).is_file() - ] +def format_report(report, model): + ''' + Formats the report from the test suite so as to be + printed in the console. + ''' + import colorama + colorama.init() + messages = [] + for problem in report['problems']: + if problem.severity == 'hold': + text_colour = colorama.Fore.LIGHTRED_EX + elif problem.severity == 'warning': + text_colour = colorama.Fore.LIGHTBLUE_EX + else: + text_colour = '' + ldraw_code = model.body[problem.body_index].textual_representation() + message = str.format( + '{text_colour}{model_name}:{line_number}: {problem_type}: {message}' + '{colour_reset}\n\t{ldraw_code}', + text_colour = text_colour, + model_name = model.name, + line_number = problem.line_number, + problem_type = problem.severity, + message = str(problem), + colour_reset = colorama.Fore.RESET, + ldraw_code = ldraw_code, + ) + messages.append(message) + return '\n'.join(messages) import argparse @@ -92,14 +73,14 @@ parser.add_argument('--rebuild', action = 'store_true') parser.add_argument('--flatness', action = 'store_true') args = parser.parse_args() - config = load_config('ldcheck.cfg') - for ldconfig_ldr_path in find_ldconfig_ldr_paths(config): + config_object = config.load_config('ldcheck.cfg') + for ldconfig_ldr_path in config.find_ldconfig_ldr_paths(config_object): with ldconfig_ldr_path.open() as ldconfig_ldr: - load_colours(ldconfig_ldr) + colours.load_colours(ldconfig_ldr) if args.flatness: import filecache cache = filecache.SubfileCache( - ldraw_directories = config['libraries'], + ldraw_directories = config_object['libraries'], ) subfile = cache.prepare_file(args.filename) if not subfile.valid: @@ -118,7 +99,7 @@ model = parse.read_ldraw( file, name = basename(args.filename), - ldraw_directories = config['libraries']) + ldraw_directories = config_object['libraries']) if args.dump_structure: print('header: ' + type(model.header).__name__) for key in sorted(dir(model.header)): @@ -130,7 +111,7 @@ for entry in model.body: print(entry.textual_representation(), end = '\r\n') else: - from testsuite import load_tests, check_model, format_report - test_suite = load_tests() - report = check_model(model, test_suite) - print(format_report(report, model, test_suite)) + import testsuite + test_suite = testsuite.load_tests() + report = testsuite.check_model(model, test_suite) + print(format_report(report, model))