@@ -19,7 +19,7 @@ such as its entry points
19
19
or its top-level names (`Import Package <https://packaging.python.org/en/latest/glossary/#term-Import-Package >`_\s , modules, if any).
20
20
Built in part on Python's import system, this library
21
21
intends to replace similar functionality in the `entry point
22
- API `_ and `metadata API `_ of ``pkg_resources ``. Along with
22
+ API `_ and `metadata API `_ of ``pkg_resources ``. Along with
23
23
:mod: `importlib.resources `,
24
24
this package can eliminate the need to use the older and less efficient
25
25
``pkg_resources `` package.
@@ -46,7 +46,7 @@ and metadata defined by the `Core metadata specifications <https://packaging.pyt
46
46
47
47
By default, distribution metadata can live on the file system
48
48
or in zip archives on
49
- :data: `sys.path `. Through an extension mechanism, the metadata can live almost
49
+ :data: `sys.path `. Through an extension mechanism, the metadata can live almost
50
50
anywhere.
51
51
52
52
@@ -68,7 +68,7 @@ Overview
68
68
69
69
Let's say you wanted to get the version string for a
70
70
`Distribution Package <https://packaging.python.org/en/latest/glossary/#term-Distribution-Package >`_ you've installed
71
- using ``pip ``. We start by creating a virtual environment and installing
71
+ using ``pip ``. We start by creating a virtual environment and installing
72
72
something into it:
73
73
74
74
.. code-block :: shell-session
@@ -87,7 +87,7 @@ You can get the version string for ``wheel`` by running the following:
87
87
'0.32.3'
88
88
89
89
You can also get a collection of entry points selectable by properties of the EntryPoint (typically 'group' or 'name'), such as
90
- ``console_scripts ``, ``distutils.commands `` and others. Each group contains a
90
+ ``console_scripts ``, ``distutils.commands `` and others. Each group contains a
91
91
collection of :ref: `EntryPoint <entry-points >` objects.
92
92
93
93
You can get the :ref: `metadata for a distribution <metadata >`::
@@ -114,7 +114,7 @@ Entry points
114
114
The ``entry_points() `` function returns a collection of entry points.
115
115
Entry points are represented by ``EntryPoint `` instances;
116
116
each ``EntryPoint `` has a ``.name ``, ``.group ``, and ``.value `` attributes and
117
- a ``.load() `` method to resolve the value. There are also ``.module ``,
117
+ a ``.load() `` method to resolve the value. There are also ``.module ``,
118
118
``.attr ``, and ``.extras `` attributes for getting the components of the
119
119
``.value `` attribute.
120
120
@@ -167,7 +167,7 @@ Inspect the resolved entry point::
167
167
168
168
The ``group `` and ``name `` are arbitrary values defined by the package author
169
169
and usually a client will wish to resolve all entry points for a particular
170
- group. Read `the setuptools docs
170
+ group. Read `the setuptools docs
171
171
<https://setuptools.pypa.io/en/latest/userguide/entry_point.html> `_
172
172
for more information on entry points, their definition, and usage.
173
173
@@ -240,12 +240,12 @@ number, as a string::
240
240
Distribution files
241
241
------------------
242
242
243
- You can also get the full set of files contained within a distribution. The
243
+ You can also get the full set of files contained within a distribution. The
244
244
``files() `` function takes a `Distribution Package <https://packaging.python.org/en/latest/glossary/#term-Distribution-Package >`_ name
245
245
and returns all of the
246
- files installed by this distribution. Each file object returned is a
246
+ files installed by this distribution. Each file object returned is a
247
247
``PackagePath ``, a :class: `pathlib.PurePath ` derived object with additional ``dist ``,
248
- ``size ``, and ``hash `` properties as indicated by the metadata. For example::
248
+ ``size ``, and ``hash `` properties as indicated by the metadata. For example::
249
249
250
250
>>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP
251
251
>>> util # doctest: +SKIP
@@ -321,9 +321,9 @@ Distributions
321
321
=============
322
322
323
323
While the above API is the most common and convenient usage, you can get all
324
- of that information from the ``Distribution `` class. A ``Distribution `` is an
324
+ of that information from the ``Distribution `` class. A ``Distribution `` is an
325
325
abstract object that represents the metadata for
326
- a Python `Distribution Package <https://packaging.python.org/en/latest/glossary/#term-Distribution-Package >`_. You can
326
+ a Python `Distribution Package <https://packaging.python.org/en/latest/glossary/#term-Distribution-Package >`_. You can
327
327
get the ``Distribution `` instance::
328
328
329
329
>>> from importlib.metadata import distribution # doctest: +SKIP
@@ -366,21 +366,26 @@ This metadata finder search defaults to ``sys.path``, but varies slightly in how
366
366
- ``importlib.metadata `` will incidentally honor :py:class: `pathlib.Path ` objects on ``sys.path `` even though such values will be ignored for imports.
367
367
368
368
369
- Extending the search algorithm
370
- ==============================
369
+ Implementing Custom Providers
370
+ =============================
371
+
372
+ ``importlib.metadata `` address two API surfaces, one for *consumers *
373
+ and another for *providers *. Most users are consumers, consuming
374
+ metadata provided by the packages. There are other use-cases, however,
375
+ where users wish to expose metadata through some other mechanism,
376
+ such as alongside a custom importer. Such a use case calls for a
377
+ *custom provider *.
371
378
372
379
Because `Distribution Package <https://packaging.python.org/en/latest/glossary/#term-Distribution-Package >`_ metadata
373
380
is not available through :data: `sys.path ` searches, or
374
381
package loaders directly,
375
382
the metadata for a distribution is found through import
376
- system :ref: `finders <finders-and-loaders >`. To find a distribution package's metadata,
383
+ system :ref: `finders <finders-and-loaders >`. To find a distribution package's metadata,
377
384
``importlib.metadata `` queries the list of :term: `meta path finders <meta path finder> ` on
378
385
:data: `sys.meta_path `.
379
386
380
- By default ``importlib.metadata `` installs a finder for distribution packages
381
- found on the file system.
382
- This finder doesn't actually find any *distributions *,
383
- but it can find their metadata.
387
+ The implementation has hooks integrated into the ``PathFinder ``,
388
+ serving metadata for distribution packages found on the file system.
384
389
385
390
The abstract class :py:class: `importlib.abc.MetaPathFinder ` defines the
386
391
interface expected of finders by Python's import system.
@@ -391,16 +396,16 @@ interface expected of finders by Python's import system.
391
396
method::
392
397
393
398
@abc.abstractmethod
394
- def find_distributions(context=DistributionFinder.Context()):
399
+ def find_distributions(context=DistributionFinder.Context()) -> Iterable[Distribution] :
395
400
"""Return an iterable of all Distribution instances capable of
396
401
loading the metadata for packages for the indicated ``context``.
397
402
"""
398
403
399
404
The ``DistributionFinder.Context `` object provides ``.path `` and ``.name ``
400
405
properties indicating the path to search and name to match and may
401
- supply other relevant context.
406
+ supply other relevant context sought by the consumer .
402
407
403
- What this means in practice is that to support finding distribution package
408
+ In practice, to support finding distribution package
404
409
metadata in locations other than the file system, subclass
405
410
``Distribution `` and implement the abstract methods. Then from
406
411
a custom finder, return instances of this derived ``Distribution `` in the
@@ -409,8 +414,7 @@ a custom finder, return instances of this derived ``Distribution`` in the
409
414
Example
410
415
-------
411
416
412
- Consider for example a custom finder that loads Python
413
- modules from a database::
417
+ Imagine a custom finder that loads Python modules from a database::
414
418
415
419
class DatabaseImporter(importlib.abc.MetaPathFinder):
416
420
def __init__(self, db):
0 commit comments