]> kaliko git repositories - mpd-sima.git/commitdiff
Some clean-up (pylint audit)
authorkaliko <efrim@azylum.org>
Sat, 15 Feb 2014 19:08:07 +0000 (20:08 +0100)
committerkaliko <efrim@azylum.org>
Sat, 15 Feb 2014 19:08:07 +0000 (20:08 +0100)
18 files changed:
sima/core.py
sima/launch.py
sima/lib/daemon.py
sima/lib/logger.py
sima/lib/meta.py
sima/lib/player.py
sima/lib/plugin.py
sima/lib/simadb.py
sima/lib/simaecho.py
sima/lib/simafm.py
sima/lib/simastr.py
sima/lib/track.py
sima/lib/webserv.py
sima/plugins/internal/randomfallback.py
sima/utils/config.py
sima/utils/leven.py
sima/utils/startopt.py
sima/utils/utils.py

index 0aaebec498ff14cc8f9615f1844f363ff283e1f4..31111fca00312bde925e337fd0bd067f5cd4910f 100644 (file)
@@ -20,7 +20,6 @@
 """Core Object dealing with plugins and player client
 """
 
-import sys
 import time
 
 from collections import deque
@@ -60,6 +59,7 @@ class Sima(Daemon):
         return PlayerClient(host, port, pswd)
 
     def add_history(self):
+        """Handle local short history"""
         self.short_history.appendleft(self.player.current)
 
     def register_plugin(self, plugin_class):
@@ -73,6 +73,7 @@ class Sima(Daemon):
             getattr(plugin, method)(*args, **kwds)
 
     def need_tracks(self):
+        """Is the player in need for tracks"""
         if not self.enabled:
             self.log.debug('Queueing disabled!')
             return False
index a25b31333672592c22b627f4f4d85ad1f8a57e91..e1bd7449143a852d0eae500a2e18553b39e2d702 100644 (file)
@@ -58,7 +58,8 @@ def load_plugins(sima, source):
         try:
             mod_obj = __import__(module, fromlist=[plugin])
         except ImportError as err:
-            logger.error('Failed to load plugin\'s module: {0} ({1})'.format(module, err))
+            logger.error('Failed to load plugin\'s module: ' +
+                         '{0} ({1})'.format(module, err))
             sima.shutdown()
             sys.exit(1)
         try:
@@ -67,7 +68,8 @@ def load_plugins(sima, source):
             logger.error('Failed to load plugin {0} ({1})'.format(plugin, err))
             sima.shutdown()
             sys.exit(1)
-        logger.info('Loading {0} plugin: {name} ({doc})'.format(source, **plugin_obj.info()))
+        logger.info('Loading {0} plugin: {name} ({doc})'.format(
+                             source, **plugin_obj.info()))
         sima.register_plugin(plugin_obj)
 
 
@@ -133,13 +135,14 @@ def run(sopt, restart=False):
     # pylint: disable=broad-except
     try:
         start(sopt, restart)
-    except SigHup as err:  # SigHup inherit from Exception
+    except SigHup:  # SigHup inherit from Exception
         run(sopt, True)
     except Exception:  # Unhandled exception
         exception_log()
 
 # Script starts here
 def main():
+    """Entry point"""
     nfo = dict({'version': info.__version__,
                  'prog': 'sima'})
     # StartOpt gathers options from command line call (in StartOpt().options)
index 06f7beeae9a36e33459f3207a25f6fb75715f8af..fa0997686ea4198f9c6550c8dea1474b40c81e74 100644 (file)
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-
 # Public Domain
 #
 # Copyright 2007, 2009 Sander Marechal <s.marechal@jejik.com>
@@ -62,8 +61,8 @@ class Daemon(object):
         for details (ISBN 0201563177)
 
         Short explanation:
