#!/usr/bin/env python # Copyright 2014 Lars Wirzenius # # 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, either version 3 of the License, or # (at your option) any later version. # # 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import collections import imp import inspect import os import cliapp import obnamlib import obnamlib.plugins def get_modules(module): objs = [getattr(module, name) for name in dir(module)] return [x for x in objs if inspect.ismodule(x)] def get_modules_recursively(module): result = [] queue = get_modules(module) while queue: item = queue.pop() if item not in result: result.append(item) queue.extend(get_modules(item)) return result def get_obnam_errors(module): def is_obnam_error(obj): return (type(obj) is type and issubclass(x, obnamlib.ObnamError) and hasattr(x, 'msg')) objs = [getattr(module, name) for name in dir(module)] return [x for x in objs if is_obnam_error(x)] all_modules = get_modules_recursively(obnamlib) # This is a bit of magic to load all the modules that contain plugins. def find_plugin_modules(*args): for module_filename in app.pluginmgr.plugin_files: module_name, ext = os.path.splitext(os.path.basename(module_filename)) with open(module_filename) as f: module = imp.load_module(module_name, f, module_filename, ('.py', 'r', imp.PY_SOURCE)) all_modules.append(module) # This is a terrible kludge. app = obnamlib.App() app.process_args = find_plugin_modules app.run() template = '''\ {id} ({class_name}): {msg} ''' for module in set(all_modules): for error_class in get_obnam_errors(module): e = error_class() print template.format( class_name=error_class.__name__, id=e.id, msg=e.msg, ),