ldcheck.py

Fri, 18 Sep 2020 21:08:41 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Fri, 18 Sep 2020 21:08:41 +0300
changeset 133
0f25297702a5
parent 122
116a81996832
child 145
fde18c4d6784
permissions
-rwxr-xr-x

added mirrored studs test

3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
1 #!/usr/bin/env python3
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
2 from sys import version_info
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
3 if version_info < (3, 4):
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
4 raise RuntimeError('Python 3.4 or newer required')
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
5
100
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
6 appname = 'ldcheck'
114
9ea2549e6171 changed version to 1.0.9999
Teemu Piippo <teemu@hecknology.net>
parents: 113
diff changeset
7 version = (1, 0, 9999)
100
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
8 version_string = str.join('.', map(str, version))
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
9
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
10 from colours import load_colours
7
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
11 from geometry import *
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
12 from pathlib import Path
13
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
13 import linetypes
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents: 38
diff changeset
14 import header
54
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
15 import parse
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
16
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
17 from os.path import realpath
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
18 script_directory = Path(realpath(__file__)).parent
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
19
116
60cac583b5df fixed config not being properly loaded from script directory
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
20 def load_config(filename = None):
60cac583b5df fixed config not being properly loaded from script directory
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
21 if filename is None:
60cac583b5df fixed config not being properly loaded from script directory
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
22 filename = script_directory / 'ldcheck.cfg'
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
23 from configobj import ConfigObj
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
24 from copy import deepcopy
116
60cac583b5df fixed config not being properly loaded from script directory
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
25 config = ConfigObj(str(filename), encoding = 'UTF8')
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
26 read_config = deepcopy(config)
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
27 if 'libraries' not in config:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
28 config['libraries'] = ['/path/to/ldraw']
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
29 if config != read_config:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
30 config.write()
34
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
31 check_library_paths(config)
122
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
32 load_ldconfig_ldr(config)
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
33 return config
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
34
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
35 def library_paths(config):
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
36 for library_path_string in config['libraries']:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
37 yield Path(library_path_string).expanduser()
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
38
34
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
39 def check_library_paths(config):
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
40 from sys import exit
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
41 problems = False
36
2753aad79678 now checks that paths are specified
Teemu Piippo <teemu@hecknology.net>
parents: 34
diff changeset
42 have_paths = False
34
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
43 for library_path in library_paths(config):
36
2753aad79678 now checks that paths are specified
Teemu Piippo <teemu@hecknology.net>
parents: 34
diff changeset
44 have_paths = True
34
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
45 if not library_path.exists():
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
46 problems = True
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
47 print(str.format(
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
48 'Library path {} does not exist',
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
49 library_path,
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
50 ))
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
51 elif not library_path.exists():
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
52 problems = True
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
53 print(str.format(
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
54 'Library path {} is not a directory',
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
55 library_path,
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
56 ))
36
2753aad79678 now checks that paths are specified
Teemu Piippo <teemu@hecknology.net>
parents: 34
diff changeset
57 if not have_paths:
2753aad79678 now checks that paths are specified
Teemu Piippo <teemu@hecknology.net>
parents: 34
diff changeset
58 print('No LDraw path specified')
2753aad79678 now checks that paths are specified
Teemu Piippo <teemu@hecknology.net>
parents: 34
diff changeset
59 problems = True
34
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
60 if problems:
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
61 print('Please fix ldcheck.cfg')
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
62 exit(1)
7ed2e831acd4 the program now checks that all ldraw paths are reachable
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
63
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
64 def find_ldconfig_ldr_paths(config):
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
65 for library_path in library_paths(config):
17
327da5d00360 Added code to run the test suite.
Santeri Piippo
parents: 13
diff changeset
66 yield from [
327da5d00360 Added code to run the test suite.
Santeri Piippo
parents: 13
diff changeset
67 library_path / path
327da5d00360 Added code to run the test suite.
Santeri Piippo
parents: 13
diff changeset
68 for path in ['LDConfig.ldr', 'ldconfig.ldr']
327da5d00360 Added code to run the test suite.
Santeri Piippo
parents: 13
diff changeset
69 if (library_path / path).is_file()
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
70 ]
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
71
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
72 import argparse
62
f0a6bf48b05e Problem reporting revamp, program is now aware of its problem types
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
73
81
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
74 class ListProblemsAction(argparse.Action):
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
75 def __init__(self, option_strings, dest, nargs = None, **kwargs):
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
76 super().__init__(option_strings, dest, nargs = 0, **kwargs)
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
77 def __call__(self, *args, **kwargs):
63
8949af6a4279 added the list of issues onto the web frontend
Teemu Piippo <teemu@hecknology.net>
parents: 62
diff changeset
78 import testsuite
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
79 from sys import exit
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
80 from re import sub
63
8949af6a4279 added the list of issues onto the web frontend
Teemu Piippo <teemu@hecknology.net>
parents: 62
diff changeset
81 test_suite = testsuite.load_tests()
8949af6a4279 added the list of issues onto the web frontend
Teemu Piippo <teemu@hecknology.net>
parents: 62
diff changeset
82 for warning_type in testsuite.all_problem_types(test_suite):
62
f0a6bf48b05e Problem reporting revamp, program is now aware of its problem types
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
83 print(str.format('{name}: {severity}: "{message}"',
f0a6bf48b05e Problem reporting revamp, program is now aware of its problem types
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
84 name = warning_type.name,
f0a6bf48b05e Problem reporting revamp, program is now aware of its problem types
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
85 severity = warning_type.severity,
63
8949af6a4279 added the list of issues onto the web frontend
Teemu Piippo <teemu@hecknology.net>
parents: 62
diff changeset
86 message = warning_type.placeholder_message(),
62
f0a6bf48b05e Problem reporting revamp, program is now aware of its problem types
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
87 ))
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
88 exit(0)
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
89
122
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
90 def load_ldconfig_ldr(config):
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
91 for ldconfig_ldr_path in find_ldconfig_ldr_paths(config):
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
92 with ldconfig_ldr_path.open() as ldconfig_ldr:
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
93 load_colours(ldconfig_ldr)
116a81996832 added more tests
Teemu Piippo <teemu@hecknology.net>
parents: 116
diff changeset
94
98
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
95 def format_report(report, model, test_suite, *, use_colors = True):
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
96 from testsuite import problem_text
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
97 messages = []
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
98 for problem in report['problems']:
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
99 text_colour = ''
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
100 if use_colors:
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
101 if problem.severity == 'hold':
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
102 text_colour = colorama.Fore.LIGHTRED_EX
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
103 elif problem.severity == 'warning':
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
104 text_colour = colorama.Fore.LIGHTBLUE_EX
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
105 ldraw_code = model.body[problem.body_index].textual_representation()
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
106 message = str.format(
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
107 '{text_colour}{model_name}:{line_number}: {problem_type}: {message}'
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
108 '{colour_reset}\n\t{ldraw_code}',
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
109 text_colour = text_colour,
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
110 model_name = model.name,
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
111 line_number = problem.line_number,
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
112 problem_type = problem.severity,
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
113 message = problem_text(problem, test_suite),
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
114 colour_reset = use_colors and colorama.Fore.RESET or '',
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
115 ldraw_code = ldraw_code,
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
116 )
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
117 messages.append(message)
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
118 return '\n'.join(messages)
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
119
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
120 if __name__ == '__main__':
109
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
121 from sys import argv, stderr, exit
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
122 parser = argparse.ArgumentParser()
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
123 parser.add_argument('filename')
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
124 parser.add_argument('--list',
81
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
125 action = ListProblemsAction,
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
126 help = 'lists all possible problem types and exit',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
127 )
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
128 parser.add_argument('--dump',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
129 action = 'store_true',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
130 help = 'dumps the internal parsed structure of the part file',
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
131 )
81
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
132 parser.add_argument('--rebuild',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
133 action = 'store_true',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
134 help = 'parses the part file and prints it back out, used for '
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
135 'testing whether the program interprets part files correctly',
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
136 )
92
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
137 parser.add_argument('--subfile',
81
e65d82501a38 added better help entries to command line parameters
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
138 action = 'store_true',
92
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
139 help = 'finds a subfile by name and prints out information about it'
85
4438502fd3e0 fixed the use of moved-to-files check not working if there were non-alphanumerics in the filename
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
140 )
98
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
141 parser.add_argument('--color',
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
142 action = 'store_true',
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
143 help = 'use colors'
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
144 )
100
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
145 parser.add_argument('-v', '--version',
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
146 action = 'version',
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
147 version = str.format('{appname} {version}',
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
148 appname = appname,
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
149 version = version_string,
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
150 ),
62759e5c4554 add some basic versioning
Teemu Piippo <teemu@hecknology.net>
parents: 98
diff changeset
151 )
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
152 args = parser.parse_args()
116
60cac583b5df fixed config not being properly loaded from script directory
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
153 config = load_config()
98
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
154 if args.color:
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
155 try:
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
156 import colorama
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
157 colorama.init()
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
158 except ImportError:
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
159 print('Use of --color requires the colorama module, disabling colours', file = stderr)
f9d4e59392f7 made colors toggleable
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
160 args.color = False
92
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
161 if args.subfile:
54
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
162 import filecache
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
163 cache = filecache.SubfileCache(
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
164 ldraw_directories = config['libraries'],
26
7c263b864371 Added command line option to list all checks.
Santeri Piippo
parents: 21
diff changeset
165 )
54
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
166 subfile = cache.prepare_file(args.filename)
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
167 if not subfile.valid:
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
168 print(subfile.problem)
92
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
169 else:
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
170 print('Flat dimensions:', repr(subfile.flatness))
85
4438502fd3e0 fixed the use of moved-to-files check not working if there were non-alphanumerics in the filename
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
171 print('Description:', repr(subfile.description))
92
b8d72909d593 improved the mirrored stud check to catch cases where a subfile that contains studs is mirrored
Teemu Piippo <teemu@hecknology.net>
parents: 85
diff changeset
172 print('Contains studs:', repr(subfile.has_studs))
54
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
173 else:
109
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
174 try:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
175 with open(args.filename, 'rb') as file:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
176 from os.path import basename
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
177 model = parse.read_ldraw(
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
178 file,
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
179 name = basename(args.filename),
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
180 ldraw_directories = config['libraries'])
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
181 if args.dump:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
182 print('header: ' + type(model.header).__name__)
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
183 for key in sorted(dir(model.header)):
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
184 if not key.startswith('__'):
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
185 print('\t' + key + ': ' + repr(getattr(model.header, key)))
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
186 for i, entry in enumerate(model.body):
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
187 if model.header.valid and i == model.header_size:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
188 print('--------- End of header')
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
189 print(entry)
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
190 elif args.rebuild:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
191 for entry in model.body:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
192 print(entry.textual_representation(), end = '\r\n')
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
193 else:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
194 from testsuite import load_tests, check_model
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
195 test_suite = load_tests()
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
196 report = check_model(model, test_suite)
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
197 print(format_report(
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
198 report,
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
199 model,
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
200 test_suite,
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
201 use_colors = args.color
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
202 ))
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
203 except FileNotFoundError:
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
204 print(str.format(
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
205 'no such file: {filename!r}',
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
206 filename = args.filename
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
207 ), file = stderr)
b627f8963a84 handle file not found more cleanly
Teemu Piippo <teemu@hecknology.net>
parents: 100
diff changeset
208 exit(1)

mercurial