Returns :class:`~importlib.metadata.Distribution` for a matching `requirement` specification. Note: this function re-implements :func:`pkg_resources.get_distribution` functionality for py38+ (including py312, where setuptools/pkg_resources is not available by default). Args:
(requirement: Union[str, Requirement],
prereleases: bool = True)
| 58 | |
| 59 | |
| 60 | def get_distribution(requirement: Union[str, Requirement], |
| 61 | prereleases: bool = True) -> Distribution: |
| 62 | """Returns :class:`~importlib.metadata.Distribution` for a matching |
| 63 | `requirement` specification. |
| 64 | |
| 65 | Note: this function re-implements :func:`pkg_resources.get_distribution` |
| 66 | functionality for py38+ (including py312, where setuptools/pkg_resources |
| 67 | is not available by default). |
| 68 | |
| 69 | Args: |
| 70 | requirement: |
| 71 | Package dependency requirement according to PEP-508, given as string, |
| 72 | or :class:`~packaging.requirements.Requirement`. |
| 73 | prereleases: |
| 74 | Boolean flag to control if installed prereleases are allowed. |
| 75 | |
| 76 | Raises: |
| 77 | :class:`~importlib.metadata.PackageNotFoundError`: |
| 78 | Package by name not found. |
| 79 | :class:`~dwave.cloud.utils.dist.VersionNotFoundError`: |
| 80 | Version of the package found (distribution) does not match the |
| 81 | requirement. |
| 82 | """ |
| 83 | |
| 84 | if not isinstance(requirement, Requirement): |
| 85 | requirement = Requirement(requirement) |
| 86 | |
| 87 | dist = Distribution.from_name(requirement.name) |
| 88 | |
| 89 | if not requirement.specifier.contains(dist.version, prereleases=prereleases): |
| 90 | raise VersionNotFoundError( |
| 91 | f"Package {dist.name!r} version {dist.version} " |
| 92 | f"does not match {requirement.specifier!s}") |
| 93 | |
| 94 | return dist |