-            Unix processes belong to "process group" which in turn lies within a "session".
-            A session can have a controlling tty.
+            Unix processes belong to "process group" which in turn lies within a
+            "session".  A session can have a controlling tty.
             Forking twice allows to detach the session from a possible tty.
             The process lives then within the init process.
         """
index a4ed23de4f2b9c5c985edb8ff03d6383577837d0..3b287e26390859d47c2b11b7af7dedfecca88f81 100644 (file)
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-
 # Copyright (c) 2009, 2010, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
 #
 #  This file is part of sima
@@ -29,7 +28,7 @@ import sys
 
 
 LOG_FORMATS = {
-        logging.DEBUG:  '{asctime} {filename: >11}:{lineno: <3} {levelname: <7}: {message}',
+        logging.DEBUG: '{asctime} {filename: >11}:{lineno: <3} {levelname: <7}: {message}',
         logging.INFO:  '{asctime} {levelname: <7}: {message}',
         #logging.DEBUG: '{asctime} {filename}:{lineno}({funcName}) '
                                  #'{levelname}: {message}',
index d589051e3d0461aff175cb0841319fe61eb2672c..4e481e64ab4bfd5349569ae61e70fe36dc15060b 100644 (file)
@@ -1,9 +1,31 @@
 # -*- coding: utf-8 -*-
+# Copyright (c) 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+#
+#  This file is part of sima
+#
+#  sima is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  sima is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with sima.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+"""
+Defines some object to handle audio file metadata
+"""
 
 from .simastr import SimaStr
 from .track import Track
 
 class MetaException(Exception):
+    """Generic Meta Exception"""
     pass
 
 class NotSameArtist(MetaException):
@@ -11,6 +33,7 @@ class NotSameArtist(MetaException):
 
 
 class Meta:
+    """Generic Class for Meta object"""
 
     def __init__(self, **kwargs):
         self.name = None
index ddba0a9bea46357e94ec2f5bc6a1ebef7b19f6fd..6b6d2cba4dec19ff4cd19039f9a1ac4c3c8ced9e 100644 (file)
@@ -29,7 +29,6 @@ import logging
 
 
 class Player(object):
-
     """Player interface to inherit from.
 
     When querying player music library for tracks, Player instance *must* return
index 0e80ae582f865751c8f9b43a39bd5b63d53e311e..1188d4595e2190c47d8e6fbde7823926f49d852e 100644 (file)
@@ -1,6 +1,27 @@
 # -*- coding: utf-8 -*-
-
-class Plugin():
+# Copyright (c) 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+#
+#  This file is part of sima
+#
+#  sima is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  sima is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with sima.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+"""
+Plugin object to derive from
+"""
+
+class Plugin:
     """
     First non-empty line of the docstring is used as description
     Rest of the docstring at your convenience.
@@ -81,6 +102,7 @@ class Plugin():
         pass
 
     def shutdown(self):
+        """Called on application shutdown"""
         pass
 
 
index 284f11562cbed58801eef6816d24d768e801c255..6f881444efb8ab430052ff61b83355b74a31542e 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-
+#
 # Copyright (c) 2009-2013 Jack Kaliko <jack@azylum.org>
 # Copyright (c) 2009, Eric Casteleijn <thisfred@gmail.com>
 # Copyright (c) 2008 Rick van Hattem
@@ -20,6 +20,8 @@
 #  along with sima.  If not, see <http://www.gnu.org/licenses/>.
 #
 #
+"""SQlite database library
+"""
 
 #    DOC:
 #    MuscicBrainz ID: <http://musicbrainz.org/doc/MusicBrainzIdentifier>
@@ -27,7 +29,7 @@
 #             <http://musicbrainz.org/doc/Same_Artist_With_Different_Names>
 
 __DB_VERSION__ = 2
-__HIST_DURATION__ = int(7 * 24)  # in hours
+__HIST_DURATION__ = int(30 * 24)  # in hours
 
 import sqlite3
 
@@ -67,6 +69,7 @@ class SimaDB(object):
         self.db_path_mod_control()
 
     def db_path_mod_control(self):
