reporter.py 2.7 KB

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