Branch merge

This commit is contained in:
Éric Araujo 2011-09-18 20:24:27 +02:00
commit cc95dd81f3
16 changed files with 48 additions and 97 deletions

View File

@ -3,6 +3,7 @@
import os import os
import re import re
import sys import sys
import site
import logging import logging
import sysconfig import sysconfig
@ -15,9 +16,6 @@
from packaging.compiler.extension import Extension from packaging.compiler.extension import Extension
from packaging import logger from packaging import logger
import site
HAS_USER_SITE = True
if os.name == 'nt': if os.name == 'nt':
from packaging.compiler.msvccompiler import get_build_version from packaging.compiler.msvccompiler import get_build_version
MSVC_VERSION = int(get_build_version()) MSVC_VERSION = int(get_build_version())
@ -62,6 +60,8 @@ class build_ext(Command):
('inplace', 'i', ('inplace', 'i',
"ignore build-lib and put compiled extensions into the source " + "ignore build-lib and put compiled extensions into the source " +
"directory alongside your pure Python modules"), "directory alongside your pure Python modules"),
('user', None,
"add user include, library and rpath"),
('include-dirs=', 'I', ('include-dirs=', 'I',
"list of directories to search for header files" + sep_by), "list of directories to search for header files" + sep_by),
('define=', 'D', ('define=', 'D',
@ -88,12 +88,8 @@ class build_ext(Command):
"path to the SWIG executable"), "path to the SWIG executable"),
] ]
boolean_options = ['inplace', 'debug', 'force'] boolean_options = ['inplace', 'debug', 'force', 'user']
if HAS_USER_SITE:
user_options.append(('user', None,
"add user include, library and rpath"))
boolean_options.append('user')
help_options = [ help_options = [
('help-compiler', None, ('help-compiler', None,
@ -120,7 +116,6 @@ def initialize_options(self):
self.compiler = None self.compiler = None
self.swig = None self.swig = None
self.swig_opts = None self.swig_opts = None
if HAS_USER_SITE:
self.user = None self.user = None
def finalize_options(self): def finalize_options(self):
@ -270,7 +265,7 @@ def finalize_options(self):
self.swig_opts = self.swig_opts.split(' ') self.swig_opts = self.swig_opts.split(' ')
# Finally add the user include and library directories if requested # Finally add the user include and library directories if requested
if HAS_USER_SITE and self.user: if self.user:
user_include = os.path.join(site.USER_BASE, "include") user_include = os.path.join(site.USER_BASE, "include")
user_lib = os.path.join(site.USER_BASE, "lib") user_lib = os.path.join(site.USER_BASE, "lib")
if os.path.isdir(user_include): if os.path.isdir(user_include):

View File

@ -388,7 +388,7 @@ def build_packages(self):
self.build_module(module, module_file, package) self.build_module(module, module_file, package)
def byte_compile(self, files): def byte_compile(self, files):
if hasattr(sys, 'dont_write_bytecode') and sys.dont_write_bytecode: if sys.dont_write_bytecode:
logger.warning('%s: byte-compiling is disabled, skipping.', logger.warning('%s: byte-compiling is disabled, skipping.',
self.get_command_name()) self.get_command_name())
return return

View File

@ -14,9 +14,6 @@
from packaging.errors import PackagingOptionError from packaging.errors import PackagingOptionError
HAS_USER_SITE = True
class install_dist(Command): class install_dist(Command):
description = "install everything from build directory" description = "install everything from build directory"
@ -27,6 +24,9 @@ class install_dist(Command):
"installation prefix"), "installation prefix"),
('exec-prefix=', None, ('exec-prefix=', None,
"(Unix only) prefix for platform-specific files"), "(Unix only) prefix for platform-specific files"),
('user', None,
"install in user site-packages directory [%s]" %
get_path('purelib', '%s_user' % os.name)),
('home=', None, ('home=', None,
"(Unix only) home directory to install under"), "(Unix only) home directory to install under"),
@ -97,15 +97,7 @@ class install_dist(Command):
] ]
boolean_options = ['compile', 'force', 'skip-build', 'no-distinfo', boolean_options = ['compile', 'force', 'skip-build', 'no-distinfo',
'requested', 'no-record'] 'requested', 'no-record', 'user']
if HAS_USER_SITE:
user_options.append(
('user', None,
"install in user site-packages directory [%s]" %
get_path('purelib', '%s_user' % os.name)))
boolean_options.append('user')
negative_opt = {'no-compile': 'compile', 'no-requested': 'requested'} negative_opt = {'no-compile': 'compile', 'no-requested': 'requested'}
@ -115,7 +107,6 @@ def initialize_options(self):
self.prefix = None self.prefix = None
self.exec_prefix = None self.exec_prefix = None
self.home = None self.home = None
if HAS_USER_SITE:
self.user = False self.user = False
# These select only the installation base; it's up to the user to # These select only the installation base; it's up to the user to
@ -135,7 +126,6 @@ def initialize_options(self):
self.install_lib = None # set to either purelib or platlib self.install_lib = None # set to either purelib or platlib
self.install_scripts = None self.install_scripts = None
self.install_data = None self.install_data = None
if HAS_USER_SITE:
self.install_userbase = get_config_var('userbase') self.install_userbase = get_config_var('userbase')
self.install_usersite = get_path('purelib', '%s_user' % os.name) self.install_usersite = get_path('purelib', '%s_user' % os.name)
@ -219,8 +209,7 @@ def finalize_options(self):
raise PackagingOptionError( raise PackagingOptionError(
"must supply either home or prefix/exec-prefix -- not both") "must supply either home or prefix/exec-prefix -- not both")
if HAS_USER_SITE and self.user and ( if self.user and (self.prefix or self.exec_prefix or self.home or
self.prefix or self.exec_prefix or self.home or
self.install_base or self.install_platbase): self.install_base or self.install_platbase):
raise PackagingOptionError( raise PackagingOptionError(
"can't combine user with prefix/exec_prefix/home or " "can't combine user with prefix/exec_prefix/home or "
@ -274,12 +263,10 @@ def finalize_options(self):
'exec_prefix': exec_prefix, 'exec_prefix': exec_prefix,
'srcdir': srcdir, 'srcdir': srcdir,
'projectbase': projectbase, 'projectbase': projectbase,
'userbase': self.install_userbase,
'usersite': self.install_usersite,
} }
if HAS_USER_SITE:
self.config_vars['userbase'] = self.install_userbase
self.config_vars['usersite'] = self.install_usersite
self.expand_basedirs() self.expand_basedirs()
self.dump_dirs("post-expand_basedirs()") self.dump_dirs("post-expand_basedirs()")
@ -295,9 +282,9 @@ def finalize_options(self):
self.dump_dirs("post-expand_dirs()") self.dump_dirs("post-expand_dirs()")
# Create directories in the home dir: # Create directories under USERBASE
if HAS_USER_SITE and self.user: if self.user:
self.create_home_path() self.create_user_dirs()
# Pick the actual directory to install all modules to: either # Pick the actual directory to install all modules to: either
# install_purelib or install_platlib, depending on whether this # install_purelib or install_platlib, depending on whether this
@ -311,10 +298,8 @@ def finalize_options(self):
# Convert directories from Unix /-separated syntax to the local # Convert directories from Unix /-separated syntax to the local
# convention. # convention.
self.convert_paths('lib', 'purelib', 'platlib', self.convert_paths('lib', 'purelib', 'platlib', 'scripts',
'scripts', 'data', 'headers') 'data', 'headers', 'userbase', 'usersite')
if HAS_USER_SITE:
self.convert_paths('userbase', 'usersite')
# Well, we're not actually fully completely finalized yet: we still # Well, we're not actually fully completely finalized yet: we still
# have to deal with 'extra_path', which is the hack for allowing # have to deal with 'extra_path', which is the hack for allowing
@ -355,7 +340,7 @@ def finalize_unix(self):
"installation scheme is incomplete") "installation scheme is incomplete")
return return
if HAS_USER_SITE and self.user: if self.user:
if self.install_userbase is None: if self.install_userbase is None:
raise PackagingPlatformError( raise PackagingPlatformError(
"user base directory is not specified") "user base directory is not specified")
@ -383,7 +368,7 @@ def finalize_unix(self):
def finalize_other(self): def finalize_other(self):
"""Finalize options for non-posix platforms""" """Finalize options for non-posix platforms"""
if HAS_USER_SITE and self.user: if self.user:
if self.install_userbase is None: if self.install_userbase is None:
raise PackagingPlatformError( raise PackagingPlatformError(
"user base directory is not specified") "user base directory is not specified")
@ -494,10 +479,8 @@ def change_roots(self, *names):
attr = "install_" + name attr = "install_" + name
setattr(self, attr, change_root(self.root, getattr(self, attr))) setattr(self, attr, change_root(self.root, getattr(self, attr)))
def create_home_path(self): def create_user_dirs(self):
"""Create directories under ~.""" """Create directories under USERBASE as needed."""
if HAS_USER_SITE and not self.user:
return
home = convert_path(os.path.expanduser("~")) home = convert_path(os.path.expanduser("~"))
for name, path in self.config_vars.items(): for name, path in self.config_vars.items():
if path.startswith(home) and not os.path.isdir(path): if path.startswith(home) and not os.path.isdir(path):

