def install_client_commands(): cleared_classes = set() for class_name, command_def in client_commands: # what to do with global methods??? # validation cls = None if class_name: try: cls = [c for c in api_globals if inspect.isclass(c) and c.__name__ == class_name][0] except IndexError: #raise RuntimeError("Internal Error: @api decoration cannot resolve class name %s for function %s" % (class_name, command_def.name)) pass if cls: cls_with_installation = metaprog.get_class_from_store(metaprog.InstallPath(command_def.entity_type)) if cls_with_installation is not cls: raise RuntimeError("Internal Error: @api decoration resolved with mismatched classes for %s" % class_name) if cls not in cleared_classes: clear_clientside_api_stubs(cls) cleared_classes.add(cls) installation = metaprog.get_installation(cls_with_installation) if command_def.entity_type != installation.install_path.full: raise RuntimeError("Internal Error: @api decoration resulted in different install paths '%s' and '%s' for function %s in class %s" % (command_def.entity_type, installation.install_path, command_def.name, class_name)) if command_def.full_name not in muted_commands: installation.commands.append(command_def) setattr(cls, command_def.name, command_def.client_member) logger.debug("Installed client-side api function %s to class %s", command_def.name, cls) elif command_def.client_member not in api_globals: # global function api_globals.add(command_def.client_member)
def decorate_api_class(item): mark_item_as_api(item) api_globals.add(item) return item