From f175f9d5c91426d5e27818b0c8726c8fbfb40ed3 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Tue, 27 Jan 2026 10:22:16 +0100 Subject: [PATCH] lib.Cmd: Add argument "parent" to __init__() During __init__(), commands have no idea of their parent. This is not a problem as of now, but is easy to fix, and it's architecturally desirable to be prepared just in case, so add the parent argument to the ctor before more commands are added. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/cmds/Cmd.py | 5 +++-- src/python/jw/pkg/cmds/CmdProjects.py | 8 ++++---- .../pkg/cmds/projects/BaseCmdPkgRelations.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdBuild.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdCflags.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdCheck.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdCommands.py | 5 +++-- .../jw/pkg/cmds/projects/CmdCreatePkgConfig.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdExepath.py | 7 ++++--- .../jw/pkg/cmds/projects/CmdGetAuthInfo.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdGetval.py | 5 +++-- .../jw/pkg/cmds/projects/CmdHtdocsDir.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdLdflags.py | 7 ++++--- .../jw/pkg/cmds/projects/CmdLdlibpath.py | 7 ++++--- src/python/jw/pkg/cmds/projects/CmdLibname.py | 5 +++-- .../jw/pkg/cmds/projects/CmdListRepos.py | 7 ++++--- src/python/jw/pkg/cmds/projects/CmdModules.py | 5 +++-- .../jw/pkg/cmds/projects/CmdOsCascade.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdPath.py | 7 ++++--- .../jw/pkg/cmds/projects/CmdPkgConflicts.py | 4 ++-- .../jw/pkg/cmds/projects/CmdPkgProvides.py | 4 ++-- .../jw/pkg/cmds/projects/CmdPkgRequires.py | 4 ++-- src/python/jw/pkg/cmds/projects/CmdPrereq.py | 7 ++++--- src/python/jw/pkg/cmds/projects/CmdProjDir.py | 5 +++-- .../jw/pkg/cmds/projects/CmdPythonpath.py | 7 ++++--- .../jw/pkg/cmds/projects/CmdPythonpathOrig.py | 7 ++++--- .../jw/pkg/cmds/projects/CmdRequiredOsPkg.py | 7 ++++--- src/python/jw/pkg/cmds/projects/CmdSummary.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdTest.py | 5 +++-- src/python/jw/pkg/cmds/projects/CmdTmplDir.py | 5 +++-- src/python/jw/pkg/lib/App.py | 5 ++--- src/python/jw/pkg/lib/Cmd.py | 18 ++++-------------- 32 files changed, 103 insertions(+), 88 deletions(-) diff --git a/src/python/jw/pkg/cmds/Cmd.py b/src/python/jw/pkg/cmds/Cmd.py index cda5668a..1ea7b025 100644 --- a/src/python/jw/pkg/cmds/Cmd.py +++ b/src/python/jw/pkg/cmds/Cmd.py @@ -4,13 +4,14 @@ from __future__ import annotations from argparse import ArgumentParser +from ..App import App from ..lib.Cmd import Cmd as Base from ..lib.Types import LoadTypes class Cmd(Base): # export - def __init__(self, name: str, help: str) -> None: - super().__init__(name, help) + def __init__(self, parent: App|Base, name: str, help: str) -> None: + super().__init__(parent, name, help) def _add_subcommands(self) -> None: self.add_subcommands( diff --git a/src/python/jw/pkg/cmds/CmdProjects.py b/src/python/jw/pkg/cmds/CmdProjects.py index c8d7c57a..d337ed4e 100644 --- a/src/python/jw/pkg/cmds/CmdProjects.py +++ b/src/python/jw/pkg/cmds/CmdProjects.py @@ -1,19 +1,19 @@ # -*- coding: utf-8 -*- -import sys, inspect, re +import sys from argparse import ArgumentParser +from ..App import App from .Cmd import Cmd as CmdBase class CmdProjects(CmdBase): # export - def __init__(self) -> None: - super().__init__('projects', help='Project metadata evaluation for building packages') + def __init__(self, parent: App) -> None: + super().__init__(parent, 'projects', help='Project metadata evaluation for building packages') self._add_subcommands() def add_arguments(self, p: ArgumentParser) -> None: super().add_arguments(p) def _run(self, args): - breakpoint() raise Exception("Running with args", args) diff --git a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py index bdd166b1..1fcc9e1a 100644 --- a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py +++ b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py @@ -5,6 +5,7 @@ from argparse import Namespace, ArgumentParser from ...lib.log import * from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class BaseCmdPkgRelations(Cmd): @@ -76,8 +77,8 @@ class BaseCmdPkgRelations(Cmd): def print_pkg_relations(self, rel_type, args_): print(self.pkg_relations(rel_type, args_)) - def __init__(self, relation: str, help: str) -> None: - super().__init__('pkg-' + relation, help=help) + def __init__(self, parent: CmdProjects, relation: str, help: str) -> None: + super().__init__(parent, 'pkg-' + relation, help=help) self.relation = relation def add_arguments(self, parser: ArgumentParser) -> None: diff --git a/src/python/jw/pkg/cmds/projects/CmdBuild.py b/src/python/jw/pkg/cmds/projects/CmdBuild.py index dcd74033..31fb3847 100644 --- a/src/python/jw/pkg/cmds/projects/CmdBuild.py +++ b/src/python/jw/pkg/cmds/projects/CmdBuild.py @@ -6,12 +6,13 @@ from functools import lru_cache from ...lib.log import * from ..Cmd import Cmd +from ..CmdProjects import CmdProjects from ...App import Scope class CmdBuild(Cmd): # export - def __init__(self) -> None: - super().__init__('build', help='janware software project build tool') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'build', help='janware software project build tool') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdCflags.py b/src/python/jw/pkg/cmds/projects/CmdCflags.py index 67e9ec7d..9f5c47c2 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCflags.py +++ b/src/python/jw/pkg/cmds/projects/CmdCflags.py @@ -3,12 +3,13 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects from ...App import Scope class CmdCflags(Cmd): # export - def __init__(self) -> None: - super().__init__('cflags', help='cflags') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'cflags', help='cflags') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdCheck.py b/src/python/jw/pkg/cmds/projects/CmdCheck.py index c9082aa1..0a40df8f 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCheck.py +++ b/src/python/jw/pkg/cmds/projects/CmdCheck.py @@ -4,11 +4,12 @@ from argparse import Namespace, ArgumentParser from ...lib.log import * from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdCheck(Cmd): # export - def __init__(self) -> None: - super().__init__('check', help='Check for circular dependencies between given modules') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'check', help='Check for circular dependencies between given modules') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdCommands.py b/src/python/jw/pkg/cmds/projects/CmdCommands.py index fe655b91..0f8f59c9 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCommands.py +++ b/src/python/jw/pkg/cmds/projects/CmdCommands.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdCommands(Cmd): # export - def __init__(self) -> None: - super().__init__('commands', help='List available commands') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'commands', help='List available commands') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdCreatePkgConfig.py b/src/python/jw/pkg/cmds/projects/CmdCreatePkgConfig.py index a60d0a6c..e67ba359 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCreatePkgConfig.py +++ b/src/python/jw/pkg/cmds/projects/CmdCreatePkgConfig.py @@ -4,11 +4,12 @@ import textwrap from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdCreatePkgConfig(Cmd): # export - def __init__(self) -> None: - super().__init__('create-pkg-config', help='Generate a pkg-config file for a module') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'create-pkg-config', help='Generate a pkg-config file for a module') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdExepath.py b/src/python/jw/pkg/cmds/projects/CmdExepath.py index e074975d..107c2219 100644 --- a/src/python/jw/pkg/cmds/projects/CmdExepath.py +++ b/src/python/jw/pkg/cmds/projects/CmdExepath.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdExepath(Cmd): # export - def __init__(self) -> None: - super().__init__('exepath', help='exepath') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'exepath', help='exepath') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py index cc96b59a..7223921d 100644 --- a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py +++ b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py @@ -7,11 +7,12 @@ from urllib.parse import urlparse from ...lib.log import * from ...lib.util import run_cmd from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdGetAuthInfo(Cmd): # export - def __init__(self) -> None: - super().__init__('get-auth-info', help='Try to retrieve authentication information from the source tree') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'get-auth-info', help='Try to retrieve authentication information from the source tree') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdGetval.py b/src/python/jw/pkg/cmds/projects/CmdGetval.py index 1e6956bd..238994b6 100644 --- a/src/python/jw/pkg/cmds/projects/CmdGetval.py +++ b/src/python/jw/pkg/cmds/projects/CmdGetval.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdGetval(Cmd): # export - def __init__(self) -> None: - super().__init__('getval', help='Get value from project config') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'getval', help='Get value from project config') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py b/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py index 9711d907..62818002 100644 --- a/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdHtdocsDir(Cmd): # export - def __init__(self) -> None: - super().__init__('htdocs-dir', help='Print source directory containing document root of a given module') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'htdocs-dir', help='Print source directory containing document root of a given module') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdLdflags.py b/src/python/jw/pkg/cmds/projects/CmdLdflags.py index 3a59c21e..73875ff1 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLdflags.py +++ b/src/python/jw/pkg/cmds/projects/CmdLdflags.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdLdflags(Cmd): # export - def __init__(self) -> None: - super().__init__('ldflags', help='ldflags') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'ldflags', help='ldflags') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py b/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py index 1f3031cf..876e1372 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py +++ b/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdLdlibpath(Cmd): # export - def __init__(self) -> None: - super().__init__('ldlibpath', help='ldlibpath') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'ldlibpath', help='ldlibpath') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdLibname.py b/src/python/jw/pkg/cmds/projects/CmdLibname.py index 632a5179..46818f18 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLibname.py +++ b/src/python/jw/pkg/cmds/projects/CmdLibname.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdLibname(Cmd): # export - def __init__(self) -> None: - super().__init__('libname', help='libname') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'libname', help='libname') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdListRepos.py b/src/python/jw/pkg/cmds/projects/CmdListRepos.py index 3efade68..08d72102 100644 --- a/src/python/jw/pkg/cmds/projects/CmdListRepos.py +++ b/src/python/jw/pkg/cmds/projects/CmdListRepos.py @@ -3,13 +3,14 @@ import re, os from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...lib.util import get_username, get_password, run_curl +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdListRepos(Cmd): # export - def __init__(self) -> None: - super().__init__('list-repos', help='Query a remote GIT server for repositories') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'list-repos', help='Query a remote GIT server for repositories') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdModules.py b/src/python/jw/pkg/cmds/projects/CmdModules.py index e701a6cf..a6acab40 100644 --- a/src/python/jw/pkg/cmds/projects/CmdModules.py +++ b/src/python/jw/pkg/cmds/projects/CmdModules.py @@ -4,11 +4,12 @@ from argparse import Namespace, ArgumentParser from ...lib.log import * from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdModules(Cmd): # export - def __init__(self) -> None: - super().__init__('modules', help='Query existing janware packages') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'modules', help='Query existing janware packages') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdOsCascade.py b/src/python/jw/pkg/cmds/projects/CmdOsCascade.py index 0aabe2cf..d21b756f 100644 --- a/src/python/jw/pkg/cmds/projects/CmdOsCascade.py +++ b/src/python/jw/pkg/cmds/projects/CmdOsCascade.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdOsCascade(Cmd): # export - def __init__(self) -> None: - super().__init__('os-cascade', help='Print project.conf\'s OS configuration precedence of machine this script runs on') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'os-cascade', help='Print project.conf\'s OS configuration precedence of machine this script runs on') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdPath.py b/src/python/jw/pkg/cmds/projects/CmdPath.py index a09da9d5..4b41bd2b 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPath.py +++ b/src/python/jw/pkg/cmds/projects/CmdPath.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdPath(Cmd): # export - def __init__(self) -> None: - super().__init__('path', help='path') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'path', help='path') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py b/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py index 4f8581ce..b5e18998 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py @@ -6,5 +6,5 @@ from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base class CmdPkgConflicts(Base): # export - def __init__(self) -> None: - super().__init__('conflicts', help='Print packages conflicting with a given package') + def __init__(self, parent: Base) -> None: + super().__init__(parent, 'conflicts', help='Print packages conflicting with a given package') diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py b/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py index 6cb38db3..091f9fd8 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py @@ -6,5 +6,5 @@ from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base class CmdPkgProvides(Base): # export - def __init__(self) -> None: - super().__init__('provides', help='Print packages and capabilities provided by a given package') + def __init__(self, parent: Base) -> None: + super().__init__(parent, 'provides', help='Print packages and capabilities provided by a given package') diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py b/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py index d7cf9012..2e766286 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py @@ -6,5 +6,5 @@ from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base class CmdPkgRequires(Base): # export - def __init__(self) -> None: - super().__init__('requires', help='Print packages required for a given package') + def __init__(self, parent: Base) -> None: + super().__init__(parent, 'requires', help='Print packages required for a given package') diff --git a/src/python/jw/pkg/cmds/projects/CmdPrereq.py b/src/python/jw/pkg/cmds/projects/CmdPrereq.py index dcc1e349..ab28364a 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPrereq.py +++ b/src/python/jw/pkg/cmds/projects/CmdPrereq.py @@ -2,14 +2,15 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects # TODO: seems at least partly redundant to CmdPkgRequires / print_pkg_relations class CmdPrereq(Cmd): # export - def __init__(self) -> None: - super().__init__('prereq', help='path') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'prereq', help='path') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdProjDir.py b/src/python/jw/pkg/cmds/projects/CmdProjDir.py index 11a30f6e..32f653b5 100644 --- a/src/python/jw/pkg/cmds/projects/CmdProjDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdProjDir.py @@ -4,11 +4,12 @@ from argparse import Namespace, ArgumentParser from ...lib.log import * from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdProjDir(Cmd): # export - def __init__(self) -> None: - super().__init__('proj-dir', help='Print directory of a given package') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'proj-dir', help='Print directory of a given package') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdPythonpath.py b/src/python/jw/pkg/cmds/projects/CmdPythonpath.py index bed466d6..c2cbeff0 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPythonpath.py +++ b/src/python/jw/pkg/cmds/projects/CmdPythonpath.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdPythonpath(Cmd): # export - def __init__(self) -> None: - super().__init__('pythonpath', help='Generate PYTHONPATH for given modules') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'pythonpath', help='Generate PYTHONPATH for given modules') def add_arguments(self, p: ArgumentParser) -> None: super().add_arguments(p) diff --git a/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py b/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py index fdeb470d..61891961 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py +++ b/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py @@ -2,13 +2,14 @@ from argparse import Namespace, ArgumentParser -from ..Cmd import Cmd from ...App import Scope +from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdPythonpathOrig(Cmd): # export - def __init__(self) -> None: - super().__init__('pythonpath_orig', help='pythonpath') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'pythonpath_orig', help='pythonpath') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py b/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py index 297b8b45..996d1d8e 100644 --- a/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py +++ b/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py @@ -2,15 +2,16 @@ from argparse import Namespace, ArgumentParser +from ...App import Scope from ...lib.log import * from ..Cmd import Cmd -from ...App import Scope +from ..CmdProjects import CmdProjects # TODO: seems at least partly redundant to CmdPkgRequires / print_pkg_relations class CmdRequiredOsPkg(Cmd): # export - def __init__(self) -> None: - super().__init__('required-os-pkg', help='List distribution packages required for a package') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'required-os-pkg', help='List distribution packages required for a package') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdSummary.py b/src/python/jw/pkg/cmds/projects/CmdSummary.py index e998a304..72e114a5 100644 --- a/src/python/jw/pkg/cmds/projects/CmdSummary.py +++ b/src/python/jw/pkg/cmds/projects/CmdSummary.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdSummary(Cmd): # export - def __init__(self) -> None: - super().__init__('summary', help='Print summary description of given modules') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'summary', help='Print summary description of given modules') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdTest.py b/src/python/jw/pkg/cmds/projects/CmdTest.py index d66df19a..4c5fac6d 100644 --- a/src/python/jw/pkg/cmds/projects/CmdTest.py +++ b/src/python/jw/pkg/cmds/projects/CmdTest.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdTest(Cmd): # export - def __init__(self) -> None: - super().__init__('test', help='Test') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'test', help='Test') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/cmds/projects/CmdTmplDir.py b/src/python/jw/pkg/cmds/projects/CmdTmplDir.py index 4ae35891..d684f65e 100644 --- a/src/python/jw/pkg/cmds/projects/CmdTmplDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdTmplDir.py @@ -3,11 +3,12 @@ from argparse import Namespace, ArgumentParser from ..Cmd import Cmd +from ..CmdProjects import CmdProjects class CmdTmplDir(Cmd): # export - def __init__(self) -> None: - super().__init__('tmpl-dir', help='Print directory containing templates of a given module') + def __init__(self, parent: CmdProjects) -> None: + super().__init__(parent, 'tmpl-dir', help='Print directory containing templates of a given module') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) diff --git a/src/python/jw/pkg/lib/App.py b/src/python/jw/pkg/lib/App.py index a1cb1688..8894efb8 100644 --- a/src/python/jw/pkg/lib/App.py +++ b/src/python/jw/pkg/lib/App.py @@ -65,7 +65,6 @@ class App: # export self.__eloop = asyncio.get_event_loop() self.__own_eloop = True - self.__cmds: list[Cmd] = [] self.__parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=description, add_help=False) self._add_arguments(self.__parser) @@ -78,7 +77,7 @@ class App: # export cmd_classes = LoadTypes(modules if modules else ['__main__'], type_name_filter=name_filter, type_filter=[Cmd]) add_all_parsers = '-h' in sys.argv or '--help' in sys.argv - add_cmds_to_parser(self, self.__parser, [cmd_class() for cmd_class in cmd_classes], all=add_all_parsers) + add_cmds_to_parser(self, self.__parser, [cmd_class(self) for cmd_class in cmd_classes], all=add_all_parsers) # -- Add help only now, wouldn't want to have parse_known_args() exit on --help with subcommands missing self.__parser.add_argument('-h', '--help', action='help', help='Show this help message and exit') @@ -131,7 +130,7 @@ class App: # export # Run sub-command. Overwrite if you want to do anything before or after async def _run(self, args: argparse.Namespace) -> None: - return await self.__args.func(args) + return await self.args.func(args) @property def args(self) -> argparse.Namespace: diff --git a/src/python/jw/pkg/lib/Cmd.py b/src/python/jw/pkg/lib/Cmd.py index 49c1e73f..4982092b 100644 --- a/src/python/jw/pkg/lib/Cmd.py +++ b/src/python/jw/pkg/lib/Cmd.py @@ -10,15 +10,12 @@ from argparse import ArgumentParser, _SubParsersAction from .log import * from .Types import Types -# full blown example of one level of nested subcommands -# git -C project remote -v show -n myremote - class Cmd(abc.ABC): # export - def __init__(self, name: str, help: str) -> None: + def __init__(self, parent: App|Cmd, name: str, help: str) -> None: from . import App + self.__parent: App|Cmd|None = parent self.__app: App|None = None - self.__parent: App|Cmd|None = None self.__name = name self.__help = help self.__children: list[Cmd] = [] @@ -37,7 +34,7 @@ class Cmd(abc.ABC): # export return self.__parent @property - def app(self): + def app(self) -> App: from .App import App if self.__app is None: parent = self.__parent @@ -85,8 +82,7 @@ class Cmd(abc.ABC): # export if cmd_class in self.__child_classes: continue self.__child_classes.append(cmd_class) - cmd = cmd_class() - cmd.set_parent(self) + cmd = cmd_class(self) self.__children.append(cmd) assert len(self.__children) == len(self.__child_classes) except Exception as e: @@ -99,9 +95,3 @@ class Cmd(abc.ABC): # export # Will be called from App base class constructor and set up the parser hierarchy def add_arguments(self, parser: ArgumentParser) -> None: pass - - def conf_value(self, path, default=None): - ret = None if self.app is None else self.app.conf_value(path, default) - if ret is None and default is not None: - return default - return ret