reporter.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from collections import defaultdict
  2. from logging import getLogger
  3. from pip._vendor.resolvelib.reporters import BaseReporter
  4. from pip._internal.utils.typing import MYPY_CHECK_RUNNING
  5. if MYPY_CHECK_RUNNING:
  6. from typing import Any, DefaultDict
  7. from .base import Candidate, Requirement
  8. logger = getLogger(__name__)
  9. class PipReporter(BaseReporter):
  10. def __init__(self):
  11. # type: () -> None
  12. self.backtracks_by_package = defaultdict(int) # type: DefaultDict[str, int]
  13. self._messages_at_backtrack = {
  14. 1: (
  15. "pip is looking at multiple versions of {package_name} to "
  16. "determine which version is compatible with other "
  17. "requirements. This could take a while."
  18. ),
  19. 8: (
  20. "pip is looking at multiple versions of {package_name} to "
  21. "determine which version is compatible with other "
  22. "requirements. This could take a while."
  23. ),
  24. 13: (
  25. "This is taking longer than usual. You might need to provide "
  26. "the dependency resolver with stricter constraints to reduce "
  27. "runtime. If you want to abort this run, you can press "
  28. "Ctrl + C to do so. To improve how pip performs, tell us what "
  29. "happened here: https://pip.pypa.io/surveys/backtracking"
  30. )
  31. }
  32. def backtracking(self, candidate):
  33. # type: (Candidate) -> None
  34. self.backtracks_by_package[candidate.name] += 1
  35. count = self.backtracks_by_package[candidate.name]
  36. if count not in self._messages_at_backtrack:
  37. return
  38. message = self._messages_at_backtrack[count]
  39. logger.info("INFO: %s", message.format(package_name=candidate.name))
  40. class PipDebuggingReporter(BaseReporter):
  41. """A reporter that does an info log for every event it sees."""
  42. def starting(self):
  43. # type: () -> None
  44. logger.info("Reporter.starting()")
  45. def starting_round(self, index):
  46. # type: (int) -> None
  47. logger.info("Reporter.starting_round(%r)", index)
  48. def ending_round(self, index, state):
  49. # type: (int, Any) -> None
  50. logger.info("Reporter.ending_round(%r, state)", index)
  51. def ending(self, state):
  52. # type: (Any) -> None
  53. logger.info("Reporter.ending(%r)", state)
  54. def adding_requirement(self, requirement, parent):
  55. # type: (Requirement, Candidate) -> None
  56. logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent)
  57. def backtracking(self, candidate):
  58. # type: (Candidate) -> None
  59. logger.info("Reporter.backtracking(%r)", candidate)
  60. def pinning(self, candidate):
  61. # type: (Candidate) -> None
  62. logger.info("Reporter.pinning(%r)", candidate)