Pygithub: github.PaginatedList.PaginatedList рдХреБрд▓ рдЧрдгрдирд╛ рд╡рд╛рдкрд╕реА рдХреЛрдИ рдирд╣реАрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЬреБрд▓ре░ 2016  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PyGithub/PyGithub

рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрд▓ рдЧрдгрдирд╛ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рд╕реАрдзреЗ рдХреЛрдИ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред

            repo_commits = repo.get_commits()
            repo_total = 0
            for _ in repo_commits:
                repo_total = repo_total + 1
            repo_total = repo.get_commits().totalCount

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП:

    from github import Github
    gh = Github()
    gists = gh.get_user('gil9red').get_gists()
    print(gists.totalCount)  # None
    print(len(list(gists)))  # 7

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЕрдкрдирд╛ рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ

import json
import os

import github
from github import Github

# First create a Github instance:

g = Github("grapebaba", "heatonn1",per_page=1000)


def main():
    '''
    Use small data for this application
    :return:
    '''
    with open(os.path.join(os.path.expanduser("~"),'recruitbot_data.txt'),'w') as f:
        for user in g.search_users("type:user")[0:10000]:
            user_dict = {}
            user_dict['username'] = user.login
            user_dict['id'] = user.id
            user_dict['profile_url'] = user.html_url
            user_dict['location'] = user.location
            user_dict['followers'] = user.followers
            user_dict['private_gists'] = user.private_gists
            user_dict['public_gists'] = user.public_gists
            user_dict['name'] = user.name
            user_dict['company'] = user.company
            user_dict['blog_url'] = user.blog
            user_dict['email'] = user.email
            user_dict['id'] = user.id
            user_dict['contributions']={}
            for repo in user.get_watched():
                try:
                    repo_total = 0
                    for _ in repo.get_commits():
                        repo_total = repo_total + 1
                    if repo.get_stats_contributors() is not None:
                        for contributor in repo.get_stats_contributors():
                            if contributor is not None and contributor.author.id == user_dict['id']:
                                user_dict['contributions'][repo.name]={}
                                user_dict['contributions'][repo.name]['contributor_commits']=contributor.total
                                user_dict['contributions'][repo.name]['repo_commits']=repo_total
                                user_dict['contributions'][repo.name]['language']=repo.language
                                user_dict['contributions'][repo.name]['stars']=repo.stargazers_count
                                print user_dict
                                break
                except github.GithubException as e:
                    print e

            f.write(json.dumps(user_dict)+"\n")

if __name__ == '__main__':
    main()

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдореБрдЭреЗ рдПрдХ рдПрд╕рдПрд╕рдПрд▓ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА

Traceback (most recent call last):
  File "/tmp/collector.py", line 54, in <module>
    main()
  File "/tmp/collector.py", line 36, in main
    for _ in repo.get_commits():
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 48, in __iter__
    newElements = self._grow()
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 60, in _grow
    newElements = self._fetchNextPage()
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 161, in _fetchNextPage
    headers=self.__headers
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 171, in requestJsonAndCheck
    return self.__check(*self.requestJson(verb, url, parameters, headers, input, cnx))
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 212, in requestJson
    return self.__requestEncode(cnx, verb, url, parameters, headers, input, encode)
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 251, in __requestEncode
    status, responseHeaders, output = self.__requestRaw(cnx, verb, url, requestHeaders, encoded_input)
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 281, in __requestRaw
    output = response.read()
  File "/usr/lib/python2.7/httplib.py", line 557, in read
    s = self._safe_read(self.length)
  File "/usr/lib/python2.7/httplib.py", line 664, in _safe_read
    chunk = self.fp.read(min(amt, MAXAMOUNT))
  File "/usr/lib/python2.7/socket.py", line 380, in read
    data = self._sock.recv(left)
  File "/usr/lib/python2.7/ssl.py", line 341, in recv
    return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 260, in read
    return self._sslobj.read(len)

рдирдорд╕реНрддреЗ,
рдЖрдкрдХреЗ рдХреБрд▓ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ repo.get_pulls().totalCount рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП JSON рдореЗрдВ рдбреЗрдЯрд╛ ['total_count'] рдирд╣реАрдВ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреЗрдЬрд┐рдиреЗрдЯреЗрдбрд▓рд┐рд╕реНрдЯ рдХреЛ __len__ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

