рдЧрд┐рдЯрд╣рдм рдПрдкреАрдЖрдИ рдЦреЛрдЬреЛрдВ рдХреЛ 1000 рдкрд░рд┐рдгрд╛рдореЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рд╕реАрдорд╛ PyGitHub рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЧрдИ рдЦреЛрдЬреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ GitHub.search_issues ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЦреЛрдЬ рдиреЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ - рдРрд╕рд╛ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдпрд╛ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЕрд╡рдЧрдд рд╣реВрдВред рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рд╢рд╛рдпрдж рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдПрдХрд╛рдзрд┐рдХ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдЬрд╛рд░реА рдХрд░рдХреЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдХреНрд╡реЗрд░реА рдХреЗ рд╡рд┐рд╢реЗрд╖ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рддрд┐рдерд┐ рд╕реАрдорд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ search_issues рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ - рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред
рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдХреНрдпрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ?
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рджрд░ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдпрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдВрдХрди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдВ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рддрд┐рдерд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХреИрд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рднрд▓реЗ рд╣реА 1000 рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВ:
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдЗрд╕реЗ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдЬ рджреЗрддрд╛ рд╣реИ, рд╕рд░рд▓ рд╣реЛрдЧрд╛
class PullRequestQuery:
def __init__(self, git, repo, since, until):
self.git = git
self.repo = repo
self.until = until
self.issues = self.__query(since, until)
def __iter__(self):
skip = False
while True:
results = False
for issue in self.issues:
if not skip:
results = True
yield issue.as_pull_request()
skip = False
# If no more results then stop iterating.
if not results:
break
# Start new query picking up where we left off. Previous issue will be first one returned, so skip it.
self.issues = self.__query(issue.closed_at.strftime('%Y-%m-%dT%H:%M:%SZ'), self.until)
skip = True
def __query(self, since, until):
querystring = 'type:pr is:closed repo:%s/%s closed:"%s..%s"' % (self.repo.organization.login, self.repo.name, since, until)
return self.git.search_issues(query=querystring, sort="updated", order="asc")
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде, рдЕрдм рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
git = Github(user, passwd)
org = git.get_organization(orgname)
repo = org.get_repo(reponame)
for pull in PullRequestQuery(git, repo, "2017-01-01", "2017-12-31"):
print "%s: %s" % (pull.number, pull.title)
рдЦреЛрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Github API рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдкрдврд╝рдирд╛, рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ incomplete_results
PyGithub рдореЗрдВ рдЦреЛрдЬ-рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд╛рдпрдм рд╣реИред рд╕рдВрднрд╡рддрдГ рдЙрд╕ рдорд╛рди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рднреА рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо (рдЗрди) рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ PyGithub рд╣реИ рдФрд░ рд╕реНрд░реЛрдд рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рдореИрдВ # 606 рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ) рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕рдХреА рдФрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ?
рдФрд░ рдЕрдиреНрдп рдЦреЛрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ?
рдФрд░ рдЕрдиреНрдп рдЦреЛрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП