Code Monkey home page Code Monkey logo

kebs's People

Contributors

adpi2 avatar agluszak avatar anthonygrod avatar asoltysik avatar dbronecki avatar falconepl avatar jglodek avatar kristerr avatar luksow avatar marcin-rzeznicki avatar mielnikk avatar niedam avatar piotrkuczko avatar pk044 avatar rpiotrow avatar scala-steward avatar zofja avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kebs's Issues

[kebs-spray-json] Lazy formats stopped working in 1.5.2 version

Using lazy format for recursive case class gives StackOverflowError after upgrading to 1.5.2

case class Category(
   name: String,
   parent: Option[Category]
)
  implicit val categoryFormat = jsonFormatRec[Category]
macro expansion has failed: java.lang.StackOverflowError
        at scala.reflect.internal.Symbols$TermSymbol.isClassConstructor(Symbols.scala:2817)
        at scala.reflect.internal.Symbols$TermSymbol.isConstructor(Symbols.scala:2819)
        at scala.tools.nsc.typechecker.Contexts$Context.nextOuter(Contexts.scala:620)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:881)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:904)
        at scala.tools.nsc.typechecker.Contexts$Context.withOuter$1(Contexts.scala:884)
        at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:901)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1409)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:95)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:82)
        at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:458)
        at scala.tools.nsc.typechecker.Implicits.inferImplicitFor(Implicits.scala:40)
        at scala.tools.nsc.typechecker.Implicits.inferImplicitFor$(Implicits.scala:39)
        at scala.tools.nsc.Global$$anon$1.inferImplicitFor(Global.scala:458)
        at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$applyImplicitArgs$2(Typers.scala:172)
        at scala.tools.nsc.typechecker.Typers$Typer.applyImplicitArgs(Typers.scala:165)
        at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$adapt$1(Typers.scala:883)
        at scala.tools.nsc.typechecker.Typers$Typer.adaptToImplicitMethod$1(Typers.scala:477)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1210)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1207)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit1(Implicits.scala:698)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit0(Implicits.scala:635)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.scala$tools$nsc$typechecker$Implicits$ImplicitSearch$$typedImplicit(Implicits.scala:503)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.rankImplicits(Implicits.scala:954)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.findBest(Implicits.scala:982)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1039)
        at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1409)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:95)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:82)
        at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:458)
        at scala.tools.nsc.typechecker.Implicits.$anonfun$inferImplicit$3(Implicits.scala:119)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:119)
        at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:117)
        at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:458)
        at scala.reflect.macros.contexts.Typers.inferImplicitValue(Typers.scala:44)
        at scala.reflect.macros.contexts.Typers.inferImplicitValue$(Typers.scala:42)
        at scala.reflect.macros.contexts.Context.inferImplicitValue(Context.scala:6)
        at scala.reflect.macros.contexts.Context.inferImplicitValue(Context.scala:6)
        at pl.iterators.kebs.macros.MacroUtils.inferImplicitValue(MacroUtils.scala:34)
        at pl.iterators.kebs.json.macros.KebsSprayMacros.$anonfun$materializeRootJsonFormat$1(KebsSprayMacros.scala:31)
        at scala.collection.immutable.List.map(List.scala:283)
        at pl.iterators.kebs.json.macros.KebsSprayMacros.materializeRootJsonFormat(KebsSprayMacros.scala:31)
        at pl.iterators.kebs.json.macros.KebsSprayMacros.materializeRootFormat(KebsSprayMacros.scala:72)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at scala.reflect.macros.runtime.JavaReflectionRuntimes$JavaReflectionResolvers.$anonfun$resolveJavaReflectionRuntime$4(JavaReflectionRuntimes.scala:34)
        at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:772)

Dummy class generator

When writing tests you have to generate many dummy case classes for fixtures. It'd be good to have a generator for them and just replace what's important.

Write missing column extensions for Slick

Ex. StringColumnExtensionMethods does not work by default for String mapped case classes. It should be relatively easy to provide extensions for all basic types (mapped).

`validate` in tagged won't work if typed

This works fine:

import pl.iterators.kebs.tagged._
import pl.iterators.kebs.tag.meta.tagged

