Github API получает последний коммит для каждого репозитория с ответом на поисковый запрос - PullRequest
0 голосов
/ 23 мая 2018

Я работаю над проектом с использованием Python (3.6), в котором я реализовал GitHub API-интерфейсы JSON с помощью пакета запросов Python. Я получаю список общедоступных репозиториев для конкретного термина serach, предоставленного пользователем.объект ответа, который включает в себя информацию о репо, но мне нужно получать информацию о последнем коммите каждого репо, как я могу получить эту информацию из объекта ответа из Github api.

Вот как я это реализовал:

class GhNavigator(CreateView):
    def get(self, request, *args, **kwargs):
    term = request.GET.get('search_term')
    username = 'arycloud'
    token = 'API_TOKEN'
    login = requests.get('https://api.github.com/search/repositories?q=' + term, auth=(username, token))
    response = login.json()
    print(response)

    return render(request, 'navigator/template.html', {'response': response, 'term': term})

Вот пример ответа:

{'total_count': 4618, 'incomplete_results': False, 'items': [{'id': 6750871, 'name': 'arrow', 'full_name': 'crsmithdev/arrow', 'owner': {'login': 'crsmithdev', 'id': 1596037, 'avatar_url': 'https://avatars1.githubusercontent.com/u/1596037?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/crsmithdev', 'html_url': 'https://github.com/crsmithdev', 'followers_url': 'https://api.github.com/users/crsmithdev/followers', 'following_url': 'https://api.github.com/users/crsmithdev/following{/other_user}', 'gists_url': 'https://api.github.com/users/crsmithdev/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/crsmithdev/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/crsmithdev/subscriptions', 'organizations_url': 'https://api.github.com/users/crsmithdev/orgs', 'repos_url': 'https://api.github.com/users/crsmithdev/repos', 'events_url': 'https://api.github.com/users/crsmithdev/events{/privacy}', 'received_events_url': 'https://api.github.com/users/crsmithdev/received_events', 'type': 'User', 'site_admin': False}, 'private': False, 'html_url': 'https://github.com/crsmithdev/arrow', 'description': 'Better dates & times for Python', 'fork': False, 'url': 'https://api.github.com/repos/crsmithdev/arrow', 'forks_url': 'https://api.github.com/repos/crsmithdev/arrow/forks', 'keys_url': 'https://api.github.com/repos/crsmithdev/arrow/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/crsmithdev/arrow/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/crsmithdev/arrow/teams', 'hooks_url': 'https://api.github.com/repos/crsmithdev/arrow/hooks', 'issue_events_url': 'https://api.github.com/repos/crsmithdev/arrow/issues/events{/number}', 'events_url': 'https://api.github.com/repos/crsmithdev/arrow/events', 'assignees_url': 'https://api.github.com/repos/crsmithdev/arrow/assignees{/user}', 'branches_url': 'https://api.github.com/repos/crsmithdev/arrow/branches{/branch}', 'tags_url': 'https://api.github.com/repos/crsmithdev/arrow/tags', 'blobs_url': 'https://api.github.com/repos/crsmithdev/arrow/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/crsmithdev/arrow/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/crsmithdev/arrow/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/crsmithdev/arrow/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/crsmithdev/arrow/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/crsmithdev/arrow/languages', 'stargazers_url': 'https://api.github.com/repos/crsmithdev/arrow/stargazers', 'contributors_url': 'https://api.github.com/repos/crsmithdev/arrow/contributors', 'subscribers_url': 'https://api.github.com/repos/crsmithdev/arrow/subscribers', 'subscription_url': 'https://api.github.com/repos/crsmithdev/arrow/subscription', 'commits_url': 'https://api.github.com/repos/crsmithdev/arrow/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/crsmithdev/arrow/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/crsmithdev/arrow/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/crsmithdev/arrow/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/crsmithdev/arrow/contents/{+path}', 'compare_url': 'https://api.github.com/repos/crsmithdev/arrow/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/crsmithdev/arrow/merges', 'archive_url': 'https://api.github.com/repos/crsmithdev/arrow/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/crsmithdev/arrow/downloads', 'issues_url': 'https://api.github.com/repos/crsmithdev/arrow/issues{/number}', 'pulls_url': 'https://api.github.com/repos/crsmithdev/arrow/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/crsmithdev/arrow/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/crsmithdev/arrow/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/crsmithdev/arrow/labels{/name}', 'releases_url': 'https://api.github.com/repos/crsmithdev/arrow/releases{/id}', 'deployments_url': 'https://api.github.com/repos/crsmithdev/arrow/deployments', 'created_at': '2012-11-18T20:23:27Z', 'updated_at': '2018-05-24T11:23:14Z', 'pushed_at': '2018-05-21T09:03:24Z', 'git_url': 'git://github.com/crsmithdev/arrow.git', 'ssh_url': 'git@github.com:crsmithdev/arrow.git', 'clone_url': 'https://github.com/crsmithdev/arrow.git', 'svn_url': 'https://github.com/crsmithdev/arrow', 'homepage': 'https://arrow.readthedocs.org', 'size': 1454, 'stargazers_count': 4999, 'watchers_count': 4999, 'language': 'Python', 'has_issues': True, 'has_projects': True, 'has_downloads': True, 'has_wiki': True, 'has_pages': True, 'forks_count': 416, 'mirror_url': None, 'archived': False, 'open_issues_count': 123, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': None, 'url': None}, 'forks': 416, 'open_issues': 123, 'watchers': 4999, 'default_branch': 'master', 'permissions': {'admin': False, 'push': False, 'pull': True}, 'score': 126.08792}]}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Получение последнего коммита из нескольких репозиториев

Использование GraphQL API v4 для выполнения вашего поискового запроса и получения самого последнего коммита с использованием history(first: 1) при итерации репозитория.Запрос graphQL:

{
  search(query: "language:python", type: REPOSITORY, first: 100) {
    edges {
      node {
        ... on Repository {
          defaultBranchRef {
            target {
              ... on Commit {
                history(first: 1) {
                  nodes {
                    message
                    committedDate
                    authoredDate
                    oid
                    author {
                      email
                      name
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

Попробуйте в проводнике

В :

import json
import requests

access_token = "YOUR_TOKEN"

query = """
{
  search(query: "language:python", type: REPOSITORY, first: 100) {
    edges {
      node {
        ... on Repository {
          defaultBranchRef {
            target {
              ... on Commit {
                history(first: 1) {
                  nodes {
                    message
                    committedDate
                    authoredDate
                    oid
                    author {
                      email
                      name
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}
"""

data = {'query': query.replace('\n', ' ')}
headers = {'Authorization': 'token ' + access_token, 'Content-Type': 'application/json'}
r = requests.post('https://api.github.com/graphql', headers=headers, json=data)
print(json.loads(r.text)['data']['search']['edges'])

Вы будетезатем необходимо выполнить пагинацию со значением курсора, указывающим after: "END_CURSOR_VALUE", если hasNextPage - true. отметьте это

Получить последний коммит из одного репозитория

Вы можете использовать список коммитов в API репозитория и возвращать только первый элемент сper_page=1, так как первый самый последний.Если вы не укажете параметр sha, он примет ветвь по умолчанию:

https://api.github.com/repos/torvalds/linux/commits?per_page=1

Использование Rest API v3 :

import requests 
repo = 'torvalds/linux'

r = requests.get('https://api.github.com/repos/{0}/commits?per_page=1'.format(repo))

commit = r.json()[0]["commit"]

print(commit)

А если вы хотите использовать GraphQL API v4 , вы можете сделать следующее:

import json
import requests

access_token = "YOUR_TOKEN"

query = """
{
  repository(owner: "torvalds", name: "linux") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 1) {
            nodes {
              message
              committedDate
              authoredDate
              oid
              author {
                email
                name
              }
            }
          }
        }
      }
    }
  }
}
"""

data = {'query': query.replace('\n', ' ')}
headers = {'Authorization': 'token ' + access_token, 'Content-Type': 'application/json'}
r = requests.post('https://api.github.com/graphql', headers=headers, json=data)
print(json.loads(r.text)['data']['repository']['defaultBranchRef']['target']['history']['nodes'][0])

Попробуйте в проводнике

0 голосов
/ 23 мая 2018

Вы также можете рассмотреть последнее push-событие : оно будет представлять последнюю и последнюю сделанную фиксацию (в любой ветке), выдвинутую пользователем в этот репо.

...