| # -*- 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) |