構成ファイル処理¶
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
属性は、構成をロードするときに使用されるソースを決定します。isolated
が True
の場合、ユーザー固有の構成ファイルと環境変数は使用されません。
ローカル環境からの読み込み¶
Configuration
は、ローカル環境のすべての構成ソースから読み込み、構成の優先順位セクションで説明されている優先順位ロジックに従って値にアクセスするために使用できます。
このユースケースでは、Configuration.load_only
属性は None
になり、使用されるメソッドは次のようになります。
- class Configuration¶
- load()¶
環境とのすべての相互作用を処理し、すべての構成データをメモリ内のオブジェクトにロードします。
- items()¶
ロードされたメモリ内情報からキーと値のペア (
dict.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
を即時に設定します。