def test_dumps_jsonx(self): test_cases = [{"abc" : 1, "doc__" : "xxyyzz"},{"doc2__" : "xx", "x" : 1, "doc1__" : "yy", "y" : 2}] for obj in test_cases: print obj binary = misc.dumps_jsonx(copy.deepcopy(obj)) print binary ret_obj = misc.loads_jsonx(binary) print ret_obj self.assertTrue(len(obj) == len(ret_obj)) for key, value in obj.items(): self.assertEqual(value, ret_obj[key]) self.assertTrue(obj == ret_obj)
def test_dumps_jsonx_body(self): req = urllib2.Request("http://www.5173.com") res = urllib2.urlopen(req) body = res.read() body = body.decode("utf-8", "ignore").encode("utf-8") message = {"doc__" : body, "url" : "xx"} binary = misc.dumps_jsonx(copy.deepcopy(message)) ret_message = misc.loads_jsonx(binary) self.assertEqual(message, ret_message) try: simplejson.loads(simplejson.dumps(message)) self.assertFail() except: pass
def set(self, data_type, ori_data_key, with_get=False, **kwargs): """ parameters: with_get: returns original value if True, default is False cond: just set values if cond is met, just support redis/hash now nx: if just set value if the key does not exist, just support text/json and text/plain, with_get can't be used with nx strict: whether set the non-existed field to none, default is True, just support redis/hash redis/hash: fields: get fields, just support redis/hash content_types: text/json: data is dict object, serialize to text, and override all the values, with_get == False: returns True, else: returns original value text/plain: data is str object, set directly, with_get == False: returns True, else: returns original value redis/hash: update_map/inc_map are optional, will update specified fields, with_get == False: returns True if any update is not empty, else: returns original value redis/set: data_key is set value, with_get == False, returns True, else returns if existed """ #logging.debug("redis set", data_type, ori_data_key, with_get, kwargs) data_key = copy.deepcopy(ori_data_key) if not self._enabled: return None name, content_type, enabled = self._prepare_op(data_type, data_key) if not enabled: return None parameters = RedisClient._get_parameters("set", content_type, **kwargs) if content_type == "text/json": data = parameters["data"] nx = parameters["nx"] if data is None: raise Exception("data can't be null") if not isinstance(data, dict): raise Exception("text/json type data before dumps should be dict type") data = misc.dumps_jsonx(data) if nx and with_get: raise Exception("nx can't be used with with_get") if not with_get: if nx: return self._client.setnx(name, data) else: return self._client.set(name, data) else: data = self._client.getset(name, data) return self._load_json_object(data) elif content_type == "text/plain": data = parameters["data"] nx = parameters["nx"] if not isinstance(data, str): data = encode_string(data) if data is None: raise Exception("redis set value must be str, %s, %s, %s" % (data_type, data_key, type(data))) if nx and with_get: raise Exception("nx can't be used with with_get") if not with_get: if nx: return self._client.setnx(name, data) else: return self._client.set(name, data) else: return self._client.getset(name, data) elif content_type == "redis/hash": return self._set_hash(data_type, name, parameters["update_map"], parameters["inc_map"], with_get, parameters["fields"], parameters["strict"], parameters["cond"]) elif content_type == "redis/set": if not isinstance(data_key, str): data_key = encode_string(data_key) if data_key is None: raise Exception("data_key must be str, %s" % data_key) existed = self._client.sadd(name, data_key) == 0 if not with_get: return True else: return existed else: raise Exception("unsupported data_type for set, %s" % data_type)