diff --git a/Lib/packaging/dist.py b/Lib/packaging/dist.py --- a/Lib/packaging/dist.py +++ b/Lib/packaging/dist.py @@ -662,9 +662,6 @@ Common commands: (see '--help-commands' else: command_name = command.get_command_name() - if not command.finalized: - return command - command.initialize_options() self.have_run[command_name] = 0 command.finalized = False diff --git a/Lib/packaging/tests/test_dist.py b/Lib/packaging/tests/test_dist.py --- a/Lib/packaging/tests/test_dist.py +++ b/Lib/packaging/tests/test_dist.py @@ -2,6 +2,7 @@ import os import sys import textwrap +import sysconfig import packaging.dist @@ -43,6 +44,8 @@ class DistributionTestCase(support.Tempd def setUp(self): super(DistributionTestCase, self).setUp() + self.install_data_default = sysconfig.get_path('data') + self.install_scripts_default = sysconfig.get_path('scripts') # XXX this is ugly, we should fix the functions to accept args # (defaulting to sys.argv) self.argv = sys.argv, sys.argv[:] @@ -257,6 +260,129 @@ class DistributionTestCase(support.Tempd self.assertRaises(PackagingOptionError, d.run_command, 'test_dist') + def prepare_dist(self, init_install=True): + # scaffolding for test_reinitialize_command + dist = Distribution({'scripts': ['script'], + 'data_files': ('', 'data')}) + if init_install: + cmd = dist.get_command_obj('install_dist') + # let's imagine these were set on the command line + cmd.install_data = 'custom-0' + cmd.install_scripts = 'custom-1' + cmd.ensure_finalized() + return dist + + def test_reinitialize_command(self): + install_data_default = self.install_data_default + install_scripts_default = self.install_scripts_default + # the tests that follow exercise these conditions: + # - a command that is initialized can be reinitialized + # - a command that was not initialized can be reinitialized + # - subcommands are not reinitialized if reinit_subcommands is False + # - subcommands are reinitialized if reinit_subcommands is True + + print = lambda *args: None + # test 1: command that was already created and initialized + print() + print(' TEST 1') + dist = self.prepare_dist() + cmd = dist.reinitialize_command('install_dist') + cmd.ensure_finalized() + # we don't want the values from the previous command line (set in + # prepare_dist) but the default values + self.assertEqual(cmd.install_data, install_data_default) + self.assertEqual(cmd.install_scripts, install_scripts_default) + + # test 2: same + check that subcommands are not changed with + # reinit_subcommands=False + print(' TEST 2') + dist = self.prepare_dist() + data_cmd = dist.get_command_obj('install_data') + scripts_cmd = dist.get_command_obj('install_scripts') + scripts_cmd.install_dir = 'custom-2' + cmd = dist.reinitialize_command('install_dist') + cmd.install_data = 'from-code-0' + cmd.ensure_finalized() + self.assertEqual(cmd.install_data, 'from-code-0') + self.assertEqual(cmd.install_scripts, install_scripts_default) + data_cmd.ensure_finalized() + scripts_cmd.ensure_finalized() + # this value is taken from install_dist because it was not set + # before install_dist was reinitialized + self.assertEqual(data_cmd.install_dir, 'from-code-0') + # this value is the same one as before the reinitialization + self.assertEqual(scripts_cmd.install_dir, 'custom-2') + + # test 3: command that was never initialized + print(' TEST 3') + dist = self.prepare_dist(init_install=False) + cmd = dist.reinitialize_command('install_dist') + cmd.ensure_finalized() + self.assertEqual(cmd.install_data, install_data_default) + self.assertEqual(cmd.install_scripts, install_scripts_default) + + # test 4: same + check subcommands are left alone + print(' TEST 4') + dist = self.prepare_dist(init_install=False) + data_cmd = dist.get_command_obj('install_data') + data_cmd.install_dir = 'from-code-1' + # do not call data_cmd.ensure_finalized, that would instantiate (and + # thus initialize) install_dist, defeating the purpose of this test + cmd = dist.reinitialize_command('install_dist') + cmd.install_data = 'from-code-2' + cmd.ensure_finalized() + self.assertEqual(cmd.install_data, 'from-code-2') + self.assertEqual(cmd.install_scripts, install_scripts_default) + # the value set above was not replaced + self.assertEqual(data_cmd.install_dir, 'from-code-1') + + # test 5: already initialized command + check that subcommands are + # changed with reinit_sucommands=True + print(' TEST 5') + dist = self.prepare_dist() + # more preparation + cmd = dist.get_command_obj('install_dist') + cmd.install_data = 'from-code-3' + cmd.ensure_finalized() + data_cmd = dist.get_command_obj('install_data') + data_cmd.install_dir = 'custom-3' + data_cmd.ensure_finalized() + scripts_cmd = dist.get_command_obj('install_scripts') + scripts_cmd.ensure_finalized() + self.assertEqual(data_cmd.install_dir, 'custom-3') + self.assertEqual(scripts_cmd.install_dir, 'custom-1') + # now reinitialize and check + cmd = dist.reinitialize_command(cmd, reinit_subcommands=True) + cmd.install_scripts = 'from-code-4' + self.assertEqual( + [cmd.finalized, data_cmd.finalized, scripts_cmd.finalized], + [False, False, False]) + cmd.finalized = False + cmd.ensure_finalized() + self.assertIsNone(data_cmd.install_dir) + self.assertIsNone(scripts_cmd.install_dir) + data_cmd.finalized = False + data_cmd.ensure_finalized() + scripts_cmd.finalized = False + scripts_cmd.ensure_finalized() + self.assertEqual(data_cmd.install_dir, install_data_default) + self.assertEqual(scripts_cmd.install_dir, 'from-code-4') + + # test 6: never initialized command + same + print(' TEST 6') + dist = self.prepare_dist(init_install=False) + data_cmd = dist.get_command_obj('install_data') + data_cmd.install_dir = 'from-code-5' + # do not call data_cmd.ensure_finalized, that would instantiate (and + # thus initialize) install_dist, defeating the purpose of this test + self.assertEqual(data_cmd.install_dir, 'from-code-5') + cmd = dist.reinitialize_command('install_dist', + reinit_subcommands=True) + self.assertIsNone(data_cmd.install_dir) + cmd.ensure_finalized() + data_cmd.ensure_finalized() + self.assertEqual(data_cmd.install_dir, install_data_default) + def test_suite(): return unittest.makeSuite(DistributionTestCase)