Coverage for src/incant/_compat.py: 100%

25 statements  

« prev     ^ index     » next       coverage.py v7.0.1, created at 2023-06-27 02:25 +0200

1import sys 

2 

3from functools import partial 

4from inspect import Parameter 

5from inspect import signature as sig 

6from typing import Any, Optional 

7 

8from attr import frozen 

9 

10 

11NO_OVERRIDE = object() 

12 

13 

14@frozen 

15class Override: 

16 name: Optional[str] = None 

17 annotation: Any = NO_OVERRIDE 

18 

19 

20if sys.version_info >= (3, 9): 

21 from typing import _AnnotatedAlias # type: ignore 

22 

23else: 

24 from typing_extensions import _AnnotatedAlias 

25 

26if sys.version_info >= (3, 10): 

27 signature = partial(sig, eval_str=True) 

28 

29else: 

30 signature = sig 

31 

32 

33def get_annotated_override(p: Parameter) -> Parameter: 

34 if p.annotation.__class__ is _AnnotatedAlias: 

35 for arg in p.annotation.__metadata__: 

36 if isinstance(arg, Override): 

37 name = arg.name if arg.name is not None else p.name 

38 an = ( 

39 arg.annotation 

40 if arg.annotation is not NO_OVERRIDE 

41 else p.annotation 

42 ) 

43 return Parameter(name, p.kind, default=p.default, annotation=an) 

44 return p