from __future__ import annotations import re from typing import TYPE_CHECKING, override from .Cmd import Cmd, Parent from .lib.pkg_relations import VersionSyntax from .lib.pkg_relations import pkg_relations as pkg_relations_list if TYPE_CHECKING: from argparse import ArgumentParser, Namespace class BaseCmdPkgRelations(Cmd): arg_sep = r'[,\s|]' def pkg_relations(self, rel_type: str, args: Namespace) -> str: return args.delimiter.join( pkg_relations_list( self.app, rel_type = rel_type, flavours = re.split(self.arg_sep, args.flavours), seed_pkgs = args.modules, subsections = ( None if args.subsections is None else re.split(self.arg_sep, args.subsections) ), no_subpackages = args.no_subpackages, dont_strip_revision = args.dont_strip_revision, expand_semver_revision_range = args.expand_semver_revision_range, syntax = VersionSyntax[args.syntax.replace('-', '_')], recursive = args.recursive, dont_expand_version_macros = args.dont_expand_version_macros, ignore = set(re.split(self.arg_sep, args.ignore)), quote = args.quote, skip_excluded = args.skip_excluded, hide_self = args.hide_self, hide_jw_pkg = args.hide_jw_pkg, ) ) def print_pkg_relations(self, rel_type: str, args: Namespace) -> None: print(self.pkg_relations(rel_type, args)) def __init__(self, parent: Parent, relation: str, help: str) -> None: super().__init__(parent, 'pkg-' + relation, help = help) self.relation = relation @override def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) parser.add_argument( '-S', '--subsections', nargs = '?', default = None, help = 'Subsections to consider, separated by comma or whitespace', ) parser.add_argument( '-d', '--delimiter', nargs = '?', default = ', ', help = 'Output words delimiter' ) parser.add_argument( 'flavours', help = 'Dependency flavours (run, build, devel, release), ' 'separated by comma or whitespace' ) parser.add_argument('modules', nargs = '*', help = 'Modules') parser.add_argument( '-p', '--no-subpackages', action = 'store_true', default = False, help = 'Cut -run and -devel from package names', ) parser.add_argument( '--dont-strip-revision', action = 'store_true', default = False, help = 'Always treat VERSION macro as VERSION-REVISION', ) parser.add_argument( '--expand-semver-revision-range', action = 'store_true', default = False, help = 'Always treat =VERSION macro as >= VERSION-0 and < (VERSION+1)-0', ) parser.add_argument( '--syntax', choices = ['semver', 'debian', 'names-only'], default = 'semver', help = 'Output syntax', ) parser.add_argument( '--recursive', action = 'store_true', default = False, help = 'Find dependencies recursively', ) parser.add_argument( '--dont-expand-version-macros', action = 'store_true', default = False, help = "Don't expand VERSION and REVISION macros", ) parser.add_argument( '--ignore', nargs = '?', default = '', help = 'Packages that should be ignored together with their dependencies', ) parser.add_argument( '--skip-excluded', action = 'store_true', default = False, help = ( "Don't consider or output modules matching the os cascade in their " '[build].exclude config' ), ) parser.add_argument( '--hide-self', action = 'store_true', default = False, help = "Don't include projects listed in in the output", ) parser.add_argument( '--hide-jw-pkg', action = 'store_true', default = False, help = "Don't include packages from requires.jw in the output", ) parser.add_argument( '--quote', action = 'store_true', default = False, help = 'Put double quotes around each listed dependency', ) @override async def _run(self, args: Namespace) -> None: return self.print_pkg_relations(self.relation, args) __all__ = ['Parent', 'BaseCmdPkgRelations']