OLD | NEW |
| (Empty) |
1 #!/usr/bin/python | |
2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
3 # for details. All rights reserved. Use of this source code is governed by a | |
4 # BSD-style license that can be found in the LICENSE file. | |
5 | |
6 """Templating to help generate structured text.""" | |
7 | |
8 import os | |
9 import re | |
10 import emitter | |
11 import logging | |
12 | |
13 _logger = logging.getLogger('multiemitter') | |
14 | |
15 class MultiEmitter(object): | |
16 """A set of Emitters that write to different files. | |
17 | |
18 Each entry has a key. | |
19 | |
20 file --> emitter | |
21 key --> emitter | |
22 | |
23 """ | |
24 | |
25 def __init__(self): | |
26 self._key_to_emitter = {} # key -> Emitter | |
27 self._filename_to_emitter = {} # filename -> Emitter | |
28 | |
29 | |
30 def FileEmitter(self, filename, key=None): | |
31 """Creates an emitter for writing to a file. | |
32 | |
33 When this MultiEmitter is flushed, the contents of the emitter are written | |
34 to the file. | |
35 | |
36 Arguments: | |
37 filename: a string, the path name of the file | |
38 key: provides an access key to retrieve the emitter. | |
39 | |
40 Returns: the emitter. | |
41 """ | |
42 e = emitter.Emitter() | |
43 self._filename_to_emitter[filename] = e | |
44 if key: | |
45 self.Associate(key, e) | |
46 return e | |
47 | |
48 def Associate(self, key, emitter): | |
49 """Associates a key with an emitter.""" | |
50 self._key_to_emitter[key] = emitter | |
51 | |
52 def Find(self, key): | |
53 """Returns the emitter associated with |key|.""" | |
54 return self._key_to_emitter[key] | |
55 | |
56 def Flush(self, writer=None): | |
57 """Writes all pending files. | |
58 | |
59 Arguments: | |
60 writer: a function called for each file and it's lines. | |
61 """ | |
62 if not writer: | |
63 writer = _WriteFile | |
64 for file in sorted(self._filename_to_emitter.keys()): | |
65 emitter = self._filename_to_emitter[file] | |
66 writer(file, emitter.Fragments()) | |
67 | |
68 | |
69 def _WriteFile(path, lines): | |
70 (dir, file) = os.path.split(path) | |
71 | |
72 # Ensure dir exists. | |
73 if dir: | |
74 if not os.path.isdir(dir): | |
75 os.makedirs(dir) | |
76 | |
77 # Remove file if pre-existing. | |
78 if os.path.exists(path): | |
79 os.remove(path) | |
80 | |
81 # Write the file. | |
82 # _logger.info('Flushing - %s' % path) | |
83 f = open(path, 'w') | |
84 f.writelines(lines) | |
85 f.close() | |
OLD | NEW |