def with_wget(url_dict=None, target_file=None):
    """
    Decorate a project class with wget-based version information.

    This adds two attributes to a project class:
        - A `versions` method that returns a list of available versions
          for this project.
        - A `repository` attribute that provides a repository string to
          download from later.
    We use the `git rev-list` subcommand to list available versions.

    Args:
        url_dict (dict): A dictionary that assigns a version to a download URL.
        target_file (str): An optional path where we should put the clone.
            If unspecified, we will use the `SRC_FILE` attribute of
            the decorated class.
    """

    def wget_decorator(cls):
        def download_impl(self):
            """Download the selected version from the url_dict value."""
            t_file = target_file if target_file else self.SRC_FILE
            t_version = url_dict[self.version]
            Wget(t_version, t_file)

        @staticmethod
        def versions_impl():
            """Return a list of versions from the url_dict keys."""
            return list(url_dict.keys())

        cls.versions = versions_impl
        cls.download = download_impl
        return cls

    return wget_decorator
Decorate a project class with wget-based version information.

    This adds two attributes to a project class:
        - A `versions` method that returns a list of available versions
          for this project.
        - A `repository` attribute that provides a repository string to
          download from later.
    We use the `git rev-list` subcommand to list available versions.

    Args:
        url_dict (dict): A dictionary that assigns a version to a download URL.
        target_file (str): An optional path where we should put the clone.
            If unspecified, we will use the `SRC_FILE` attribute of
            the decorated class.