def hour_range(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True, sep='|', sub='-', default=None): """ 获取当前时间整点所在的整点区间 """ """ 例如, 当前时间的整点是10点, value为'3-8|9-14|15-23', 则10在区间[9, 14]之间, 返回的值是[9, 14] """ groups = StatsLog.group(key, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name, save=save, sep=sep, sub=sub) if not groups: return None h = datetime.now().hour for x in groups: if x[0] <= h <= x[1]: return x return default
def list(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True, sep='|', coerce=int): """ 将特定格式的字符串转为一维数组 """ """ 例如, 字符串格式为'1|2|3|4', 返回的是[1, 2, 3, 4] """ text = StatsLog.text(key, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name, save=save) if not text: return None texts = text.split(sep) return [coerce(x) for x in texts]
def group(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True, sep='|', sub='-', coerce=int): """ 将特定格式的字符串转为二维数组 """ """ 例如, 字符串格式为'1-3|4-9|10-32|64-128', 返回的是[[1, 3], [4, 9], [10, 32], [64, 128]] """ text = StatsLog.text(key, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name, save=save) if not text: return None texts = text.split(sep) return [[coerce(y) for y in x.split(sub)] for x in texts]
def set_bool(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value=False, name=None, save=True): """ 设置值(布尔值) """ if not isinstance(value, bool): raise ValueError('The type of value is not bool.') if callable(day): day = day() day = str(day)[:10] params = dict(set__value=value, set__updated_at=datetime.now()) if name is not None: params['set__name'] = name log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).modify(**params) if log: return value if save: StatsLog( key=key, data_type=StatsLog.TYPE.BOOLEAN, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name).save() return value return None
def bool(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value=False, name=None, save=True): """ 取值(布尔值) """ if not isinstance(value, bool): raise ValueError('The type of value is not bool.') if callable(day): day = day() day = str(day)[:10] log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).first() if log: if name is not None: log.name = name log.save() return True if log.value in ['true', 'True', True] else False if save: StatsLog( key=key, data_type=StatsLog.TYPE.BOOLEAN, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name).save() return value return None
def set_text(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True): """ 设置值(字符串) """ if callable(day): day = day() day = str(day)[:10] params = dict(set__value=value, set__updated_at=datetime.now()) if name is not None: params['set__name'] = name log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).modify(**params) if log: return value if save: StatsLog( key=key, data_type=StatsLog.TYPE.STRING, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name).save() return value return None
def text(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True): """ 取值(字符串) """ if callable(day): day = day() day = str(day)[:10] log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).first() if log: if name is not None: log.name = name log.save() return log.value if save: StatsLog( key=key, data_type=StatsLog.TYPE.STRING, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name).save() return value return None
def inc(key, uid='', xid='', label='', day=lambda: today(), hour=-1, start=0, value=1, name=None, save=True): """ 递增(整型/浮点型) """ if callable(day): day = day() day = str(day)[:10] data_type = StatsLog.TYPE.FLOAT if isinstance( value, float) else StatsLog.TYPE.INT params = dict( inc__value=value, set__data_type=data_type, set__updated_at=datetime.now()) if name is not None: params['set__name'] = name log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).modify(**params) if log: return log.value + value if save: StatsLog( key=key, data_type=data_type, uid=uid, xid=xid, label=label, day=day, hour=hour, value=start + value, name=name).save() return start + value return None
def choice(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value='', name=None, save=True, sep='|', coerce=str): return coerce( random.choice( StatsLog.text( key, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name, save=save).split(sep)))
def get(key, uid='', xid='', label='', day=lambda: today(), hour=-1, value=0, name=None, save=True): """ 取值(整型/浮点型) """ if callable(day): day = day() day = str(day)[:10] log = StatsLog.objects(key=key, uid=uid, xid=xid, label=label, day=day, hour=hour).first() if log: if name is not None: log.name = name log.save() try: if log.data_type == StatsLog.TYPE.INT: return int(log.value) if log.data_type == StatsLog.TYPE.FLOAT: return float(log.value) except ValueError as e: return 0 if save: data_type = StatsLog.TYPE.FLOAT if type( value) is float else StatsLog.TYPE.INT StatsLog(key=key, data_type=data_type, uid=uid, xid=xid, label=label, day=day, hour=hour, value=value, name=name).save() return value return None