Kaydet (Commit) b1b6e138 authored tarafından Tarek Ziade's avatar Tarek Ziade

Cleaned up the installer output behavior.

This change also makes sure the logger handlers are not alterated after an
installation. That also fixes the remaining environment alteration issue in
test_packaging.
üst 43f289ad
......@@ -118,15 +118,15 @@ def install_local_project(path):
"""
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 @@ def install_dists(dists, path, paths=sys.path):
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 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
# 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 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
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 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
break
if not found:
logger.info('project not installed')
logger.debug('Project not installed')
if not index:
index = wrapper.ClientWrapper()
......@@ -331,7 +331,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
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 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
# 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 @@ def remove(project_name, paths=sys.path, auto_confirm=True):
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 @@ def remove(project_name, paths=sys.path, auto_confirm=True):
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')
......
......@@ -118,9 +118,10 @@ class Crawler(BaseClient):
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 @@ class Crawler(BaseClient):
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 @@ class Crawler(BaseClient):
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:
......
......@@ -5,6 +5,7 @@ import re
import sys
import getopt
import logging
from copy import copy
from packaging import logger
from packaging.dist import Distribution
......@@ -227,12 +228,13 @@ def _install(dispatcher, args, **kw):
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 @@ class Dispatcher:
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 @@ class Dispatcher:
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 @@ class Dispatcher:
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())
......@@ -150,8 +150,7 @@ class TestTest(TempdirManager,
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()
......
......@@ -818,51 +818,51 @@ class PackagingLibChecks(support.TempdirManager,
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'),
......
......@@ -1224,9 +1224,9 @@ def _has_egg_info(srcdir):
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 @@ def _has_text(setup_py, installer):
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 @@ def _has_pkg_info(srcdir):
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_py(srcdir):
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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment