107 lines
3.2 KiB
Python
107 lines
3.2 KiB
Python
import py
|
|
|
|
class DescPlaceholder(object):
|
|
pass
|
|
|
|
class ClassPlaceholder(object):
|
|
pass
|
|
|
|
class SerialisableClassDesc(object):
|
|
def __init__(self, original_desc):
|
|
self.is_degenerated = original_desc.is_degenerated
|
|
self.name = original_desc.name
|
|
|
|
class PermaDocStorage(object):
|
|
""" Picklable version of docstorageaccessor
|
|
"""
|
|
function_fields = ['source', 'signature', 'definition', 'callpoints',
|
|
'local_changes', 'exceptions']
|
|
|
|
def __init__(self, dsa):
|
|
""" Initialise from original doc storage accessor
|
|
"""
|
|
self.names = {}
|
|
self.module_info = dsa.get_module_info()
|
|
self.module_name = dsa.get_module_name()
|
|
self._save_functions(dsa)
|
|
self._save_classes(dsa)
|
|
|
|
def _save_functions(self, dsa):
|
|
names = dsa.get_function_names()
|
|
self.function_names = names
|
|
for name in names:
|
|
self._save_function(dsa, name)
|
|
|
|
def _save_function(self, dsa, name):
|
|
ph = DescPlaceholder()
|
|
ph.__doc__ = dsa.get_doc(name)
|
|
for field in self.function_fields:
|
|
setattr(ph, field, getattr(dsa, 'get_function_%s' % field)(name))
|
|
self.names[name] = ph
|
|
return ph
|
|
|
|
def _save_classes(self, dsa):
|
|
names = dsa.get_class_names()
|
|
self.class_names = names
|
|
for name in names:
|
|
ph = ClassPlaceholder()
|
|
ph.__doc__ = dsa.get_doc(name)
|
|
methods = dsa.get_class_methods(name)
|
|
ph.methods = methods
|
|
ph.base_classes = [SerialisableClassDesc(i) for i in
|
|
dsa.get_possible_base_classes(name)]
|
|
|
|
for method in methods:
|
|
method_name = name + "." + method
|
|
mh = self._save_function(dsa, name + "." + method)
|
|
mh.origin = SerialisableClassDesc(dsa.get_method_origin(
|
|
method_name))
|
|
self.names[name] = ph
|
|
|
|
def get_class_methods(self, name):
|
|
desc = self.names[name]
|
|
assert isinstance(desc, ClassPlaceholder)
|
|
return desc.methods
|
|
|
|
def get_doc(self, name):
|
|
return self.names[name].__doc__
|
|
|
|
def get_module_info(self):
|
|
return self.module_info
|
|
|
|
def get_module_name(self):
|
|
return self.module_name
|
|
|
|
def get_class_names(self):
|
|
return self.class_names
|
|
|
|
def get_function_names(self):
|
|
return self.function_names
|
|
|
|
def get_method_origin(self, name):
|
|
# returns a DESCRIPTION of a method origin, to make sure where we
|
|
# write it
|
|
return self.names[name].origin
|
|
|
|
def get_possible_base_classes(self, name):
|
|
# returns list of descs of base classes
|
|
return self.names[name].base_classes
|
|
|
|
# This are placeholders to provide something more reliable
|
|
def get_type_desc(self, _type):
|
|
return None
|
|
|
|
#def get_obj(self, name):
|
|
# This is quite hairy, get rid of it soon
|
|
# # returns a pyobj
|
|
# pass
|
|
|
|
for field in PermaDocStorage.function_fields:
|
|
d = {"field": field}
|
|
func_name = "get_function_%s" % (field, )
|
|
exec py.code.Source("""
|
|
def %s(self, name, field=field):
|
|
return getattr(self.names[name], field)
|
|
""" % (func_name, )).compile() in d
|
|
setattr(PermaDocStorage, func_name, d[func_name])
|