View File

@ -2,15 +2,14 @@
# Forked from the former install_egg_info command by Josip Djolonga # Forked from the former install_egg_info command by Josip Djolonga
import csv
import os import os
import re import csv
import hashlib import hashlib
from packaging.command.cmd import Command
from packaging import logger
from shutil import rmtree from shutil import rmtree
from packaging import logger
from packaging.command.cmd import Command
class install_distinfo(Command): class install_distinfo(Command):

View File

@ -114,7 +114,7 @@ def install(self):
return outfiles return outfiles
def byte_compile(self, files): def byte_compile(self, files):
if getattr(sys, 'dont_write_bytecode'): if sys.dont_write_bytecode:
# XXX do we want this? because a Python runs without bytecode # XXX do we want this? because a Python runs without bytecode
# doesn't mean that the *dists should not contain bytecode # doesn't mean that the *dists should not contain bytecode
#--or does it? #--or does it?

View File

@ -352,5 +352,4 @@ def preprocess(self, source, output_file=None, macros=None,
try: try:
self.spawn(pp_args) self.spawn(pp_args)
except PackagingExecError as msg: except PackagingExecError as msg:
print(msg)
raise CompileError(msg) raise CompileError(msg)

View File

@ -5,7 +5,6 @@
""" """
import os import os
import sys
from shutil import move from shutil import move
from packaging import logger from packaging import logger
from packaging.util import split_quoted, execute, newer_group, spawn from packaging.util import split_quoted, execute, newer_group, spawn

View File

@ -537,7 +537,7 @@ def print_command_list(self, commands, header, max_length):
def _get_command_groups(self): def _get_command_groups(self):
"""Helper function to retrieve all the command class names divided """Helper function to retrieve all the command class names divided
into standard commands (listed in into standard commands (listed in
packaging2.command.STANDARD_COMMANDS) and extra commands (given in packaging.command.STANDARD_COMMANDS) and extra commands (given in
self.cmdclass and not standard commands). self.cmdclass and not standard commands).
""" """
extra_commands = [cmd for cmd in self.cmdclass extra_commands = [cmd for cmd in self.cmdclass
@ -547,7 +547,7 @@ def _get_command_groups(self):
def print_commands(self): def print_commands(self):
"""Print out a help message listing all available commands with a """Print out a help message listing all available commands with a
description of each. The list is divided into standard commands description of each. The list is divided into standard commands
(listed in packaging2.command.STANDARD_COMMANDS) and extra commands (listed in packaging.command.STANDARD_COMMANDS) and extra commands
(given in self.cmdclass and not standard commands). The (given in self.cmdclass and not standard commands). The
descriptions come from the command class attribute descriptions come from the command class attribute
'description'. 'description'.

View File

@ -19,18 +19,13 @@ class BuildExtTestCase(support.TempdirManager,
support.LoggingCatcher, support.LoggingCatcher,
unittest.TestCase): unittest.TestCase):
def setUp(self): def setUp(self):
# Create a simple test environment
# Note that we're making changes to sys.path
super(BuildExtTestCase, self).setUp() super(BuildExtTestCase, self).setUp()
self.tmp_dir = self.mkdtemp() self.tmp_dir = self.mkdtemp()
self.old_user_base = site.USER_BASE self.old_user_base = site.USER_BASE
site.USER_BASE = self.mkdtemp() site.USER_BASE = self.mkdtemp()
def tearDown(self): def tearDown(self):
# Get everything back to normal
if sys.version > "2.6":
site.USER_BASE = self.old_user_base site.USER_BASE = self.old_user_base
super(BuildExtTestCase, self).tearDown() super(BuildExtTestCase, self).tearDown()
def test_build_ext(self): def test_build_ext(self):
@ -94,7 +89,6 @@ def test_solaris_enable_shared(self):
# make sure we get some library dirs under solaris # make sure we get some library dirs under solaris
self.assertGreater(len(cmd.library_dirs), 0) self.assertGreater(len(cmd.library_dirs), 0)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_user_site(self): def test_user_site(self):
dist = Distribution({'name': 'xx'}) dist = Distribution({'name': 'xx'})
cmd = build_ext(dist) cmd = build_ext(dist)

View File

@ -99,8 +99,6 @@ def test_empty_package_dir(self):
os.chdir(cwd) os.chdir(cwd)
sys.stdout = old_stdout sys.stdout = old_stdout
@unittest.skipUnless(hasattr(sys, 'dont_write_bytecode'),
'sys.dont_write_bytecode not supported')
def test_dont_write_bytecode(self): def test_dont_write_bytecode(self):
# makes sure byte_compile is not used # makes sure byte_compile is not used
pkg_dir, dist = self.create_dist() pkg_dir, dist = self.create_dist()

View File

@ -72,7 +72,6 @@ def check_path(got, expected):
check_path(cmd.install_scripts, os.path.join(destination, "bin")) check_path(cmd.install_scripts, os.path.join(destination, "bin"))
check_path(cmd.install_data, destination) check_path(cmd.install_data, destination)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_user_site(self): def test_user_site(self):
# test install with --user # test install with --user
# preparing the environment for the test # preparing the environment for the test
@ -173,7 +172,6 @@ def test_finalize_options(self):
cmd.home = 'home' cmd.home = 'home'
self.assertRaises(PackagingOptionError, cmd.finalize_options) self.assertRaises(PackagingOptionError, cmd.finalize_options)
if sys.version >= '2.6':
# can't combine user with with prefix/exec_prefix/home or # can't combine user with with prefix/exec_prefix/home or
# install_(plat)base # install_(plat)base
cmd.prefix = None cmd.prefix = None

View File

@ -7,13 +7,6 @@
from packaging.compiler.extension import Extension from packaging.compiler.extension import Extension
from packaging.errors import PackagingOptionError from packaging.errors import PackagingOptionError
try:
no_bytecode = sys.dont_write_bytecode
bytecode_support = True
except AttributeError:
no_bytecode = False
bytecode_support = False
class InstallLibTestCase(support.TempdirManager, class InstallLibTestCase(support.TempdirManager,
support.LoggingCatcher, support.LoggingCatcher,
@ -40,7 +33,7 @@ def test_finalize_options(self):
cmd.finalize_options() cmd.finalize_options()
self.assertEqual(cmd.optimize, 2) self.assertEqual(cmd.optimize, 2)
@unittest.skipIf(no_bytecode, 'byte-compile disabled') @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled')
def test_byte_compile(self): def test_byte_compile(self):
pkg_dir, dist = self.create_dist() pkg_dir, dist = self.create_dist()
cmd = install_lib(dist) cmd = install_lib(dist)
@ -89,8 +82,6 @@ def test_get_inputs(self):
# get_input should return 2 elements # get_input should return 2 elements
self.assertEqual(len(cmd.get_inputs()), 2) self.assertEqual(len(cmd.get_inputs()), 2)
@unittest.skipUnless(bytecode_support,
'sys.dont_write_bytecode not supported')
def test_dont_write_bytecode(self): def test_dont_write_bytecode(self):
# makes sure byte_compile is not used # makes sure byte_compile is not used
pkg_dir, dist = self.create_dist() pkg_dir, dist = self.create_dist()

View File

@ -9,7 +9,6 @@ class Mixin2to3TestCase(support.TempdirManager,
support.LoggingCatcher, support.LoggingCatcher,
unittest.TestCase): unittest.TestCase):
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_convert_code_only(self): def test_convert_code_only(self):
# used to check if code gets converted properly. # used to check if code gets converted properly.
code = "print 'test'" code = "print 'test'"
@ -26,7 +25,6 @@ def test_convert_code_only(self):
self.assertEqual(expected, converted) self.assertEqual(expected, converted)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_doctests_only(self): def test_doctests_only(self):
# used to check if doctests gets converted properly. # used to check if doctests gets converted properly.
doctest = textwrap.dedent('''\ doctest = textwrap.dedent('''\
@ -57,7 +55,6 @@ def test_doctests_only(self):
self.assertEqual(expected, converted) self.assertEqual(expected, converted)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_additional_fixers(self): def test_additional_fixers(self):
# used to check if use_2to3_fixers works # used to check if use_2to3_fixers works
code = 'type(x) is not T' code = 'type(x) is not T'

View File

@ -319,8 +319,6 @@ def test_get_compiler_versions(self):
res = get_compiler_versions() res = get_compiler_versions()
self.assertEqual(res[2], None) self.assertEqual(res[2], None)
@unittest.skipUnless(hasattr(sys, 'dont_write_bytecode'),
'sys.dont_write_bytecode not supported')
def test_dont_write_bytecode(self): def test_dont_write_bytecode(self):
# makes sure byte_compile raise a PackagingError # makes sure byte_compile raise a PackagingError
# if sys.dont_write_bytecode is True # if sys.dont_write_bytecode is True
@ -407,7 +405,6 @@ def test_import_nested_first_time(self):
finally: finally:
sys.path.remove(tmp_dir) sys.path.remove(tmp_dir)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_run_2to3_on_code(self): def test_run_2to3_on_code(self):
content = "print 'test'" content = "print 'test'"
converted_content = "print('test')" converted_content = "print('test')"
@ -421,7 +418,6 @@ def test_run_2to3_on_code(self):
file_handle.close() file_handle.close()
self.assertEqual(new_content, converted_content) self.assertEqual(new_content, converted_content)
@unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
def test_run_2to3_on_doctests(self): def test_run_2to3_on_doctests(self):
# to check if text files containing doctests only get converted. # to check if text files containing doctests only get converted.
content = ">>> print 'test'\ntest\n" content = ">>> print 'test'\ntest\n"

View File

@ -326,7 +326,7 @@ def byte_compile(py_files, optimize=0, force=False, prefix=None,
""" """
# nothing is done if sys.dont_write_bytecode is True # nothing is done if sys.dont_write_bytecode is True
# FIXME this should not raise an error # FIXME this should not raise an error
if hasattr(sys, 'dont_write_bytecode') and sys.dont_write_bytecode: if sys.dont_write_bytecode:
raise PackagingByteCompileError('byte-compiling is disabled.') raise PackagingByteCompileError('byte-compiling is disabled.')
# First, if the caller didn't force us into direct or indirect mode, # First, if the caller didn't force us into direct or indirect mode,
@ -346,8 +346,10 @@ def byte_compile(py_files, optimize=0, force=False, prefix=None,
# run it with the appropriate flags. # run it with the appropriate flags.
if not direct: if not direct:
from tempfile import mkstemp from tempfile import mkstemp
# XXX script_fd may leak, use something better than mkstemp # XXX use something better than mkstemp
script_fd, script_name = mkstemp(".py") script_fd, script_name = mkstemp(".py")
os.close(script_fd)
script_fd = None
logger.info("writing byte-compilation script '%s'", script_name) logger.info("writing byte-compilation script '%s'", script_name)
if not dry_run: if not dry_run:
if script_fd is not None: if script_fd is not None:

View File

@ -307,9 +307,9 @@ def _get_delegate(self):
def get_filename(self, fullname=None): def get_filename(self, fullname=None):
fullname = self._fix_name(fullname) fullname = self._fix_name(fullname)
mod_type = self.etc[2] mod_type = self.etc[2]
if self.etc[2]==imp.PKG_DIRECTORY: if mod_type==imp.PKG_DIRECTORY:
return self._get_delegate().get_filename() return self._get_delegate().get_filename()
elif self.etc[2] in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION): elif mod_type in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION):
return self.filename return self.filename
return None return None