@tagged object Tags {
  trait NameTag
  trait IdTag[+A]
  trait PositiveIntTag

  type Name  = String @@ NameTag
  type Id[A] = Int @@ IdTag[A]

  type PositiveInt = Int @@ PositiveIntTag
  object PositiveInt {
    sealed trait Error
    case object Negative extends Error
    case object Zero     extends Error

    def validate(i: Int) = if (i == 0) Left(Zero) else if (i < 0) Left(Negative) else Right(i)
  }
}

but if you add type description to validate, like: def validate(i: Int): Either[Error, Int] = if (i == 0) Left(Zero) else if (i < 0) Left(Negative) else Right(i) no validation will be executed.

Unmarshalling nested JSON object with single field fails

The following test case:

import org.scalatest.{Matchers, WordSpec}
import pl.iterators.kebs.json.KebsSpray
import spray.json.DefaultJsonProtocol

case class Book(name: String, chapters: List[Chapter])
case class Chapter(name: String)

class KebsTest extends WordSpec with Matchers {

  import ThingProtocol._
  import spray.json._

  "Kebs" should {
    "work with nested single field objects" in {
      val json =
        """
          | {
          |   "name": "Functional Programming in Scala",
          |   "chapters": [{"name":"first"}, {"name":"second"}]
          | }
        """.stripMargin

      json.parseJson.convertTo[Book] shouldBe Book(
        name     = "Functional Programming in Scala",
        chapters = List(Chapter("first"), Chapter("second"))
      )
    }
  }
}

object ThingProtocol extends DefaultJsonProtocol with KebsSpray

Gives error:

spray.json.DeserializationException: Expected String as JsString, but got {"name":"first"}

spray-json, akka-http, slick shouldn't depend on instances

spray-json, akka-http, slick modules depend on instances which is, in general, unnecessary, even though most users would probably add instances as a dep.

I think the correct solution would be to push InstanceConverter trait to macro-utils to sit there together with CaseClass1Rep or even better, create a thin module core or base and have InstanceConverter and CaseClass1Rep there.

Default Enum value is always used instead of the one passed in request

I'm using enum as parameter with default value. Default value is always used instead of the one I passed to request.

Test case:

import org.scalatest.{Matchers, WordSpec}
import akka.http.scaladsl.testkit.ScalatestRouteTest
import akka.http.scaladsl.server._
import Directives._
import enumeratum.{Enum, EnumEntry}

sealed trait SortOrder extends EnumEntry
object SortOrder extends Enum[SortOrder] {
  case object Asc extends SortOrder
  case object Desc extends SortOrder

  override val values = findValues
}

class KebsTest extends WordSpec with Matchers with ScalatestRouteTest {

  import pl.iterators.kebs.unmarshallers._
  import enums._

  val smallRoute =
    get {
      path("test_enum") {
        parameter('sort.as[SortOrder] ? SortOrder.Desc) { sort =>
          complete {
            s"Sort was $sort"
          }
        }
      }
    }

  "Kebs" should {

    "work with default enum values" in {
      Get("/test_enum?sort=Asc") ~> smallRoute ~> check {
        responseAs[String] shouldBe "Sort was Asc"
      }
    }
  }
}

Improve docs

There are several things that the documentation is currently missing and could be helpful to future contributors:

  • Explain code organization
  • How to test your code
  • How to debug
  • ...

It can be added in form of CONTRIBUTING guide

Derive typeclass instances for tagged types

