Sat, 08 Jun 2019 01:32:25 +0300
Problem reporting revamp, program is now aware of its problem types
#!/usr/bin/env python3 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() 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() ] import argparse def default_problem_message(message): if callable(message): import inspect spec = inspect.getfullargspec(message) args = {} assert not spec.varargs and not spec.varkw for argname in spec.args + spec.kwonlyargs: args[argname] = '<' + argname.replace('_', ' ') + '>' return message(**args) else: return message class ListTestSuiteAction(argparse.Action): def __init__(self, option_strings, dest, nargs = None, **kwargs): super().__init__(option_strings, dest, nargs = 0, **kwargs) def __call__(self, *args, **kwargs): from testsuite import load_tests, all_warning_types from sys import exit from re import sub test_suite = load_tests() for warning_type in sorted(all_warning_types(test_suite), key = lambda k: k.name): print(str.format('{name}: {severity}: "{message}"', name = warning_type.name, severity = warning_type.severity, message = default_problem_message(warning_type.message), )) exit(0) if __name__ == '__main__': from sys import argv parser = argparse.ArgumentParser() parser.add_argument('filename') parser.add_argument('--list', action = ListTestSuiteAction, help = 'Lists all possible checks and exit', ) parser.add_argument('--dump-structure', action = 'store_true') 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): with ldconfig_ldr_path.open() as ldconfig_ldr: load_colours(ldconfig_ldr) if args.flatness: import filecache cache = filecache.SubfileCache( ldraw_directories = config['libraries'], ) subfile = cache.prepare_file(args.filename) if not subfile.valid: print(subfile.problem) else: if subfile.flatness: print(str.format( 'Flatness: {}', ', '.join(subfile.flatness), )) else: print('File is not flat in any dimensions') else: with open(args.filename) as file: from os.path import basename model = parse.read_ldraw( file, name = basename(args.filename), ldraw_directories = config['libraries']) if args.dump_structure: print('header: ' + type(model.header).__name__) for key in sorted(dir(model.header)): if not key.startswith('__'): print('\t' + key + ': ' + repr(getattr(model.header, key))) for entry in model.body: print(entry) elif args.rebuild: 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))