Tweak some type class derivations

Hopefully will address more-or-less random failures, on the CI in
particular
This commit is contained in:
Alexandre Archambault 2017-02-22 22:18:30 +01:00
parent c59c7d45ca
commit 4dd9f7954b
1 changed files with 94 additions and 5 deletions

View File

@ -2,8 +2,12 @@ package coursier
package cli
import caseapp._
import caseapp.core.{ ArgsApp, CommandsMessages }
import caseapp.core.{ ArgsApp, CommandMessages, CommandsMessages }
import caseapp.core.util.pascalCaseSplit
import caseapp.util.AnnotationOption
import shapeless._
import shapeless.labelled.FieldType
import shapeless.union.Union
// Temporary, see comment in Coursier below
@ -21,10 +25,95 @@ final case class CoursierCommandHelper(
object CoursierCommandHelper {
type U = Union.`'bootstrap -> Bootstrap, 'fetch -> Fetch, 'launch -> Launch, 'resolve -> Resolve, 'sparksubmit -> SparkSubmit`.T
implicit val commandParser: CommandParser[CoursierCommandHelper] =
CommandParser[U].map(CoursierCommandHelper(_))
implicit val commandsMessages: CommandsMessages[CoursierCommandHelper] =
CommandsMessages(CommandsMessages[U].messages)
// Partially deriving these ones manually, to circumvent more-or-less random failures during auto derivation
// Only running into those with the new custom sbt launcher though :-|
implicit def commandParser: CommandParser[CoursierCommandHelper] =
CommandParser.ccons(
Witness('bootstrap),
AnnotationOption[CommandName, Bootstrap],
Parser[Bootstrap],
CommandParser.ccons(
Witness('fetch),
AnnotationOption[CommandName, Fetch],
Parser[Fetch],
CommandParser.ccons(
Witness('launch),
AnnotationOption[CommandName, Launch],
Parser[Launch],
CommandParser.ccons(
Witness('resolve),
AnnotationOption[CommandName, Resolve],
Parser[Resolve],
CommandParser.ccons(
Witness('sparksubmit),
AnnotationOption[CommandName, SparkSubmit],
Parser[SparkSubmit],
CommandParser.cnil
)
)
)
)
).map(CoursierCommandHelper(_))
// Cut-n-pasted from caseapp.core.CommandsMessages.ccons, fixing the type of argsName
private def commandsMessagesCCons[K <: Symbol, H, T <: Coproduct]
(implicit
key: Witness.Aux[K],
commandName: AnnotationOption[CommandName, H],
parser: Strict[Parser[H]],
argsName: AnnotationOption[ArgsName, H],
tail: CommandsMessages[T]
): CommandsMessages[FieldType[K, H] :+: T] = {
// FIXME Duplicated in CommandParser.ccons
val name = commandName().map(_.commandName).getOrElse {
pascalCaseSplit(key.value.name.toList.takeWhile(_ != '$'))
.map(_.toLowerCase)
.mkString("-")
}
CommandsMessages((name -> CommandMessages(
parser.value.args,
argsName().map(_.argsName)
)) +: tail.messages)
}
implicit def commandsMessages: CommandsMessages[CoursierCommandHelper] =
CommandsMessages(
commandsMessagesCCons(
Witness('bootstrap),
AnnotationOption[CommandName, Bootstrap],
Parser[Bootstrap],
AnnotationOption[ArgsName, Bootstrap],
commandsMessagesCCons(
Witness('fetch),
AnnotationOption[CommandName, Fetch],
Parser[Fetch],
AnnotationOption[ArgsName, Fetch],
commandsMessagesCCons(
Witness('launch),
AnnotationOption[CommandName, Launch],
Parser[Launch],
AnnotationOption[ArgsName, Launch],
commandsMessagesCCons(
Witness('resolve),
AnnotationOption[CommandName, Resolve],
Parser[Resolve],
AnnotationOption[ArgsName, Resolve],
commandsMessagesCCons(
Witness('sparksubmit),
AnnotationOption[CommandName, SparkSubmit],
Parser[SparkSubmit],
AnnotationOption[ArgsName, SparkSubmit],
CommandsMessages.cnil
)
)
)
)
).messages
)
}
object Coursier extends CommandAppOf[