Pythonアーキテクチャのためのリンター


どのように、あなたはコードレビューまたはガイドライン以外のあなたのパイソンとDjangoプロジェクトのために建築を実施しますか?
アーキテクチャの目標は、プロジェクトのコンポーネント間の依存関係を整理し、制約することです.たとえば、通常のJjangoプロジェクトでは、ビューはモデルに依存します.ユーティリティ関数があれば、プロジェクトのどんな特定の点にも依存してはいけません.
私と遊んでいますimport-linter , そして、それは有望に見えます.

輸入業者は何を輸入するか


Pythonプロジェクトでは、依存関係を定義します.モジュールAがモジュールBをimportするならば、AはBに依存します.コンフィグファイルでは、いわゆるコントラクトを定義します.例えば、1つの契約は「私のプロジェクトでは、モデル. pyはView . pyからのどんなインポートも持ってはいけません」と言うことができます
[importlinter]
root_package = myproject

[importlinter:contract:models_views]
name = Models don't import views
type = forbidden
source_modules =
    myproject.views
forbidden_modules =
    myproject.models
あなたのモデルならば.Pyのようなものが含まれますfrom . import views , linterはエラーを送出します.

現在、3種類の契約があります.
  • 禁じられたモジュール:1セットのモジュールがもう一つのモジュールによって輸入されないことを確認してください.
  • 独立:一連のモジュールが互いに依存しないことを確認します.
  • 層:より高い層が下層に依存するかもしれませんが、他の方法ではなく層構造を実施します.
  • あなたがこれらの契約であなたの建築を表現することができないならば、あるいは、あなたはあなた自身があまりに多くの類似した規則を書いているのを見つけます、あなたはあなたのものを書くことができます、そして、それは簡単です.

    インポート・リンター


    私はインポートリンターの背後にあるモデルの優雅さが大好きです.プロジェクトを分析するには、インポートグラフを作成します.あなたの契約は、任意のエッジは、連絡先のルールに違反した場合チェックしてください.モジュールXとモジュールYの間に縁がありますか?ループはありますか.XからYへの道がありますか.
    舞台裏では、ライブラリを使用してgrimp そのターンでは、それに基づいていますNetworkX .

    概要


    好きなこと
  • プロジェクトに魔法はありません、そして、グラフベースのモデルは透明で、強力です.
  • それは大きなプロジェクトでもかなり速いです.
  • アプリケーション全体のアーキテクチャを定義しません.レガシープロジェクトでは、小さな起動できます.
  • Pythonクラスで独自のアーキテクチャ規則を定義できますが、簡単です.
  • 前コミットで動作します.
  • 私を混乱させたか少し失望させたもの
  • 契約タイプの限られたセットが論理的に1つの契約でなければならない何かのために異なる契約を書くように見えます.
  • ドキュメントでは、“foo”や“project econe”のような一般的なものを使用します.単純なCRUDアプリケーションまたは典型的なDjangoまたはフラスコプロジェクトのための独裁的な例は、多くを助けます.
  • 私はまだ養子縁組の初期段階にありますが、すでに私のものに加えましたPython cookiecutter . それが固執するかどうか見ましょう.

    参考文献

  • import-linter documentation
  • import-linter on GitHub
  • a blog post with the announcement
  • grimp

  • NetworkX .