code: def reasons_to_paths(reasons):
      
      blockers = set(reasons.keys()) - set(reasons.values())
      paths = set()
      for blocker in blockers:
          path = [blocker]
          parent = reasons[blocker]
          while parent:
              if parent in path:
                  raise CircularDependencyError(dict(parent=parent,
                                                     blocker=blocker,
                                                     path=path))
              path.append(parent)
              parent = reasons.get(parent)
          paths.add(tuple(path))
      return paths
docs: Calculate the dependency paths to the reasons of the blockers.
  
      Paths will be in reverse-dependency order (i.e. parent projects are in
      ascending order).