From 692467570cb244c2e059a4ff45a8c8b63efc1e83 Mon Sep 17 00:00:00 2001 From: Pierre Andrews Date: Wed, 8 Jan 2014 18:09:56 -0200 Subject: [PATCH 1/3] add a list of reserved arg names that will not be mapped to a arg holder --- .../main/scala/com/quantifind/sumac/ArgumentParser.scala | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala b/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala index fcf26e0..dc7d8f4 100644 --- a/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala +++ b/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala @@ -17,7 +17,9 @@ class ArgumentParser[T <: ArgAssignable] (val argHolders: Seq[T]) { def parse(rawKvs: Map[String,String]): Map[T, ValueHolder[_]] = { if (rawKvs.contains("help")) throw new ArgException(helpMessage) - rawKvs.map{case(argName, argValue) => + rawKvs.filter { + case(argName, argValue) => !ArgumentParser.isReserved(argName) + }.map{case(argName, argValue) => val holder = nameToHolder(argName) val result = try { ParseHelper.parseInto(argValue, holder.getType, holder.getCurrentValue) getOrElse { @@ -42,6 +44,11 @@ class ArgumentParser[T <: ArgAssignable] (val argHolders: Seq[T]) { } object ArgumentParser { + + val reservedArguments = Seq("help", "sumac.debugArgs") + + def isReserved(name: String) = reservedArguments.contains(name) + def apply[T <: ArgAssignable](argHolders: Traversable[T]) = { // ignore things we don't know how to parse new ArgumentParser(argHolders.toSeq.filter(t => ParseHelper.findParser(t.getType).isDefined)) From ca5db63d3b947a067e6682911be90ebb88a54270 Mon Sep 17 00:00:00 2001 From: Pierre Andrews Date: Wed, 8 Jan 2014 18:11:21 -0200 Subject: [PATCH 2/3] provide a --sumac.debugArgs argument that will list the final values before validation of the arguments, without exiting. --- core/src/main/scala/com/quantifind/sumac/Args.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/scala/com/quantifind/sumac/Args.scala b/core/src/main/scala/com/quantifind/sumac/Args.scala index 0570b8b..ee2d5c2 100644 --- a/core/src/main/scala/com/quantifind/sumac/Args.scala +++ b/core/src/main/scala/com/quantifind/sumac/Args.scala @@ -40,6 +40,12 @@ trait Args extends ExternalConfig with Serializable { parsedArgs.foreach { case (argAssignable, valueHolder) => argAssignable.setValue(valueHolder.value) } + if(kvPairs.contains("sumac.debugArgs")) { + println("Sumac setup the following args:") + getArgs("").foreach { arg => + println(s"\t--${arg.getName}\t${arg.getCurrentValue}") + } + } if (validation) runValidation() } From e5a6ede75b1a6ac75aec872b75e4f71bac4fef5c Mon Sep 17 00:00:00 2001 From: Pierre Andrews Date: Fri, 2 May 2014 11:09:24 -0300 Subject: [PATCH 3/3] add test for reserved args --- .../com/quantifind/sumac/ArgumentParserTest.scala | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/src/test/scala/com/quantifind/sumac/ArgumentParserTest.scala b/core/src/test/scala/com/quantifind/sumac/ArgumentParserTest.scala index c9995f3..23ce268 100644 --- a/core/src/test/scala/com/quantifind/sumac/ArgumentParserTest.scala +++ b/core/src/test/scala/com/quantifind/sumac/ArgumentParserTest.scala @@ -31,6 +31,17 @@ class ArgumentParserTest extends FunSuite with Matchers { } } + test("reserved arguments should be filtered") { + val c = SimpleClass("a", 0, 1.4, 2) + val fieldArgs = classOf[SimpleClass].getDeclaredFields.map{f => FieldArgAssignable("",f, c)} + val argParser = new ArgumentParser(fieldArgs) + + val parsed = getSimpleNameToArgMap(argParser.parse(Array("--count", "5", "--dummy", "7.4e3", "--name", "ooga", "--sumac.debugArgs", "true"))) + + parsed should not contain key("sumac.debugArgs") + + } + def getSimpleNameToArgMap(parsedArgs : Map[_ <: ArgAssignable, ValueHolder[_]]) = { parsedArgs.map{kv => kv._1.getName -> kv._2.value}.toMap[String, Any] }