ldcheck.py

changeset 149
7c01f9876b69
parent 147
bec55b021ae7
child 150
fcc07f6907a8
--- 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

mercurial