header.py

Tue, 04 Jun 2019 23:58:30 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Tue, 04 Jun 2019 23:58:30 +0300
changeset 60
b8fac2477fc8
parent 59
0f3e70a2bb4b
child 67
afaa4d3bc3e5
permissions
-rw-r--r--

fix author parsing

47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 import re
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 import linetypes
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
3 import datetime
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 class Header:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 def __init__(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7 self.description = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8 self.name = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 self.author = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 self.username = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 self.filetype = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 self.qualifiers = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 self.license = None
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
14 self.help = ''
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 self.bfc = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 self.category = None
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
17 self.keywords = ''
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 self.cmdline = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 self.history = []
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
20 self.first_occurrence = dict()
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
21 @property
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
22 def valid(self):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
23 return True
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 class BadHeader:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 def __init__(self, index, reason):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 self.index = index
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 self.reason = reason
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 def __repr__(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 return str.format(
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 'header.BadHeader(index = {index!r}, reason = {reason!r})',
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 index = self.index,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 reason = self.reason,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 )
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
35 @property
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
36 def valid(self):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
37 return False
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 geometrical_types = [
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
40 linetypes.LineSegment,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
41 linetypes.Triangle,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
42 linetypes.Quadrilateral,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43 linetypes.ConditionalLine,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
44 ]
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45
56
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
46 def is_invertnext(entry):
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
47 return isinstance(entry, linetypes.MetaCommand) \
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
48 and entry.text == "BFC INVERTNEXT"
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
49
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
50 def is_suitable_header_object(entry):
56
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
51 if is_invertnext(entry):
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
52 # BFC INVERTNEXT is not a header command anymore.
ed6d39c59e56 fixed BFC INVERTNEXT being interpreted as a header command
Teemu Piippo <teemu@hecknology.net>
parents: 54
diff changeset
53 return False
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 return not any(
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
55 isinstance(entry, linetype)
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 for linetype in [
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
57 *geometrical_types,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 linetypes.Comment,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 linetypes.Error,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60 ]
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
61 )
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
62
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 class HeaderError(Exception):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64 def __init__(self, index, reason):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 self.index, self.reason = index, reason
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 def __repr__(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 return str.format(
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
68 'HeaderError({index!r}, {reason!r})',
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69 index = self.index,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 reason = self.reason,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71 )
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
72 def __str__(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73 return reason
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
75 class HistoryEntry:
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
76 def __init__(self, date, user, text):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
77 self.date, self.user, self.text = date, user, text
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
78 def __repr__(self):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
79 return str.format(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
80 'HistoryEntry({date!r}, {user!r}, {text!r})',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
81 date = self.date,
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
82 user = self.user,
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
83 text = self.text)
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
84
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85 class HeaderParser:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 def __init__(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
87 self.model_body = None
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 self.cursor = 0
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 self.problems = []
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 def parse(self, model_body):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 result = Header()
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
92 self.result = result
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 self.order = []
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94 self.cursor = -1
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95 self.model_body = model_body
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
96 self.skip_to_next()
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
97 result.description = self.current()
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
98 self.skip_to_next()
52
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
99 result.name = self.parse_pattern(r'^Name: (.+)$', 'name')[0]
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
100 self.skip_to_next()
60
b8fac2477fc8 fix author parsing
Teemu Piippo <teemu@hecknology.net>
parents: 59
diff changeset
101 result.author, result.username = self.parse_pattern(r'^Author: ([^ \[]*[^\[]+) (?:\[([^\]]+)\])?', 'author')
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
102 for header_entry in self.get_more_header_stuff():
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
103 if self.try_to_match(
52
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
104 r'^!LDRAW_ORG ' \
49
a1f5c12fa45c fix LDRAW_ORG parsing
Teemu Piippo <teemu@hecknology.net>
parents: 48
diff changeset
105 r'((?:Unofficial_)?(?:' \
52
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
106 r'Part|' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
107 r'Subpart|' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
108 r'Primitive|' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
109 r'8_Primitive|' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
110 r'48_Primitive|' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
111 r'Shortcut' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
112 r'))\s?' \
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
113 r'(.*)$',
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
114 'part type'):
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
115 result.filetype = self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
116 result.qualifiers = re.findall(r'(?:Physical_Colour|Alias|ORIGINAL|UPDATE \d\d\d\d-\d\d)', self.groups[1])
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
117 elif self.try_to_match(
52
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
118 r'^!LICENSE (.+)$',
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119 'license'):
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
120 result.license = self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
121 elif self.try_to_match(
52
cd2b4f3c1189 fix author parsing getting extra spaces in the name
Teemu Piippo <teemu@hecknology.net>
parents: 49
diff changeset
122 r'BFC (CERTIFY CW|CERTIFY CCW|NOCERTIFY)',
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
123 'bfc'):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
124 result.bfc = self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
125 elif self.try_to_match(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
126 r'!HISTORY (\d{4}-\d{2}-\d{2}) ([\[{][^\]}]+[\]}]) (.+)$',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
127 'history'):
59
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
128 try:
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
129 time_object = datetime.datetime.strptime(
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
130 self.groups[0],
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
131 '%Y-%m-%d',
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
132 )
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
133 except ValueError:
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
134 self.parse_error("invalid ISO date in history")
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
135 result.history.append(HistoryEntry(
59
0f3e70a2bb4b report invalid ISO dates instead of crashing
Teemu Piippo <teemu@hecknology.net>
parents: 56
diff changeset
136 date = time_object.date(),
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
137 user = self.groups[1],
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
138 text = self.groups[2],
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
139 ))
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
140 elif self.try_to_match(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
141 r'!HELP (.+)',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
142 'help'):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
143 if result.help:
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
144 result.help += '\n'
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
145 result.help += self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
146 elif self.try_to_match(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
147 r'!CATEGORY (.+)',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
148 'category'):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
149 result.category = self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
150 elif self.try_to_match(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
151 r'!KEYWORDS (.+)',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
152 'keywords'):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
153 if result.keywords:
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
154 result.keywords += '\n'
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
155 result.keywords += self.groups[0]
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
156 elif self.try_to_match(
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
157 r'!CMDLINE (.+)',
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
158 'cmdline'):
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
159 result.cmdline = self.groups[0]
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
160 else:
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
161 self.parse_error("couldn't understand header syntax: " + repr(header_entry.text))
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
162 return {
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
163 'header': result,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
164 'end-index': self.cursor + 1,
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
165 }
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
166 def parse_error(self, message):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
167 raise HeaderError(index = self.cursor, reason = message)
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
168 def get_more_header_stuff(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
169 while True:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
170 self.cursor += 1
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
171 if self.cursor >= len(self.model_body):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
172 break
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
173 entry = self.model_body[self.cursor]
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
174 if not is_suitable_header_object(entry):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
175 break
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
176 if isinstance(entry, linetypes.MetaCommand):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
177 yield entry
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
178 def skip_to_next(self, *, spaces_expected = 0):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
179 while True:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
180 if self.cursor + 1 >= len(self.model_body):
54
0c686d10eb49 added tests for moved-to files and scaling in flat dimensions
Teemu Piippo <teemu@hecknology.net>
parents: 52
diff changeset
181 self.parse_error('file does not have a proper header')
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
182 self.cursor += 1
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
183 entry = self.model_body[self.cursor]
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
184 if not is_suitable_header_object(entry):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
185 self.parse_error('header is incomplete')
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
186 if isinstance(entry, linetypes.MetaCommand):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
187 return
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
188 def try_to_match(self, pattern, patterntype):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
189 try:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
190 self.groups = self.parse_pattern(pattern, patterntype)
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
191 return True
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
192 except:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
193 return False
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
194 def current(self):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
195 entry = self.model_body[self.cursor]
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
196 assert isinstance(entry, linetypes.MetaCommand)
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
197 return entry.text
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
198 def parse_pattern(self, pattern, description):
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
199 match = re.search(pattern, self.current())
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
200 if match:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
201 self.order.append(description)
48
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
202 if description not in self.result.first_occurrence:
38b0919c1934 added some header tests
Teemu Piippo <teemu@hecknology.net>
parents: 47
diff changeset
203 self.result.first_occurrence[description] = self.cursor
47
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
204 return match.groups()
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
205 else:
4da025d0b283 added work on header check
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
206 self.parse_error(str.format("couldn't parse {}", description))

mercurial