diff --git a/model/src/main/scala/za/co/absa/atum/model/utils/JsonSyntaxExtensions.scala b/model/src/main/scala/za/co/absa/atum/model/utils/JsonSyntaxExtensions.scala index 7b1c17e7..3f7b7457 100644 --- a/model/src/main/scala/za/co/absa/atum/model/utils/JsonSyntaxExtensions.scala +++ b/model/src/main/scala/za/co/absa/atum/model/utils/JsonSyntaxExtensions.scala @@ -42,7 +42,7 @@ object JsonSyntaxExtensions { } } - def asSafe[T: Decoder]: Either[io.circe.Error, T] = { + private def asSafe[T: Decoder]: Either[io.circe.Error, T] = { decode[T](jsonStr) } diff --git a/model/src/test/scala/za/co/absa/atum/model/dto/SerializationUtilsUnitTests.scala b/model/src/test/scala/za/co/absa/atum/model/dto/SerializationUtilsUnitTests.scala index 4c370477..045cb7e3 100644 --- a/model/src/test/scala/za/co/absa/atum/model/dto/SerializationUtilsUnitTests.scala +++ b/model/src/test/scala/za/co/absa/atum/model/dto/SerializationUtilsUnitTests.scala @@ -19,8 +19,8 @@ package za.co.absa.atum.model.dto import org.scalatest.flatspec.AnyFlatSpecLike import za.co.absa.atum.model.ResultValueType import za.co.absa.atum.model.dto.MeasureResultDTO.TypedValue -import za.co.absa.atum.model.testing.implicits.StringImplicits.StringLinearization import za.co.absa.atum.model.utils.JsonSyntaxExtensions._ +import za.co.absa.atum.testing.implicits.StringImplicits.StringLinearization import java.time.{ZoneId, ZoneOffset, ZonedDateTime} import java.util.UUID diff --git a/model/src/test/scala/za/co/absa/atum/testing/implicits/StringImplicits.scala b/model/src/test/scala/za/co/absa/atum/testing/implicits/StringImplicits.scala index ec64d206..c513cb77 100644 --- a/model/src/test/scala/za/co/absa/atum/testing/implicits/StringImplicits.scala +++ b/model/src/test/scala/za/co/absa/atum/testing/implicits/StringImplicits.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package za.co.absa.atum.model.testing.implicits +package za.co.absa.atum.testing.implicits object StringImplicits { implicit class StringLinearization(val str: String) extends AnyVal { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5fe116bd..3538c0e6 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -238,7 +238,6 @@ object Dependencies { } def readerDependencies(scalaVersion: Version): Seq[ModuleID] = { - val zioOrg = "dev.zio" val sbtOrg = "com.github.sbt" val sttpClient3Org = "com.softwaremill.sttp.client3" val typeLevelOrg = "org.typelevel" @@ -251,19 +250,11 @@ object Dependencies { val catsEffect = typeLevelOrg %% "cats-effect" % Versions.catsEffect % Optional val sttpCats = sttpClient3Org %% "cats" % Versions.sttpClient % Optional - // ZIO backend - val sttpZio = sttpClient3Org %% "zio" % Versions.sttpClient % Optional - - // testing - val zioTest = zioOrg %% "zio-test" % Versions.zio % Test - Seq( sttpCore, sttpCirce, sttpCats, - catsEffect, - sttpZio, - zioTest + catsEffect ) ++ testDependencies ++ jsonSerdeDependencies diff --git a/reader/src/main/scala-2.13/za/co/absa/atum/reader/implicits/zio.scala b/reader/src/main/scala-2.13/za/co/absa/atum/reader/implicits/zio.scala deleted file mode 100644 index 41651397..00000000 --- a/reader/src/main/scala-2.13/za/co/absa/atum/reader/implicits/zio.scala +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 ABSA Group Limited - * - * 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 za.co.absa.atum.reader.implicits - -import sttp.client3.impl.zio.RIOMonadAsyncError - -object zio { - implicit val ZIOMonad: RIOMonadAsyncError[Any] = new RIOMonadAsyncError[Any] -} diff --git a/reader/src/main/scala/za/co/absa/atum/reader/FlowReader.scala b/reader/src/main/scala/za/co/absa/atum/reader/FlowReader.scala index bddd17eb..f952dc56 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/FlowReader.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/FlowReader.scala @@ -19,7 +19,7 @@ package za.co.absa.atum.reader import sttp.client3.SttpBackend import sttp.monad.MonadError import za.co.absa.atum.model.types.basic.AtumPartitions -import za.co.absa.atum.reader.basic.ReaderWithPartitioningId +import za.co.absa.atum.reader.basic.{PartitioningIdProvider, Reader} import za.co.absa.atum.reader.server.ServerConfig /** @@ -32,7 +32,8 @@ import za.co.absa.atum.reader.server.ServerConfig * @tparam F - the effect type (e.g. Future, IO, Task, etc.) */ class FlowReader[F[_]](val mainFlowPartitioning: AtumPartitions) - (implicit serverConfig: ServerConfig, backend: SttpBackend[F, Any], ev: MonadError[F]) extends ReaderWithPartitioningId[F] { + (implicit serverConfig: ServerConfig, backend: SttpBackend[F, Any], ev: MonadError[F]) + extends Reader[F] with PartitioningIdProvider[F]{ override def partitioning: AtumPartitions = mainFlowPartitioning diff --git a/reader/src/main/scala/za/co/absa/atum/reader/PartitioningReader.scala b/reader/src/main/scala/za/co/absa/atum/reader/PartitioningReader.scala index 2c3782ff..7cd5db70 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/PartitioningReader.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/PartitioningReader.scala @@ -19,7 +19,7 @@ package za.co.absa.atum.reader import sttp.client3.SttpBackend import sttp.monad.MonadError import za.co.absa.atum.model.types.basic.AtumPartitions -import za.co.absa.atum.reader.basic.ReaderWithPartitioningId +import za.co.absa.atum.reader.basic.{PartitioningIdProvider, Reader} import za.co.absa.atum.reader.server.ServerConfig /** @@ -33,7 +33,7 @@ import za.co.absa.atum.reader.server.ServerConfig */ case class PartitioningReader[F[_]](partitioning: AtumPartitions) (implicit serverConfig: ServerConfig, backend: SttpBackend[F, Any], ev: MonadError[F]) - extends ReaderWithPartitioningId[F] { + extends Reader[F] with PartitioningIdProvider[F]{ def foo(): String = { // just to have some testable content "bar" diff --git a/reader/src/main/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningId.scala b/reader/src/main/scala/za/co/absa/atum/reader/basic/PartitioningIdProvider.scala similarity index 83% rename from reader/src/main/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningId.scala rename to reader/src/main/scala/za/co/absa/atum/reader/basic/PartitioningIdProvider.scala index e733da82..b32388a1 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningId.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/basic/PartitioningIdProvider.scala @@ -16,7 +16,6 @@ package za.co.absa.atum.reader.basic -import sttp.client3.SttpBackend import sttp.monad.MonadError import sttp.monad.syntax._ import za.co.absa.atum.model.dto.PartitioningWithIdDTO @@ -25,13 +24,11 @@ import za.co.absa.atum.model.types.basic.AtumPartitions import za.co.absa.atum.model.types.basic.AtumPartitionsOps import za.co.absa.atum.model.utils.JsonSyntaxExtensions.JsonSerializationSyntax import za.co.absa.atum.reader.basic.RequestResult.RequestResult -import za.co.absa.atum.reader.server.ServerConfig -abstract class ReaderWithPartitioningId[F[_]: MonadError](implicit serverConfig: ServerConfig, backend: SttpBackend[F, Any]) - extends Reader[F] { +trait PartitioningIdProvider[F[_]] {self: Reader[F] => def partitioning: AtumPartitions - protected def partitioningId(): F[RequestResult[Long]] = { + def partitioningId()(implicit monad: MonadError[F]): F[RequestResult[Long]] = { val encodedPartitioning = partitioning.toPartitioningDTO.asBase64EncodedJsonString val queryResult = getQuery[SingleSuccessResponse[PartitioningWithIdDTO]]("/api/v2/partitionings", Map("partitioning" -> encodedPartitioning)) queryResult.map{result => diff --git a/reader/src/main/scala/za/co/absa/atum/reader/basic/Reader.scala b/reader/src/main/scala/za/co/absa/atum/reader/basic/Reader.scala index 7d0d7b61..251d4b52 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/basic/Reader.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/basic/Reader.scala @@ -47,7 +47,3 @@ abstract class Reader[F[_]: MonadError](implicit val serverConfig: ServerConfig, response.map(_.toRequestResult) } } - -object Reader { - -} diff --git a/reader/src/main/scala/za/co/absa/atum/reader/implicits/future.scala b/reader/src/main/scala/za/co/absa/atum/reader/implicits/future.scala index 0656bed7..23f6c0f8 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/implicits/future.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/implicits/future.scala @@ -21,5 +21,5 @@ import sttp.monad.{FutureMonad => SttpFutureMonad} import scala.concurrent.ExecutionContext.Implicits.global object future { - implicit val FutureMonad: SttpFutureMonad = new SttpFutureMonad + final implicit val futureMonadError: SttpFutureMonad = new SttpFutureMonad } diff --git a/reader/src/main/scala/za/co/absa/atum/reader/implicits/io.scala b/reader/src/main/scala/za/co/absa/atum/reader/implicits/io.scala index b43501da..96a148e1 100644 --- a/reader/src/main/scala/za/co/absa/atum/reader/implicits/io.scala +++ b/reader/src/main/scala/za/co/absa/atum/reader/implicits/io.scala @@ -20,5 +20,5 @@ import cats.effect.IO import sttp.client3.impl.cats.CatsMonadAsyncError object io { - implicit val CatsIOMonad: CatsMonadAsyncError[IO] = new CatsMonadAsyncError[IO] + final implicit val catsIOMonadError: CatsMonadAsyncError[IO] = new CatsMonadAsyncError[IO] } diff --git a/reader/src/test/scala-2.13/za/co/absa/atum/reader/basic/Reader_ZIOUnitTests.scala b/reader/src/test/scala-2.13/za/co/absa/atum/reader/basic/Reader_ZIOUnitTests.scala deleted file mode 100644 index 98de3059..00000000 --- a/reader/src/test/scala-2.13/za/co/absa/atum/reader/basic/Reader_ZIOUnitTests.scala +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2024 ABSA Group Limited - * - * 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 za.co.absa.atum.reader.basic - -import io.circe.Decoder -import sttp.capabilities.WebSockets -import sttp.client3.SttpBackend -import sttp.client3.impl.zio.RIOMonadAsyncError -import sttp.client3.testing.SttpBackendStub -import sttp.monad.MonadError -import za.co.absa.atum.model.dto.PartitionDTO -import za.co.absa.atum.model.utils.JsonSyntaxExtensions.JsonSerializationSyntax -import za.co.absa.atum.reader.basic.RequestResult.RequestResult -import za.co.absa.atum.reader.server.ServerConfig -import zio.test.{Spec, TestEnvironment, ZIOSpecDefault, assertTrue} -import zio.{Scope, Task} - -// This test is disabled as is breaks on JaCoCo execution -// Once the problem is figured out or how to cirmvent it, this can be re-enabled -// -//object Reader_ZIOUnitTests extends ZIOSpecDefault { -// private implicit val serverConfig: ServerConfig = ServerConfig("http://localhost:8080") -// -// private class ReaderForTest[F[_]](implicit serverConfig: ServerConfig, backend: SttpBackend[F, Any], ev: MonadError[F]) -// extends Reader { -// override def getQuery[R: Decoder](endpointUri: String, params: Map[String, String]): F[RequestResult[R]] = super.getQuery(endpointUri, params) -// } -// -// override def spec: Spec[TestEnvironment with Scope, Any] = { -// suite("Reader_ZIO")( -// test("Using ZIO based backend") { -// import za.co.absa.atum.reader.implicits.zio.ZIOMonad -// -// val partitionDTO = PartitionDTO("someKey", "someValue") -// -// implicit val server: SttpBackendStub[Task, WebSockets] = SttpBackendStub[Task, WebSockets](new RIOMonadAsyncError[Any]) -// .whenAnyRequest.thenRespond(partitionDTO.asJsonString) -// -// val reader = new ReaderForTest -// val expected: RequestResult[PartitionDTO] = Right(partitionDTO) -// for { -// result <- reader.getQuery[PartitionDTO]("test/", Map.empty) -// } yield assertTrue(result == expected) -// } -// ) -// } -// -//} diff --git a/reader/src/test/scala/za/co/absa/atum/reader/FlowReaderUnitTests.scala b/reader/src/test/scala/za/co/absa/atum/reader/FlowReaderUnitTests.scala index b276f3bc..cae0d852 100644 --- a/reader/src/test/scala/za/co/absa/atum/reader/FlowReaderUnitTests.scala +++ b/reader/src/test/scala/za/co/absa/atum/reader/FlowReaderUnitTests.scala @@ -21,7 +21,7 @@ import sttp.client3.SttpBackend import sttp.client3.testing.SttpBackendStub import za.co.absa.atum.model.types.basic.AtumPartitions import za.co.absa.atum.reader.server.ServerConfig -import za.co.absa.atum.reader.implicits.future.FutureMonad +import za.co.absa.atum.reader.implicits.future.futureMonadError import scala.concurrent.Future diff --git a/reader/src/test/scala/za/co/absa/atum/reader/PartitioningReaderUnitTests.scala b/reader/src/test/scala/za/co/absa/atum/reader/PartitioningReaderUnitTests.scala index 1647fa9d..183bfe85 100644 --- a/reader/src/test/scala/za/co/absa/atum/reader/PartitioningReaderUnitTests.scala +++ b/reader/src/test/scala/za/co/absa/atum/reader/PartitioningReaderUnitTests.scala @@ -21,7 +21,7 @@ import sttp.client3.SttpBackend import sttp.client3.testing.SttpBackendStub import za.co.absa.atum.model.types.basic.AtumPartitions import za.co.absa.atum.reader.server.ServerConfig -import za.co.absa.atum.reader.implicits.future.FutureMonad +import za.co.absa.atum.reader.implicits.future.futureMonadError import scala.concurrent.Future diff --git a/reader/src/test/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningIdUnitTests.scala b/reader/src/test/scala/za/co/absa/atum/reader/basic/PartitioningIdProviderUnitTests.scala similarity index 91% rename from reader/src/test/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningIdUnitTests.scala rename to reader/src/test/scala/za/co/absa/atum/reader/basic/PartitioningIdProviderUnitTests.scala index cba90f5d..04887d3a 100644 --- a/reader/src/test/scala/za/co/absa/atum/reader/basic/ReaderWithPartitioningIdUnitTests.scala +++ b/reader/src/test/scala/za/co/absa/atum/reader/basic/PartitioningIdProviderUnitTests.scala @@ -22,6 +22,7 @@ import sttp.client3._ import sttp.client3.monad.IdMonad import sttp.client3.testing.SttpBackendStub import sttp.model._ +import sttp.monad.MonadError import za.co.absa.atum.model.dto.PartitioningWithIdDTO import za.co.absa.atum.model.envelopes.NotFoundErrorResponse import za.co.absa.atum.model.envelopes.SuccessResponse.SingleSuccessResponse @@ -30,7 +31,7 @@ import za.co.absa.atum.model.utils.JsonSyntaxExtensions.JsonSerializationSyntax import za.co.absa.atum.reader.basic.RequestResult._ import za.co.absa.atum.reader.server.ServerConfig -class ReaderWithPartitioningIdUnitTests extends AnyFunSuiteLike { +class PartitioningIdProviderUnitTests extends AnyFunSuiteLike { private val serverUrl = "http://localhost:8080" private val atumPartitionsToReply = AtumPartitions("a", "b") private val atumPartitionsToFailedDecode = AtumPartitions("c", "d") @@ -53,10 +54,11 @@ class ReaderWithPartitioningIdUnitTests extends AnyFunSuiteLike { } - private case class ReaderWithPartitioningIdForTest[F[_]](partitioning: AtumPartitions) + private case class ReaderWithPartitioningIdForTest(partitioning: AtumPartitions) (implicit serverConfig: ServerConfig) - extends ReaderWithPartitioningId { - override def partitioningId(): Identity[RequestResult[Long]] = super.partitioningId() + extends Reader[Identity] with PartitioningIdProvider[Identity]{ + + override def partitioningId()(implicit monad: MonadError[Identity]): Identity[RequestResult[Long]] = super.partitioningId() } diff --git a/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_CatsIOUnitTests.scala b/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_CatsIOUnitTests.scala index 29051a1d..1aaad090 100644 --- a/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_CatsIOUnitTests.scala +++ b/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_CatsIOUnitTests.scala @@ -37,7 +37,7 @@ class Reader_CatsIOUnitTests extends AnyFunSuiteLike { test("Using Cats IO based backend") { import cats.effect.IO - import za.co.absa.atum.reader.implicits.io.CatsIOMonad + import za.co.absa.atum.reader.implicits.io.catsIOMonadError val partitionDTO = PartitionDTO("someKey", "someValue") implicit val server: SttpBackendStub[IO, Any] = SttpBackendStub[IO, Any](implicitly[MonadAsyncError[IO]]) @@ -47,11 +47,6 @@ class Reader_CatsIOUnitTests extends AnyFunSuiteLike { val query = reader.getQuery[PartitionDTO]("/test", Map.empty) val result = query.unsafeRunSync() assert(result == Right(partitionDTO)) - - -// .map { result => -// fail("This test is expected to fail") -// } } } diff --git a/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_FutureUnitTests.scala b/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_FutureUnitTests.scala index 9ac933eb..c19c6411 100644 --- a/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_FutureUnitTests.scala +++ b/reader/src/test/scala/za/co/absa/atum/reader/basic/Reader_FutureUnitTests.scala @@ -38,7 +38,7 @@ class Reader_FutureUnitTests extends AnyFunSuiteLike { } test("Using Future based backend") { - import za.co.absa.atum.reader.implicits.future.FutureMonad + import za.co.absa.atum.reader.implicits.future.futureMonadError val partitionDTO = PartitionDTO("someKey", "someValue") implicit val server: SttpBackend[Future, Any] = SttpBackendStub.asynchronousFuture