Coverage for cuda/core/_utils/version.pyx: 92.86%

28 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-10 02:27 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5import functools 

6import importlib.metadata 

7import re 

8  

9from cuda.core._utils.cuda_utils import driver, handle_return 

10  

11  

12def _parse_version_triple(version_str: str) -> tuple[int, int, int]: 

13 """Parse a PEP 440 version string into a (major, minor, patch) triple. 

14  

15 Strips local-version identifiers and handles pre-release suffixes such as 

16 ``0b1`` or ``0rc1`` by extracting only the leading integer from each 

17 release segment. 

18 """ 

19 parts = version_str.partition("+")[0].split(".")[:3] 

20 ints = ([int(m.group(1)) if (m := re.match(r"(\d+)", v)) else 0 for v in parts] + [0, 0, 0])[:3] 

21 return (ints[0], ints[1], ints[2]) 

22  

23  

24@functools.cache 

25def binding_version() -> tuple[int, int, int]: 

26 """Return the cuda-bindings version as a (major, minor, patch) triple.""" 

27 try: 

28 version_str = importlib.metadata.version("cuda-bindings") 

29 except importlib.metadata.PackageNotFoundError: 

30 version_str = importlib.metadata.version("cuda-python") 

31 return _parse_version_triple(version_str) 

32  

33  

34@functools.cache 

35def driver_version() -> tuple[int, int, int]: 

36 """Return the CUDA driver version as a (major, minor, patch) triple.""" 

37 cdef int ver = handle_return(driver.cuDriverGetVersion()) 

38 return (ver // 1000, (ver // 10) % 100, ver % 10) 

39  

40  

41cdef tuple _cached_binding_version = None 

42cdef tuple _cached_driver_version = None 

43  

44  

45cdef tuple cy_binding_version(): 

46 global _cached_binding_version 

47 if _cached_binding_version is None: 2AbBbc CbDbEbFbGbHbIbd e f JbKbLbMbNbObPbg Qbh i j k l m n o p q r s t u v w x y z A B C D E F G RbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+byb,b-b.b/b:b;b=b?b@bH [b]b^b_b`b{b|b}b~bacbcccdcecfcI gchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcJ K L M N O P Q R S T U V W X Y IcJcZ 0 1 Kc2 3 4 5 6 7 8 9 ! # $ % ' Lc( ) McNcOcPc* Qc+ RcScTcUcVc, - . / : ; = ? WcXc@ YcZc0c1c2c3c4c[ ] ^ _ ` { | } ~ 5cabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbb ubvbwbxb6c

48 _cached_binding_version = binding_version() 2ybb

49 return _cached_binding_version 2AbBbc CbDbEbFbGbHbIbd e f JbKbLbMbNbObPbg Qbh i j k l m n o p q r s t u v w x y z A B C D E F G RbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+byb,b-b.b/b:b;b=b?b@bH [b]b^b_b`b{b|b}b~bacbcccdcecfcI gchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcJ K L M N O P Q R S T U V W X Y IcJcZ 0 1 Kc2 3 4 5 6 7 8 9 ! # $ % ' Lc( ) McNcOcPc* Qc+ RcScTcUcVc, - . / : ; = ? WcXc@ YcZc0c1c2c3c4c[ ] ^ _ ` { | } ~ 5cabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbb ubvbwbxb6c

50  

51  

52cdef tuple cy_driver_version(): 

53 global _cached_driver_version 

54 if _cached_driver_version is None: 2c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ 7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/czb:c;c=c] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbb ubvbwbxb

55 _cached_driver_version = driver_version() 2zbb

56 return _cached_driver_version 2c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ 7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/czb:c;c=c] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbb ubvbwbxb