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() } diff --git a/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala b/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala index 8c8a6e9..a6d68c2 100644 --- a/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala +++ b/core/src/main/scala/com/quantifind/sumac/ArgumentParser.scala @@ -7,7 +7,7 @@ import collection._ class ArgumentParser[T <: ArgAssignable] (val argHolders: Seq[T]) { lazy val nameToHolder:Map[String,T] = (LinkedHashMap.empty ++ argHolders.map(a => a.getName -> a)).withDefault { arg => - throw new FeedbackException("unknown option %s\n%s".format(arg, helpMessage)) + throw new ArgException("unknown option %s\n%s".format(arg, helpMessage)) } def parse(args: Array[String]): Map[T, ValueHolder[_]] = { @@ -15,19 +15,21 @@ class ArgumentParser[T <: ArgAssignable] (val argHolders: Seq[T]) { } def parse(rawKvs: Map[String,String]): Map[T, ValueHolder[_]] = { - if (rawKvs.contains("help")) + if (rawKvs.contains("help")) { throw new FeedbackException(helpMessage) - rawKvs.map{case(argName, argValue) => - val holder = nameToHolder(argName) - val result = try { - ParseHelper.parseInto(argValue, holder.getType, holder.getCurrentValue) getOrElse { - throw new FeedbackException("don't know how to parse type: " + holder.getType) + } + rawKvs.collect { + case(argName, argValue) if !ArgumentParser.isReserved(argName) => + val holder = nameToHolder(argName) + val result = try { + ParseHelper.parseInto(argValue, holder.getType, holder.getCurrentValue) getOrElse { + throw new FeedbackException("don't know how to parse type: " + holder.getType) + } + } catch { + case ae: ArgException => throw ae + case e: Throwable => throw new ArgException("Error parsing \"%s\" into field \"%s\" (type = %s)\n%s".format(argValue, argName, holder.getType, helpMessage), e) } - } catch { - case ae: ArgException => throw ae - case e: Throwable => throw new ArgException("Error parsing \"%s\" into field \"%s\" (type = %s)\n%s".format(argValue, argName, holder.getType, helpMessage), e) - } - holder -> result + holder -> result } } @@ -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)) 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] }