Show More
@@ -51,6 +51,12 b' class baseformatter(object):' | |||||
51 | '''convert date tuple to appropriate format''' |
|
51 | '''convert date tuple to appropriate format''' | |
52 | return date |
|
52 | return date | |
53 | @staticmethod |
|
53 | @staticmethod | |
|
54 | def formatdict(data, key='key', value='value', fmt='%s=%s', sep=' '): | |||
|
55 | '''convert dict or key-value pairs to appropriate dict format''' | |||
|
56 | # use plain dict instead of util.sortdict so that data can be | |||
|
57 | # serialized as a builtin dict in pickle output | |||
|
58 | return dict(data) | |||
|
59 | @staticmethod | |||
54 | def formatlist(data, name, fmt='%s', sep=' '): |
|
60 | def formatlist(data, name, fmt='%s', sep=' '): | |
55 | '''convert iterable to appropriate list format''' |
|
61 | '''convert iterable to appropriate list format''' | |
56 | return list(data) |
|
62 | return list(data) | |
@@ -75,6 +81,12 b' class baseformatter(object):' | |||||
75 | if self._item is not None: |
|
81 | if self._item is not None: | |
76 | self._showitem() |
|
82 | self._showitem() | |
77 |
|
83 | |||
|
84 | def _iteritems(data): | |||
|
85 | '''iterate key-value pairs in stable order''' | |||
|
86 | if isinstance(data, dict): | |||
|
87 | return sorted(data.iteritems()) | |||
|
88 | return data | |||
|
89 | ||||
78 | class plainformatter(baseformatter): |
|
90 | class plainformatter(baseformatter): | |
79 | '''the default text output scheme''' |
|
91 | '''the default text output scheme''' | |
80 | def __init__(self, ui, topic, opts): |
|
92 | def __init__(self, ui, topic, opts): | |
@@ -92,6 +104,10 b' class plainformatter(baseformatter):' | |||||
92 | '''stringify date tuple in the given format''' |
|
104 | '''stringify date tuple in the given format''' | |
93 | return util.datestr(date, fmt) |
|
105 | return util.datestr(date, fmt) | |
94 | @staticmethod |
|
106 | @staticmethod | |
|
107 | def formatdict(data, key='key', value='value', fmt='%s=%s', sep=' '): | |||
|
108 | '''stringify key-value pairs separated by sep''' | |||
|
109 | return sep.join(fmt % (k, v) for k, v in _iteritems(data)) | |||
|
110 | @staticmethod | |||
95 | def formatlist(data, name, fmt='%s', sep=' '): |
|
111 | def formatlist(data, name, fmt='%s', sep=' '): | |
96 | '''stringify iterable separated by sep''' |
|
112 | '''stringify iterable separated by sep''' | |
97 | return sep.join(fmt % e for e in data) |
|
113 | return sep.join(fmt % e for e in data) | |
@@ -129,7 +145,11 b' class pickleformatter(baseformatter):' | |||||
129 | self._ui.write(pickle.dumps(self._data)) |
|
145 | self._ui.write(pickle.dumps(self._data)) | |
130 |
|
146 | |||
131 | def _jsonifyobj(v): |
|
147 | def _jsonifyobj(v): | |
132 |
if isinstance(v, |
|
148 | if isinstance(v, dict): | |
|
149 | xs = ['"%s": %s' % (encoding.jsonescape(k), _jsonifyobj(u)) | |||
|
150 | for k, u in sorted(v.iteritems())] | |||
|
151 | return '{' + ', '.join(xs) + '}' | |||
|
152 | elif isinstance(v, (list, tuple)): | |||
133 | return '[' + ', '.join(_jsonifyobj(e) for e in v) + ']' |
|
153 | return '[' + ', '.join(_jsonifyobj(e) for e in v) + ']' | |
134 | elif v is None: |
|
154 | elif v is None: | |
135 | return 'null' |
|
155 | return 'null' | |
@@ -175,6 +195,14 b' class templateformatter(baseformatter):' | |||||
175 | g = self._t(self._topic, ui=self._ui, **self._item) |
|
195 | g = self._t(self._topic, ui=self._ui, **self._item) | |
176 | self._ui.write(templater.stringify(g)) |
|
196 | self._ui.write(templater.stringify(g)) | |
177 | @staticmethod |
|
197 | @staticmethod | |
|
198 | def formatdict(data, key='key', value='value', fmt='%s=%s', sep=' '): | |||
|
199 | '''build object that can be evaluated as either plain string or dict''' | |||
|
200 | data = util.sortdict(_iteritems(data)) | |||
|
201 | def f(): | |||
|
202 | yield plainformatter.formatdict(data, key, value, fmt, sep) | |||
|
203 | return templatekw._hybrid(f(), data, lambda k: {key: k, value: data[k]}, | |||
|
204 | lambda d: fmt % (d[key], d[value])) | |||
|
205 | @staticmethod | |||
178 | def formatlist(data, name, fmt='%s', sep=' '): |
|
206 | def formatlist(data, name, fmt='%s', sep=' '): | |
179 | '''build object that can be evaluated as either plain string or list''' |
|
207 | '''build object that can be evaluated as either plain string or list''' | |
180 | # name is mandatory argument for now, but it could be optional if |
|
208 | # name is mandatory argument for now, but it could be optional if |
General Comments 0
You need to be logged in to leave comments.
Login now