2016-02-22 11:13:36 +00:00
|
|
|
"""
|
|
|
|
A module that implments tooling to enable easy warnings about deprecations.
|
|
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import warnings
|
|
|
|
|
|
|
|
|
|
|
|
class PipDeprecationWarning(Warning):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-03-23 11:41:42 +00:00
|
|
|
class Pending(object):
|
2016-02-22 11:13:36 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-03-23 11:41:42 +00:00
|
|
|
class RemovedInPip9Warning(PipDeprecationWarning):
|
2016-02-22 11:13:36 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-03-23 11:41:42 +00:00
|
|
|
class RemovedInPip10Warning(PipDeprecationWarning, Pending):
|
2016-02-22 11:13:36 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-03-23 11:41:42 +00:00
|
|
|
class Python26DeprecationWarning(PipDeprecationWarning, Pending):
|
|
|
|
pass
|
2016-02-22 11:13:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Warnings <-> Logging Integration
|
|
|
|
|
|
|
|
|
|
|
|
_warnings_showwarning = None
|
|
|
|
|
|
|
|
|
|
|
|
def _showwarning(message, category, filename, lineno, file=None, line=None):
|
|
|
|
if file is not None:
|
|
|
|
if _warnings_showwarning is not None:
|
|
|
|
_warnings_showwarning(
|
|
|
|
message, category, filename, lineno, file, line,
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
if issubclass(category, PipDeprecationWarning):
|
|
|
|
# We use a specially named logger which will handle all of the
|
|
|
|
# deprecation messages for pip.
|
|
|
|
logger = logging.getLogger("pip.deprecations")
|
|
|
|
|
|
|
|
# This is purposely using the % formatter here instead of letting
|
|
|
|
# the logging module handle the interpolation. This is because we
|
|
|
|
# want it to appear as if someone typed this entire message out.
|
|
|
|
log_message = "DEPRECATION: %s" % message
|
|
|
|
|
2016-03-23 11:41:42 +00:00
|
|
|
# PipDeprecationWarnings that are Pending still have at least 2
|
|
|
|
# versions to go until they are removed so they can just be
|
|
|
|
# warnings. Otherwise, they will be removed in the very next
|
|
|
|
# version of pip. We want these to be more obvious so we use the
|
|
|
|
# ERROR logging level.
|
|
|
|
if issubclass(category, Pending):
|
2016-02-22 11:13:36 +00:00
|
|
|
logger.warning(log_message)
|
2016-03-23 11:41:42 +00:00
|
|
|
else:
|
|
|
|
logger.error(log_message)
|
2016-02-22 11:13:36 +00:00
|
|
|
else:
|
|
|
|
_warnings_showwarning(
|
|
|
|
message, category, filename, lineno, file, line,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def install_warning_logger():
|
2016-03-23 11:41:42 +00:00
|
|
|
# Enable our Deprecation Warnings
|
|
|
|
warnings.simplefilter("default", PipDeprecationWarning, append=True)
|
|
|
|
|
2016-02-22 11:13:36 +00:00
|
|
|
global _warnings_showwarning
|
|
|
|
|
|
|
|
if _warnings_showwarning is None:
|
|
|
|
_warnings_showwarning = warnings.showwarning
|
|
|
|
warnings.showwarning = _showwarning
|