Skip to content

Commit e24ba43

Browse files
committed
Merge branch 'master' into bugfix/95-perf
2 parents 6bb3d63 + e098c1f commit e24ba43

File tree

5 files changed

+45
-34
lines changed

5 files changed

+45
-34
lines changed

importlib_metadata/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,21 @@ class DistributionFinder(MetaPathFinder):
359359
"""
360360

361361
class Context:
362+
"""
363+
Keyword arguments presented by the caller to
364+
``distributions()`` or ``Distribution.discover()``
365+
to narrow the scope of a search for distributions
366+
in all DistributionFinders.
367+
368+
Each DistributionFinder may expect any parameters
369+
and should attempt to honor the canonical
370+
parameters defined below when appropriate.
371+
"""
362372

363373
name = None
364374
"""
365375
Specific name for which a distribution finder should match.
376+
A name of ``None`` matches all distributions.
366377
"""
367378

368379
def __init__(self, **kwargs):
@@ -372,6 +383,9 @@ def __init__(self, **kwargs):
372383
def path(self):
373384
"""
374385
The path that a distribution finder should search.
386+
387+
Typically refers to Python package paths and defaults
388+
to ``sys.path``.
375389
"""
376390
return vars(self).get('path', sys.path)
377391

importlib_metadata/docs/changelog.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
importlib_metadata NEWS
33
=========================
44

5-
v1.3.0
5+
v1.4.0
66
======
77

88
* Through careful optimization, ``distribution()`` is
99
3-4x faster. Thanks to Antony Lee for the
1010
contribution. Closes #95.
1111

12+
v1.3.0
13+
======
14+
15+
* Improve custom finders documentation. Closes #105.
16+
1217
v1.2.0
1318
======
1419

importlib_metadata/docs/conf.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@
166166
# Example configuration for intersphinx: refer to the Python standard library.
167167
intersphinx_mapping = {
168168
'python': ('https://docs.python.org/3', None),
169+
'importlib_resources': (
170+
'https://importlib-resources.readthedocs.io/en/latest/', None
171+
),
169172
}
170173

171174

importlib_metadata/docs/index.rst

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
===============================
44

55
``importlib_metadata`` is a library which provides an API for accessing an
6-
installed package's `metadata`_, such as its entry points or its top-level
6+
installed package's metadata (see :pep:`566`), such as its entry points or its top-level
77
name. This functionality intends to replace most uses of ``pkg_resources``
8-
`entry point API`_ and `metadata API`_. Along with ``importlib.resources`` in
9-
`Python 3.7 and newer`_ (backported as `importlib_resources`_ for older
8+
`entry point API`_ and `metadata API`_. Along with :mod:`importlib.resources` in
9+
Python 3.7 and newer (backported as :doc:`importlib_resources <importlib_resources:index>` for older
1010
versions of Python), this can eliminate the need to use the older and less
1111
efficient ``pkg_resources`` package.
1212

1313
``importlib_metadata`` is a backport of Python 3.8's standard library
14-
`importlib.metadata`_ module for Python 2.7, and 3.4 through 3.7. Users of
14+
:doc:`importlib.metadata <library/importlib.metadata>` module for Python 2.7, and 3.4 through 3.7. Users of
1515
Python 3.8 and beyond are encouraged to use the standard library module.
1616
When imported on Python 3.8 and later, ``importlib_metadata`` replaces the
1717
DistributionFinder behavior from the stdlib, but leaves the API in tact.
@@ -46,9 +46,5 @@ Indices and tables
4646
* :ref:`search`
4747

4848

49-
.. _`metadata`: https://www.python.org/dev/peps/pep-0566/
5049
.. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points
5150
.. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api
52-
.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources
53-
.. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html
54-
.. _`importlib.metadata`: https://docs.python.org/3/library/importlib.metadata.html

importlib_metadata/docs/using.rst

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
.. _using:
22

3-
==========================
4-
Using importlib_metadata
5-
==========================
3+
=================================
4+
Using :mod:`!importlib_metadata`
5+
=================================
66

77
``importlib_metadata`` is a library that provides for access to installed
88
package metadata. Built in part on Python's import system, this library
99
intends to replace similar functionality in the `entry point
1010
API`_ and `metadata API`_ of ``pkg_resources``. Along with
11-
``importlib.resources`` in `Python 3.7
12-
and newer`_ (backported as `importlib_resources`_ for older versions of
11+
:mod:`importlib.resources` in Python 3.7
12+
and newer (backported as :doc:`importlib_resources <importlib_resources:index>` for older versions of
1313
Python), this can eliminate the need to use the older and less efficient
1414
``pkg_resources`` package.
1515

1616
By "installed package" we generally mean a third-party package installed into
1717
Python's ``site-packages`` directory via tools such as `pip
1818
<https://pypi.org/project/pip/>`_. Specifically,
1919
it means a package with either a discoverable ``dist-info`` or ``egg-info``
20-
directory, and metadata defined by `PEP 566`_ or its older specifications.
20+
directory, and metadata defined by :pep:`566` or its older specifications.
2121
By default, package metadata can live on the file system or in zip archives on
22-
``sys.path``. Through an extension mechanism, the metadata can live almost
22+
:data:`sys.path`. Through an extension mechanism, the metadata can live almost
2323
anywhere.
2424

2525

@@ -127,7 +127,7 @@ Distribution files
127127
You can also get the full set of files contained within a distribution. The
128128
``files()`` function takes a distribution package name and returns all of the
129129
files installed by this distribution. Each file object returned is a
130-
``PackagePath``, a `pathlib.Path`_ derived object with additional ``dist``,
130+
``PackagePath``, a :class:`pathlib.Path` derived object with additional ``dist``,
131131
``size``, and ``hash`` properties as indicated by the metadata. For example::
132132

133133
>>> util = [p for p in files('wheel') if 'util.py' in str(p)][0]
@@ -196,18 +196,18 @@ instance::
196196
>>> d.metadata['License']
197197
'MIT'
198198

199-
The full set of available metadata is not described here. See `PEP 566
200-
<https://www.python.org/dev/peps/pep-0566/>`_ for additional details.
199+
The full set of available metadata is not described here. See :pep:`566`
200+
for additional details.
201201

202202

203203
Extending the search algorithm
204204
==============================
205205

206-
Because package metadata is not available through ``sys.path`` searches, or
206+
Because package metadata is not available through :data:`sys.path` searches, or
207207
package loaders directly, the metadata for a package is found through import
208208
system `finders`_. To find a distribution package's metadata,
209-
``importlib_metadata`` queries the list of `meta path finders`_ on
210-
`sys.meta_path`_.
209+
``importlib.metadata`` queries the list of :term:`meta path finders <meta path finder>` on
210+
:data:`sys.meta_path`.
211211

212212
By default ``importlib_metadata`` installs a finder for distribution packages
213213
found on the file system. This finder doesn't actually find any *packages*,
@@ -217,7 +217,7 @@ The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the
217217
interface expected of finders by Python's import system.
218218
``importlib_metadata`` extends this protocol by looking for an optional
219219
``find_distributions`` callable on the finders from
220-
``sys.meta_path`` and presents this extended interface as the
220+
:data:`sys.meta_path` and presents this extended interface as the
221221
``DistributionFinder`` abstract base class, which defines this abstract
222222
method::
223223

@@ -232,28 +232,21 @@ properties indicating the path to search and names to match and may
232232
supply other relevant context.
233233

234234
What this means in practice is that to support finding distribution package
235-
metadata in locations other than the file system, you should derive from
236-
``Distribution`` and implement the ``load_metadata()`` method. Then from
237-
your finder, return instances of this derived ``Distribution`` in the
235+
metadata in locations other than the file system, subclass
236+
``Distribution`` and implement the abstract methods. Then from
237+
a custom finder, return instances of this derived ``Distribution`` in the
238238
``find_distributions()`` method.
239239

240240

241241
.. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points
242242
.. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api
243-
.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources
244-
.. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html
245-
.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/
246243
.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders
247-
.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder
248-
.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path
249-
.. _`pathlib.Path`: https://docs.python.org/3/library/pathlib.html#pathlib.Path
250244

251245

252246
.. rubric:: Footnotes
253247

254248
.. [#f1] Technically, the returned distribution metadata object is an
255-
`email.message.Message
256-
<https://docs.python.org/3/library/email.message.html#email.message.EmailMessage>`_
249+
:class:`email.message.EmailMessage`
257250
instance, but this is an implementation detail, and not part of the
258251
stable API. You should only use dictionary-like methods and syntax
259252
to access the metadata contents.

0 commit comments

Comments
 (0)