pythonコード審査自動返信メッセージを実現します。


一つの規範化された研究開発プロセスにおいて、普通は次の通りである。
  • 開発段階:開発機能またはバグの修復、現地での自己測定。
  • コード審査段階:コードを提出し、チーム内の人にcode reviewを作ってもらう。
  • 試験環境テスト段階:試験環境に配置され、テストを要求する。
  • はオンラインテスト段階を発表します。テスト環境はテストを通じてオンラインでテストを行います。
  • 検収完了タスク:オンライン検証に成功し、このタスクを閉じます。
  • 実際には、これは最も理想的なプロセスです。私たちはデフォルトでは、状態の流れはすべて順調です。開発には問題がないです。テストは一回で通過します。現実の研究開発です。
    フローの状況はより複雑で、図のようになります。

    全体の過程は一気に書き上げて、環をして互いにボタンをかけます。その中で自動化できるのはちょうど第二段階です。code reviewをお願いした時のフィードバックメッセージです。
    実践の経験によって、より良い内容フォーマットは以下の通りです。
    
    **Changes has been committed to feature/xxx-xxx**
    
    - https://git.xxx.com/xxxx/ddaf18f9be4613c31363d4c92b8bafc3sdfdsf
    
    **Details**
    Remove invalid logic for admin pannel
    Code Reviewの手順に行くたびに、類似の回答を書く必要があるので、Pythonスクリプトを使って自動的にこの文字を生成し、作業を簡略化することを考えます。
    サンプル回答によって分析を行いますが、プロジェクトの分岐名(タスクターゲット分岐)を取得し、プロジェクトの最後に提出したmit IDは、2行目のgit comitのリンクを組み立てて、Detailsの内容はgit logsの提出情報から抽出することができます。
    ステップ1:ブランチ名を取得します。
    プロセスを簡略化するために、デフォルト項目の現在の分岐が必要な分岐であり、問題は現在の分岐名を取得するために簡略化される。gitに関するコマンドを利用して、下記のように実現できます。
    
    git branch | sed -n '/\* /s///p'
    ステップ2:mit idを取得する。
    comit idを取得するのも簡単です。次のような命令が必要です。
    
    git rev-parse HEAD
    ステップ3:提出情報の取得。
    提出情報を取得し、git logのコマンドでフィルタリングしても得られます。
    
    git log --pretty=format:"%s" -1
    git logs--pretty=formatコマンドは強力です。提出情報を得る以外に、次のようなパラメータがあります。
    
    %H     (commit)        
    %h             
    %T    (tree)        
    %t            
    %P    (parent)        
    %p            
    %an   (author)    
    %ae           
    %ad       (    -date=       ) 
    %ar       ,           
    %cn    (committer)    
    %ce            
    %cd      
    %cr     ,           
    %s     
    したがって、第二ステップは、以下のように、git logsコマンドを使用しても実行できます。
    
    git log --pretty=format:"%H" -1
    もちろん後に少し人間的な感謝の言葉を加えなければなりません。他の人にコードの審査をお願いします。ありがとうございます。ここでリストを使って感謝の言葉を入れて、ランダムに最後まで貼ります。
    プロセスに向かって作成するなら、次のコードを作成することができます。
    
    #coding=utf-8
    #!/usr/bin/python
    
    import os, subprocess
    import random
    
    # use subprocess to get the current branch name from output
    def get_branch_name(cd_path):
     os.chdir(cd_path)
     status, branch_name = subprocess.getstatusoutput("git branch | sed -n '/\* /s///p'")
     # print(output)
     # exit(0)
     return branch_name
    
    def get_latest_git_log(cd_path):
     """
     docstring
     """
     os.chdir(cd_path)
     status, log_info = subprocess.getstatusoutput("git log --pretty=format:\"%s\" -1")
     return log_info
    
    def get_latest_commit_id(cd_path):
     os.chdir(cd_path)
     status, commit_id = subprocess.getstatusoutput("git rev-parse HEAD")
     return commit_id
    
    def get_reviewer_by_random(reviewers):
     return random.choice(reviewers)
    
    def get_thanks_words_by_random(thanks_words):
     return random.choice(thanks_words)
    
    def create_comment(reviewers, branch_name, log_info, commit_id, thanks_words):
     print(get_reviewer_by_random(reviewers))
     print("*Changes made has been committed to " + branch_name + "*")
     print("- https://git.xxxxx.com/someproject/subname/-/commit/" + commit_id)
     print("*Details*")
     print("-" + log_info)
     print(get_thanks_words_by_random(thanks_words))
    
    branch_name = get_branch_name('/Users/tony/www/autoWork')
    log_info = get_latest_git_log('/Users/tony/www/autoWork')
    commit_id = get_latest_commit_id('/Users/tony/www/autoWork')
    
    reviewers = [
     '[~Harry]',
     '[~Tom]'
    ]
    
    random_thanks_words = [
     'Review it please, thanks.',
     'Actually, I am glad to see you have time to review it, thanks a lot.',
     'Please check it if you have free time, thanks.',
     'Check it please.'
     'Waiting for your code review, thank you.'
    ]
    
    create_comment(reviewers, branch_name, log_info, commit_id, random_thanks_words)
    Pythonスクリプトとプロジェクトはディレクトリの下に置かれていませんので、git関連命令を実行する前にcdをターゲットプロジェクトディレクトリの下に置く必要があります。また、それぞれgitコマンドを実行する場合は、subprocess.get statusoutput()を使って実行され、標準化された出力の結果が得られます。ここでOS.systemを使用してコマンドを実行しないのは、OS.system実行コマンドの返却値には2つの部分が含まれており、第1の部分はコマンドの結果出力であり、第2の部分は結果が成功したかどうかの識別子であるからである。
    例えば、os.systemを実行すると、以下の内容に戻ります。
    
    feature/ST-247
    0
    第一の行は私たちが取得した分岐名で、第二の行は成功した識別子であり、0はコマンドに問題がないことを示している。
    ですから、subprocess.get statusoutputを使ってコマンドを実行したいです。この関数はそれぞれ結果の表示と出力を返します。所望の実行結果が得られます。
    コードはさらに最適化できますが、私のニーズを満たすことができます。このスクリプトを実行すると、次のような出力結果が得られます。
    
    [~Harry]
    *Changes made has been committed to feature/ST-247*
    - https://git.xxxxx.com/someproject/subname/-/commit/d21033057677e6d49d9cea07c64c49e35529545dx
    *Details*
    - Remove some invalid logic
    Please check it if you have free time, thanks.
    オブジェクト指向に書き換えた方がいいです。呼び出しが簡単で、伝達パラメータも少ないです。Pythoon 3文法で作成したコードは以下の通りです。
    
    #coding=utf-8
    #!/usr/bin/python
    import os
    import subprocess
    import random
    
    class CommitComment:
     def __init__(self, project_path: str, reviewers: list, thanks_words: list):
      self.project_path = project_path
      self.reviewers = reviewers
      self.thanks_words = thanks_words
     # use subprocess to get the current branch name from output
     def get_branch_name(self) -> str:
      os.chdir(self.project_path)
      status, branch_name = subprocess.getstatusoutput("git branch | sed -n '/\* /s///p'")
      return branch_name
     # use subprocess to get the latest commit message from git log 
     def get_latest_git_log(self) -> str:
      os.chdir(self.project_path)
      status, log_info = subprocess.getstatusoutput("git log --pretty=format:\"%s\" -1")
      return log_info
    
     # use subprocess to get the latest commit id from git log
     def get_latest_commit_id(self) -> str:
      os.chdir(self.project_path)
      status, commit_id = subprocess.getstatusoutput("git rev-parse HEAD")
      return commit_id
    
     def get_reviewer_by_random(self) -> str:
      return random.choice(self.reviewers)
    
     def get_thanks_words_by_random(self) -> str:
      return random.choice(self.thanks_words)
    
     def create_comment(self):
      print(self.get_reviewer_by_random())
      print("*Changes has been committed to " + self.get_branch_name() + "*")
      print("- https://git.xxxx.com/MyProject/ProjectName/-/commit/" + self.get_latest_commit_id())
      print("*Details*")
      print("-" + self.get_latest_git_log())
      print(self.get_thanks_words_by_random())
    
    
    thanks_words = [
      'Review it please, thanks.',
      'Actually, I am glad to see you have time to review it, thanks a lot.',
      'Please check it if you have free time, thanks.',
      'Check it please.'
      'Waiting for your code review, thank you.'
     ]
    reviewers = [
    '[~Harry]',
    '[~Tom]'
    ]
    
    comment = CommitComment('/Users/tony/www/autoWork', reviewers, thanks_words)
    
    comment.create_comment() # will print out the complete comment
    thanks.wordsリストは、ランダムに取得すると、より少ない確率で重複することができます。もちろん最後の段も自分で毎回diyすることができます。心から感謝するのが一番いいです。
    このようなワークフローを単純化したシナリオの本質は、反復的な労働を減少させることであり、特に一日に多くのタスクを完了したときである。しかし、自分を反省するのは簡単にはできません。仕事の奴隷ではなく、仕事の主人です。
    れんがを投げて玉を引いて、自分と未来の自分に対しても1つの還元の鏡像です。
    Todo:
    1.毎日のタイミングでこのスクリプトを実行して返信メッセージを生成することができます。
    2.スクリプトを通じて処理が必要なプロジェクトディレクトリを動的に選択します。このケースコードの中ではhard codeですが、デフォルトではautWorkという項目が選択されています。
    3.コーパスにアクセスすることも考えられます。このように感謝すればいつまでも繰り返さず、新しい単語を学ぶことができます。
    以上がpython実現コードレビュー返信メッセージ生成の詳細です。python応答メッセージ生成に関する資料は他の関連記事に注目してください。