+        """Controls DB path access & write permissions"""
         db_path = self._db_path
         # Controls directory access
         if not isdir(dirname(db_path)):
@@ -347,7 +350,7 @@ class SimaDB(object):
         """Retrieve complete play history, most recent tracks first
         artist  : filter history for specific artist
         artists : filter history for specific artists list
-        """
+        """ # pylint: disable=C0301
         date = datetime.utcnow() - timedelta(hours=duration)
         connection = self.get_database_connection()
         if artist:
@@ -380,7 +383,8 @@ class SimaDB(object):
         yield ('Row ID', 'Artist',)
         for row in rows:
             yield row
-        rows = connection.execute('SELECT black_list.rowid, albums.name, artists.name'
+        rows = connection.execute(
+                'SELECT black_list.rowid, albums.name, artists.name'
                 ' FROM artists, albums INNER JOIN black_list'
                 ' ON albums.id = black_list.album'
                 ' WHERE artists.id = albums.artist')
@@ -388,7 +392,8 @@ class SimaDB(object):
         yield ('Row ID', 'Album', 'Artist name')
         for row in rows:
             yield row
-        rows = connection.execute('SELECT black_list.rowid, tracks.name, artists.name'
+        rows = connection.execute(
+                'SELECT black_list.rowid, tracks.name, artists.name'
                 ' FROM artists, tracks INNER JOIN black_list'
                 ' ON tracks.id = black_list.track'
                 ' WHERE tracks.artist = artists.id')
@@ -522,9 +527,11 @@ class SimaDB(object):
         """Add to history"""
         connection = self.get_database_connection()
         track_id = self.get_track(track, with_connection=connection)[0]
-        rows = connection.execute("SELECT * FROM history WHERE track = ? ", (track_id,))
+        rows = connection.execute("SELECT * FROM history WHERE track = ? ",
+                                  (track_id,))
         if not rows.fetchone():
-            connection.execute("INSERT INTO history (track) VALUES (?)", (track_id,))
+            connection.execute("INSERT INTO history (track) VALUES (?)",
+                               (track_id,))
         connection.execute("UPDATE history SET last_play = DATETIME('now') "
                 " WHERE track = ?", (track_id,))
         connection.commit()
@@ -668,6 +675,7 @@ class SimaDB(object):
         self.close_database_connection(connection)
 
     def _set_dbversion(self):
+        """Add db version"""
         connection = self.get_database_connection()
         connection.execute('INSERT INTO db_info (version, name) VALUES (?, ?)',
                 (__DB_VERSION__, 'Sima DB'))
@@ -704,13 +712,13 @@ class SimaDB(object):
             'CREATE TABLE IF NOT EXISTS history (last_play DATE,'
             ' track integer)')
         connection.execute(
-            "CREATE INDEX IF NOT EXISTS a2aa1x ON usr_artist_2_artist (artist1)")
+          "CREATE INDEX IF NOT EXISTS a2aa1x ON usr_artist_2_artist (artist1)")
         connection.execute(
-            "CREATE INDEX IF NOT EXISTS a2aa2x ON usr_artist_2_artist (artist2)")
+          "CREATE INDEX IF NOT EXISTS a2aa2x ON usr_artist_2_artist (artist2)")
         connection.execute(
-            "CREATE INDEX IF NOT EXISTS lfma2aa1x ON lfm_artist_2_artist (artist1)")
+        "CREATE INDEX IF NOT EXISTS lfma2aa1x ON lfm_artist_2_artist (artist1)")
         connection.execute(
-            "CREATE INDEX IF NOT EXISTS lfma2aa2x ON lfm_artist_2_artist (artist2)")
+        "CREATE INDEX IF NOT EXISTS lfma2aa2x ON lfm_artist_2_artist (artist2)")
         connection.commit()
         self.close_database_connection(connection)
         self._set_dbversion()
index ff9782ac7f8ddac3845b1b10ec3fa4d9a3094397..14623031df6ab1f46d0d991572975171f0908812 100644 (file)
@@ -25,10 +25,7 @@ __version__ = '0.0.1'
 __author__ = 'Jack Kaliko'
 
 
-import logging
-
 from datetime import datetime, timedelta
-from time import sleep
 
 from requests import get, Request, Timeout, ConnectionError
 
@@ -44,8 +41,8 @@ WAIT_BETWEEN_REQUESTS = timedelta(0, 1)
 SOCKET_TIMEOUT = 4
 
 
-class SimaEch():
-    """
+class SimaEch:
+    """EchoNest http client
     """
     root_url = 'http://{host}/api/{version}'.format(**ECH)
     cache = {}
