ldcheck.py

changeset 65
f2dc17b830e0
parent 63
8949af6a4279
--- 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))

mercurial