X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=sima%2Futils%2Futils.py;h=93bac25e78084dd94b92708fc7c83b5c91daefd8;hb=67bcabe7439d4830cb3ae8c61fa269eb9232ac59;hp=017af9fd4b96ded621c9a31bfec0c8affac98ac3;hpb=204fdd2bea753b024c7253a5830325b81aebbd61;p=mpd-sima.git diff --git a/sima/utils/utils.py b/sima/utils/utils.py index 017af9f..93bac25 100644 --- a/sima/utils/utils.py +++ b/sima/utils/utils.py @@ -18,15 +18,30 @@ # along with sima. If not, see . # # -"""generic tools and utilitaries for sima +"""generic tools and utilities for sima """ import traceback import sys -from argparse import (ArgumentError, Action) -from os import (environ, access, getcwd, W_OK, R_OK) -from os.path import (dirname, isabs, join, normpath, exists, isdir, isfile) +from argparse import ArgumentError, Action +from base64 import b64decode as push +from codecs import getencoder +from datetime import datetime, timedelta +from os import environ, access, getcwd, W_OK, R_OK +from os.path import dirname, isabs, join, normpath, exists, isdir, isfile +from time import sleep + + +def getws(dic): + """ + Decode Obfuscated api key. + Only preventing API keys harvesting over the network + https://developer.echonest.com/forums/thread/105 + """ + aka = push(bytes(dic.get('apikey') + '=', 'utf-8')) + aka = getencoder('rot-13')(str((aka), 'utf-8'))[0] + dic.update({'apikey':aka}) def get_mpd_environ(): """ @@ -63,6 +78,21 @@ def exception_log(): log.info('Quiting now!') sys.exit(1) +def purge_cache(obj, age=4): + now = datetime.utcnow() + if now.hour == obj.timestamp.hour: + return + obj.timestamp = datetime.utcnow() + cache = obj.cache + delta = timedelta(hours=age) + for url in list(cache.keys()): + timestamp = cache.get(url).created() + if now - timestamp > delta: + cache.pop(url) + + +class SigHup(Exception): + pass # ArgParse Callbacks class Obsolete(Action): @@ -73,7 +103,7 @@ class Obsolete(Action): raise ArgumentError(self, 'obsolete argument') class FileAction(Action): - """Generic class to inherit from for ARgPArse action on file/dir + """Generic class to inherit from for ArgParse action on file/dir """ # pylint: disable=R0903 def __call__(self, parser, namespace, values, option_string=None): @@ -128,6 +158,32 @@ class Wdir(FileAction): if not access(self._file, W_OK): self.parser.error('no write access to "{0}"'.format(self._file)) +class Throttle(): + def __init__(self, wait): + self.wait = wait + self.last_called = datetime.now() + + def __call__(self, func): + def wrapper(*args, **kwargs): + while self.last_called + self.wait > datetime.now(): + sleep(0.1) + result = func(*args, **kwargs) + self.last_called = datetime.now() + return result + return wrapper + +class Cache(): + def __init__(self, elem, last=None): + self.elem = elem + self.requestdate = last + if not last: + self.requestdate = datetime.utcnow() + + def created(self): + return self.requestdate + + def get(self): + return self.elem # VIM MODLINE # vim: ai ts=4 sw=4 sts=4 expandtab