# HG changeset patch # User Sylvain Thénault # Date 1295279778 -3600 # Node ID fe5162da6e7091505471d836430eb69c6f67bedc # Parent 829b068eb9c7a3d26ead441b9bfeb33230b7c8c0 [skel] setup.py patched to get easy_install to work diff -r 829b068eb9c7 -r fe5162da6e70 skeleton/setup.py --- a/skeleton/setup.py Mon Jan 17 16:17:21 2011 +0100 +++ b/skeleton/setup.py Mon Jan 17 16:56:18 2011 +0100 @@ -1,8 +1,25 @@ #!/usr/bin/env python -# pylint: disable=W0404,W0622,W0704,W0613 +# pylint: disable=W0142,W0403,W0404,W0613,W0622,W0622,W0704,R0904,C0103,E0611 +# # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr - +# +# This file is part of CubicWeb tag cube. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""Generic Setup script, takes package info from __pkginfo__.py file +""" __docformat__ = "restructuredtext en" import os @@ -12,49 +29,50 @@ try: if os.environ.get('NO_SETUPTOOLS'): - raise ImportError() + raise ImportError() # do as there is no setuptools from setuptools import setup from setuptools.command import install_lib - USE_SETUPTOOLS = 1 + USE_SETUPTOOLS = True except ImportError: from distutils.core import setup from distutils.command import install_lib - USE_SETUPTOOLS = 0 + USE_SETUPTOOLS = False +from distutils.command import install_data - -sys.modules.pop('__pkginfo__', None) # import required features -from __pkginfo__ import modname, version, license, description, \ - web, author, author_email -# import optional features -import __pkginfo__ -distname = getattr(__pkginfo__, 'distname', modname) -scripts = getattr(__pkginfo__, 'scripts', []) -data_files = getattr(__pkginfo__, 'data_files', None) -include_dirs = getattr(__pkginfo__, 'include_dirs', []) -ext_modules = getattr(__pkginfo__, 'ext_modules', None) -dependency_links = getattr(__pkginfo__, 'dependency_links', []) - -STD_BLACKLIST = ('CVS', '.svn', '.hg', 'debian', 'dist', 'build') - -IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~') +from __pkginfo__ import modname, version, license, description, web, \ + author, author_email if exists('README'): long_description = file('README').read() else: long_description = '' + +# import optional features +import __pkginfo__ if USE_SETUPTOOLS: - requires = {} - for entry in ("__depends__", "__recommends__"): - requires.update(getattr(__pkginfo__, entry, {})) - install_requires = [("%s %s" % (d, v and v or "")).strip() + requires = {} + for entry in ("__depends__",): # "__recommends__"): + requires.update(getattr(__pkginfo__, entry, {})) + install_requires = [("%s %s" % (d, v and v or "")).strip() for d, v in requires.iteritems()] else: - install_requires = [] + install_requires = [] + +distname = getattr(__pkginfo__, 'distname', modname) +scripts = getattr(__pkginfo__, 'scripts', ()) +include_dirs = getattr(__pkginfo__, 'include_dirs', ()) +data_files = getattr(__pkginfo__, 'data_files', None) +ext_modules = getattr(__pkginfo__, 'ext_modules', None) +dependency_links = getattr(__pkginfo__, 'dependency_links', ()) + +BASE_BLACKLIST = ('CVS', '.svn', '.hg', 'debian', 'dist', 'build') +IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~') def ensure_scripts(linux_scripts): - """Creates the proper script names required for each platform + """ + Creates the proper script names required for each platform (taken from 4Suite) """ from distutils import util @@ -64,23 +82,8 @@ scripts_ = linux_scripts return scripts_ -def get_packages(directory, prefix): - """return a list of subpackages for the given directory""" - result = [] - for package in os.listdir(directory): - absfile = join(directory, package) - if isdir(absfile): - if exists(join(absfile, '__init__.py')) or \ - package in ('test', 'tests'): - if prefix: - result.append('%s.%s' % (prefix, package)) - else: - result.append(package) - result += get_packages(absfile, result[-1]) - return result - def export(from_dir, to_dir, - blacklist=STD_BLACKLIST, + blacklist=BASE_BLACKLIST, ignore_ext=IGNORED_EXTENSIONS, verbose=True): """make a mirror of from_dir in to_dir, omitting directories and files @@ -134,6 +137,35 @@ dest = join(self.install_dir, base, directory) export(directory, dest, verbose=False) +# re-enable copying data files in sys.prefix +old_install_data = install_data.install_data +if USE_SETUPTOOLS: + # overwrite InstallData to use sys.prefix instead of the egg directory + class MyInstallData(old_install_data): + """A class that manages data files installation""" + def run(self): + _old_install_dir = self.install_dir + if self.install_dir.endswith('egg'): + self.install_dir = sys.prefix + old_install_data.run(self) + self.install_dir = _old_install_dir + try: + import setuptools.command.easy_install # only if easy_install avaible + # monkey patch: Crack SandboxViolation verification + from setuptools.sandbox import DirectorySandbox as DS + old_ok = DS._ok + def _ok(self, path): + """Return True if ``path`` can be written during installation.""" + out = old_ok(self, path) # here for side effect from setuptools + realpath = os.path.normcase(os.path.realpath(path)) + allowed_path = os.path.normcase(sys.prefix) + if realpath.startswith(allowed_path): + out = True + return out + DS._ok = _ok + except ImportError: + pass + def install(**kwargs): """setup entry point""" if USE_SETUPTOOLS: @@ -142,9 +174,13 @@ # install-layout option was introduced in 2.5.3-1~exp1 elif sys.version_info < (2, 5, 4) and '--install-layout=deb' in sys.argv: sys.argv.remove('--install-layout=deb') - if USE_SETUPTOOLS and install_requires: + cmdclass = {'install_lib': MyInstallLib} + if USE_SETUPTOOLS: kwargs['install_requires'] = install_requires kwargs['dependency_links'] = dependency_links + kwargs['zip_safe'] = False + cmdclass['install_data'] = MyInstallData + return setup(name = distname, version = version, license = license, @@ -156,7 +192,7 @@ scripts = ensure_scripts(scripts), data_files = data_files, ext_modules = ext_modules, - cmdclass = {'install_lib': MyInstallLib}, + cmdclass = cmdclass, **kwargs )