Updated script that can be controled by Nodejs web app
This commit is contained in:
352
lib/python3.13/site-packages/setuptools/tests/__init__.py
Normal file
352
lib/python3.13/site-packages/setuptools/tests/__init__.py
Normal file
@ -0,0 +1,352 @@
|
||||
"""Tests for the 'setuptools' package"""
|
||||
import sys
|
||||
import os
|
||||
import unittest
|
||||
from setuptools.tests import doctest
|
||||
import distutils.core
|
||||
import distutils.cmd
|
||||
from distutils.errors import DistutilsOptionError, DistutilsPlatformError
|
||||
from distutils.errors import DistutilsSetupError
|
||||
from distutils.core import Extension
|
||||
from distutils.version import LooseVersion
|
||||
from setuptools.compat import func_code
|
||||
|
||||
from setuptools.compat import func_code
|
||||
import setuptools.dist
|
||||
import setuptools.depends as dep
|
||||
from setuptools import Feature
|
||||
from setuptools.depends import Require
|
||||
|
||||
def additional_tests():
|
||||
import doctest, unittest
|
||||
suite = unittest.TestSuite((
|
||||
doctest.DocFileSuite(
|
||||
os.path.join('tests', 'api_tests.txt'),
|
||||
optionflags=doctest.ELLIPSIS, package='pkg_resources',
|
||||
),
|
||||
))
|
||||
if sys.platform == 'win32':
|
||||
suite.addTest(doctest.DocFileSuite('win_script_wrapper.txt'))
|
||||
return suite
|
||||
|
||||
def makeSetup(**args):
|
||||
"""Return distribution from 'setup(**args)', without executing commands"""
|
||||
|
||||
distutils.core._setup_stop_after = "commandline"
|
||||
|
||||
# Don't let system command line leak into tests!
|
||||
args.setdefault('script_args',['install'])
|
||||
|
||||
try:
|
||||
return setuptools.setup(**args)
|
||||
finally:
|
||||
distutils.core._setup_stop_after = None
|
||||
|
||||
|
||||
class DependsTests(unittest.TestCase):
|
||||
|
||||
def testExtractConst(self):
|
||||
if not hasattr(dep, 'extract_constant'):
|
||||
# skip on non-bytecode platforms
|
||||
return
|
||||
|
||||
def f1():
|
||||
global x, y, z
|
||||
x = "test"
|
||||
y = z
|
||||
|
||||
fc = func_code(f1)
|
||||
# unrecognized name
|
||||
self.assertEqual(dep.extract_constant(fc,'q', -1), None)
|
||||
|
||||
# constant assigned
|
||||
self.assertEqual(dep.extract_constant(fc,'x', -1), "test")
|
||||
|
||||
# expression assigned
|
||||
self.assertEqual(dep.extract_constant(fc,'y', -1), -1)
|
||||
|
||||
# recognized name, not assigned
|
||||
self.assertEqual(dep.extract_constant(fc,'z', -1), None)
|
||||
|
||||
def testFindModule(self):
|
||||
self.assertRaises(ImportError, dep.find_module, 'no-such.-thing')
|
||||
self.assertRaises(ImportError, dep.find_module, 'setuptools.non-existent')
|
||||
f,p,i = dep.find_module('setuptools.tests')
|
||||
f.close()
|
||||
|
||||
def testModuleExtract(self):
|
||||
if not hasattr(dep, 'get_module_constant'):
|
||||
# skip on non-bytecode platforms
|
||||
return
|
||||
|
||||
from email import __version__
|
||||
self.assertEqual(
|
||||
dep.get_module_constant('email','__version__'), __version__
|
||||
)
|
||||
self.assertEqual(
|
||||
dep.get_module_constant('sys','version'), sys.version
|
||||
)
|
||||
self.assertEqual(
|
||||
dep.get_module_constant('setuptools.tests','__doc__'),__doc__
|
||||
)
|
||||
|
||||
def testRequire(self):
|
||||
if not hasattr(dep, 'extract_constant'):
|
||||
# skip on non-bytecode platformsh
|
||||
return
|
||||
|
||||
req = Require('Email','1.0.3','email')
|
||||
|
||||
self.assertEqual(req.name, 'Email')
|
||||
self.assertEqual(req.module, 'email')
|
||||
self.assertEqual(req.requested_version, '1.0.3')
|
||||
self.assertEqual(req.attribute, '__version__')
|
||||
self.assertEqual(req.full_name(), 'Email-1.0.3')
|
||||
|
||||
from email import __version__
|
||||
self.assertEqual(req.get_version(), __version__)
|
||||
self.assertTrue(req.version_ok('1.0.9'))
|
||||
self.assertTrue(not req.version_ok('0.9.1'))
|
||||
self.assertTrue(not req.version_ok('unknown'))
|
||||
|
||||
self.assertTrue(req.is_present())
|
||||
self.assertTrue(req.is_current())
|
||||
|
||||
req = Require('Email 3000','03000','email',format=LooseVersion)
|
||||
self.assertTrue(req.is_present())
|
||||
self.assertTrue(not req.is_current())
|
||||
self.assertTrue(not req.version_ok('unknown'))
|
||||
|
||||
req = Require('Do-what-I-mean','1.0','d-w-i-m')
|
||||
self.assertTrue(not req.is_present())
|
||||
self.assertTrue(not req.is_current())
|
||||
|
||||
req = Require('Tests', None, 'tests', homepage="http://example.com")
|
||||
self.assertEqual(req.format, None)
|
||||
self.assertEqual(req.attribute, None)
|
||||
self.assertEqual(req.requested_version, None)
|
||||
self.assertEqual(req.full_name(), 'Tests')
|
||||
self.assertEqual(req.homepage, 'http://example.com')
|
||||
|
||||
paths = [os.path.dirname(p) for p in __path__]
|
||||
self.assertTrue(req.is_present(paths))
|
||||
self.assertTrue(req.is_current(paths))
|
||||
|
||||
|
||||
class DistroTests(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.e1 = Extension('bar.ext',['bar.c'])
|
||||
self.e2 = Extension('c.y', ['y.c'])
|
||||
|
||||
self.dist = makeSetup(
|
||||
packages=['a', 'a.b', 'a.b.c', 'b', 'c'],
|
||||
py_modules=['b.d','x'],
|
||||
ext_modules = (self.e1, self.e2),
|
||||
package_dir = {},
|
||||
)
|
||||
|
||||
def testDistroType(self):
|
||||
self.assertTrue(isinstance(self.dist,setuptools.dist.Distribution))
|
||||
|
||||
def testExcludePackage(self):
|
||||
self.dist.exclude_package('a')
|
||||
self.assertEqual(self.dist.packages, ['b','c'])
|
||||
|
||||
self.dist.exclude_package('b')
|
||||
self.assertEqual(self.dist.packages, ['c'])
|
||||
self.assertEqual(self.dist.py_modules, ['x'])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e1, self.e2])
|
||||
|
||||
self.dist.exclude_package('c')
|
||||
self.assertEqual(self.dist.packages, [])
|
||||
self.assertEqual(self.dist.py_modules, ['x'])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e1])
|
||||
|
||||
# test removals from unspecified options
|
||||
makeSetup().exclude_package('x')
|
||||
|
||||
def testIncludeExclude(self):
|
||||
# remove an extension
|
||||
self.dist.exclude(ext_modules=[self.e1])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e2])
|
||||
|
||||
# add it back in
|
||||
self.dist.include(ext_modules=[self.e1])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e2, self.e1])
|
||||
|
||||
# should not add duplicate
|
||||
self.dist.include(ext_modules=[self.e1])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e2, self.e1])
|
||||
|
||||
def testExcludePackages(self):
|
||||
self.dist.exclude(packages=['c','b','a'])
|
||||
self.assertEqual(self.dist.packages, [])
|
||||
self.assertEqual(self.dist.py_modules, ['x'])
|
||||
self.assertEqual(self.dist.ext_modules, [self.e1])
|
||||
|
||||
def testEmpty(self):
|
||||
dist = makeSetup()
|
||||
dist.include(packages=['a'], py_modules=['b'], ext_modules=[self.e2])
|
||||
dist = makeSetup()
|
||||
dist.exclude(packages=['a'], py_modules=['b'], ext_modules=[self.e2])
|
||||
|
||||
def testContents(self):
|
||||
self.assertTrue(self.dist.has_contents_for('a'))
|
||||
self.dist.exclude_package('a')
|
||||
self.assertTrue(not self.dist.has_contents_for('a'))
|
||||
|
||||
self.assertTrue(self.dist.has_contents_for('b'))
|
||||
self.dist.exclude_package('b')
|
||||
self.assertTrue(not self.dist.has_contents_for('b'))
|
||||
|
||||
self.assertTrue(self.dist.has_contents_for('c'))
|
||||
self.dist.exclude_package('c')
|
||||
self.assertTrue(not self.dist.has_contents_for('c'))
|
||||
|
||||
def testInvalidIncludeExclude(self):
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.include, nonexistent_option='x'
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.exclude, nonexistent_option='x'
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.include, packages={'x':'y'}
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.exclude, packages={'x':'y'}
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.include, ext_modules={'x':'y'}
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.exclude, ext_modules={'x':'y'}
|
||||
)
|
||||
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.include, package_dir=['q']
|
||||
)
|
||||
self.assertRaises(DistutilsSetupError,
|
||||
self.dist.exclude, package_dir=['q']
|
||||
)
|
||||
|
||||
|
||||
class FeatureTests(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.req = Require('Distutils','1.0.3','distutils')
|
||||
self.dist = makeSetup(
|
||||
features={
|
||||
'foo': Feature("foo",standard=True,require_features=['baz',self.req]),
|
||||
'bar': Feature("bar", standard=True, packages=['pkg.bar'],
|
||||
py_modules=['bar_et'], remove=['bar.ext'],
|
||||
),
|
||||
'baz': Feature(
|
||||
"baz", optional=False, packages=['pkg.baz'],
|
||||
scripts = ['scripts/baz_it'],
|
||||
libraries=[('libfoo','foo/foofoo.c')]
|
||||
),
|
||||
'dwim': Feature("DWIM", available=False, remove='bazish'),
|
||||
},
|
||||
script_args=['--without-bar', 'install'],
|
||||
packages = ['pkg.bar', 'pkg.foo'],
|
||||
py_modules = ['bar_et', 'bazish'],
|
||||
ext_modules = [Extension('bar.ext',['bar.c'])]
|
||||
)
|
||||
|
||||
def testDefaults(self):
|
||||
self.assertTrue(not
|
||||
Feature(
|
||||
"test",standard=True,remove='x',available=False
|
||||
).include_by_default()
|
||||
)
|
||||
self.assertTrue(
|
||||
Feature("test",standard=True,remove='x').include_by_default()
|
||||
)
|
||||
# Feature must have either kwargs, removes, or require_features
|
||||
self.assertRaises(DistutilsSetupError, Feature, "test")
|
||||
|
||||
def testAvailability(self):
|
||||
self.assertRaises(
|
||||
DistutilsPlatformError,
|
||||
self.dist.features['dwim'].include_in, self.dist
|
||||
)
|
||||
|
||||
def testFeatureOptions(self):
|
||||
dist = self.dist
|
||||
self.assertTrue(
|
||||
('with-dwim',None,'include DWIM') in dist.feature_options
|
||||
)
|
||||
self.assertTrue(
|
||||
('without-dwim',None,'exclude DWIM (default)') in dist.feature_options
|
||||
)
|
||||
self.assertTrue(
|
||||
('with-bar',None,'include bar (default)') in dist.feature_options
|
||||
)
|
||||
self.assertTrue(
|
||||
('without-bar',None,'exclude bar') in dist.feature_options
|
||||
)
|
||||
self.assertEqual(dist.feature_negopt['without-foo'],'with-foo')
|
||||
self.assertEqual(dist.feature_negopt['without-bar'],'with-bar')
|
||||
self.assertEqual(dist.feature_negopt['without-dwim'],'with-dwim')
|
||||
self.assertTrue(not 'without-baz' in dist.feature_negopt)
|
||||
|
||||
def testUseFeatures(self):
|
||||
dist = self.dist
|
||||
self.assertEqual(dist.with_foo,1)
|
||||
self.assertEqual(dist.with_bar,0)
|
||||
self.assertEqual(dist.with_baz,1)
|
||||
self.assertTrue(not 'bar_et' in dist.py_modules)
|
||||
self.assertTrue(not 'pkg.bar' in dist.packages)
|
||||
self.assertTrue('pkg.baz' in dist.packages)
|
||||
self.assertTrue('scripts/baz_it' in dist.scripts)
|
||||
self.assertTrue(('libfoo','foo/foofoo.c') in dist.libraries)
|
||||
self.assertEqual(dist.ext_modules,[])
|
||||
self.assertEqual(dist.require_features, [self.req])
|
||||
|
||||
# If we ask for bar, it should fail because we explicitly disabled
|
||||
# it on the command line
|
||||
self.assertRaises(DistutilsOptionError, dist.include_feature, 'bar')
|
||||
|
||||
def testFeatureWithInvalidRemove(self):
|
||||
self.assertRaises(
|
||||
SystemExit, makeSetup, features = {'x':Feature('x', remove='y')}
|
||||
)
|
||||
|
||||
class TestCommandTests(unittest.TestCase):
|
||||
|
||||
def testTestIsCommand(self):
|
||||
test_cmd = makeSetup().get_command_obj('test')
|
||||
self.assertTrue(isinstance(test_cmd, distutils.cmd.Command))
|
||||
|
||||
def testLongOptSuiteWNoDefault(self):
|
||||
ts1 = makeSetup(script_args=['test','--test-suite=foo.tests.suite'])
|
||||
ts1 = ts1.get_command_obj('test')
|
||||
ts1.ensure_finalized()
|
||||
self.assertEqual(ts1.test_suite, 'foo.tests.suite')
|
||||
|
||||
def testDefaultSuite(self):
|
||||
ts2 = makeSetup(test_suite='bar.tests.suite').get_command_obj('test')
|
||||
ts2.ensure_finalized()
|
||||
self.assertEqual(ts2.test_suite, 'bar.tests.suite')
|
||||
|
||||
def testDefaultWModuleOnCmdLine(self):
|
||||
ts3 = makeSetup(
|
||||
test_suite='bar.tests',
|
||||
script_args=['test','-m','foo.tests']
|
||||
).get_command_obj('test')
|
||||
ts3.ensure_finalized()
|
||||
self.assertEqual(ts3.test_module, 'foo.tests')
|
||||
self.assertEqual(ts3.test_suite, 'foo.tests.test_suite')
|
||||
|
||||
def testConflictingOptions(self):
|
||||
ts4 = makeSetup(
|
||||
script_args=['test','-m','bar.tests', '-s','foo.tests.suite']
|
||||
).get_command_obj('test')
|
||||
self.assertRaises(DistutilsOptionError, ts4.ensure_finalized)
|
||||
|
||||
def testNoSuite(self):
|
||||
ts5 = makeSetup().get_command_obj('test')
|
||||
ts5.ensure_finalized()
|
||||
self.assertEqual(ts5.test_suite, None)
|
2683
lib/python3.13/site-packages/setuptools/tests/doctest.py
Normal file
2683
lib/python3.13/site-packages/setuptools/tests/doctest.py
Normal file
File diff suppressed because it is too large
Load Diff
165
lib/python3.13/site-packages/setuptools/tests/environment.py
Normal file
165
lib/python3.13/site-packages/setuptools/tests/environment.py
Normal file
@ -0,0 +1,165 @@
|
||||
import os
|
||||
import zipfile
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
import shutil
|
||||
import stat
|
||||
import unicodedata
|
||||
|
||||
from subprocess import Popen as _Popen, PIPE as _PIPE
|
||||
|
||||
|
||||
def _extract(self, member, path=None, pwd=None):
|
||||
"""for zipfile py2.5 borrowed from cpython"""
|
||||
if not isinstance(member, zipfile.ZipInfo):
|
||||
member = self.getinfo(member)
|
||||
|
||||
if path is None:
|
||||
path = os.getcwd()
|
||||
|
||||
return _extract_member(self, member, path, pwd)
|
||||
|
||||
|
||||
def _extract_from_zip(self, name, dest_path):
|
||||
dest_file = open(dest_path, 'wb')
|
||||
try:
|
||||
dest_file.write(self.read(name))
|
||||
finally:
|
||||
dest_file.close()
|
||||
|
||||
|
||||
def _extract_member(self, member, targetpath, pwd):
|
||||
"""for zipfile py2.5 borrowed from cpython"""
|
||||
# build the destination pathname, replacing
|
||||
# forward slashes to platform specific separators.
|
||||
# Strip trailing path separator, unless it represents the root.
|
||||
if (targetpath[-1:] in (os.path.sep, os.path.altsep)
|
||||
and len(os.path.splitdrive(targetpath)[1]) > 1):
|
||||
targetpath = targetpath[:-1]
|
||||
|
||||
# don't include leading "/" from file name if present
|
||||
if member.filename[0] == '/':
|
||||
targetpath = os.path.join(targetpath, member.filename[1:])
|
||||
else:
|
||||
targetpath = os.path.join(targetpath, member.filename)
|
||||
|
||||
targetpath = os.path.normpath(targetpath)
|
||||
|
||||
# Create all upper directories if necessary.
|
||||
upperdirs = os.path.dirname(targetpath)
|
||||
if upperdirs and not os.path.exists(upperdirs):
|
||||
os.makedirs(upperdirs)
|
||||
|
||||
if member.filename[-1] == '/':
|
||||
if not os.path.isdir(targetpath):
|
||||
os.mkdir(targetpath)
|
||||
return targetpath
|
||||
|
||||
_extract_from_zip(self, member.filename, targetpath)
|
||||
|
||||
return targetpath
|
||||
|
||||
|
||||
def _remove_dir(target):
|
||||
|
||||
#on windows this seems to a problem
|
||||
for dir_path, dirs, files in os.walk(target):
|
||||
os.chmod(dir_path, stat.S_IWRITE)
|
||||
for filename in files:
|
||||
os.chmod(os.path.join(dir_path, filename), stat.S_IWRITE)
|
||||
shutil.rmtree(target)
|
||||
|
||||
|
||||
class ZippedEnvironment(unittest.TestCase):
|
||||
|
||||
datafile = None
|
||||
dataname = None
|
||||
old_cwd = None
|
||||
|
||||
def setUp(self):
|
||||
if self.datafile is None or self.dataname is None:
|
||||
return
|
||||
|
||||
if not os.path.isfile(self.datafile):
|
||||
self.old_cwd = None
|
||||
return
|
||||
|
||||
self.old_cwd = os.getcwd()
|
||||
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
zip_file, source, target = [None, None, None]
|
||||
try:
|
||||
zip_file = zipfile.ZipFile(self.datafile)
|
||||
for files in zip_file.namelist():
|
||||
_extract(zip_file, files, self.temp_dir)
|
||||
finally:
|
||||
if zip_file:
|
||||
zip_file.close()
|
||||
del zip_file
|
||||
|
||||
os.chdir(os.path.join(self.temp_dir, self.dataname))
|
||||
|
||||
def tearDown(self):
|
||||
#Assume setUp was never completed
|
||||
if self.dataname is None or self.datafile is None:
|
||||
return
|
||||
|
||||
try:
|
||||
if self.old_cwd:
|
||||
os.chdir(self.old_cwd)
|
||||
_remove_dir(self.temp_dir)
|
||||
except OSError:
|
||||
#sigh?
|
||||
pass
|
||||
|
||||
|
||||
def _which_dirs(cmd):
|
||||
result = set()
|
||||
for path in os.environ.get('PATH', '').split(os.pathsep):
|
||||
filename = os.path.join(path, cmd)
|
||||
if os.access(filename, os.X_OK):
|
||||
result.add(path)
|
||||
return result
|
||||
|
||||
|
||||
def run_setup_py(cmd, pypath=None, path=None,
|
||||
data_stream=0, env=None):
|
||||
"""
|
||||
Execution command for tests, separate from those used by the
|
||||
code directly to prevent accidental behavior issues
|
||||
"""
|
||||
if env is None:
|
||||
env = dict()
|
||||
for envname in os.environ:
|
||||
env[envname] = os.environ[envname]
|
||||
|
||||
#override the python path if needed
|
||||
if pypath is not None:
|
||||
env["PYTHONPATH"] = pypath
|
||||
|
||||
#overide the execution path if needed
|
||||
if path is not None:
|
||||
env["PATH"] = path
|
||||
if not env.get("PATH", ""):
|
||||
env["PATH"] = _which_dirs("tar").union(_which_dirs("gzip"))
|
||||
env["PATH"] = os.pathsep.join(env["PATH"])
|
||||
|
||||
cmd = [sys.executable, "setup.py"] + list(cmd)
|
||||
|
||||
#regarding the shell argument, see: http://bugs.python.org/issue8557
|
||||
try:
|
||||
proc = _Popen(cmd, stdout=_PIPE, stderr=_PIPE,
|
||||
shell=(sys.platform == 'win32'), env=env)
|
||||
|
||||
data = proc.communicate()[data_stream]
|
||||
except OSError:
|
||||
return 1, ''
|
||||
|
||||
#decode the console string if needed
|
||||
if hasattr(data, "decode"):
|
||||
data = data.decode() # should use the preffered encoding
|
||||
data = unicodedata.normalize('NFC', data)
|
||||
|
||||
#communciate calls wait()
|
||||
return proc.returncode, data
|
14
lib/python3.13/site-packages/setuptools/tests/py26compat.py
Normal file
14
lib/python3.13/site-packages/setuptools/tests/py26compat.py
Normal file
@ -0,0 +1,14 @@
|
||||
import unittest
|
||||
|
||||
try:
|
||||
# provide skipIf for Python 2.4-2.6
|
||||
skipIf = unittest.skipIf
|
||||
except AttributeError:
|
||||
def skipIf(condition, reason):
|
||||
def skipper(func):
|
||||
def skip(*args, **kwargs):
|
||||
return
|
||||
if condition:
|
||||
return skip
|
||||
return func
|
||||
return skipper
|
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
result = 'passed'
|
82
lib/python3.13/site-packages/setuptools/tests/server.py
Normal file
82
lib/python3.13/site-packages/setuptools/tests/server.py
Normal file
@ -0,0 +1,82 @@
|
||||
"""Basic http server for tests to simulate PyPI or custom indexes
|
||||
"""
|
||||
import sys
|
||||
import time
|
||||
import threading
|
||||
from setuptools.compat import BaseHTTPRequestHandler
|
||||
from setuptools.compat import (urllib2, URLError, HTTPServer,
|
||||
SimpleHTTPRequestHandler)
|
||||
|
||||
class IndexServer(HTTPServer):
|
||||
"""Basic single-threaded http server simulating a package index
|
||||
|
||||
You can use this server in unittest like this::
|
||||
s = IndexServer()
|
||||
s.start()
|
||||
index_url = s.base_url() + 'mytestindex'
|
||||
# do some test requests to the index
|
||||
# The index files should be located in setuptools/tests/indexes
|
||||
s.stop()
|
||||
"""
|
||||
def __init__(self, server_address=('', 0),
|
||||
RequestHandlerClass=SimpleHTTPRequestHandler):
|
||||
HTTPServer.__init__(self, server_address, RequestHandlerClass)
|
||||
self._run = True
|
||||
|
||||
def serve(self):
|
||||
while self._run:
|
||||
self.handle_request()
|
||||
|
||||
def start(self):
|
||||
self.thread = threading.Thread(target=self.serve)
|
||||
self.thread.start()
|
||||
|
||||
def stop(self):
|
||||
"Stop the server"
|
||||
|
||||
# Let the server finish the last request and wait for a new one.
|
||||
time.sleep(0.1)
|
||||
|
||||
# self.shutdown is not supported on python < 2.6, so just
|
||||
# set _run to false, and make a request, causing it to
|
||||
# terminate.
|
||||
self._run = False
|
||||
url = 'http://127.0.0.1:%(server_port)s/' % vars(self)
|
||||
try:
|
||||
if sys.version_info >= (2, 6):
|
||||
urllib2.urlopen(url, timeout=5)
|
||||
else:
|
||||
urllib2.urlopen(url)
|
||||
except URLError:
|
||||
# ignore any errors; all that's important is the request
|
||||
pass
|
||||
self.thread.join()
|
||||
self.socket.close()
|
||||
|
||||
def base_url(self):
|
||||
port = self.server_port
|
||||
return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port
|
||||
|
||||
class RequestRecorder(BaseHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
requests = vars(self.server).setdefault('requests', [])
|
||||
requests.append(self)
|
||||
self.send_response(200, 'OK')
|
||||
|
||||
class MockServer(HTTPServer, threading.Thread):
|
||||
"""
|
||||
A simple HTTP Server that records the requests made to it.
|
||||
"""
|
||||
def __init__(self, server_address=('', 0),
|
||||
RequestHandlerClass=RequestRecorder):
|
||||
HTTPServer.__init__(self, server_address, RequestHandlerClass)
|
||||
threading.Thread.__init__(self)
|
||||
self.setDaemon(True)
|
||||
self.requests = []
|
||||
|
||||
def run(self):
|
||||
self.serve_forever()
|
||||
|
||||
def url(self):
|
||||
return 'http://localhost:%(server_port)s/' % vars(self)
|
||||
url = property(url)
|
@ -0,0 +1,72 @@
|
||||
"""develop tests
|
||||
"""
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import site
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from distutils.errors import DistutilsError
|
||||
from setuptools.compat import StringIO
|
||||
from setuptools.command.bdist_egg import bdist_egg
|
||||
from setuptools.command import easy_install as easy_install_pkg
|
||||
from setuptools.dist import Distribution
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(name='foo', py_modules=['hi'])
|
||||
"""
|
||||
|
||||
class TestDevelopTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.dir = tempfile.mkdtemp()
|
||||
self.old_cwd = os.getcwd()
|
||||
os.chdir(self.dir)
|
||||
f = open('setup.py', 'w')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
f = open('hi.py', 'w')
|
||||
f.write('1\n')
|
||||
f.close()
|
||||
if sys.version >= "2.6":
|
||||
self.old_base = site.USER_BASE
|
||||
site.USER_BASE = tempfile.mkdtemp()
|
||||
self.old_site = site.USER_SITE
|
||||
site.USER_SITE = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.dir)
|
||||
if sys.version >= "2.6":
|
||||
shutil.rmtree(site.USER_BASE)
|
||||
shutil.rmtree(site.USER_SITE)
|
||||
site.USER_BASE = self.old_base
|
||||
site.USER_SITE = self.old_site
|
||||
|
||||
def test_bdist_egg(self):
|
||||
dist = Distribution(dict(
|
||||
script_name='setup.py',
|
||||
script_args=['bdist_egg'],
|
||||
name='foo',
|
||||
py_modules=['hi']
|
||||
))
|
||||
os.makedirs(os.path.join('build', 'src'))
|
||||
old_stdout = sys.stdout
|
||||
sys.stdout = o = StringIO()
|
||||
try:
|
||||
dist.parse_command_line()
|
||||
dist.run_commands()
|
||||
finally:
|
||||
sys.stdout = old_stdout
|
||||
|
||||
# let's see if we got our egg link at the right place
|
||||
[content] = os.listdir('dist')
|
||||
self.assertTrue(re.match('foo-0.0.0-py[23].\d.egg$', content))
|
||||
|
||||
def test_suite():
|
||||
return unittest.makeSuite(TestDevelopTest)
|
||||
|
@ -0,0 +1,19 @@
|
||||
"""build_ext tests
|
||||
"""
|
||||
import unittest
|
||||
from distutils.command.build_ext import build_ext as distutils_build_ext
|
||||
from setuptools.command.build_ext import build_ext
|
||||
from setuptools.dist import Distribution
|
||||
|
||||
class TestBuildExtTest(unittest.TestCase):
|
||||
|
||||
def test_get_ext_filename(self):
|
||||
# setuptools needs to give back the same
|
||||
# result than distutils, even if the fullname
|
||||
# is not in ext_map
|
||||
dist = Distribution()
|
||||
cmd = build_ext(dist)
|
||||
cmd.ext_map['foo/bar'] = ''
|
||||
res = cmd.get_ext_filename('foo')
|
||||
wanted = distutils_build_ext.get_ext_filename(cmd, 'foo')
|
||||
assert res == wanted
|
124
lib/python3.13/site-packages/setuptools/tests/test_develop.py
Normal file
124
lib/python3.13/site-packages/setuptools/tests/test_develop.py
Normal file
@ -0,0 +1,124 @@
|
||||
"""develop tests
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
import site
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from distutils.errors import DistutilsError
|
||||
from setuptools.command.develop import develop
|
||||
from setuptools.command import easy_install as easy_install_pkg
|
||||
from setuptools.compat import StringIO
|
||||
from setuptools.dist import Distribution
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(name='foo',
|
||||
packages=['foo'],
|
||||
use_2to3=True,
|
||||
)
|
||||
"""
|
||||
|
||||
INIT_PY = """print "foo"
|
||||
"""
|
||||
|
||||
class TestDevelopTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
|
||||
return
|
||||
|
||||
# Directory structure
|
||||
self.dir = tempfile.mkdtemp()
|
||||
os.mkdir(os.path.join(self.dir, 'foo'))
|
||||
# setup.py
|
||||
setup = os.path.join(self.dir, 'setup.py')
|
||||
f = open(setup, 'w')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
self.old_cwd = os.getcwd()
|
||||
# foo/__init__.py
|
||||
init = os.path.join(self.dir, 'foo', '__init__.py')
|
||||
f = open(init, 'w')
|
||||
f.write(INIT_PY)
|
||||
f.close()
|
||||
|
||||
os.chdir(self.dir)
|
||||
self.old_base = site.USER_BASE
|
||||
site.USER_BASE = tempfile.mkdtemp()
|
||||
self.old_site = site.USER_SITE
|
||||
site.USER_SITE = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
|
||||
return
|
||||
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.dir)
|
||||
shutil.rmtree(site.USER_BASE)
|
||||
shutil.rmtree(site.USER_SITE)
|
||||
site.USER_BASE = self.old_base
|
||||
site.USER_SITE = self.old_site
|
||||
|
||||
def test_develop(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
|
||||
return
|
||||
dist = Distribution(
|
||||
dict(name='foo',
|
||||
packages=['foo'],
|
||||
use_2to3=True,
|
||||
version='0.0',
|
||||
))
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = develop(dist)
|
||||
cmd.user = 1
|
||||
cmd.ensure_finalized()
|
||||
cmd.install_dir = site.USER_SITE
|
||||
cmd.user = 1
|
||||
old_stdout = sys.stdout
|
||||
#sys.stdout = StringIO()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
sys.stdout = old_stdout
|
||||
|
||||
# let's see if we got our egg link at the right place
|
||||
content = os.listdir(site.USER_SITE)
|
||||
content.sort()
|
||||
self.assertEqual(content, ['easy-install.pth', 'foo.egg-link'])
|
||||
|
||||
# Check that we are using the right code.
|
||||
egg_link_file = open(os.path.join(site.USER_SITE, 'foo.egg-link'), 'rt')
|
||||
try:
|
||||
path = egg_link_file.read().split()[0].strip()
|
||||
finally:
|
||||
egg_link_file.close()
|
||||
init_file = open(os.path.join(path, 'foo', '__init__.py'), 'rt')
|
||||
try:
|
||||
init = init_file.read().strip()
|
||||
finally:
|
||||
init_file.close()
|
||||
if sys.version < "3":
|
||||
self.assertEqual(init, 'print "foo"')
|
||||
else:
|
||||
self.assertEqual(init, 'print("foo")')
|
||||
|
||||
def notest_develop_with_setup_requires(self):
|
||||
|
||||
wanted = ("Could not find suitable distribution for "
|
||||
"Requirement.parse('I-DONT-EXIST')")
|
||||
old_dir = os.getcwd()
|
||||
os.chdir(self.dir)
|
||||
try:
|
||||
try:
|
||||
dist = Distribution({'setup_requires': ['I_DONT_EXIST']})
|
||||
except DistutilsError:
|
||||
e = sys.exc_info()[1]
|
||||
error = str(e)
|
||||
if error == wanted:
|
||||
pass
|
||||
finally:
|
||||
os.chdir(old_dir)
|
@ -0,0 +1,83 @@
|
||||
"""Test .dist-info style distributions.
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import unittest
|
||||
import textwrap
|
||||
|
||||
try:
|
||||
import ast
|
||||
except:
|
||||
pass
|
||||
|
||||
import pkg_resources
|
||||
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
|
||||
def DALS(s):
|
||||
"dedent and left-strip"
|
||||
return textwrap.dedent(s).lstrip()
|
||||
|
||||
class TestDistInfo(unittest.TestCase):
|
||||
|
||||
def test_distinfo(self):
|
||||
dists = {}
|
||||
for d in pkg_resources.find_distributions(self.tmpdir):
|
||||
dists[d.project_name] = d
|
||||
|
||||
assert len(dists) == 2, dists
|
||||
|
||||
unversioned = dists['UnversionedDistribution']
|
||||
versioned = dists['VersionedDistribution']
|
||||
|
||||
assert versioned.version == '2.718' # from filename
|
||||
assert unversioned.version == '0.3' # from METADATA
|
||||
|
||||
@skipIf('ast' not in globals(),
|
||||
"ast is used to test conditional dependencies (Python >= 2.6)")
|
||||
def test_conditional_dependencies(self):
|
||||
requires = [pkg_resources.Requirement.parse('splort==4'),
|
||||
pkg_resources.Requirement.parse('quux>=1.1')]
|
||||
|
||||
for d in pkg_resources.find_distributions(self.tmpdir):
|
||||
self.assertEqual(d.requires(), requires[:1])
|
||||
self.assertEqual(d.requires(extras=('baz',)), requires)
|
||||
self.assertEqual(d.extras, ['baz'])
|
||||
|
||||
def setUp(self):
|
||||
self.tmpdir = tempfile.mkdtemp()
|
||||
versioned = os.path.join(self.tmpdir,
|
||||
'VersionedDistribution-2.718.dist-info')
|
||||
os.mkdir(versioned)
|
||||
metadata_file = open(os.path.join(versioned, 'METADATA'), 'w+')
|
||||
try:
|
||||
metadata_file.write(DALS(
|
||||
"""
|
||||
Metadata-Version: 1.2
|
||||
Name: VersionedDistribution
|
||||
Requires-Dist: splort (4)
|
||||
Provides-Extra: baz
|
||||
Requires-Dist: quux (>=1.1); extra == 'baz'
|
||||
"""))
|
||||
finally:
|
||||
metadata_file.close()
|
||||
unversioned = os.path.join(self.tmpdir,
|
||||
'UnversionedDistribution.dist-info')
|
||||
os.mkdir(unversioned)
|
||||
metadata_file = open(os.path.join(unversioned, 'METADATA'), 'w+')
|
||||
try:
|
||||
metadata_file.write(DALS(
|
||||
"""
|
||||
Metadata-Version: 1.2
|
||||
Name: UnversionedDistribution
|
||||
Version: 0.3
|
||||
Requires-Dist: splort (==4)
|
||||
Provides-Extra: baz
|
||||
Requires-Dist: quux (>=1.1); extra == 'baz'
|
||||
"""))
|
||||
finally:
|
||||
metadata_file.close()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.tmpdir)
|
@ -0,0 +1,457 @@
|
||||
"""Easy install Tests
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import unittest
|
||||
import site
|
||||
import contextlib
|
||||
import textwrap
|
||||
import tarfile
|
||||
import logging
|
||||
import distutils.core
|
||||
|
||||
from setuptools.compat import StringIO, BytesIO, next, urlparse
|
||||
from setuptools.sandbox import run_setup, SandboxViolation
|
||||
from setuptools.command.easy_install import (
|
||||
easy_install, fix_jython_executable, get_script_args, nt_quote_arg)
|
||||
from setuptools.command.easy_install import PthDistributions
|
||||
from setuptools.command import easy_install as easy_install_pkg
|
||||
from setuptools.dist import Distribution
|
||||
from pkg_resources import working_set, VersionConflict
|
||||
from pkg_resources import Distribution as PRDistribution
|
||||
import setuptools.tests.server
|
||||
import pkg_resources
|
||||
|
||||
class FakeDist(object):
|
||||
def get_entry_map(self, group):
|
||||
if group != 'console_scripts':
|
||||
return {}
|
||||
return {'name': 'ep'}
|
||||
|
||||
def as_requirement(self):
|
||||
return 'spec'
|
||||
|
||||
WANTED = """\
|
||||
#!%s
|
||||
# EASY-INSTALL-ENTRY-SCRIPT: 'spec','console_scripts','name'
|
||||
__requires__ = 'spec'
|
||||
import sys
|
||||
from pkg_resources import load_entry_point
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(
|
||||
load_entry_point('spec', 'console_scripts', 'name')()
|
||||
)
|
||||
""" % nt_quote_arg(fix_jython_executable(sys.executable, ""))
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(name='foo')
|
||||
"""
|
||||
|
||||
class TestEasyInstallTest(unittest.TestCase):
|
||||
|
||||
def test_install_site_py(self):
|
||||
dist = Distribution()
|
||||
cmd = easy_install(dist)
|
||||
cmd.sitepy_installed = False
|
||||
cmd.install_dir = tempfile.mkdtemp()
|
||||
try:
|
||||
cmd.install_site_py()
|
||||
sitepy = os.path.join(cmd.install_dir, 'site.py')
|
||||
self.assertTrue(os.path.exists(sitepy))
|
||||
finally:
|
||||
shutil.rmtree(cmd.install_dir)
|
||||
|
||||
def test_get_script_args(self):
|
||||
dist = FakeDist()
|
||||
|
||||
old_platform = sys.platform
|
||||
try:
|
||||
name, script = [i for i in next(get_script_args(dist))][0:2]
|
||||
finally:
|
||||
sys.platform = old_platform
|
||||
|
||||
self.assertEqual(script, WANTED)
|
||||
|
||||
def test_no_find_links(self):
|
||||
# new option '--no-find-links', that blocks find-links added at
|
||||
# the project level
|
||||
dist = Distribution()
|
||||
cmd = easy_install(dist)
|
||||
cmd.check_pth_processing = lambda: True
|
||||
cmd.no_find_links = True
|
||||
cmd.find_links = ['link1', 'link2']
|
||||
cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok')
|
||||
cmd.args = ['ok']
|
||||
cmd.ensure_finalized()
|
||||
self.assertEqual(cmd.package_index.scanned_urls, {})
|
||||
|
||||
# let's try without it (default behavior)
|
||||
cmd = easy_install(dist)
|
||||
cmd.check_pth_processing = lambda: True
|
||||
cmd.find_links = ['link1', 'link2']
|
||||
cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok')
|
||||
cmd.args = ['ok']
|
||||
cmd.ensure_finalized()
|
||||
keys = sorted(cmd.package_index.scanned_urls.keys())
|
||||
self.assertEqual(keys, ['link1', 'link2'])
|
||||
|
||||
|
||||
class TestPTHFileWriter(unittest.TestCase):
|
||||
def test_add_from_cwd_site_sets_dirty(self):
|
||||
'''a pth file manager should set dirty
|
||||
if a distribution is in site but also the cwd
|
||||
'''
|
||||
pth = PthDistributions('does-not_exist', [os.getcwd()])
|
||||
self.assertTrue(not pth.dirty)
|
||||
pth.add(PRDistribution(os.getcwd()))
|
||||
self.assertTrue(pth.dirty)
|
||||
|
||||
def test_add_from_site_is_ignored(self):
|
||||
if os.name != 'nt':
|
||||
location = '/test/location/does-not-have-to-exist'
|
||||
else:
|
||||
location = 'c:\\does_not_exist'
|
||||
pth = PthDistributions('does-not_exist', [location, ])
|
||||
self.assertTrue(not pth.dirty)
|
||||
pth.add(PRDistribution(location))
|
||||
self.assertTrue(not pth.dirty)
|
||||
|
||||
|
||||
class TestUserInstallTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.dir = tempfile.mkdtemp()
|
||||
setup = os.path.join(self.dir, 'setup.py')
|
||||
f = open(setup, 'w')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
self.old_cwd = os.getcwd()
|
||||
os.chdir(self.dir)
|
||||
|
||||
self.old_enable_site = site.ENABLE_USER_SITE
|
||||
self.old_file = easy_install_pkg.__file__
|
||||
self.old_base = site.USER_BASE
|
||||
site.USER_BASE = tempfile.mkdtemp()
|
||||
self.old_site = site.USER_SITE
|
||||
site.USER_SITE = tempfile.mkdtemp()
|
||||
easy_install_pkg.__file__ = site.USER_SITE
|
||||
|
||||
def tearDown(self):
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.dir)
|
||||
|
||||
shutil.rmtree(site.USER_BASE)
|
||||
shutil.rmtree(site.USER_SITE)
|
||||
site.USER_BASE = self.old_base
|
||||
site.USER_SITE = self.old_site
|
||||
site.ENABLE_USER_SITE = self.old_enable_site
|
||||
easy_install_pkg.__file__ = self.old_file
|
||||
|
||||
def test_user_install_implied(self):
|
||||
site.ENABLE_USER_SITE = True # disabled sometimes
|
||||
#XXX: replace with something meaningfull
|
||||
dist = Distribution()
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = easy_install(dist)
|
||||
cmd.args = ['py']
|
||||
cmd.ensure_finalized()
|
||||
self.assertTrue(cmd.user, 'user should be implied')
|
||||
|
||||
def test_multiproc_atexit(self):
|
||||
try:
|
||||
__import__('multiprocessing')
|
||||
except ImportError:
|
||||
# skip the test if multiprocessing is not available
|
||||
return
|
||||
|
||||
log = logging.getLogger('test_easy_install')
|
||||
logging.basicConfig(level=logging.INFO, stream=sys.stderr)
|
||||
log.info('this should not break')
|
||||
|
||||
def test_user_install_not_implied_without_usersite_enabled(self):
|
||||
site.ENABLE_USER_SITE = False # usually enabled
|
||||
#XXX: replace with something meaningfull
|
||||
dist = Distribution()
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = easy_install(dist)
|
||||
cmd.args = ['py']
|
||||
cmd.initialize_options()
|
||||
self.assertFalse(cmd.user, 'NOT user should be implied')
|
||||
|
||||
def test_local_index(self):
|
||||
# make sure the local index is used
|
||||
# when easy_install looks for installed
|
||||
# packages
|
||||
new_location = tempfile.mkdtemp()
|
||||
target = tempfile.mkdtemp()
|
||||
egg_file = os.path.join(new_location, 'foo-1.0.egg-info')
|
||||
f = open(egg_file, 'w')
|
||||
try:
|
||||
f.write('Name: foo\n')
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
sys.path.append(target)
|
||||
old_ppath = os.environ.get('PYTHONPATH')
|
||||
os.environ['PYTHONPATH'] = os.path.pathsep.join(sys.path)
|
||||
try:
|
||||
dist = Distribution()
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = easy_install(dist)
|
||||
cmd.install_dir = target
|
||||
cmd.args = ['foo']
|
||||
cmd.ensure_finalized()
|
||||
cmd.local_index.scan([new_location])
|
||||
res = cmd.easy_install('foo')
|
||||
actual = os.path.normcase(os.path.realpath(res.location))
|
||||
expected = os.path.normcase(os.path.realpath(new_location))
|
||||
self.assertEqual(actual, expected)
|
||||
finally:
|
||||
sys.path.remove(target)
|
||||
for basedir in [new_location, target, ]:
|
||||
if not os.path.exists(basedir) or not os.path.isdir(basedir):
|
||||
continue
|
||||
try:
|
||||
shutil.rmtree(basedir)
|
||||
except:
|
||||
pass
|
||||
if old_ppath is not None:
|
||||
os.environ['PYTHONPATH'] = old_ppath
|
||||
else:
|
||||
del os.environ['PYTHONPATH']
|
||||
|
||||
def test_setup_requires(self):
|
||||
"""Regression test for Distribute issue #318
|
||||
|
||||
Ensure that a package with setup_requires can be installed when
|
||||
setuptools is installed in the user site-packages without causing a
|
||||
SandboxViolation.
|
||||
"""
|
||||
|
||||
test_pkg = create_setup_requires_package(self.dir)
|
||||
test_setup_py = os.path.join(test_pkg, 'setup.py')
|
||||
|
||||
try:
|
||||
with quiet_context():
|
||||
with reset_setup_stop_context():
|
||||
run_setup(test_setup_py, ['install'])
|
||||
except SandboxViolation:
|
||||
self.fail('Installation caused SandboxViolation')
|
||||
|
||||
|
||||
class TestSetupRequires(unittest.TestCase):
|
||||
|
||||
def test_setup_requires_honors_fetch_params(self):
|
||||
"""
|
||||
When easy_install installs a source distribution which specifies
|
||||
setup_requires, it should honor the fetch parameters (such as
|
||||
allow-hosts, index-url, and find-links).
|
||||
"""
|
||||
# set up a server which will simulate an alternate package index.
|
||||
p_index = setuptools.tests.server.MockServer()
|
||||
p_index.start()
|
||||
netloc = 1
|
||||
p_index_loc = urlparse(p_index.url)[netloc]
|
||||
if p_index_loc.endswith(':0'):
|
||||
# Some platforms (Jython) don't find a port to which to bind,
|
||||
# so skip this test for them.
|
||||
return
|
||||
with quiet_context():
|
||||
# create an sdist that has a build-time dependency.
|
||||
with TestSetupRequires.create_sdist() as dist_file:
|
||||
with tempdir_context() as temp_install_dir:
|
||||
with environment_context(PYTHONPATH=temp_install_dir):
|
||||
ei_params = ['--index-url', p_index.url,
|
||||
'--allow-hosts', p_index_loc,
|
||||
'--exclude-scripts', '--install-dir', temp_install_dir,
|
||||
dist_file]
|
||||
with reset_setup_stop_context():
|
||||
with argv_context(['easy_install']):
|
||||
# attempt to install the dist. It should fail because
|
||||
# it doesn't exist.
|
||||
self.assertRaises(SystemExit,
|
||||
easy_install_pkg.main, ei_params)
|
||||
# there should have been two or three requests to the server
|
||||
# (three happens on Python 3.3a)
|
||||
self.assertTrue(2 <= len(p_index.requests) <= 3)
|
||||
self.assertEqual(p_index.requests[0].path, '/does-not-exist/')
|
||||
|
||||
@staticmethod
|
||||
@contextlib.contextmanager
|
||||
def create_sdist():
|
||||
"""
|
||||
Return an sdist with a setup_requires dependency (of something that
|
||||
doesn't exist)
|
||||
"""
|
||||
with tempdir_context() as dir:
|
||||
dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz')
|
||||
make_trivial_sdist(
|
||||
dist_path,
|
||||
textwrap.dedent("""
|
||||
import setuptools
|
||||
setuptools.setup(
|
||||
name="setuptools-test-fetcher",
|
||||
version="1.0",
|
||||
setup_requires = ['does-not-exist'],
|
||||
)
|
||||
""").lstrip())
|
||||
yield dist_path
|
||||
|
||||
def test_setup_requires_overrides_version_conflict(self):
|
||||
"""
|
||||
Regression test for issue #323.
|
||||
|
||||
Ensures that a distribution's setup_requires requirements can still be
|
||||
installed and used locally even if a conflicting version of that
|
||||
requirement is already on the path.
|
||||
"""
|
||||
|
||||
pr_state = pkg_resources.__getstate__()
|
||||
fake_dist = PRDistribution('does-not-matter', project_name='foobar',
|
||||
version='0.0')
|
||||
working_set.add(fake_dist)
|
||||
|
||||
try:
|
||||
with tempdir_context() as temp_dir:
|
||||
test_pkg = create_setup_requires_package(temp_dir)
|
||||
test_setup_py = os.path.join(test_pkg, 'setup.py')
|
||||
with quiet_context() as (stdout, stderr):
|
||||
with reset_setup_stop_context():
|
||||
try:
|
||||
# Don't even need to install the package, just
|
||||
# running the setup.py at all is sufficient
|
||||
run_setup(test_setup_py, ['--name'])
|
||||
except VersionConflict:
|
||||
self.fail('Installing setup.py requirements '
|
||||
'caused a VersionConflict')
|
||||
|
||||
lines = stdout.readlines()
|
||||
self.assertTrue(len(lines) > 0)
|
||||
self.assertTrue(lines[-1].strip(), 'test_pkg')
|
||||
finally:
|
||||
pkg_resources.__setstate__(pr_state)
|
||||
|
||||
|
||||
def create_setup_requires_package(path):
|
||||
"""Creates a source tree under path for a trivial test package that has a
|
||||
single requirement in setup_requires--a tarball for that requirement is
|
||||
also created and added to the dependency_links argument.
|
||||
"""
|
||||
|
||||
test_setup_attrs = {
|
||||
'name': 'test_pkg', 'version': '0.0',
|
||||
'setup_requires': ['foobar==0.1'],
|
||||
'dependency_links': [os.path.abspath(path)]
|
||||
}
|
||||
|
||||
test_pkg = os.path.join(path, 'test_pkg')
|
||||
test_setup_py = os.path.join(test_pkg, 'setup.py')
|
||||
os.mkdir(test_pkg)
|
||||
|
||||
f = open(test_setup_py, 'w')
|
||||
f.write(textwrap.dedent("""\
|
||||
import setuptools
|
||||
setuptools.setup(**%r)
|
||||
""" % test_setup_attrs))
|
||||
f.close()
|
||||
|
||||
foobar_path = os.path.join(path, 'foobar-0.1.tar.gz')
|
||||
make_trivial_sdist(
|
||||
foobar_path,
|
||||
textwrap.dedent("""\
|
||||
import setuptools
|
||||
setuptools.setup(
|
||||
name='foobar',
|
||||
version='0.1'
|
||||
)
|
||||
"""))
|
||||
|
||||
return test_pkg
|
||||
|
||||
|
||||
def make_trivial_sdist(dist_path, setup_py):
|
||||
"""Create a simple sdist tarball at dist_path, containing just a
|
||||
setup.py, the contents of which are provided by the setup_py string.
|
||||
"""
|
||||
|
||||
setup_py_file = tarfile.TarInfo(name='setup.py')
|
||||
try:
|
||||
# Python 3 (StringIO gets converted to io module)
|
||||
MemFile = BytesIO
|
||||
except AttributeError:
|
||||
MemFile = StringIO
|
||||
setup_py_bytes = MemFile(setup_py.encode('utf-8'))
|
||||
setup_py_file.size = len(setup_py_bytes.getvalue())
|
||||
dist = tarfile.open(dist_path, 'w:gz')
|
||||
try:
|
||||
dist.addfile(setup_py_file, fileobj=setup_py_bytes)
|
||||
finally:
|
||||
dist.close()
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tempdir_context(cd=lambda dir:None):
|
||||
temp_dir = tempfile.mkdtemp()
|
||||
orig_dir = os.getcwd()
|
||||
try:
|
||||
cd(temp_dir)
|
||||
yield temp_dir
|
||||
finally:
|
||||
cd(orig_dir)
|
||||
shutil.rmtree(temp_dir)
|
||||
|
||||
@contextlib.contextmanager
|
||||
def environment_context(**updates):
|
||||
old_env = os.environ.copy()
|
||||
os.environ.update(updates)
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
for key in updates:
|
||||
del os.environ[key]
|
||||
os.environ.update(old_env)
|
||||
|
||||
@contextlib.contextmanager
|
||||
def argv_context(repl):
|
||||
old_argv = sys.argv[:]
|
||||
sys.argv[:] = repl
|
||||
yield
|
||||
sys.argv[:] = old_argv
|
||||
|
||||
@contextlib.contextmanager
|
||||
def reset_setup_stop_context():
|
||||
"""
|
||||
When the setuptools tests are run using setup.py test, and then
|
||||
one wants to invoke another setup() command (such as easy_install)
|
||||
within those tests, it's necessary to reset the global variable
|
||||
in distutils.core so that the setup() command will run naturally.
|
||||
"""
|
||||
setup_stop_after = distutils.core._setup_stop_after
|
||||
distutils.core._setup_stop_after = None
|
||||
yield
|
||||
distutils.core._setup_stop_after = setup_stop_after
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def quiet_context():
|
||||
"""
|
||||
Redirect stdout/stderr to StringIO objects to prevent console output from
|
||||
distutils commands.
|
||||
"""
|
||||
|
||||
old_stdout = sys.stdout
|
||||
old_stderr = sys.stderr
|
||||
new_stdout = sys.stdout = StringIO()
|
||||
new_stderr = sys.stderr = StringIO()
|
||||
try:
|
||||
yield new_stdout, new_stderr
|
||||
finally:
|
||||
new_stdout.seek(0)
|
||||
new_stderr.seek(0)
|
||||
sys.stdout = old_stdout
|
||||
sys.stderr = old_stderr
|
173
lib/python3.13/site-packages/setuptools/tests/test_egg_info.py
Normal file
173
lib/python3.13/site-packages/setuptools/tests/test_egg_info.py
Normal file
@ -0,0 +1,173 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import shutil
|
||||
import unittest
|
||||
|
||||
import pkg_resources
|
||||
import warnings
|
||||
from setuptools.command import egg_info
|
||||
from setuptools import svn_utils
|
||||
from setuptools.tests import environment, test_svn
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
|
||||
ENTRIES_V10 = pkg_resources.resource_string(__name__, 'entries-v10')
|
||||
"An entries file generated with svn 1.6.17 against the legacy Setuptools repo"
|
||||
|
||||
|
||||
class TestEggInfo(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.test_dir = tempfile.mkdtemp()
|
||||
os.mkdir(os.path.join(self.test_dir, '.svn'))
|
||||
|
||||
self.old_cwd = os.getcwd()
|
||||
os.chdir(self.test_dir)
|
||||
|
||||
def tearDown(self):
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.test_dir)
|
||||
|
||||
def _write_entries(self, entries):
|
||||
fn = os.path.join(self.test_dir, '.svn', 'entries')
|
||||
entries_f = open(fn, 'wb')
|
||||
entries_f.write(entries)
|
||||
entries_f.close()
|
||||
|
||||
@skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
|
||||
def test_version_10_format(self):
|
||||
"""
|
||||
"""
|
||||
#keeping this set for 1.6 is a good check on the get_svn_revision
|
||||
#to ensure I return using svnversion what would had been returned
|
||||
version_str = svn_utils.SvnInfo.get_svn_version()
|
||||
version = [int(x) for x in version_str.split('.')[:2]]
|
||||
if version != [1, 6]:
|
||||
if hasattr(self, 'skipTest'):
|
||||
self.skipTest('')
|
||||
else:
|
||||
sys.stderr.write('\n Skipping due to SVN Version\n')
|
||||
return
|
||||
|
||||
self._write_entries(ENTRIES_V10)
|
||||
rev = egg_info.egg_info.get_svn_revision()
|
||||
self.assertEqual(rev, '89000')
|
||||
|
||||
def test_version_10_format_legacy_parser(self):
|
||||
"""
|
||||
"""
|
||||
path_variable = None
|
||||
for env in os.environ:
|
||||
if env.lower() == 'path':
|
||||
path_variable = env
|
||||
|
||||
if path_variable:
|
||||
old_path = os.environ[path_variable]
|
||||
os.environ[path_variable] = ''
|
||||
#catch_warnings not available until py26
|
||||
warning_filters = warnings.filters
|
||||
warnings.filters = warning_filters[:]
|
||||
try:
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
self._write_entries(ENTRIES_V10)
|
||||
rev = egg_info.egg_info.get_svn_revision()
|
||||
finally:
|
||||
#restore the warning filters
|
||||
warnings.filters = warning_filters
|
||||
#restore the os path
|
||||
if path_variable:
|
||||
os.environ[path_variable] = old_path
|
||||
|
||||
self.assertEqual(rev, '89000')
|
||||
|
||||
DUMMY_SOURCE_TXT = """CHANGES.txt
|
||||
CONTRIBUTORS.txt
|
||||
HISTORY.txt
|
||||
LICENSE
|
||||
MANIFEST.in
|
||||
README.txt
|
||||
setup.py
|
||||
dummy/__init__.py
|
||||
dummy/test.txt
|
||||
dummy.egg-info/PKG-INFO
|
||||
dummy.egg-info/SOURCES.txt
|
||||
dummy.egg-info/dependency_links.txt
|
||||
dummy.egg-info/top_level.txt"""
|
||||
|
||||
|
||||
class TestSvnDummy(environment.ZippedEnvironment):
|
||||
|
||||
def setUp(self):
|
||||
version = svn_utils.SvnInfo.get_svn_version()
|
||||
if not version: # None or Empty
|
||||
return None
|
||||
|
||||
self.base_version = tuple([int(x) for x in version.split('.')][:2])
|
||||
|
||||
if not self.base_version:
|
||||
raise ValueError('No SVN tools installed')
|
||||
elif self.base_version < (1, 3):
|
||||
raise ValueError('Insufficient SVN Version %s' % version)
|
||||
elif self.base_version >= (1, 9):
|
||||
#trying the latest version
|
||||
self.base_version = (1, 8)
|
||||
|
||||
self.dataname = "dummy%i%i" % self.base_version
|
||||
self.datafile = os.path.join('setuptools', 'tests',
|
||||
'svn_data', self.dataname + ".zip")
|
||||
super(TestSvnDummy, self).setUp()
|
||||
|
||||
@skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
|
||||
def test_sources(self):
|
||||
code, data = environment.run_setup_py(["sdist"],
|
||||
pypath=self.old_cwd,
|
||||
data_stream=1)
|
||||
if code:
|
||||
raise AssertionError(data)
|
||||
|
||||
sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
|
||||
infile = open(sources, 'r')
|
||||
try:
|
||||
read_contents = infile.read()
|
||||
finally:
|
||||
infile.close()
|
||||
del infile
|
||||
|
||||
self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
class TestSvnDummyLegacy(environment.ZippedEnvironment):
|
||||
|
||||
def setUp(self):
|
||||
self.base_version = (1, 6)
|
||||
self.dataname = "dummy%i%i" % self.base_version
|
||||
self.datafile = os.path.join('setuptools', 'tests',
|
||||
'svn_data', self.dataname + ".zip")
|
||||
super(TestSvnDummyLegacy, self).setUp()
|
||||
|
||||
def test_sources(self):
|
||||
code, data = environment.run_setup_py(["sdist"],
|
||||
pypath=self.old_cwd,
|
||||
path="",
|
||||
data_stream=1)
|
||||
if code:
|
||||
raise AssertionError(data)
|
||||
|
||||
sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
|
||||
infile = open(sources, 'r')
|
||||
try:
|
||||
read_contents = infile.read()
|
||||
finally:
|
||||
infile.close()
|
||||
del infile
|
||||
|
||||
self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def test_suite():
|
||||
return unittest.defaultTestLoader.loadTestsFromName(__name__)
|
@ -0,0 +1,82 @@
|
||||
"""Tests for setuptools.find_packages()."""
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from setuptools import find_packages
|
||||
|
||||
|
||||
class TestFindPackages(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.dist_dir = tempfile.mkdtemp()
|
||||
self._make_pkg_structure()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.dist_dir)
|
||||
|
||||
def _make_pkg_structure(self):
|
||||
"""Make basic package structure.
|
||||
|
||||
dist/
|
||||
docs/
|
||||
conf.py
|
||||
pkg/
|
||||
__pycache__/
|
||||
nspkg/
|
||||
mod.py
|
||||
subpkg/
|
||||
assets/
|
||||
asset
|
||||
__init__.py
|
||||
setup.py
|
||||
|
||||
"""
|
||||
self.docs_dir = self._mkdir('docs', self.dist_dir)
|
||||
self._touch('conf.py', self.docs_dir)
|
||||
self.pkg_dir = self._mkdir('pkg', self.dist_dir)
|
||||
self._mkdir('__pycache__', self.pkg_dir)
|
||||
self.ns_pkg_dir = self._mkdir('nspkg', self.pkg_dir)
|
||||
self._touch('mod.py', self.ns_pkg_dir)
|
||||
self.sub_pkg_dir = self._mkdir('subpkg', self.pkg_dir)
|
||||
self.asset_dir = self._mkdir('assets', self.sub_pkg_dir)
|
||||
self._touch('asset', self.asset_dir)
|
||||
self._touch('__init__.py', self.sub_pkg_dir)
|
||||
self._touch('setup.py', self.dist_dir)
|
||||
|
||||
def _mkdir(self, path, parent_dir=None):
|
||||
if parent_dir:
|
||||
path = os.path.join(parent_dir, path)
|
||||
os.mkdir(path)
|
||||
return path
|
||||
|
||||
def _touch(self, path, dir_=None):
|
||||
if dir_:
|
||||
path = os.path.join(dir_, path)
|
||||
fp = open(path, 'w')
|
||||
fp.close()
|
||||
return path
|
||||
|
||||
def test_regular_package(self):
|
||||
self._touch('__init__.py', self.pkg_dir)
|
||||
packages = find_packages(self.dist_dir)
|
||||
self.assertEqual(packages, ['pkg', 'pkg.subpkg'])
|
||||
|
||||
def test_include_excludes_other(self):
|
||||
"""
|
||||
If include is specified, other packages should be excluded.
|
||||
"""
|
||||
self._touch('__init__.py', self.pkg_dir)
|
||||
alt_dir = self._mkdir('other_pkg', self.dist_dir)
|
||||
self._touch('__init__.py', alt_dir)
|
||||
packages = find_packages(self.dist_dir, include=['other_pkg'])
|
||||
self.assertEqual(packages, ['other_pkg'])
|
||||
|
||||
def test_dir_with_dot_is_skipped(self):
|
||||
shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets'))
|
||||
data_dir = self._mkdir('some.data', self.pkg_dir)
|
||||
self._touch('__init__.py', data_dir)
|
||||
self._touch('file.dat', data_dir)
|
||||
packages = find_packages(self.dist_dir)
|
||||
self.assertTrue('pkg.some.data' not in packages)
|
@ -0,0 +1,68 @@
|
||||
import os
|
||||
import unittest
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
|
||||
try:
|
||||
import ast
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
class TestMarkerlib(unittest.TestCase):
|
||||
|
||||
@skipIf('ast' not in globals(),
|
||||
"ast not available (Python < 2.6?)")
|
||||
def test_markers(self):
|
||||
from _markerlib import interpret, default_environment, compile
|
||||
|
||||
os_name = os.name
|
||||
|
||||
self.assertTrue(interpret(""))
|
||||
|
||||
self.assertTrue(interpret("os.name != 'buuuu'"))
|
||||
self.assertTrue(interpret("os_name != 'buuuu'"))
|
||||
self.assertTrue(interpret("python_version > '1.0'"))
|
||||
self.assertTrue(interpret("python_version < '5.0'"))
|
||||
self.assertTrue(interpret("python_version <= '5.0'"))
|
||||
self.assertTrue(interpret("python_version >= '1.0'"))
|
||||
self.assertTrue(interpret("'%s' in os.name" % os_name))
|
||||
self.assertTrue(interpret("'%s' in os_name" % os_name))
|
||||
self.assertTrue(interpret("'buuuu' not in os.name"))
|
||||
|
||||
self.assertFalse(interpret("os.name == 'buuuu'"))
|
||||
self.assertFalse(interpret("os_name == 'buuuu'"))
|
||||
self.assertFalse(interpret("python_version < '1.0'"))
|
||||
self.assertFalse(interpret("python_version > '5.0'"))
|
||||
self.assertFalse(interpret("python_version >= '5.0'"))
|
||||
self.assertFalse(interpret("python_version <= '1.0'"))
|
||||
self.assertFalse(interpret("'%s' not in os.name" % os_name))
|
||||
self.assertFalse(interpret("'buuuu' in os.name and python_version >= '5.0'"))
|
||||
self.assertFalse(interpret("'buuuu' in os_name and python_version >= '5.0'"))
|
||||
|
||||
environment = default_environment()
|
||||
environment['extra'] = 'test'
|
||||
self.assertTrue(interpret("extra == 'test'", environment))
|
||||
self.assertFalse(interpret("extra == 'doc'", environment))
|
||||
|
||||
def raises_nameError():
|
||||
try:
|
||||
interpret("python.version == '42'")
|
||||
except NameError:
|
||||
pass
|
||||
else:
|
||||
raise Exception("Expected NameError")
|
||||
|
||||
raises_nameError()
|
||||
|
||||
def raises_syntaxError():
|
||||
try:
|
||||
interpret("(x for x in (4,))")
|
||||
except SyntaxError:
|
||||
pass
|
||||
else:
|
||||
raise Exception("Expected SyntaxError")
|
||||
|
||||
raises_syntaxError()
|
||||
|
||||
statement = "python_version == '5'"
|
||||
self.assertEqual(compile(statement).__doc__, statement)
|
||||
|
@ -0,0 +1,203 @@
|
||||
"""Package Index Tests
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import unittest
|
||||
import pkg_resources
|
||||
from setuptools.compat import urllib2, httplib, HTTPError, unicode, pathname2url
|
||||
import distutils.errors
|
||||
import setuptools.package_index
|
||||
from setuptools.tests.server import IndexServer
|
||||
|
||||
class TestPackageIndex(unittest.TestCase):
|
||||
|
||||
def test_bad_url_bad_port(self):
|
||||
index = setuptools.package_index.PackageIndex()
|
||||
url = 'http://127.0.0.1:0/nonesuch/test_package_index'
|
||||
try:
|
||||
v = index.open_url(url)
|
||||
except Exception:
|
||||
v = sys.exc_info()[1]
|
||||
self.assertTrue(url in str(v))
|
||||
else:
|
||||
self.assertTrue(isinstance(v, HTTPError))
|
||||
|
||||
def test_bad_url_typo(self):
|
||||
# issue 16
|
||||
# easy_install inquant.contentmirror.plone breaks because of a typo
|
||||
# in its home URL
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
hosts=('www.example.com',)
|
||||
)
|
||||
|
||||
url = 'url:%20https://svn.plone.org/svn/collective/inquant.contentmirror.plone/trunk'
|
||||
try:
|
||||
v = index.open_url(url)
|
||||
except Exception:
|
||||
v = sys.exc_info()[1]
|
||||
self.assertTrue(url in str(v))
|
||||
else:
|
||||
self.assertTrue(isinstance(v, HTTPError))
|
||||
|
||||
def test_bad_url_bad_status_line(self):
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
hosts=('www.example.com',)
|
||||
)
|
||||
|
||||
def _urlopen(*args):
|
||||
raise httplib.BadStatusLine('line')
|
||||
|
||||
index.opener = _urlopen
|
||||
url = 'http://example.com'
|
||||
try:
|
||||
v = index.open_url(url)
|
||||
except Exception:
|
||||
v = sys.exc_info()[1]
|
||||
self.assertTrue('line' in str(v))
|
||||
else:
|
||||
raise AssertionError('Should have raise here!')
|
||||
|
||||
def test_bad_url_double_scheme(self):
|
||||
"""
|
||||
A bad URL with a double scheme should raise a DistutilsError.
|
||||
"""
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
hosts=('www.example.com',)
|
||||
)
|
||||
|
||||
# issue 20
|
||||
url = 'http://http://svn.pythonpaste.org/Paste/wphp/trunk'
|
||||
try:
|
||||
index.open_url(url)
|
||||
except distutils.errors.DistutilsError:
|
||||
error = sys.exc_info()[1]
|
||||
msg = unicode(error)
|
||||
assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg
|
||||
return
|
||||
raise RuntimeError("Did not raise")
|
||||
|
||||
def test_bad_url_screwy_href(self):
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
hosts=('www.example.com',)
|
||||
)
|
||||
|
||||
# issue #160
|
||||
if sys.version_info[0] == 2 and sys.version_info[1] == 7:
|
||||
# this should not fail
|
||||
url = 'http://example.com'
|
||||
page = ('<a href="http://www.famfamfam.com]('
|
||||
'http://www.famfamfam.com/">')
|
||||
index.process_index(url, page)
|
||||
|
||||
def test_url_ok(self):
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
hosts=('www.example.com',)
|
||||
)
|
||||
url = 'file:///tmp/test_package_index'
|
||||
self.assertTrue(index.url_ok(url, True))
|
||||
|
||||
def test_links_priority(self):
|
||||
"""
|
||||
Download links from the pypi simple index should be used before
|
||||
external download links.
|
||||
https://bitbucket.org/tarek/distribute/issue/163
|
||||
|
||||
Usecase :
|
||||
- someone uploads a package on pypi, a md5 is generated
|
||||
- someone manually copies this link (with the md5 in the url) onto an
|
||||
external page accessible from the package page.
|
||||
- someone reuploads the package (with a different md5)
|
||||
- while easy_installing, an MD5 error occurs because the external link
|
||||
is used
|
||||
-> Setuptools should use the link from pypi, not the external one.
|
||||
"""
|
||||
if sys.platform.startswith('java'):
|
||||
# Skip this test on jython because binding to :0 fails
|
||||
return
|
||||
|
||||
# start an index server
|
||||
server = IndexServer()
|
||||
server.start()
|
||||
index_url = server.base_url() + 'test_links_priority/simple/'
|
||||
|
||||
# scan a test index
|
||||
pi = setuptools.package_index.PackageIndex(index_url)
|
||||
requirement = pkg_resources.Requirement.parse('foobar')
|
||||
pi.find_packages(requirement)
|
||||
server.stop()
|
||||
|
||||
# the distribution has been found
|
||||
self.assertTrue('foobar' in pi)
|
||||
# we have only one link, because links are compared without md5
|
||||
self.assertTrue(len(pi['foobar'])==1)
|
||||
# the link should be from the index
|
||||
self.assertTrue('correct_md5' in pi['foobar'][0].location)
|
||||
|
||||
def test_parse_bdist_wininst(self):
|
||||
self.assertEqual(setuptools.package_index.parse_bdist_wininst(
|
||||
'reportlab-2.5.win32-py2.4.exe'), ('reportlab-2.5', '2.4', 'win32'))
|
||||
self.assertEqual(setuptools.package_index.parse_bdist_wininst(
|
||||
'reportlab-2.5.win32.exe'), ('reportlab-2.5', None, 'win32'))
|
||||
self.assertEqual(setuptools.package_index.parse_bdist_wininst(
|
||||
'reportlab-2.5.win-amd64-py2.7.exe'), ('reportlab-2.5', '2.7', 'win-amd64'))
|
||||
self.assertEqual(setuptools.package_index.parse_bdist_wininst(
|
||||
'reportlab-2.5.win-amd64.exe'), ('reportlab-2.5', None, 'win-amd64'))
|
||||
|
||||
def test__vcs_split_rev_from_url(self):
|
||||
"""
|
||||
Test the basic usage of _vcs_split_rev_from_url
|
||||
"""
|
||||
vsrfu = setuptools.package_index.PackageIndex._vcs_split_rev_from_url
|
||||
url, rev = vsrfu('https://example.com/bar@2995')
|
||||
self.assertEqual(url, 'https://example.com/bar')
|
||||
self.assertEqual(rev, '2995')
|
||||
|
||||
def test_local_index(self):
|
||||
"""
|
||||
local_open should be able to read an index from the file system.
|
||||
"""
|
||||
f = open('index.html', 'w')
|
||||
f.write('<div>content</div>')
|
||||
f.close()
|
||||
try:
|
||||
url = 'file:' + pathname2url(os.getcwd()) + '/'
|
||||
res = setuptools.package_index.local_open(url)
|
||||
finally:
|
||||
os.remove('index.html')
|
||||
assert 'content' in res.read()
|
||||
|
||||
|
||||
class TestContentCheckers(unittest.TestCase):
|
||||
|
||||
def test_md5(self):
|
||||
checker = setuptools.package_index.HashChecker.from_url(
|
||||
'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478')
|
||||
checker.feed('You should probably not be using MD5'.encode('ascii'))
|
||||
self.assertEqual(checker.hash.hexdigest(),
|
||||
'f12895fdffbd45007040d2e44df98478')
|
||||
self.assertTrue(checker.is_valid())
|
||||
|
||||
def test_other_fragment(self):
|
||||
"Content checks should succeed silently if no hash is present"
|
||||
checker = setuptools.package_index.HashChecker.from_url(
|
||||
'http://foo/bar#something%20completely%20different')
|
||||
checker.feed('anything'.encode('ascii'))
|
||||
self.assertTrue(checker.is_valid())
|
||||
|
||||
def test_blank_md5(self):
|
||||
"Content checks should succeed if a hash is empty"
|
||||
checker = setuptools.package_index.HashChecker.from_url(
|
||||
'http://foo/bar#md5=')
|
||||
checker.feed('anything'.encode('ascii'))
|
||||
self.assertTrue(checker.is_valid())
|
||||
|
||||
def test_get_hash_name_md5(self):
|
||||
checker = setuptools.package_index.HashChecker.from_url(
|
||||
'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478')
|
||||
self.assertEqual(checker.hash_name, 'md5')
|
||||
|
||||
def test_report(self):
|
||||
checker = setuptools.package_index.HashChecker.from_url(
|
||||
'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478')
|
||||
rep = checker.report(lambda x: x, 'My message about %s')
|
||||
self.assertEqual(rep, 'My message about md5')
|
620
lib/python3.13/site-packages/setuptools/tests/test_resources.py
Normal file
620
lib/python3.13/site-packages/setuptools/tests/test_resources.py
Normal file
@ -0,0 +1,620 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# NOTE: the shebang and encoding lines are for ScriptHeaderTests do not remove
|
||||
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import shutil
|
||||
from unittest import TestCase
|
||||
|
||||
import pkg_resources
|
||||
from pkg_resources import (parse_requirements, VersionConflict, parse_version,
|
||||
Distribution, EntryPoint, Requirement, safe_version, safe_name,
|
||||
WorkingSet)
|
||||
|
||||
from setuptools.command.easy_install import (get_script_header, is_sh,
|
||||
nt_quote_arg)
|
||||
from setuptools.compat import StringIO, iteritems
|
||||
|
||||
try:
|
||||
frozenset
|
||||
except NameError:
|
||||
from sets import ImmutableSet as frozenset
|
||||
|
||||
def safe_repr(obj, short=False):
|
||||
""" copied from Python2.7"""
|
||||
try:
|
||||
result = repr(obj)
|
||||
except Exception:
|
||||
result = object.__repr__(obj)
|
||||
if not short or len(result) < pkg_resources._MAX_LENGTH:
|
||||
return result
|
||||
return result[:pkg_resources._MAX_LENGTH] + ' [truncated]...'
|
||||
|
||||
class Metadata(pkg_resources.EmptyProvider):
|
||||
"""Mock object to return metadata as if from an on-disk distribution"""
|
||||
|
||||
def __init__(self,*pairs):
|
||||
self.metadata = dict(pairs)
|
||||
|
||||
def has_metadata(self,name):
|
||||
return name in self.metadata
|
||||
|
||||
def get_metadata(self,name):
|
||||
return self.metadata[name]
|
||||
|
||||
def get_metadata_lines(self,name):
|
||||
return pkg_resources.yield_lines(self.get_metadata(name))
|
||||
|
||||
dist_from_fn = pkg_resources.Distribution.from_filename
|
||||
|
||||
class DistroTests(TestCase):
|
||||
|
||||
def testCollection(self):
|
||||
# empty path should produce no distributions
|
||||
ad = pkg_resources.Environment([], platform=None, python=None)
|
||||
self.assertEqual(list(ad), [])
|
||||
self.assertEqual(ad['FooPkg'],[])
|
||||
ad.add(dist_from_fn("FooPkg-1.3_1.egg"))
|
||||
ad.add(dist_from_fn("FooPkg-1.4-py2.4-win32.egg"))
|
||||
ad.add(dist_from_fn("FooPkg-1.2-py2.4.egg"))
|
||||
|
||||
# Name is in there now
|
||||
self.assertTrue(ad['FooPkg'])
|
||||
# But only 1 package
|
||||
self.assertEqual(list(ad), ['foopkg'])
|
||||
|
||||
# Distributions sort by version
|
||||
self.assertEqual(
|
||||
[dist.version for dist in ad['FooPkg']], ['1.4','1.3-1','1.2']
|
||||
)
|
||||
# Removing a distribution leaves sequence alone
|
||||
ad.remove(ad['FooPkg'][1])
|
||||
self.assertEqual(
|
||||
[dist.version for dist in ad['FooPkg']], ['1.4','1.2']
|
||||
)
|
||||
# And inserting adds them in order
|
||||
ad.add(dist_from_fn("FooPkg-1.9.egg"))
|
||||
self.assertEqual(
|
||||
[dist.version for dist in ad['FooPkg']], ['1.9','1.4','1.2']
|
||||
)
|
||||
|
||||
ws = WorkingSet([])
|
||||
foo12 = dist_from_fn("FooPkg-1.2-py2.4.egg")
|
||||
foo14 = dist_from_fn("FooPkg-1.4-py2.4-win32.egg")
|
||||
req, = parse_requirements("FooPkg>=1.3")
|
||||
|
||||
# Nominal case: no distros on path, should yield all applicable
|
||||
self.assertEqual(ad.best_match(req,ws).version, '1.9')
|
||||
# If a matching distro is already installed, should return only that
|
||||
ws.add(foo14)
|
||||
self.assertEqual(ad.best_match(req,ws).version, '1.4')
|
||||
|
||||
# If the first matching distro is unsuitable, it's a version conflict
|
||||
ws = WorkingSet([])
|
||||
ws.add(foo12)
|
||||
ws.add(foo14)
|
||||
self.assertRaises(VersionConflict, ad.best_match, req, ws)
|
||||
|
||||
# If more than one match on the path, the first one takes precedence
|
||||
ws = WorkingSet([])
|
||||
ws.add(foo14)
|
||||
ws.add(foo12)
|
||||
ws.add(foo14)
|
||||
self.assertEqual(ad.best_match(req,ws).version, '1.4')
|
||||
|
||||
def checkFooPkg(self,d):
|
||||
self.assertEqual(d.project_name, "FooPkg")
|
||||
self.assertEqual(d.key, "foopkg")
|
||||
self.assertEqual(d.version, "1.3-1")
|
||||
self.assertEqual(d.py_version, "2.4")
|
||||
self.assertEqual(d.platform, "win32")
|
||||
self.assertEqual(d.parsed_version, parse_version("1.3-1"))
|
||||
|
||||
def testDistroBasics(self):
|
||||
d = Distribution(
|
||||
"/some/path",
|
||||
project_name="FooPkg",version="1.3-1",py_version="2.4",platform="win32"
|
||||
)
|
||||
self.checkFooPkg(d)
|
||||
|
||||
d = Distribution("/some/path")
|
||||
self.assertEqual(d.py_version, sys.version[:3])
|
||||
self.assertEqual(d.platform, None)
|
||||
|
||||
def testDistroParse(self):
|
||||
d = dist_from_fn("FooPkg-1.3_1-py2.4-win32.egg")
|
||||
self.checkFooPkg(d)
|
||||
d = dist_from_fn("FooPkg-1.3_1-py2.4-win32.egg-info")
|
||||
self.checkFooPkg(d)
|
||||
|
||||
def testDistroMetadata(self):
|
||||
d = Distribution(
|
||||
"/some/path", project_name="FooPkg", py_version="2.4", platform="win32",
|
||||
metadata = Metadata(
|
||||
('PKG-INFO',"Metadata-Version: 1.0\nVersion: 1.3-1\n")
|
||||
)
|
||||
)
|
||||
self.checkFooPkg(d)
|
||||
|
||||
def distRequires(self, txt):
|
||||
return Distribution("/foo", metadata=Metadata(('depends.txt', txt)))
|
||||
|
||||
def checkRequires(self, dist, txt, extras=()):
|
||||
self.assertEqual(
|
||||
list(dist.requires(extras)),
|
||||
list(parse_requirements(txt))
|
||||
)
|
||||
|
||||
def testDistroDependsSimple(self):
|
||||
for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0":
|
||||
self.checkRequires(self.distRequires(v), v)
|
||||
|
||||
def testResolve(self):
|
||||
ad = pkg_resources.Environment([])
|
||||
ws = WorkingSet([])
|
||||
# Resolving no requirements -> nothing to install
|
||||
self.assertEqual(list(ws.resolve([],ad)), [])
|
||||
# Request something not in the collection -> DistributionNotFound
|
||||
self.assertRaises(
|
||||
pkg_resources.DistributionNotFound, ws.resolve, parse_requirements("Foo"), ad
|
||||
)
|
||||
Foo = Distribution.from_filename(
|
||||
"/foo_dir/Foo-1.2.egg",
|
||||
metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0"))
|
||||
)
|
||||
ad.add(Foo)
|
||||
ad.add(Distribution.from_filename("Foo-0.9.egg"))
|
||||
|
||||
# Request thing(s) that are available -> list to activate
|
||||
for i in range(3):
|
||||
targets = list(ws.resolve(parse_requirements("Foo"), ad))
|
||||
self.assertEqual(targets, [Foo])
|
||||
list(map(ws.add,targets))
|
||||
self.assertRaises(VersionConflict, ws.resolve,
|
||||
parse_requirements("Foo==0.9"), ad)
|
||||
ws = WorkingSet([]) # reset
|
||||
|
||||
# Request an extra that causes an unresolved dependency for "Baz"
|
||||
self.assertRaises(
|
||||
pkg_resources.DistributionNotFound, ws.resolve,parse_requirements("Foo[bar]"), ad
|
||||
)
|
||||
Baz = Distribution.from_filename(
|
||||
"/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo"))
|
||||
)
|
||||
ad.add(Baz)
|
||||
|
||||
# Activation list now includes resolved dependency
|
||||
self.assertEqual(
|
||||
list(ws.resolve(parse_requirements("Foo[bar]"), ad)), [Foo,Baz]
|
||||
)
|
||||
# Requests for conflicting versions produce VersionConflict
|
||||
self.assertRaises(VersionConflict,
|
||||
ws.resolve, parse_requirements("Foo==1.2\nFoo!=1.2"), ad)
|
||||
|
||||
def testDistroDependsOptions(self):
|
||||
d = self.distRequires("""
|
||||
Twisted>=1.5
|
||||
[docgen]
|
||||
ZConfig>=2.0
|
||||
docutils>=0.3
|
||||
[fastcgi]
|
||||
fcgiapp>=0.1""")
|
||||
self.checkRequires(d,"Twisted>=1.5")
|
||||
self.checkRequires(
|
||||
d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"]
|
||||
)
|
||||
self.checkRequires(
|
||||
d,"Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"]
|
||||
)
|
||||
self.checkRequires(
|
||||
d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(),
|
||||
["docgen","fastcgi"]
|
||||
)
|
||||
self.checkRequires(
|
||||
d,"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(),
|
||||
["fastcgi", "docgen"]
|
||||
)
|
||||
self.assertRaises(pkg_resources.UnknownExtra, d.requires, ["foo"])
|
||||
|
||||
|
||||
class EntryPointTests(TestCase):
|
||||
|
||||
def assertfields(self, ep):
|
||||
self.assertEqual(ep.name,"foo")
|
||||
self.assertEqual(ep.module_name,"setuptools.tests.test_resources")
|
||||
self.assertEqual(ep.attrs, ("EntryPointTests",))
|
||||
self.assertEqual(ep.extras, ("x",))
|
||||
self.assertTrue(ep.load() is EntryPointTests)
|
||||
self.assertEqual(
|
||||
str(ep),
|
||||
"foo = setuptools.tests.test_resources:EntryPointTests [x]"
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
self.dist = Distribution.from_filename(
|
||||
"FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt','[x]')))
|
||||
|
||||
def testBasics(self):
|
||||
ep = EntryPoint(
|
||||
"foo", "setuptools.tests.test_resources", ["EntryPointTests"],
|
||||
["x"], self.dist
|
||||
)
|
||||
self.assertfields(ep)
|
||||
|
||||
def testParse(self):
|
||||
s = "foo = setuptools.tests.test_resources:EntryPointTests [x]"
|
||||
ep = EntryPoint.parse(s, self.dist)
|
||||
self.assertfields(ep)
|
||||
|
||||
ep = EntryPoint.parse("bar baz= spammity[PING]")
|
||||
self.assertEqual(ep.name,"bar baz")
|
||||
self.assertEqual(ep.module_name,"spammity")
|
||||
self.assertEqual(ep.attrs, ())
|
||||
self.assertEqual(ep.extras, ("ping",))
|
||||
|
||||
ep = EntryPoint.parse(" fizzly = wocka:foo")
|
||||
self.assertEqual(ep.name,"fizzly")
|
||||
self.assertEqual(ep.module_name,"wocka")
|
||||
self.assertEqual(ep.attrs, ("foo",))
|
||||
self.assertEqual(ep.extras, ())
|
||||
|
||||
def testRejects(self):
|
||||
for ep in [
|
||||
"foo", "x=1=2", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2",
|
||||
]:
|
||||
try: EntryPoint.parse(ep)
|
||||
except ValueError: pass
|
||||
else: raise AssertionError("Should've been bad", ep)
|
||||
|
||||
def checkSubMap(self, m):
|
||||
self.assertEqual(len(m), len(self.submap_expect))
|
||||
for key, ep in iteritems(self.submap_expect):
|
||||
self.assertEqual(repr(m.get(key)), repr(ep))
|
||||
|
||||
submap_expect = dict(
|
||||
feature1=EntryPoint('feature1', 'somemodule', ['somefunction']),
|
||||
feature2=EntryPoint('feature2', 'another.module', ['SomeClass'], ['extra1','extra2']),
|
||||
feature3=EntryPoint('feature3', 'this.module', extras=['something'])
|
||||
)
|
||||
submap_str = """
|
||||
# define features for blah blah
|
||||
feature1 = somemodule:somefunction
|
||||
feature2 = another.module:SomeClass [extra1,extra2]
|
||||
feature3 = this.module [something]
|
||||
"""
|
||||
|
||||
def testParseList(self):
|
||||
self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str))
|
||||
self.assertRaises(ValueError, EntryPoint.parse_group, "x a", "foo=bar")
|
||||
self.assertRaises(ValueError, EntryPoint.parse_group, "x",
|
||||
["foo=baz", "foo=bar"])
|
||||
|
||||
def testParseMap(self):
|
||||
m = EntryPoint.parse_map({'xyz':self.submap_str})
|
||||
self.checkSubMap(m['xyz'])
|
||||
self.assertEqual(list(m.keys()),['xyz'])
|
||||
m = EntryPoint.parse_map("[xyz]\n"+self.submap_str)
|
||||
self.checkSubMap(m['xyz'])
|
||||
self.assertEqual(list(m.keys()),['xyz'])
|
||||
self.assertRaises(ValueError, EntryPoint.parse_map, ["[xyz]", "[xyz]"])
|
||||
self.assertRaises(ValueError, EntryPoint.parse_map, self.submap_str)
|
||||
|
||||
class RequirementsTests(TestCase):
|
||||
|
||||
def testBasics(self):
|
||||
r = Requirement.parse("Twisted>=1.2")
|
||||
self.assertEqual(str(r),"Twisted>=1.2")
|
||||
self.assertEqual(repr(r),"Requirement.parse('Twisted>=1.2')")
|
||||
self.assertEqual(r, Requirement("Twisted", [('>=','1.2')], ()))
|
||||
self.assertEqual(r, Requirement("twisTed", [('>=','1.2')], ()))
|
||||
self.assertNotEqual(r, Requirement("Twisted", [('>=','2.0')], ()))
|
||||
self.assertNotEqual(r, Requirement("Zope", [('>=','1.2')], ()))
|
||||
self.assertNotEqual(r, Requirement("Zope", [('>=','3.0')], ()))
|
||||
self.assertNotEqual(r, Requirement.parse("Twisted[extras]>=1.2"))
|
||||
|
||||
def testOrdering(self):
|
||||
r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ())
|
||||
r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ())
|
||||
self.assertEqual(r1,r2)
|
||||
self.assertEqual(str(r1),str(r2))
|
||||
self.assertEqual(str(r2),"Twisted==1.2c1,>=1.2")
|
||||
|
||||
def testBasicContains(self):
|
||||
r = Requirement("Twisted", [('>=','1.2')], ())
|
||||
foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg")
|
||||
twist11 = Distribution.from_filename("Twisted-1.1.egg")
|
||||
twist12 = Distribution.from_filename("Twisted-1.2.egg")
|
||||
self.assertTrue(parse_version('1.2') in r)
|
||||
self.assertTrue(parse_version('1.1') not in r)
|
||||
self.assertTrue('1.2' in r)
|
||||
self.assertTrue('1.1' not in r)
|
||||
self.assertTrue(foo_dist not in r)
|
||||
self.assertTrue(twist11 not in r)
|
||||
self.assertTrue(twist12 in r)
|
||||
|
||||
def testAdvancedContains(self):
|
||||
r, = parse_requirements("Foo>=1.2,<=1.3,==1.9,>2.0,!=2.5,<3.0,==4.5")
|
||||
for v in ('1.2','1.2.2','1.3','1.9','2.0.1','2.3','2.6','3.0c1','4.5'):
|
||||
self.assertTrue(v in r, (v,r))
|
||||
for v in ('1.2c1','1.3.1','1.5','1.9.1','2.0','2.5','3.0','4.0'):
|
||||
self.assertTrue(v not in r, (v,r))
|
||||
|
||||
def testOptionsAndHashing(self):
|
||||
r1 = Requirement.parse("Twisted[foo,bar]>=1.2")
|
||||
r2 = Requirement.parse("Twisted[bar,FOO]>=1.2")
|
||||
r3 = Requirement.parse("Twisted[BAR,FOO]>=1.2.0")
|
||||
self.assertEqual(r1,r2)
|
||||
self.assertEqual(r1,r3)
|
||||
self.assertEqual(r1.extras, ("foo","bar"))
|
||||
self.assertEqual(r2.extras, ("bar","foo")) # extras are normalized
|
||||
self.assertEqual(hash(r1), hash(r2))
|
||||
self.assertEqual(
|
||||
hash(r1), hash(("twisted", ((">=",parse_version("1.2")),),
|
||||
frozenset(["foo","bar"])))
|
||||
)
|
||||
|
||||
def testVersionEquality(self):
|
||||
r1 = Requirement.parse("foo==0.3a2")
|
||||
r2 = Requirement.parse("foo!=0.3a4")
|
||||
d = Distribution.from_filename
|
||||
|
||||
self.assertTrue(d("foo-0.3a4.egg") not in r1)
|
||||
self.assertTrue(d("foo-0.3a1.egg") not in r1)
|
||||
self.assertTrue(d("foo-0.3a4.egg") not in r2)
|
||||
|
||||
self.assertTrue(d("foo-0.3a2.egg") in r1)
|
||||
self.assertTrue(d("foo-0.3a2.egg") in r2)
|
||||
self.assertTrue(d("foo-0.3a3.egg") in r2)
|
||||
self.assertTrue(d("foo-0.3a5.egg") in r2)
|
||||
|
||||
def testSetuptoolsProjectName(self):
|
||||
"""
|
||||
The setuptools project should implement the setuptools package.
|
||||
"""
|
||||
|
||||
self.assertEqual(
|
||||
Requirement.parse('setuptools').project_name, 'setuptools')
|
||||
# setuptools 0.7 and higher means setuptools.
|
||||
self.assertEqual(
|
||||
Requirement.parse('setuptools == 0.7').project_name, 'setuptools')
|
||||
self.assertEqual(
|
||||
Requirement.parse('setuptools == 0.7a1').project_name, 'setuptools')
|
||||
self.assertEqual(
|
||||
Requirement.parse('setuptools >= 0.7').project_name, 'setuptools')
|
||||
|
||||
|
||||
class ParseTests(TestCase):
|
||||
|
||||
def testEmptyParse(self):
|
||||
self.assertEqual(list(parse_requirements('')), [])
|
||||
|
||||
def testYielding(self):
|
||||
for inp,out in [
|
||||
([], []), ('x',['x']), ([[]],[]), (' x\n y', ['x','y']),
|
||||
(['x\n\n','y'], ['x','y']),
|
||||
]:
|
||||
self.assertEqual(list(pkg_resources.yield_lines(inp)),out)
|
||||
|
||||
def testSplitting(self):
|
||||
sample = """
|
||||
x
|
||||
[Y]
|
||||
z
|
||||
|
||||
a
|
||||
[b ]
|
||||
# foo
|
||||
c
|
||||
[ d]
|
||||
[q]
|
||||
v
|
||||
"""
|
||||
self.assertEqual(list(pkg_resources.split_sections(sample)),
|
||||
[(None,["x"]), ("Y",["z","a"]), ("b",["c"]), ("d",[]), ("q",["v"])]
|
||||
)
|
||||
self.assertRaises(ValueError,list,pkg_resources.split_sections("[foo"))
|
||||
|
||||
def testSafeName(self):
|
||||
self.assertEqual(safe_name("adns-python"), "adns-python")
|
||||
self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils")
|
||||
self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils")
|
||||
self.assertEqual(safe_name("Money$$$Maker"), "Money-Maker")
|
||||
self.assertNotEqual(safe_name("peak.web"), "peak-web")
|
||||
|
||||
def testSafeVersion(self):
|
||||
self.assertEqual(safe_version("1.2-1"), "1.2-1")
|
||||
self.assertEqual(safe_version("1.2 alpha"), "1.2.alpha")
|
||||
self.assertEqual(safe_version("2.3.4 20050521"), "2.3.4.20050521")
|
||||
self.assertEqual(safe_version("Money$$$Maker"), "Money-Maker")
|
||||
self.assertEqual(safe_version("peak.web"), "peak.web")
|
||||
|
||||
def testSimpleRequirements(self):
|
||||
self.assertEqual(
|
||||
list(parse_requirements('Twis-Ted>=1.2-1')),
|
||||
[Requirement('Twis-Ted',[('>=','1.2-1')], ())]
|
||||
)
|
||||
self.assertEqual(
|
||||
list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')),
|
||||
[Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())]
|
||||
)
|
||||
self.assertEqual(
|
||||
Requirement.parse("FooBar==1.99a3"),
|
||||
Requirement("FooBar", [('==','1.99a3')], ())
|
||||
)
|
||||
self.assertRaises(ValueError,Requirement.parse,">=2.3")
|
||||
self.assertRaises(ValueError,Requirement.parse,"x\\")
|
||||
self.assertRaises(ValueError,Requirement.parse,"x==2 q")
|
||||
self.assertRaises(ValueError,Requirement.parse,"X==1\nY==2")
|
||||
self.assertRaises(ValueError,Requirement.parse,"#")
|
||||
|
||||
def testVersionEquality(self):
|
||||
def c(s1,s2):
|
||||
p1, p2 = parse_version(s1),parse_version(s2)
|
||||
self.assertEqual(p1,p2, (s1,s2,p1,p2))
|
||||
|
||||
c('1.2-rc1', '1.2rc1')
|
||||
c('0.4', '0.4.0')
|
||||
c('0.4.0.0', '0.4.0')
|
||||
c('0.4.0-0', '0.4-0')
|
||||
c('0pl1', '0.0pl1')
|
||||
c('0pre1', '0.0c1')
|
||||
c('0.0.0preview1', '0c1')
|
||||
c('0.0c1', '0-rc1')
|
||||
c('1.2a1', '1.2.a.1')
|
||||
c('1.2...a', '1.2a')
|
||||
|
||||
def testVersionOrdering(self):
|
||||
def c(s1,s2):
|
||||
p1, p2 = parse_version(s1),parse_version(s2)
|
||||
self.assertTrue(p1<p2, (s1,s2,p1,p2))
|
||||
|
||||
c('2.1','2.1.1')
|
||||
c('2a1','2b0')
|
||||
c('2a1','2.1')
|
||||
c('2.3a1', '2.3')
|
||||
c('2.1-1', '2.1-2')
|
||||
c('2.1-1', '2.1.1')
|
||||
c('2.1', '2.1pl4')
|
||||
c('2.1a0-20040501', '2.1')
|
||||
c('1.1', '02.1')
|
||||
c('A56','B27')
|
||||
c('3.2', '3.2.pl0')
|
||||
c('3.2-1', '3.2pl1')
|
||||
c('3.2pl1', '3.2pl1-1')
|
||||
c('0.4', '4.0')
|
||||
c('0.0.4', '0.4.0')
|
||||
c('0pl1', '0.4pl1')
|
||||
c('2.1.0-rc1','2.1.0')
|
||||
c('2.1dev','2.1a0')
|
||||
|
||||
torture ="""
|
||||
0.80.1-3 0.80.1-2 0.80.1-1 0.79.9999+0.80.0pre4-1
|
||||
0.79.9999+0.80.0pre2-3 0.79.9999+0.80.0pre2-2
|
||||
0.77.2-1 0.77.1-1 0.77.0-1
|
||||
""".split()
|
||||
|
||||
for p,v1 in enumerate(torture):
|
||||
for v2 in torture[p+1:]:
|
||||
c(v2,v1)
|
||||
|
||||
|
||||
class ScriptHeaderTests(TestCase):
|
||||
non_ascii_exe = '/Users/José/bin/python'
|
||||
exe_with_spaces = r'C:\Program Files\Python33\python.exe'
|
||||
|
||||
def test_get_script_header(self):
|
||||
if not sys.platform.startswith('java') or not is_sh(sys.executable):
|
||||
# This test is for non-Jython platforms
|
||||
expected = '#!%s\n' % nt_quote_arg(os.path.normpath(sys.executable))
|
||||
self.assertEqual(get_script_header('#!/usr/local/bin/python'),
|
||||
expected)
|
||||
expected = '#!%s -x\n' % nt_quote_arg(os.path.normpath(sys.executable))
|
||||
self.assertEqual(get_script_header('#!/usr/bin/python -x'),
|
||||
expected)
|
||||
self.assertEqual(get_script_header('#!/usr/bin/python',
|
||||
executable=self.non_ascii_exe),
|
||||
'#!%s -x\n' % self.non_ascii_exe)
|
||||
candidate = get_script_header('#!/usr/bin/python',
|
||||
executable=self.exe_with_spaces)
|
||||
self.assertEqual(candidate, '#!"%s"\n' % self.exe_with_spaces)
|
||||
|
||||
def test_get_script_header_jython_workaround(self):
|
||||
# This test doesn't work with Python 3 in some locales
|
||||
if (sys.version_info >= (3,) and os.environ.get("LC_CTYPE")
|
||||
in (None, "C", "POSIX")):
|
||||
return
|
||||
|
||||
class java:
|
||||
class lang:
|
||||
class System:
|
||||
@staticmethod
|
||||
def getProperty(property):
|
||||
return ""
|
||||
sys.modules["java"] = java
|
||||
|
||||
platform = sys.platform
|
||||
sys.platform = 'java1.5.0_13'
|
||||
stdout, stderr = sys.stdout, sys.stderr
|
||||
try:
|
||||
# A mock sys.executable that uses a shebang line (this file)
|
||||
exe = os.path.normpath(os.path.splitext(__file__)[0] + '.py')
|
||||
self.assertEqual(
|
||||
get_script_header('#!/usr/local/bin/python', executable=exe),
|
||||
'#!/usr/bin/env %s\n' % exe)
|
||||
|
||||
# Ensure we generate what is basically a broken shebang line
|
||||
# when there's options, with a warning emitted
|
||||
sys.stdout = sys.stderr = StringIO()
|
||||
self.assertEqual(get_script_header('#!/usr/bin/python -x',
|
||||
executable=exe),
|
||||
'#!%s -x\n' % exe)
|
||||
self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue())
|
||||
sys.stdout = sys.stderr = StringIO()
|
||||
self.assertEqual(get_script_header('#!/usr/bin/python',
|
||||
executable=self.non_ascii_exe),
|
||||
'#!%s -x\n' % self.non_ascii_exe)
|
||||
self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue())
|
||||
finally:
|
||||
del sys.modules["java"]
|
||||
sys.platform = platform
|
||||
sys.stdout, sys.stderr = stdout, stderr
|
||||
|
||||
|
||||
class NamespaceTests(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self._ns_pkgs = pkg_resources._namespace_packages.copy()
|
||||
self._tmpdir = tempfile.mkdtemp(prefix="tests-setuptools-")
|
||||
os.makedirs(os.path.join(self._tmpdir, "site-pkgs"))
|
||||
self._prev_sys_path = sys.path[:]
|
||||
sys.path.append(os.path.join(self._tmpdir, "site-pkgs"))
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self._tmpdir)
|
||||
pkg_resources._namespace_packages = self._ns_pkgs.copy()
|
||||
sys.path = self._prev_sys_path[:]
|
||||
|
||||
def _assertIn(self, member, container):
|
||||
""" assertIn and assertTrue does not exist in Python2.3"""
|
||||
if member not in container:
|
||||
standardMsg = '%s not found in %s' % (safe_repr(member),
|
||||
safe_repr(container))
|
||||
self.fail(self._formatMessage(msg, standardMsg))
|
||||
|
||||
def test_two_levels_deep(self):
|
||||
"""
|
||||
Test nested namespace packages
|
||||
Create namespace packages in the following tree :
|
||||
site-packages-1/pkg1/pkg2
|
||||
site-packages-2/pkg1/pkg2
|
||||
Check both are in the _namespace_packages dict and that their __path__
|
||||
is correct
|
||||
"""
|
||||
sys.path.append(os.path.join(self._tmpdir, "site-pkgs2"))
|
||||
os.makedirs(os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2"))
|
||||
os.makedirs(os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2"))
|
||||
ns_str = "__import__('pkg_resources').declare_namespace(__name__)\n"
|
||||
for site in ["site-pkgs", "site-pkgs2"]:
|
||||
pkg1_init = open(os.path.join(self._tmpdir, site,
|
||||
"pkg1", "__init__.py"), "w")
|
||||
pkg1_init.write(ns_str)
|
||||
pkg1_init.close()
|
||||
pkg2_init = open(os.path.join(self._tmpdir, site,
|
||||
"pkg1", "pkg2", "__init__.py"), "w")
|
||||
pkg2_init.write(ns_str)
|
||||
pkg2_init.close()
|
||||
import pkg1
|
||||
self._assertIn("pkg1", pkg_resources._namespace_packages.keys())
|
||||
try:
|
||||
import pkg1.pkg2
|
||||
except ImportError:
|
||||
self.fail("Setuptools tried to import the parent namespace package")
|
||||
# check the _namespace_packages dict
|
||||
self._assertIn("pkg1.pkg2", pkg_resources._namespace_packages.keys())
|
||||
self.assertEqual(pkg_resources._namespace_packages["pkg1"], ["pkg1.pkg2"])
|
||||
# check the __path__ attribute contains both paths
|
||||
self.assertEqual(pkg1.pkg2.__path__, [
|
||||
os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2"),
|
||||
os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2")])
|
@ -0,0 +1,79 @@
|
||||
"""develop tests
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import unittest
|
||||
import tempfile
|
||||
import types
|
||||
|
||||
import pkg_resources
|
||||
import setuptools.sandbox
|
||||
from setuptools.sandbox import DirectorySandbox, SandboxViolation
|
||||
|
||||
def has_win32com():
|
||||
"""
|
||||
Run this to determine if the local machine has win32com, and if it
|
||||
does, include additional tests.
|
||||
"""
|
||||
if not sys.platform.startswith('win32'):
|
||||
return False
|
||||
try:
|
||||
mod = __import__('win32com')
|
||||
except ImportError:
|
||||
return False
|
||||
return True
|
||||
|
||||
class TestSandbox(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.dir = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.dir)
|
||||
|
||||
def test_devnull(self):
|
||||
if sys.version < '2.4':
|
||||
return
|
||||
sandbox = DirectorySandbox(self.dir)
|
||||
sandbox.run(self._file_writer(os.devnull))
|
||||
|
||||
def _file_writer(path):
|
||||
def do_write():
|
||||
f = open(path, 'w')
|
||||
f.write('xxx')
|
||||
f.close()
|
||||
return do_write
|
||||
|
||||
_file_writer = staticmethod(_file_writer)
|
||||
|
||||
if has_win32com():
|
||||
def test_win32com(self):
|
||||
"""
|
||||
win32com should not be prevented from caching COM interfaces
|
||||
in gen_py.
|
||||
"""
|
||||
import win32com
|
||||
gen_py = win32com.__gen_path__
|
||||
target = os.path.join(gen_py, 'test_write')
|
||||
sandbox = DirectorySandbox(self.dir)
|
||||
try:
|
||||
try:
|
||||
sandbox.run(self._file_writer(target))
|
||||
except SandboxViolation:
|
||||
self.fail("Could not create gen_py file due to SandboxViolation")
|
||||
finally:
|
||||
if os.path.exists(target): os.remove(target)
|
||||
|
||||
def test_setup_py_with_BOM(self):
|
||||
"""
|
||||
It should be possible to execute a setup.py with a Byte Order Mark
|
||||
"""
|
||||
target = pkg_resources.resource_filename(__name__,
|
||||
'script-with-bom.py')
|
||||
namespace = types.ModuleType('namespace')
|
||||
setuptools.sandbox.execfile(target, vars(namespace))
|
||||
assert namespace.result == 'passed'
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
535
lib/python3.13/site-packages/setuptools/tests/test_sdist.py
Normal file
535
lib/python3.13/site-packages/setuptools/tests/test_sdist.py
Normal file
@ -0,0 +1,535 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""sdist tests"""
|
||||
|
||||
import locale
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
import unicodedata
|
||||
import re
|
||||
from setuptools.tests import environment, test_svn
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
|
||||
from setuptools.compat import StringIO, unicode
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
from setuptools.command.sdist import sdist, walk_revctrl
|
||||
from setuptools.command.egg_info import manifest_maker
|
||||
from setuptools.dist import Distribution
|
||||
from setuptools import svn_utils
|
||||
|
||||
SETUP_ATTRS = {
|
||||
'name': 'sdist_test',
|
||||
'version': '0.0',
|
||||
'packages': ['sdist_test'],
|
||||
'package_data': {'sdist_test': ['*.txt']}
|
||||
}
|
||||
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(**%r)
|
||||
""" % SETUP_ATTRS
|
||||
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1')
|
||||
else:
|
||||
LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py'
|
||||
|
||||
|
||||
# Cannot use context manager because of Python 2.4
|
||||
def quiet():
|
||||
global old_stdout, old_stderr
|
||||
old_stdout, old_stderr = sys.stdout, sys.stderr
|
||||
sys.stdout, sys.stderr = StringIO(), StringIO()
|
||||
|
||||
def unquiet():
|
||||
sys.stdout, sys.stderr = old_stdout, old_stderr
|
||||
|
||||
|
||||
# Fake byte literals for Python <= 2.5
|
||||
def b(s, encoding='utf-8'):
|
||||
if sys.version_info >= (3,):
|
||||
return s.encode(encoding)
|
||||
return s
|
||||
|
||||
|
||||
# Convert to POSIX path
|
||||
def posix(path):
|
||||
if sys.version_info >= (3,) and not isinstance(path, str):
|
||||
return path.replace(os.sep.encode('ascii'), b('/'))
|
||||
else:
|
||||
return path.replace(os.sep, '/')
|
||||
|
||||
|
||||
# HFS Plus uses decomposed UTF-8
|
||||
def decompose(path):
|
||||
if isinstance(path, unicode):
|
||||
return unicodedata.normalize('NFD', path)
|
||||
try:
|
||||
path = path.decode('utf-8')
|
||||
path = unicodedata.normalize('NFD', path)
|
||||
path = path.encode('utf-8')
|
||||
except UnicodeError:
|
||||
pass # Not UTF-8
|
||||
return path
|
||||
|
||||
|
||||
class TestSdistTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
f = open(os.path.join(self.temp_dir, 'setup.py'), 'w')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
# Set up the rest of the test package
|
||||
test_pkg = os.path.join(self.temp_dir, 'sdist_test')
|
||||
os.mkdir(test_pkg)
|
||||
# *.rst was not included in package_data, so c.rst should not be
|
||||
# automatically added to the manifest when not under version control
|
||||
for fname in ['__init__.py', 'a.txt', 'b.txt', 'c.rst']:
|
||||
# Just touch the files; their contents are irrelevant
|
||||
open(os.path.join(test_pkg, fname), 'w').close()
|
||||
|
||||
self.old_cwd = os.getcwd()
|
||||
os.chdir(self.temp_dir)
|
||||
|
||||
def tearDown(self):
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.temp_dir)
|
||||
|
||||
def test_package_data_in_sdist(self):
|
||||
"""Regression test for pull request #4: ensures that files listed in
|
||||
package_data are included in the manifest even if they're not added to
|
||||
version control.
|
||||
"""
|
||||
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = sdist(dist)
|
||||
cmd.ensure_finalized()
|
||||
|
||||
# squelch output
|
||||
quiet()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
manifest = cmd.filelist.files
|
||||
self.assertTrue(os.path.join('sdist_test', 'a.txt') in manifest)
|
||||
self.assertTrue(os.path.join('sdist_test', 'b.txt') in manifest)
|
||||
self.assertTrue(os.path.join('sdist_test', 'c.rst') not in manifest)
|
||||
|
||||
def test_manifest_is_written_with_utf8_encoding(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
mm = manifest_maker(dist)
|
||||
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
||||
os.mkdir('sdist_test.egg-info')
|
||||
|
||||
# UTF-8 filename
|
||||
filename = os.path.join('sdist_test', 'smörbröd.py')
|
||||
|
||||
# Add UTF-8 filename and write manifest
|
||||
quiet()
|
||||
try:
|
||||
mm.run()
|
||||
mm.filelist.files.append(filename)
|
||||
mm.write_manifest()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
manifest = open(mm.manifest, 'rbU')
|
||||
contents = manifest.read()
|
||||
manifest.close()
|
||||
|
||||
# The manifest should be UTF-8 encoded
|
||||
try:
|
||||
u_contents = contents.decode('UTF-8')
|
||||
except UnicodeDecodeError:
|
||||
e = sys.exc_info()[1]
|
||||
self.fail(e)
|
||||
|
||||
# The manifest should contain the UTF-8 filename
|
||||
if sys.version_info >= (3,):
|
||||
self.assertTrue(posix(filename) in u_contents)
|
||||
else:
|
||||
self.assertTrue(posix(filename) in contents)
|
||||
|
||||
# Python 3 only
|
||||
if sys.version_info >= (3,):
|
||||
|
||||
def test_write_manifest_allows_utf8_filenames(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
mm = manifest_maker(dist)
|
||||
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
||||
os.mkdir('sdist_test.egg-info')
|
||||
|
||||
# UTF-8 filename
|
||||
filename = os.path.join(b('sdist_test'), b('smörbröd.py'))
|
||||
|
||||
# Add filename and write manifest
|
||||
quiet()
|
||||
try:
|
||||
mm.run()
|
||||
u_filename = filename.decode('utf-8')
|
||||
mm.filelist.files.append(u_filename)
|
||||
# Re-write manifest
|
||||
mm.write_manifest()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
manifest = open(mm.manifest, 'rbU')
|
||||
contents = manifest.read()
|
||||
manifest.close()
|
||||
|
||||
# The manifest should be UTF-8 encoded
|
||||
try:
|
||||
contents.decode('UTF-8')
|
||||
except UnicodeDecodeError:
|
||||
e = sys.exc_info()[1]
|
||||
self.fail(e)
|
||||
|
||||
# The manifest should contain the UTF-8 filename
|
||||
self.assertTrue(posix(filename) in contents)
|
||||
|
||||
# The filelist should have been updated as well
|
||||
self.assertTrue(u_filename in mm.filelist.files)
|
||||
|
||||
def test_write_manifest_skips_non_utf8_filenames(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
mm = manifest_maker(dist)
|
||||
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
||||
os.mkdir('sdist_test.egg-info')
|
||||
|
||||
# Latin-1 filename
|
||||
filename = os.path.join(b('sdist_test'), LATIN1_FILENAME)
|
||||
|
||||
# Add filename with surrogates and write manifest
|
||||
quiet()
|
||||
try:
|
||||
mm.run()
|
||||
u_filename = filename.decode('utf-8', 'surrogateescape')
|
||||
mm.filelist.files.append(u_filename)
|
||||
# Re-write manifest
|
||||
mm.write_manifest()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
manifest = open(mm.manifest, 'rbU')
|
||||
contents = manifest.read()
|
||||
manifest.close()
|
||||
|
||||
# The manifest should be UTF-8 encoded
|
||||
try:
|
||||
contents.decode('UTF-8')
|
||||
except UnicodeDecodeError:
|
||||
e = sys.exc_info()[1]
|
||||
self.fail(e)
|
||||
|
||||
# The Latin-1 filename should have been skipped
|
||||
self.assertFalse(posix(filename) in contents)
|
||||
|
||||
# The filelist should have been updated as well
|
||||
self.assertFalse(u_filename in mm.filelist.files)
|
||||
|
||||
def test_manifest_is_read_with_utf8_encoding(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = sdist(dist)
|
||||
cmd.ensure_finalized()
|
||||
|
||||
# Create manifest
|
||||
quiet()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
# Add UTF-8 filename to manifest
|
||||
filename = os.path.join(b('sdist_test'), b('smörbröd.py'))
|
||||
cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
||||
manifest = open(cmd.manifest, 'ab')
|
||||
manifest.write(b('\n')+filename)
|
||||
manifest.close()
|
||||
|
||||
# The file must exist to be included in the filelist
|
||||
open(filename, 'w').close()
|
||||
|
||||
# Re-read manifest
|
||||
cmd.filelist.files = []
|
||||
quiet()
|
||||
try:
|
||||
cmd.read_manifest()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
# The filelist should contain the UTF-8 filename
|
||||
if sys.version_info >= (3,):
|
||||
filename = filename.decode('utf-8')
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
|
||||
# Python 3 only
|
||||
if sys.version_info >= (3,):
|
||||
|
||||
def test_read_manifest_skips_non_utf8_filenames(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = sdist(dist)
|
||||
cmd.ensure_finalized()
|
||||
|
||||
# Create manifest
|
||||
quiet()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
# Add Latin-1 filename to manifest
|
||||
filename = os.path.join(b('sdist_test'), LATIN1_FILENAME)
|
||||
cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
||||
manifest = open(cmd.manifest, 'ab')
|
||||
manifest.write(b('\n')+filename)
|
||||
manifest.close()
|
||||
|
||||
# The file must exist to be included in the filelist
|
||||
open(filename, 'w').close()
|
||||
|
||||
# Re-read manifest
|
||||
cmd.filelist.files = []
|
||||
quiet()
|
||||
try:
|
||||
try:
|
||||
cmd.read_manifest()
|
||||
except UnicodeDecodeError:
|
||||
e = sys.exc_info()[1]
|
||||
self.fail(e)
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
# The Latin-1 filename should have been skipped
|
||||
filename = filename.decode('latin-1')
|
||||
self.assertFalse(filename in cmd.filelist.files)
|
||||
|
||||
@skipIf(sys.version_info >= (3,) and locale.getpreferredencoding() != 'UTF-8',
|
||||
'Unittest fails if locale is not utf-8 but the manifests is recorded correctly')
|
||||
def test_sdist_with_utf8_encoded_filename(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = sdist(dist)
|
||||
cmd.ensure_finalized()
|
||||
|
||||
# UTF-8 filename
|
||||
filename = os.path.join(b('sdist_test'), b('smörbröd.py'))
|
||||
open(filename, 'w').close()
|
||||
|
||||
quiet()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
if sys.platform == 'darwin':
|
||||
filename = decompose(filename)
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
fs_enc = sys.getfilesystemencoding()
|
||||
|
||||
if sys.platform == 'win32':
|
||||
if fs_enc == 'cp1252':
|
||||
# Python 3 mangles the UTF-8 filename
|
||||
filename = filename.decode('cp1252')
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
else:
|
||||
filename = filename.decode('mbcs')
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
else:
|
||||
filename = filename.decode('utf-8')
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
else:
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
|
||||
def test_sdist_with_latin1_encoded_filename(self):
|
||||
# Test for #303.
|
||||
dist = Distribution(SETUP_ATTRS)
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = sdist(dist)
|
||||
cmd.ensure_finalized()
|
||||
|
||||
# Latin-1 filename
|
||||
filename = os.path.join(b('sdist_test'), LATIN1_FILENAME)
|
||||
open(filename, 'w').close()
|
||||
self.assertTrue(os.path.isfile(filename))
|
||||
|
||||
quiet()
|
||||
try:
|
||||
cmd.run()
|
||||
finally:
|
||||
unquiet()
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
#not all windows systems have a default FS encoding of cp1252
|
||||
if sys.platform == 'win32':
|
||||
# Latin-1 is similar to Windows-1252 however
|
||||
# on mbcs filesys it is not in latin-1 encoding
|
||||
fs_enc = sys.getfilesystemencoding()
|
||||
if fs_enc == 'mbcs':
|
||||
filename = filename.decode('mbcs')
|
||||
else:
|
||||
filename = filename.decode('latin-1')
|
||||
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
else:
|
||||
# The Latin-1 filename should have been skipped
|
||||
filename = filename.decode('latin-1')
|
||||
self.assertFalse(filename in cmd.filelist.files)
|
||||
else:
|
||||
# No conversion takes place under Python 2 and the file
|
||||
# is included. We shall keep it that way for BBB.
|
||||
self.assertTrue(filename in cmd.filelist.files)
|
||||
|
||||
|
||||
class TestDummyOutput(environment.ZippedEnvironment):
|
||||
|
||||
def setUp(self):
|
||||
self.datafile = os.path.join('setuptools', 'tests',
|
||||
'svn_data', "dummy.zip")
|
||||
self.dataname = "dummy"
|
||||
super(TestDummyOutput, self).setUp()
|
||||
|
||||
def _run(self):
|
||||
code, data = environment.run_setup_py(["sdist"],
|
||||
pypath=self.old_cwd,
|
||||
data_stream=0)
|
||||
if code:
|
||||
info = "DIR: " + os.path.abspath('.')
|
||||
info += "\n SDIST RETURNED: %i\n\n" % code
|
||||
info += data
|
||||
raise AssertionError(info)
|
||||
|
||||
datalines = data.splitlines()
|
||||
|
||||
possible = (
|
||||
"running sdist",
|
||||
"running egg_info",
|
||||
"creating dummy\.egg-info",
|
||||
"writing dummy\.egg-info",
|
||||
"writing top-level names to dummy\.egg-info",
|
||||
"writing dependency_links to dummy\.egg-info",
|
||||
"writing manifest file 'dummy\.egg-info",
|
||||
"reading manifest file 'dummy\.egg-info",
|
||||
"reading manifest template 'MANIFEST\.in'",
|
||||
"writing manifest file 'dummy\.egg-info",
|
||||
"creating dummy-0.1.1",
|
||||
"making hard links in dummy-0\.1\.1",
|
||||
"copying files to dummy-0\.1\.1",
|
||||
"copying \S+ -> dummy-0\.1\.1",
|
||||
"copying dummy",
|
||||
"copying dummy\.egg-info",
|
||||
"hard linking \S+ -> dummy-0\.1\.1",
|
||||
"hard linking dummy",
|
||||
"hard linking dummy\.egg-info",
|
||||
"Writing dummy-0\.1\.1",
|
||||
"creating dist",
|
||||
"creating 'dist",
|
||||
"Creating tar archive",
|
||||
"running check",
|
||||
"adding 'dummy-0\.1\.1",
|
||||
"tar .+ dist/dummy-0\.1\.1\.tar dummy-0\.1\.1",
|
||||
"gzip .+ dist/dummy-0\.1\.1\.tar",
|
||||
"removing 'dummy-0\.1\.1' \\(and everything under it\\)",
|
||||
)
|
||||
|
||||
print(" DIR: " + os.path.abspath('.'))
|
||||
for line in datalines:
|
||||
found = False
|
||||
for pattern in possible:
|
||||
if re.match(pattern, line):
|
||||
print(" READ: " + line)
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
raise AssertionError("Unexpexected: %s\n-in-\n%s"
|
||||
% (line, data))
|
||||
|
||||
return data
|
||||
|
||||
def test_sources(self):
|
||||
self._run()
|
||||
|
||||
|
||||
class TestSvn(environment.ZippedEnvironment):
|
||||
|
||||
def setUp(self):
|
||||
version = svn_utils.SvnInfo.get_svn_version()
|
||||
if not version: # None or Empty
|
||||
return
|
||||
|
||||
self.base_version = tuple([int(x) for x in version.split('.')][:2])
|
||||
|
||||
if not self.base_version:
|
||||
raise ValueError('No SVN tools installed')
|
||||
elif self.base_version < (1, 3):
|
||||
raise ValueError('Insufficient SVN Version %s' % version)
|
||||
elif self.base_version >= (1, 9):
|
||||
#trying the latest version
|
||||
self.base_version = (1, 8)
|
||||
|
||||
self.dataname = "svn%i%i_example" % self.base_version
|
||||
self.datafile = os.path.join('setuptools', 'tests',
|
||||
'svn_data', self.dataname + ".zip")
|
||||
super(TestSvn, self).setUp()
|
||||
|
||||
@skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
|
||||
def test_walksvn(self):
|
||||
if self.base_version >= (1, 6):
|
||||
folder2 = 'third party2'
|
||||
folder3 = 'third party3'
|
||||
else:
|
||||
folder2 = 'third_party2'
|
||||
folder3 = 'third_party3'
|
||||
|
||||
#TODO is this right
|
||||
expected = set([
|
||||
os.path.join('a file'),
|
||||
os.path.join(folder2, 'Changes.txt'),
|
||||
os.path.join(folder2, 'MD5SUMS'),
|
||||
os.path.join(folder2, 'README.txt'),
|
||||
os.path.join(folder3, 'Changes.txt'),
|
||||
os.path.join(folder3, 'MD5SUMS'),
|
||||
os.path.join(folder3, 'README.txt'),
|
||||
os.path.join(folder3, 'TODO.txt'),
|
||||
os.path.join(folder3, 'fin'),
|
||||
os.path.join('third_party', 'README.txt'),
|
||||
os.path.join('folder', folder2, 'Changes.txt'),
|
||||
os.path.join('folder', folder2, 'MD5SUMS'),
|
||||
os.path.join('folder', folder2, 'WatashiNiYomimasu.txt'),
|
||||
os.path.join('folder', folder3, 'Changes.txt'),
|
||||
os.path.join('folder', folder3, 'fin'),
|
||||
os.path.join('folder', folder3, 'MD5SUMS'),
|
||||
os.path.join('folder', folder3, 'oops'),
|
||||
os.path.join('folder', folder3, 'WatashiNiYomimasu.txt'),
|
||||
os.path.join('folder', folder3, 'ZuMachen.txt'),
|
||||
os.path.join('folder', 'third_party', 'WatashiNiYomimasu.txt'),
|
||||
os.path.join('folder', 'lalala.txt'),
|
||||
os.path.join('folder', 'quest.txt'),
|
||||
# The example will have a deleted file
|
||||
# (or should) but shouldn't return it
|
||||
])
|
||||
self.assertEqual(set(x for x in walk_revctrl()), expected)
|
||||
|
||||
|
||||
def test_suite():
|
||||
return unittest.defaultTestLoader.loadTestsFromName(__name__)
|
245
lib/python3.13/site-packages/setuptools/tests/test_svn.py
Normal file
245
lib/python3.13/site-packages/setuptools/tests/test_svn.py
Normal file
@ -0,0 +1,245 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""svn tests"""
|
||||
|
||||
import io
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import unittest
|
||||
from setuptools.tests import environment
|
||||
from setuptools.compat import unicode, unichr
|
||||
|
||||
from setuptools import svn_utils
|
||||
from setuptools.tests.py26compat import skipIf
|
||||
|
||||
|
||||
def _do_svn_check():
|
||||
try:
|
||||
subprocess.check_call(["svn", "--version"],
|
||||
shell=(sys.platform == 'win32'))
|
||||
return True
|
||||
except (OSError, subprocess.CalledProcessError):
|
||||
return False
|
||||
_svn_check = _do_svn_check()
|
||||
|
||||
|
||||
class TestSvnVersion(unittest.TestCase):
|
||||
|
||||
def test_no_svn_found(self):
|
||||
path_variable = None
|
||||
for env in os.environ:
|
||||
if env.lower() == 'path':
|
||||
path_variable = env
|
||||
|
||||
if path_variable is None:
|
||||
try:
|
||||
self.skipTest('Cannot figure out how to modify path')
|
||||
except AttributeError: # PY26 doesn't have this
|
||||
return
|
||||
|
||||
old_path = os.environ[path_variable]
|
||||
os.environ[path_variable] = ''
|
||||
try:
|
||||
version = svn_utils.SvnInfo.get_svn_version()
|
||||
self.assertEqual(version, '')
|
||||
finally:
|
||||
os.environ[path_variable] = old_path
|
||||
|
||||
@skipIf(not _svn_check, "No SVN to text, in the first place")
|
||||
def test_svn_should_exist(self):
|
||||
version = svn_utils.SvnInfo.get_svn_version()
|
||||
self.assertNotEqual(version, '')
|
||||
|
||||
def _read_utf8_file(path):
|
||||
fileobj = None
|
||||
try:
|
||||
fileobj = io.open(path, 'r', encoding='utf-8')
|
||||
data = fileobj.read()
|
||||
return data
|
||||
finally:
|
||||
if fileobj:
|
||||
fileobj.close()
|
||||
|
||||
|
||||
class ParserInfoXML(unittest.TestCase):
|
||||
|
||||
def parse_tester(self, svn_name, ext_spaces):
|
||||
path = os.path.join('setuptools', 'tests',
|
||||
'svn_data', svn_name + '_info.xml')
|
||||
#Remember these are pre-generated to test XML parsing
|
||||
# so these paths might not valid on your system
|
||||
example_base = "%s_example" % svn_name
|
||||
|
||||
data = _read_utf8_file(path)
|
||||
|
||||
expected = set([
|
||||
("\\".join((example_base, 'a file')), 'file'),
|
||||
("\\".join((example_base, 'folder')), 'dir'),
|
||||
("\\".join((example_base, 'folder', 'lalala.txt')), 'file'),
|
||||
("\\".join((example_base, 'folder', 'quest.txt')), 'file'),
|
||||
])
|
||||
self.assertEqual(set(x for x in svn_utils.parse_dir_entries(data)),
|
||||
expected)
|
||||
|
||||
def test_svn13(self):
|
||||
self.parse_tester('svn13', False)
|
||||
|
||||
def test_svn14(self):
|
||||
self.parse_tester('svn14', False)
|
||||
|
||||
def test_svn15(self):
|
||||
self.parse_tester('svn15', False)
|
||||
|
||||
def test_svn16(self):
|
||||
self.parse_tester('svn16', True)
|
||||
|
||||
def test_svn17(self):
|
||||
self.parse_tester('svn17', True)
|
||||
|
||||
def test_svn18(self):
|
||||
self.parse_tester('svn18', True)
|
||||
|
||||
class ParserExternalXML(unittest.TestCase):
|
||||
|
||||
def parse_tester(self, svn_name, ext_spaces):
|
||||
path = os.path.join('setuptools', 'tests',
|
||||
'svn_data', svn_name + '_ext_list.xml')
|
||||
example_base = svn_name + '_example'
|
||||
data = _read_utf8_file(path)
|
||||
|
||||
if ext_spaces:
|
||||
folder2 = 'third party2'
|
||||
folder3 = 'third party3'
|
||||
else:
|
||||
folder2 = 'third_party2'
|
||||
folder3 = 'third_party3'
|
||||
|
||||
expected = set([
|
||||
os.sep.join((example_base, folder2)),
|
||||
os.sep.join((example_base, folder3)),
|
||||
# folder is third_party大介
|
||||
os.sep.join((example_base,
|
||||
unicode('third_party') +
|
||||
unichr(0x5927) + unichr(0x4ecb))),
|
||||
os.sep.join((example_base, 'folder', folder2)),
|
||||
os.sep.join((example_base, 'folder', folder3)),
|
||||
os.sep.join((example_base, 'folder',
|
||||
unicode('third_party') +
|
||||
unichr(0x5927) + unichr(0x4ecb))),
|
||||
])
|
||||
|
||||
expected = set(os.path.normpath(x) for x in expected)
|
||||
dir_base = os.sep.join(('C:', 'development', 'svn_example'))
|
||||
self.assertEqual(set(x for x
|
||||
in svn_utils.parse_externals_xml(data, dir_base)), expected)
|
||||
|
||||
def test_svn15(self):
|
||||
self.parse_tester('svn15', False)
|
||||
|
||||
def test_svn16(self):
|
||||
self.parse_tester('svn16', True)
|
||||
|
||||
def test_svn17(self):
|
||||
self.parse_tester('svn17', True)
|
||||
|
||||
def test_svn18(self):
|
||||
self.parse_tester('svn18', True)
|
||||
|
||||
|
||||
class ParseExternal(unittest.TestCase):
|
||||
|
||||
def parse_tester(self, svn_name, ext_spaces):
|
||||
path = os.path.join('setuptools', 'tests',
|
||||
'svn_data', svn_name + '_ext_list.txt')
|
||||
data = _read_utf8_file(path)
|
||||
|
||||
if ext_spaces:
|
||||
expected = set(['third party2', 'third party3',
|
||||
'third party3b', 'third_party'])
|
||||
else:
|
||||
expected = set(['third_party2', 'third_party3', 'third_party'])
|
||||
|
||||
self.assertEqual(set(x for x in svn_utils.parse_external_prop(data)),
|
||||
expected)
|
||||
|
||||
def test_svn13(self):
|
||||
self.parse_tester('svn13', False)
|
||||
|
||||
def test_svn14(self):
|
||||
self.parse_tester('svn14', False)
|
||||
|
||||
def test_svn15(self):
|
||||
self.parse_tester('svn15', False)
|
||||
|
||||
def test_svn16(self):
|
||||
self.parse_tester('svn16', True)
|
||||
|
||||
def test_svn17(self):
|
||||
self.parse_tester('svn17', True)
|
||||
|
||||
def test_svn18(self):
|
||||
self.parse_tester('svn18', True)
|
||||
|
||||
|
||||
class TestSvn(environment.ZippedEnvironment):
|
||||
|
||||
def setUp(self):
|
||||
version = svn_utils.SvnInfo.get_svn_version()
|
||||
if not version: # empty or null
|
||||
self.dataname = None
|
||||
self.datafile = None
|
||||
return
|
||||
|
||||
self.base_version = tuple([int(x) for x in version.split('.')[:2]])
|
||||
|
||||
if self.base_version < (1,3):
|
||||
raise ValueError('Insufficient SVN Version %s' % version)
|
||||
elif self.base_version >= (1,9):
|
||||
#trying the latest version
|
||||
self.base_version = (1,8)
|
||||
|
||||
self.dataname = "svn%i%i_example" % self.base_version
|
||||
self.datafile = os.path.join('setuptools', 'tests',
|
||||
'svn_data', self.dataname + ".zip")
|
||||
super(TestSvn, self).setUp()
|
||||
|
||||
@skipIf(not _svn_check, "No SVN to text, in the first place")
|
||||
def test_revision(self):
|
||||
rev = svn_utils.SvnInfo.load('.').get_revision()
|
||||
self.assertEqual(rev, 6)
|
||||
|
||||
@skipIf(not _svn_check, "No SVN to text, in the first place")
|
||||
def test_entries(self):
|
||||
expected = set([
|
||||
(os.path.join('a file'), 'file'),
|
||||
(os.path.join('folder'), 'dir'),
|
||||
(os.path.join('folder', 'lalala.txt'), 'file'),
|
||||
(os.path.join('folder', 'quest.txt'), 'file'),
|
||||
#The example will have a deleted file (or should)
|
||||
#but shouldn't return it
|
||||
])
|
||||
info = svn_utils.SvnInfo.load('.')
|
||||
self.assertEqual(set(x for x in info.entries), expected)
|
||||
|
||||
@skipIf(not _svn_check, "No SVN to text, in the first place")
|
||||
def test_externals(self):
|
||||
if self.base_version >= (1,6):
|
||||
folder2 = 'third party2'
|
||||
folder3 = 'third party3'
|
||||
else:
|
||||
folder2 = 'third_party2'
|
||||
folder3 = 'third_party3'
|
||||
|
||||
expected = set([
|
||||
os.path.join(folder2),
|
||||
os.path.join(folder3),
|
||||
os.path.join('third_party'),
|
||||
os.path.join('folder', folder2),
|
||||
os.path.join('folder', folder3),
|
||||
os.path.join('folder', 'third_party'),
|
||||
])
|
||||
info = svn_utils.SvnInfo.load('.')
|
||||
self.assertEqual(set([x for x in info.externals]), expected)
|
||||
|
||||
def test_suite():
|
||||
return unittest.defaultTestLoader.loadTestsFromName(__name__)
|
126
lib/python3.13/site-packages/setuptools/tests/test_test.py
Normal file
126
lib/python3.13/site-packages/setuptools/tests/test_test.py
Normal file
@ -0,0 +1,126 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
"""develop tests
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
import site
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from distutils.errors import DistutilsError
|
||||
from setuptools.compat import StringIO
|
||||
from setuptools.command.test import test
|
||||
from setuptools.command import easy_install as easy_install_pkg
|
||||
from setuptools.dist import Distribution
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(name='foo',
|
||||
packages=['name', 'name.space', 'name.space.tests'],
|
||||
namespace_packages=['name'],
|
||||
test_suite='name.space.tests.test_suite',
|
||||
)
|
||||
"""
|
||||
|
||||
NS_INIT = """# -*- coding: Latin-1 -*-
|
||||
# Söme Arbiträry Ünicode to test Issüé 310
|
||||
try:
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
except ImportError:
|
||||
from pkgutil import extend_path
|
||||
__path__ = extend_path(__path__, __name__)
|
||||
"""
|
||||
# Make sure this is Latin-1 binary, before writing:
|
||||
if sys.version_info < (3,):
|
||||
NS_INIT = NS_INIT.decode('UTF-8')
|
||||
NS_INIT = NS_INIT.encode('Latin-1')
|
||||
|
||||
TEST_PY = """import unittest
|
||||
|
||||
class TestTest(unittest.TestCase):
|
||||
def test_test(self):
|
||||
print "Foo" # Should fail under Python 3 unless 2to3 is used
|
||||
|
||||
test_suite = unittest.makeSuite(TestTest)
|
||||
"""
|
||||
|
||||
class TestTestTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
|
||||
return
|
||||
|
||||
# Directory structure
|
||||
self.dir = tempfile.mkdtemp()
|
||||
os.mkdir(os.path.join(self.dir, 'name'))
|
||||
os.mkdir(os.path.join(self.dir, 'name', 'space'))
|
||||
os.mkdir(os.path.join(self.dir, 'name', 'space', 'tests'))
|
||||
# setup.py
|
||||
setup = os.path.join(self.dir, 'setup.py')
|
||||
f = open(setup, 'wt')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
self.old_cwd = os.getcwd()
|
||||
# name/__init__.py
|
||||
init = os.path.join(self.dir, 'name', '__init__.py')
|
||||
f = open(init, 'wb')
|
||||
f.write(NS_INIT)
|
||||
f.close()
|
||||
# name/space/__init__.py
|
||||
init = os.path.join(self.dir, 'name', 'space', '__init__.py')
|
||||
f = open(init, 'wt')
|
||||
f.write('#empty\n')
|
||||
f.close()
|
||||
# name/space/tests/__init__.py
|
||||
init = os.path.join(self.dir, 'name', 'space', 'tests', '__init__.py')
|
||||
f = open(init, 'wt')
|
||||
f.write(TEST_PY)
|
||||
f.close()
|
||||
|
||||
os.chdir(self.dir)
|
||||
self.old_base = site.USER_BASE
|
||||
site.USER_BASE = tempfile.mkdtemp()
|
||||
self.old_site = site.USER_SITE
|
||||
site.USER_SITE = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
|
||||
return
|
||||
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.dir)
|
||||
shutil.rmtree(site.USER_BASE)
|
||||
shutil.rmtree(site.USER_SITE)
|
||||
site.USER_BASE = self.old_base
|
||||
site.USER_SITE = self.old_site
|
||||
|
||||
def test_test(self):
|
||||
if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
|
||||
return
|
||||
|
||||
dist = Distribution(dict(
|
||||
name='foo',
|
||||
packages=['name', 'name.space', 'name.space.tests'],
|
||||
namespace_packages=['name'],
|
||||
test_suite='name.space.tests.test_suite',
|
||||
use_2to3=True,
|
||||
))
|
||||
dist.script_name = 'setup.py'
|
||||
cmd = test(dist)
|
||||
cmd.user = 1
|
||||
cmd.ensure_finalized()
|
||||
cmd.install_dir = site.USER_SITE
|
||||
cmd.user = 1
|
||||
old_stdout = sys.stdout
|
||||
sys.stdout = StringIO()
|
||||
try:
|
||||
try: # try/except/finally doesn't work in Python 2.4, so we need nested try-statements.
|
||||
cmd.run()
|
||||
except SystemExit: # The test runner calls sys.exit, stop that making an error.
|
||||
pass
|
||||
finally:
|
||||
sys.stdout = old_stdout
|
||||
|
@ -0,0 +1,72 @@
|
||||
"""build_ext tests
|
||||
"""
|
||||
import sys, os, shutil, tempfile, unittest, site, zipfile
|
||||
from setuptools.command.upload_docs import upload_docs
|
||||
from setuptools.dist import Distribution
|
||||
|
||||
SETUP_PY = """\
|
||||
from setuptools import setup
|
||||
|
||||
setup(name='foo')
|
||||
"""
|
||||
|
||||
class TestUploadDocsTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.dir = tempfile.mkdtemp()
|
||||
setup = os.path.join(self.dir, 'setup.py')
|
||||
f = open(setup, 'w')
|
||||
f.write(SETUP_PY)
|
||||
f.close()
|
||||
self.old_cwd = os.getcwd()
|
||||
os.chdir(self.dir)
|
||||
|
||||
self.upload_dir = os.path.join(self.dir, 'build')
|
||||
os.mkdir(self.upload_dir)
|
||||
|
||||
# A test document.
|
||||
f = open(os.path.join(self.upload_dir, 'index.html'), 'w')
|
||||
f.write("Hello world.")
|
||||
f.close()
|
||||
|
||||
# An empty folder.
|
||||
os.mkdir(os.path.join(self.upload_dir, 'empty'))
|
||||
|
||||
if sys.version >= "2.6":
|
||||
self.old_base = site.USER_BASE
|
||||
site.USER_BASE = upload_docs.USER_BASE = tempfile.mkdtemp()
|
||||
self.old_site = site.USER_SITE
|
||||
site.USER_SITE = upload_docs.USER_SITE = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
os.chdir(self.old_cwd)
|
||||
shutil.rmtree(self.dir)
|
||||
if sys.version >= "2.6":
|
||||
shutil.rmtree(site.USER_BASE)
|
||||
shutil.rmtree(site.USER_SITE)
|
||||
site.USER_BASE = self.old_base
|
||||
site.USER_SITE = self.old_site
|
||||
|
||||
def test_create_zipfile(self):
|
||||
# Test to make sure zipfile creation handles common cases.
|
||||
# This explicitly includes a folder containing an empty folder.
|
||||
|
||||
dist = Distribution()
|
||||
|
||||
cmd = upload_docs(dist)
|
||||
cmd.upload_dir = self.upload_dir
|
||||
cmd.target_dir = self.upload_dir
|
||||
tmp_dir = tempfile.mkdtemp()
|
||||
tmp_file = os.path.join(tmp_dir, 'foo.zip')
|
||||
try:
|
||||
zip_file = cmd.create_zipfile(tmp_file)
|
||||
|
||||
assert zipfile.is_zipfile(tmp_file)
|
||||
|
||||
zip_file = zipfile.ZipFile(tmp_file) # woh...
|
||||
|
||||
assert zip_file.namelist() == ['index.html']
|
||||
|
||||
zip_file.close()
|
||||
finally:
|
||||
shutil.rmtree(tmp_dir)
|
||||
|
Reference in New Issue
Block a user