Skip to content

Commit

Permalink
fix shortcuts maker
Browse files Browse the repository at this point in the history
include defined aliases in `used` dict
  • Loading branch information
vanyakosmos committed Oct 20, 2019
1 parent 8ad2b71 commit d9853ce
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 17 deletions.
20 changes: 12 additions & 8 deletions argser/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def __init__(
self.extra = kwargs

def __str__(self):
names = ', '.join(self.names())
names = ', '.join(self.keys())
type_name = getattr(self.type, '__name__', None)
return f"Arg({names}, type={type_name}, default={self.default!r})"

Expand All @@ -69,8 +69,12 @@ def metavar(self):
if self.dest:
return self.dest[0].upper()

def names(self, prefix=None):
names = [self.dest, *self.aliases]
@property
def names(self):
return [self.dest, *self.aliases]

def keys(self, prefix=None):
names = self.names
if self.replace_underscores:
names = ['-'.join(n.split('_')) for n in names]
if prefix:
Expand Down Expand Up @@ -100,15 +104,15 @@ def params(self, exclude=(), **kwargs):
def inject_bool(self, parser: ArgumentParser):
if self.bool_flag and self.nargs not in ('*', '+'):
params = self.params(exclude=('type', 'nargs', 'metavar', 'action'))
action = parser.add_argument(*self.names(), action='store_true', **params)
action = parser.add_argument(*self.keys(), action='store_true', **params)
parser.set_defaults(**{self.dest: self.default})
params['default'] = SUPPRESS # don't print help message for second flag
if 'help' in params:
del params['help']
parser.add_argument(*self.names(prefix='no-'), action='store_false', **params)
parser.add_argument(*self.keys(prefix='no-'), action='store_false', **params)
return action
params = self.params(type=str2bool)
return parser.add_argument(*self.names(), **params)
return parser.add_argument(*self.keys(), **params)

def inject(self, parser: ArgumentParser):
if self.type is bool:
Expand All @@ -122,7 +126,7 @@ def inject(self, parser: ArgumentParser):
params.pop('type')
if action in ('store_true', 'store_false', 'count', 'version') and 'metavar' in params:
params.pop('metavar')
action = parser.add_argument(*self.names(), **params)
action = parser.add_argument(*self.keys(), **params)
if callable(self.completer):
action.completer = self.completer
return action
Expand All @@ -143,5 +147,5 @@ def params(self, exclude=(), **kwargs):
exclude += ('dest',)
return super().params(exclude=exclude, **kwargs)

def names(self, prefix=None):
def keys(self, prefix=None):
return [self.dest]
20 changes: 12 additions & 8 deletions argser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,24 +141,28 @@ def _set_values(parser_name: str, res: Args, namespace: Namespace, args: List[Ar
logger.log(VERBOSE, f'setting complete: {res}')


def _make_shortcut(name: str):
"""aaa -> a, aaa_bbb -> ab"""
parts = name.split('_')
return ''.join([p[0] for p in parts if len(p) > 0])


def _make_shortcuts(args: List[Arg]):
"""
Add shortcuts to arguments without defined aliases.
todo: deal with duplicated names
"""
used = defaultdict(int)
used = defaultdict(lambda: False)
for arg in args:
used[arg.dest] += 1
for n in arg.names:
used[n] = True
for arg in args:
if arg.aliases != ():
continue
# aaa -> a, aaa_bbb -> ab
a = ''.join(map(lambda e: e[0], arg.dest.split('_')))
if a == arg.dest:
continue
used[a] += 1
if used[a] > 1:
a = _make_shortcut(arg.dest)
if used[a] > 0:
continue
used[a] = True
arg.aliases = (a,)


Expand Down
6 changes: 5 additions & 1 deletion tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,13 @@ def test_make_shortcuts():
ab_cd = Arg(dest='ab_cd', type=str)
ab_cde = Arg(dest='ab_cde', type=str)
bcd = PosArg(dest='bcd', type=str, aliases=('foo',))
f1 = Arg(dest='f1', aliases=('f3',), type=str)
f2_3 = Arg(dest='f2_3', type=str)
# sub
aaa = Arg(dest='aaa', type=str)
ab_cd2 = Arg(dest='ab_cd', type=str)

_make_shortcuts_sub_wise([a, aa, bc, ab_cd, ab_cde, bcd], {'sub': (None, [aaa, ab_cd2], {})})
_make_shortcuts_sub_wise([a, aa, bc, ab_cd, ab_cde, bcd, f1, f2_3], {'sub': (None, [aaa, ab_cd2], {})})
assert a.dest == 'a' and a.aliases == () # already short name
assert aa.dest == 'aa' and aa.aliases == () # name 'a' already exists
assert bc.dest == 'bc' and bc.aliases == ('b',)
Expand All @@ -114,6 +116,8 @@ def test_make_shortcuts():
assert bcd.dest == 'bcd' and bcd.aliases == ('foo',) # alias was already defined and override is false
assert aaa.dest == 'aaa' and aaa.aliases == ('a',)
assert ab_cd2.dest == 'ab_cd' and ab_cd2.aliases == ('ac',)
assert f1.aliases == ('f3',)
assert f2_3.aliases == ()


def test_parse_str():
Expand Down

0 comments on commit d9853ce

Please sign in to comment.