docs: def estimate(self, upgrades):
          """Estimate the time needed to apply upgrades.
  
          If an upgrades does not specify and estimate it is assumed to be
          in the order of 1 second.
  
          :param upgrades: List of upgrades sorted in topological order.
          """
          val = 0
          for u in upgrades:
              val += u.estimate()
          return val