diff --git a/beets/autotag/hooks.py b/beets/autotag/hooks.py index 363bcaab4..9e44901d8 100644 --- a/beets/autotag/hooks.py +++ b/beets/autotag/hooks.py @@ -371,7 +371,7 @@ class Distance: self.tracks: Dict[TrackInfo, Distance] = {} @cached_classproperty - def _weights(cls) -> Dict[str, float]: # noqa: N805 + def _weights(cls) -> Dict[str, float]: """A dictionary from keys to floating-point weights.""" weights_view = config["match"]["distance_weights"] weights = {} diff --git a/beets/dbcore/__init__.py b/beets/dbcore/__init__.py index 06d0b3dc9..fa20eb00d 100644 --- a/beets/dbcore/__init__.py +++ b/beets/dbcore/__init__.py @@ -32,4 +32,18 @@ from .queryparse import ( ) from .types import Type -# flake8: noqa +__all__ = [ + "AndQuery", + "Database", + "FieldQuery", + "InvalidQueryError", + "MatchQuery", + "Model", + "OrQuery", + "Query", + "Results", + "Type", + "parse_sorted_query", + "query_from_strings", + "sort_from_strings", +] diff --git a/beets/logging.py b/beets/logging.py index 34fc7bafa..fd8b1962f 100644 --- a/beets/logging.py +++ b/beets/logging.py @@ -20,9 +20,34 @@ use {}-style formatting and can interpolate keywords arguments to the logging calls (`debug`, `info`, etc). """ -import logging import threading from copy import copy +from logging import ( + DEBUG, + INFO, + NOTSET, + WARNING, + FileHandler, + Filter, + Handler, + Logger, + NullHandler, + StreamHandler, +) + +__all__ = [ + "DEBUG", + "INFO", + "NOTSET", + "WARNING", + "FileHandler", + "Filter", + "Handler", + "Logger", + "NullHandler", + "StreamHandler", + "getLogger", +] def logsafe(val): @@ -45,7 +70,7 @@ def logsafe(val): return val -class StrFormatLogger(logging.Logger): +class StrFormatLogger(Logger): """A version of `Logger` that uses `str.format`-style formatting instead of %-style formatting and supports keyword arguments. @@ -95,12 +120,12 @@ class StrFormatLogger(logging.Logger): ) -class ThreadLocalLevelLogger(logging.Logger): +class ThreadLocalLevelLogger(Logger): """A version of `Logger` whose level is thread-local instead of shared.""" - def __init__(self, name, level=logging.NOTSET): + def __init__(self, name, level=NOTSET): self._thread_level = threading.local() - self.default_level = logging.NOTSET + self.default_level = NOTSET super().__init__(name, level) @property @@ -127,17 +152,13 @@ class BeetsLogger(ThreadLocalLevelLogger, StrFormatLogger): pass -my_manager = copy(logging.Logger.manager) +my_manager = copy(Logger.manager) my_manager.loggerClass = BeetsLogger -# Act like the stdlib logging module by re-exporting its namespace. -from logging import * # noqa - - # Override the `getLogger` to use our machinery. def getLogger(name=None): # noqa if name: return my_manager.getLogger(name) else: - return logging.Logger.root + return Logger.root diff --git a/beets/test/_common.py b/beets/test/_common.py index b1cc26936..b6e7c5dcc 100644 --- a/beets/test/_common.py +++ b/beets/test/_common.py @@ -143,19 +143,19 @@ def import_session(lib=None, loghandler=None, paths=[], query=[], cli=False): class Assertions: """A mixin with additional unit test assertions.""" - def assertExists(self, path): # noqa + def assertExists(self, path): assert os.path.exists(syspath(path)), f"file does not exist: {path!r}" - def assertNotExists(self, path): # noqa + def assertNotExists(self, path): assert not os.path.exists(syspath(path)), f"file exists: {path!r}" - def assertIsFile(self, path): # noqa + def assertIsFile(self, path): self.assertExists(path) assert os.path.isfile( syspath(path) ), "path exists, but is not a regular file: {!r}".format(path) - def assertIsDir(self, path): # noqa + def assertIsDir(self, path): self.assertExists(path) assert os.path.isdir( syspath(path) diff --git a/beets/util/__init__.py b/beets/util/__init__.py index 759026f3a..e45f92fb7 100644 --- a/beets/util/__init__.py +++ b/beets/util/__init__.py @@ -1069,7 +1069,7 @@ def par_map(transform: Callable[[T], Any], items: Sequence[T]) -> None: pool.join() -class cached_classproperty: # noqa: N801 +class cached_classproperty: """A decorator implementing a read-only property that is *lazy* in the sense that the getter is only invoked once. Subsequent accesses through *any* instance use the cached result. diff --git a/beetsplug/bpd/__init__.py b/beetsplug/bpd/__init__.py index cc56a27c5..bd5ef1633 100644 --- a/beetsplug/bpd/__init__.py +++ b/beetsplug/bpd/__init__.py @@ -738,13 +738,13 @@ class BaseServer: # Additions to the MPD protocol. - def cmd_crash_TypeError(self, conn): # noqa: N802 + def cmd_crash(self, conn): """Deliberately trigger a TypeError for testing purposes. We want to test that the server properly responds with ERROR_SYSTEM without crashing, and that this is not treated as ERROR_ARG (since it is caused by a programming error, not a protocol error). """ - "a" + 2 + raise TypeError class Connection: diff --git a/pyproject.toml b/pyproject.toml index 70902f009..ff28faebc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -260,3 +260,4 @@ ignore-variadic-names = true [tool.ruff.lint.pep8-naming] classmethod-decorators = ["cached_classproperty"] +extend-ignore-names = ["assert*", "cached_classproperty"] diff --git a/test/plugins/test_art.py b/test/plugins/test_art.py index bd602c434..acb712354 100644 --- a/test/plugins/test_art.py +++ b/test/plugins/test_art.py @@ -865,7 +865,7 @@ class ArtForAlbumTest(UseThePlugin): fetchart.FileSystem.get = self.old_fs_source_get super().tearDown() - def _assertImageIsValidArt(self, image_file, should_exist): # noqa + def assertImageIsValidArt(self, image_file, should_exist): self.assertExists(image_file) self.image_file = image_file @@ -896,42 +896,42 @@ class ArtForAlbumTest(UseThePlugin): def test_respect_minwidth(self): self._require_backend() self.plugin.minwidth = 300 - self._assertImageIsValidArt(self.IMG_225x225, False) - self._assertImageIsValidArt(self.IMG_348x348, True) + self.assertImageIsValidArt(self.IMG_225x225, False) + self.assertImageIsValidArt(self.IMG_348x348, True) def test_respect_enforce_ratio_yes(self): self._require_backend() self.plugin.enforce_ratio = True - self._assertImageIsValidArt(self.IMG_500x490, False) - self._assertImageIsValidArt(self.IMG_225x225, True) + self.assertImageIsValidArt(self.IMG_500x490, False) + self.assertImageIsValidArt(self.IMG_225x225, True) def test_respect_enforce_ratio_no(self): self.plugin.enforce_ratio = False - self._assertImageIsValidArt(self.IMG_500x490, True) + self.assertImageIsValidArt(self.IMG_500x490, True) def test_respect_enforce_ratio_px_above(self): self._require_backend() self.plugin.enforce_ratio = True self.plugin.margin_px = 5 - self._assertImageIsValidArt(self.IMG_500x490, False) + self.assertImageIsValidArt(self.IMG_500x490, False) def test_respect_enforce_ratio_px_below(self): self._require_backend() self.plugin.enforce_ratio = True self.plugin.margin_px = 15 - self._assertImageIsValidArt(self.IMG_500x490, True) + self.assertImageIsValidArt(self.IMG_500x490, True) def test_respect_enforce_ratio_percent_above(self): self._require_backend() self.plugin.enforce_ratio = True self.plugin.margin_percent = (500 - 490) / 500 * 0.5 - self._assertImageIsValidArt(self.IMG_500x490, False) + self.assertImageIsValidArt(self.IMG_500x490, False) def test_respect_enforce_ratio_percent_below(self): self._require_backend() self.plugin.enforce_ratio = True self.plugin.margin_percent = (500 - 490) / 500 * 1.5 - self._assertImageIsValidArt(self.IMG_500x490, True) + self.assertImageIsValidArt(self.IMG_500x490, True) def test_resize_if_necessary(self): self._require_backend() @@ -948,7 +948,7 @@ class ArtForAlbumTest(UseThePlugin): self._require_backend() self.plugin.max_filesize = self.IMG_225x225_SIZE self._assert_image_operated(self.IMG_225x225, self.RESIZE_OP, False) - self._assertImageIsValidArt(self.IMG_225x225, True) + self.assertImageIsValidArt(self.IMG_225x225, True) def test_fileresize_no_scale(self): self._require_backend() diff --git a/test/plugins/test_convert.py b/test/plugins/test_convert.py index 67f6fcd04..725318eac 100644 --- a/test/plugins/test_convert.py +++ b/test/plugins/test_convert.py @@ -55,7 +55,7 @@ class ConvertMixin: shell_quote(sys.executable), shell_quote(stub), tag ) - def assertFileTag(self, path, tag): # noqa + def assertFileTag(self, path, tag): """Assert that the path is a file and the files content ends with `tag`. """ @@ -68,7 +68,7 @@ class ConvertMixin: f.read() == tag ), f"{displayable_path(path)} is not tagged with {display_tag}" - def assertNoFileTag(self, path, tag): # noqa + def assertNoFileTag(self, path, tag): """Assert that the path is a file and the files content does not end with `tag`. """ diff --git a/test/plugins/test_edit.py b/test/plugins/test_edit.py index beeb649a3..2d557d623 100644 --- a/test/plugins/test_edit.py +++ b/test/plugins/test_edit.py @@ -77,7 +77,7 @@ class EditMixin(PluginMixin): plugin = "edit" - def assertItemFieldsModified( # noqa + def assertItemFieldsModified( self, library_items, items, fields=[], allowed=["path"] ): """Assert that items in the library (`lib_items`) have different values @@ -134,7 +134,7 @@ class EditCommandTest(EditMixin, BeetsTestCase): {f: item[f] for f in item._fields} for item in self.album.items() ] - def assertCounts( # noqa + def assertCounts( self, mock_write, album_count=ALBUM_COUNT, diff --git a/test/plugins/test_importadded.py b/test/plugins/test_importadded.py index 6af4b0a63..d48ec6c46 100644 --- a/test/plugins/test_importadded.py +++ b/test/plugins/test_importadded.py @@ -74,11 +74,11 @@ class ImportAddedTest(PluginMixin, ImportTestCase): "No MediaFile found for Item " + displayable_path(item.path) ) - def assertEqualTimes(self, first, second, msg=None): # noqa + def assertEqualTimes(self, first, second, msg=None): """For comparing file modification times at a sufficient precision""" assert first == pytest.approx(second, rel=1e-4), msg - def assertAlbumImport(self): # noqa + def assertAlbumImport(self): self.importer.run() album = self.lib.albums().get() assert album.added == self.min_mtime diff --git a/test/plugins/test_permissions.py b/test/plugins/test_permissions.py index 7979cfa12..274cd92ac 100644 --- a/test/plugins/test_permissions.py +++ b/test/plugins/test_permissions.py @@ -62,7 +62,7 @@ class PermissionsPluginTest(AsIsImporterMixin, PluginMixin, ImportTestCase): for path in dirs_in_library(self.lib.directory, item.path): self.assertPerms(path, "dir", expect_success) - def assertPerms(self, path, typ, expect_success): # noqa + def assertPerms(self, path, typ, expect_success): for x in [ (True, self.exp_perms[expect_success][typ], "!="), (False, self.exp_perms[not expect_success][typ], "=="), diff --git a/test/plugins/test_player.py b/test/plugins/test_player.py index bf466e1b5..b17a78c17 100644 --- a/test/plugins/test_player.py +++ b/test/plugins/test_player.py @@ -41,7 +41,7 @@ gstplayer = importlib.util.module_from_spec( ) -def _gstplayer_play(*_): # noqa: 42 +def _gstplayer_play(*_): bpd.gstplayer._GstPlayer.playing = True return mock.DEFAULT @@ -242,7 +242,7 @@ class MPCClient: return line -def implements(commands, expectedFailure=False): # noqa: N803 +def implements(commands, fail=False): def _test(self): with self.run_bpd() as client: response = client.send_command("commands") @@ -250,7 +250,7 @@ def implements(commands, expectedFailure=False): # noqa: N803 implemented = response.data["command"] assert commands.intersection(implemented) == commands - return unittest.expectedFailure(_test) if expectedFailure else _test + return unittest.expectedFailure(_test) if fail else _test bluelet_listener = bluelet.Listener @@ -437,7 +437,7 @@ class BPDTest(BPDTestHelper): def test_system_error(self): with self.run_bpd() as client: - response = client.send_command("crash_TypeError") + response = client.send_command("crash") self._assert_failed(response, bpd.ERROR_SYSTEM) def test_empty_request(self): @@ -763,7 +763,7 @@ class BPDControlTest(BPDTestHelper): "seekid", "seekcur", }, - expectedFailure=True, + fail=True, ) def test_cmd_play(self): @@ -873,7 +873,7 @@ class BPDQueueTest(BPDTestHelper): "addtagid", "cleartagid", }, - expectedFailure=True, + fail=True, ) METADATA = {"Pos", "Time", "Id", "file", "duration"} @@ -990,7 +990,7 @@ class BPDDatabaseTest(BPDTestHelper): "update", "rescan", }, - expectedFailure=True, + fail=True, ) def test_cmd_search(self): @@ -1050,7 +1050,7 @@ class BPDMountsTest(BPDTestHelper): "listmounts", "listneighbors", }, - expectedFailure=True, + fail=True, ) @@ -1059,7 +1059,7 @@ class BPDStickerTest(BPDTestHelper): { "sticker", }, - expectedFailure=True, + fail=True, ) @@ -1142,7 +1142,7 @@ class BPDPartitionTest(BPDTestHelper): "listpartitions", "newpartition", }, - expectedFailure=True, + fail=True, ) @@ -1154,7 +1154,7 @@ class BPDDeviceTest(BPDTestHelper): "toggleoutput", "outputs", }, - expectedFailure=True, + fail=True, ) @@ -1166,7 +1166,7 @@ class BPDReflectionTest(BPDTestHelper): "notcommands", "urlhandlers", }, - expectedFailure=True, + fail=True, ) def test_cmd_decoders(self): @@ -1187,5 +1187,5 @@ class BPDPeersTest(BPDTestHelper): "readmessages", "sendmessage", }, - expectedFailure=True, + fail=True, ) diff --git a/test/test_datequery.py b/test/test_datequery.py index e5c5f2bfd..9c968e998 100644 --- a/test/test_datequery.py +++ b/test/test_datequery.py @@ -133,16 +133,14 @@ class DateIntervalTest(unittest.TestCase): self.assertContains("..", date=datetime.min) self.assertContains("..", "1000-01-01T00:00:00") - def assertContains( # noqa - self, interval_pattern, date_pattern=None, date=None - ): + def assertContains(self, interval_pattern, date_pattern=None, date=None): if date is None: date = _date(date_pattern) (start, end) = _parse_periods(interval_pattern) interval = DateInterval.from_periods(start, end) assert interval.contains(date) - def assertExcludes(self, interval_pattern, date_pattern): # noqa + def assertExcludes(self, interval_pattern, date_pattern): date = _date(date_pattern) (start, end) = _parse_periods(interval_pattern) interval = DateInterval.from_periods(start, end) diff --git a/test/test_query.py b/test/test_query.py index 61237e10e..d17bce0e6 100644 --- a/test/test_query.py +++ b/test/test_query.py @@ -47,11 +47,11 @@ class AssertsMixin: def assert_albums_matched(self, results, albums): assert {a.album for a in results} == set(albums) - def assertInResult(self, item, results): # noqa + def assertInResult(self, item, results): result_ids = [i.id for i in results] assert item.id in result_ids - def assertNotInResult(self, item, results): # noqa + def assertNotInResult(self, item, results): result_ids = [i.id for i in results] assert item.id not in result_ids @@ -927,7 +927,7 @@ class NotQueryTest(DummyDataTestCase): - `test_get_yyy`: tests on query strings (similar to `GetTest`) """ - def assertNegationProperties(self, q): # noqa + def assertNegationProperties(self, q): """Given a Query `q`, assert that: - q OR not(q) == all items - q AND not(q) == 0