@@ -100,7 +97,7 @@ class SimaEch():
         raise WSError(status.get('message'))
 
     def _forge_payload(self, artist):
-        """
+        """Build payload
         """
         payload = {'api_key': ECH.get('apikey')}
         if not isinstance(artist, Artist):
@@ -110,13 +107,13 @@ class SimaEch():
             payload.update(
                     id='musicbrainz:artist:{0}'.format(artist.mbid))
         else:
-           payload.update(name=artist.name)
+            payload.update(name=artist.name)
         payload.update(bucket='id:musicbrainz')
         payload.update(results=100)
         return payload
 
     def get_similar(self, artist=None):
-        """
+        """Fetch similar artists
         """
         payload = self._forge_payload(artist)
         # Construct URL
index 3457016d5b67572e6572971b40f8b68eb9d82128..3210fdcdf7a4beb8dca96755e0c0470b849f92d7 100644 (file)
@@ -17,7 +17,7 @@
 #
 
 """
-Consume EchoNest web service
+Consume Last.fm web service
 """
 
 __version__ = '0.5.0'
@@ -40,8 +40,8 @@ WAIT_BETWEEN_REQUESTS = timedelta(0, 1)
 SOCKET_TIMEOUT = 6
 
 
-class SimaFM():
-    """
+class SimaFM:
+    """Last.fm http client
     """
     root_url = 'http://{host}/{version}/'.format(**LFM)
     cache = {}
@@ -96,7 +96,7 @@ class SimaFM():
         return True
 
     def _forge_payload(self, artist, method='similar', track=None):
-        """
+        """Build payload
         """
         payloads = dict({'similar': {'method':'artist.getsimilar',},
                         'top': {'method':'artist.gettoptracks',},
@@ -111,15 +111,15 @@ class SimaFM():
         if artist.mbid:
             payload.update(mbid='{0}'.format(artist.mbid))
         else:
-           payload.update(artist=artist.name,
-                          autocorrect=1)
+            payload.update(artist=artist.name,
+                           autocorrect=1)
         payload.update(results=100)
         if method == 'track':
             payload.update(track=track)
         return payload
 
     def get_similar(self, artist=None):
-        """
+        """Fetch similar artists
         """
         payload = self._forge_payload(artist)
         # Construct URL
index 9dacc45d1ea3af6302a1f56b08c9e6049b117a9b..56edbb4d7e68b82a816ad2d30cb6a99698d78864 100644 (file)
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-
 #
 # Copyright (c) 2009, 2010, 2013 Jack Kaliko <kaliko@azylum.org>
 #
@@ -18,7 +17,7 @@
 #  If not, see <http://www.gnu.org/licenses/>.
 #
 
-"""
+r"""
 SimaStr
 
 Special unicode() subclass to perform fuzzy match on specific strings with
@@ -70,7 +69,7 @@ __version__ = '0.4'
 
 # IMPORTS
 import unicodedata
-from re import (compile, U, I)
+from re import compile as re_compile, U, I
 
 from ..utils.leven import levenshtein_ratio
 
@@ -94,11 +93,11 @@ class SimaStr(str):
     # Trailing patterns: ! ? live
     # TODO: add "concert" key word
     #       add "Live at <somewhere>"
-    regexp_dict.update({'trail': '([- !?\.]|\(? ?[Ll]ive ?\)?)'})
+    regexp_dict.update({'trail': r'([- !?\.]|\(? ?[Ll]ive ?\)?)'})
 
-    reg_lead = compile('^(?P<lead>%(lead)s )(?P<root0>.*)$' % regexp_dict, I | U)
-    reg_midl = compile('^(?P<root0>.*)(?P<mid> %(mid)s )(?P<root1>.*)' % regexp_dict, U)
-    reg_trail = compile('^(?P<root0>.*?)(?P<trail>%(trail)s+$)' % regexp_dict, U)
+    reg_lead = re_compile('^(?P<lead>%(lead)s )(?P<root0>.*)$' % regexp_dict, I | U)
+    reg_midl = re_compile('^(?P<root0>.*)(?P<mid> %(mid)s )(?P<root1>.*)' % regexp_dict, U)
+    reg_trail = re_compile('^(?P<root0>.*?)(?P<trail>%(trail)s+$)' % regexp_dict, U)
 
     def __init__(self, fuzzstr):
         """
@@ -108,7 +107,7 @@ class SimaStr(str):
         # fuzzy computation
         self._get_root()
         if self.__class__.diafilter:
-           self.remove_diacritics()
+            self.remove_diacritics()
 
     def __new__(cls, fuzzstr):
         return super(SimaStr, cls).__new__(cls, fuzzstr)
@@ -134,6 +133,7 @@ class SimaStr(str):
             self.stripped = sea.group('root0')
 
     def remove_diacritics(self):
+        """converting diacritics"""
         self.stripped = ''.join(x for x in
                                 unicodedata.normalize('NFKD', self.stripped)
                                 if unicodedata.category(x) != 'Mn')
index 93904c80c9688ca851a9e930d7ed4595bb9c32d5..5a01e17f5af69f0c8cd404a0839128672b27ca48 100644 (file)
@@ -24,7 +24,7 @@
 import time
 
 
-class Track(object):
+class Track:
     """
     Track object.
     Instanciate with Player replies.
@@ -37,7 +37,7 @@ class Track(object):
         self._file = file
         if not kwargs:
             self._empty = True
-        self.time = time
+        self._time = time
         self.__dict__.update(**kwargs)
         self.tags_to_collapse = ['artist', 'album', 'title', 'date',
                                  'genre', 'albumartist']
@@ -124,13 +124,5 @@ class Track(object):
             fmt = '%M:%S'
         return time.strftime(fmt, temps)
 
-
-def main():
-    pass
-
-# Script starts here
-if __name__ == '__main__':
-    main()
-
 # VIM MODLINE
 # vim: ai ts=4 sw=4 sts=4 expandtab
index cc4b2b5deb250245214bea798d5019f52e5dff4a..291c4c4e3cccdb2c097f73ef04a14be908dd7ed8 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2014 Jack Kaliko <kaliko@azylum.org>
 #
 #  This file is part of sima
 #
@@ -227,7 +227,9 @@ class WebService(Plugin):
         self.log.info('EXTRA ARTS: {}'.format(
             '/'.join([trk.artist for trk in extra_arts])))
         for artist in extra_arts:
-            self.log.debug('Looking for artist similar to "{0.artist}" as well'.format(artist))
+            self.log.debug(
+                    'Looking for artist similar to "{0.artist}" as well'.format(
+                        artist))
             similar = self.lfm_similar_artists(artist=artist)
             if not similar:
                 return ret_extra
@@ -285,7 +287,8 @@ class WebService(Plugin):
             # str conversion while Album type is not propagated
             albums = [ str(album) for album in albums]
             if albums:
-                self.log.debug('Albums candidate: {0:s}'.format(' / '.join(albums)))
+                self.log.debug('Albums candidate: {0:s}'.format(
+                               ' / '.join(albums)))
             else: continue
             # albums yet in history for this artist
             albums = set(albums)
index cb19f497efbc00972fbc7915f60cb176663fe1de..845a41ab1a133c28d6b9df6d7b9c4fe5626b2931 100644 (file)
@@ -28,7 +28,6 @@ import random
 
 # local import
 from ...lib.plugin import Plugin
-from ...lib.track import Track
 
 
 class RandomFallBack(Plugin):
@@ -62,6 +61,8 @@ class RandomFallBack(Plugin):
         return trks
 
     def get_trk(self):
+        """Get a single track acording to random flavour
+        """
         artists = list(self.player.artists)
         if self.mode == 'sensitive':
             played_art = self.get_played_artist()
index da66366042e082ee7e0b73f410bef2e9511d0ac7..439f4a57c78bae9c7ca25b0c7dc32a47aafd7b61 100644 (file)
@@ -189,8 +189,8 @@ class ConfMan(object):  # CONFIG MANAGER CLASS
                 self.log.debug('[%s] present in conf file' % section)
                 for option in self.defaults[section]:
                     if self.config.has_option(section, option):
-                        #self.log.debug(u'option "%s" set to "%s" in conf. file' %
-                        #              (option, self.config.get(section, option)))
+                        #self.log.debug('option "%s" set to "%s" in conf. file'%
+                        #            (option, self.config.get(section, option)))
                         pass
                     else:
                         self.log.debug(
index 9b269df4357bc8db740a1f4777646e697a0966ab..ab6fc35acac6e3864ea64426a4ab67bee5ba7e8a 100644 (file)
@@ -16,7 +16,7 @@
 #  You should have received a copy of the GNU General Public License
 #  along with sima.  If not, see <http://www.gnu.org/licenses/>.
 #
-#
+"""Computes levenshtein distance/ratio"""
 
 def levenshtein(a_st, b_st):
     """Computes the Levenshtein distance between two strings."""
index 33e89b1988291fba038a438c064e24972b8e076c..ef2032c13b0f013c1fecc3a5b0fd4ee21c3e7bc3 100644 (file)
 #
 #
 
-import sys
 from argparse import (ArgumentParser, SUPPRESS)
 
 
-from .utils import Obsolete, Wfile, Rfile, Wdir
+from .utils import Wfile, Rfile, Wdir
 
 USAGE = """USAGE:  %prog [--help] [options]"""
 DESCRIPTION = """
@@ -115,6 +114,7 @@ class StartOpt(object):
     """
 
     def __init__(self, script_info,):
+        self.parser = None
         self.info = dict(script_info)
         self.options = dict()
         self.main()
index d0edcd4ab6f8ca671143df6fbfe8e0e97ac44cc0..475a54859305d2dbbff604546a6333b05c97eac6 100644 (file)
@@ -20,6 +20,7 @@
 #
 """generic tools and utilities for sima
 """
+# pylint: disable=C0111
 
 import traceback
 import sys
@@ -79,6 +80,8 @@ def exception_log():
     sys.exit(1)
 
 def purge_cache(obj, age=4):
+    """purge old entries in http client cache
+    """
     now = datetime.utcnow()
     if now.hour == obj.timestamp.hour:
         return
@@ -92,6 +95,7 @@ def purge_cache(obj, age=4):
 
 
 class SigHup(Exception):
+    """SIGHUP raises this Exception"""
     pass
 
 # ArgParse Callbacks
@@ -158,7 +162,8 @@ class Wdir(FileAction):
         if not access(self._file, W_OK):
             self.parser.error('no write access to "{0}"'.format(self._file))
 
-class Throttle():
+class Throttle:
+    """throttle decorator"""
     def __init__(self, wait):
         self.wait = wait
         self.last_called = datetime.now()
@@ -172,7 +177,8 @@ class Throttle():
             return result
         return wrapper
 
-class Cache():
+class Cache:
+    """Plain cache object"""
     def __init__(self, elem, last=None):
         self.elem = elem
         self.requestdate = last