diff options
| author | Konrad Delong <konryd@gmail.com> | 2010-08-05 18:17:38 +0200 |
|---|---|---|
| committer | Konrad Delong <konryd@gmail.com> | 2010-08-05 18:17:38 +0200 |
| commit | 485b7447701a6927f4304dcdb0f4b2b45edcbf5f (patch) | |
| tree | e86e0835cd7d10c42a0a41774c773a3405c9977c /src | |
| parent | af4263388c51b2b1b0f4f01bf15473050487e476 (diff) | |
| parent | 9da67de95ddac89371ae85e609003fee0331723f (diff) | |
| download | disutils2-485b7447701a6927f4304dcdb0f4b2b45edcbf5f.tar.gz | |
merged from upstream
Diffstat (limited to 'src')
| -rw-r--r-- | src/distutils2/_backport/__init__.py | 6 | ||||
| -rw-r--r-- | src/distutils2/command/test.py | 65 | ||||
| -rw-r--r-- | src/distutils2/command/upload_docs.py | 3 | ||||
| -rw-r--r-- | src/distutils2/dist.py | 2 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/custom_loader/myowntestmodule.py | 9 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/custom_loader/setup.cfg | 2 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/custom_loader/setup.py | 5 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/extensions_test/myowntestmodule.py | 4 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/extensions_test/setup.cfg | 2 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/extensions_test/setup.py | 6 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/extensions_test/spammodule.c | 11 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/simple_test/myowntestmodule.py | 4 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/simple_test/setup.cfg | 2 | ||||
| -rw-r--r-- | src/distutils2/tests/dists/simple_test/setup.py | 5 | ||||
| -rw-r--r-- | src/distutils2/tests/test_test.py | 102 | ||||
| -rw-r--r-- | src/distutils2/tests/test_upload_docs.py | 5 | ||||
| -rw-r--r-- | src/distutils2/tests/with_support.py | 7 |
17 files changed, 237 insertions, 3 deletions
diff --git a/src/distutils2/_backport/__init__.py b/src/distutils2/_backport/__init__.py index c5227d3..df6efb4 100644 --- a/src/distutils2/_backport/__init__.py +++ b/src/distutils2/_backport/__init__.py @@ -1,2 +1,8 @@ """Things that will land in the Python 3.3 std lib but which we must drag along with us for now to support 2.x.""" + +def any(seq): + for elem in seq: + if elem: + return elem + return False diff --git a/src/distutils2/command/test.py b/src/distutils2/command/test.py new file mode 100644 index 0000000..8bbaac2 --- /dev/null +++ b/src/distutils2/command/test.py @@ -0,0 +1,65 @@ +import os, sys +from distutils2.core import Command +from distutils2._backport.pkgutil import get_distribution +import unittest +import warnings + +def get_loader_instance(dotted_path): + if dotted_path is None: + return None + module_name, rest = dotted_path.split('.')[0], dotted_path.split('.')[1:] + while True: + try: + ret = __import__(module_name) + break + except ImportError: + if rest == []: + return None + module_name += ('.' + rest[0]) + rest = rest[1:] + while rest: + try: + ret = getattr(ret, rest.pop(0)) + except AttributeError: + return None + return ret() + +class test(Command): + + description = "" # TODO + user_options = [ + ('test-suite=', 's', + "Test suite to run (e.g. 'some_module.test_suite')"), + ('test-loader=', None, + "Test loader to be used to load the test suite."), + ] + + def initialize_options(self): + self.test_suite = None + self.test_loader = None + + def finalize_options(self): + self.build_lib = self.get_finalized_command("build").build_lib + if self.distribution.tests_require: + for requirement in self.distribution.tests_require: + if get_distribution(requirement) is None: + warnings.warn("The test dependency %s is not installed which may couse the tests to fail.", + RuntimeWarning) + + def run(self): + prev_cwd = os.getcwd() + try: + if self.distribution.has_ext_modules(): + build = self.get_reinitialized_command('build') + build.inplace = 1 # TODO - remove make sure it's needed + self.run_command('build') + os.chdir(self.build_lib) + args = {"module": self.test_suite, + "argv": sys.argv[:1], + "testLoader": get_loader_instance(self.test_loader) + } + if args['testLoader'] is None: + del args['testLoader'] + unittest.main(**args) + finally: + os.chdir(prev_cwd) diff --git a/src/distutils2/command/upload_docs.py b/src/distutils2/command/upload_docs.py index 86b2c33..4f6915a 100644 --- a/src/distutils2/command/upload_docs.py +++ b/src/distutils2/command/upload_docs.py @@ -94,9 +94,10 @@ class upload_docs(Command): def run(self): name = self.distribution.metadata['Name'] + version = self.distribution.metadata['Version'] zip_file = zip_dir(self.upload_dir) - fields = {':action': 'doc_upload', 'name': name}.items() + fields = [(':action', 'doc_upload'), ('name', name), ('version', version)] files = [('content', name, zip_file.getvalue())] content_type, body = encode_multipart(fields, files) diff --git a/src/distutils2/dist.py b/src/distutils2/dist.py index d491a93..f2e4777 100644 --- a/src/distutils2/dist.py +++ b/src/distutils2/dist.py @@ -111,6 +111,8 @@ Common commands: (see '--help-commands' for more) "print the list of packages/modules provided"), ('requires', None, "print the list of packages/modules required"), + ('tests-require', None, + "print the list of packages/modules required to run the test suite"), ('obsoletes', None, "print the list of packages/modules made obsolete"), ('use-2to3', None, diff --git a/src/distutils2/tests/dists/custom_loader/myowntestmodule.py b/src/distutils2/tests/dists/custom_loader/myowntestmodule.py new file mode 100644 index 0000000..eeb8979 --- /dev/null +++ b/src/distutils2/tests/dists/custom_loader/myowntestmodule.py @@ -0,0 +1,9 @@ +import unittest +class Loader(object): + def loadTestsFromModule(self, names, module=None): + class SomeTest(unittest.TestCase): + def test_blah(self): + self.fail("horribly") + return unittest.makeSuite(SomeTest) + def __repr__(self): + return 'YO' diff --git a/src/distutils2/tests/dists/custom_loader/setup.cfg b/src/distutils2/tests/dists/custom_loader/setup.cfg new file mode 100644 index 0000000..99329f4 --- /dev/null +++ b/src/distutils2/tests/dists/custom_loader/setup.cfg @@ -0,0 +1,2 @@ +[test] +test-loader = myowntestmodule.Loader diff --git a/src/distutils2/tests/dists/custom_loader/setup.py b/src/distutils2/tests/dists/custom_loader/setup.py new file mode 100644 index 0000000..151e07a --- /dev/null +++ b/src/distutils2/tests/dists/custom_loader/setup.py @@ -0,0 +1,5 @@ +from distutils2.core import setup +setup(name='somedist', + version='0.1', + py_modules=['myowntestmodule', 'somemod'], +) diff --git a/src/distutils2/tests/dists/extensions_test/myowntestmodule.py b/src/distutils2/tests/dists/extensions_test/myowntestmodule.py new file mode 100644 index 0000000..ba74d5a --- /dev/null +++ b/src/distutils2/tests/dists/extensions_test/myowntestmodule.py @@ -0,0 +1,4 @@ +import unittest +class SomeTest(unittest.TestCase): + def test_blah(self): + self.fail("horribly") diff --git a/src/distutils2/tests/dists/extensions_test/setup.cfg b/src/distutils2/tests/dists/extensions_test/setup.cfg new file mode 100644 index 0000000..5f14fd4 --- /dev/null +++ b/src/distutils2/tests/dists/extensions_test/setup.cfg @@ -0,0 +1,2 @@ +[test] +test-suite = myowntestmodule diff --git a/src/distutils2/tests/dists/extensions_test/setup.py b/src/distutils2/tests/dists/extensions_test/setup.py new file mode 100644 index 0000000..91dbca8 --- /dev/null +++ b/src/distutils2/tests/dists/extensions_test/setup.py @@ -0,0 +1,6 @@ +from distutils2.core import setup, Extension +setup(name='somedist', + version='0.1', + py_modules=['myowntestmodule', 'somemod'], + ext_modules=[Extension('spam', ['spammodule.c'])], +) diff --git a/src/distutils2/tests/dists/extensions_test/spammodule.c b/src/distutils2/tests/dists/extensions_test/spammodule.c new file mode 100644 index 0000000..88e888a --- /dev/null +++ b/src/distutils2/tests/dists/extensions_test/spammodule.c @@ -0,0 +1,11 @@ +#include <Python.h> + +static PyMethodDef SpamMethods[] = { + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC +initspam(void) +{ + (void) Py_InitModule("spam", SpamMethods); +} diff --git a/src/distutils2/tests/dists/simple_test/myowntestmodule.py b/src/distutils2/tests/dists/simple_test/myowntestmodule.py new file mode 100644 index 0000000..ba74d5a --- /dev/null +++ b/src/distutils2/tests/dists/simple_test/myowntestmodule.py @@ -0,0 +1,4 @@ +import unittest +class SomeTest(unittest.TestCase): + def test_blah(self): + self.fail("horribly") diff --git a/src/distutils2/tests/dists/simple_test/setup.cfg b/src/distutils2/tests/dists/simple_test/setup.cfg new file mode 100644 index 0000000..5f14fd4 --- /dev/null +++ b/src/distutils2/tests/dists/simple_test/setup.cfg @@ -0,0 +1,2 @@ +[test] +test-suite = myowntestmodule diff --git a/src/distutils2/tests/dists/simple_test/setup.py b/src/distutils2/tests/dists/simple_test/setup.py new file mode 100644 index 0000000..151e07a --- /dev/null +++ b/src/distutils2/tests/dists/simple_test/setup.py @@ -0,0 +1,5 @@ +from distutils2.core import setup +setup(name='somedist', + version='0.1', + py_modules=['myowntestmodule', 'somemod'], +) diff --git a/src/distutils2/tests/test_test.py b/src/distutils2/tests/test_test.py new file mode 100644 index 0000000..da60d92 --- /dev/null +++ b/src/distutils2/tests/test_test.py @@ -0,0 +1,102 @@ +import os, sys, shutil, re +from copy import copy +from os.path import join +from StringIO import StringIO +from distutils2.tests.support import unittest, TempdirManager +from distutils2.command.test import test +from distutils2.dist import Distribution +import subprocess + +try: + any +except NameError: + from distutils2._backport import any + +EXPECTED_OUTPUT_RE = r'''FAIL: test_blah \(myowntestmodule.SomeTest\) +---------------------------------------------------------------------- +Traceback \(most recent call last\): + File ".+/myowntestmodule.py", line \d+, in test_blah + self.fail\("horribly"\) +AssertionError: horribly +''' + +here = os.path.dirname(os.path.abspath(__file__)) + + +class TestTest(TempdirManager, unittest.TestCase): + + def setUp(self): + super(TestTest, self).setUp() + + distutils2path = os.path.dirname(os.path.dirname(here)) + self.old_pythonpath = os.environ.get('PYTHONPATH', '') + os.environ['PYTHONPATH'] = distutils2path + os.pathsep + self.old_pythonpath + + def tearDown(self): + os.environ['PYTHONPATH'] = self.old_pythonpath + super(TestTest, self).tearDown() + + def assert_re_match(self, pattern, string): + def quote(s): + lines = ['## ' + line for line in s.split('\n')] + sep = ["#" * 60] + return [''] + sep + lines + sep + msg = quote(pattern) + ["didn't match"] + quote(string) + msg = "\n".join(msg) + if not re.search(pattern, string): + self.fail(msg) + + def run_with_dist_cwd(self, pkg_dir): + cwd = os.getcwd() + command = [sys.executable, "setup.py", "test"] + try: + os.chdir(pkg_dir) + test_proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + _, errors = test_proc.communicate() + return errors + finally: + os.chdir(cwd) + + def prepare_dist(self, dist_name): + pkg_dir = join(os.path.dirname(__file__), "dists", dist_name) + temp_pkg_dir = join(self.mkdtemp(), dist_name) + shutil.copytree(pkg_dir, temp_pkg_dir) + return temp_pkg_dir + + def test_runs_simple_tests(self): + self.pkg_dir = self.prepare_dist('simple_test') + output = self.run_with_dist_cwd(self.pkg_dir) + self.assert_re_match(EXPECTED_OUTPUT_RE, output) + self.assertFalse(os.path.exists(join(self.pkg_dir, 'build'))) + + def test_builds_extensions(self): + self.pkg_dir = self.prepare_dist("extensions_test") + output = self.run_with_dist_cwd(self.pkg_dir) + self.assert_re_match(EXPECTED_OUTPUT_RE, output) + self.assertTrue(os.path.exists(join(self.pkg_dir, 'build'))) + self.assertTrue(any(x.startswith('lib') for x in os.listdir(join(self.pkg_dir, 'build')))) + + def test_custom_test_loader(self): + self.pkg_dir = self.prepare_dist("custom_loader") + output = self.run_with_dist_cwd(self.pkg_dir) + self.assert_re_match(EXPECTED_OUTPUT_RE, output) + + def _test_works_with_2to3(self): + pass + + @unittest.skipUnless(sys.version > '2.6', 'Need >= 2.6') + def test_checks_requires(self): + from distutils2.tests.with_support import examine_warnings + dist = Distribution() + dist.tests_require = ['ohno_ohno-impossible_1234-name_stop-that!'] + cmd = test(dist) + def examinator(ws): + cmd.ensure_finalized() + self.assertEqual(1, len(ws)) + warning = ws[0] + self.assertIs(warning.category, RuntimeWarning) + + examine_warnings(examinator) + +def test_suite(): + return unittest.makeSuite(TestTest) diff --git a/src/distutils2/tests/test_upload_docs.py b/src/distutils2/tests/test_upload_docs.py index c90f6b4..e47e1aa 100644 --- a/src/distutils2/tests/test_upload_docs.py +++ b/src/distutils2/tests/test_upload_docs.py @@ -116,12 +116,13 @@ class UploadDocsTestCase(support.TempdirManager, support.EnvironGuard, self.assertTrue(handler.headers.dict['content-type'] .startswith('multipart/form-data;')) - action, name, content =\ - request_data.split("----------------GHSKFJDLGDS7543FJKLFHRE75642756743254")[1:4] + action, name, version, content =\ + request_data.split("----------------GHSKFJDLGDS7543FJKLFHRE75642756743254")[1:5] # check that we picked the right chunks self.assertIn('name=":action"', action) self.assertIn('name="name"', name) + self.assertIn('name="version"', version) self.assertIn('name="content"', content) # check their contents diff --git a/src/distutils2/tests/with_support.py b/src/distutils2/tests/with_support.py new file mode 100644 index 0000000..bca0197 --- /dev/null +++ b/src/distutils2/tests/with_support.py @@ -0,0 +1,7 @@ +def examine_warnings(examinator): + """Given an examinator function calls it as if the code was under with + catch_warnings block. Useful for testing older Python versions""" + import warnings + warnings.simplefilter('default') + with warnings.catch_warnings(record=True) as ws: + examinator(ws) |
