From 829af25d2ec9b6252d2a3789ebd890ddb9400442 Mon Sep 17 00:00:00 2001 From: Samuel Colvin Date: Mon, 25 Sep 2023 11:54:23 +0100 Subject: [PATCH] Improvements to version info message (#7594) --- pydantic/version.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/pydantic/version.py b/pydantic/version.py index b70905377b..9d2219c726 100644 --- a/pydantic/version.py +++ b/pydantic/version.py @@ -8,9 +8,9 @@ def version_short() -> str: - """Return the major.minor part of Pydantic version. + """Return the `major.minor` part of Pydantic version. - It return '2.1' if Pydantic version is '2.1.1'. + It returns '2.1' if Pydantic version is '2.1.1'. """ return '.'.join(VERSION.split('.')[:2]) @@ -19,18 +19,31 @@ def version_info() -> str: """Return complete version information for Pydantic and its dependencies.""" import platform import sys - from importlib import import_module from pathlib import Path import pydantic_core._pydantic_core as pdc - optional_deps = [] - for p in 'devtools', 'email-validator', 'typing-extensions': - try: - import_module(p.replace('-', '_')) - except ImportError: # pragma: no cover - continue - optional_deps.append(p) + if sys.version_info >= (3, 8): + import importlib.metadata as importlib_metadata + else: + import importlib_metadata + + # get data about packages that are closely related to pydantic, use pydantic or often conflict with pydantic + package_names = { + 'email-validator', + 'fastapi', + 'mypy', + 'pydantic-extra-types', + 'pydantic-settings', + 'pyright', + 'typing_extensions', + } + related_packages = [] + + for dist in importlib_metadata.distributions(): + name = dist.metadata['Name'] + if name in package_names: + related_packages.append(f'{name}-{dist.version}') info = { 'pydantic version': VERSION, @@ -39,7 +52,7 @@ def version_info() -> str: 'install path': Path(__file__).resolve().parent, 'python version': sys.version, 'platform': platform.platform(), - 'optional deps. installed': optional_deps, + 'related packages': ' '.join(related_packages), } return '\n'.join('{:>30} {}'.format(k + ':', str(v).replace('\n', ' ')) for k, v in info.items())