kiwi-scp/src/kiwi/subcommands/_subcommand.py

123 lines
3.5 KiB
Python
Raw Normal View History

# system
import logging
2020-08-18 11:50:21 +00:00
# local
from .utils.project import Projects
2020-08-18 11:50:21 +00:00
2020-08-12 15:46:50 +00:00
# parent
2020-08-12 14:43:13 +00:00
from ..parser import Parser
class SubCommand:
2020-08-13 08:48:01 +00:00
"""represents kiwi [anything] command"""
# actual command string
2020-08-12 14:43:13 +00:00
__name = None
2020-08-13 08:48:01 +00:00
# command parser
2020-08-12 14:43:13 +00:00
_sub_parser = None
def __init__(self, name, add_parser=True, **kwargs):
2020-08-12 14:43:13 +00:00
self.__name = name
if add_parser:
self._sub_parser = Parser().get_subparsers().add_parser(
name,
**kwargs
)
2020-08-12 14:43:13 +00:00
def __str__(self):
return self.__name
2020-08-17 08:57:45 +00:00
def run(self, runner, config, args):
2020-08-13 08:48:01 +00:00
"""actually run command with this dir's config and parsed CLI args"""
2020-08-12 14:43:13 +00:00
pass
class ProjectCommand(SubCommand):
"""this command concerns a project in current instance"""
def __init__(self, name, num_projects, add_parser=True, **kwargs):
super().__init__(
name, add_parser=add_parser,
**kwargs
)
projects = "a project"
2020-08-18 13:56:22 +00:00
if not num_projects == 1:
projects = "project(s)"
self._sub_parser.add_argument(
'projects', metavar='project', nargs=num_projects, type=str,
help=f"select {projects} in this instance"
)
class ServiceCommand(ProjectCommand):
2020-08-13 12:26:49 +00:00
"""this command concerns service(s) in a project"""
def __init__(self, name, num_projects, num_services, add_parser=True, **kwargs):
super().__init__(
name, num_projects=num_projects, add_parser=add_parser,
**kwargs
)
services = "a service"
2020-08-13 12:26:49 +00:00
2020-08-18 13:56:22 +00:00
if not num_services == 1:
services = "service(s)"
2020-08-13 12:26:49 +00:00
self._sub_parser.add_argument(
'services', metavar='service', nargs=num_services, type=str,
2020-08-13 12:26:49 +00:00
help=f"select {services} in a project"
)
2020-08-18 11:50:21 +00:00
class FlexCommand(ServiceCommand):
"""this command concerns the entire instance, a whole project or just service(s) in a project"""
__action = None
def __init__(self, name, action='', add_parser=True, **kwargs):
2020-08-18 11:50:21 +00:00
super().__init__(
name, num_projects='?', num_services='*', add_parser=add_parser,
2020-08-18 11:50:21 +00:00
**kwargs
)
if not action:
# default action string
self.__action = f"Running '{str(self)}' for"
else:
self.__action = action
2020-08-18 11:50:21 +00:00
def _run_instance(self, runner, config, args):
result = True
for project in Projects.from_args(args):
args.projects = project.get_name()
2020-08-18 11:50:21 +00:00
result &= runner.run(str(self))
return result
def _run_project(self, runner, config, args):
2020-08-18 12:28:03 +00:00
return self._run_services(runner, config, args, [])
2020-08-18 11:50:21 +00:00
def _run_services(self, runner, config, args, services):
2020-08-18 11:50:21 +00:00
pass
def run(self, runner, config, args):
projects = Projects.from_args(args)
if not projects:
# no project given, run for entire instance
logging.info(f"{self.__action} this instance")
2020-08-18 11:50:21 +00:00
return self._run_instance(runner, config, args)
project = projects[0]
if args is None or 'services' not in args or not args.services:
# no services given, run for whole project
logging.info(f"{self.__action} project '{project.get_name()}'")
return self._run_project(runner, config, args)
2020-08-18 11:50:21 +00:00
# run for service(s) inside project
logging.info(f"{self.__action} services {args.services} in project '{project.get_name()}'")
return self._run_services(runner, config, args, args.services)