summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaru Newby <marun@redhat.com>2013-07-31 01:20:07 +0000
committerMaru Newby <marun@redhat.com>2013-07-31 02:52:30 +0000
commit845a46c7c49dde32007475dc5c87beb6d5701fcc (patch)
tree66e4e047833a4144177822bac1afe9129b3bf755
parent1273cbdd7c75d768901435e9228f1b745a7f681c (diff)
downloadpbr-845a46c7c49dde32007475dc5c87beb6d5701fcc.tar.gz
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
-rw-r--r--pbr/packaging.py11
-rw-r--r--pbr/tests/test_core.py38
-rw-r--r--pbr/tests/testpackage/pbr_testpackage/cmd.py7
-rw-r--r--pbr/tests/testpackage/setup.cfg1
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