From 5c7a496dc2b3548ff66afce5662271ebc190f251 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 8 Aug 2013 21:07:04 +0200 Subject: [PATCH 1/5] Fix flake8 warnings --- mopidy/audio/actor.py | 7 +++--- mopidy/backends/local/translator.py | 1 - mopidy/backends/spotify/translator.py | 3 ++- mopidy/config/types.py | 3 ++- mopidy/core/library.py | 10 +++++---- mopidy/ext.py | 3 ++- mopidy/scanner.py | 6 +++-- tests/backends/local/playlists_test.py | 3 --- tests/config/schemas_test.py | 3 ++- .../mpd/protocol/stored_playlists_test.py | 22 +++++++++---------- 10 files changed, 33 insertions(+), 28 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index d78df9b7..c11d79b3 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -35,8 +35,8 @@ MB = 1 << 20 # GST_PLAY_FLAG_SOFT_COLORBALANCE (1<<10) # Default flags to use for playbin: AUDIO, SOFT_VOLUME, DOWNLOAD -PLAYBIN_FLAGS = (1<<1) | (1<<4) | (1<<7) -PLAYBIN_VIS_FLAGS = PLAYBIN_FLAGS | (1<<3) +PLAYBIN_FLAGS = (1 << 1) | (1 << 4) | (1 << 7) +PLAYBIN_VIS_FLAGS = PLAYBIN_FLAGS | (1 << 3) class Audio(pykka.ThreadingActor): @@ -175,7 +175,8 @@ class Audio(pykka.ThreadingActor): logger.info('Audio visualizer set to "%s"', visualizer_element) except gobject.GError as ex: logger.error( - 'Failed to create audio visualizer "%s": %s', visualizer_element, ex) + 'Failed to create audio visualizer "%s": %s', + visualizer_element, ex) def _setup_mixer(self): mixer_desc = self._config['audio']['mixer'] diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index b8e98dd3..7cd46fbb 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals import logging import os -import urllib import urlparse from mopidy.models import Track, Artist, Album diff --git a/mopidy/backends/spotify/translator.py b/mopidy/backends/spotify/translator.py index 5813f880..f35cad2e 100644 --- a/mopidy/backends/spotify/translator.py +++ b/mopidy/backends/spotify/translator.py @@ -67,7 +67,8 @@ def to_mopidy_track(spotify_track, bitrate=None): return track_cache[uri] -def to_mopidy_playlist(spotify_playlist, folders=None, bitrate=None, username=None): +def to_mopidy_playlist( + spotify_playlist, folders=None, bitrate=None, username=None): if spotify_playlist is None or spotify_playlist.type() != 'playlist': return try: diff --git a/mopidy/config/types.py b/mopidy/config/types.py index 29651940..d3cd2462 100644 --- a/mopidy/config/types.py +++ b/mopidy/config/types.py @@ -111,7 +111,8 @@ class Secret(ConfigValue): class Integer(ConfigValue): """Integer value.""" - def __init__(self, minimum=None, maximum=None, choices=None, optional=False): + def __init__( + self, minimum=None, maximum=None, choices=None, optional=False): self._required = not optional self._minimum = minimum self._maximum = maximum diff --git a/mopidy/core/library.py b/mopidy/core/library.py index 50d75144..cdc3f53a 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -69,8 +69,9 @@ class LibraryController(object): """ query = query or kwargs futures = [ - backend.library.find_exact(query=query, uris=uris) - for (backend, uris) in self._get_backends_to_uris(uris).items()] + backend.library.find_exact(query=query, uris=backend_uris) + for (backend, backend_uris) + in self._get_backends_to_uris(uris).items()] return [result for result in pykka.get_all(futures) if result] def lookup(self, uri): @@ -145,6 +146,7 @@ class LibraryController(object): """ query = query or kwargs futures = [ - backend.library.search(query=query, uris=uris) - for (backend, uris) in self._get_backends_to_uris(uris).items()] + backend.library.search(query=query, uris=backend_uris) + for (backend, backend_uris) + in self._get_backends_to_uris(uris).items()] return [result for result in pykka.get_all(futures) if result] diff --git a/mopidy/ext.py b/mopidy/ext.py index 22daa3cb..5db7c093 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -82,7 +82,8 @@ class Extension(object): def get_library_updaters(self): """List of library updater classes - :returns: list of :class:`~mopidy.backends.base.BaseLibraryUpdateProvider` + :returns: list of + :class:`~mopidy.backends.base.BaseLibraryUpdateProvider` subclasses """ return [] diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 4632cebe..81ac5c53 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -192,7 +192,8 @@ def translator(data): class Scanner(object): - def __init__(self, uris, data_callback, error_callback=None, scan_timeout=1000): + def __init__( + self, uris, data_callback, error_callback=None, scan_timeout=1000): self.data = {} self.uris = iter(uris) self.data_callback = data_callback @@ -298,7 +299,8 @@ class Scanner(object): return False self.pipe.set_state(gst.STATE_NULL) self.uribin.set_property('uri', uri) - self.timeout_id = gobject.timeout_add(self.scan_timeout, self.process_timeout) + self.timeout_id = gobject.timeout_add( + self.scan_timeout, self.process_timeout) self.pipe.set_state(gst.STATE_PLAYING) return True diff --git a/tests/backends/local/playlists_test.py b/tests/backends/local/playlists_test.py index 591a9d1d..d405e887 100644 --- a/tests/backends/local/playlists_test.py +++ b/tests/backends/local/playlists_test.py @@ -7,7 +7,6 @@ import unittest from mopidy.backends.local import actor from mopidy.models import Track -from mopidy.utils.path import path_to_uri, uri_to_path from tests import path_to_data_dir from tests.backends.base.playlists import ( @@ -100,8 +99,6 @@ class LocalPlaylistsControllerTest( self.assertEqual(track.uri, contents.strip()) def test_playlists_are_loaded_at_startup(self): - playlist_path = os.path.join(self.playlists_dir, 'test.m3u') - track = Track(uri='local:track:path2') playlist = self.core.playlists.create('test') playlist = playlist.copy(tracks=[track]) diff --git a/tests/config/schemas_test.py b/tests/config/schemas_test.py index 8bcfc651..9da8f667 100644 --- a/tests/config/schemas_test.py +++ b/tests/config/schemas_test.py @@ -81,7 +81,8 @@ class ConfigSchemaTest(unittest.TestCase): class LogLevelConfigSchemaTest(unittest.TestCase): def test_conversion(self): schema = schemas.LogLevelConfigSchema('test') - result, errors = schema.deserialize({'foo.bar': 'DEBUG', 'baz': 'INFO'}) + result, errors = schema.deserialize( + {'foo.bar': 'DEBUG', 'baz': 'INFO'}) self.assertEqual(logging.DEBUG, result['foo.bar']) self.assertEqual(logging.INFO, result['baz']) diff --git a/tests/frontends/mpd/protocol/stored_playlists_test.py b/tests/frontends/mpd/protocol/stored_playlists_test.py index 820096f4..d75944c4 100644 --- a/tests/frontends/mpd/protocol/stored_playlists_test.py +++ b/tests/frontends/mpd/protocol/stored_playlists_test.py @@ -10,8 +10,8 @@ from tests.frontends.mpd import protocol class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylist(self): self.backend.playlists.playlists = [ - Playlist(name='name', uri='dummy:name', - tracks=[Track(uri='dummy:a')])] + Playlist( + name='name', uri='dummy:name', tracks=[Track(uri='dummy:a')])] self.sendRequest('listplaylist "name"') self.assertInResponse('file: dummy:a') @@ -19,8 +19,8 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylist_without_quotes(self): self.backend.playlists.playlists = [ - Playlist(name='name', uri='dummy:name', - tracks=[Track(uri='dummy:a')])] + Playlist( + name='name', uri='dummy:name', tracks=[Track(uri='dummy:a')])] self.sendRequest('listplaylist name') self.assertInResponse('file: dummy:a') @@ -41,8 +41,8 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylistinfo(self): self.backend.playlists.playlists = [ - Playlist(name='name', uri='dummy:name', - tracks=[Track(uri='dummy:a')])] + Playlist( + name='name', uri='dummy:name', tracks=[Track(uri='dummy:a')])] self.sendRequest('listplaylistinfo "name"') self.assertInResponse('file: dummy:a') @@ -52,8 +52,8 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylistinfo_without_quotes(self): self.backend.playlists.playlists = [ - Playlist(name='name', uri='dummy:name', - tracks=[Track(uri='dummy:a')])] + Playlist( + name='name', uri='dummy:name', tracks=[Track(uri='dummy:a')])] self.sendRequest('listplaylistinfo name') self.assertInResponse('file: dummy:a') @@ -109,7 +109,7 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylists_replaces_newline_with_space(self): self.backend.playlists.playlists = [ - Playlist(name='a\n', uri='dummy:')] + Playlist(name='a\n', uri='dummy:')] self.sendRequest('listplaylists') self.assertInResponse('playlist: a ') self.assertNotInResponse('playlist: a\n') @@ -117,7 +117,7 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylists_replaces_carriage_return_with_space(self): self.backend.playlists.playlists = [ - Playlist(name='a\r', uri='dummy:')] + Playlist(name='a\r', uri='dummy:')] self.sendRequest('listplaylists') self.assertInResponse('playlist: a ') self.assertNotInResponse('playlist: a\r') @@ -125,7 +125,7 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): def test_listplaylists_replaces_forward_slash_with_space(self): self.backend.playlists.playlists = [ - Playlist(name='a/', uri='dummy:')] + Playlist(name='a/', uri='dummy:')] self.sendRequest('listplaylists') self.assertInResponse('playlist: a ') self.assertNotInResponse('playlist: a/') From 404fb002355427b3fb0e3a17e6db86d27688a309 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 8 Aug 2013 21:12:42 +0200 Subject: [PATCH 2/5] Remove pylint remnants --- docs/devtools.rst | 4 ++-- mopidy/__init__.py | 2 -- mopidy/audio/mixers/auto.py | 2 -- mopidy/backends/spotify/session_manager.py | 6 ------ mopidy/core/playback.py | 6 ------ mopidy/frontends/mpd/protocol/__init__.py | 2 -- mopidy/utils/path.py | 2 -- mopidy/utils/versioning.py | 2 -- pylintrc | 21 --------------------- requirements/tests.txt | 1 - 10 files changed, 2 insertions(+), 46 deletions(-) delete mode 100644 pylintrc diff --git a/docs/devtools.rst b/docs/devtools.rst index bc066cd0..6b8e6e30 100644 --- a/docs/devtools.rst +++ b/docs/devtools.rst @@ -22,8 +22,8 @@ tested by Jenkins before it is merged into the ``develop`` branch, which is a bit late, but good enough to get broad testing before new code is released. In addition to running tests, the Jenkins CI server also gathers coverage -statistics and uses pylint to check for errors and possible improvements in our -code. So, if you're out of work, the code coverage and pylint data at the CI +statistics and uses flake8 to check for errors and possible improvements in our +code. So, if you're out of work, the code coverage and flake8 data at the CI server should give you a place to start. diff --git a/mopidy/__init__.py b/mopidy/__init__.py index 17cab15b..6a7699e5 100644 --- a/mopidy/__init__.py +++ b/mopidy/__init__.py @@ -1,8 +1,6 @@ from __future__ import unicode_literals -# pylint: disable = E0611,F0401 from distutils.version import StrictVersion as SV -# pylint: enable = E0611,F0401 import sys import warnings diff --git a/mopidy/audio/mixers/auto.py b/mopidy/audio/mixers/auto.py index 587994cb..6e240ebe 100644 --- a/mopidy/audio/mixers/auto.py +++ b/mopidy/audio/mixers/auto.py @@ -29,9 +29,7 @@ class AutoAudioMixer(gst.Bin): gst.Bin.__init__(self) mixer = self._find_mixer() if mixer: - # pylint: disable=E1101 self.add(mixer) - # pylint: enable=E1101 logger.debug('AutoAudioMixer chose: %s', mixer.get_name()) else: logger.debug('AutoAudioMixer did not find any usable mixers') diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 125b6ada..3ab4498b 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -18,9 +18,6 @@ logger = logging.getLogger('mopidy.backends.spotify') BITRATES = {96: 2, 160: 0, 320: 1} -# pylint: disable = R0901 -# SpotifySessionManager: Too many ancestors (9/7) - class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): cache_location = None @@ -116,9 +113,6 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): def music_delivery(self, session, frames, frame_size, num_frames, sample_type, sample_rate, channels): """Callback used by pyspotify""" - # pylint: disable = R0913 - # Too many arguments (8/5) - if not self.push_audio_data: return 0 diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 2f296751..ea849dbf 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -13,9 +13,6 @@ logger = logging.getLogger('mopidy.core') class PlaybackController(object): - # pylint: disable = R0902 - # Too many instance attributes - pykka_traversable = True def __init__(self, audio, backends, core): @@ -175,9 +172,6 @@ class PlaybackController(object): """ def get_tl_track_at_eot(self): - # pylint: disable = R0911 - # Too many return statements - tl_tracks = self.core.tracklist.tl_tracks if not tl_tracks: diff --git a/mopidy/frontends/mpd/protocol/__init__.py b/mopidy/frontends/mpd/protocol/__init__.py index 1827624b..0eadea7d 100644 --- a/mopidy/frontends/mpd/protocol/__init__.py +++ b/mopidy/frontends/mpd/protocol/__init__.py @@ -72,9 +72,7 @@ def load_protocol_modules(): The protocol modules must be imported to get them registered in :attr:`request_handlers` and :attr:`mpd_commands`. """ - # pylint: disable = W0612 from . import ( # noqa audio_output, channels, command_list, connection, current_playlist, empty, music_db, playback, reflection, status, stickers, stored_playlists) - # pylint: enable = W0612 diff --git a/mopidy/utils/path.py b/mopidy/utils/path.py index 602b2569..c5aa6e45 100644 --- a/mopidy/utils/path.py +++ b/mopidy/utils/path.py @@ -2,9 +2,7 @@ from __future__ import unicode_literals import logging import os -# pylint: disable = W0402 import string -# pylint: enable = W0402 import urllib import urlparse diff --git a/mopidy/utils/versioning.py b/mopidy/utils/versioning.py index 3ad72458..e8856473 100644 --- a/mopidy/utils/versioning.py +++ b/mopidy/utils/versioning.py @@ -14,11 +14,9 @@ def get_version(): def get_git_version(): process = Popen(['git', 'describe'], stdout=PIPE, stderr=PIPE) - # pylint: disable = E1101 if process.wait() != 0: raise EnvironmentError('Execution of "git describe" failed') version = process.stdout.read().strip() - # pylint: enable = E1101 if version.startswith('v'): version = version[1:] return version diff --git a/pylintrc b/pylintrc deleted file mode 100644 index 41e1ab5d..00000000 --- a/pylintrc +++ /dev/null @@ -1,21 +0,0 @@ -[MESSAGES CONTROL] -# -# Disabled messages -# ----------------- -# -# C0103 - Invalid name "%s" (should match %s) -# C0111 - Missing docstring -# R0201 - Method could be a function -# R0801 - Similar lines in %s files -# R0902 - Too many instance attributes (%s/%s) -# R0903 - Too few public methods (%s/%s) -# R0904 - Too many public methods (%s/%s) -# R0912 - Too many branches (%s/%s) -# R0913 - Too many arguments (%s/%s) -# R0921 - Abstract class not referenced -# W0141 - Used builtin function '%s' -# W0142 - Used * or ** magic -# W0511 - TODO, FIXME and XXX in the code -# W0613 - Unused argument %r -# -disable = C0103,C0111,R0201,R0801,R0902,R0903,R0904,R0912,R0913,R0921,W0141,W0142,W0511,W0613 diff --git a/requirements/tests.txt b/requirements/tests.txt index c093682b..8aacebbc 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -2,4 +2,3 @@ coverage flake8 mock >= 1.0 nose -pylint From f433a77ec569512e23d71827036652dd60065b15 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 9 Aug 2013 14:51:18 +0200 Subject: [PATCH 3/5] fab: Add lint/autolint tasks for running flake8 on everything --- fabfile.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fabfile.py b/fabfile.py index de2cf7bb..f23da2b1 100644 --- a/fabfile.py +++ b/fabfile.py @@ -35,6 +35,17 @@ def autocoverage(path=None): auto(coverage, path=path) +@task +def lint(path=None): + path = path or '.' + local('flake8 $(find %s -iname "*.py")' % path) + + +@task +def autolint(path=None): + auto(lint, path=path) + + def auto(task, *args, **kwargs): while True: local('clear') From 7570b242e0f3bc8bb2f1888fade67a95f0722c47 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 9 Aug 2013 14:53:32 +0200 Subject: [PATCH 4/5] travis: Run flake8 as part of build --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index df08679b..02ea9234 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,11 +5,14 @@ install: - "sudo wget -q -O /etc/apt/sources.list.d/mopidy.list http://apt.mopidy.com/mopidy.list" - "sudo apt-get update || true" - "sudo apt-get install $(apt-cache depends mopidy | awk '$2 !~ /mopidy/ {print $2}')" + - "pip install flake8" before_script: - "rm $VIRTUAL_ENV/lib/python$TRAVIS_PYTHON_VERSION/no-global-site-packages.txt" -script: nosetests +script: + - "flake8 $(find . -iname '*.py')" + - "nosetests" notifications: irc: From f0df024fd9f258b5c6d02e8664f302e79114977b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 9 Aug 2013 15:00:23 +0200 Subject: [PATCH 5/5] travis: Remove -q flags, since Travis collapses install command output --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 02ea9234..0b68eb8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: python install: - - "wget -q -O - http://apt.mopidy.com/mopidy.gpg | sudo apt-key add -" - - "sudo wget -q -O /etc/apt/sources.list.d/mopidy.list http://apt.mopidy.com/mopidy.list" + - "wget -O - http://apt.mopidy.com/mopidy.gpg | sudo apt-key add -" + - "sudo wget -O /etc/apt/sources.list.d/mopidy.list http://apt.mopidy.com/mopidy.list" - "sudo apt-get update || true" - "sudo apt-get install $(apt-cache depends mopidy | awk '$2 !~ /mopidy/ {print $2}')" - "pip install flake8"