Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Allow pre- and post-install setuptools logic
fixes pybuilder#227, connected to pybuilder#227
  • Loading branch information
arcivanov committed Nov 4, 2015
1 parent 932acaf commit 2db92f4
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 6 deletions.
18 changes: 17 additions & 1 deletion src/integrationtest/python/should_write_setup_file_tests.py
Expand Up @@ -66,6 +66,21 @@ def spam ():
self.assert_file_content(setup_py, """#!/usr/bin/env python
from setuptools import setup
from setuptools.command.install import install as _install
class install(_install):
def pre_install_script(self):
pass
def post_install_script(self):
pass
def run(self):
self.pre_install_script()
_install.run(self)
self.post_install_script()
if __name__ == '__main__':
setup(
Expand All @@ -92,7 +107,8 @@ def spam ():
'spam'
],
dependency_links = ['https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz'],
zip_safe=True
zip_safe=True,
cmdclass={'install': install},
)
""")

Expand Down
Expand Up @@ -71,6 +71,21 @@ def spam ():
self.assert_file_content(setup_py, """#!/usr/bin/env python
from setuptools import setup
from setuptools.command.install import install as _install
class install(_install):
def pre_install_script(self):
pass
def post_install_script(self):
pass
def run(self):
self.pre_install_script()
_install.run(self)
self.post_install_script()
if __name__ == '__main__':
setup(
Expand Down Expand Up @@ -99,7 +114,8 @@ def spam ():
'foo==42'
],
dependency_links = ['https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz'],
zip_safe=True
zip_safe=True,
cmdclass={'install': install},
)
""")

Expand Down
16 changes: 16 additions & 0 deletions src/main/python/pybuilder/core.py
Expand Up @@ -285,6 +285,8 @@ def __init__(self, basedir, version="1.0.dev0", name=None):
self._manifest_included_directories = []
self._package_data = {}
self._files_to_install = []
self._preinstall_script = None
self._postinstall_script = None

def __str__(self):
return "[Project name=%s basedir=%s]" % (self.name, self.basedir)
Expand Down Expand Up @@ -351,6 +353,20 @@ def depends_on_requirements(self, file):
def build_depends_on_requirements(self, file):
self._build_dependencies.add(RequirementsFile(file))

@property
def setup_preinstall_script(self):
return self._preinstall_script

def pre_install_script(self, script):
self._preinstall_script = script

@property
def setup_postinstall_script(self):
return self._postinstall_script

def post_install_script(self, script):
self._postinstall_script = script

@property
def manifest_included_files(self):
return self._manifest_included_files
Expand Down
22 changes: 20 additions & 2 deletions src/main/python/pybuilder/plugins/python/distutils_plugin.py
Expand Up @@ -46,6 +46,21 @@
SETUP_TEMPLATE = string.Template("""#!/usr/bin/env python
$remove_hardlink_capabilities_for_shared_filesystems
from $module import setup
from $module.command.install import install as _install
class install(_install):
def pre_install_script(self):
$preinstall_script
def post_install_script(self):
$postinstall_script
def run(self):
self.pre_install_script()
_install.run(self)
self.post_install_script()
if __name__ == '__main__':
setup(
Expand All @@ -66,7 +81,8 @@
package_data = $package_data,
install_requires = $dependencies,
dependency_links = $dependency_links,
zip_safe=True
zip_safe=True,
cmdclass={'install': install},
)
""")

Expand Down Expand Up @@ -128,7 +144,9 @@ def render_setup_script(project):
"remove_hardlink_capabilities_for_shared_filesystems": (
"import os\ndel os.link"
if project.get_property("distutils_issue8876_workaround_enabled")
else "")
else ""),
"preinstall_script": project.setup_preinstall_script or "pass",
"postinstall_script": project.setup_postinstall_script or "pass",
}

return SETUP_TEMPLATE.substitute(template_values)
Expand Down
69 changes: 67 additions & 2 deletions src/unittest/python/plugins/python/distutils_plugin_tests.py
Expand Up @@ -376,6 +376,71 @@ def test_should_render_setup_file(self):
self.assert_line_by_line_equal("""#!/usr/bin/env python
from distutils.core import setup
from distutils.core.command.install import install as _install
class install(_install):
def pre_install_script(self):
pass
def post_install_script(self):
pass
def run(self):
self.pre_install_script()
_install.run(self)
self.post_install_script()
if __name__ == '__main__':
setup(
name = 'Spam and Eggs',
version = '1.2.3',
description = '''This is a simple integration-test for distutils plugin.''',
long_description = '''As you might have guessed we have nothing to say here.''',
author = "Udo Juettner, Michael Gruber",
author_email = "udo.juettner@gmail.com, aelgru@gmail.com",
license = 'WTFPL',
url = 'http://github.com/pybuilder/pybuilder',
scripts = ['spam', 'eggs'],
packages = ['spam', 'eggs'],
py_modules = ['spam', 'eggs'],
classifiers = ['Development Status :: 5 - Beta', 'Environment :: Console'],
entry_points={
'console_scripts':
[]
},
data_files = [('dir', ['file1', 'file2'])], # data files
package_data = {'spam': ['eggs']}, # package data
install_requires = [ "sometool" ],
dependency_links = [ "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz" ],
zip_safe=True,
cmdclass={'install': install},
)
""", actual_setup_script)

def test_should_render_setup_file_install_script_wrappers(self):
self.project.pre_install_script("pre_install_test()")
self.project.post_install_script("post_install_test()")
actual_setup_script = render_setup_script(self.project)
self.assert_line_by_line_equal("""#!/usr/bin/env python
from distutils.core import setup
from distutils.core.command.install import install as _install
class install(_install):
def pre_install_script(self):
pre_install_test()
def post_install_script(self):
post_install_test()
def run(self):
self.pre_install_script()
_install.run(self)
self.post_install_script()
if __name__ == '__main__':
setup(
Expand Down Expand Up @@ -412,15 +477,15 @@ def test_should_render_setup_file(self):
},
install_requires = ['sometool'],
dependency_links = ['https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz'],
zip_safe=True
zip_safe=True,
cmdclass={'install': install},
)
""", actual_setup_script)

def test_should_render_console_scripts_when_property_is_set(self):
self.project.set_property("distutils_console_scripts", ["release = zest.releaser.release:main",
"prerelease = zest.releaser.prerelease:main"])

# actual_setup_script = render_setup_script(self.project)
actual_setup_script = build_console_scripts_string(self.project)

self.assertEquals("{'console_scripts': [\n"
Expand Down

0 comments on commit 2db92f4

Please sign in to comment.