convert unicode parameters in obs event to str
authorLin Yang <lin.a.yang@intel.com>
Wed, 27 Mar 2013 03:49:29 +0000 (11:49 +0800)
committerGerrit Code Review <gerrit2@otctools.jf.intel.com>
Fri, 29 Mar 2013 02:05:57 +0000 (19:05 -0700)
Because json.loads will return unicode object by default, it will cause
1. print non-ascii char in obs event will cause exception
2. some functions osc core cannot support unicode parameters,
   like delete_project, delete_package
so convert all variables in obs event to str.

Change-Id: I5bf12b37c40931c01da71ef69770442a06e74ff9
Signed-off-by: Lin Yang <lin.a.yang@intel.com>
common/buildtrigger.py
common/utils.py

index 50f5851..49d8ce7 100644 (file)
@@ -4,6 +4,8 @@ try:
 except ImportError:
     import simplejson as json
 
+from common.utils import unicode_to_str
+
 def trigger_next(job_name, data):
     print "====LOG:TRIGGER_NEXT:%s ========================================" %job_name.upper()
     with open("%s.env" %job_name, 'w') as fh:
@@ -11,9 +13,10 @@ def trigger_next(job_name, data):
     for key in data.keys():
         print "%s='%s'" %(key, data[key])
     print "====LOG:TRIGGER_NEXT:========================================end=="
+
 def trigger_info(TRIGGER_INFO):
     print "====LOG:TRIGGER_INFO:========================================"
-    content_dict = json.loads(base64.b64decode(TRIGGER_INFO))
+    content_dict = unicode_to_str(json.loads(base64.b64decode(TRIGGER_INFO)))
     print json.dumps(content_dict, indent = 4)
     print "====LOG:TRIGGER_INFO:========================================end=="
     return content_dict
index eb20ede..13f5e0d 100644 (file)
@@ -79,3 +79,15 @@ def parse_link(path):
         return runner.outs('readlink %s' % path)
     else:
         return os.path.basename(path)
+
+def unicode_to_str(obj):
+    """convert unicode object to str"""
+
+    if isinstance(obj, list):
+        return [unicode_to_str(element) for element in obj]
+    elif isinstance(obj, dict):
+        return {unicode_to_str(key) : unicode_to_str(value) for key, value in obj.iteritems()}
+    elif isinstance(obj, unicode):
+        return obj.encode('utf-8')
+    else:
+        return obj