changeset 1134:a9b6e38d6dc9

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+.
author Sean Farley <sean.michael.farley@gmail.com>
date Mon, 17 Feb 2014 11:10:38 -0600
parents ff4e102932ed
children 5a0da3bab8a2
files hgsubversion/util.py
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgsubversion/util.py
+++ b/hgsubversion/util.py
@@ -142,6 +142,32 @@ def save_string(file_path, string):
     f.write(str(string))
     f.close()
 
+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.