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
« prev ^ index » next coverage.py v6.5.0, created at 2023-02-09 12:09 +0100
1from __future__ import annotations
4from collections import UserString
5from typing import Any, Optional
7import typer
8from .logs import logger
9import sys
12class Deprecated(str):
13 """Deprecated option."""
15 replacement: Optional[str] = None
17 def __new__(cls, s, replacement: str | None = None) -> Deprecated:
18 obj = str.__new__(cls, s)
19 obj.replacement = replacement
20 return obj
22 @property
23 def strip_hyphens(self) -> str:
24 return str(self).lstrip("-")
27# Factored into separate functions for easier testing
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
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
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)