templater: allow dynamically switching the default dict/list formatting
'%s' doesn't work nicely on Python 3 because many Python types don't implement
__bytes__().
--- a/mercurial/formatter.py Sat Mar 03 21:01:07 2018 +0530
+++ b/mercurial/formatter.py Thu Mar 01 08:07:22 2018 -0500
@@ -176,10 +176,10 @@
def formatdate(self, date, fmt='%a %b %d %H:%M:%S %Y %1%2'):
'''convert date tuple to appropriate format'''
return self._converter.formatdate(date, fmt)
- def formatdict(self, data, key='key', value='value', fmt='%s=%s', sep=' '):
+ def formatdict(self, data, key='key', value='value', fmt=None, sep=' '):
'''convert dict or key-value pairs to appropriate dict format'''
return self._converter.formatdict(data, key, value, fmt, sep)
- def formatlist(self, data, name, fmt='%s', sep=' '):
+ def formatlist(self, data, name, fmt=None, sep=' '):
'''convert iterable to appropriate list format'''
# name is mandatory argument for now, but it could be optional if
# we have default template keyword, e.g. {item}
@@ -248,10 +248,14 @@
@staticmethod
def formatdict(data, key, value, fmt, sep):
'''stringify key-value pairs separated by sep'''
+ if fmt is None:
+ fmt = '%s=%s'
return sep.join(fmt % (k, v) for k, v in _iteritems(data))
@staticmethod
def formatlist(data, name, fmt, sep):
'''stringify iterable separated by sep'''
+ if fmt is None:
+ fmt = '%s'
return sep.join(fmt % e for e in data)
class plainformatter(baseformatter):
--- a/mercurial/templatekw.py Sat Mar 03 21:01:07 2018 +0530
+++ b/mercurial/templatekw.py Thu Mar 01 08:07:22 2018 -0500
@@ -97,13 +97,17 @@
def itermaps(self):
yield self.tomap()
-def hybriddict(data, key='key', value='value', fmt='%s=%s', gen=None):
+def hybriddict(data, key='key', value='value', fmt=None, gen=None):
"""Wrap data to support both dict-like and string-like operations"""
+ if fmt is None:
+ fmt = '%s=%s'
return _hybrid(gen, data, lambda k: {key: k, value: data[k]},
lambda k: fmt % (k, data[k]))
-def hybridlist(data, name, fmt='%s', gen=None):
+def hybridlist(data, name, fmt=None, gen=None):
"""Wrap data to support both list-like and string-like operations"""
+ if fmt is None:
+ fmt = '%s'
return _hybrid(gen, data, lambda x: {name: x}, lambda x: fmt % x)
def unwraphybrid(thing):
@@ -137,7 +141,7 @@
return _mappable(None, key, value, makemap)
def compatdict(context, mapping, name, data, key='key', value='value',
- fmt='%s=%s', plural=None, separator=' '):
+ fmt=None, plural=None, separator=' '):
"""Wrap data like hybriddict(), but also supports old-style list template
This exists for backward compatibility with the old-style template. Use
@@ -148,7 +152,7 @@
f = _showlist(name, c, t, mapping, plural, separator)
return hybriddict(data, key=key, value=value, fmt=fmt, gen=f)
-def compatlist(context, mapping, name, data, element=None, fmt='%s',
+def compatlist(context, mapping, name, data, element=None, fmt=None,
plural=None, separator=' '):
"""Wrap data like hybridlist(), but also supports old-style list template
@@ -160,7 +164,7 @@
return hybridlist(data, name=element or name, fmt=fmt, gen=f)
def showdict(name, data, mapping, plural=None, key='key', value='value',
- fmt='%s=%s', separator=' '):
+ fmt=None, separator=' '):
ui = mapping.get('ui')
if ui:
ui.deprecwarn("templatekw.showdict() is deprecated, use compatdict()",