[Python-checkins] cpython (merge default -> default): merge heads

benjamin.peterson python-checkins at python.org
Mon May 30 18:15:13 CEST 2011


http://hg.python.org/cpython/rev/f73d80d0ba44
changeset:   70524:f73d80d0ba44
parent:      70523:fefca6548732
parent:      70521:7e99da22c26d
user:        Benjamin Peterson <benjamin at python.org>
date:        Mon May 30 11:15:05 2011 -0500
summary:
  merge heads

files:
  Lib/packaging/database.py                |   16 +-
  Lib/packaging/install.py                 |   32 +-
  Lib/packaging/metadata.py                |   14 +-
  Lib/packaging/pypi/simple.py             |   10 +-
  Lib/packaging/resources.py               |   25 -
  Lib/packaging/run.py                     |   45 ++-
  Lib/packaging/tests/test_command_test.py |    3 +-
  Lib/packaging/tests/test_database.py     |  163 ++++++++++-
  Lib/packaging/tests/test_resources.py    |  167 -----------
  Lib/packaging/tests/test_uninstall.py    |    8 +-
  Lib/packaging/tests/test_util.py         |   44 +-
  Lib/packaging/util.py                    |   19 +-
  Lib/test/test_concurrent_futures.py      |    8 +-
  13 files changed, 277 insertions(+), 277 deletions(-)


diff --git a/Lib/packaging/database.py b/Lib/packaging/database.py
--- a/Lib/packaging/database.py
+++ b/Lib/packaging/database.py
@@ -18,7 +18,7 @@
     'get_distributions', 'get_distribution', 'get_file_users',
     'provides_distribution', 'obsoletes_distribution',
     'enable_cache', 'disable_cache', 'clear_cache',
-]
+    'get_file_path', 'get_file']
 
 
 # TODO update docs
@@ -627,3 +627,17 @@
     for dist in get_distributions():
         if dist.uses(path):
             yield dist
