コードフォーマットの自動化

19844 ワード

右のバット、重要な区別を明確にしましょう.良いコードを書いたり書いたりするコードを書くのは、2つの非常に異なることです.後者は芸術形式であり、この違いは群衆から偉大なプログラマーを区別する.
良いコードを話すとき、「良い」という言葉はデザインによって曖昧です.これは、コードが良いか悪いかについての石のルールが設定されていないためです.読みやすさなどの抽象的なガイドラインがあります.

Programs are meant to be read by humans and only incidentally for computers to execute.

– Abelson & Sussman


それらはかなりしっかりした資格を持つ2人のMIT教授です.コードの質を識別することは、練習と経験を通して、時間をかけて光栄にされる直観です.コードレビューは、この目標に向かって長い道のりを行く.
コードレビューは、開発者が自分よりも経験豊富なあなたのコードを読んで、それを改善することができる改善を提案するプロセスです.これらの提案は、パフォーマンスを向上させることができます、新しい言語機能、パッチのセキュリティの見落とし、または正しいコードのスタイルを組み込む.
... ときにコードのレビューになる.
しかし、マニュアルコードレビューは高価です.誰かがあなたのコードを読むのにかかる時間は、彼らがものすごいものを造ることを費やさなかった時間です.また、エラーがちで、決して包括的ではありません.知識と記憶には人間の限界がある.
オートメーション.自動化されたコードレビューは、より速く、より少ないエラー傾向、およびそのマニュアル対応よりも詳細です.
つのPythonファイルを含むサンプルプロジェクトで、プロセスに深く潜りましょう.問題を抱えてファイルをリネームし、自動的にこれらの問題を見つけ、修正するワークフローを設定します.

成分


P - 8違反でのA . Codebase


