nubia/internal/plugin_interface.py (74 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.
#
import argparse
from typing import Any, List, MutableMapping, Tuple
from nubia.internal.blackcmd import CommandBlacklist
from nubia.internal.constants import DEFAULT_COMMAND_TIMEOUT
from nubia.internal.context import Context
from nubia.internal.ui import statusbar
class CompletionDataSource:
"""An interface that defines completion data sources"""
def get_all(self):
"""
Returns all the possible values for this data source
"""
return []
class PluginInterface:
"""
The PluginInterface class is a way to customize nubia for every customer
use case. It allowes custom argument validation, control over command
loading, custom context objects, and much more.
"""
def create_context(self):
"""
Must create an object that inherits from `Context` parent class.
The plugin can return a custom context but it has to inherit from the
correct parent class.
"""
return Context()
def validate_args(self, args):
"""
This will be executed when starting nubia, the args passed is a
dict-like object that contains the argparse result after parsing the
command line arguments. The plugin can choose to update the context
with the values, and/or decide to raise `ArgsValidationError` with
the error message.
"""
pass
def get_commands(self):
return []
def get_listeners(self):
"""
Return all "classes" that implement the Listener interface, note that
you should not return the instances of these classes as they will be
instantiated by nubia
"""
return []
def get_magics(self):
"""
Return all the class objects that inherit from
`IPython.core.magic.Magics` to be registered if running with ipython
mode.
"""
return []
def get_opts_parser(self, add_help=True):
"""
Builds the ArgumentParser that will be passed to nubia, use this to
build your list of arguments that you want for your shell.
"""
epilog = (
"NOTES: LIST types are given as comma separated values, "
"eg. a,b,c,d. DICT types are given as semicolon separated "
"key:value pairs (or key=value), e.g., a:b;c:d and if a dict "
"takes a list as value it look like a:1,2;b:1"
)
opts_parser = argparse.ArgumentParser(
description="A Generic Shell Utility",
epilog=epilog,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
add_help=add_help,
)
opts_parser.add_argument(
"--verbose",
"-v",
action="count",
default=0,
help="Increase verbosity, can be specified multiple times",
)
opts_parser.add_argument(
"--stderr",
"-s",
action="store_true",
help="By default the logging output goes to a "
"temporary file. This disables this feature "
"by sending the logging output to stderr",
)
opts_parser.add_argument(
"--command-timeout",
required=False,
type=int,
default=DEFAULT_COMMAND_TIMEOUT,
help="Timeout for commands (default %ds)" % DEFAULT_COMMAND_TIMEOUT,
)
return opts_parser
def get_completion_datasource_for_global_argument(self, name):
return None
def get_status_bar(self, context):
return statusbar.StatusBar(context)
def get_prompt_tokens(self, context: Context) -> List[Tuple[Any, str]]:
return context.get_prompt_tokens()
def setup_logging(self, root_logger, args):
"""
Override this and configure your own logging setup. Return your root
logger.
"""
return None
def create_usage_logger(self, context):
"""
Override this and return you own usage logger.
Must be a subtype of UsageLoggerInterface.
"""
return None
def getBlacklistPlugin(self):
"""
Override this and return you own plugin for blacklist commands.
Then implement a function is_blacklisted(<command_name>)
Any return other then 0 will block command execution
"""
return CommandBlacklist()
def update_ipython_kwargs(
self, ctx: Context, kwargs: MutableMapping[str, Any]
) -> None:
"""
Return named arguments that need to be added when calling
InteractiveShellEmbed.
"""
pass
def get_session_logger(self, context):
"""
Override this and return your own instance of SessionLogger if you want
to enable session logging.
"""
return None