+
+
+def get_file_path(distribution_name, relative_path):
+    """Return the path to a resource file."""
+    dist = get_distribution(distribution_name)
+    if dist != None:
+        return dist.get_resource_path(relative_path)
+    raise LookupError('no distribution named %r found' % distribution_name)
+
+
+def get_file(distribution_name, relative_path, *args, **kwargs):
+    """Open and return a resource file."""
+    return open(get_file_path(distribution_name, relative_path),
+                *args, **kwargs)
diff --git a/Lib/packaging/install.py b/Lib/packaging/install.py
--- a/Lib/packaging/install.py
+++ b/Lib/packaging/install.py
@@ -118,15 +118,15 @@
     """
     path = os.path.abspath(path)
     if os.path.isdir(path):
-        logger.info('installing from source directory: %s', path)
+        logger.info('Installing from source directory: %s', path)
         _run_install_from_dir(path)
     elif _is_archive_file(path):
-        logger.info('installing from archive: %s', path)
+        logger.info('Installing from archive: %s', path)
         _unpacked_dir = tempfile.mkdtemp()
         shutil.unpack_archive(path, _unpacked_dir)
         _run_install_from_archive(_unpacked_dir)
     else:
-        logger.warning('no projects to install')
+        logger.warning('No projects to install.')
 
 
 def _run_install_from_archive(source_dir):
@@ -174,16 +174,16 @@
 
     installed_dists = []
     for dist in dists:
-        logger.info('installing %s %s', dist.name, dist.version)
+        logger.info('Installing %r %s...', dist.name, dist.version)
         try:
             _install_dist(dist, path)
             installed_dists.append(dist)
         except Exception as e:
-            logger.info('failed: %s', e)
+            logger.info('Failed: %s', e)
 
             # reverting
             for installed_dist in installed_dists:
-                logger.info('reverting %s', installed_dist)
+                logger.info('Reverting %s', installed_dist)
                 _remove_dist(installed_dist, paths)
             raise e
     return installed_dists
@@ -292,7 +292,7 @@
     #    or remove
 
     if not installed:
-        logger.info('reading installed distributions')
+        logger.debug('Reading installed distributions')
         installed = list(get_distributions(use_egg_info=True))
 
     infos = {'install': [], 'remove': [], 'conflict': []}
@@ -306,7 +306,7 @@
         if predicate.name.lower() != installed_project.name.lower():
             continue
         found = True
-        logger.info('found %s %s', installed_project.name,
+        logger.info('Found %s %s', installed_project.name,
                     installed_project.metadata['version'])
 
         # if we already have something installed, check it matches the
@@ -316,7 +316,7 @@
         break
 
     if not found:
-        logger.info('project not installed')
+        logger.debug('Project not installed')
 
     if not index:
         index = wrapper.ClientWrapper()
@@ -331,7 +331,7 @@
         raise InstallationException('Release not found: "%s"' % requirements)
 
     if release is None:
-        logger.info('could not find a matching project')
+        logger.info('Could not find a matching project')
         return infos
 
     metadata = release.fetch_metadata()
@@ -348,7 +348,7 @@
     # Get what the missing deps are
     dists = depgraph.missing[release]
     if dists:
-        logger.info("missing dependencies found, retrieving metadata")
+        logger.info("Missing dependencies found, retrieving metadata")
         # we have missing deps
         for dist in dists:
             _update_infos(infos, get_infos(dist, index, installed))
@@ -401,7 +401,7 @@
     finally:
         shutil.rmtree(tmp)
 
-    logger.info('removing %r: ', project_name)
+    logger.info('Removing %r: ', project_name)
 
     for file_ in rmfiles:
         logger.info('  %s', file_)
@@ -444,20 +444,20 @@
         if os.path.exists(dist.path):
             shutil.rmtree(dist.path)
 
-        logger.info('success: removed %d files and %d dirs',
+        logger.info('Success: removed %d files and %d dirs',
                     file_count, dir_count)
 
 
 def install(project):
-    logger.info('getting information about %r', project)
+    logger.info('Getting information about %r...', project)
     try:
         info = get_infos(project)
     except InstallationException:
-        logger.info('cound not find %r', project)
+        logger.info('Cound not find %r', project)
         return
 
     if info['install'] == []:
-        logger.info('nothing to install')
+        logger.info('Nothing to install')
         return
 
     install_path = get_config_var('base')
diff --git a/Lib/packaging/metadata.py b/Lib/packaging/metadata.py
--- a/Lib/packaging/metadata.py
+++ b/Lib/packaging/metadata.py
@@ -396,22 +396,24 @@
                 value = []
 
         if logger.isEnabledFor(logging.WARNING):
+            project_name = self['Name']
+
             if name in _PREDICATE_FIELDS and value is not None:
                 for v in value:
                     # check that the values are valid predicates
                     if not is_valid_predicate(v.split(';')[0]):
                         logger.warning(
-                            '%r is not a valid predicate (field %r)',
-                            v, name)
+                            '%r: %r is not a valid predicate (field %r)',
+                            project_name, v, name)
             # FIXME this rejects UNKNOWN, is that right?
             elif name in _VERSIONS_FIELDS and value is not None:
                 if not is_valid_versions(value):
-                    logger.warning('%r is not a valid version (field %r)',
-                                   value, name)
+                    logger.warning('%r: %r is not a valid version (field %r)',
+                                   project_name, value, name)
             elif name in _VERSION_FIELDS and value is not None:
                 if not is_valid_version(value):
-                    logger.warning('%r is not a valid version (field %r)',
-                                   value, name)
+                    logger.warning('%r: %r is not a valid version (field %r)',
+                                   project_name, value, name)
 
         if name in _UNICODEFIELDS:
             if name == 'Description':
diff --git a/Lib/packaging/pypi/simple.py b/Lib/packaging/pypi/simple.py
--- a/Lib/packaging/pypi/simple.py
+++ b/Lib/packaging/pypi/simple.py
@@ -118,9 +118,10 @@
     def __init__(self, index_url=DEFAULT_SIMPLE_INDEX_URL, prefer_final=False,
                  prefer_source=True, hosts=DEFAULT_HOSTS,
                  follow_externals=False, mirrors_url=None, mirrors=None,
-                 timeout=SOCKET_TIMEOUT, mirrors_max_tries=0):
+                 timeout=SOCKET_TIMEOUT, mirrors_max_tries=0, verbose=False):
         super(Crawler, self).__init__(prefer_final, prefer_source)
         self.follow_externals = follow_externals
+        self.verbose = verbose
 
         # mirroring attributes.
         parsed = urllib.parse.urlparse(index_url)
@@ -184,7 +185,7 @@
         if predicate.name.lower() in self._projects and not force_update:
             return self._projects.get(predicate.name.lower())
         prefer_final = self._get_prefer_final(prefer_final)
-        logger.info('reading info on PyPI about %s', predicate.name)
+        logger.debug('Reading info on PyPI about %s', predicate.name)
         self._process_index_page(predicate.name)
 
         if predicate.name.lower() not in self._projects:
@@ -321,8 +322,9 @@
                                 infos = get_infos_from_url(link, project_name,
                                             is_external=not self.index_url in url)
                             except CantParseArchiveName as e:
-                                logger.warning(
-                                    "version has not been parsed: %s", e)
+                                if self.verbose:
+                                    logger.warning(
+                                        "version has not been parsed: %s", e)
                             else:
                                 self._register_release(release_info=infos)
                         else:
diff --git a/Lib/packaging/resources.py b/Lib/packaging/resources.py
deleted file mode 100644
--- a/Lib/packaging/resources.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""Data file path abstraction.
-
-Functions in this module use sysconfig to find the paths to the resource
-files registered in project's setup.cfg file.  See the documentation for
-more information.
-"""
-# TODO write that documentation
-
-from packaging.database import get_distribution
-
-__all__ = ['get_file_path', 'get_file']
-
-
-def get_file_path(distribution_name, relative_path):
-    """Return the path to a resource file."""
-    dist = get_distribution(distribution_name)
-    if dist != None:
-        return dist.get_resource_path(relative_path)
-    raise LookupError('no distribution named %r found' % distribution_name)
-
-
-def get_file(distribution_name, relative_path, *args, **kwargs):
-    """Open and return a resource file."""
-    return open(get_file_path(distribution_name, relative_path),
-                *args, **kwargs)
diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py
--- a/Lib/packaging/run.py
+++ b/Lib/packaging/run.py
@@ -5,6 +5,7 @@
 import sys
 import getopt
 import logging
