Make certain long flag aliases editable

This commit is contained in:
lash 2022-02-21 08:12:24 +00:00
parent b5a01b28ac
commit 68a01565c9
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
4 changed files with 37 additions and 9 deletions

View File

@ -1,3 +1,5 @@
- 0.0.20
* Add edit option for some long flag aliases of short flags: -a, -e, -s and -y
- 0.0.19 - 0.0.19
* Passphrase file option to unlock keyfile for CLI tooling * Passphrase file option to unlock keyfile for CLI tooling
- 0.0.18 - 0.0.18

View File

@ -5,6 +5,7 @@ import enum
import os import os
import select import select
import sys import sys
import re
# local imports # local imports
from .base import ( from .base import (
@ -30,16 +31,31 @@ def stdin_arg():
return v.rstrip() return v.rstrip()
return None return None
_default_long_args = {
'-a': '--recipient',
'-e': '--executable-address',
'-s': '--send',
'-y': '--key-file',
}
_default_dest = {
'-a': 'recipient',
'-e': 'executable_address',
}
class ArgumentParser(argparse.ArgumentParser): class ArgumentParser(argparse.ArgumentParser):
"""Extends the standard library argument parser to construct arguments based on configuration flags. """Extends the standard library argument parser to construct arguments based on configuration flags.
The extended class is set up to facilitate piping of single positional arguments via stdin. For this reason, positional arguments should be added using the locally defined add_positional method instead of add_argument. The extended class is set up to facilitate piping of single positional arguments via stdin. For this reason, positional arguments should be added using the locally defined add_positional method instead of add_argument.
Long flag aliases for short flags are editable using the arg_long argument. Editing a non-existent short flag will produce no error and have no effect. Adding a long flag for a short flag that does not have an alias will also not have effect.
Calls chainlib.cli.args.ArgumentParser.process_flags with arg_flags and env arguments, see the method's documentation for further details. Calls chainlib.cli.args.ArgumentParser.process_flags with arg_flags and env arguments, see the method's documentation for further details.
:param arg_flags: Argument flag bit vector to generate configuration values for. :param arg_flags: Argument flag bit vector to generate configuration values for.
:type arg_flags: chainlib.cli.Flag :type arg_flags: chainlib.cli.Flag
:param arg_long: Change long flag alias for given short flags. Example value: {'-a': '--addr', '-e': '--contract'}
:type arg_long: dict
:param env: Environment variables :param env: Environment variables
:type env: dict :type env: dict
:param usage: Usage string, passed to parent :param usage: Usage string, passed to parent
@ -50,11 +66,23 @@ class ArgumentParser(argparse.ArgumentParser):
:type epilog: str :type epilog: str
""" """
def __init__(self, arg_flags=0x0f, env=os.environ, usage=None, description=None, epilog=None, *args, **kwargs): def __init__(self, arg_flags=0x0f, arg_long={}, env=os.environ, usage=None, description=None, epilog=None, *args, **kwargs):
super(ArgumentParser, self).__init__(usage=usage, description=description, epilog=epilog, formatter_class=argparse.RawDescriptionHelpFormatter, *args, **kwargs) super(ArgumentParser, self).__init__(usage=usage, description=description, epilog=epilog, formatter_class=argparse.RawDescriptionHelpFormatter, *args, **kwargs)
self.process_flags(arg_flags, env)
self.pos_args = [] self.pos_args = []
self.long_args = _default_long_args
self.arg_dest = _default_dest
re_long = r'^--[a-z\-]+$'
for k in arg_long.keys():
if re.match(re_long, arg_long[k]) == None:
raise ValueError('invalid long arg {}'.format(arg_long[k]))
self.long_args[k] = arg_long[k]
dest = arg_long[k][2:]
dest = dest.replace('-', '_')
self.arg_dest[k] = dest
self.process_flags(arg_flags, env)
def add_positional(self, name, type=str, help=None, append=False, required=True): def add_positional(self, name, type=str, help=None, append=False, required=True):
@ -96,7 +124,6 @@ class ArgumentParser(argparse.ArgumentParser):
for arg in self.pos_args: for arg in self.pos_args:
if arg[3]: if arg[3]:
if arg[4]: if arg[4]:
logg.debug('argumen')
self.add_argument(arg[0], nargs='+', type=arg[1], help=arg[2]) self.add_argument(arg[0], nargs='+', type=arg[1], help=arg[2])
else: else:
self.add_argument(arg[0], type=arg[1], help=arg[2]) self.add_argument(arg[0], type=arg[1], help=arg[2])
@ -165,10 +192,10 @@ class ArgumentParser(argparse.ArgumentParser):
if arg_flags & Flag.SEQ: if arg_flags & Flag.SEQ:
self.add_argument('--seq', action='store_true', help='Use sequential rpc ids') self.add_argument('--seq', action='store_true', help='Use sequential rpc ids')
if arg_flags & Flag.KEY_FILE: if arg_flags & Flag.KEY_FILE:
self.add_argument('-y', '--key-file', dest='y', type=str, help='Keystore file to use for signing or address') self.add_argument('-y', self.long_args['-y'], dest='y', type=str, help='Keystore file to use for signing or address')
self.add_argument('--passphrase-file', dest='passphrase_file', type=str, help='File containing passphrase for keystore') self.add_argument('--passphrase-file', dest='passphrase_file', type=str, help='File containing passphrase for keystore')
if arg_flags & Flag.SEND: if arg_flags & Flag.SEND:
self.add_argument('-s', '--send', dest='s', action='store_true', help='Send to network') self.add_argument('-s', self.long_args['-s'], dest='s', action='store_true', help='Send to network')
if arg_flags & Flag.RAW: if arg_flags & Flag.RAW:
self.add_argument('--raw', action='store_true', help='Do not decode output') self.add_argument('--raw', action='store_true', help='Do not decode output')
if arg_flags & (Flag.SIGN | Flag.NONCE): if arg_flags & (Flag.SIGN | Flag.NONCE):
@ -179,6 +206,6 @@ class ArgumentParser(argparse.ArgumentParser):
if arg_flags & argflag_std_target == 0: if arg_flags & argflag_std_target == 0:
arg_flags |= Flag.WALLET arg_flags |= Flag.WALLET
if arg_flags & Flag.EXEC: if arg_flags & Flag.EXEC:
self.add_argument('-e', '--exectuable-address', dest='executable_address', type=str, help='contract address') self.add_argument('-e', self.long_args['-e'], dest=self.arg_dest['-e'], type=str, help='contract address')
if arg_flags & Flag.WALLET: if arg_flags & Flag.WALLET:
self.add_argument('-a', '--recipient', dest='recipient', type=str, help='recipient address') self.add_argument('-a', self.long_args['-a'], dest=self.arg_dest['-a'], type=str, help='recipient address')

View File

@ -2,7 +2,6 @@
import logging import logging
import os import os
import sys import sys
import re
import stat import stat
# external imports # external imports

View File

@ -3,7 +3,7 @@ name=chainlib
license=WTFPL2 license=WTFPL2
author_email=dev@holbrook.no author_email=dev@holbrook.no
description=Generic blockchain access library and tooling description=Generic blockchain access library and tooling
version=0.0.19 version=0.0.20
url=https://gitlab.com/chaintools/chainlib url=https://gitlab.com/chaintools/chainlib
author=Louis Holbrook author=Louis Holbrook