From 535d84f930bea36269234fc7e9b58d8b47bb9235 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Thu, 17 Jun 2021 19:23:02 +0200 Subject: [PATCH 1/3] Escape colons in zsh completion candidates --- core/shared/src/main/scala/caseapp/core/complete/Zsh.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/shared/src/main/scala/caseapp/core/complete/Zsh.scala b/core/shared/src/main/scala/caseapp/core/complete/Zsh.scala index 9e43f449..df25c480 100644 --- a/core/shared/src/main/scala/caseapp/core/complete/Zsh.scala +++ b/core/shared/src/main/scala/caseapp/core/complete/Zsh.scala @@ -50,7 +50,7 @@ object Zsh { if (arguments.isEmpty) Nil else { val desc = item.description.map(":" + _.replace("'", "\\'")).getOrElse("") - arguments.map("'" + _ + desc + "'") + arguments.map("'" + _.replace(":", "\\:") + desc + "'") } optionsOutput ++ argumentsOutput } From d4709f16ab1498680ec4fd8f01617e38b022c935 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Thu, 17 Jun 2021 19:29:07 +0200 Subject: [PATCH 2/3] Missing assertions in tests --- tests/shared/src/test/scala/caseapp/ParserTests.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/shared/src/test/scala/caseapp/ParserTests.scala b/tests/shared/src/test/scala/caseapp/ParserTests.scala index d78382e6..5ce7d63c 100644 --- a/tests/shared/src/test/scala/caseapp/ParserTests.scala +++ b/tests/shared/src/test/scala/caseapp/ParserTests.scala @@ -15,6 +15,7 @@ object ParserTests extends TestSuite { NilParser val res = parser.to[Helper].parse(Seq("-n", "2", "something", "--value", "foo")) val expected = Right((Helper(2, "foo"), Seq("something"))) + assert(res == expected) } test("tuple") { case class Helper(n: Int, value: String) @@ -24,6 +25,7 @@ object ParserTests extends TestSuite { NilParser val res = parser.toTuple.parse(Seq("-n", "2", "something", "--value", "foo")) val expected = Right(((2, "foo"), Seq("something"))) + assert(res == expected) } test("default value") { case class Helper(n: Int, value: String) @@ -34,10 +36,12 @@ object ParserTests extends TestSuite { test { val res = parser.to[Helper].parse(Seq("-n", "2", "something", "--value", "foo")) val expected = Right((Helper(2, "foo"), Seq("something"))) + assert(res == expected) } test { val res = parser.to[Helper].parse(Seq("-n", "2", "something")) val expected = Right((Helper(2, "-"), Seq("something"))) + assert(res == expected) } test { val res = parser.to[Helper].parse(Seq("--value", "other", "something")) From bf5a112f23c59b87c05746a52cb581c9ad691edf Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Thu, 17 Jun 2021 19:30:17 +0200 Subject: [PATCH 3/3] Leave single '-' in user arguments These can mean stdin for some apps for example. --- .../main/scala/caseapp/core/parser/Parser.scala | 4 +++- .../src/test/scala/caseapp/ParserTests.scala | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/shared/src/main/scala/caseapp/core/parser/Parser.scala b/core/shared/src/main/scala/caseapp/core/parser/Parser.scala index 469255e0..2604643e 100644 --- a/core/shared/src/main/scala/caseapp/core/parser/Parser.scala +++ b/core/shared/src/main/scala/caseapp/core/parser/Parser.scala @@ -181,7 +181,7 @@ abstract class Parser[T] { } val reverseSteps0 = Step.DoubleDash(index) :: reverseSteps.reverse (res, reverseSteps0.reverse) - case opt :: rem if opt.startsWith("-") => + case opt :: rem if opt.startsWith("-") && opt != "-" => if (ignoreUnrecognized) helper(current, rem, opt :: extraArgsReverse, Step.IgnoredUnrecognized(index) :: reverseSteps, index + 1) else if (stopAtFirstUnrecognized) { @@ -282,6 +282,8 @@ abstract class Parser[T] { completer.optionName(value, stateOpt) case Step.Unrecognized(_, _) => completer.optionName(value, stateOpt) + case Step.StandardArgument(idx) if args0(idx) == "-" => + completer.optionName(value, stateOpt) case Step.MatchedOption(_, consumed, arg) if shift == 0 => completer.optionName(value, stateOpt) case Step.MatchedOption(_, consumed, arg) if consumed == 2 && shift == 1 => diff --git a/tests/shared/src/test/scala/caseapp/ParserTests.scala b/tests/shared/src/test/scala/caseapp/ParserTests.scala index 5ce7d63c..4e8656ea 100644 --- a/tests/shared/src/test/scala/caseapp/ParserTests.scala +++ b/tests/shared/src/test/scala/caseapp/ParserTests.scala @@ -48,5 +48,22 @@ object ParserTests extends TestSuite { assert(res.isLeft) } } + test("Keep single dashes in user arguments") { + case class Helper(n: Int, value: String) + val parser = + Argument[Int](Arg("n")) :: + Argument[String](Arg("value")).withDefault(() => Some("default")) :: + NilParser + test("single") { + val res = parser.to[Helper].parse(Seq("-n", "2", "-")) + val expected = Right((Helper(2, "default"), Seq("-"))) + assert(res == expected) + } + test("several") { + val res = parser.to[Helper].parse(Seq("-", "a", "-", "-n", "2", "-")) + val expected = Right((Helper(2, "default"), Seq("-", "a", "-", "-"))) + assert(res == expected) + } + } } }