--- a/ldcheck.py Thu Aug 26 19:37:00 2021 +0300 +++ b/ldcheck.py Thu Aug 26 19:43:03 2021 +0300 @@ -1,29 +1,23 @@ #!/usr/bin/env python3 -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py import sys if sys.version_info < (3, 4): -======= -import argparse -from sys import version_info -if version_info < (3, 4): ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py raise RuntimeError('Python 3.4 or newer required') -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py from colours import load_colours -======= + +try: + import colorama +except ImportError: + colorama = None appname = 'ldcheck' version = (1, 0, 9999) version_string = str.join('.', map(str, version)) - ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py from geometry import * from pathlib import Path import linetypes import header import parse -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py def check_library_paths(library_paths): for library_path in library_paths: if not library_path.exists(): @@ -52,35 +46,6 @@ for ldconfig_ldr_path in ldconfig_ldr_paths: with ldconfig_ldr_path.open() as ldconfig_ldr: load_colours(ldconfig_ldr) -======= -from os.path import realpath -script_directory = Path(realpath(__file__)).parent - -def config_dirs(): - import appdirs - appauthor = 'Teemu Piippo' - dirs = appdirs.AppDirs(appname, appauthor) - return { - 'user': Path(dirs.user_config_dir), - 'system': Path(dirs.site_config_dir), - } - -def ldraw_dirs_from_config(): - libraries = [] - dirs = config_dirs() - for dirpath in [dirs['system'], dirs['user']]: - filename = dirpath / 'ldcheck.cfg' - from configobj import ConfigObj - config = ConfigObj(str(filename), encoding = 'UTF8') - if 'libraries' in config: - libraries = expand_paths(config['libraries']) - return libraries - -def expand_paths(paths): - return [ - Path(library).expanduser() - for library in paths - ] class LDrawContext: ''' @@ -147,9 +112,7 @@ return '#000000' def is_valid_colour(self, colour): return self.is_ldconfig_colour(colour) or colour.is_direct_colour ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py def parse_commandline_arguments(): import os rcpath = Path(os.path.expanduser('~/.config/ldcheckrc')) @@ -172,22 +135,43 @@ message = warning_type.placeholder_message(), )) sys.exit(0) -======= -class ListProblemsAction(argparse.Action): - def __init__(self, option_strings, dest, nargs = None, **kwargs): - super().__init__(option_strings, dest, nargs = 0, **kwargs) - def __call__(self, *args, **kwargs): - import testsuite - from sys import exit - from re import sub - test_suite = testsuite.load_tests() - for warning_type in testsuite.all_problem_types(test_suite): - print(str.format('{name}: {severity}: "{message}"', - name = warning_type.name, - severity = warning_type.severity, - message = warning_type.placeholder_message(), - )) - exit(0) + parser = argparse.ArgumentParser() + parser.add_argument('filename') + parser.add_argument('-l', '--library', action = 'append') + parser.add_argument('--list', + action = ListProblemTypesAction, + help = 'lists all possible problem types and exit', + ) + parser.add_argument('--dump', + action = 'store_true', + help = 'dumps the internal parsed structure of the part file', + ) + parser.add_argument('--rebuild', + action = 'store_true', + help = 'parses the part file and prints it back out, used for ' + 'testing whether the program interprets part files correctly', + ) + parser.add_argument('--subfile', + action = 'store_true', + help = 'finds a subfile by name and prints out information about it' + ) + parser.add_argument('--color', + action = 'store_true', + help = 'use colors' + ) + parser.add_argument('-d', '--ldraw-dir', + nargs = '+', + help = 'specify LDraw directory path(s)', + ) + parser.add_argument('-v', '--version', + action = 'version', + version = str.format('{appname} {version}', + appname = appname, + version = version_string, + ), + ) + arglist = rcargs + sys.argv[1:] + return parser.parse_args(arglist) def format_report(report, model, test_suite, *, use_colors = True): from testsuite import problem_text @@ -214,33 +198,6 @@ messages.append(message) return '\n'.join(messages) -if __name__ == '__main__': - from sys import argv, stderr, exit ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py - parser = argparse.ArgumentParser() - parser.add_argument('filename') - parser.add_argument('--list', - action = ListProblemTypesAction, - help = 'lists all possible problem types and exit', - ) - parser.add_argument('--dump', - action = 'store_true', - help = 'dumps the internal parsed structure of the part file', - ) - parser.add_argument('--rebuild', - action = 'store_true', - help = 'parses the part file and prints it back out, used for ' - 'testing whether the program interprets part files correctly', - ) - parser.add_argument('--subfile', - action = 'store_true', - help = 'finds a subfile by name and prints out information about it' - ) -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py - parser.add_argument('-l', '--library', action = 'append') - arglist = rcargs + sys.argv[1:] - return parser.parse_args(arglist) - def main(): args = parse_commandline_arguments() # Make sure that we have at least one library path specified. @@ -255,26 +212,6 @@ libraries = [Path(os.path.expanduser(library)) for library in args.library] check_library_paths(libraries) load_ldconfig(libraries) -======= - parser.add_argument('--color', - action = 'store_true', - help = 'use colors' - ) - parser.add_argument('-d', '--ldraw-dir', - nargs = '+', - help = 'specify LDraw directory path(s)', - ) - parser.add_argument('-v', '--version', - action = 'version', - version = str.format('{appname} {version}', - appname = appname, - version = version_string, - ), - ) - args = parser.parse_args() - libraries = ldraw_dirs_from_config() - if args.ldraw_dir: - libraries = expand_paths(args.ldraw_dir) try: context = LDrawContext(libraries) except RuntimeError as error: @@ -287,17 +224,12 @@ except ImportError: print('Use of --color requires the colorama module, disabling colours', file = stderr) args.color = False ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py if args.subfile: # Subfile debug mode: searches for the specified subfile from the LDraw # libraries, opens it as if it was referenced by something and prints # out all information that is calculated from this subfile. import filecache -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py - cache = filecache.SubfileCache(ldraw_directories = libraries) -======= cache = filecache.SubfileCache(context = context) ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py subfile = cache.prepare_file(args.filename) if not subfile.valid: print(subfile.problem) @@ -306,42 +238,53 @@ print('Description:', repr(subfile.description)) print('Contains studs:', repr(subfile.has_studs)) else: -<<<<<<< /home/teemu/dev/ldcheck/ldcheck.py with open(args.filename, 'rb') as file: - from os.path import basename - model = parse.read_ldraw( - file, - name = basename(args.filename), - ldraw_directories = libraries) - if args.dump: - # Dump mode: prints out the structure of the processed LDraw file - 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 i, entry in enumerate(model.body): - if model.header.valid and i == model.header_size: - # Mark where the header is considered to end - print('--------- End of header') - print(entry) - elif args.rebuild: - # Debug rebuild mode: open the file, parse it and turn it back - # into LDraw code and write it into stdout. This is used to ensure - # that LDCheck does not miss any information while parsing files. - for entry in model.body: - print(entry.textual_representation(), end = '\r\n') - else: - # Regular mode - from testsuite import load_tests, check_model, format_report - # load the test suite - # TODO: maybe add some command line argument to filter tests - # in case the user wants to run some specific tests only or - # possibly leave some test out - test_suite = load_tests() - # use the test suite to check the model - report = check_model(model, test_suite) - # print out the report - print(format_report(report, model, test_suite)) + try: + from os.path import basename + model = parse.read_ldraw( + file, + name = basename(args.filename), + context = context) + if args.dump: + # Dump mode: prints out the structure of the processed LDraw file + 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 i, entry in enumerate(model.body): + if model.header.valid and i == model.header_size: + # Mark where the header is considered to end + print('--------- End of header') + print(entry) + elif args.rebuild: + # Debug rebuild mode: open the file, parse it and turn it back + # into LDraw code and write it into stdout. This is used to ensure + # that LDCheck does not miss any information while parsing files. + for entry in model.body: + print(entry.textual_representation(), end = '\r\n') + else: + # Regular mode + from testsuite import load_tests, check_model + # load the test suite + # TODO: maybe add some command line argument to filter tests + # in case the user wants to run some specific tests only or + # possibly leave some test out + test_suite = load_tests() + # use the test suite to check the model + report = check_model(model, test_suite) + # print out the report + print(format_report( + report, + model, + test_suite, + use_colors = args.color + )) + except FileNotFoundError: + print(str.format( + 'no such file: {filename!r}', + filename = args.filename + ), file = stderr) + exit(1) if __name__ == '__main__': try: @@ -350,40 +293,3 @@ import sys print('error:', str(e), file = sys.stderr) sys.exit(1) -======= - try: - with open(args.filename, 'rb') as file: - from os.path import basename - model = parse.read_ldraw( - file, - name = basename(args.filename), - context = context) - if args.dump: - 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 i, entry in enumerate(model.body): - if model.header.valid and i == model.header_size: - print('--------- End of header') - 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 - test_suite = load_tests() - report = check_model(model, test_suite) - print(format_report( - report, - model, - test_suite, - use_colors = args.color - )) - except FileNotFoundError: - print(str.format( - 'no such file: {filename!r}', - filename = args.filename - ), file = stderr) - exit(1) ->>>>>>> /tmp/ldcheck~other.ou_xbg_k.py