Sean Farley  committed a9b6e38

util: add visitor pattern for scrubbing json

These functions are for future patches that will add safer serialization via
json. '_convert' is a visitor pattern that will be used for lists,
dictionaries, and strings for helping convert None to the empty string since
json forbids 'null' as a key for a dictionary.

None -> '' is a safe mapping because this is for the 'branch_info' variable
which already maps the empty string to None.

Note, also, that json is chosen instead of, say, csv because json has a concept
of 'null' and will better handle utf8 strings (which subversion supports).

Important: this changes the requirement of hgsubversion to python 2.6+.

  • Participants
  • Parent commits ff4e102
  • Branches default

Comments (0)

Files changed (1)

File hgsubversion/

+def _scrub(data):
+    if not data and not isinstance(data, list):
+        return ''
+    return data
+def _descrub(data):
+    if isinstance(data, list):
+        return tuple(data)
+    if data == '':
+        return None
+    return data
+def _convert(input, visitor):
+    if isinstance(input, dict):
+        scrubbed = {}
+        d = dict([(_convert(key, visitor), _convert(value, visitor))
+                  for key, value in input.iteritems()])
+        for key, val in d.iteritems():
+            scrubbed[visitor(key)] = visitor(val)
+        return scrubbed
+    elif isinstance(input, list):
+        return [_convert(element, visitor) for element in input]
+    elif isinstance(input, unicode):
+        return input.encode('utf-8')
+    return input
 def dump(data, file_path):
     """pickle some data to a path atomically.