If you tag a type that has a Numeric or Ordering your tagged type no is an instance of these typeclasses. Example solution for Numeric:

  implicit def taggedNumeric[A: Numeric, Tag]: Numeric[A @@ Tag] = new Numeric[A @@ Tag] {
    override def plus(x: A @@ Tag, y: A @@ Tag): A @@ Tag   = implicitly[Numeric[A]].plus(x, y).taggedWith[Tag]
    override def minus(x: A @@ Tag, y: A @@ Tag): A @@ Tag  = implicitly[Numeric[A]].minus(x, y).taggedWith[Tag]
    override def times(x: A @@ Tag, y: A @@ Tag): A @@ Tag  = implicitly[Numeric[A]].times(x, y).taggedWith[Tag]
    override def negate(x: A @@ Tag): A @@ Tag              = implicitly[Numeric[A]].negate(x).taggedWith[Tag]
    override def fromInt(x: Int): A @@ Tag                  = implicitly[Numeric[A]].fromInt(x).taggedWith[Tag]
    override def parseString(str: String): Option[A @@ Tag] = implicitly[Numeric[A]].parseString(str).map(_.taggedWith[Tag])
    override def toInt(x: A @@ Tag): Int                    = implicitly[Numeric[A]].toInt(x)
    override def toLong(x: A @@ Tag): Long                  = implicitly[Numeric[A]].toLong(x)
    override def toFloat(x: A @@ Tag): Float                = implicitly[Numeric[A]].toFloat(x)
    override def toDouble(x: A @@ Tag): Double              = implicitly[Numeric[A]] toDouble (x)
    override def compare(x: A @@ Tag, y: A @@ Tag): Int     = implicitly[Numeric[A]].compare(x, y)
  }

Circe support - @noflat has no effect when KebsCirce.NoFlat is not used

  object KebsProtocol extends KebsCirce
  import KebsProtocol._

  @noflat case class F(i: Int)

  test("No-flat format - annotation") {

    val decoder = implicitly[Decoder[F]]
    val encoder = implicitly[Encoder[F]]
    decoder.apply(Json.fromFields(Seq("i" -> Json.fromInt(10))).hcursor) shouldBe Right(F(10))
    encoder.apply(F(10)) shouldBe Json.fromFields(Seq("i" -> Json.fromInt(10)))
  }

Test above results in failure. Currently the support for noflat works only when NoFlat trait is mixed in.

In order to fix this, the following code should be changed so @noflat is taken into account when only KebsCirce trait is extended:

trait KebsCirce extends AutoDerivation {
  implicit def flatDecoder[T, A](implicit rep: CaseClass1Rep[T, A], decoder: Decoder[A]): Decoder[T] =
    decoder.emap(obj => Try(rep.apply(obj)).toEither.left.map(_.getMessage))
  implicit def flatEncoder[T, A](implicit rep: CaseClass1Rep[T, A], encoder: Encoder[A]): Encoder[T] =
    encoder.contramap(rep.unapply)
}

KebsSpray is already handling this - it's worth taking a look: https://github.com/theiterators/kebs/blob/bb83e41ec2e3a217719c2da083e99e8ca4eee0ba/spray-json/src/main/scala/pl/iterators/kebs/json/KebsSpray.scala

Fix slick's proven shape problems

case class Member(id: UUID, name: String)

object Member {
  
}

class Members(tag: BaseTable.Tag) extends BaseTable[Member](tag, "position") {
  import driver.api._

  def id: Rep[UUID]                             = column[UUID]("id")
  def name: Rep[String]                             = column[String]("name")

  override def * : ProvenShape[Member] =
    (id, name) <> (Member.tupled, Member.unapply)
}

This does not compile for obvious reasons and needs a change to (id, name) <> ((Member.apply _).tupled, Member.unapply).

Even worse, let's consider this:

case class MemberCreateRequest(name: String)

case class Member(id: UUID, name: String)

object Member {
  def apply(request: MemberCreateRequest): Member = Member(UUID.randomUUID(), request.name)
}

class Members(tag: BaseTable.Tag) extends BaseTable[Member](tag, "position") {
  import driver.api._

  def id: Rep[UUID]                             = column[UUID]("id")
  def name: Rep[String]                             = column[String]("name")

  override def * : ProvenShape[Member] =
    (id, name) <> ((Member.apply _).tupled, Member.unapply)
}

It won't compile again due to ambiguous reference.

Can kebs help with that?

Compilation error on nested case classes with the same type

The following code:

import pl.iterators.kebs.json.KebsSpray
import spray.json.{DefaultJsonProtocol, JsonFormat}

class KebsTest {
  import ThingProtocol._

  case class Thing(thingId: String, parent: Option[Thing])

  val t = Thing("child", Some(Thing("parent", None)))

  implicitly[JsonFormat[Thing]].write(t)
}

