nubia/internal/deprecation.py (27 lines of code) (raw):
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
#
from functools import wraps
from typing import Any, Dict, Optional
from termcolor import cprint
from nubia.internal.typing import inspect_object
def deprecated(message: Optional[str] = None, superseded_by: Optional[str] = None):
def decorator(command):
@wraps(command)
def wrapper(*args: Any, **kwargs: Dict[str, Any]):
warning: str = (
"[WARNING] The `{command}` command is deprecated "
"and will be eventually removed".format(
command=inspect_object(command).command.name
)
)
cprint(warning, "yellow")
if message is not None:
cprint(message, "yellow")
elif superseded_by is not None:
cprint("Use `{}` command instead".format(superseded_by), "yellow")
else:
assert False, "Unreachable"
return command(*args, **kwargs)
wrapper.__doc__ = "[DEPRECATED]" + command.__doc__
return wrapper
if not ((message is None) ^ (superseded_by is None)):
raise ValueError("Either `message` or `superseded_by` should be used")
return decorator