diff --git a/docsrc/arguments.rst b/docsrc/arguments.rst index 9f41b31..f946f47 100644 --- a/docsrc/arguments.rst +++ b/docsrc/arguments.rst @@ -86,6 +86,6 @@ The ``choices`` property can be used to restrict an argument to a set of choices .. code-block:: none - Usage: script.lua [-h] + Usage: script.lua [-h] {north,south,east,west} Error: argument 'direction' must be one of 'north', 'south', 'east', 'west' diff --git a/spec/help_spec.lua b/spec/help_spec.lua index 5f0db13..07e1226 100644 --- a/spec/help_spec.lua +++ b/spec/help_spec.lua @@ -86,6 +86,34 @@ Options: --config ]], parser:get_help()) end) + it("creates correct help message for arguments with choices", function() + local parser = Parser "foo" + parser:argument "move" + :choices {"rock", "paper", "scissors"} + + assert.equal([[ +Usage: foo [-h] {rock,paper,scissors} + +Arguments: + {rock,paper,scissors} + +Options: + -h, --help Show this help message and exit.]], parser:get_help()) + end) + + it("creates correct help message for options with argument choices", function() + local parser = Parser "foo" + parser:option "--format" + :choices {"short", "medium", "full"} + + assert.equal([[ +Usage: foo [-h] [--format {short,medium,full}] + +Options: + -h, --help Show this help message and exit. + --format {short,medium,full}]], parser:get_help()) + end) + it("adds margin for multiline descriptions", function() local parser = Parser "foo" parser:flag "-v" diff --git a/spec/usage_spec.lua b/spec/usage_spec.lua index 072980d..3bb881e 100644 --- a/spec/usage_spec.lua +++ b/spec/usage_spec.lua @@ -89,6 +89,30 @@ Usage: foo ) end) + it("creates correct usage message for arguments with choices", function() + local parser = Parser "foo" + :add_help(false) + parser:argument "move" + :choices {"rock", "paper", "scissors"} + + assert.equal( + [=[Usage: foo {rock,paper,scissors}]=], + parser:get_usage() + ) + end) + + it("creates correct usage message for options with argument choices", function() + local parser = Parser "foo" + :add_help(false) + parser:option "--format" + :choices {"short", "medium", "full"} + + assert.equal( + [=[Usage: foo [--format {short,medium,full}]]=], + parser:get_usage() + ) + end) + it("creates correct usage message for commands", function() local parser = Parser "foo" :add_help(false) diff --git a/src/argparse.lua b/src/argparse.lua index 443478d..06a252b 100644 --- a/src/argparse.lua +++ b/src/argparse.lua @@ -513,17 +513,33 @@ function Argument:_get_argname(narg) end end +function Argument:_get_choices_list() + return "{" .. table.concat(self._choices, ",") .. "}" +end + function Argument:_get_default_argname() - return "<" .. self._name .. ">" + if self._choices then + return self:_get_choices_list() + else + return "<" .. self._name .. ">" + end end function Option:_get_default_argname() - return "<" .. self:_get_default_target() .. ">" + if self._choices then + return self:_get_choices_list() + else + return "<" .. self:_get_default_target() .. ">" + end end -- Returns labels to be shown in the help message. function Argument:_get_label_lines() - return {self._name} + if self._choices then + return {self:_get_choices_list()} + else + return {self._name} + end end function Option:_get_label_lines()