#!/usr/bin/python # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. """Templating to help generate structured text.""" import os import re import emitter import logging _logger = logging.getLogger('multiemitter') class MultiEmitter(object): """A set of Emitters that write to different files. Each entry has a key. file --> emitter key --> emitter """ def __init__(self): self._key_to_emitter = {} # key -> Emitter self._filename_to_emitter = {} # filename -> Emitter def FileEmitter(self, filename, key=None): """Creates an emitter for writing to a file. When this MultiEmitter is flushed, the contents of the emitter are written to the file. Arguments: filename: a string, the path name of the file key: provides an access key to retrieve the emitter. Returns: the emitter. """ e = emitter.Emitter() self._filename_to_emitter[filename] = e if key: self.Associate(key, e) return e def Associate(self, key, emitter): """Associates a key with an emitter.""" self._key_to_emitter[key] = emitter def Find(self, key): """Returns the emitter associated with |key|.""" return self._key_to_emitter[key] def Flush(self, writer=None): """Writes all pending files. Arguments: writer: a function called for each file and it's lines. """ if not writer: writer = _WriteFile for file in sorted(self._filename_to_emitter.keys()): emitter = self._filename_to_emitter[file] writer(file, emitter.Fragments()) def _WriteFile(path, lines): (dir, file) = os.path.split(path) # Ensure dir exists. if dir: if not os.path.isdir(dir): os.makedirs(dir) # Remove file if pre-existing. if os.path.exists(path): os.remove(path) # Write the file. # _logger.info('Flushing - %s' % path) f = open(path, 'w') f.writelines(lines) f.close()