Skip to content

Commit fe185a6

Browse files
committed
Fixed recursive instances, added more codec tests
1 parent 492361c commit fe185a6

File tree

8 files changed

+76
-9
lines changed

8 files changed

+76
-9
lines changed

circe/src/main/scala/CirceBuilder.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ package dev.hnaderi.k8s
1818
package circe
1919

2020
import dev.hnaderi.k8s.utils.Builder
21-
import io.circe._
21+
import io.circe.Json
2222
import io.circe.syntax._
2323

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

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

circe/src/main/scala/CirceReader.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package dev.hnaderi.k8s.circe
1818

1919
import dev.hnaderi.k8s.utils.Reader
20-
import io.circe._
20+
import io.circe.Decoder
21+
import io.circe.Json
22+
import io.circe.JsonObject
2123

2224
private[circe] object CirceReader extends Reader[Json] {
2325
/* NOTE that this import is required to use correct implicit instances */

circe/src/test/scala/CirceSuite.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,19 @@
1616

1717
package dev.hnaderi.k8s.circe
1818

19+
import dev.hnaderi.k8s.KObject
20+
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
1921
import dev.hnaderi.k8s.test.CodecSuite
2022
import io.circe.Json
23+
import io.circe.syntax._
24+
import org.scalacheck.Prop.forAll
2125

22-
class CirceSuite extends CodecSuite[Json]
26+
class CirceSuite extends CodecSuite[Json] {
27+
property("Circe json must be reversible") {
28+
forAll { (obj: KObject) =>
29+
val json = obj.asJson
30+
val dec = json.as[KObject]
31+
assertEquals(dec, Right(obj))
32+
}
33+
}
34+
}

objects/src/main/scala/ResourceKind.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package dev.hnaderi.k8s
1818

19-
import dev.hnaderi.k8s.utils.Reader
19+
import dev.hnaderi.k8s.utils.Builder
2020
import dev.hnaderi.k8s.utils.Decoder
21+
import dev.hnaderi.k8s.utils.Encoder
22+
import dev.hnaderi.k8s.utils.Reader
2123

2224
final case class ResourceKind(
2325
group: String,
@@ -39,4 +41,8 @@ trait KObject extends Serializable with Product {
3941
object KObject {
4042
implicit def decoder[T: Reader]: Decoder[T, KObject] =
4143
ResourceCodecs.resourceDecoder
44+
implicit def encoder[T: Builder]: Encoder[KObject, T] =
45+
new Encoder[KObject, T] {
46+
def apply(r: KObject): T = r.foldTo[T]
47+
}
4248
}

play-json/src/test/scala/PlayJsonSuite.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,18 @@
1616

1717
package dev.hnaderi.k8s.playJson
1818

19-
import play.api.libs.json.JsValue
19+
import dev.hnaderi.k8s.KObject
20+
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
2021
import dev.hnaderi.k8s.test.CodecSuite
22+
import org.scalacheck.Prop.forAll
23+
import play.api.libs.json._
2124

22-
class PlayJsonSuite extends CodecSuite[JsValue]
25+
class PlayJsonSuite extends CodecSuite[JsValue] {
26+
property("Play json must be reversible") {
27+
forAll { (obj: KObject) =>
28+
val json = Json.toJson(obj)
29+
val dec = json.validate[KObject]
30+
assertEquals(dec, JsSuccess(obj))
31+
}
32+
}
33+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2022 Hossein Naderi
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package dev.hnaderi.k8s.sprayJson
18+
19+
final case class DecodeError(msg: String) extends Exception(msg)

spray-json/src/main/scala/package.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ import spray.json._
2222
package object sprayJson {
2323
implicit val sprayJsonBuilder: Builder[JsValue] = SprayBuilder
2424
implicit val sprayJsonReader: Reader[JsValue] = SprayReader
25-
implicit def k8sJsonFormat[T](implicit
25+
implicit def k8sJsonWriter[T](implicit
2626
enc: Encoder[T, JsValue]
2727
): JsonWriter[T] = JsonWriter.func2Writer(enc(_))
28+
implicit def k8sJsonReader[T](implicit
29+
dec: Decoder[JsValue, T]
30+
): JsonReader[T] =
31+
JsonReader.func2Reader(dec(_).fold(err => throw DecodeError(err), identity))
2832
}

spray-json/src/test/scala/SprayJsonSuite.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,18 @@
1616

1717
package dev.hnaderi.k8s.sprayJson
1818

19-
import spray.json._
19+
import dev.hnaderi.k8s.KObject
20+
import dev.hnaderi.k8s.scalacheck.Generators.arbitraryKObjects
2021
import dev.hnaderi.k8s.test.CodecSuite
22+
import org.scalacheck.Prop.forAll
23+
import spray.json._
2124

22-
class SprayJsonSuite extends CodecSuite[JsValue]
25+
class SprayJsonSuite extends CodecSuite[JsValue] {
26+
property("Spray json must be reversible") {
27+
forAll { (obj: KObject) =>
28+
val json = obj.toJson
29+
val dec = json.convertTo[KObject]
30+
assertEquals(dec, obj)
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)