From 845a46c7c49dde32007475dc5c87beb6d5701fcc Mon Sep 17 00:00:00 2001 From: Maru Newby Date: Wed, 31 Jul 2013 01:20:07 +0000 Subject: Add support for classmethod console scripts * Previously console_scripts could only reference functions: script_name = package.name:function_name This change adds support for classmethods: script_name = package.name:ClassName.classmethod_name This change is necessary to support a Neutron use-case. * Fixes bug 1206734 Change-Id: I9509d3f2cea29fee5696936dbbb1d507764f1e81 --- pbr/packaging.py | 11 +++++--- pbr/tests/test_core.py | 38 +++++++++++++--------------- pbr/tests/testpackage/pbr_testpackage/cmd.py | 7 +++++ pbr/tests/testpackage/setup.cfg | 1 + 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/pbr/packaging.py b/pbr/packaging.py index 8afbde7..1c6d452 100644 --- a/pbr/packaging.py +++ b/pbr/packaging.py @@ -436,11 +436,11 @@ _script_text = """# PBR Generated from %(group)r import sys -from %(module_name)s import %(func)s +from %(module_name)s import %(import_target)s if __name__ == "__main__": - sys.exit(%(func)s()) + sys.exit(%(invoke_target)s()) """ @@ -450,10 +450,15 @@ def override_get_script_args( header = easy_install.get_script_header("", executable, is_wininst) for group in 'console_scripts', 'gui_scripts': for name, ep in dist.get_entry_map(group).items(): + if not ep.attrs or len(ep.attrs) > 2: + raise ValueError("Script targets must be of the form " + "'func' or 'Class.class_method'.") script_text = _script_text % dict( group=group, module_name=ep.module_name, - func=ep.attrs[0]) + import_target=ep.attrs[0], + invoke_target='.'.join(ep.attrs), + ) yield (name, header+script_text) diff --git a/pbr/tests/test_core.py b/pbr/tests/test_core.py index f8e5989..a7376eb 100644 --- a/pbr/tests/test_core.py +++ b/pbr/tests/test_core.py @@ -49,6 +49,22 @@ from pbr import tests class TestCore(tests.BaseTestCase): + cmd_names = ('pbr_test_cmd', 'pbr_test_cmd_with_class') + + def check_script_install(self, install_stdout): + for cmd_name in self.cmd_names: + install_txt = 'Installing %s script to %s' % (cmd_name, + self.temp_dir) + self.assertIn(install_txt, install_stdout) + + cmd_filename = os.path.join(self.temp_dir, cmd_name) + + script_txt = open(cmd_filename, 'r').read() + self.assertNotIn('pkg_resources', script_txt) + + stdout, _, return_code = self._run_cmd(cmd_filename) + self.assertIn("PBR", stdout) + def test_setup_py_keywords(self): """setup.py --keywords. @@ -85,19 +101,10 @@ class TestCore(tests.BaseTestCase): stdout, _, return_code = self.run_setup( 'install_scripts', '--install-dir=%s' % self.temp_dir) - self.assertIn( - 'Installing pbr_test_cmd script to %s' % self.temp_dir, - stdout) - self.assertNotIn( - 'pkg_resources', - open(os.path.join(self.temp_dir, 'pbr_test_cmd'), 'r').read()) - self.useFixture( fixtures.EnvironmentVariable('PYTHONPATH', '.')) - stdout, _, return_code = self._run_cmd( - os.path.join(self.temp_dir, 'pbr_test_cmd')) - self.assertIn("PBR", stdout) + self.check_script_install(stdout) def test_console_script_develop(self): """Test that we develop a non-pkg-resources console script.""" @@ -112,13 +119,4 @@ class TestCore(tests.BaseTestCase): stdout, _, return_code = self.run_setup( 'develop', '--install-dir=%s' % self.temp_dir) - self.assertIn( - 'Installing pbr_test_cmd script to %s' % self.temp_dir, - stdout) - self.assertNotIn( - 'pkg_resources', - open(os.path.join(self.temp_dir, 'pbr_test_cmd'), 'r').read()) - - stdout, _, return_code = self._run_cmd( - os.path.join(self.temp_dir, 'pbr_test_cmd')) - self.assertIn("PBR", stdout) + self.check_script_install(stdout) diff --git a/pbr/tests/testpackage/pbr_testpackage/cmd.py b/pbr/tests/testpackage/pbr_testpackage/cmd.py index 1b03915..4cc4522 100644 --- a/pbr/tests/testpackage/pbr_testpackage/cmd.py +++ b/pbr/tests/testpackage/pbr_testpackage/cmd.py @@ -17,3 +17,10 @@ from __future__ import print_function def main(): print("PBR Test Command") + + +class Foo(object): + + @classmethod + def bar(self): + print("PBR Test Command - with class!") diff --git a/pbr/tests/testpackage/setup.cfg b/pbr/tests/testpackage/setup.cfg index 9bcc0ee..a410e3c 100644 --- a/pbr/tests/testpackage/setup.cfg +++ b/pbr/tests/testpackage/setup.cfg @@ -34,6 +34,7 @@ extra-files = extra-file.txt [entry_points] console_scripts = pbr_test_cmd = pbr_testpackage.cmd:main + pbr_test_cmd_with_class = pbr_testpackage.cmd:Foo.bar [extension=pbr_testpackage.testext] sources = src/testext.c -- cgit v1.2.1