Skip to content

Commit

Permalink
WIP: Add initial draft of configuration deep dive
Browse files Browse the repository at this point in the history
  • Loading branch information
pradyunsg committed Mar 13, 2020
1 parent 98b3221 commit a5d914b
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 1 deletion.
89 changes: 89 additions & 0 deletions docs/html/development/architecture/configuration-files.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
===========================
Configuration File Handling
===========================

The ``pip._internal.configuration`` module is responsible for handling
configuration files (eg. loading from and saving values to) that are used by
pip. The module's functionality is largely exposed through and coordinated by
the module's ``Configuration`` class.

.. note::

This section of the documentation is currently being written. pip
developers welcome your help to complete this documentation. If you're
interested in helping out, please let us know in the
`tracking issue <https://github.com/pypa/pip/issues/6831>`_.


.. _configuration-overview:

Overview
========

TODO: Figure out how to structure the initial part of this document.

Loading
-------

#. Determine configuration files to be used (built on top of :pypi:`appdirs`).
#. Load from all the configuration files.
#. For each file, construct a ``RawConfigParser`` instance and read the
file with it. Store the filename and parser for accessing / manipulating
the file's contents later.
#. Load values stored in ``PIP_*`` environment variables.

The precedence of the various "configuration sources" is determined by
``Configuration._override_order``, and the precedence-respecting values are
lazily computed when values are accessed by a callee.

Saving
------

Once the configuration is loaded, it is saved by iterating through all the
"modified parser" pairs (filename and associated parser, that were modified
in-memory after the initial load), and writing the state of the parser to file.

-----

The remainder of this section is organized by documenting some of the
implementation details of the ``configuration`` module, in the following order:

* the :ref:`kinds <config-kinds>` enum,
* the :ref:`Configuration <configuration-class>` class,


.. _config-kinds:

kinds
=====

- used to represent "where" a configuration value comes from
(eg. environment variables, site-specific configuration file,
global configuration file)

.. _configuration-class:

Configuration
============

- TODO: API & usage - ``Command``, when processing CLI options.
- __init__()
- load()
- items()
- TODO: API & usage - ``pip config``, when loading / manipulating config files.
- __init__()
- get_file_to_edit()
- get_value()
- set_value()
- unset_value()
- save()
- TODO: nuances of ``load_only`` and ``get_file_to_edit``
- TODO: nuances of ``isolated``

Future Refactoring Ideas
========================

* Break up the ``Configuration`` class into 2 smaller classes, by use case
* ``Command`` use-case (read only) -- ``ConfigurationReader``
* ``pip config`` use-case (read / write) -- ``ConfigurationModifier`` (inherit from ``ConfigurationReader``)
* Eagerly populate ``Configuration._dictionary`` on load.
3 changes: 2 additions & 1 deletion docs/html/development/architecture/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ Architecture of pip's internals


.. toctree::
:maxdepth: 2
:maxdepth: 1

overview
anatomy
configuration-files
package-finding
upgrade-options

Expand Down

0 comments on commit a5d914b

Please sign in to comment.