diff --git a/Lib/packaging/command/build_ext.py b/Lib/packaging/command/build_ext.py index 2bffae38ac2..4051a2d9b92 100644 --- a/Lib/packaging/command/build_ext.py +++ b/Lib/packaging/command/build_ext.py @@ -3,6 +3,7 @@ import os import re import sys +import site import logging import sysconfig @@ -15,9 +16,6 @@ from packaging.util import newer_group from packaging.compiler.extension import Extension from packaging import logger -import site -HAS_USER_SITE = True - if os.name == 'nt': from packaging.compiler.msvccompiler import get_build_version MSVC_VERSION = int(get_build_version()) @@ -62,6 +60,8 @@ class build_ext(Command): ('inplace', 'i', "ignore build-lib and put compiled extensions into the source " + "directory alongside your pure Python modules"), + ('user', None, + "add user include, library and rpath"), ('include-dirs=', 'I', "list of directories to search for header files" + sep_by), ('define=', 'D', @@ -88,12 +88,8 @@ class build_ext(Command): "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-compiler', None, @@ -120,8 +116,7 @@ class build_ext(Command): self.compiler = None self.swig = None self.swig_opts = None - if HAS_USER_SITE: - self.user = None + self.user = None def finalize_options(self): self.set_undefined_options('build', @@ -270,7 +265,7 @@ class build_ext(Command): self.swig_opts = self.swig_opts.split(' ') # 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_lib = os.path.join(site.USER_BASE, "lib") if os.path.isdir(user_include): diff --git a/Lib/packaging/command/build_py.py b/Lib/packaging/command/build_py.py index 7baa6e46a07..0eafffa3ae7 100644 --- a/Lib/packaging/command/build_py.py +++ b/Lib/packaging/command/build_py.py @@ -388,7 +388,7 @@ class build_py(Command, Mixin2to3): self.build_module(module, module_file, package) 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.', self.get_command_name()) return diff --git a/Lib/packaging/command/install_dist.py b/Lib/packaging/command/install_dist.py index dfe6df2d5a3..4fbca7e72d3 100644 --- a/Lib/packaging/command/install_dist.py +++ b/Lib/packaging/command/install_dist.py @@ -14,9 +14,6 @@ from packaging.util import convert_path, change_root, get_platform from packaging.errors import PackagingOptionError -HAS_USER_SITE = True - - class install_dist(Command): description = "install everything from build directory" @@ -27,6 +24,9 @@ class install_dist(Command): "installation prefix"), ('exec-prefix=', None, "(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, "(Unix only) home directory to install under"), @@ -97,15 +97,7 @@ class install_dist(Command): ] boolean_options = ['compile', 'force', 'skip-build', 'no-distinfo', - 'requested', 'no-record'] - - 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') + 'requested', 'no-record', 'user'] negative_opt = {'no-compile': 'compile', 'no-requested': 'requested'} @@ -115,8 +107,7 @@ class install_dist(Command): self.prefix = None self.exec_prefix = 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 # specify the installation scheme (currently, that means supplying @@ -135,9 +126,8 @@ class install_dist(Command): self.install_lib = None # set to either purelib or platlib self.install_scripts = None self.install_data = None - if HAS_USER_SITE: - self.install_userbase = get_config_var('userbase') - self.install_usersite = get_path('purelib', '%s_user' % os.name) + self.install_userbase = get_config_var('userbase') + self.install_usersite = get_path('purelib', '%s_user' % os.name) self.compile = None self.optimize = None @@ -219,9 +209,8 @@ class install_dist(Command): raise PackagingOptionError( "must supply either home or prefix/exec-prefix -- not both") - if HAS_USER_SITE and self.user and ( - self.prefix or self.exec_prefix or self.home or - self.install_base or self.install_platbase): + if self.user and (self.prefix or self.exec_prefix or self.home or + self.install_base or self.install_platbase): raise PackagingOptionError( "can't combine user with prefix/exec_prefix/home or " "install_base/install_platbase") @@ -274,11 +263,9 @@ class install_dist(Command): 'exec_prefix': exec_prefix, 'srcdir': srcdir, 'projectbase': projectbase, - } - - if HAS_USER_SITE: - self.config_vars['userbase'] = self.install_userbase - self.config_vars['usersite'] = self.install_usersite + 'userbase': self.install_userbase, + 'usersite': self.install_usersite, + } self.expand_basedirs() @@ -295,9 +282,9 @@ class install_dist(Command): self.dump_dirs("post-expand_dirs()") - # Create directories in the home dir: - if HAS_USER_SITE and self.user: - self.create_home_path() + # Create directories under USERBASE + if self.user: + self.create_user_dirs() # Pick the actual directory to install all modules to: either # install_purelib or install_platlib, depending on whether this @@ -311,10 +298,8 @@ class install_dist(Command): # Convert directories from Unix /-separated syntax to the local # convention. - self.convert_paths('lib', 'purelib', 'platlib', - 'scripts', 'data', 'headers') - if HAS_USER_SITE: - self.convert_paths('userbase', 'usersite') + self.convert_paths('lib', 'purelib', 'platlib', 'scripts', + 'data', 'headers', 'userbase', 'usersite') # Well, we're not actually fully completely finalized yet: we still # have to deal with 'extra_path', which is the hack for allowing @@ -355,7 +340,7 @@ class install_dist(Command): "installation scheme is incomplete") return - if HAS_USER_SITE and self.user: + if self.user: if self.install_userbase is None: raise PackagingPlatformError( "user base directory is not specified") @@ -383,7 +368,7 @@ class install_dist(Command): def finalize_other(self): """Finalize options for non-posix platforms""" - if HAS_USER_SITE and self.user: + if self.user: if self.install_userbase is None: raise PackagingPlatformError( "user base directory is not specified") @@ -494,10 +479,8 @@ class install_dist(Command): attr = "install_" + name setattr(self, attr, change_root(self.root, getattr(self, attr))) - def create_home_path(self): - """Create directories under ~.""" - if HAS_USER_SITE and not self.user: - return + def create_user_dirs(self): + """Create directories under USERBASE as needed.""" home = convert_path(os.path.expanduser("~")) for name, path in self.config_vars.items(): if path.startswith(home) and not os.path.isdir(path): diff --git a/Lib/packaging/command/install_distinfo.py b/Lib/packaging/command/install_distinfo.py index c1f85eddf0c..e85aaf79658 100644 --- a/Lib/packaging/command/install_distinfo.py +++ b/Lib/packaging/command/install_distinfo.py @@ -2,15 +2,14 @@ # Forked from the former install_egg_info command by Josip Djolonga -import csv import os -import re +import csv import hashlib - -from packaging.command.cmd import Command -from packaging import logger from shutil import rmtree +from packaging import logger +from packaging.command.cmd import Command + class install_distinfo(Command): diff --git a/Lib/packaging/command/install_lib.py b/Lib/packaging/command/install_lib.py index 978f0ef8a82..5e81b419392 100644 --- a/Lib/packaging/command/install_lib.py +++ b/Lib/packaging/command/install_lib.py @@ -114,7 +114,7 @@ class install_lib(Command): return outfiles 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 # doesn't mean that the *dists should not contain bytecode #--or does it? diff --git a/Lib/packaging/compiler/bcppcompiler.py b/Lib/packaging/compiler/bcppcompiler.py index 63b6d8b1924..477cf93d2e4 100644 --- a/Lib/packaging/compiler/bcppcompiler.py +++ b/Lib/packaging/compiler/bcppcompiler.py @@ -352,5 +352,4 @@ class BCPPCompiler(CCompiler) : try: self.spawn(pp_args) except PackagingExecError as msg: - print(msg) raise CompileError(msg) diff --git a/Lib/packaging/compiler/ccompiler.py b/Lib/packaging/compiler/ccompiler.py index d2743274fd4..02e22d2b3e5 100644 --- a/Lib/packaging/compiler/ccompiler.py +++ b/Lib/packaging/compiler/ccompiler.py @@ -5,7 +5,6 @@ interface for the compiler abstraction model used by packaging. """ import os -import sys from shutil import move from packaging import logger from packaging.util import split_quoted, execute, newer_group, spawn diff --git a/Lib/packaging/dist.py b/Lib/packaging/dist.py index de718ccdacd..3019b7c1665 100644 --- a/Lib/packaging/dist.py +++ b/Lib/packaging/dist.py @@ -537,7 +537,7 @@ Common commands: (see '--help-commands' for more) def _get_command_groups(self): """Helper function to retrieve all the command class names divided 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). """ extra_commands = [cmd for cmd in self.cmdclass @@ -547,7 +547,7 @@ Common commands: (see '--help-commands' for more) def print_commands(self): """Print out a help message listing all available commands with a 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 descriptions come from the command class attribute 'description'. diff --git a/Lib/packaging/tests/test_command_build_ext.py b/Lib/packaging/tests/test_command_build_ext.py index a6ad6ac0afe..c84631c2a81 100644 --- a/Lib/packaging/tests/test_command_build_ext.py +++ b/Lib/packaging/tests/test_command_build_ext.py @@ -19,18 +19,13 @@ class BuildExtTestCase(support.TempdirManager, support.LoggingCatcher, unittest.TestCase): def setUp(self): - # Create a simple test environment - # Note that we're making changes to sys.path super(BuildExtTestCase, self).setUp() self.tmp_dir = self.mkdtemp() self.old_user_base = site.USER_BASE site.USER_BASE = self.mkdtemp() 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() def test_build_ext(self): @@ -94,7 +89,6 @@ class BuildExtTestCase(support.TempdirManager, # make sure we get some library dirs under solaris self.assertGreater(len(cmd.library_dirs), 0) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_user_site(self): dist = Distribution({'name': 'xx'}) cmd = build_ext(dist) diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py index 243a863a609..4eeb34e1178 100644 --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -99,8 +99,6 @@ class BuildPyTestCase(support.TempdirManager, os.chdir(cwd) sys.stdout = old_stdout - @unittest.skipUnless(hasattr(sys, 'dont_write_bytecode'), - 'sys.dont_write_bytecode not supported') def test_dont_write_bytecode(self): # makes sure byte_compile is not used pkg_dir, dist = self.create_dist() diff --git a/Lib/packaging/tests/test_command_install_dist.py b/Lib/packaging/tests/test_command_install_dist.py index 8f90aff97ef..808b568cdb9 100644 --- a/Lib/packaging/tests/test_command_install_dist.py +++ b/Lib/packaging/tests/test_command_install_dist.py @@ -72,7 +72,6 @@ class InstallTestCase(support.TempdirManager, check_path(cmd.install_scripts, os.path.join(destination, "bin")) check_path(cmd.install_data, destination) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_user_site(self): # test install with --user # preparing the environment for the test @@ -173,12 +172,11 @@ class InstallTestCase(support.TempdirManager, cmd.home = 'home' self.assertRaises(PackagingOptionError, cmd.finalize_options) - if sys.version >= '2.6': - # can't combine user with with prefix/exec_prefix/home or - # install_(plat)base - cmd.prefix = None - cmd.user = 'user' - self.assertRaises(PackagingOptionError, cmd.finalize_options) + # can't combine user with with prefix/exec_prefix/home or + # install_(plat)base + cmd.prefix = None + cmd.user = 'user' + self.assertRaises(PackagingOptionError, cmd.finalize_options) def test_old_record(self): # test pre-PEP 376 --record option (outside dist-info dir) diff --git a/Lib/packaging/tests/test_command_install_lib.py b/Lib/packaging/tests/test_command_install_lib.py index c1066f65121..9118e688aee 100644 --- a/Lib/packaging/tests/test_command_install_lib.py +++ b/Lib/packaging/tests/test_command_install_lib.py @@ -7,13 +7,6 @@ from packaging.command.install_lib import install_lib from packaging.compiler.extension import Extension 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, support.LoggingCatcher, @@ -40,7 +33,7 @@ class InstallLibTestCase(support.TempdirManager, cmd.finalize_options() 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): pkg_dir, dist = self.create_dist() cmd = install_lib(dist) @@ -89,8 +82,6 @@ class InstallLibTestCase(support.TempdirManager, # get_input should return 2 elements self.assertEqual(len(cmd.get_inputs()), 2) - @unittest.skipUnless(bytecode_support, - 'sys.dont_write_bytecode not supported') def test_dont_write_bytecode(self): # makes sure byte_compile is not used pkg_dir, dist = self.create_dist() diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py index 926f754d01b..14a7487d081 100644 --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -9,7 +9,6 @@ class Mixin2to3TestCase(support.TempdirManager, support.LoggingCatcher, unittest.TestCase): - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_convert_code_only(self): # used to check if code gets converted properly. code = "print 'test'" @@ -26,7 +25,6 @@ class Mixin2to3TestCase(support.TempdirManager, self.assertEqual(expected, converted) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_doctests_only(self): # used to check if doctests gets converted properly. doctest = textwrap.dedent('''\ @@ -57,7 +55,6 @@ class Mixin2to3TestCase(support.TempdirManager, self.assertEqual(expected, converted) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_additional_fixers(self): # used to check if use_2to3_fixers works code = 'type(x) is not T' diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py index dcd210f7bfc..3d71a96c101 100644 --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -319,8 +319,6 @@ class UtilTestCase(support.EnvironRestorer, res = get_compiler_versions() self.assertEqual(res[2], None) - @unittest.skipUnless(hasattr(sys, 'dont_write_bytecode'), - 'sys.dont_write_bytecode not supported') def test_dont_write_bytecode(self): # makes sure byte_compile raise a PackagingError # if sys.dont_write_bytecode is True @@ -407,7 +405,6 @@ class UtilTestCase(support.EnvironRestorer, finally: sys.path.remove(tmp_dir) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_run_2to3_on_code(self): content = "print 'test'" converted_content = "print('test')" @@ -421,7 +418,6 @@ class UtilTestCase(support.EnvironRestorer, file_handle.close() 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): # to check if text files containing doctests only get converted. content = ">>> print 'test'\ntest\n" diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py index 49c5991ec08..89f5389be90 100644 --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -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 # 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.') # 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. if not direct: 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") + os.close(script_fd) + script_fd = None logger.info("writing byte-compilation script '%s'", script_name) if not dry_run: if script_fd is not None: diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index 2dd20cd8e6b..c561c1382df 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -307,9 +307,9 @@ class ImpLoader: def get_filename(self, fullname=None): fullname = self._fix_name(fullname) mod_type = self.etc[2] - if self.etc[2]==imp.PKG_DIRECTORY: + if mod_type==imp.PKG_DIRECTORY: 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 None