構成ファイル処理

pip._internal.configuration モジュールは、pip が使用する構成ファイル (例: 値の読み込みおよび保存) の処理を担当します。このモジュールの機能は、主にモジュールの Configuration クラスを通じて公開され、調整されます。

ドキュメントのこのセクションは現在作成中です。pip 開発者は、このドキュメントの完成にご協力いただけることを歓迎します。ご協力いただける場合は、トラッキング issue でお知らせください。

概要

pip は、標準の OS に適切な場所に構成ファイルを保存します。これは appdirs によって決定されます。これらのファイルは INI 形式で、RawConfigParser で処理されます。

pip は 2 つの操作で構成ファイルを使用します。

  • コマンドラインオプションの処理中。

    • すべての構成ソースからの読み込み

  • pip config コマンドの一部として。

    • すべての構成ソースからの読み込み

    • 単一の構成ファイルの操作

これらの操作はどちらも、構成ファイルの処理に関するすべてのロジックをカプセル化し、同じための API を提供する Configuration オブジェクトによって提供される機能を利用します。

このセクションの残りの部分では、Configuration クラスについて説明し、将来的なリファクタリングのアイデアについて検討します。

Configuration クラス

Configuration は、ローカル環境のソース (構成ファイルと環境変数の組み合わせ) から構成値をロードします。

これは、ローカル環境からすべての値を読み取る場合と、単一の構成ファイルを操作する場合の 2 つの「モード」で使用できます。これらの 2 つのモードは、操作する構成ファイルの種類を表すことができる None または load_only 属性を使用して区別されます。

isolated 属性は、構成をロードするときに使用されるソースを決定します。isolatedTrue の場合、ユーザー固有の構成ファイルと環境変数は使用されません。

ローカル環境からの読み込み

Configuration は、ローカル環境のすべての構成ソースから読み込み、構成の優先順位セクションで説明されている優先順位ロジックに従って値にアクセスするために使用できます。

このユースケースでは、Configuration.load_only 属性は None になり、使用されるメソッドは次のようになります。

class Configuration
load()

環境とのすべての相互作用を処理し、すべての構成データをメモリ内のオブジェクトにロードします。

items()

ロードされたメモリ内情報からキーと値のペア (dict.items() のように) を提供し、すべてのオーバーライド順序ロジックを処理します。

get_value(key)

ロードされた構成から、指定されたキーの値を提供します。ロードされた構成は、load_only が None または None 以外になる場合があります。これは、Configuration.items() と同じ基盤となるメカニズムを使用し、構成の優先順位で説明されている優先順位ロジックに従います。

執筆時点では、この方法で Configuration を使用するコードベースの部分は、コマンドライン処理ロジックの一部として構成処理を透過的に含めるための ConfigOptionParser と、CLI を介して種類が指定されていない場合に構成全体を出力するための pip config get です。

単一の構成ファイルの操作

Configuration は、特定のキーと値のペアを追加、変更、または削除するなど、単一の構成ファイルを操作するために使用できます。

このユースケースでは、load_only 属性は None 以外になり、操作する構成ファイルの種類を表します。前のセクションで説明したメソッドに加えて、使用されるメソッドは次のようになります。

class Configuration
get_file_to_edit()

load_only で指定された構成ファイルの種類に対して、「最優先」のファイルを提供します。これには、load_only が None 以外である必要があります。

set_value(key, value)

Configuration.get_file_to_edit() で指定されたファイルで、単一のキーと値のペアを追加/変更する方法を提供します。

unset_value(key)

Configuration.get_file_to_edit() で指定されたファイルで、単一のキーと値のペアを削除する方法を提供します。

save()

メモリ内の状態を元のファイルに保存し、Configuration オブジェクトに加えられた変更をローカル環境に保存します。

種類

これは、構成の「ソース」を表す値を提供する列挙です。これには、環境変数と、さまざまな種類の構成ファイル (グローバル、サイト固有、ユーザー固有、PIP_CONFIG_FILE を介して指定されたもの) が含まれます。

将来のリファクタリングのアイデア

  • ユースケースごとに Configuration クラスを 2 つの小さなクラスに分割します。
    • Command ユースケース (読み取り専用) -- ConfigurationReader

    • pip config ユースケース (読み取り/書き込み) -- ConfigurationModifier (ConfigurationReader から継承)

  • ロード時に Configuration._dictionary を即時に設定します。