jw.pkg.App: Derive from jw.pkg.lib.App

Derive jw.pkg.App from jw.pkg.lib.App. App.run() dissolves as follows:

  - Its sub-command invocation logic is left to the base class
  - parser.add_arguments() are moved into self._add_arguments()
  - So is handling of early-parsed arguments
  - async def _run() is reimplemented to set some member variables

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-01-21 09:56:00 +01:00
commit e39047e0dd

View file

@ -5,6 +5,9 @@
import os, sys, argparse, pwd, re
from .lib.App import App as Base
from .cmds.build import *
# meaning of pkg.requires.xxx variables
# build: needs to be built and installed before this can be built
# devel: needs to be installed before this-devel can be installed, i.e. before _other_ packages can be built against this
@ -44,9 +47,10 @@ class ResultCache(object):
# ----------------------------------------------------------------- class App
class App(object):
class App(Base):
def __init__(self):
super().__init__("jw-pkg swiss army knife", modules=["jw.pkg.cmds.build"])
self.global_args = []
self.opt_os = None
@ -58,7 +62,36 @@ class App(object):
self.opt_debug = False
self.res_cache = ResultCache()
self.topdir = None
self.projs_root = os.path.expanduser("~") + '/local/src/jw.dev/proj'
# -- defaults
self.projs_root = pwd.getpwuid(os.getuid()).pw_dir + "/local/src/jw.dev/proj"
def _add_arguments(self, parser):
super()._add_arguments(parser)
parser.add_argument('-d', '--debug', action='store_true',
default=False, help='Output debug information to stderr')
parser.add_argument('-t', '--topdir', nargs=1, default = [], help='Project Path')
parser.add_argument('-p', '--prefix', nargs=1, default = [ self.projs_root ],
help='Parent directory of project source directories')
parser.add_argument('-O', '--os', default = None, help='Target operating system')
async def _run(self, args: argparse.Namespace) -> None:
self.opt_debug = args.debug
if len(args.os):
self.opt_os = args.os[0]
if args.prefix is not None:
self.projs_root = args.prefix
self.debug("projs_root = ", self.projs_root)
self.topdir = args.topdir
if self.topdir is not None:
self.top_name = self.res_cache.run(self.read_value, [self.topdir + '/make/project.conf', 'build', 'name'])
if not self.top_name:
self.top_name = re.sub('-[0-9.-]*$', '', os.path.basename(os.path.realpath(self.topdir)))
return await super()._run(args)
def debug(self, *objs):
if self.opt_debug:
@ -414,64 +447,3 @@ class App(object):
return last
unvisited.remove(module)
temp.remove(module)
# -------------------------------------------------------------------- here we go
def run(self):
skip = 0
for a in sys.argv[1::]:
self.global_args.append(a)
if a in [ '-p', '--prefix', '-t', '--topdir', '-O', '--os' ]:
skip = 1
continue
if skip > 0:
skip = skip -1
continue
if a[0] != '-':
break
# -- defaults
self.projs_root = pwd.getpwuid(os.getuid()).pw_dir + "/local/src/jw.dev/proj"
parser = argparse.ArgumentParser(description='Project metadata evaluation')
parser.add_argument('-d', '--debug', action='store_true',
default=False, help='Output debug information to stderr')
parser.add_argument('-t', '--topdir', nargs=1, default = [], help='Project Path')
parser.add_argument('-p', '--prefix', nargs=1, default = [ self.projs_root ],
help='Parent directory of project source directories')
parser.add_argument('-O', '--os', nargs=1, default = [], help='Target operating system')
parser.add_argument('cmd', default='', help=f'Command, run "{sys.argv[0]} commands" for a list of supported commands')
parser.add_argument('arg', nargs='*', help='Command arguments')
args = parser.parse_args(self.global_args)
self.opt_debug = args.debug
if len(args.os):
self.opt_os = args.os[0]
self.debug("----------------------------------------- running ", ' '.join(sys.argv))
self.projs_root = args.prefix[0]
self.debug("projs_root = ", self.projs_root)
if len(args.topdir):
self.topdir = args.topdir[0]
if self.topdir:
self.top_name = self.res_cache.run(self.read_value, [self.topdir + '/make/project.conf', 'build', 'name'])
if not self.top_name:
self.top_name = re.sub('-[0-9.-]*$', '', os.path.basename(os.path.realpath(self.topdir)))
import importlib
cmd_name = args.cmd.replace('-', '_')
cc_cmd_name = 'Cmd' + ''.join(x.capitalize() for x in cmd_name.lower().split("_"))
module = importlib.import_module('jw.pkg.build.cmds.' + cc_cmd_name)
cmd = getattr(module, cc_cmd_name)()
cmd.app = self
subparser = argparse.ArgumentParser(description=cmd_name)
cmd.add_arguments(subparser)
args = subparser.parse_args(sys.argv[(len(self.global_args) + 1)::])
try:
return cmd.run(args)
except Exception as e:
self.err('Failed to run >{}<: {}'.format(' '.join(sys.argv), e))
raise
sys.exit(1)