Fix Enum arguments that accept multiple values

EnumAction was erasing nargs before passing it to the superclass
initializer, which broke handling for arguments with consecutive values.

The help text for --desired-buyer has been updated to reflect that you
actually can specify multiple values with a single declaration now.
This commit is contained in:
Jeremy Saklad 2021-08-13 08:27:23 -05:00
parent 4ef31a9cca
commit cacb985be6
Signed by: Jeremy Saklad
GPG Key ID: 9CA2149583EDBF84
2 changed files with 9 additions and 7 deletions

View File

@ -67,7 +67,7 @@ skeleton_parameters.add_argument(
action=EnumAction,
nargs='+',
type=Buyer,
help="specific buyer that skeleton should be designed for (if declared repeatedly, will choose from among those provided)",
help="specific buyer that skeleton should be designed for (if multiple are specified, will choose from among them)",
dest='desired_buyers'
)

View File

@ -8,7 +8,7 @@ class EnumAction(Action):
# Pop off the type value
enum = kwargs.pop('type', None)
nargs = kwargs.pop('nargs', None)
nargs = kwargs.get('nargs')
# Generate choices from the Enum
kwargs.setdefault('choices', tuple(member.name.lower() for member in enum))
@ -19,12 +19,14 @@ class EnumAction(Action):
self._nargs = nargs
def __call__(self, parser, namespace, values, option_string=None):
if self._nargs is None or self._nargs == '?':
# Convert value back into an Enum
enum = self._enum[values.upper()]
if self._nargs is None or self._nargs == '?':
setattr(namespace, self.dest, enum)
else:
items = getattr(namespace, self.dest, list())
items.append(enum)
# Convert values back into Enums
enums = [self._enum[value.upper()] for value in values]
items = getattr(namespace, self.dest, list()) + enums
setattr(namespace, self.dest, items)