if self.__totalCount:
    return self.__totalCount
else:
   return len(self.__elements)

@pgmillon рдЬреЛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреАрдЖрд░ рдХрд╛ рдорд╕реМрджрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред

рдПрдХ рд╣реА рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛, рдкреЗрдЬрд┐рдиреЗрдЯреЗрдбрд▓рд┐рд╕реНрдЯ рдХрднреА рднреА рдХреБрд▓ рдЧрдгрдирд╛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддрддреНрд╡реЛрдВ рдХреА рд╡рд╛рдкрд╕реА рд▓реЗрди рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреЗ рдЖрдЗрдЯрдо рд▓рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╣рдордд рд╣реИрдВ рд▓реЗрдХрд┐рди AFAIK рдПрдкреАрдЖрдИ рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рддреЛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд╣реИ:

opened_pulls = repository.get_pulls()
pulls_count = 0
# Fix no count available on pulls list
for _ in opened_pulls:
    pulls_count += 1

рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП:

    from github import Github
    gh = Github()
    gists = gh.get_user('gil9red').get_gists()
    print(gists.totalCount)  # None
    print(len(list(gists)))  # 7

рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛:

from github import Github
g = Github()
repos = g.get_repos()
print(repos.totalCount) # None

@ gil9red @Tigralt рдХреНрдпрд╛ рдЖрдк рдЙрди рдЖрдЗрдЯрдореНрд╕ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ PaginatedList рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рд╣реИрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдкреЗрдЬрд┐рдиреЗрдЯреЗрдбрд▓рд┐рд╕реНрдЯ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдЧрд┐рдирддреА рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ (рднрд▓реЗ рд╣реА рд╡реЗ рдкреБрд░рд╛рдиреЗ рд╣реЛрдВ, рд╡реЗ рд╕рд╣реА рд╣реИрдВ)

рдЧрд┐рдЯрд╣рдм рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреЗрдЬрд┐рдиреЗрдЯреЗрдб рдЕрдиреБрд░реЛрдз рдХрд┐рддрдиреЗ рдЖрдЗрдЯрдо рд▓реМрдЯрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреЗрдЬрд┐рдиреЗрдЯреЗрдбрд▓рд┐рд╕реНрдЯ рдХреА рдХреЛрдИ рд▓рдВрдмрд╛рдИ рдирд╣реАрдВ рд╣реИ:
...
рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ [sic] рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреА рд╣реЛрдЧреА рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рдпрджрд┐ рдЖрдк рдкреЗрдЬрд┐рдиреЗрдЯреЗрдбрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рдкреЗрдЬ рдкрд░ рдЖрдЗрдЯрдореНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреАрдЖрд░ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

рдХреБрдЫ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП #433 #487 #596

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ total_count рдкреБрд░рд╛рдиреЗ Github API рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╣реИ? рдХреНрдпрд╛ рд╣рдо TotalCount рдкрд░ PaginatedList TotalCount рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ None рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдбреЙрдХреНрд╕ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:

# To get the total number of available elements in PaginatedList
repos = g.get_user().get_repos()
print(len(list(repos)))  # we can't avoid to iterate through the whole set to get total count

рдФрд░ рд╢рд╛рдпрдж рд╣рдо рдореМрдЬреВрджрд╛ рддрддреНрд╡реЛрдВ рдХреА рдЧрд┐рдирддреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП __len__ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреАрдердм рдПрдкреАрдЖрдИ рдПрдХ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдареЛрдВ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк per_page=1 рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреБрд▓ рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддрд┐ (рдмрдбрд╝реЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ Tommos0 рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рдо рднреА рдПрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HEAD рдХреЗ рдмрдЬрд╛рдп GET рдмрд╕ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ Link рд╣реИрдбрд░ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

#820 . рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

grayaii picture grayaii  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hsluoyz picture hsluoyz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mlainez picture mlainez  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rthill91 picture rthill91  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Borkason picture Borkason  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