| # -*- coding: utf-8 -*- | |
| """ | |
| Format management. | |
| Creating new formats | |
| -------------------- | |
| A new format named 'foo-bar' corresponds to Python module | |
| 'tracetool/format/foo_bar.py'. | |
| A format module should provide a docstring, whose first non-empty line will be | |
| considered its short description. | |
| All formats must generate their contents through the 'tracetool.out' routine. | |
| Format functions | |
| ---------------- | |
| ======== ================================================================== | |
| Function Description | |
| ======== ================================================================== | |
| generate Called to generate a format-specific file. | |
| ======== ================================================================== | |
| """ | |
| __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" | |
| __copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" | |
| __license__ = "GPL version 2 or (at your option) any later version" | |
| __maintainer__ = "Stefan Hajnoczi" | |
| __email__ = "stefanha@redhat.com" | |
| import os | |
| import tracetool | |
| def get_list(): | |
| """Get a list of (name, description) pairs.""" | |
| res = [] | |
| modnames = [] | |
| for filename in os.listdir(tracetool.format.__path__[0]): | |
| if filename.endswith('.py') and filename != '__init__.py': | |
| modnames.append(filename.rsplit('.', 1)[0]) | |
| for modname in sorted(modnames): | |
| module = tracetool.try_import("tracetool.format." + modname) | |
| # just in case; should never fail unless non-module files are put there | |
| if not module[0]: | |
| continue | |
| module = module[1] | |
| doc = module.__doc__ | |
| if doc is None: | |
| doc = "" | |
| doc = doc.strip().split("\n")[0] | |
| name = modname.replace("_", "-") | |
| res.append((name, doc)) | |
| return res | |
| def exists(name): | |
| """Return whether the given format exists.""" | |
| if len(name) == 0: | |
| return False | |
| name = name.replace("-", "_") | |
| return tracetool.try_import("tracetool.format." + name)[1] | |
| def generate(events, format, backend, group): | |
| if not exists(format): | |
| raise ValueError("unknown format: %s" % format) | |
| format = format.replace("-", "_") | |
| func = tracetool.try_import("tracetool.format." + format, | |
| "generate")[1] | |
| if func is None: | |
| raise AttributeError("format has no 'generate': %s" % format) | |
| func(events, backend, group) |