Esempio n. 1
0
def get_installations(integration):  # pragma: no cover
    # FIXME(sileht): This is currently always mocked in tests

    installs = []
    url = "https://api.github.com/app/installations"
    token = "Bearer {}".format(integration.create_jwt())
    session = requests.Session()
    while True:
        response = session.get(
            url,
            headers={
                "Authorization": token,
                "Accept": "application/vnd.github.machine-man-preview+json",
                "User-Agent": "PyGithub/Python"
            })
        if response.status_code == 200:
            installs.extend(response.json())
            if "next" in response.links:
                url = response.links["next"]["url"]
                continue
            else:
                return installs
        elif response.status_code == 403:
            raise github.BadCredentialsException(status=response.status_code,
                                                 data=response.text)
        elif response.status_code == 404:
            raise github.UnknownObjectException(status=response.status_code,
                                                data=response.text)
        raise github.GithubException(status=response.status_code,
                                     data=response.text)
Esempio n. 2
0
def get_repositories_setuped(token, install_id):  # pragma: no cover
    repositories = []
    url = ("https://api.%s/user/installations/%s/repositories" %
           (config.GITHUB_DOMAIN, install_id))
    token = "token {}".format(token)
    session = requests.Session()
    while True:
        response = session.get(
            url,
            headers={
                "Authorization": token,
                "Accept": "application/vnd.github.machine-man-preview+json",
                "User-Agent": "PyGithub/Python"
            })
        if response.status_code == 200:
            repositories.extend(response.json()["repositories"])
            if "next" in response.links:
                url = response.links["next"]["url"]
                continue
            else:
                return repositories
        elif response.status_code == 403:
            raise github.BadCredentialsException(status=response.status_code,
                                                 data=response.text)
        elif response.status_code == 404:
            raise github.UnknownObjectException(status=response.status_code,
                                                data=response.text)
        raise github.GithubException(status=response.status_code,
                                     data=response.text)
Esempio n. 3
0
def get_installation_id(integration, owner, repo=None, account_type=None):
    if not account_type and not repo:
        raise RuntimeError("repo or account_type must be passed")
    if repo:
        url = "https://api.%s/repos/%s/%s/installation" % (
            config.GITHUB_DOMAIN,
            owner,
            repo,
        )
    else:
        url = "https://api.%s/%s/%s/installation" % (
            config.GITHUB_DOMAIN,
            "users" if account_type.lower() == "User" else "orgs",
            owner,
        )
    token = "Bearer {}".format(integration.create_jwt())
    response = requests.get(
        url,
        headers={
            "Authorization": token,
            "Accept": "application/vnd.github.machine-man-preview+json",
            "User-Agent": "PyGithub/Python",
        },
    )
    if response.status_code == 200:
        return response.json()["id"]
    elif response.status_code == 403:
        raise github.BadCredentialsException(status=response.status_code,
                                             data=response.text)
    elif response.status_code == 404:
        raise github.UnknownObjectException(status=response.status_code,
                                            data=response.text)
    raise github.GithubException(status=response.status_code,
                                 data=response.text)
Esempio n. 4
0
class ApiTestCase(test.APITestCase):
    """Test case for API."""
    def setUp(self):
        self.owner = 'wieczorek1990'
        self.repository_name = 'wieczorek1990.github.io'

    @mock.patch('api.views.RepositoriesView.get_external_data',
                return_value=dict(factories.RepositoryFactory()))
    def test_repositories(self, mock_get_external_data):
        response = self.client.get(
            shortcuts.reverse('repositories',
                              kwargs={
                                  'owner': self.owner,
                                  'repository_name': self.repository_name,
                              }))
        self.assertTrue(mock_get_external_data.called)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    @mock.patch('api.views.RepositoriesView.get_external_data',
                side_effect=github.UnknownObjectException(
                    data={
                        'message': 'Not Found',
                        'documentation_url': 'https://developer.github.com/v3'
                    },
                    status=404,
                ))
    def test_non_existing_repository(self, get_external_data):
        response = self.client.get(
            '/repositories/{owner}/{repository_name}/'.format(
                owner=self.owner,
                repository_name='non-existing-repository-name',
            ))
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
Esempio n. 5
0
    def test_get_profile_raises_error_on_unknown_user(self):
        client = GithubClient()
        error = github.UnknownObjectException('test error', None)
        with mock.patch.object(client.client, 'get_user', side_effect=error):
            with self.assertRaises(UnknownProfileError) as cm:
                client.get_profile('foobar')

        self.assertEqual(str(cm.exception), 'No such GitHub account: foobar')
Esempio n. 6
0
    def get_access_token(self, installation_id, user_id=None):
        """
        Get an access token for the given installation id.
        POSTs https://api.github.com/installations/<installation_id>/access_tokens
        :param user_id: int
        :param installation_id: int
        :return: :class:`github.InstallationAuthorization.InstallationAuthorization`
        """
        body = {}
        if user_id:
            body = {"user_id": user_id}
        response = requests.post(
            f"{self.__github_url}/installations/{installation_id}/access_tokens",
            headers={
                "Authorization": "Bearer {}".format(self.create_jwt()),
                "Accept": github.Consts.mediaTypeIntegrationPreview,
                "User-Agent": "PyGithub/Python"
            },
            json=body
        )

        if response.status_code == 201:
            return github.InstallationAuthorization.InstallationAuthorization(
                requester=None,  # not required, this is a NonCompletableGithubObject
                headers={},  # not required, this is a NonCompletableGithubObject
                attributes=response.json(),
                completed=True
            )
        elif response.status_code == 403:
            raise github.BadCredentialsException(
                status=response.status_code,
                data=response.text
            )
        elif response.status_code == 404:
            raise github.UnknownObjectException(
                status=response.status_code,
                data=response.text
            )
        raise github.GithubException(
            status=response.status_code,
            data=response.text
        )
Esempio n. 7
0
    def _delete_tag(self):
        """Attempt to delete tags both from GitHub and git."""
        if self.args.opts["internal_cmd"] \
                == Arguments.INTERNAL_CMD_DELETE_TAG \
                or self.args.flags["include_tag"]:
            logger.info("Cleaning tag(s): %s", self.args.opts["tag"])

            for tag in self.args.repo.get_tags():
                if fnmatch.fnmatch(tag.name, self.args.opts["tag"]):
                    try:
                        release = self.args.repo.get_release(tag.name)
                        if self.args.flags["force"]:
                            logger.info("Deleting release: %s", release.title)
                            release.delete_release()
                            raise github.UnknownObjectException(
                                "404", "Spoof to hit except", headers=None)

                        logger.info(
                            "Tag %s still connected to release: %s",
                            tag.name,
                            "not deleting")
                    except github.UnknownObjectException:
                        # No release exists, get rid of tag
                        # delete the local tag (if any)
                        logger.info("Deleting local tag: %s", tag.name)
                        try:
                            subprocess.run(
                                ['git', 'tag', '--delete', tag.name],
                                check=True)
                        except subprocess.CalledProcessError as err:
                            logger.info("Trouble deleting local tag: %s", err)

                        # delete the remote tag (if any)
                        logger.info("Deleting remote tag: %s", tag.name)
                        try:
                            subprocess.run(
                                ['git', 'push', '--delete', 'origin',
                                 tag.name], check=True)
                        except subprocess.CalledProcessError as err:
                            logger.info("Trouble deleting remote tag: %s", err)
 def mock_delete(unused_self):
     raise github.UnknownObjectException(status='', data='')
 def exception_side_effect(_):
     raise github.UnknownObjectException('test', 'test')