+from copy import copy
 
 from packaging import logger
 from packaging.dist import Distribution
@@ -227,12 +228,13 @@
             logger.warning('no project to install')
             return
 
+    target = args[1]
     # installing from a source dir or archive file?
-    if os.path.isdir(args[1]) or _is_archive_file(args[1]):
-        install_local_project(args[1])
+    if os.path.isdir(target) or _is_archive_file(target):
+        install_local_project(target)
     else:
         # download from PyPI
-        install(args[1])
+        install(target)
 
 
 @action_help(metadata_usage)
@@ -399,6 +401,17 @@
             msg = 'Unrecognized action "%s"' % self.action
             raise PackagingArgError(msg)
 
+        self._set_logger()
+
+        # for display options we return immediately
+        option_order = self.parser.get_option_order()
+
+        self.args = args
+
+        if self.help or self.action is None:
+            self._show_help(self.parser, display_options_=False)
+
+    def _set_logger(self):
         # setting up the logging level from the command-line options
         # -q gets warning, error and critical
         if self.verbose == 0:
@@ -416,13 +429,11 @@
         else:  # -vv and more for debug
             level = logging.DEBUG
 
-        # for display options we return immediately
-        option_order = self.parser.get_option_order()
-
-        self.args = args
-
-        if self.help or self.action is None:
-            self._show_help(self.parser, display_options_=False)
+        # setting up the stream handler
+        handler = logging.StreamHandler(sys.stderr)
+        handler.setLevel(level)
+        logger.addHandler(handler)
+        logger.setLevel(level)
 
     def _parse_command_opts(self, parser, args):
         # Pull the current command from the head of the command line
@@ -635,11 +646,17 @@
 
 
 def main(args=None):
-    dispatcher = Dispatcher(args)
-    if dispatcher.action is None:
-        return
+    old_level = logger.level
+    old_handlers = copy(logger.handlers)
+    try:
+        dispatcher = Dispatcher(args)
+        if dispatcher.action is None:
+            return
+        return dispatcher()
+    finally:
+        logger.setLevel(old_level)
+        logger.handlers[:] = old_handlers
 
-    return dispatcher()
 
 if __name__ == '__main__':
     sys.exit(main())
diff --git a/Lib/packaging/tests/test_command_test.py b/Lib/packaging/tests/test_command_test.py
--- a/Lib/packaging/tests/test_command_test.py
+++ b/Lib/packaging/tests/test_command_test.py
@@ -150,8 +150,7 @@
         cmd.tests_require = [phony_project]
         cmd.ensure_finalized()
         logs = self.get_logs(logging.WARNING)
