|
|
|
@ -0,0 +1,89 @@ |
|
|
|
__all__ = ["__version__", "Client"] |
|
|
|
__version__ = "0.1.0" |
|
|
|
|
|
|
|
import collections |
|
|
|
import json |
|
|
|
|
|
|
|
import memcache |
|
|
|
|
|
|
|
|
|
|
|
class Client(object): |
|
|
|
__slots__ = ["connection"] |
|
|
|
|
|
|
|
def __init__(self, host="127.0.0.1", port=11222): |
|
|
|
self.connection = memcache.Client(["%s:%s" % (host, port)]) |
|
|
|
|
|
|
|
def get_user_variants(self, exp_ids, user_id): |
|
|
|
keys = ['%s:%s' % (exp_id, user_id) for exp_id in exp_ids] |
|
|
|
data = self.connection.get_multi(keys) |
|
|
|
results = {} |
|
|
|
|
|
|
|
for key, value in data.iteritems(): |
|
|
|
exp_id, _, _ = key.partition(":") |
|
|
|
results[exp_id] = value |
|
|
|
|
|
|
|
return results |
|
|
|
|
|
|
|
def get_user_variant(self, exp_id, user_id): |
|
|
|
key = '%s:%s' % (exp_id, user_id) |
|
|
|
return self.connection.get(key) |
|
|
|
|
|
|
|
def convert_user(self, exp_id, user_id): |
|
|
|
key = '%s:%s' % (exp_id, user_id) |
|
|
|
return self.connection.incr(key) |
|
|
|
|
|
|
|
def add_new_experiment(self, data): |
|
|
|
data = json.dumps(data) |
|
|
|
return self.connection.add("1", data) |
|
|
|
|
|
|
|
def update_experiment(self, exp_id, data): |
|
|
|
data = json.dumps(data) |
|
|
|
return self.connection.replace(exp_id, data) |
|
|
|
|
|
|
|
def get_experiment(self, exp_id): |
|
|
|
data = self.connection.get("experiment:%s" % (exp_id, )) |
|
|
|
if data: |
|
|
|
return json.loads(data) |
|
|
|
return None |
|
|
|
|
|
|
|
def get_active_experiments(self): |
|
|
|
data = self.connection.get("experiment:active") |
|
|
|
results = {} |
|
|
|
if data: |
|
|
|
data = json.loads(data) |
|
|
|
for exp in data: |
|
|
|
results[int(exp['id'])] = exp |
|
|
|
return results |
|
|
|
|
|
|
|
def get_all_experiments(self): |
|
|
|
data = self.connection.get("experiment:*") |
|
|
|
results = {} |
|
|
|
if data: |
|
|
|
data = json.loads(data) |
|
|
|
for exp in data: |
|
|
|
results[int(exp['id'])] = exp |
|
|
|
return results |
|
|
|
|
|
|
|
def deactivate_experiment(self, exp_id): |
|
|
|
return self.connection.delete(exp_id) |
|
|
|
|
|
|
|
def activate_experiment(self, exp_id): |
|
|
|
return self.connection.touch(exp_id) |
|
|
|
|
|
|
|
def get_active_experiment_stats(self): |
|
|
|
data = self.connection.get_stats() |
|
|
|
results = collections.defaultdict(lambda: collections.defaultdict(dict)) |
|
|
|
for server, stats in data: |
|
|
|
for key, value in stats.iteritems(): |
|
|
|
key, exp_id, bucket_id = key.split(".") |
|
|
|
results[int(exp_id)][int(bucket_id)][key] = value |
|
|
|
return results |
|
|
|
|
|
|
|
def get_experiment_stats(self, exp_id): |
|
|
|
data = self.connection.get_stats(str(exp_id)) |
|
|
|
results = collections.defaultdict(dict) |
|
|
|
for server, stats in data: |
|
|
|
for key, value in stats.iteritems(): |
|
|
|
key, exp_id, bucket_id = key.split(".") |
|
|
|
results[int(bucket_id)][int(key)] = value |
|
|
|
return results |