Coverage for harbor_cli/deprecation.py: 95%

39 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-02-09 12:09 +0100

1from __future__ import annotations 

2 

3 

4from collections import UserString 

5from typing import Any, Optional 

6 

7import typer 

8from .logs import logger 

9import sys 

10 

11 

12class Deprecated(str): 

13 """Deprecated option.""" 

14 

15 replacement: Optional[str] = None 

16 

17 def __new__(cls, s, replacement: str | None = None) -> Deprecated: 

18 obj = str.__new__(cls, s) 

19 obj.replacement = replacement 

20 return obj 

21 

22 @property 

23 def strip_hyphens(self) -> str: 

24 return str(self).lstrip("-") 

25 

26 

27# Factored into separate functions for easier testing 

28 

29 

30def get_deprecated_params(ctx: typer.Context) -> list[Deprecated]: 

31 """Returnds a list of parameters for a context that have been marked 

32 as deprecated.""" 

33 info_dict = ctx.to_info_dict() 

34 params = info_dict["command"]["params"] 

35 deprected_params = [] 

36 for param in params: 

37 for opt in param["opts"]: 

38 if isinstance(opt, Deprecated): 

39 deprected_params.append(opt) 

40 return deprected_params 

41 

42 

43def used_deprecated(ctx: typer.Context) -> list[Deprecated]: 

44 """Returns a list of deprecated parameters that have been used.""" 

45 deprecated = get_deprecated_params(ctx) 

46 used = [] 

47 for param in deprecated: 

48 if param in sys.argv: 

49 used.append(param) 

50 return used 

51 

52 

53def check_deprecated_option(ctx: typer.Context) -> None: 

54 """Checks if any deprecated options have been used and logs a warning 

55 for each one.""" 

56 deprecated = used_deprecated(ctx) 

57 for param in deprecated: 

58 if param in sys.argv: 58 ↛ 57line 58 didn't jump to line 57, because the condition on line 58 was never false

59 msg = f"Option {param} is deprecated." 

60 if param.replacement: 60 ↛ 62line 60 didn't jump to line 62, because the condition on line 60 was never false

61 msg += f" Use {param.replacement} instead." 

62 logger.warning(msg)