object ThingProtocol extends DefaultJsonProtocol with KebsSpray

Gives error:

[error] (...)/KebsTest.scala:13: diverging implicit expansion for type routers.ThingProtocol.JF[Option[KebsTest.this.Thing]]
[error] starting with macro method jsonFlatFormat in trait KebsSpray
[error]   implicitly[JsonFormat[Thing]].write(t)
[error]             ^
[error] one error found

Remove compiler warnings

We have a little bit of 2.12 code that should be slightly refactored to adjust to practices used in Scala 2.13 - there are about 20+ warnings, this one being the most important:

[warn] /home/pk/Development/iterators/kebs/tagged-meta/src/test/scala/SprayAnnotationTests.scala:8:2: method right in class Either is deprecated (since 2.13.0): Either is now right-biased, use methods directly on Either
[warn] @tagged object SprayTestTags {
[warn]  ^
[warn] /home/pk/Development/iterators/kebs/tagged-meta/src/test/scala/SprayAnnotationTests.scala:26:2: method right in class Either is deprecated (since 2.13.0): Either is now right-biased, use methods directly on Either
[warn] @tagged trait SprayTestTagsTrait {
[warn]  ^

which is caused by

q"validate($argName).right.map(arg1 => $argName.taggedWith[${tagType.tagName}[..$tagParams]])"

Autogeneration of json schema

Create macros to streamline generation of structures for https://github.com/andyglow/scala-jsonschema so they work seamlessly with tagged types/values classes.

import pl.iterators.kebs.tagged._
import json._
implicit def taggedJsonSchema[T, U](implicit base: json.schema.Predef[T]): json.schema.Predef[T @@ U] = base.asInstanceOf[json.schema.Predef[T @@ U]]
implicit def taggedJsonSchema2[T, U](implicit base: json.Schema[T]): json.Schema[T @@ U] = base.asInstanceOf[json.Schema[T @@ U]]

Is a good start but then you still manually need to materialize implicits.

Kebs spray-json can't resolve implicit for particular case class

Following code:

  test("issue") {
    import KebsProtocol._
    val jf = implicitly[JsonFormat[Request]]
  }
  case class Request(region: String, currency: String, date: String, code: String, items: List[RequestItem])
  case class RequestItem(itemCode: String, language: String, answers: Option[List[Answer]], requirements: String, travellers: String)
  case class Answer(answer: String)

Gives compilation error:

[error] diverging implicit expansion for type spray.json.JsonFormat[SprayValueEnumJsonFormatTests.this.Request]
[error] starting with macro method jsonValueEnumFormat in trait KebsEnumFormats
[error]     val jf = implicitly[JsonFormat[Request]]

kebs-avro does not seem to work with scala 2.12.5 and above (java.lang.AbstractMethodError)

scala 2.12.5/6
sbt 0.13.17

Compiling code that was working fine on 2.12.4 results in the following lengthy stacktrace:

java.lang.AbstractMethodError
	at pl.iterators.kebs.macros.MacroUtils.<init>(MacroUtils.scala:8)
	at pl.iterators.kebs.avro.macros.AvroKebsMacros.<init>(AvroKebsMacros.scala:8)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at scala.reflect.macros.runtime.JavaReflectionRuntimes$JavaReflectionResolvers.$anonfun$resolveJavaReflectionRuntime$4(JavaReflectionRuntimes.scala:31)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:792)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:768)
	at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:609)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$$anon$4.transform(Macros.scala:931)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll(Macros.scala:939)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll$(Macros.scala:920)
	at scala.tools.nsc.Global$$anon$1.macroExpandAll(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:777)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:768)
	at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:609)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.onDelayed(Macros.scala:736)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:623)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.vanillaAdapt$1(Typers.scala:1171)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1231)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1204)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1224)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit1(Implicits.scala:706)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit0(Implicits.scala:643)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.scala$tools$nsc$typechecker$Implicits$ImplicitSearch$$typedImplicit(Implicits.scala:511)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.rankImplicits(Implicits.scala:964)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.findBest(Implicits.scala:992)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1049)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1419)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:95)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:82)
	at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:448)
	at scala.tools.nsc.typechecker.Implicits.$anonfun$inferImplicit$3(Implicits.scala:127)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:127)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:125)
	at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:448)
	at scala.reflect.macros.contexts.Typers.inferImplicitValue(Typers.scala:44)
	at scala.reflect.macros.contexts.Typers.inferImplicitValue$(Typers.scala:42)
	at scala.reflect.macros.contexts.Context.inferImplicitValue(Context.scala:6)
	at scala.reflect.macros.contexts.Context.inferImplicitValue(Context.scala:6)
	at shapeless.LazyMacros$DerivationContext$State$.resolveInstance(lazy.scala:301)
	at shapeless.LazyMacros$DerivationContext.resolve0(lazy.scala:428)
	at shapeless.LazyMacros$DerivationContext.resolve(lazy.scala:420)
	at shapeless.LazyMacros$DerivationContext.$anonfun$derive$2(lazy.scala:504)
	at scala.util.Either$LeftProjection.flatMap(Either.scala:561)
	at shapeless.LazyMacros$DerivationContext.$anonfun$derive$1(lazy.scala:502)
	at scala.Option.getOrElse(Option.scala:121)
	at shapeless.LazyMacros$DerivationContext.derive(lazy.scala:502)
	at shapeless.LazyMacros$DerivationContext$State$.deriveInstance(lazy.scala:334)
	at shapeless.LazyMacros$.deriveInstance(lazy.scala:599)
	at shapeless.LazyMacros.mkImpl(lazy.scala:213)
	at shapeless.LazyMacros.mkLazyImpl(lazy.scala:200)
	at shapeless.LazyMacrosRef.mkLazyImpl(lazyref.scala:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at scala.reflect.macros.runtime.JavaReflectionRuntimes$JavaReflectionResolvers.$anonfun$resolveJavaReflectionRuntime$4(JavaReflectionRuntimes.scala:34)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:792)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:768)
	at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:609)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$$anon$4.transform(Macros.scala:931)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll(Macros.scala:939)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll$(Macros.scala:920)
	at scala.tools.nsc.Global$$anon$1.macroExpandAll(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:777)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:768)
	at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:609)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.onDelayed(Macros.scala:736)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:623)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.vanillaAdapt$1(Typers.scala:1171)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1231)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1204)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1224)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit1(Implicits.scala:706)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit0(Implicits.scala:643)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.scala$tools$nsc$typechecker$Implicits$ImplicitSearch$$typedImplicit(Implicits.scala:511)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.rankImplicits(Implicits.scala:964)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.findBest(Implicits.scala:992)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1049)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1445)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:95)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:82)
	at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:448)
	at scala.tools.nsc.typechecker.Implicits.inferImplicitFor(Implicits.scala:40)
	at scala.tools.nsc.typechecker.Implicits.inferImplicitFor$(Implicits.scala:39)
	at scala.tools.nsc.Global$$anon$1.inferImplicitFor(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$applyImplicitArgs$2(Typers.scala:172)
	at scala.tools.nsc.typechecker.Typers$Typer.applyImplicitArgs(Typers.scala:165)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$adapt$2(Typers.scala:850)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$silent$2(Typers.scala:714)
	at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:714)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$adapt$1(Typers.scala:849)
	at scala.tools.nsc.typechecker.Typers$Typer.adaptToImplicitMethod$1(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1227)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5654)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArgToPoly$1(Typers.scala:3680)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$34(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3699)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4773)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2476)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$97(Typers.scala:5561)
	at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:486)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArgToPoly$1(Typers.scala:3680)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$34(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3699)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4773)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
	at scala.tools.nsc.typechecker.PatternTypers$PatternTyper.typedArgWithFormal$1(PatternTypers.scala:108)
	at scala.tools.nsc.typechecker.PatternTypers$PatternTyper.$anonfun$typedArgsForFormals$4(PatternTypers.scala:122)
	at scala.tools.nsc.typechecker.PatternTypers$PatternTyper.typedArgsForFormals(PatternTypers.scala:122)
	at scala.tools.nsc.typechecker.PatternTypers$PatternTyper.typedArgsForFormals$(PatternTypers.scala:103)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArgsForFormals(Typers.scala:111)
	at scala.tools.nsc.typechecker.Typers$Typer.handleMonomorphicCall$1(Typers.scala:3635)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$31(Typers.scala:3661)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3661)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4773)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedAnnotated$1(Typers.scala:4270)
	at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:5570)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMatch(Typers.scala:2560)
	at scala.tools.nsc.typechecker.Typers$Typer.typedVirtualizedMatch$1(Typers.scala:4483)
	at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:5565)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5714)
	at scala.tools.nsc.typechecker.Typers$Typer.computeType(Typers.scala:5802)
	at scala.tools.nsc.typechecker.Namers$Namer.assignTypeToTree(Namers.scala:1079)
	at scala.tools.nsc.typechecker.Namers$Namer.valDefSig(Namers.scala:1629)
	at scala.tools.nsc.typechecker.Namers$Namer.memberSig(Namers.scala:1798)
	at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1763)
	at scala.tools.nsc.typechecker.Namers$Namer$MonoTypeCompleter.completeImpl(Namers.scala:842)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete(Namers.scala:1960)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete$(Namers.scala:1958)
	at scala.tools.nsc.typechecker.Namers$TypeCompleterBase.complete(Namers.scala:1953)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1532)
	at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1680)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5255)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2006)
	at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1829)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5552)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2475)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$97(Typers.scala:5561)
	at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:486)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.$anonfun$onSuccess$1(Macros.scala:664)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.typecheck$1(Macros.scala:664)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.onSuccess(Macros.scala:676)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:615)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.vanillaAdapt$1(Typers.scala:1171)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1231)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1204)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5654)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.transformedOrTyped(Typers.scala:5854)
	at scala.tools.nsc.typechecker.Typers$Typer.typedValDefImpl(Typers.scala:2087)
	at scala.tools.nsc.typechecker.Typers$Typer.typedValDef(Typers.scala:2043)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5550)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2006)
	at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1829)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5552)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2475)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$97(Typers.scala:5561)
	at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:486)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.$anonfun$onSuccess$1(Macros.scala:664)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.typecheck$1(Macros.scala:664)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.onSuccess(Macros.scala:676)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:615)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$$anon$4.transform(Macros.scala:931)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll(Macros.scala:939)
	at scala.tools.nsc.typechecker.Macros.macroExpandAll$(Macros.scala:920)
	at scala.tools.nsc.Global$$anon$1.macroExpandAll(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:777)
	at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:768)
	at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:609)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros$DefMacroExpander.onDelayed(Macros.scala:736)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:623)
	at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:602)
	at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:589)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:753)
	at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:751)
	at scala.tools.nsc.Global$$anon$1.standardMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:432)
	at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.invoke(AnalyzerPlugins.scala:401)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsMacroExpand$(AnalyzerPlugins.scala:429)
	at scala.tools.nsc.Global$$anon$1.pluginsMacroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Macros.macroExpand(Macros.scala:746)
	at scala.tools.nsc.typechecker.Macros.macroExpand$(Macros.scala:746)
	at scala.tools.nsc.Global$$anon$1.macroExpand(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.vanillaAdapt$1(Typers.scala:1171)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1231)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1204)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1224)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit1(Implicits.scala:706)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.typedImplicit0(Implicits.scala:643)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.scala$tools$nsc$typechecker$Implicits$ImplicitSearch$$typedImplicit(Implicits.scala:511)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.rankImplicits(Implicits.scala:964)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.findBest(Implicits.scala:992)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1049)
	at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1445)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit(Implicits.scala:95)
	at scala.tools.nsc.typechecker.Implicits.inferImplicit$(Implicits.scala:82)
	at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:448)
	at scala.tools.nsc.typechecker.Implicits.inferImplicitFor(Implicits.scala:40)
	at scala.tools.nsc.typechecker.Implicits.inferImplicitFor$(Implicits.scala:39)
	at scala.tools.nsc.Global$$anon$1.inferImplicitFor(Global.scala:448)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$applyImplicitArgs$2(Typers.scala:172)
	at scala.tools.nsc.typechecker.Typers$Typer.applyImplicitArgs(Typers.scala:165)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$adapt$2(Typers.scala:850)
	at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:700)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$adapt$1(Typers.scala:849)
	at scala.tools.nsc.typechecker.Typers$Typer.adaptToImplicitMethod$1(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1227)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5654)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArgToPoly$1(Typers.scala:3680)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$34(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3699)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4773)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5714)
	at scala.tools.nsc.typechecker.Typers$Typer.computeType(Typers.scala:5802)
	at scala.tools.nsc.typechecker.Namers$Namer.assignTypeToTree(Namers.scala:1079)
	at scala.tools.nsc.typechecker.Namers$Namer.valDefSig(Namers.scala:1629)
	at scala.tools.nsc.typechecker.Namers$Namer.memberSig(Namers.scala:1798)
	at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1763)
	at scala.tools.nsc.typechecker.Namers$Namer$ValTypeCompleter.completeImpl(Namers.scala:910)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete(Namers.scala:1960)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete$(Namers.scala:1958)
	at scala.tools.nsc.typechecker.Namers$TypeCompleterBase.complete(Namers.scala:1953)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1532)
	at scala.reflect.internal.Symbols$Symbol.cookJavaRawInfo(Symbols.scala:1707)
	at scala.tools.nsc.typechecker.Infer$Inferencer.checkAccessible(Infer.scala:272)
	at scala.tools.nsc.typechecker.Typers$Typer.makeAccessible(Typers.scala:579)
	at scala.tools.nsc.typechecker.Typers$Typer.typedIdent$2(Typers.scala:5140)
	at scala.tools.nsc.typechecker.Typers$Typer.typedIdentOrWildcard$1(Typers.scala:5155)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5584)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
	at scala.tools.nsc.typechecker.Typers$Typer.typedArgToPoly$1(Typers.scala:3680)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$34(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3688)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3699)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4773)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5714)
	at scala.tools.nsc.typechecker.Typers$Typer.computeType(Typers.scala:5802)
	at scala.tools.nsc.typechecker.Namers$Namer.assignTypeToTree(Namers.scala:1079)
	at scala.tools.nsc.typechecker.Namers$Namer.valDefSig(Namers.scala:1629)
	at scala.tools.nsc.typechecker.Namers$Namer.memberSig(Namers.scala:1798)
	at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1763)
	at scala.tools.nsc.typechecker.Namers$Namer$ValTypeCompleter.completeImpl(Namers.scala:910)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete(Namers.scala:1960)
	at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete$(Namers.scala:1958)
	at scala.tools.nsc.typechecker.Namers$TypeCompleterBase.complete(Namers.scala:1953)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1532)
	at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1680)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5255)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2006)
	at scala.tools.nsc.typechecker.Typers$Typer.typedModuleDef(Typers.scala:1876)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5553)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
	at scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:5262)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5555)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5699)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:104)
	at scala.tools.nsc.Global$GlobalPhase.$anonfun$applyPhase$1(Global.scala:426)
	at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:419)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1(Analyzer.scala:94)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1$adapted(Analyzer.scala:93)
	at scala.collection.Iterator.foreach(Iterator.scala:944)
	at scala.collection.Iterator.foreach$(Iterator.scala:944)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1432)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:93)
	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1446)
	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1430)
	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1423)
	at scala.tools.nsc.Global$Run.compile(Global.scala:1539)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:116)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:95)
	at xsbt.CompilerInterface.run(CompilerInterface.scala:26)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:107)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:53)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:47)
	at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply$mcV$sp(MixedAnalyzingCompiler.scala:50)
	at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply(MixedAnalyzingCompiler.scala:50)
	at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply(MixedAnalyzingCompiler.scala:50)
	at sbt.compiler.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:74)
	at sbt.compiler.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:49)
	at sbt.compiler.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:64)
	at sbt.compiler.IC$$anonfun$compileInternal$1.apply(IncrementalCompiler.scala:160)
	at sbt.compiler.IC$$anonfun$compileInternal$1.apply(IncrementalCompiler.scala:160)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:66)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:64)
	at sbt.inc.IncrementalCommon.cycle(IncrementalCommon.scala:32)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:72)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:71)
	at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:99)
	at sbt.inc.Incremental$.compile(Incremental.scala:71)
	at sbt.inc.IncrementalCompile$.apply(Compile.scala:54)
	at sbt.compiler.IC$.compileInternal(IncrementalCompiler.scala:160)
	at sbt.compiler.IC$.incrementalCompile(IncrementalCompiler.scala:138)
	at sbt.Compiler$.compile(Compiler.scala:155)
	at sbt.Compiler$.compile(Compiler.scala:141)
	at sbt.Defaults$.sbt$Defaults$$compileIncrementalTaskImpl(Defaults.scala:927)
	at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:918)
	at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:916)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
	at sbt.std.Transform$$anon$4.work(System.scala:63)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
	at sbt.Execute.work(Execute.scala:237)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
