"""
pygithub based help functions for interacting with the github api.
"""

from github import Github
from public import public
import codekit.codetools as codetools
import github
import logging
import textwrap

logging.basicConfig()
logger = logging.getLogger('codekit')


class CaughtGitError(Exception):
    """Simple exception class intended to bundle together a github.Repository
    object and a thrown exception
    """
    def __init__(self, repo, caught):
        assert isinstance(repo, github.Repository.Repository), type(repo)
        assert isinstance(caught, Exception)

        self.repo = repo
        self.caught = caught

    def __str__(self):
        return textwrap.dedent("""\
            Caught: {name}
              In repo: {repo}
              Message: {e}\
            """.format(
            name=type(self.caught),
            repo=self.repo.full_name,
            e=str(self.caught)
        ))


@public
def login_github(token_path=None, token=None):
    """Log into GitHub using an existing token.

    Parameters
    ----------
    token_path : str, optional
        Path to the token file. The default token is used otherwise.

    token: str, optional
        Literial token string. If specifified, this value is used instead of
        reading from the token_path file.

    Returns
    -------
    gh : :class:`github.GitHub` instance
        A GitHub login instance.
    """

    token = codetools.github_token(token_path=token_path, token=token)
    return Github(token)


@public
def find_tag_by_name(repo, tag_name, safe=True):
    """Find tag by name in a github Repository

    Parameters
    ----------
    repo: :class:`github.Repository` instance

    tag_name: str
        Short name of tag (not a fully qualified ref).

    safe: bool, optional
        Defaults to `True`. When `True`, `None` is returned on failure. When
        `False`, an exception will be raised upon failure.

    Returns
    -------
    gh : :class:`github.GitRef` instance or `None`

    Raises
    ------
    github.UnknownObjectException
        If git tag name does not exist in repo.
    """
    tagfmt = 'tags/{ref}'.format(ref=tag_name)

    try:
        ref = repo.get_git_ref(tagfmt)
        if ref and ref.ref:
            return ref
    except github.UnknownObjectException:
        if not safe:
            raise

    return None

@@ -915,24 +915,801 @@
        ))%0A%0A%0A
+class CaughtTeamError(Exception):%0A    %22%22%22Simple exception class intended to bundle together a github.Repository%0A    object and a thrown exception%0A    %22%22%22%0A    def __init__(self, org, team, caught):%0A        assert isinstance(org, github.Organization.Organization), type(org)%0A        assert isinstance(team, github.Team.Team), type(team)%0A        assert isinstance(caught, Exception)%0A%0A        self.org = org%0A        self.team = team%0A        self.caught = caught%0A%0A    def __str__(self):%0A        return textwrap.dedent(%22%22%22%5C%0A            Caught: %7Bname%7D%0A              In team: %7Bteam%7D@%7Borg%7D%0A              Message: %7Be%7D%5C%0A            %22%22%22.format(%0A            name=type(self.caught),%0A            team=self.team.name,%0A            org=self.org.name,%0A            e=str(self.caught)%0A        ))%0A%0A%0A
 @public%0Adef 

add pygithub.CaughtTeamError exception class