2017-04-04 119 views
0

我正在寫一個ETL作業,我在我們的數據倉庫中保存了來自我們GitHub回購的更新提交列表,提交請求和文件。我目前正在存儲並將etags傳遞給各種迭代器,但我不認爲我正在理解如何正確執行它。如何僅使用github3.py來修改提交/提交請求?

我也很難理解object.refresh(conditional=True)究竟在做什麼。如果我遍歷所有提交的提交,然後每個提交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

這樣的ETag以下列方式工作:

  1. 你做的請求,並消耗資源和存儲的eTag

  2. 你讓與ETag值

    • 的請求

      如果資源發生更改,則必須再次使用整個資源

    • 如果沒有變化,您將收到204 No Content響應

的ETag不允許你從你在哪裏,並有從你離開了與API,其中恢復沒有什麼好辦法恢復。

老實說,我認爲你可能想要做的是以下幾點:

  1. 消費上的存儲庫
  2. 所有在場的提交註冊訂閱了剛剛push事件
  3. 過程中的其餘網絡掛接當人們將他們推送到GitHub時,這些提交就會出現。