[error] (compile:compileIncremental) java.lang.AbstractMethodError

I'll add a code snippet if it'll prove hard to reproduce.

Explicitly providing jsonFormatN yields different results than omitting it

I have this piece of code that converts case class to json:

import pl.iterators.kebs.json.KebsSpray
import spray.json._

object Kebsie extends DefaultJsonProtocol with KebsSpray {
  def main(args: Array[String]): Unit = {
    implicit val fmt = jsonFormatN[Chest]

    println(Chest(Seq("sword", "shield")).toJson.compactPrint)
    println(Chest2(Seq("sword", "shield")).toJson.compactPrint)
  }

  case class Chest(items: Seq[String])
  case class Chest2(items: Seq[String])
}

and expect both Chest and Chest2 to yield the same output:
{"items":["sword","shield"]}

however Chest2 json output is:
["sword","shield"]

Spray-json None values are always converted to null. How to change this?

Spray converts None values to null only when NullOptions trait is added but by default it doesn't add those fields to JSON.
When using kebs implicitly[RootJsonFormat[xxx]], it converts None values to null. Example of such case: https://scastie.scala-lang.org/myDisconnect/tgnMaqh4QcCdQWDBWQZT5A/7 see f4 field (this is also visible in Kebs tests)
Is it possible to change this behaviour in Kebs and ignore None values?

