From 9b75dd0bf967c2a75f3e31656f13955c21f1ca5d Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 12:38:22 +0200 Subject: [PATCH 01/18] Remove circe and migrate to openapi --- build.sbt | 2 +- .../hireproof/screening/CirceInstances.scala | 93 ------------------- .../io/hireproof/screening/Constraint.scala | 34 +++---- .../screening/OpenApiInstances.scala | 14 +++ .../io/hireproof/screening/Selection.scala | 9 -- .../io/hireproof/screening/Validation.scala | 4 +- .../io/hireproof/screening/Violation.scala | 39 ++++---- .../io/hireproof/screening/package.scala | 2 +- .../io/hireproof/screening/validations.scala | 25 +---- 9 files changed, 50 insertions(+), 172 deletions(-) delete mode 100644 modules/core/src/main/scala/io/hireproof/screening/CirceInstances.scala create mode 100644 modules/core/src/main/scala/io/hireproof/screening/OpenApiInstances.scala diff --git a/build.sbt b/build.sbt index f4722a0..f577642 100755 --- a/build.sbt +++ b/build.sbt @@ -51,7 +51,7 @@ lazy val root = module(identifier = None) lazy val core = module(identifier = Some("core")) .settings( libraryDependencies ++= - "io.circe" %%% "circe-parser" % Version.Circe :: + "io.hireproof" %%% "openapi-core" % "0.0.0+7-709f225a+20220422-1236-SNAPSHOT" :: "org.typelevel" %%% "cats-core" % Version.Cats :: "org.scalameta" %%% "munit" % Version.Munit % "test" :: Nil diff --git a/modules/core/src/main/scala/io/hireproof/screening/CirceInstances.scala b/modules/core/src/main/scala/io/hireproof/screening/CirceInstances.scala deleted file mode 100644 index 3793ff4..0000000 --- a/modules/core/src/main/scala/io/hireproof/screening/CirceInstances.scala +++ /dev/null @@ -1,93 +0,0 @@ -package io.hireproof.screening - -import cats.data.{NonEmptyList, NonEmptyMap} -import cats.syntax.all._ -import io.circe.syntax._ -import io.circe.{CursorOp, Decoder, Encoder, Json, JsonObject, KeyDecoder, KeyEncoder} - -import java.util.concurrent.TimeUnit -import scala.concurrent.duration.FiniteDuration - -trait CirceInstances { - implicit val decoderTimeUnit: Decoder[TimeUnit] = Decoder[String].emap { value => - Either.catchOnly[IllegalArgumentException](TimeUnit.valueOf(value)).leftMap(_ => "TimeUnit") - } - - implicit val encoderTimeUnit: Encoder[TimeUnit] = Encoder[String].contramap(_.name()) - - implicit val decoderFiniteDuration: Decoder[FiniteDuration] = Decoder.instance { cursor => - for { - length <- cursor.get[Long]("length") - unit <- cursor.get[TimeUnit]("unit") - } yield FiniteDuration(length, unit) - } - - implicit val encoderFiniteDuration: Encoder[FiniteDuration] = Encoder.instance { duration => - Json.obj("length" := duration.length, "unit" := duration.unit) - } - - implicit val decoderConstraintRule: Decoder[Constraint.Rule] = Decoder.instance { cursor => - for { - identifier <- cursor.get[String]("identifier").map(Constraint.Identifier.apply) - reference <- cursor.get[Option[Json]]("reference") - delta <- cursor.get[Option[Double]]("delta") - equal <- cursor.get[Option[Boolean]]("equal") - } yield Constraint.Rule(identifier, reference, delta, equal) - } - - implicit val decoderConstraint: Decoder[Constraint] = decoderConstraintRule.or { - Decoder.instance { cursor => - for { - left <- cursor.get[Set[Constraint]]("left") - right <- cursor.get[Set[Constraint]]("right") - } yield Constraint.Or(left, right) - } - } - - implicit val encoderConstraint: Encoder.AsObject[Constraint] = Encoder.AsObject.instance { - case Constraint.Or(left, right) => - JsonObject("left" := left, "right" := right) - case Constraint.Rule(identifier, reference, delta, equal) => - JsonObject( - "identifier" := identifier.value, - "reference" := reference, - "delta" := delta, - "equal" := equal - ).filter { case (_, json) => !json.isNull } - } - - implicit val decoderViolation: Decoder[Violation] = Decoder.instance { cursor => - cursor.get[String]("type").flatMap { - case "validation" => - (cursor.as[Constraint], cursor.get[Json]("actual")).mapN(Violation.Validation.apply) - case "conflict" => cursor.get[Json]("actual").map(Violation.Conflict.apply) - case "invalid" => - (cursor.get[Option[Json]]("reference"), cursor.get[Json]("actual")).mapN(Violation.Invalid.apply) - case "missing" => cursor.get[Option[Json]]("reference").map(Violation.Missing.apply) - case "unknown" => cursor.get[Json]("actual").map(Violation.Unknown.apply) - } - } - - implicit val encoderViolation: Encoder.AsObject[Violation] = Encoder.AsObject.instance { - case Violation.Validation(constraint, actual) => - JsonObject("type" := "validation", "actual" := actual) deepMerge constraint.asJsonObject - case Violation.Conflict(actual) => JsonObject("type" := "conflict", "actual" := actual) - case Violation.Invalid(reference, actual) => - JsonObject("type" := "invalid", "reference" := reference, "actual" := actual) - case Violation.Missing(reference) => JsonObject("type" := "missing", "reference" := reference) - case Violation.Unknown(actual) => JsonObject("type" := "unknown", "actual" := actual) - } - - implicit val keyEncoderCursorHistory: KeyEncoder[List[CursorOp]] = KeyEncoder.instance(CursorOp.opsToPath) - - implicit val keyEncoderSelectionHistory: KeyEncoder[Selection.History] = KeyEncoder.instance(_.toJsonPath) - - implicit val keyDecoderSelectionHistory: KeyDecoder[Selection.History] = - KeyDecoder.instance(Selection.History.parse(_).toOption) - - implicit val decoderViolations: Decoder[Violations] = - Decoder[NonEmptyMap[Selection.History, NonEmptyList[Violation]]].map(Violations.apply) - - implicit val encoderViolations: Encoder[Violations] = - Encoder[NonEmptyMap[Selection.History, NonEmptyList[Violation]]].contramap(_.toNem) -} diff --git a/modules/core/src/main/scala/io/hireproof/screening/Constraint.scala b/modules/core/src/main/scala/io/hireproof/screening/Constraint.scala index 19cd1eb..ef1f721 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Constraint.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Constraint.scala @@ -1,8 +1,8 @@ package io.hireproof.screening import cats.syntax.all._ -import io.circe.syntax._ -import io.circe.{Encoder, Json} +import io.hireproof.openapi.{Encoder, OpenApi} +import io.hireproof.openapi.syntax._ import java.time.ZonedDateTime import scala.concurrent.duration.FiniteDuration @@ -22,7 +22,7 @@ object Constraint { final case class Rule( identifier: Constraint.Identifier, - reference: Option[Json], + reference: Option[OpenApi], delta: Option[Double], equal: Option[Boolean] ) extends Constraint { @@ -42,7 +42,6 @@ object Constraint { val Contains: Constraint.Identifier = Identifier("contains") val Email: Constraint.Identifier = Identifier("email") val GreaterThan: Constraint.Identifier = Identifier("greaterThan") - val Json: Constraint.Identifier = Identifier("json") val LessThan: Constraint.Identifier = Identifier("lessThan") val Equal: Constraint.Identifier = Identifier("equal") val Matches: Constraint.Identifier = Identifier("matches") @@ -51,38 +50,32 @@ object Constraint { } def apply[A: Encoder](identifier: Identifier, reference: A, delta: Double, equal: Boolean): Constraint = - Rule(identifier, reference.asJson.some, delta.some, equal.some) + Rule(identifier, reference.asOpenApi.some, delta.some, equal.some) def apply[A: Encoder](identifier: Identifier, reference: A, delta: Double): Constraint = - Rule(identifier, reference.asJson.some, delta.some, equal = none) + Rule(identifier, reference.asOpenApi.some, delta.some, equal = none) def apply[A: Encoder](identifier: Identifier, reference: A, equal: Boolean): Constraint = - Rule(identifier, reference.asJson.some, delta = none, equal.some) + Rule(identifier, reference.asOpenApi.some, delta = none, equal.some) def apply[A: Encoder](identifier: Identifier, reference: A): Constraint = - Rule(identifier, reference.asJson.some, delta = none, equal = none) + Rule(identifier, reference.asOpenApi.some, delta = none, equal = none) def apply(identifier: Identifier): Constraint = Rule(identifier, reference = none, delta = none, equal = none) object collection { - def contains[A: Encoder](reference: A): Constraint = Constraint(Identifier.Contains, reference.asJson) + def contains[A: Encoder](reference: A): Constraint = Constraint(Identifier.Contains, reference) } object duration { def equal(reference: FiniteDuration): Constraint = Constraint(Identifier.Equal, reference) - def greaterThan(reference: FiniteDuration, equal: Boolean = true): Constraint = Constraint(Identifier.GreaterThan, reference, equal) - def lessThan(reference: FiniteDuration, equal: Boolean = true): Constraint = Constraint(Identifier.LessThan, reference, equal) } - def json(reference: String): Constraint = Constraint(Identifier.Json, reference) - object number { def equal[A: Encoder](reference: A, delta: Double = 0d): Constraint = Constraint(Identifier.Equal, reference, delta) - def greaterThan[A: Encoder](reference: A, delta: Double = 0d, equal: Boolean = true): Constraint = Constraint(Identifier.GreaterThan, reference, delta, equal) - def lessThan[A: Encoder](reference: A, delta: Double = 0d, equal: Boolean = true): Constraint = Constraint(Identifier.LessThan, reference, delta, equal) } @@ -93,19 +86,16 @@ object Constraint { object text { val email: Constraint = Constraint(Identifier.Email) - - def equal(reference: String): Constraint = Constraint(Identifier.Equal, reference) - - def matches(regex: Regex): Constraint = Constraint(Identifier.Matches, regex.regex) + def equal(reference: String): Constraint = Constraint(Identifier.Equal, OpenApi.fromString(reference)) + def matches(regex: Regex): Constraint = Constraint(Identifier.Matches, OpenApi.fromString(regex.regex)) } val required: Constraint = Constraint(Identifier.Required) object time { def after(reference: ZonedDateTime, equal: Boolean = true): Constraint = - Constraint(Identifier.After, reference, equal) - + Constraint(Identifier.After, OpenApi.fromString(reference.toString), equal) def before(reference: ZonedDateTime, equal: Boolean = true): Constraint = - Constraint(Identifier.Before, reference, equal) + Constraint(Identifier.Before, OpenApi.fromString(reference.toString), equal) } } diff --git a/modules/core/src/main/scala/io/hireproof/screening/OpenApiInstances.scala b/modules/core/src/main/scala/io/hireproof/screening/OpenApiInstances.scala new file mode 100644 index 0000000..956345a --- /dev/null +++ b/modules/core/src/main/scala/io/hireproof/screening/OpenApiInstances.scala @@ -0,0 +1,14 @@ +package io.hireproof.screening + +import io.hireproof.openapi.syntax._ +import io.hireproof.openapi.{Encoder, OpenApi} + +import scala.concurrent.duration.{FiniteDuration, TimeUnit} + +trait OpenApiInstances { + implicit val encoderTimeUnit: Encoder[TimeUnit] = Encoder[String].contramap(_.name()) + + implicit val encoderFiniteDuration: Encoder[FiniteDuration] = Encoder.instance { duration => + OpenApi.obj("length" := duration.length, "unit" := duration.unit) + } +} diff --git a/modules/core/src/main/scala/io/hireproof/screening/Selection.scala b/modules/core/src/main/scala/io/hireproof/screening/Selection.scala index 276bf41..5138d1e 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Selection.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Selection.scala @@ -14,23 +14,14 @@ object Selection { final case class History(toChain: Chain[Selection]) extends AnyVal { def /(field: String): History = append(Field(field)) - def /(index: Int): History = append(Index(index)) - def /(selection: Selection): History = append(selection) - def append(selection: Selection): History = History(toChain append selection) - def /:(field: String): History = prepend(Field(field)) - def /:(index: Int): History = prepend(Index(index)) - def /:(selection: Selection): History = prepend(selection) - def prepend(selection: Selection): History = History(toChain prepend selection) - def ++(history: History): History = History(toChain ++ history.toChain) - def isRoot: Boolean = toChain.isEmpty def up: Selection.History = toChain.initLast match { diff --git a/modules/core/src/main/scala/io/hireproof/screening/Validation.scala b/modules/core/src/main/scala/io/hireproof/screening/Validation.scala index 4cf7b30..1a743bf 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Validation.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Validation.scala @@ -4,7 +4,7 @@ import cats.Applicative import cats.arrow.Arrow import cats.data.{NonEmptyList, Validated, ValidatedNel} import cats.syntax.all._ -import io.circe.{Encoder, Json} +import io.hireproof.openapi.{Encoder, OpenApi} import io.hireproof.screening.validations._ import scala.reflect.ClassTag @@ -33,7 +33,7 @@ abstract class Validation[-I, +O] { final def withConstraint(constraint: Constraint): Validation[I, O] = Validation(Set(constraint))(run(_).leftMap { violations => - val actual = violations.collectFirstSome(_.toActual).getOrElse(Json.Null) + val actual = violations.collectFirstSome(_.toActual).getOrElse(OpenApi.Null) NonEmptyList.one(Violation(constraint, actual)) }) diff --git a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala index 06c6fb5..12ed3ad 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala @@ -1,46 +1,45 @@ package io.hireproof.screening import cats.syntax.all._ -import io.circe.syntax._ -import io.circe.{Encoder, Json} +import io.hireproof.openapi.{Encoder, OpenApi} +import io.hireproof.openapi.syntax._ sealed abstract class Violation extends Product with Serializable { def toConstraint: Option[Constraint] - - def toActual: Option[Json] + def toActual: Option[OpenApi] } object Violation { - final case class Validation(constraint: Constraint, actual: Json) extends Violation { + final case class Validation(constraint: Constraint, actual: OpenApi) extends Violation { override def toConstraint: Option[Constraint] = constraint.some - override def toActual: Option[Json] = actual.some + override def toActual: Option[OpenApi] = actual.some } - final case class Conflict(actual: Json) extends Violation { + final case class Conflict(actual: OpenApi) extends Violation { override def toConstraint: Option[Constraint] = none - override def toActual: Option[Json] = actual.some + override def toActual: Option[OpenApi] = actual.some } - final case class Invalid(reference: Option[Json], actual: Json) extends Violation { + final case class Invalid(reference: Option[OpenApi], actual: OpenApi) extends Violation { override def toConstraint: Option[Constraint] = none - override def toActual: Option[Json] = actual.some + override def toActual: Option[OpenApi] = actual.some } - final case class Missing(reference: Option[Json]) extends Violation { + final case class Missing(reference: Option[String]) extends Violation { override def toConstraint: Option[Constraint] = none - override def toActual: Option[Json] = none + override def toActual: Option[OpenApi] = none } - final case class Unknown(actual: Json) extends Violation { + final case class Unknown(actual: OpenApi) extends Violation { override def toConstraint: Option[Constraint] = none - override def toActual: Option[Json] = actual.some + override def toActual: Option[OpenApi] = actual.some } - def apply[A: Encoder](constraint: Constraint, actual: A): Violation = Validation(constraint, actual.asJson) - def conflict[A: Encoder](actual: A): Violation = Conflict(actual.asJson) - def invalid[A: Encoder](reference: A, actual: A): Violation = Invalid(reference.asJson.some, actual.asJson) - def invalid[A: Encoder](actual: A): Violation = Invalid(reference = none, actual.asJson) + def apply[A: Encoder](constraint: Constraint, actual: A): Violation = Validation(constraint, actual.asOpenApi) + def conflict[A: Encoder](actual: A): Violation = Conflict(actual.asOpenApi) + def invalid[A: Encoder](reference: A, actual: A): Violation = Invalid(reference.asOpenApi.some, actual.asOpenApi) + def invalid[A: Encoder](actual: A): Violation = Invalid(reference = none, actual.asOpenApi) val missing: Violation = Missing(reference = none) - def missing[A: Encoder](reference: A): Violation = Missing(reference.asJson.some) - def unknown[A: Encoder](actual: A): Violation = Unknown(actual.asJson) + def missing(reference: String): Violation = Missing(reference.some) + def unknown(actual: OpenApi): Violation = Unknown(actual) } diff --git a/modules/core/src/main/scala/io/hireproof/screening/package.scala b/modules/core/src/main/scala/io/hireproof/screening/package.scala index 64ace35..21971e9 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/package.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/package.scala @@ -3,7 +3,7 @@ package io.hireproof import cats.data.ValidatedNel import cats.syntax.all._ -package object screening extends CirceInstances { +package object screening extends OpenApiInstances { val hist: Selection.History = Selection.History.Root implicit class RichValidatedNel[E, A](val validated: ValidatedNel[E, A]) extends AnyVal { diff --git a/modules/core/src/main/scala/io/hireproof/screening/validations.scala b/modules/core/src/main/scala/io/hireproof/screening/validations.scala index fc69ee5..05ab392 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/validations.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/validations.scala @@ -1,10 +1,8 @@ package io.hireproof.screening -import cats.data.Chain import cats.syntax.all._ import cats.{Eq, Traverse, UnorderedFoldable} -import io.circe.{Decoder, Encoder, Json, JsonObject} -import io.circe.parser.parse +import io.hireproof.openapi.Encoder import java.time._ import java.time.format.DateTimeParseException @@ -85,26 +83,6 @@ object validations { Validation.condNel(Constraint.duration.equal(reference))(_ == reference) } - object json { - def apply[A: Decoder](reference: String): Validation[Json, A] = - Validation.fromOptionNel(Constraint.json(reference))(_.as[A].toOption) - - def field(name: String): Validation[Json, Json] = - Validation.fromOptionNel(Constraint.json(reference = name))(_.hcursor.downField(name).focus) - - def index(i: Int): Validation[Json, Json] = - Validation.fromOptionNel(Constraint.json(reference = String.valueOf(i)))(_.hcursor.downN(i).focus) - - val array: Validation[Json, Chain[Json]] = - Validation.fromOptionNel(Constraint.json(reference = "[]"))(_.as[Chain[Json]].toOption) - - val obj: Validation[Json, JsonObject] = - Validation.fromOptionNel(Constraint.json(reference = "{}"))(_.as[JsonObject].toOption) - - val string: Validation[Json, String] = - Validation.fromOptionNel(Constraint.json(reference = "String"))(_.asString) - } - object number { def equal[I: Numeric: Encoder](reference: I, delta: I): Validation[I, Unit] = Validation.condNel[I](Constraint.number.equal(reference, delta.toDouble)) { input => @@ -183,7 +161,6 @@ object validations { val offsetDateTime: Validation[String, OffsetDateTime] = catchOnly[DateTimeParseException]("offsetDateTime")(OffsetDateTime.parse) val offsetTime: Validation[String, OffsetTime] = catchOnly[DateTimeParseException]("offsetTime")(OffsetTime.parse) - val json: Validation[String, Json] = parsing("json")(parse(_).toOption) val short: Validation[String, Short] = parsing("short")(_.toShortOption) val uuid: Validation[String, UUID] = catchOnly[IllegalArgumentException]("uuid")(UUID.fromString) val zonedDateTime: Validation[String, ZonedDateTime] = From 35a161ba298cc0a41f75ced61f032282e1f6b96d Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 13:04:28 +0200 Subject: [PATCH 02/18] Update openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index f577642..921b7e6 100755 --- a/build.sbt +++ b/build.sbt @@ -51,7 +51,7 @@ lazy val root = module(identifier = None) lazy val core = module(identifier = Some("core")) .settings( libraryDependencies ++= - "io.hireproof" %%% "openapi-core" % "0.0.0+7-709f225a+20220422-1236-SNAPSHOT" :: + "io.hireproof" %%% "openapi-core" % "0.0.0+8-73ac602a-SNAPSHOT" :: "org.typelevel" %%% "cats-core" % Version.Cats :: "org.scalameta" %%% "munit" % Version.Munit % "test" :: Nil From 2954bf69d35ee130fb9dba89c6f51d080f1da852 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 13:18:03 +0200 Subject: [PATCH 03/18] Upgrade openapi --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 921b7e6..13c82c5 100755 --- a/build.sbt +++ b/build.sbt @@ -5,6 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" + val OpenApi = "0.0.0+9-5d3ca43e-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" @@ -51,7 +52,7 @@ lazy val root = module(identifier = None) lazy val core = module(identifier = Some("core")) .settings( libraryDependencies ++= - "io.hireproof" %%% "openapi-core" % "0.0.0+8-73ac602a-SNAPSHOT" :: + "io.hireproof" %%% "openapi-core" % Version.OpenApi :: "org.typelevel" %%% "cats-core" % Version.Cats :: "org.scalameta" %%% "munit" % Version.Munit % "test" :: Nil From d196358b4efdc4d88d9d027a39e74689d502dce1 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 13:23:00 +0200 Subject: [PATCH 04/18] Use OpenApi reference in Violation.Missing --- .../src/main/scala/io/hireproof/screening/Violation.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala index 12ed3ad..36883ba 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala @@ -25,7 +25,7 @@ object Violation { override def toActual: Option[OpenApi] = actual.some } - final case class Missing(reference: Option[String]) extends Violation { + final case class Missing(reference: Option[OpenApi]) extends Violation { override def toConstraint: Option[Constraint] = none override def toActual: Option[OpenApi] = none } @@ -40,6 +40,6 @@ object Violation { def invalid[A: Encoder](reference: A, actual: A): Violation = Invalid(reference.asOpenApi.some, actual.asOpenApi) def invalid[A: Encoder](actual: A): Violation = Invalid(reference = none, actual.asOpenApi) val missing: Violation = Missing(reference = none) - def missing(reference: String): Violation = Missing(reference.some) + def missing[A: Encoder](reference: A): Violation = Missing(reference.asOpenApi.some) def unknown(actual: OpenApi): Violation = Unknown(actual) } From f645add73014be5f8cce5187cdbccccadcbbd33e Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 13:32:41 +0200 Subject: [PATCH 05/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 13c82c5..091b833 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+9-5d3ca43e-SNAPSHOT" + val OpenApi = "0.0.0+10-e1ecf0e7-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 4e81f8cff6ae575189b18a033667eaeb3a0e9462 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 14:45:20 +0200 Subject: [PATCH 06/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 091b833..44df1b1 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+10-e1ecf0e7-SNAPSHOT" + val OpenApi = "0.0.0+12-b568907a-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From ca31d73a843acb58d85f2b79dc10cd9453839356 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 14:55:05 +0200 Subject: [PATCH 07/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 44df1b1..7d8d7f3 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+12-b568907a-SNAPSHOT" + val OpenApi = "0.0.0+13-8100f474-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From d2845bcd292d89c48cbeb673d73dadee6eb9145f Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 14:57:06 +0200 Subject: [PATCH 08/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 7d8d7f3..bd46f03 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+13-8100f474-SNAPSHOT" + val OpenApi = "0.0.0+14-978ec379-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 3838b653d44d7c9b07dcc6ab046160b6b0eed1b5 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 15:21:12 +0200 Subject: [PATCH 09/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index bd46f03..20ae083 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+14-978ec379-SNAPSHOT" + val OpenApi = "0.0.0+15-30b41ea4-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 4e99a861d72f11bbfee2725341f3dfb038e53127 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 17:18:00 +0200 Subject: [PATCH 10/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 20ae083..2641089 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+15-30b41ea4-SNAPSHOT" + val OpenApi = "0.0.0+16-6aed679e-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From d89a7c9f2c5cdf8ce9587bea78785eed7bb8c046 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 17:35:30 +0200 Subject: [PATCH 11/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 2641089..d3669ec 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+16-6aed679e-SNAPSHOT" + val OpenApi = "0.0.0+17-473c2b0a-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 778b4c3cf28e4c82f0113d6052c5b50c8f666ad6 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Fri, 22 Apr 2022 17:37:50 +0200 Subject: [PATCH 12/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d3669ec..57ee12d 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+17-473c2b0a-SNAPSHOT" + val OpenApi = "0.0.0+18-9abe5ff0-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 2dcf52deb8c173145f3ed5fcd9a111cbac004eef Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Sun, 24 Apr 2022 12:22:47 +0200 Subject: [PATCH 13/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 57ee12d..c29c29d 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+18-9abe5ff0-SNAPSHOT" + val OpenApi = "0.0.0+22-8e746f25-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From b7f25500db4d31ccfced0cf27d90d5b244589b22 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Sun, 24 Apr 2022 12:35:30 +0200 Subject: [PATCH 14/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index c29c29d..a481e8b 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+22-8e746f25-SNAPSHOT" + val OpenApi = "0.0.0+23-04dab2e0-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 9a7729dda1809d009c8d63a0e73e1a63c87e89f5 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Mon, 25 Apr 2022 10:58:42 +0200 Subject: [PATCH 15/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a481e8b..8530da9 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+23-04dab2e0-SNAPSHOT" + val OpenApi = "0.0.0+28-ff20da3a-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 0a02bf114e5cd0bc0cc4c143436b1d7ded09faba Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Mon, 25 Apr 2022 14:09:04 +0200 Subject: [PATCH 16/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 8530da9..9afcb60 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+28-ff20da3a-SNAPSHOT" + val OpenApi = "0.0.0+29-78329e0b-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 038be15c828237933b529ad26c3312235f1aded4 Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Mon, 25 Apr 2022 22:21:29 +0200 Subject: [PATCH 17/18] Upgrade openapi --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 9afcb60..284dd11 100755 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val Version = new { val Circe = "0.14.1" val Java = "11" val Munit = "0.7.29" - val OpenApi = "0.0.0+29-78329e0b-SNAPSHOT" + val OpenApi = "0.0.0+34-7853f5fb-SNAPSHOT" val Scala213 = "2.13.8" val Scala3 = "3.1.2" val ScalaJavaTime = "2.3.0" From 8313ea5353ac28f3010c3f102e75431af6c6f00c Mon Sep 17 00:00:00 2001 From: Niklas Klein Date: Tue, 26 Apr 2022 11:01:52 +0200 Subject: [PATCH 18/18] Fix Violation.unknown --- .../src/main/scala/io/hireproof/screening/Violation.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala index 36883ba..52d3759 100644 --- a/modules/core/src/main/scala/io/hireproof/screening/Violation.scala +++ b/modules/core/src/main/scala/io/hireproof/screening/Violation.scala @@ -37,9 +37,10 @@ object Violation { def apply[A: Encoder](constraint: Constraint, actual: A): Violation = Validation(constraint, actual.asOpenApi) def conflict[A: Encoder](actual: A): Violation = Conflict(actual.asOpenApi) - def invalid[A: Encoder](reference: A, actual: A): Violation = Invalid(reference.asOpenApi.some, actual.asOpenApi) + def invalid[A: Encoder, B: Encoder](reference: A, actual: B): Violation = + Invalid(reference.asOpenApi.some, actual.asOpenApi) def invalid[A: Encoder](actual: A): Violation = Invalid(reference = none, actual.asOpenApi) val missing: Violation = Missing(reference = none) def missing[A: Encoder](reference: A): Violation = Missing(reference.asOpenApi.some) - def unknown(actual: OpenApi): Violation = Unknown(actual) + def unknown[A: Encoder](actual: A): Violation = Unknown(actual.asOpenApi) }