1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#~ This program is free software; you can redistribute it and/or modify
#~ it under the terms of the GNU General Public License as published by
#~ the Free Software Foundation; version 2 of the License.
#~ This program is distributed in the hope that it will be useful,
#~ but WITHOUT ANY WARRANTY; without even the implied warranty of
#~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#~ GNU General Public License for more details.
# This script must run from a logic brick so it has access to the game engine api
# it assumes the root blender source directory is the current working directory
#
# Currently it only prints missing modules and methods (not attributes)
import sys, os
BGE_API_DOC_PATH = 'source/gameengine/PyDoc'
mods = ['GameLogic', 'Rasterizer', 'GameKeys']
mods_dict = {}
for m in mods:
mods_dict[m] = sys.modules[m]
import GameTypes
type_members = {}
for type_name in dir(GameTypes):
if type_name.startswith('__'):
continue
type_object = getattr(GameTypes, type_name)
members = []
type_members[type_object.__name__] = members
for member in type_object.__dict__.keys():
if member.startswith('__'):
continue
# print type_object.__name__ + '.' + k
members.append(member)
doc_dir= os.path.join(os.getcwd(), BGE_API_DOC_PATH)
if doc_dir not in sys.path:
sys.path.append(doc_dir)
def check_attribute(class_ob, member):
doc = class_ob.__doc__
if not doc:
return False
for l in doc.split('\n'):
l = l.strip()
'''
@ivar foo: blah blah
to
foo
'''
if l.startswith('@ivar') or l.startswith('@var'):
var = l.split()[1].split(':')[0]
if var == member:
return True
return False
print '\n\n\nChecking Docs'
PRINT_OK = False
pymod = sys.modules['GameTypes']
del sys.modules['GameTypes'] # temp remove
mod = __import__('GameTypes') # get the python module
reload(mod) # incase were editing it
sys.modules['GameTypes'] = pymod
for type_name in sorted(type_members.keys()):
members = type_members[type_name]
try:
type_class = getattr(mod, type_name)
except:
print "missing class: %s.%s - %s" % (type_name, type_name, str(sorted(members)))
continue
for member in sorted(members):
try:
getattr(type_class, member)
if PRINT_OK:
print "\tfound: %s.%s" % (type_name, member)
except:
if check_attribute(type_class, member):
if PRINT_OK:
print "\tfound attr: %s.%s" % (type_name, member)
else:
print "\tmissing: %s.%s" % (type_name, member)
# Now check the modules
for mod_name, pymod in mods_dict.iteritems():
print pymod
del sys.modules[mod_name]
# Now well get the python version
pydoc = __import__(mod_name)
pydoc = reload(pydoc) # avoid using the out dated pyc file only
print pydoc.__file__
for member in sorted(dir(pymod)):
if hasattr(pydoc, member) or check_attribute(pydoc, member):
if PRINT_OK:
print "\tfound module attr: %s.%s" % (mod_name, member)
else:
print "\tmissing module attr: %s.%s" % (mod_name, member)
# Restore real module
sys.modules[mod_name] = pymod
sys.path.pop() # remove the pydoc dir from our import paths
|