mirror of
https://github.com/TangentFoxy/argparse.git
synced 2025-07-28 11:02:20 +00:00
Improved command line parsing
The first character after control character is now not required to be a letter
This commit is contained in:
@@ -23,12 +23,12 @@ describe("tests related to help message generation", function()
|
||||
|
||||
it("uses custom help option", function()
|
||||
local parser = Parser "foo"
|
||||
:add_help {aliases = {"\\?"}}
|
||||
:add_help {name = "/?"}
|
||||
assert.equal(table.concat({
|
||||
"Usage: foo [\\?]",
|
||||
"Usage: foo [/?]",
|
||||
"",
|
||||
"Options: ",
|
||||
" \\? Show this help message and exit. "
|
||||
" /? Show this help message and exit. "
|
||||
}, "\r\n"), parser:prepare():get_help())
|
||||
end)
|
||||
|
||||
|
@@ -16,6 +16,14 @@ describe("tests related to options", function()
|
||||
assert.same({server = "foo"}, args)
|
||||
end)
|
||||
|
||||
it("handles non-standard charset", function()
|
||||
local parser = Parser()
|
||||
parser:option "/s"
|
||||
parser:flag "/?"
|
||||
local args = parser:parse{"/s", "foo", "/?"}
|
||||
assert.same({s = "foo", ["?"] = true}, args)
|
||||
end)
|
||||
|
||||
it("handles GNU-style long options", function()
|
||||
local parser = Parser()
|
||||
parser:option("-s", "--server")
|
||||
|
@@ -267,8 +267,12 @@ function Parser:prepare()
|
||||
end)
|
||||
|
||||
if #self._help_option._aliases == 0 then
|
||||
if self._help_option._name then
|
||||
self._help_option._aliases[1] = self._help_option._name
|
||||
else
|
||||
self._help_option "-h" "--help"
|
||||
end
|
||||
end
|
||||
|
||||
if not self._help_option._description then
|
||||
self._help_option:description "Show this help message and exit. "
|
||||
@@ -700,26 +704,11 @@ function Parser:_parse(args, errhandler)
|
||||
first = data:sub(1, 1)
|
||||
if charset[first] then
|
||||
if #data > 1 then
|
||||
if data:sub(2, 2):match "[a-zA-Z]" then
|
||||
plain = false
|
||||
|
||||
for i = 2, #data do
|
||||
name = first .. data:sub(i, i)
|
||||
option = get_option(name)
|
||||
handle_option(name)
|
||||
|
||||
if i ~= #data and option._minargs > 0 then
|
||||
handle_argument(data:sub(i+1))
|
||||
break
|
||||
end
|
||||
end
|
||||
elseif data:sub(2, 2) == first then
|
||||
if data:sub(2, 2) == first then
|
||||
if #data == 2 then
|
||||
plain = false
|
||||
handle_options = false
|
||||
elseif data:sub(3, 3):match "[a-zA-Z]" then
|
||||
plain = false
|
||||
|
||||
else
|
||||
local equal = data:find "="
|
||||
if equal then
|
||||
name = data:sub(1, equal-1)
|
||||
@@ -733,6 +722,17 @@ function Parser:_parse(args, errhandler)
|
||||
handle_option(data)
|
||||
end
|
||||
end
|
||||
else
|
||||
for i = 2, #data do
|
||||
name = first .. data:sub(i, i)
|
||||
option = get_option(name)
|
||||
handle_option(name)
|
||||
|
||||
if i ~= #data and option._minargs > 0 then
|
||||
handle_argument(data:sub(i+1))
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user