-        self.assertEqual(1, len(logs))
-        self.assertIn(phony_project, logs[0])
+        self.assertIn(phony_project, logs[-1])
 
     def prepare_a_module(self):
         tmp_dir = self.mkdtemp()
diff --git a/Lib/packaging/tests/test_database.py b/Lib/packaging/tests/test_database.py
--- a/Lib/packaging/tests/test_database.py
+++ b/Lib/packaging/tests/test_database.py
@@ -1,23 +1,25 @@
 import os
 import io
 import csv
-import imp
 import sys
 import shutil
-import zipfile
 import tempfile
 from os.path import relpath  # separate import for backport concerns
 from hashlib import md5
+from textwrap import dedent
 
+from packaging.tests.test_util import GlobTestCaseBase
+from packaging.tests.support import requires_zlib
+
+from packaging.config import get_resources_dests
 from packaging.errors import PackagingError
 from packaging.metadata import Metadata
-from packaging.tests import unittest, run_unittest, support, TESTFN
-from packaging.tests.support import requires_zlib
-
+from packaging.tests import unittest, support
 from packaging.database import (
     Distribution, EggInfoDistribution, get_distribution, get_distributions,
     provides_distribution, obsoletes_distribution, get_file_users,
-    enable_cache, disable_cache, distinfo_dirname, _yield_distributions)
+    enable_cache, disable_cache, distinfo_dirname, _yield_distributions,
+    get_file, get_file_path)
 
 # TODO Add a test for getting a distribution provided by another distribution
 # TODO Add a test for absolute pathed RECORD items (e.g. /etc/myapp/config.ini)
@@ -504,12 +506,161 @@
         checkLists(dists + eggs, found)
 
 
