Coverage for pydantic/version.py: 100.00%

26 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2024-06-21 17:00 +0000

1"""The `version` module holds the version information for Pydantic.""" 

2 

3from __future__ import annotations as _annotations 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

4 

5__all__ = 'VERSION', 'version_info' 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

6 

7VERSION = '2.8.0a1' 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

8"""The version of Pydantic.""" 1abcdefghijklmGHIJKLMnopqrs

9 

10 

11def version_short() -> str: 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

12 """Return the `major.minor` part of Pydantic version. 

13 

14 It returns '2.1' if Pydantic version is '2.1.1'. 

15 """ 

16 return '.'.join(VERSION.split('.')[:2]) 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

17 

18 

19def version_info() -> str: 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

20 """Return complete version information for Pydantic and its dependencies.""" 

21 import importlib.metadata as importlib_metadata 1tuvwabcdefxgyzABhijklmCDEFnopqrs

22 import os 1tuvwabcdefxgyzABhijklmCDEFnopqrs

23 import platform 1tuvwabcdefxgyzABhijklmCDEFnopqrs

24 import sys 1tuvwabcdefxgyzABhijklmCDEFnopqrs

25 from pathlib import Path 1tuvwabcdefxgyzABhijklmCDEFnopqrs

26 

27 import pydantic_core._pydantic_core as pdc 1tuvwabcdefxgyzABhijklmCDEFnopqrs

28 

29 from ._internal import _git as git 1tuvwabcdefxgyzABhijklmCDEFnopqrs

30 

31 # get data about packages that are closely related to pydantic, use pydantic or often conflict with pydantic 

32 package_names = { 1tuvwabcdefxgyzABhijklmCDEFnopqrs

33 'email-validator', 

34 'fastapi', 

35 'mypy', 

36 'pydantic-extra-types', 

37 'pydantic-settings', 

38 'pyright', 

39 'typing_extensions', 

40 } 

41 related_packages = [] 1tuvwabcdefxgyzABhijklmCDEFnopqrs

42 

43 for dist in importlib_metadata.distributions(): 1tuvwabcdefxgyzABhijklmCDEFnopqrs

44 name = dist.metadata['Name'] 1tuvwabcdefxgyzABhijklmCDEFnopqrs

45 if name in package_names: 1tuvwabcdefxgyzABhijklmCDEFnopqrs

46 related_packages.append(f'{name}-{dist.version}') 1tuvwabcdefxgyzABhijklmCDEFnopqrs

47 

48 pydantic_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) 1tuvwabcdefxgyzABhijklmCDEFnopqrs

49 most_recent_commit = ( 1tuvwabcdefxgyzABhijklmCDEFnopqrs

50 git.git_revision(pydantic_dir) if git.is_git_repo(pydantic_dir) and git.have_git() else 'unknown' 

51 ) 

52 

53 info = { 1tuvwabcdefxgyzABhijklmCDEFnopqrs

54 'pydantic version': VERSION, 

55 'pydantic-core version': pdc.__version__, 

56 'pydantic-core build': getattr(pdc, 'build_info', None) or pdc.build_profile, 

57 'install path': Path(__file__).resolve().parent, 

58 'python version': sys.version, 

59 'platform': platform.platform(), 

60 'related packages': ' '.join(related_packages), 

61 'commit': most_recent_commit, 

62 } 

63 return '\n'.join('{:>30} {}'.format(k + ':', str(v).replace('\n', ' ')) for k, v in info.items()) 1tuvwabcdefxgyzABhijklmCDEFnopqrs

64 

65 

66def parse_mypy_version(version: str) -> tuple[int, ...]: 1tuvwabcdefxgyzABhijklmNOGHIJKLMCDEFnopqrs

67 """Parse mypy string version to tuple of ints. 

68 

69 It parses normal version like `0.930` and extra info followed by a `+` sign 

70 like `0.940+dev.04cac4b5d911c4f9529e6ce86a27b44f28846f5d.dirty`. 

71 

72 Args: 

73 version: The mypy version string. 

74 

75 Returns: 

76 A tuple of ints. e.g. (0, 930). 

77 """ 

78 return tuple(map(int, version.partition('+')[0].split('.'))) 1NOGHIJKLM