Tests: Disable failing import/export tests for until they're fixed
[blender.git] / tests / python / rst_to_doctree_mini.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 # Module with function to extract a doctree from an reStructuredText file.
22 # Named 'Mini' because we only parse the minimum data needed to check
23 # Python classes, methods and attributes match up to those in existing modules.
24 # (To test for documentation completeness)
25
26 # note: literalinclude's are not followed.
27 # could be nice to add but not really needed either right now.
28
29 import collections
30
31 Directive = collections.namedtuple('Directive',
32                                    ("type",
33                                     "value",
34                                     "value_strip",
35                                     "line",
36                                     "indent",
37                                     "members"))
38
39
40 def parse_rst_py(filepath):
41     import re
42
43     # Get the prefix assuming the line is lstrip()'d
44     # ..foo:: bar
45     # -->
46     # ("foo", "bar")
47     re_prefix = re.compile(r"^\.\.\s([a-zA-Z09\-]+)::\s*(.*)\s*$")
48
49     tree = collections.defaultdict(list)
50     indent_map = {}
51     indent_prev = 0
52     f = open(filepath, encoding="utf-8")
53     for i, line in enumerate(f):
54         line_strip = line.lstrip()
55         # ^\.\.\s[a-zA-Z09\-]+::.*$
56         #if line.startswith(".. "):
57         march = re_prefix.match(line_strip)
58
59         if march:
60             directive, value = march.group(1, 2)
61             indent = len(line) - len(line_strip)
62             value_strip = value.replace("(", " ").split()
63             value_strip = value_strip[0] if value_strip else ""
64
65             item = Directive(type=directive,
66                              value=value,
67                              value_strip=value_strip,
68                              line=i,
69                              indent=indent,
70                              members=[])
71
72             tree[indent].append(item)
73             if indent_prev < indent:
74                 indent_map[indent] = indent_prev
75             if indent > 0:
76                 tree[indent_map[indent]][-1].members.append(item)
77             indent_prev = indent
78     f.close()
79
80     return tree[0]
81
82
83 if __name__ == "__main__":
84     # not intended use, but may as well print rst files passed as a test.
85     import sys
86     for arg in sys.argv:
87         if arg.lower().endswith((".txt", ".rst")):
88             items = parse_rst_py(arg)
89             for i in items:
90                 print(i)