+class DataFilesTestCase(GlobTestCaseBase):
+
+    def assertRulesMatch(self, rules, spec):
+        tempdir = self.build_files_tree(spec)
+        expected = self.clean_tree(spec)
+        result = get_resources_dests(tempdir, rules)
+        self.assertEqual(expected, result)
+
+    def clean_tree(self, spec):
+        files = {}
+        for path, value in spec.items():
+            if value is not None:
+                files[path] = value
+        return files
+
+    def test_simple_glob(self):
+        rules = [('', '*.tpl', '{data}')]
+        spec = {'coucou.tpl': '{data}/coucou.tpl',
+                'Donotwant': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_multiple_match(self):
+        rules = [('scripts', '*.bin', '{appdata}'),
+                 ('scripts', '*', '{appscript}')]
+        spec = {'scripts/script.bin': '{appscript}/script.bin',
+                'Babarlikestrawberry': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_set_match(self):
+        rules = [('scripts', '*.{bin,sh}', '{appscript}')]
+        spec = {'scripts/script.bin': '{appscript}/script.bin',
+                'scripts/babar.sh':  '{appscript}/babar.sh',
+                'Babarlikestrawberry': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_set_match_multiple(self):
+        rules = [('scripts', 'script{s,}.{bin,sh}', '{appscript}')]
+        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
+                'scripts/script.sh':  '{appscript}/script.sh',
+                'Babarlikestrawberry': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_set_match_exclude(self):
+        rules = [('scripts', '*', '{appscript}'),
+                 ('', os.path.join('**', '*.sh'), None)]
+        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
+                'scripts/script.sh':  None,
+                'Babarlikestrawberry': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_glob_in_base(self):
+        rules = [('scrip*', '*.bin', '{appscript}')]
+        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
+                'scripouille/babar.bin': '{appscript}/babar.bin',
+                'scriptortu/lotus.bin': '{appscript}/lotus.bin',
+                'Babarlikestrawberry': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_recursive_glob(self):
+        rules = [('', os.path.join('**', '*.bin'), '{binary}')]
+        spec = {'binary0.bin': '{binary}/binary0.bin',
+                'scripts/binary1.bin': '{binary}/scripts/binary1.bin',
+                'scripts/bin/binary2.bin': '{binary}/scripts/bin/binary2.bin',
+                'you/kill/pandabear.guy': None}
+        self.assertRulesMatch(rules, spec)
+
+    def test_final_exemple_glob(self):
+        rules = [
+            ('mailman/database/schemas/', '*', '{appdata}/schemas'),
+            ('', os.path.join('**', '*.tpl'), '{appdata}/templates'),
+            ('', os.path.join('developer-docs', '**', '*.txt'), '{doc}'),
+            ('', 'README', '{doc}'),
+            ('mailman/etc/', '*', '{config}'),
+            ('mailman/foo/', os.path.join('**', 'bar', '*.cfg'),
+             '{config}/baz'),
+            ('mailman/foo/', os.path.join('**', '*.cfg'), '{config}/hmm'),
+            ('', 'some-new-semantic.sns', '{funky-crazy-category}'),
+        ]
+        spec = {
+            'README': '{doc}/README',
+            'some.tpl': '{appdata}/templates/some.tpl',
+            'some-new-semantic.sns':
+                '{funky-crazy-category}/some-new-semantic.sns',
+            'mailman/database/mailman.db': None,
+            'mailman/database/schemas/blah.schema':
+                '{appdata}/schemas/blah.schema',
+            'mailman/etc/my.cnf': '{config}/my.cnf',
+            'mailman/foo/some/path/bar/my.cfg':
+                '{config}/hmm/some/path/bar/my.cfg',
+            'mailman/foo/some/path/other.cfg':
+                '{config}/hmm/some/path/other.cfg',
+            'developer-docs/index.txt': '{doc}/developer-docs/index.txt',
+            'developer-docs/api/toc.txt': '{doc}/developer-docs/api/toc.txt',
+        }
+        self.maxDiff = None
+        self.assertRulesMatch(rules, spec)
+
+    def test_get_file(self):
+        # Create a fake dist
+        temp_site_packages = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, temp_site_packages)
+
+        dist_name = 'test'
+        dist_info = os.path.join(temp_site_packages, 'test-0.1.dist-info')
+        os.mkdir(dist_info)
+
+        metadata_path = os.path.join(dist_info, 'METADATA')
+        resources_path = os.path.join(dist_info, 'RESOURCES')
+
+        with open(metadata_path, 'w') as fp:
+            fp.write(dedent("""\
+                Metadata-Version: 1.2
+                Name: test
+                Version: 0.1
+                Summary: test
+                Author: me
+                """))
+
+        test_path = 'test.cfg'
+
+        fd, test_resource_path = tempfile.mkstemp()
+        os.close(fd)
+        self.addCleanup(os.remove, test_resource_path)
+
+        with open(test_resource_path, 'w') as fp:
+            fp.write('Config')
+
+        with open(resources_path, 'w') as fp:
+            fp.write('%s,%s' % (test_path, test_resource_path))
+
+        # Add fake site-packages to sys.path to retrieve fake dist
+        self.addCleanup(sys.path.remove, temp_site_packages)
+        sys.path.insert(0, temp_site_packages)
+
+        # Force packaging.database to rescan the sys.path
+        self.addCleanup(enable_cache)
+        disable_cache()
+
+        # Try to retrieve resources paths and files
+        self.assertEqual(get_file_path(dist_name, test_path),
+                         test_resource_path)
+        self.assertRaises(KeyError, get_file_path, dist_name, 'i-dont-exist')
+
+        with get_file(dist_name, test_path) as fp:
+            self.assertEqual(fp.read(), 'Config')
+        self.assertRaises(KeyError, get_file, dist_name, 'i-dont-exist')
+
+
 def test_suite():
     suite = unittest.TestSuite()
     load = unittest.defaultTestLoader.loadTestsFromTestCase
     suite.addTest(load(TestDistribution))
     suite.addTest(load(TestEggInfoDistribution))
     suite.addTest(load(TestDatabase))
+    suite.addTest(load(DataFilesTestCase))
     return suite
 
 
diff --git a/Lib/packaging/tests/test_resources.py b/Lib/packaging/tests/test_resources.py
deleted file mode 100644
--- a/Lib/packaging/tests/test_resources.py
+++ /dev/null
@@ -1,167 +0,0 @@
-"""Tests for packaging.resources."""
-
-import os
-import sys
-import shutil
-import tempfile
-from textwrap import dedent
-from packaging.config import get_resources_dests
-from packaging.database import disable_cache, enable_cache
-from packaging.resources import get_file, get_file_path
-
-from packaging.tests import unittest
-from packaging.tests.test_util import GlobTestCaseBase
-
-
-class DataFilesTestCase(GlobTestCaseBase):
-
-    def assertRulesMatch(self, rules, spec):
-        tempdir = self.build_files_tree(spec)
-        expected = self.clean_tree(spec)
-        result = get_resources_dests(tempdir, rules)
-        self.assertEqual(expected, result)
-
-    def clean_tree(self, spec):
-        files = {}
-        for path, value in spec.items():
-            if value is not None:
-                files[path] = value
-        return files
-
-    def test_simple_glob(self):
-        rules = [('', '*.tpl', '{data}')]
-        spec = {'coucou.tpl': '{data}/coucou.tpl',
-                'Donotwant': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_multiple_match(self):
-        rules = [('scripts', '*.bin', '{appdata}'),
-                 ('scripts', '*', '{appscript}')]
-        spec = {'scripts/script.bin': '{appscript}/script.bin',
-                'Babarlikestrawberry': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_set_match(self):
-        rules = [('scripts', '*.{bin,sh}', '{appscript}')]
-        spec = {'scripts/script.bin': '{appscript}/script.bin',
-                'scripts/babar.sh':  '{appscript}/babar.sh',
-                'Babarlikestrawberry': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_set_match_multiple(self):
-        rules = [('scripts', 'script{s,}.{bin,sh}', '{appscript}')]
-        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
-                'scripts/script.sh':  '{appscript}/script.sh',
-                'Babarlikestrawberry': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_set_match_exclude(self):
-        rules = [('scripts', '*', '{appscript}'),
-                 ('', os.path.join('**', '*.sh'), None)]
-        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
-                'scripts/script.sh':  None,
-                'Babarlikestrawberry': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_glob_in_base(self):
-        rules = [('scrip*', '*.bin', '{appscript}')]
-        spec = {'scripts/scripts.bin': '{appscript}/scripts.bin',
-                'scripouille/babar.bin': '{appscript}/babar.bin',
-                'scriptortu/lotus.bin': '{appscript}/lotus.bin',
-                'Babarlikestrawberry': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_recursive_glob(self):
-        rules = [('', os.path.join('**', '*.bin'), '{binary}')]
-        spec = {'binary0.bin': '{binary}/binary0.bin',
-                'scripts/binary1.bin': '{binary}/scripts/binary1.bin',
-                'scripts/bin/binary2.bin': '{binary}/scripts/bin/binary2.bin',
-                'you/kill/pandabear.guy': None}
-        self.assertRulesMatch(rules, spec)
-
-    def test_final_exemple_glob(self):
-        rules = [
-            ('mailman/database/schemas/', '*', '{appdata}/schemas'),
-            ('', os.path.join('**', '*.tpl'), '{appdata}/templates'),
-            ('', os.path.join('developer-docs', '**', '*.txt'), '{doc}'),
-            ('', 'README', '{doc}'),
-            ('mailman/etc/', '*', '{config}'),
-            ('mailman/foo/', os.path.join('**', 'bar', '*.cfg'), '{config}/baz'),
-            ('mailman/foo/', os.path.join('**', '*.cfg'), '{config}/hmm'),
-            ('', 'some-new-semantic.sns', '{funky-crazy-category}'),
-        ]
-        spec = {
-            'README': '{doc}/README',
-            'some.tpl': '{appdata}/templates/some.tpl',
-            'some-new-semantic.sns':
-                '{funky-crazy-category}/some-new-semantic.sns',
-            'mailman/database/mailman.db': None,
-            'mailman/database/schemas/blah.schema':
-                '{appdata}/schemas/blah.schema',
-            'mailman/etc/my.cnf': '{config}/my.cnf',
-            'mailman/foo/some/path/bar/my.cfg':
-                '{config}/hmm/some/path/bar/my.cfg',
-            'mailman/foo/some/path/other.cfg':
-                '{config}/hmm/some/path/other.cfg',
-            'developer-docs/index.txt': '{doc}/developer-docs/index.txt',
-            'developer-docs/api/toc.txt': '{doc}/developer-docs/api/toc.txt',
-        }
-        self.maxDiff = None
-        self.assertRulesMatch(rules, spec)
-
-    def test_get_file(self):
-        # Create a fake dist
-        temp_site_packages = tempfile.mkdtemp()
-        self.addCleanup(shutil.rmtree, temp_site_packages)
-
-        dist_name = 'test'
-        dist_info = os.path.join(temp_site_packages, 'test-0.1.dist-info')
-        os.mkdir(dist_info)
-
-        metadata_path = os.path.join(dist_info, 'METADATA')
-        resources_path = os.path.join(dist_info, 'RESOURCES')
-
-        with open(metadata_path, 'w') as fp:
-            fp.write(dedent("""\
-                Metadata-Version: 1.2
-                Name: test
-                Version: 0.1
-                Summary: test
-                Author: me
-                """))
-
-        test_path = 'test.cfg'
-
-        fd, test_resource_path = tempfile.mkstemp()
-        os.close(fd)
-        self.addCleanup(os.remove, test_resource_path)
-
-        with open(test_resource_path, 'w') as fp:
-            fp.write('Config')
-
-        with open(resources_path, 'w') as fp:
-            fp.write('%s,%s' % (test_path, test_resource_path))
-
-        # Add fake site-packages to sys.path to retrieve fake dist
-        self.addCleanup(sys.path.remove, temp_site_packages)
-        sys.path.insert(0, temp_site_packages)
-
-        # Force packaging.database to rescan the sys.path
-        self.addCleanup(enable_cache)
-        disable_cache()
-
-        # Try to retrieve resources paths and files
-        self.assertEqual(get_file_path(dist_name, test_path),
-                         test_resource_path)
-        self.assertRaises(KeyError, get_file_path, dist_name, 'i-dont-exist')
-
-        with get_file(dist_name, test_path) as fp:
-            self.assertEqual(fp.read(), 'Config')
-        self.assertRaises(KeyError, get_file, dist_name, 'i-dont-exist')
-
-
-def test_suite():
-    return unittest.makeSuite(DataFilesTestCase)
-
-if __name__ == '__main__':
-    unittest.main(defaultTest='test_suite')
diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py
--- a/Lib/packaging/tests/test_uninstall.py
+++ b/Lib/packaging/tests/test_uninstall.py
@@ -1,6 +1,7 @@
 """Tests for the uninstall command."""
 import os
 import sys
+from io import StringIO
 
 from packaging.database import disable_cache, enable_cache
 from packaging.run import main
@@ -79,7 +80,12 @@
         if not dirname:
             dirname = self.make_dist(name, **kw)
         os.chdir(dirname)
-        dist = self.run_setup('install_dist', '--prefix=' + self.root_dir)
+        old_out = sys.stdout
+        sys.stderr = StringIO()
+        try:
+            dist = self.run_setup('install_dist', '--prefix=' + self.root_dir)
+        finally:
+            sys.sterr = old_out
         install_lib = self.get_path(dist, 'purelib')
         return dist, install_lib
 
diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py
--- a/Lib/packaging/tests/test_util.py
+++ b/Lib/packaging/tests/test_util.py
@@ -818,51 +818,51 @@
 
     def test_is_setuptools_logs_setup_py_text_found(self):
         is_setuptools(self._setuptools_setup_py_pkg())
-        expected = ['setup.py file found', 'found setuptools text in setup.py']
-        self.assertEqual(expected, self.get_logs(logging.INFO))
+        expected = ['setup.py file found.',
+                    'No egg-info directory found.',
+                    'Found setuptools text in setup.py.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_setuptools_logs_setup_py_text_not_found(self):
         directory = self._random_setup_py_pkg()
         is_setuptools(directory)
-        info_expected = ['setup.py file found']
-        warn_expected = ['no egg-info directory found',
-                         'no setuptools text found in setup.py']
-        self.assertEqual(info_expected, self.get_logs(logging.INFO))
-        self.assertEqual(warn_expected, self.get_logs(logging.WARN))
+        expected = ['setup.py file found.', 'No egg-info directory found.',
+                    'No setuptools text found in setup.py.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_setuptools_logs_egg_info_dir_found(self):
         is_setuptools(self._setuptools_egg_info_pkg())
-        expected = ['setup.py file found', 'found egg-info directory']
-        self.assertEqual(expected, self.get_logs(logging.INFO))
+        expected = ['setup.py file found.', 'Found egg-info directory.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_distutils_logs_setup_py_text_found(self):
         is_distutils(self._distutils_setup_py_pkg())
-        expected = ['setup.py file found', 'found distutils text in setup.py']
-        self.assertEqual(expected, self.get_logs(logging.INFO))
+        expected = ['setup.py file found.',
+                    'No PKG-INFO file found.',
+                    'Found distutils text in setup.py.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_distutils_logs_setup_py_text_not_found(self):
         directory = self._random_setup_py_pkg()
         is_distutils(directory)
-        info_expected = ['setup.py file found']
-        warn_expected = ['no PKG-INFO file found',
-                         'no distutils text found in setup.py']
-        self.assertEqual(info_expected, self.get_logs(logging.INFO))
-        self.assertEqual(warn_expected, self.get_logs(logging.WARN))
+        expected = ['setup.py file found.', 'No PKG-INFO file found.',
+                    'No distutils text found in setup.py.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_distutils_logs_pkg_info_file_found(self):
         is_distutils(self._distutils_pkg_info())
-        expected = ['setup.py file found', 'PKG-INFO file found']
-        self.assertEqual(expected, self.get_logs(logging.INFO))
+        expected = ['setup.py file found.', 'PKG-INFO file found.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_packaging_logs_setup_cfg_found(self):
         is_packaging(self._valid_setup_cfg_pkg())
-        expected = ['setup.cfg file found']
-        self.assertEqual(expected, self.get_logs(logging.INFO))
+        expected = ['setup.cfg file found.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def test_is_packaging_logs_setup_cfg_not_found(self):
         is_packaging(self._empty_dir)
-        expected = ['no setup.cfg file found']
-        self.assertEqual(expected, self.get_logs(logging.WARN))
+        expected = ['No setup.cfg file found.']
+        self.assertEqual(expected, self.get_logs(logging.DEBUG))
 
     def _write_setuptools_setup_py(self, directory):
         self.write_file((directory, 'setup.py'),
diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py
--- a/Lib/packaging/util.py
+++ b/Lib/packaging/util.py
@@ -1224,9 +1224,9 @@
         for item in os.listdir(srcdir):
             full_path = os.path.join(srcdir, item)
             if item.endswith('.egg-info') and os.path.isdir(full_path):
-                logger.info("found egg-info directory")
+                logger.debug("Found egg-info directory.")
                 return True
-    logger.warning("no egg-info directory found")
+    logger.debug("No egg-info directory found.")
     return False
 
 
@@ -1243,9 +1243,9 @@
     with open(setup_py, 'r', encoding='utf-8') as setup:
         for line in setup:
             if re.search(installer_pattern, line):
-                logger.info("found %s text in setup.py", installer)
+                logger.debug("Found %s text in setup.py.", installer)
                 return True
-    logger.warning("no %s text found in setup.py", installer)
+    logger.debug("No %s text found in setup.py.", installer)
     return False
 
 
@@ -1261,15 +1261,16 @@
     pkg_info = os.path.join(srcdir, 'PKG-INFO')
     has_pkg_info = os.path.isfile(pkg_info)
     if has_pkg_info:
-        logger.info("PKG-INFO file found")
-    logger.warning("no PKG-INFO file found")
+        logger.debug("PKG-INFO file found.")
+    else:
+        logger.debug("No PKG-INFO file found.")
     return has_pkg_info
 
 
 def _has_setup_py(srcdir):
     setup_py = os.path.join(srcdir, 'setup.py')
     if os.path.isfile(setup_py):
-        logger.info('setup.py file found')
+        logger.debug('setup.py file found.')
         return True
     return False
 
@@ -1277,9 +1278,9 @@
 def _has_setup_cfg(srcdir):
     setup_cfg = os.path.join(srcdir, 'setup.cfg')
     if os.path.isfile(setup_cfg):
-        logger.info('setup.cfg file found')
+        logger.debug('setup.cfg file found.')
         return True
-    logger.warning("no setup.cfg file found")
+    logger.debug("No setup.cfg file found.")
     return False
 
 
diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
--- a/Lib/test/test_concurrent_futures.py
+++ b/Lib/test/test_concurrent_futures.py
@@ -260,14 +260,14 @@
 
     def test_timeout(self):
         future1 = self.executor.submit(mul, 6, 7)
-        future2 = self.executor.submit(time.sleep, 3)
+        future2 = self.executor.submit(time.sleep, 6)
 
         finished, pending = futures.wait(
                 [CANCELLED_AND_NOTIFIED_FUTURE,
                  EXCEPTION_FUTURE,
                  SUCCESSFUL_FUTURE,
                  future1, future2],
-                timeout=1.5,
+                timeout=5,
                 return_when=futures.ALL_COMPLETED)
 
         self.assertEqual(set([CANCELLED_AND_NOTIFIED_FUTURE,
@@ -357,8 +357,8 @@
         results = []
         try:
             for i in self.executor.map(time.sleep,
-                                       [0, 0, 3],
-                                       timeout=1.5):
+                                       [0, 0, 6],
+                                       timeout=5):
                 results.append(i)
         except futures.TimeoutError:
             pass

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list