2017-04-04 4 views
0

私は、データウェアハウスのGitHubリポジトリからコミット、プルリクエスト、およびファイルの更新リストを保持するETLジョブを作成しています。私は現在、さまざまなイテレータにetagsを格納して渡していますが、正しく行う方法を理解しているとは思いません。github3.pyを使用して変更されたコミット/プルリクエストのみをプルする方法は?

私はまた、object.refresh(conditional=True)が何を正確に行っているのか理解できていません。レポのすべてのコミットを繰り返して、それぞれにcommit.refresh(conditional=True)を呼び出すと、処理する304例外が表示されるので、変更されていないので、データウェアハウスにそのコミットを含めないことを知っていますか?プルリクエストにも同じことが起こります。 repository.refresh(conditional=True)と呼ぶと、reposの新しいコミットを無視するようです。

etagrepo.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を使用してこれを達成する適切かつ効率的な方法は何ですか?

EDIT: 私は再びドキュメントをチェックし、コミットに関する私の問題を処理するsinceパラメータがあります。ですから、私はちょうど更新されたプル要求データを引き出すためにetagsを適切に使用する方法を知る必要があります。

答えて

1

はとてもてETagは、次のように動作:

  1. はあなたが要求を作成し、リソースを消費しますが、ETagの値

    • で要求を作るのETag

    • を保存します

      リソースが変更された場合は、再びリソース全体を消費する必要があります。

    • 変化がない場合、あなたは

204 No Content応答を受信しますETagのは、あなたがたどこから再開することはできません、あなたがAPIで中断したところから再開する良い方法はありません。

  1. 残りの部分にだけpushイベント
  2. プロセスをサブスクライブするウェブフックを登録リポジトリ
  3. 上のすべての現在のコミットを消費:

    正直なところ、私はあなたがしたいかもしれないと思うものを、次があります人々がそれらをGitHubにプッシュするときのコミットの

関連する問題