Note: This seems to be happening when a case class has more than 22 parameters

Diverging implicit expansion for specific configuration of parameters

import org.scalatest.{FunSuite, Matchers}
import pl.iterators.kebs.json.KebsSpray
import pl.iterators.kebs.tag.meta.tagged
import pl.iterators.kebs.tagged._
import spray.json.{DefaultJsonProtocol, JsonFormat}

package object domain extends Domain {}

@tagged trait Domain {
  trait SomeTag
  type SomeTaggedValue = Int @@ SomeTag
}

object dto {
  import domain._
  case class SomeDto(opt: Option[SomeTaggedValue])
}

class FailingTests extends FunSuite with Matchers with DefaultJsonProtocol with KebsSpray {
  import dto._

  test("fail") {
    implicitly[JsonFormat[Option[SomeDto]]]
  }
}

Results in diverging implicit expansion for type spray.json.JsonFormat[Option[dto.SomeDto]]. Interestingly, if you delete any Option it will work.

My prediction is that implicit priorities are somehow wrong (compiler bug?) but I couldn't decide how/why.

Provide mappings for all standard Java types

It's very common that you paste mappers for types like ZonedDateTime, UUID or Currency from project to project. It'd be nice to have those covered for kebs.

It might be done with typeclasses like Reads, Writes and CaseClass1Rep (or variant). This will allow us to easily write unmarshallers for Akka HTTP matchers and such.

User-facing data, like JSON or PathMatchers need special handling as throwing Exception is not the best idea ex. for spray-json.

hstore and array support is a bit messy

Ping me for more details but:

hstore implicit is too generic - disallows usage of custom Isomorphisms

seq/list implicit is missing instance for tagged type

etc.

Intelligent `copy`

Sometimes it'd be convenient to have a copy that tries to patch a domain object with request object either by names or by types. Generic copy is generally fine but it's tedious to write it by hand and what's most important when you're changing request or domain object it's easy to forget to update copy params.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.