/usr/lib/python3/dist-packages/plainbox/impl/commands/__init__.py is in python3-plainbox 0.25-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | # This file is part of Checkbox.
#
# Copyright 2012-2014 Canonical Ltd.
# Written by:
# Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
#
# Checkbox is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3,
# as published by the Free Software Foundation.
#
# Checkbox is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
"""
:mod:`plainbox.impl.commands` -- shared code for plainbox sub-commands
======================================================================
.. warning::
THIS MODULE DOES NOT HAVE STABLE PUBLIC API
"""
import abc
import logging
from plainbox.impl.clitools import CommandBase
from plainbox.impl.clitools import ToolBase
from plainbox.public import get_providers
logger = logging.getLogger("plainbox.commands")
class PlainBoxToolBase(ToolBase):
"""
Base class for implementing commands like 'plainbox'.
The tools support a variety of sub-commands, logging and debugging
support. If argcomplete module is available and used properly in
the shell then advanced tab-completion is also available.
There are four methods to implement for a basic tool. Those are:
1. :meth:`get_exec_name()` -- to know how the command will be called
2. :meth:`get_exec_version()` -- to know how the version of the tool
3. :meth:`add_subcommands()` -- to add some actual commands to execute
4. :meth:`get_config_cls()` -- to know which config to use
This class has some complex control flow to support important and
interesting use cases. There are some concerns to people that subclass this
in order to implement their own command line tools.
The first concern is that input is parsed with two parsers, the early
parser and the full parser. The early parser quickly checks for a fraction
of supported arguments and uses that data to initialize environment before
construction of a full parser is possible. The full parser sees the
reminder of the input and does not re-parse things that where already
handled.
The second concern is that this command natively supports the concept of a
config object and a provider object. This may not be desired by all users
but it is the current state as of this writing. This means that by the time
eary init is done we have a known provider and config objects that can be
used to instantiate command objects in :meth:`add_subcommands()`. This API
might change when full multi-provider is available but details are not
known yet.
"""
@classmethod
@abc.abstractmethod
def get_config_cls(cls):
"""
Get the Config class that is used by this implementation.
This can be overridden by subclasses to use a different config class
that is suitable for the particular application.
"""
def _load_config(self):
return self.get_config_cls().get()
def _load_providers(self):
logger.info("Loading all providers...")
return get_providers()
class PlainBoxCommand(CommandBase):
"""
Simple interface class for plainbox commands.
Command objects like this are consumed by PlainBoxTool subclasses to
implement hierarchical command system. The API supports arbitrary many sub
commands in arbitrary nesting arrangement.
"""
gettext_domain = "plainbox"
|