コードレビューを自動化する前に、最初にレビューするコードを書きましょう.ここでは、与えられた数までの素数を一覧表示するサンプルプログラムです.それは、あなたのコード嗅覚の感覚が働いていることを意味するように、それは良いです.
# list_primes.py
def is_prime (number): for i in range(2, number): if number%i==0: return False return True def list_primes(upper): for number in range(2, upper): if is_prime(number): print(F"{number} is prime") list_primes(10)
このスクリプトには多くの問題があります.私は間違って取得しないでください、それは動作しますが、それは良いことではない.
  • 関数括弧の前の外部空間
  • 2‐空間インデント
  • 演算子の周囲の空白
  • 1行あたりの関数
  • 大文字F F文字列で
  • ブラックコードフォーマッタ


    Black Python用の人気のコードフォーマッタです.これは、自動的にすべてのコードスタイルの違反を修正して、Pythonファイルを再フォーマットすることが可能です.何がきちんとしているか、それはかなり独創的であり、多くの設定することはできません、自動化に最適です.
    それで、私は個人的に好きなツールでいくつかのファーストクラスの依存管理を設定する機会を取る一方、黒をインストールしましょう.Pipenv . 次のコマンドを実行すると、2つのファイルが作成されます.Pipfile and Pipfile.lock , REPOのルートで、dev依存性としてブラックをインストールします.
    $ pipenv install --pre --dev black
    
    任意のargsなしで実行中の黒は、直接repoのすべてのファイルをフォーマットします.ファイルを再フォーマットすることは別として、2つのより危険なモードがあります.--check : このモードでは、黒の任意のコードのスタイル違反があるかどうかを純粋にチェックします.違反がない場合は0を返します.
    $ pipenv run black --check list_primes.py
    would reformat /Users/dhruvkb/Documents/scratch/automata/list_primes.py
    Oh no! 💥 💔 💥
    1 file would be reformatted.
    
    --diff : このモードでは、黒は実際にそれらを作ることなく行う変更を示しています.このモードは、実際に行われる前に変更を検査したい場合に便利です.
    $ pipenv run black --diff list_primes.py
    -------- list_primes.py 2020-02-02 00:00:00.000000 +0000
    +++ list_primes.py  2020-02-02 00:00:00.000000 +0000
    @@ -1,17 +1,19 @@
     # list_primes.py
    -def is_prime (number):
    +def is_prime(number):
    - for i in range(2, number):
    + for i in range(2, number):
    - if number%i==0:
    + if number % i == 0:
    - return True
    + return True
    
    - return False
    + return False
    +
     def list_primes(upper): for number in (2, 10): if is_prime(number):
    - print(F"{number} is prime")
    + print(f"{number} is prime")
    +
    
     list_primes(15)
    

    レシピ


    コードレビューは2つの部分で分割することができます:あなたは大きな画像の問題を解決する興味深い部分と非慣用的なスニペットやコードのスタイルの違反を識別する世俗的な部分.コードレビューの退屈な部分を自動化しましょう.

    1 . Gitフックを設定する


    我々は、ちょうど信じられない黒がどれくらいかについて見ました.あなたのコードをコミットするたびに自動的に黒が自動的に実行された場合、それは素晴らしいことではないだろうか?それは可能です、gitフックで.Gitフックは、特定のGitコマンドを実行するとき、コードベースで動作するプログラムです.' pre - commit 'フックは、コミットが作成される前にリントチェックを行い、失敗した場合にコミットが発生しないようにするため、私たちには特に興味を持っています.
    Autohooks Python経由でこれらのフックを管理するためのPythonパッケージです.これは、黒のようなツールとの統合を可能にするプラグインシステムを持っています.オートフックとブラックインテグレーションプラグインをインストールしましょう.
    $ pipenv install --dev autohooks autohooks-plugin-black
    
    メイクするpyproject.toml 以下の内容であなたのrepoのルートのファイル.
    [tool.autohooks]
    mode = "pipenv"
    pre-commit = ["autohooks.plugins.black"]
    
    [tool.autohooks.plugins.black]
    arguments = ["--check"]
    
    フックをアクティブにし、チェック機能を実行すると、すべてがうまく動作するかどうかを確認します.
    $ pipenv run autohooks activate
    ✓ autohooks pre-commit hook installed at /Users/hal/Documents/scratch/.git/hooks/pre-commit using pipenv mode.
    
    $ pipenv run autohooks check
    ✓ autohooks pre-commit hook is active.
    ✓ autohooks pre-commit hook is up-to-date.
    ℹ Using autohooks mode "pipenv".
    ✓ Plugin "autohooks.plugins.black" active and loadable.
    
    トライgit commit -ソースコードが正しくないこと.は、gotcha!以下のようになります.
  • プリコミットフックが開始されます.
  • オートフックによるトップレベルフックが呼び出されます.
  • その後、オートフックは--check 引数.
  • ファイルがエラーを含むので、Blackは非ゼロコードを返します.
  • Gitはコミット操作を停止します.
  • $ git add . && git commit -m "Add the source code to VCS"
    ℹ autohooks => pre-commit
    ℹ Running autohooks.plugins.black
    would reformat /Users/dhruvkb/Documents/scratch/automata/list_primes.py
    Oh no! 💥 💔 💥
    1 file would be reformatted.
    ×
    
    💡 プロのヒント:あなたは--no-verify フラッグオンgit commit . それは推薦されません、しかし、我々は警察でありません、それで、あなたは望むものをします.
    💡 プロのヒント:あなたは--check そして、あなたがコミットするたびに、ブラックはあなたのためにファイルを再フォーマットします.

    Githubアクションを使用したlint check


    GITフックの主要な欠点は、それらがローカルであるということです.複数の貢献者を持つプロジェクトでは、フックをアクティブにするか、積極的にそれらをバイパスしようとするのを忘れるかもしれない人々がいるかもしれません.このような場合、ソリューションはリモートレポ自身のリントチェックを実行することです.Githubアクションは、リントを実行するための非常に汎用性の高いソリューションを提供します.
    ファイルを作るlint.yml インサイド.github/workflows レポのディレクトリ.
    # .github/workflows/lint.yml
    name: Lint
    
    on: [push, pull_request]
    
    jobs:
     lint:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v2
     - uses: actions/setup-python@v2
     - uses: psf/black@stable
    
    このワークフローはリポジトリをチェックし、Pythonをセットアップし、黒をインストールしてファイルをリストアップします.デフォルトでは、このアクションは--check and --diff 引数.一度リンギングを設定すると、すべての将来コミットとPRSは黒を通過します.

    我々list_primes.py ファイルがテストに失敗する.ログは、これらのファイルの差分と同様に失敗したファイルを表示します-diff 引き数).それはあなたが違反を修正しているときにかなり便利になるでしょう.

    Githubワークフローを使用したlintの修正


    それはまだ我々がまだ対処していない1つの側面に私たちをもたらします.ブラックはファイルを再フォーマットすることができます、しかし、これまで、我々は問題と現在の差分を見つけるためにそれを使用しました.我々はまだ黒の完全な可能性をタップしていない.
    方法については自動的に11にアップロードし、自動的にコードのスタイル違反を修正するために私たちのgithubワークフローを更新するには?
    # .github/workflows/lint.yml
    name: Lint
    
    on: - push
    - workflow_dispatch
    
    jobs:
     lint:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v2
     - uses: actions/setup-python@v2
     - name: Install Python dependencies
     run: |
     pip install pipenv
     pipenv install --deploy --dev --system
     - uses: wearerequired/lint-action@v1
     with:
     github_token: ${{ secrets.GITHUB_TOKEN }}
     black: true
     auto_fix: true
    
    このワークフローは、前のものと同じ手順を使用します.その後、Pipenvをインストールし、システム上でブラックをインストールするために使用します.The lint-action action を実行し、変更されたファイルをコミットします.これは黒がdiffで示したのと同じ変更で新しいコミットを作成します!
    💡 プロのヒント:あなたは、著者の名前と電子メールおよびコミットのメッセージをカスタマイズすることができます.ちょうど以下を加えるwith アクションのキー.それは創造的な機会です!
    commit_message: 'Opening the pod-bay doors'
    git_name: 'HAL-9000'
    git_email: '[email protected]'
    

    今、あなたはコードがREPOにプッシュされていることを保証することができますスタイルガイドの逸脱から無料ですが、これはコードの見直しを解放し、コードで大きな画像を見て、HALにminutiaeを残してください.

    Deepsourceによるエンドツーエンド自動化


    フィル!それはたくさんの仕事だったね.しかし、推測すると、我々は今のスタイルガイド違反を見た.セキュリティギャップを探して、可能なバグを発見し、複雑なリファクタを作るような機能を追加すると、これは非常に長い運動をする.しかし、それはそうする必要はありません.
    また、この全体の監査、レビュー、リファクタリングのプロセスを自動化を検討することができますDeepSource あなたのコードをスキャンすることができますすべてのコミット、およびすべてのプルの要求については、いくつかのツール(プリンタやセキュリティアナライザを含む)を介して自動的に多くの問題を修正することができます.DeepSourceはまた、常に改善され、最新の状態に保つほとんどの言語のためのカスタムメイドのアナライザを持っています.
    それはincredibly easy to set up ! だけを追加する必要があります.deepsource.toml あなたのリポジトリのルートにあるファイル.我々がちょうど経験したものよりはるかに少ない努力.
    version = 1
    
    [[analyzers]]
    name = "python"
    enabled = true
    
      [analyzers.meta]
      runtime_version = "3.x.x"
      max_line_length = 80
    
    [[transformers]]
    name = "black"
    enabled = true
    

    コロナートパス


    コードレビューは、新しい開発者のための非常に重要な学習ツールです.これは、ジュニアの開発者からの知識、経験、および慣習を転送する方法です、どのようにも最終的には、よりクリーンで、より効率的に行うことができると考えられていたコードを理解する方法です.
    私は、コードレビューが開発者のための最も良い学習ツールの1つであると言うのと同じくらい遠くに冒険します、そして、彼らはコードスタイルのような世俗的なもので浪費されます.少しのオートメーションを導入して、すべてのコード批評カウントをしてください.

    They know enough who know how to learn.


    よく行われると、コードのレビューは本当に教育的な経験することができます.オートメーションはそれを置き換えることができません.どのようなオートメーションを行うことができますmundaneプロセスから.
    Here’s to better code reviews!