Skip to content

Commit

Permalink
Fixed recursive instances, added more codec tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hnaderi committed Sep 16, 2022
1 parent 492361c commit fe185a6
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 9 deletions.
4 changes: 3 additions & 1 deletion circe/src/main/scala/CirceBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ package dev.hnaderi.k8s
package circe

import dev.hnaderi.k8s.utils.Builder
import io.circe._
import io.circe.Json
import io.circe.syntax._

private[circe] object CirceBuilder extends Builder[Json] {
/* NOTE that this import is required to use correct implicit instances */
import io.circe.Encoder._

override def of(str: String): Json = str.asJson

Expand Down
4 changes: 3 additions & 1 deletion circe/src/main/scala/CirceReader.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
package dev.hnaderi.k8s.circe

import dev.hnaderi.k8s.utils.Reader
import io.circe._
import io.circe.Decoder
import io.circe.Json
import io.circe.JsonObject

private[circe] object CirceReader extends Reader[Json] {
/* NOTE that this import is required to use correct implicit instances */
Expand Down
14 changes: 13 additions & 1 deletion circe/src/test/scala/CirceSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,19 @@

package dev.hnaderi.k8s.circe

import dev.hnaderi.k8s.KObject
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
import dev.hnaderi.k8s.test.CodecSuite
import io.circe.Json
import io.circe.syntax._
import org.scalacheck.Prop.forAll

class CirceSuite extends CodecSuite[Json]
class CirceSuite extends CodecSuite[Json] {
property("Circe json must be reversible") {
forAll { (obj: KObject) =>
val json = obj.asJson
val dec = json.as[KObject]
assertEquals(dec, Right(obj))
}
}
}
8 changes: 7 additions & 1 deletion objects/src/main/scala/ResourceKind.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@

package dev.hnaderi.k8s

import dev.hnaderi.k8s.utils.Reader
import dev.hnaderi.k8s.utils.Builder
import dev.hnaderi.k8s.utils.Decoder
import dev.hnaderi.k8s.utils.Encoder
import dev.hnaderi.k8s.utils.Reader

final case class ResourceKind(
group: String,
Expand All @@ -39,4 +41,8 @@ trait KObject extends Serializable with Product {
object KObject {
implicit def decoder[T: Reader]: Decoder[T, KObject] =
ResourceCodecs.resourceDecoder
implicit def encoder[T: Builder]: Encoder[KObject, T] =
new Encoder[KObject, T] {
def apply(r: KObject): T = r.foldTo[T]
}
}
15 changes: 13 additions & 2 deletions play-json/src/test/scala/PlayJsonSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,18 @@

package dev.hnaderi.k8s.playJson

import play.api.libs.json.JsValue
import dev.hnaderi.k8s.KObject
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
import dev.hnaderi.k8s.test.CodecSuite
import org.scalacheck.Prop.forAll
import play.api.libs.json._

class PlayJsonSuite extends CodecSuite[JsValue]
class PlayJsonSuite extends CodecSuite[JsValue] {
property("Play json must be reversible") {
forAll { (obj: KObject) =>
val json = Json.toJson(obj)
val dec = json.validate[KObject]
assertEquals(dec, JsSuccess(obj))
}
}
}
19 changes: 19 additions & 0 deletions spray-json/src/main/scala/DecodeError.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright 2022 Hossein Naderi
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package dev.hnaderi.k8s.sprayJson

final case class DecodeError(msg: String) extends Exception(msg)
6 changes: 5 additions & 1 deletion spray-json/src/main/scala/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ import spray.json._
package object sprayJson {
implicit val sprayJsonBuilder: Builder[JsValue] = SprayBuilder
implicit val sprayJsonReader: Reader[JsValue] = SprayReader
implicit def k8sJsonFormat[T](implicit
implicit def k8sJsonWriter[T](implicit
enc: Encoder[T, JsValue]
): JsonWriter[T] = JsonWriter.func2Writer(enc(_))
implicit def k8sJsonReader[T](implicit
dec: Decoder[JsValue, T]
): JsonReader[T] =
JsonReader.func2Reader(dec(_).fold(err => throw DecodeError(err), identity))
}
15 changes: 13 additions & 2 deletions spray-json/src/test/scala/SprayJsonSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,18 @@

package dev.hnaderi.k8s.sprayJson

import spray.json._
import dev.hnaderi.k8s.KObject
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
import dev.hnaderi.k8s.test.CodecSuite
import org.scalacheck.Prop.forAll
import spray.json._

class SprayJsonSuite extends CodecSuite[JsValue]
class SprayJsonSuite extends CodecSuite[JsValue] {
property("Spray json must be reversible") {
forAll { (obj: KObject) =>
val json = obj.toJson
val dec = json.convertTo[KObject]
assertEquals(dec, obj)
}
}
}

0 comments on commit fe185a6

Please sign in to comment.