X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Futils%2Futils.py;h=187d6dad96c25e2f01435da02a10202eac8c087d;hb=8f2cfb30b762325dd79bdee44322631ae0ce486f;hp=017af9fd4b96ded621c9a31bfec0c8affac98ac3;hpb=204fdd2bea753b024c7253a5830325b81aebbd61;p=mpd-sima.git diff --git a/sima/utils/utils.py b/sima/utils/utils.py index 017af9f..187d6da 100644 --- a/sima/utils/utils.py +++ b/sima/utils/utils.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2010, 2011, 2013 Jack Kaliko +# Copyright (c) 2010, 2011, 2013, 2014, 2015, 2020 kaliko # # This file is part of sima # @@ -18,15 +18,33 @@ # along with sima. If not, see . # # -"""generic tools and utilitaries for sima +"""generic tools and utilities for sima """ +# pylint: disable=C0111 +import logging 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 +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(): """ @@ -44,6 +62,7 @@ def get_mpd_environ(): passwd = mpd_host_env[1] return (host, environ.get('MPD_PORT', None), passwd) + def normalize_path(path): """Get absolute path """ @@ -51,10 +70,10 @@ def normalize_path(path): return normpath(join(getcwd(), path)) return path + def exception_log(): """Log unknown exceptions""" - import logging - log = logging.getLogger('sima') + log = logging.getLogger(__name__) log.error('Unhandled Exception!!!') log.error(''.join(traceback.format_exc())) log.info('Please report the previous message' @@ -64,6 +83,10 @@ def exception_log(): sys.exit(1) +class SigHup(Exception): + """SIGHUP raises this Exception""" + + # ArgParse Callbacks class Obsolete(Action): # pylint: disable=R0903 @@ -72,8 +95,9 @@ class Obsolete(Action): def __call__(self, parser, namespace, values, option_string=None): 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): @@ -88,14 +112,17 @@ class FileAction(Action): """ pass + class Wfile(FileAction): # pylint: disable=R0903 """Is file writable """ def checks(self): + if isdir(self._file): + self.parser.error('need a file not a directory: {}'.format(self._file)) if not exists(self._dir): #raise ArgumentError(self, '"{0}" does not exist'.format(self._dir)) - self.parser.error('file does not exist: {0}'.format(self._dir)) + self.parser.error('directory does not exist: {0}'.format(self._dir)) if not exists(self._file): # Is parent directory writable then if not access(self._dir, W_OK): @@ -104,6 +131,7 @@ class Wfile(FileAction): if not access(self._file, W_OK): self.parser.error('no write access to "{0}"'.format(self._file)) + class Rfile(FileAction): # pylint: disable=R0903 """Is file readable @@ -116,6 +144,7 @@ class Rfile(FileAction): if not access(self._file, R_OK): self.parser.error('no read access to "{0}"'.format(self._file)) + class Wdir(FileAction): # pylint: disable=R0903 """Is directory writable @@ -129,5 +158,45 @@ class Wdir(FileAction): self.parser.error('no write access to "{0}"'.format(self._file)) +class Throttle: + """throttle decorator""" + 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 MPDSimaException(Exception): + """Generic MPD_sima Exception""" + + +# http client exceptions (for webservices) +class WSError(MPDSimaException): + pass + + +class WSNotFound(WSError): + pass + + +class WSTimeout(WSError): + pass + + +class WSHTTPError(WSError): + pass + + +class PluginException(MPDSimaException): + pass + # VIM MODLINE # vim: ai ts=4 sw=4 sts=4 expandtab