如何使用github3.py?

时间:2017-04-04 17:18:35

标签: python github github3.py

我正在编写一个ETL作业,我在我们的数据仓库中保存了GitHub repos中的提交,拉取请求和文件的更新列表。我目前正在etags存储并传递给各种迭代器,但我不认为我正在理解如何正确地执行它。

我也无法理解object.refresh(conditional=True)正在做什么。如果我遍历repo上的所有提交,然后在每个提交上调用commit.refresh(conditional=True),我是否会收到304异常处理,所以我知道不会在数据仓库中包含该提交,因为它没有更改?拉取请求也是如此。当我调用repository.refresh(conditional=True)时,它似乎忽略了回购中的新提交。

如果我将etag传递给repo.iter_commits,它是否只返回修改后的提交,或者如果有任何更改,它是否会返回所有提交的提交?

这是我目前使用的基本工作流程:

from github3 import login

gh = login(token='access_token')
repos = (repo.refresh(conditional=True) for repo in gh.iter_repos(etag='previous_etag'))

commit_iters = (commit_iter for repo in repos for commit_iter in repo.iter_commits(etag='prev_etag'))

for commit_iter in commit_iters:
    for commit in commit_iter:
        commit.refresh(conditional=True)
        # pull various attributes, write to file, etc...

我将每个迭代器包装在一个包装器类中,该类处理检索先前的etags,在迭代后存储etags,并检查速率限制。

我的首要目标是提取自我上次请求以来发生变化的任何新提交/拉取请求。我假设在那时我想从数据库中删除现有条目并使用新条目进行更新。

使用github3.py API实现此目的的最佳方法是什么?

编辑: 我再次检查了文档,并且有一个since参数可以解决我的提交问题。所以我只需要知道如何正确使用etags来提取更新的拉取请求数据。

1 个答案:

答案 0 :(得分:1)

所以ETags以下列方式工作:

  1. 您发出请求并使用资源并存储etag

  2. 您使用ETag值

    发出请求
    • 如果资源发生了变化,您必须再次使用整个资源

    • 如果没有变化,您将收到204 No Content回复

  3. ETag不允许您从原来的位置恢复,并且没有好的方法可以从您离开的地方继续使用API​​。

    老实说,我认为您可能想要做的是以下内容:

    1. 在存储库中使用所有当前提交
    2. 注册仅订阅push活动
    3. 的webhook
    4. 处理剩下的提交,因为人们将它们推送到GitHub。