def handle_class(info): name = info['name'] docs = info['doc'] attrs = info['attrs'] assert not docs, "Got docs need to handle it" parents = info['parents'] if not parents: parents = ['object'] # instance is boost wrapper result = ['class %s(%s):' % (name, ', '.join(parents))] properties = [] instance_methods = [] for attr_name, attr in sorted(attrs.items()): if attr['type'] == "<type 'property'>": properties.append((attr_name, attr.get('rtype', ''))) elif attr['type'] == "<type 'instancemethod'>": instance_methods.append(attr['routine']) else: warn("Skipping '%s': %s" % (name, attr)) for property_name, rtype in properties: if not rtype: return_text = 'pass' elif rtype.startswith("<type"): return_text = 'return %s()' % rtype[7:-2] else: return_text = 'return %s()' % rtype.split('.')[-1].strip("'>") if property_name == 'class': result.append(' # cant define it via python in that way') result.append(' # @property') result.append(' # def %s(self): ' % property_name) result.append(' # %s' % return_text) else: result.append(' @property') result.append(' def %s(self):' % property_name) result.append(' %s' % return_text) result.append('') for routine_name, routine_docs in instance_methods: docs = Docs(routine_docs, 2, is_class=True) # TODO: Subclass map-like classes from dict (or custom class) rather than this hack if docs.rtype in ('VisibilityIntMap', 'IntIntMap'): docs.rtype = 'dict[int, int]' return_string = 'return dict()' elif docs.rtype == 'None': return_string = 'return None' else: return_string = 'return %s()' % docs.rtype doc_string = docs.get_doc_string() result.append(' def %s(%s):' % (routine_name, docs.get_argument_string())) result.append(doc_string) result.append(' %s' % return_string) result.append('') if not (properties or instance_methods): result.append(' pass') if not result[-1]: result.pop() return '\n'.join(result)
def handle_class(info): name = info['name'] docs = info['doc'] attrs = info['attrs'] assert not docs, "Got docs need to handle it" parents = info['parents'] if not parents: parents = ['object'] # instance is boost wrapper result = ['class %s(%s):' % (name, ', '.join(parents))] properties = [] instance_methods = [] for attr_name, attr in sorted(attrs.items()): if attr['type'] == "<type 'property'>": properties.append((attr_name, attr.get('rtype', ''))) elif attr['type'] == "<type 'instancemethod'>": instance_methods.append(attr['routine']) else: warning("Skipping '%s': %s" % (name, attr)) for property_name, rtype in properties: if not rtype: return_text = 'pass' elif rtype.startswith("<type"): return_text = 'return %s()' % rtype[7:-2] else: return_text = 'return %s()' % rtype.split('.')[-1].strip("'>") if property_name == 'class': result.append(' # cant define it via python in that way') result.append(' # @property') result.append(' # def %s(self): ' % property_name) result.append(' # %s' % return_text) else: result.append(' @property') result.append(' def %s(self):' % property_name) result.append(' %s' % return_text) result.append('') for routine_name, routine_docs in instance_methods: docs = Docs(routine_docs, 2, is_class=True) # TODO: Subclass map-like classes from dict (or custom class) rather than this hack if docs.rtype in ('VisibilityIntMap', 'IntIntMap'): docs.rtype = 'dict[int, int]' return_string = 'return dict()' elif docs.rtype == 'None': return_string = 'return None' else: return_string = 'return %s()' % docs.rtype doc_string = docs.get_doc_string() result.append(' def %s(%s):' % (routine_name, docs.get_argument_string())) result.append(doc_string) result.append(' %s' % return_string) result.append('') if not (properties or instance_methods): result.append(' pass') if not result[-1]: result.pop() return '\n'.join(result)