"""
Define actions that can be called with the CLI.
"""
import json
import logging
from argparse import ArgumentParser
from . import logging_tools
from .config_management import get_pkg_config, write_pkg_config
from .manage import (add_option, clean, init_pkg, install_example_files,
regenerate_option, regenerate_package, reset_package)
from .option_tools import available_options
from .version_management import outdated_options, write_pkg_version
LOGGER = logging.getLogger(__name__)
[docs]
def action_info(cfg, **kwds):
"""Display info on package for debug purpose.
"""
LOGGER.info("package info")
print("current config (after resolution)")
opt_names = kwds['option']
all_opts = False
if not opt_names:
opt_names = cfg.installed_options(return_sorted=True)
all_opts = True
outdated = outdated_options(cfg)
for name in opt_names:
if name in outdated:
print(f"{name}: OUTDATED")
else:
print(name)
print(json.dumps(cfg[name], sort_keys=True, indent=2))
if all_opts:
print("other available options:")
for opt_name in sorted(set(available_options) - set(cfg.installed_options())):
print(" ", opt_name)
[docs]
def action_clean(cfg, **kwds):
"""Clean package of all un necessary files.
"""
del cfg, kwds # unused
LOGGER.info("clean package")
clean()
[docs]
def action_init(cfg, **kwds):
"""Initialize environment for use of pkglts.
"""
if cfg is not None:
LOGGER.warning("Directory is already a pkglts package")
return
init_pkg()
if kwds:
action_add(get_pkg_config(), **kwds)
[docs]
def action_clear(cfg, **kwds):
"""Attempt to free the package from pkglts interactions.
"""
del cfg, kwds # unused
LOGGER.info("clear")
print("TODO")
[docs]
def action_update(cfg, **kwds):
"""Check if a new version of pkglts is available.
"""
del cfg, kwds # unused
LOGGER.info("update")
print("TODO")
[docs]
def action_regenerate(cfg, **kwds):
"""Regenerate all files in the package.
"""
outdated = outdated_options(cfg)
if len(outdated) > 0:
out_fmt = "\n".join(outdated)
LOGGER.warning("Some options are outdated,"
" please upgrade pkglts and/or all the following options:\n"
"%s", out_fmt)
return
clean()
if kwds['option']:
for name in kwds['option']:
LOGGER.info("regenerate '%s'", name)
regenerate_option(cfg, name, overwrite=kwds['overwrite'])
else:
LOGGER.info("regenerate package")
regenerate_package(cfg, overwrite=kwds['overwrite'])
write_pkg_version(cfg)
[docs]
def action_reset(cfg, **kwds):
"""Remove all templated files from the package (do it only if pkg is versioned to avoid troubles).
"""
if not kwds['yes']:
ans = input("You're about to remove all templated files y,[n]? ")
if ans != "y":
LOGGER.info("reset aborted, back to safety ;)")
return
outdated = outdated_options(cfg)
if len(outdated) > 0:
out_fmt = "\n".join(outdated)
LOGGER.warning("Some options are outdated,"
" please upgrade pkglts and/or all the following options:\n"
"%s", out_fmt)
return
clean()
LOGGER.info("rm all templated files from packages")
reset_package(cfg)
write_pkg_version(cfg)
[docs]
def action_add(cfg, **kwds):
"""Add new options in the package.
"""
LOGGER.info("add option")
for name in kwds['option']:
cfg = add_option(name, cfg)
write_pkg_config(cfg)
[docs]
def action_remove(cfg, **kwds):
"""Remove options from the package.
"""
del cfg, kwds
LOGGER.info("remove option")
print("TODO")
[docs]
def action_example(cfg, **kwds):
"""Install example files associated with options.
"""
for name in kwds['option']:
install_example_files(name, cfg)
[docs]
def main():
"""Run CLI evaluation"""
action = dict(
info=action_info,
clean=action_clean,
init=action_init,
clear=action_clear,
update=action_update,
rg=action_regenerate,
add=action_add,
remove=action_remove,
reset=action_reset,
example=action_example
)
# parse argument line
parser = ArgumentParser(description='Package structure manager')
parser.add_argument("-v", "--verbosity", action="count", default=0,
help="increase output verbosity")
subparsers = parser.add_subparsers(dest='subcmd', help='sub-command help')
parser_info = subparsers.add_parser('info', help=action_info.__doc__)
parser_info.add_argument('option', nargs='*',
help="name of option to fetch info")
parser_clean = subparsers.add_parser('clean', help=action_clean.__doc__)
parser_init = subparsers.add_parser('init', help=action_init.__doc__)
parser_init.add_argument('option', nargs='*',
help="name of option to add during init")
parser_clear = subparsers.add_parser('clear', help=action_clear.__doc__)
parser_update = subparsers.add_parser('update', help=action_update.__doc__)
parser_rg = subparsers.add_parser('rg', help=action_regenerate.__doc__)
parser_rg.add_argument('option', nargs='*',
help="name of option to add")
parser_rg.add_argument("--overwrite", action='store_true',
help="Globally overwrite user modified files")
parser_add = subparsers.add_parser('add', help=action_add.__doc__)
parser_add.add_argument('option', nargs='+',
help="name of option to add")
parser_remove = subparsers.add_parser('remove', help=action_remove.__doc__)
parser_remove.add_argument('option', nargs='+',
help="name of option to remove")
parser_reset = subparsers.add_parser('reset', help=action_reset.__doc__)
parser_reset.add_argument("--yes", action='store_true',
help="Force reset without confirmation")
parser_example = subparsers.add_parser('example', help=action_example.__doc__)
parser_example.add_argument('option', nargs='+',
help="name of option which offer example files")
# try to read package config for extra commands
try:
cfg = get_pkg_config()
except FileNotFoundError:
cfg = None
else:
# add option commands
for opt_name in cfg.installed_options():
for parser_tool in available_options[opt_name].tools(cfg):
name, action_tool = parser_tool(subparsers)
action[name] = action_tool
kwds = vars(parser.parse_args())
logging_tools.main(kwds.pop('verbosity'))
# perform action
subcmd = kwds.pop('subcmd')
if cfg is None and subcmd != "init":
LOGGER.error("Directory is not a pkglts package, run pmg init first")
return
action[subcmd](cfg, **kwds)
if __name__ == '__main__':
main()