summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--distribute.egg-info/entry_points.txt4
-rw-r--r--pkg_resources.py35
-rwxr-xr-xsetup.py29
-rw-r--r--setuptools/command/bdist_egg.py8
-rw-r--r--setuptools/command/build_ext.py5
-rw-r--r--setuptools/command/build_py.py8
-rwxr-xr-xsetuptools/command/easy_install.py25
-rwxr-xr-xsetuptools/command/egg_info.py9
-rw-r--r--setuptools/command/install.py7
-rwxr-xr-xsetuptools/command/install_egg_info.py4
-rwxr-xr-xsetuptools/command/sdist.py2
-rw-r--r--setuptools/dist.py1
-rwxr-xr-xsetuptools/package_index.py2
-rwxr-xr-xsetuptools/sandbox.py14
-rw-r--r--setuptools/tests/doctest.py8
-rw-r--r--setuptools/tests/test_resources.py4
-rw-r--r--tests/api_tests.txt12
17 files changed, 133 insertions, 44 deletions
diff --git a/distribute.egg-info/entry_points.txt b/distribute.egg-info/entry_points.txt
index d69118d9..2c002f4c 100644
--- a/distribute.egg-info/entry_points.txt
+++ b/distribute.egg-info/entry_points.txt
@@ -1,5 +1,6 @@
[distutils.commands]
bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
+install_scripts = setuptools.command.install_scripts:install_scripts
rotate = setuptools.command.rotate:rotate
develop = setuptools.command.develop:develop
setopt = setuptools.command.setopt:setopt
@@ -10,11 +11,10 @@ register = setuptools.command.register:register
install_egg_info = setuptools.command.install_egg_info:install_egg_info
alias = setuptools.command.alias:alias
easy_install = setuptools.command.easy_install:easy_install
-install_scripts = setuptools.command.install_scripts:install_scripts
+test = setuptools.command.test:test
bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
bdist_egg = setuptools.command.bdist_egg:bdist_egg
install = setuptools.command.install:install
-test = setuptools.command.test:test
install_lib = setuptools.command.install_lib:install_lib
build_ext = setuptools.command.build_ext:build_ext
sdist = setuptools.command.sdist:sdist
diff --git a/pkg_resources.py b/pkg_resources.py
index c636903c..7c3d58fb 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -13,7 +13,7 @@ The package resource API is designed to work with normal filesystem packages,
method.
"""
-import sys, os, zipimport, time, re, imp, new
+import sys, os, zipimport, time, re, imp, types
try:
frozenset
@@ -1126,10 +1126,16 @@ class NullProvider:
def has_metadata(self, name):
return self.egg_info and self._has(self._fn(self.egg_info,name))
- def get_metadata(self, name):
- if not self.egg_info:
- return ""
- return self._get(self._fn(self.egg_info,name))
+ if sys.version_info <= (3,):
+ def get_metadata(self, name):
+ if not self.egg_info:
+ return ""
+ return self._get(self._fn(self.egg_info,name))
+ else:
+ def get_metadata(self, name):
+ if not self.egg_info:
+ return ""
+ return self._get(self._fn(self.egg_info,name)).decode("utf-8")
def get_metadata_lines(self, name):
return yield_lines(self.get_metadata(name))
@@ -1707,7 +1713,7 @@ def _handle_ns(packageName, path_item):
return None
module = sys.modules.get(packageName)
if module is None:
- module = sys.modules[packageName] = new.module(packageName)
+ module = sys.modules[packageName] = types.ModuleType(packageName)
module.__path__ = []; _set_parent_ns(packageName)
elif not hasattr(module,'__path__'):
raise TypeError("Not a package:", packageName)
@@ -2044,8 +2050,20 @@ class Distribution(object):
self.platform
)
)
- def __cmp__(self, other): return cmp(self.hashcmp, other)
def __hash__(self): return hash(self.hashcmp)
+ def __lt__(self, other):
+ return self.hashcmp < other.hashcmp
+ def __le__(self, other):
+ return self.hashcmp <= other.hashcmp
+ def __gt__(self, other):
+ return self.hashcmp > other.hashcmp
+ def __ge__(self, other):
+ return self.hashcmp >= other.hashcmp
+ def __eq__(self, other):
+ if not isinstance(other, self.__class__):
+ # It's not a Distribution, so they are not equal
+ return False
+ return self.hashcmp == other.hashcmp
# These properties have to be lazy so that we don't have to load any
# metadata until/unless it's actually needed. (i.e., some distributions
@@ -2448,8 +2466,9 @@ class Requirement:
elif isinstance(item,basestring):
item = parse_version(item)
last = None
+ compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1
for parsed,trans,op,ver in self.index:
- action = trans[cmp(item,parsed)]
+ action = trans[compare(item,parsed)] # Indexing: 0, 1, -1
if action=='F': return False
elif action=='T': return True
elif action=='+': last = True
diff --git a/setup.py b/setup.py
index da9b519a..b7fb986b 100755
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,34 @@
#!/usr/bin/env python
"""Distutils setup file, used to install or test 'setuptools'"""
+import sys, os
+
+src_root = None
+if sys.version_info >= (3,):
+ tmp_src = os.path.join("build", "src")
+ from distutils.filelist import FileList
+ from distutils import dir_util, file_util, util, log
+ log.set_verbosity(1)
+ fl = FileList()
+ for line in open("MANIFEST.in"):
+ fl.process_template_line(line)
+ dir_util.create_tree(tmp_src, fl.files)
+ outfiles_2to3 = []
+ for f in fl.files:
+ outf, copied = file_util.copy_file(f, os.path.join(tmp_src, f), update=1)
+ if copied and outf.endswith(".py"):
+ outfiles_2to3.append(outf)
+ if copied and outf.endswith('api_tests.txt'):
+ # XXX support this in distutils as well
+ from lib2to3.main import main
+ main('lib2to3.fixes', ['-wd', os.path.join(tmp_src, 'tests', 'api_tests.txt')])
+
+ util.run_2to3(outfiles_2to3)
+
+ # arrange setup to use the copy
+ sys.path.insert(0, tmp_src)
+ src_root = tmp_src
+
from distutils.util import convert_path
d = {}
@@ -40,6 +68,7 @@ dist = setup(
keywords = "CPAN PyPI distutils eggs package management",
url = "http://pypi.python.org/pypi/distribute",
test_suite = 'setuptools.tests',
+ src_root = src_root,
packages = find_packages(),
package_data = {'setuptools':['*.exe']},
diff --git a/setuptools/command/bdist_egg.py b/setuptools/command/bdist_egg.py
index 9e852a3f..43589c23 100644
--- a/setuptools/command/bdist_egg.py
+++ b/setuptools/command/bdist_egg.py
@@ -401,7 +401,7 @@ def write_safety_flag(egg_dir, safe):
if safe is None or bool(safe)<>flag:
os.unlink(fn)
elif safe is not None and bool(safe)==flag:
- f=open(fn,'wb'); f.write('\n'); f.close()
+ f=open(fn,'wt'); f.write('\n'); f.close()
safety_flags = {
True: 'zip-safe',
@@ -525,9 +525,11 @@ def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None,
compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)]
if not dry_run:
z = zipfile.ZipFile(zip_filename, mode, compression=compression)
- os.path.walk(base_dir, visit, z)
+ for dirname, dirs, files in os.walk(base_dir):
+ visit(z, dirname, files)
z.close()
else:
- os.path.walk(base_dir, visit, None)
+ for dirname, dirs, files in os.walk(base_dir):
+ visit(None, dirname, file)
return zip_filename
#
diff --git a/setuptools/command/build_ext.py b/setuptools/command/build_ext.py
index c0aaa8e8..b837375b 100644
--- a/setuptools/command/build_ext.py
+++ b/setuptools/command/build_ext.py
@@ -111,6 +111,11 @@ class build_ext(_build_ext):
for ext in self.extensions:
fullname = ext._full_name
self.ext_map[fullname] = ext
+
+ # distutils 3.1 will also ask for module names
+ # XXX what to do with conflicts?
+ self.ext_map[fullname.split('.')[-1]] = ext
+
ltd = ext._links_to_dynamic = \
self.shlibs and self.links_to_dynamic(ext) or False
ext._needs_stub = ltd and use_stubs and not isinstance(ext,Library)
diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py
index 79570bc2..3fce7693 100644
--- a/setuptools/command/build_py.py
+++ b/setuptools/command/build_py.py
@@ -157,9 +157,11 @@ class build_py(_build_py):
_build_py.initialize_options(self)
-
-
-
+ def get_package_dir(self, package):
+ res = _build_py.get_package_dir(self, package)
+ if self.distribution.src_root is not None:
+ return os.path.join(self.distribution.src_root, res)
+ return res
def exclude_data_files(self, package, src_dir, files):
diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
index 67cf949f..195139c7 100755
--- a/setuptools/command/easy_install.py
+++ b/setuptools/command/easy_install.py
@@ -39,6 +39,25 @@ def samefile(p1,p2):
os.path.normpath(os.path.normcase(p2))
)
+if sys.version_info <= (3,):
+ def _to_ascii(s):
+ return s
+ def isascii(s):
+ try:
+ unicode(s, 'ascii')
+ return True
+ except UnicodeError:
+ return False
+else:
+ def _to_ascii(s):
+ return s.encode('ascii')
+ def isascii(s):
+ try:
+ s.encode('ascii')
+ return True
+ except UnicodeError:
+ return False
+
class easy_install(Command):
"""Manage a download/build/install process"""
description = "Find/get/install Python packages"
@@ -599,7 +618,7 @@ Please make the appropriate changes for your system and try again.
"import pkg_resources\n"
"pkg_resources.run_script(%(spec)r, %(script_name)r)\n"
) % locals()
- self.write_script(script_name, script_text, 'b')
+ self.write_script(script_name, _to_ascii(script_text), 'b')
def write_script(self, script_name, contents, mode="t", blockers=()):
"""Write an executable file to the scripts directory"""
@@ -1381,7 +1400,7 @@ class PthDistributions(Environment):
if os.path.islink(self.filename):
os.unlink(self.filename)
- f = open(self.filename,'wb')
+ f = open(self.filename,'wt')
f.write(data); f.close()
elif os.path.exists(self.filename):
@@ -1432,7 +1451,7 @@ def get_script_header(script_text, executable=sys_executable, wininst=False):
else:
executable = nt_quote_arg(executable)
hdr = "#!%(executable)s%(options)s\n" % locals()
- if unicode(hdr,'ascii','ignore').encode('ascii') != hdr:
+ if not isascii(hdr):
# Non-ascii path to sys.executable, use -x to prevent warnings
if options:
if options.strip().startswith('-'):
diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py
index a8315d23..46cdf4e0 100755
--- a/setuptools/command/egg_info.py
+++ b/setuptools/command/egg_info.py
@@ -3,7 +3,7 @@
Create a distribution's .egg-info directory and contents"""
# This module should be kept compatible with Python 2.3
-import os, re
+import os, re, sys
from setuptools import Command
from distutils.errors import *
from distutils import log
@@ -148,6 +148,8 @@ class egg_info(Command):
to the file.
"""
log.info("writing %s to %s", what, filename)
+ if sys.version_info >= (3,):
+ data = data.encode("utf-8")
if not self.dry_run:
f = open(filename, 'wb')
f.write(data)
@@ -351,8 +353,11 @@ def write_file (filename, contents):
"""Create a file with the specified name and write 'contents' (a
sequence of strings without line terminators) to it.
"""
+ contents = "\n".join(contents)
+ if sys.version_info >= (3,):
+ contents = contents.encode("utf-8")
f = open(filename, "wb") # always write POSIX-style manifest
- f.write("\n".join(contents))
+ f.write(contents)
f.close()
diff --git a/setuptools/command/install.py b/setuptools/command/install.py
index a150c435..247c4f25 100644
--- a/setuptools/command/install.py
+++ b/setuptools/command/install.py
@@ -18,9 +18,6 @@ class install(_install):
('install_scripts', lambda self: True),
]
_nc = dict(new_commands)
- sub_commands = [
- cmd for cmd in _install.sub_commands if cmd[0] not in _nc
- ] + new_commands
def initialize_options(self):
_install.initialize_options(self)
@@ -104,6 +101,10 @@ class install(_install):
cmd.run()
setuptools.bootstrap_install_from = None
+# XXX Python 3.1 doesn't see _nc if this is inside the class
+install.sub_commands = [
+ cmd for cmd in _install.sub_commands if cmd[0] not in install._nc
+ ] + install.new_commands
diff --git a/setuptools/command/install_egg_info.py b/setuptools/command/install_egg_info.py
index 939340c5..00c81221 100755
--- a/setuptools/command/install_egg_info.py
+++ b/setuptools/command/install_egg_info.py
@@ -97,12 +97,12 @@ class install_egg_info(Command):
% ('.'.join(pth[:-1]), pth[-1])
)
f.write(
- "import sys,new,os; "
+ "import sys,types,os; "
"p = os.path.join(sys._getframe(1).f_locals['sitedir'], "
"*%(pth)r); "
"ie = os.path.exists(os.path.join(p,'__init__.py')); "
"m = not ie and "
- "sys.modules.setdefault(%(pkg)r,new.module(%(pkg)r)); "
+ "sys.modules.setdefault(%(pkg)r,types.ModuleType(%(pkg)r)); "
"mp = (m or []) and m.__dict__.setdefault('__path__',[]); "
"(p not in mp) and mp.append(p)%(trailer)s"
% locals()
diff --git a/setuptools/command/sdist.py b/setuptools/command/sdist.py
index 50c4c009..3442fe4b 100755
--- a/setuptools/command/sdist.py
+++ b/setuptools/command/sdist.py
@@ -60,7 +60,7 @@ def _default_revctrl(dirname=''):
def externals_finder(dirname, filename):
"""Find any 'svn:externals' directories"""
found = False
- f = open(filename,'rb')
+ f = open(filename,'rt')
for line in iter(f.readline, ''): # can't use direct iter!
parts = line.split()
if len(parts)==2:
diff --git a/setuptools/dist.py b/setuptools/dist.py
index 30ff35e3..c2e57f4b 100644
--- a/setuptools/dist.py
+++ b/setuptools/dist.py
@@ -210,6 +210,7 @@ class Distribution(_Distribution):
self.require_features = []
self.features = {}
self.dist_files = []
+ self.src_root = attrs.pop("src_root", None)
self.patch_missing_pkg_info(attrs)
# Make sure we have any eggs needed to interpret 'attrs'
if attrs is not None:
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
index 220cdec7..48494aff 100755
--- a/setuptools/package_index.py
+++ b/setuptools/package_index.py
@@ -143,7 +143,7 @@ def find_external_links(url, page):
yield urlparse.urljoin(url, htmldecode(match.group(1)))
user_agent = "Python-urllib/%s distribute/%s" % (
- urllib2.__version__, require('distribute')[0].version
+ sys.version[:3], require('distribute')[0].version
)
diff --git a/setuptools/sandbox.py b/setuptools/sandbox.py
index 11c14938..67cedde6 100755
--- a/setuptools/sandbox.py
+++ b/setuptools/sandbox.py
@@ -1,6 +1,9 @@
import os, sys, __builtin__, tempfile, operator
_os = sys.modules[os.name]
-_file = file
+try:
+ _file = file
+except NameError:
+ _file = None
_open = open
from distutils.errors import DistutilsError
__all__ = [
@@ -60,13 +63,15 @@ class AbstractSandbox:
"""Run 'func' under os sandboxing"""
try:
self._copy(self)
- __builtin__.file = self._file
+ if _file:
+ __builtin__.file = self._file
__builtin__.open = self._open
self._active = True
return func()
finally:
self._active = False
- __builtin__.file = _file
+ if _file:
+ __builtin__.file = _file
__builtin__.open = _open
self._copy(_os)
@@ -92,7 +97,8 @@ class AbstractSandbox:
return original(path,*args,**kw)
return wrap
- _file = _mk_single_path_wrapper('file', _file)
+ if _file:
+ _file = _mk_single_path_wrapper('file', _file)
_open = _mk_single_path_wrapper('open', _open)
for name in [
"stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir",
diff --git a/setuptools/tests/doctest.py b/setuptools/tests/doctest.py
index bffce58f..be399a9d 100644
--- a/setuptools/tests/doctest.py
+++ b/setuptools/tests/doctest.py
@@ -2053,16 +2053,16 @@ class Tester:
return (f,t)
def rundict(self, d, name, module=None):
- import new
- m = new.module(name)
+ import types
+ m = types.ModuleType(name)
m.__dict__.update(d)
if module is None:
module = False
return self.rundoc(m, name, module)
def run__test__(self, d, name):
- import new
- m = new.module(name)
+ import types
+ m = types.ModuleType(name)
m.__test__ = d
return self.rundoc(m, name)
diff --git a/setuptools/tests/test_resources.py b/setuptools/tests/test_resources.py
index 03e5d0f8..8f100419 100644
--- a/setuptools/tests/test_resources.py
+++ b/setuptools/tests/test_resources.py
@@ -517,12 +517,12 @@ class ScriptHeaderTests(TestCase):
# Ensure we generate what is basically a broken shebang line
# when there's options, with a warning emitted
- sys.stdout = StringIO.StringIO()
+ sys.stdout = sys.stderr = StringIO.StringIO()
self.assertEqual(get_script_header('#!/usr/bin/python -x',
executable=exe),
'#!%s -x\n' % exe)
self.assert_('Unable to adapt shebang line' in sys.stdout.getvalue())
- sys.stdout = StringIO.StringIO()
+ sys.stdout = sys.stderr = StringIO.StringIO()
self.assertEqual(get_script_header('#!/usr/bin/python',
executable=self.non_ascii_exe),
'#!%s -x\n' % self.non_ascii_exe)
diff --git a/tests/api_tests.txt b/tests/api_tests.txt
index 823d815f..6cf6e66f 100644
--- a/tests/api_tests.txt
+++ b/tests/api_tests.txt
@@ -119,7 +119,7 @@ editing are also a Distribution. (And, with a little attention to the
directory names used, and including some additional metadata, such a
"development distribution" can be made pluggable as well.)
- >>> from pkg_resources import WorkingSet
+ >>> from pkg_resources import WorkingSet, VersionConflict
A working set's entries are the sys.path entries that correspond to the active
distributions. By default, the working set's entries are the items on
@@ -208,11 +208,11 @@ You can ask a WorkingSet to ``find()`` a distribution matching a requirement::
Note that asking for a conflicting version of a distribution already in a
working set triggers a ``pkg_resources.VersionConflict`` error:
- >>> ws.find(Requirement.parse("Bar==1.0")) # doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- VersionConflict: (Bar 0.9 (http://example.com/something),
- Requirement.parse('Bar==1.0'))
+ >>> try:
+ ... ws.find(Requirement.parse("Bar==1.0"))
+ ... except VersionConflict:
+ ... print 'ok'
+ ok
You can subscribe a callback function to receive notifications whenever a new
distribution is added to a working set. The callback is immediately invoked