From 5123a41258e82dcbddf7cf4f7fa44ad5ae886499 Mon Sep 17 00:00:00 2001 From: Malte Ried Date: Mon, 29 Dec 2014 12:54:16 +0100 Subject: [PATCH 1/4] Added a flag `--detailed` to get a more detailed output of the `--pretend` option. --- beets/config_default.yaml | 1 + beets/importer.py | 9 ++++- beets/ui/commands.py | 4 +++ docs/reference/cli.rst | 4 +++ test/test_importer.py | 76 ++++++++++++++++++++++++++++----------- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/beets/config_default.yaml b/beets/config_default.yaml index 78f16d051..ae0882542 100644 --- a/beets/config_default.yaml +++ b/beets/config_default.yaml @@ -22,6 +22,7 @@ import: flat: no group_albums: no pretend: false + detailed: false clutter: ["Thumbs.DB", ".DS_Store"] ignore: [".*", "*~", "System Volume Information"] diff --git a/beets/importer.py b/beets/importer.py index 0877b5508..632eda30c 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -1299,9 +1299,16 @@ def manipulate_files(session, task): def log_files(session, task): """A coroutine (pipeline stage) to log each file which will be imported """ + detailed = config['import']['detailed'].get() if isinstance(task, SingletonImportTask): - log.info(displayable_path(task.item['path'])) + if detailed: + log.info( + 'Singleton: {0}'.format(displayable_path(task.item['path']))) + else: + log.info(displayable_path(task.item['path'])) elif task.items: + if detailed: + log.info('Album {0}'.format(displayable_path(task.paths[0]))) for item in task.items: log.info(displayable_path(item['path'])) diff --git a/beets/ui/commands.py b/beets/ui/commands.py index 546fe87d9..8f369a213 100644 --- a/beets/ui/commands.py +++ b/beets/ui/commands.py @@ -947,6 +947,10 @@ import_cmd.parser.add_option( '--pretend', dest='pretend', action='store_true', help='just print the files to import' ) +import_cmd.parser.add_option( + '--detailed', dest='detailed', action='store_true', + help='use in conjunction with --pretend to get sophisticated output' +) import_cmd.func = import_func default_commands.append(import_cmd) diff --git a/docs/reference/cli.rst b/docs/reference/cli.rst index e569c073c..baee5423b 100644 --- a/docs/reference/cli.rst +++ b/docs/reference/cli.rst @@ -132,6 +132,10 @@ Optional command flags: option. If set, beets will just print a list of files that it would otherwise import. +* To get a more detailed output with the ``--pretend`` option, you can use the + ``--detailed`` flag. This way you can see which tracks beets think should + belong to an album. + .. _rarfile: https://pypi.python.org/pypi/rarfile/2.2 .. only:: html diff --git a/test/test_importer.py b/test/test_importer.py index 0ffa9aaf3..71059961d 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1542,7 +1542,8 @@ class ImportPretendTest(_common.TestCase, ImportHelper): def setUp(self): super(ImportPretendTest, self).setUp() self.setup_beets() - self._create_import_dir(1) + self.__create_import_dir() + self.__create_empty_import_dir() self._setup_import_session() config['import']['pretend'] = True self.matcher = AutotagStub().install() @@ -1552,35 +1553,31 @@ class ImportPretendTest(_common.TestCase, ImportHelper): self.teardown_beets() self.matcher.restore() - def test_import_pretend(self): + def __create_import_dir(self): + self._create_import_dir(1) resource_path = os.path.join(_common.RSRC, u'empty.mp3') single_path = os.path.join(self.import_dir, u'track_2.mp3') - shutil.copy(resource_path, single_path) - import_files = [ + self.import_paths = [ os.path.join(self.import_dir, u'the_album'), single_path ] - self._setup_import_session(singletons=True) - self.importer.paths = import_files + self.import_files = [ + displayable_path( + os.path.join(self.import_paths[0], u'track_1.mp3')), + displayable_path(single_path) + ] - with capture_log() as logs: - self.importer.run() - - self.assertEqual(len(self.lib.items()), 0) - self.assertEqual(len(self.lib.albums()), 0) - - self.assertEqual(len(logs), 3) - self.assertEqual(logs[1], os.path.join(import_files[0], - u'track_1.mp3')) - self.assertEqual(logs[2], import_files[1]) - - def test_import_pretend_empty(self): + def __create_empty_import_dir(self): path = os.path.join(self.temp_dir, 'empty') os.makedirs(path) + self.empty_path = path - self._setup_import_session(singletons=True) - self.importer.paths = [path] + def __run(self, import_paths, singletons=True, detailed=False): + config['import']['detailed'] = detailed + + self._setup_import_session(singletons=singletons) + self.importer.paths = import_paths with capture_log() as logs: self.importer.run() @@ -1588,9 +1585,46 @@ class ImportPretendTest(_common.TestCase, ImportHelper): self.assertEqual(len(self.lib.items()), 0) self.assertEqual(len(self.lib.albums()), 0) + return logs + + def test_import_pretend(self): + logs = self.__run(self.import_paths) + + self.assertEqual(len(logs), 3) + self.assertEqual(logs[1], self.import_files[0]) + self.assertEqual(logs[2], self.import_files[1]) + + def test_import_pretend_empty(self): + logs = self.__run([self.empty_path]) + self.assertEqual(len(logs), 2) self.assertEqual(logs[1], 'No files imported from {0}' - .format(displayable_path(path))) + .format(displayable_path(self.empty_path))) + + def test_import_singletons_pretend_detailed(self): + logs = self.__run(self.import_paths, detailed=True) + + self.assertEqual(len(logs), 3) + self.assertEqual(logs[1], 'Singleton: %s' % self.import_files[0]) + self.assertEqual(logs[2], 'Singleton: %s' % self.import_paths[1]) + + def test_import_album_pretend_detailed(self): + logs = self.__run(self.import_paths, singletons=False, detailed=True) + + self.assertEqual(len(logs), 5) + self.assertEqual(logs[1], + 'Album %s' % displayable_path(self.import_paths[0])) + self.assertEqual(logs[2], self.import_files[0]) + self.assertEqual(logs[3], + 'Album %s' % displayable_path(self.import_paths[1])) + self.assertEqual(logs[4], self.import_paths[1]) + + def test_import_pretend_empty_detailed(self): + logs = self.__run([self.empty_path], detailed=True) + + self.assertEqual(len(logs), 2) + self.assertEqual(logs[1], 'No files imported from {0}' + .format(displayable_path(self.empty_path))) def suite(): From 023c13d292ee3893d6846f4c00dacfc08e3361f3 Mon Sep 17 00:00:00 2001 From: Malte Ried Date: Mon, 29 Dec 2014 13:22:28 +0100 Subject: [PATCH 2/4] Updated the test code to ignore the "Sending event" log messages. --- test/test_importer.py | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/test/test_importer.py b/test/test_importer.py index 71059961d..5516d3100 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1582,6 +1582,8 @@ class ImportPretendTest(_common.TestCase, ImportHelper): with capture_log() as logs: self.importer.run() + logs = [line for line in logs if not line.startswith('Sending event:')] + self.assertEqual(len(self.lib.items()), 0) self.assertEqual(len(self.lib.albums()), 0) @@ -1590,41 +1592,35 @@ class ImportPretendTest(_common.TestCase, ImportHelper): def test_import_pretend(self): logs = self.__run(self.import_paths) - self.assertEqual(len(logs), 3) - self.assertEqual(logs[1], self.import_files[0]) - self.assertEqual(logs[2], self.import_files[1]) + self.assertEqual(logs, self.import_files) def test_import_pretend_empty(self): logs = self.__run([self.empty_path]) - self.assertEqual(len(logs), 2) - self.assertEqual(logs[1], 'No files imported from {0}' - .format(displayable_path(self.empty_path))) + self.assertEqual(logs, ['No files imported from {0}' + .format(displayable_path(self.empty_path))]) def test_import_singletons_pretend_detailed(self): logs = self.__run(self.import_paths, detailed=True) - self.assertEqual(len(logs), 3) - self.assertEqual(logs[1], 'Singleton: %s' % self.import_files[0]) - self.assertEqual(logs[2], 'Singleton: %s' % self.import_paths[1]) + self.assertEqual(logs, [ + 'Singleton: %s' % self.import_files[0], + 'Singleton: %s' % self.import_paths[1]]) def test_import_album_pretend_detailed(self): logs = self.__run(self.import_paths, singletons=False, detailed=True) - self.assertEqual(len(logs), 5) - self.assertEqual(logs[1], - 'Album %s' % displayable_path(self.import_paths[0])) - self.assertEqual(logs[2], self.import_files[0]) - self.assertEqual(logs[3], - 'Album %s' % displayable_path(self.import_paths[1])) - self.assertEqual(logs[4], self.import_paths[1]) + self.assertEqual(logs, [ + 'Album %s' % displayable_path(self.import_paths[0]), + self.import_files[0], + 'Album %s' % displayable_path(self.import_paths[1]), + self.import_paths[1]]) def test_import_pretend_empty_detailed(self): logs = self.__run([self.empty_path], detailed=True) - self.assertEqual(len(logs), 2) - self.assertEqual(logs[1], 'No files imported from {0}' - .format(displayable_path(self.empty_path))) + self.assertEqual(logs, ['No files imported from {0}' + .format(displayable_path(self.empty_path))]) def suite(): From cc82e1cb43d54ecfa224673f3f342cfef69c836f Mon Sep 17 00:00:00 2001 From: Malte Ried Date: Wed, 31 Dec 2014 11:30:46 +0100 Subject: [PATCH 3/4] Made the detailed output the default behaviour. --- beets/config_default.yaml | 1 - beets/importer.py | 11 +++-------- beets/ui/commands.py | 4 ---- docs/reference/cli.rst | 4 ---- test/test_importer.py | 25 ++++++------------------- 5 files changed, 9 insertions(+), 36 deletions(-) diff --git a/beets/config_default.yaml b/beets/config_default.yaml index ae0882542..78f16d051 100644 --- a/beets/config_default.yaml +++ b/beets/config_default.yaml @@ -22,7 +22,6 @@ import: flat: no group_albums: no pretend: false - detailed: false clutter: ["Thumbs.DB", ".DS_Store"] ignore: [".*", "*~", "System Volume Information"] diff --git a/beets/importer.py b/beets/importer.py index 632eda30c..6bf0e91a9 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -1299,16 +1299,11 @@ def manipulate_files(session, task): def log_files(session, task): """A coroutine (pipeline stage) to log each file which will be imported """ - detailed = config['import']['detailed'].get() if isinstance(task, SingletonImportTask): - if detailed: - log.info( - 'Singleton: {0}'.format(displayable_path(task.item['path']))) - else: - log.info(displayable_path(task.item['path'])) + log.info( + 'Singleton: {0}'.format(displayable_path(task.item['path']))) elif task.items: - if detailed: - log.info('Album {0}'.format(displayable_path(task.paths[0]))) + log.info('Album {0}'.format(displayable_path(task.paths[0]))) for item in task.items: log.info(displayable_path(item['path'])) diff --git a/beets/ui/commands.py b/beets/ui/commands.py index 8f369a213..546fe87d9 100644 --- a/beets/ui/commands.py +++ b/beets/ui/commands.py @@ -947,10 +947,6 @@ import_cmd.parser.add_option( '--pretend', dest='pretend', action='store_true', help='just print the files to import' ) -import_cmd.parser.add_option( - '--detailed', dest='detailed', action='store_true', - help='use in conjunction with --pretend to get sophisticated output' -) import_cmd.func = import_func default_commands.append(import_cmd) diff --git a/docs/reference/cli.rst b/docs/reference/cli.rst index baee5423b..e569c073c 100644 --- a/docs/reference/cli.rst +++ b/docs/reference/cli.rst @@ -132,10 +132,6 @@ Optional command flags: option. If set, beets will just print a list of files that it would otherwise import. -* To get a more detailed output with the ``--pretend`` option, you can use the - ``--detailed`` flag. This way you can see which tracks beets think should - belong to an album. - .. _rarfile: https://pypi.python.org/pypi/rarfile/2.2 .. only:: html diff --git a/test/test_importer.py b/test/test_importer.py index 5516d3100..3b55bf8c5 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1573,9 +1573,7 @@ class ImportPretendTest(_common.TestCase, ImportHelper): os.makedirs(path) self.empty_path = path - def __run(self, import_paths, singletons=True, detailed=False): - config['import']['detailed'] = detailed - + def __run(self, import_paths, singletons=True): self._setup_import_session(singletons=singletons) self.importer.paths = import_paths @@ -1589,26 +1587,15 @@ class ImportPretendTest(_common.TestCase, ImportHelper): return logs - def test_import_pretend(self): + def test_import_singletons_pretend(self): logs = self.__run(self.import_paths) - self.assertEqual(logs, self.import_files) - - def test_import_pretend_empty(self): - logs = self.__run([self.empty_path]) - - self.assertEqual(logs, ['No files imported from {0}' - .format(displayable_path(self.empty_path))]) - - def test_import_singletons_pretend_detailed(self): - logs = self.__run(self.import_paths, detailed=True) - self.assertEqual(logs, [ 'Singleton: %s' % self.import_files[0], 'Singleton: %s' % self.import_paths[1]]) - def test_import_album_pretend_detailed(self): - logs = self.__run(self.import_paths, singletons=False, detailed=True) + def test_import_album_pretend(self): + logs = self.__run(self.import_paths, singletons=False) self.assertEqual(logs, [ 'Album %s' % displayable_path(self.import_paths[0]), @@ -1616,8 +1603,8 @@ class ImportPretendTest(_common.TestCase, ImportHelper): 'Album %s' % displayable_path(self.import_paths[1]), self.import_paths[1]]) - def test_import_pretend_empty_detailed(self): - logs = self.__run([self.empty_path], detailed=True) + def test_import_pretend_empty(self): + logs = self.__run([self.empty_path]) self.assertEqual(logs, ['No files imported from {0}' .format(displayable_path(self.empty_path))]) From bee0a5b9fe1d9c47e837ed408b5401bd9b9b945f Mon Sep 17 00:00:00 2001 From: Malte Ried Date: Wed, 31 Dec 2014 11:38:03 +0100 Subject: [PATCH 4/4] Album tracks are prepended by two spaces to indent them a bit. --- beets/importer.py | 2 +- test/test_importer.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/beets/importer.py b/beets/importer.py index 6bf0e91a9..4a7bd997f 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -1305,7 +1305,7 @@ def log_files(session, task): elif task.items: log.info('Album {0}'.format(displayable_path(task.paths[0]))) for item in task.items: - log.info(displayable_path(item['path'])) + log.info(' {0}'.format(displayable_path(item['path']))) def group_albums(session): diff --git a/test/test_importer.py b/test/test_importer.py index 3b55bf8c5..89a65b74f 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1599,9 +1599,9 @@ class ImportPretendTest(_common.TestCase, ImportHelper): self.assertEqual(logs, [ 'Album %s' % displayable_path(self.import_paths[0]), - self.import_files[0], + ' %s' % self.import_files[0], 'Album %s' % displayable_path(self.import_paths[1]), - self.import_paths[1]]) + ' %s' % self.import_paths[1]]) def test_import_pretend_empty(self): logs = self.__run([self.empty_path])