From beed8733bf0899b1ca0fba2bd30ddb7e5b2cc4ea Mon Sep 17 00:00:00 2001 From: Ang Hao Yang Date: Sun, 20 Jun 2021 00:34:50 +0800 Subject: [PATCH 1/4] Fix Cats Effect IO type inference --- build.sbt | 4 +- .../instances/CatsEffectInstances.scala | 5 ++- .../CatsEffectTest.scala | 38 +++++++++++++++++++ .../instances/CatsEffectInstances.scala | 5 ++- .../CatsEffectTest.scala | 38 +++++++++++++++++++ 5 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala create mode 100644 elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala diff --git a/build.sbt b/build.sbt index 5ab183757..56622a29a 100644 --- a/build.sbt +++ b/build.sbt @@ -189,13 +189,13 @@ lazy val clientsSniffed = (project in file("elastic4s-client-sniffed")) .settings(libraryDependencies ++= Seq(elasticsearchRestClientSniffer)) lazy val cats_effect = (project in file("elastic4s-effect-cats")) - .dependsOn(core) + .dependsOn(core, testkit % "test") .settings(name := "elastic4s-effect-cats") .settings(allSettings) .settings(libraryDependencies += cats) lazy val cats_effect_2 = (project in file("elastic4s-effect-cats-2")) - .dependsOn(core) + .dependsOn(core, testkit % "test") .settings(name := "elastic4s-effect-cats-2") .settings(allSettings) .settings(libraryDependencies += cats2) diff --git a/elastic4s-effect-cats-2/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala b/elastic4s-effect-cats-2/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala index 867c800c7..67125cc63 100644 --- a/elastic4s-effect-cats-2/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala +++ b/elastic4s-effect-cats-2/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala @@ -1,6 +1,6 @@ package com.sksamuel.elastic4s.cats.effect.instances -import cats.effect.Async +import cats.effect.{Async, IO} import cats.{Functor => CatsFunctor} import com.sksamuel.elastic4s.cats.effect.CatsEffectExecutor import com.sksamuel.elastic4s.{Executor, Functor} @@ -12,6 +12,9 @@ trait CatsEffectInstances { implicit def catsEffectExecutor[F[_]: Async]: Executor[F] = new CatsEffectExecutor[F] + + //this needs to be at the bottom + implicit val ioExecutor: Executor[IO] = new CatsEffectExecutor[IO] } @deprecated("Use CatsEffectInstances instead") diff --git a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala new file mode 100644 index 000000000..1d2639840 --- /dev/null +++ b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -0,0 +1,38 @@ +package com.sksamuel.elastic4s.cats.effect + +import cats.data.OptionT +import cats.effect.IO +import com.sksamuel.elastic4s.{ElasticClient, ElasticProperties} +import com.sksamuel.elastic4s.ElasticDsl._ +import org.scalatest.flatspec.AnyFlatSpec +import com.sksamuel.elastic4s.cats.effect.instances._ +import com.sksamuel.elastic4s.http.JavaClient +import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse +import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest} + +class CatsEffectTest extends AnyFlatSpec { + type OptionIO[A] = OptionT[IO, A] + + val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy"))) + val index = "index" + + "client#execute" should "compile and infer effect type as `IO`" in { + for { + r1 <- client.execute(createIndex(index)) + _ <- IO(println(r1)) + r2 <- client.execute(deleteIndex(index)) + _ <- IO(println(r2)) + } yield (r1, r2) + println("t1") + } + + it should "still compile with other Cats `Async` instances with explicit type annotations" in { + for { + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex("index")) + _ <- IO(println(r1)).to[OptionIO] + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex("index")) + _ <- IO(println(r2)).to[OptionIO] + } yield (r1, r2) + println("t2") + } +} diff --git a/elastic4s-effect-cats/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala b/elastic4s-effect-cats/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala index 867c800c7..67125cc63 100644 --- a/elastic4s-effect-cats/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala +++ b/elastic4s-effect-cats/src/main/scala/com/sksamuel/elastic4s/cats/effect/instances/CatsEffectInstances.scala @@ -1,6 +1,6 @@ package com.sksamuel.elastic4s.cats.effect.instances -import cats.effect.Async +import cats.effect.{Async, IO} import cats.{Functor => CatsFunctor} import com.sksamuel.elastic4s.cats.effect.CatsEffectExecutor import com.sksamuel.elastic4s.{Executor, Functor} @@ -12,6 +12,9 @@ trait CatsEffectInstances { implicit def catsEffectExecutor[F[_]: Async]: Executor[F] = new CatsEffectExecutor[F] + + //this needs to be at the bottom + implicit val ioExecutor: Executor[IO] = new CatsEffectExecutor[IO] } @deprecated("Use CatsEffectInstances instead") diff --git a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala new file mode 100644 index 000000000..b1e7f5645 --- /dev/null +++ b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -0,0 +1,38 @@ +package com.sksamuel.elastic4s.cats.effect + +import cats.data.OptionT +import cats.effect.{IO, Resource} +import com.sksamuel.elastic4s.{ElasticClient, ElasticProperties} +import com.sksamuel.elastic4s.ElasticDsl._ +import org.scalatest.flatspec.AnyFlatSpec +import com.sksamuel.elastic4s.cats.effect.instances._ +import com.sksamuel.elastic4s.http.JavaClient +import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse +import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest} + +class CatsEffectTest extends AnyFlatSpec { + type OptionIO[A] = OptionT[IO, A] + + type ResourceIO[A] = Resource[IO, A] + + val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy"))) + val index = "index" + + "client#execute" should "compile and infer effect type as `IO`" in { + for { + r1 <- client.execute(createIndex(index)) + _ <- IO(println(r1)) + r2 <- client.execute(deleteIndex(index)) + _ <- IO(println(r2)) + } yield (r1, r2) + } + + it should "still compile with other Cats `Async` instances with explicit type annotations" in { + for { + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex("index")) + _ <- IO(println(r1)).to[OptionIO] + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex("index")) + _ <- IO(println(r2)).to[OptionIO] + } yield (r1, r2) + } +} From e99867aafd103b88b34ce200b34916f7352f50c6 Mon Sep 17 00:00:00 2001 From: Ang Hao Yang Date: Sun, 20 Jun 2021 01:26:37 +0800 Subject: [PATCH 2/4] Remove debugging lines --- .../com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala | 2 -- .../com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index 1d2639840..686b8c765 100644 --- a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -23,7 +23,6 @@ class CatsEffectTest extends AnyFlatSpec { r2 <- client.execute(deleteIndex(index)) _ <- IO(println(r2)) } yield (r1, r2) - println("t1") } it should "still compile with other Cats `Async` instances with explicit type annotations" in { @@ -33,6 +32,5 @@ class CatsEffectTest extends AnyFlatSpec { r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex("index")) _ <- IO(println(r2)).to[OptionIO] } yield (r1, r2) - println("t2") } } diff --git a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index b1e7f5645..686b8c765 100644 --- a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -1,7 +1,7 @@ package com.sksamuel.elastic4s.cats.effect import cats.data.OptionT -import cats.effect.{IO, Resource} +import cats.effect.IO import com.sksamuel.elastic4s.{ElasticClient, ElasticProperties} import com.sksamuel.elastic4s.ElasticDsl._ import org.scalatest.flatspec.AnyFlatSpec @@ -13,8 +13,6 @@ import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexR class CatsEffectTest extends AnyFlatSpec { type OptionIO[A] = OptionT[IO, A] - type ResourceIO[A] = Resource[IO, A] - val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy"))) val index = "index" From 9364da8b185713f3687f7bd3261aa7ece0dad215 Mon Sep 17 00:00:00 2001 From: Ang Hao Yang Date: Sun, 20 Jun 2021 03:10:52 +0800 Subject: [PATCH 3/4] Test cleanup --- .../com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala | 6 +++--- .../com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index 686b8c765..98ce30af2 100644 --- a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -16,7 +16,7 @@ class CatsEffectTest extends AnyFlatSpec { val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy"))) val index = "index" - "client#execute" should "compile and infer effect type as `IO`" in { + "ElasticClient#execute" should "compile and infer effect type as `IO`" in { for { r1 <- client.execute(createIndex(index)) _ <- IO(println(r1)) @@ -27,9 +27,9 @@ class CatsEffectTest extends AnyFlatSpec { it should "still compile with other Cats `Async` instances with explicit type annotations" in { for { - r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex("index")) + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex(index)) _ <- IO(println(r1)).to[OptionIO] - r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex("index")) + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex(index)) _ <- IO(println(r2)).to[OptionIO] } yield (r1, r2) } diff --git a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index 686b8c765..98ce30af2 100644 --- a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -16,7 +16,7 @@ class CatsEffectTest extends AnyFlatSpec { val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy"))) val index = "index" - "client#execute" should "compile and infer effect type as `IO`" in { + "ElasticClient#execute" should "compile and infer effect type as `IO`" in { for { r1 <- client.execute(createIndex(index)) _ <- IO(println(r1)) @@ -27,9 +27,9 @@ class CatsEffectTest extends AnyFlatSpec { it should "still compile with other Cats `Async` instances with explicit type annotations" in { for { - r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex("index")) + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex(index)) _ <- IO(println(r1)).to[OptionIO] - r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex("index")) + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex(index)) _ <- IO(println(r2)).to[OptionIO] } yield (r1, r2) } From cf608b8e9f0096921b8cc23284333ab777486d4c Mon Sep 17 00:00:00 2001 From: Ang Hao Yang Date: Fri, 30 Jul 2021 00:13:35 +0800 Subject: [PATCH 4/4] add future test cases --- .../CatsEffectTest.scala | 12 ++++++++++++ .../CatsEffectTest.scala | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index 98ce30af2..0ab10951b 100644 --- a/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats-2/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -10,6 +10,9 @@ import com.sksamuel.elastic4s.http.JavaClient import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest} +import scala.concurrent.Future +import scala.concurrent.ExecutionContext.Implicits.global + class CatsEffectTest extends AnyFlatSpec { type OptionIO[A] = OptionT[IO, A] @@ -33,4 +36,13 @@ class CatsEffectTest extends AnyFlatSpec { _ <- IO(println(r2)).to[OptionIO] } yield (r1, r2) } + + it should "still compile with `Future` with explicit type annotations" in { + for { + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, Future](createIndex(index)) + _ <- Future(println(r1)) + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, Future](deleteIndex(index)) + _ <- Future(println(r2)) + } yield (r1, r2) + } } diff --git a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala index 98ce30af2..0ab10951b 100644 --- a/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala +++ b/elastic4s-effect-cats/src/test/scala/com.sksamuel.elastic4s.cats.effect/CatsEffectTest.scala @@ -10,6 +10,9 @@ import com.sksamuel.elastic4s.http.JavaClient import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest} +import scala.concurrent.Future +import scala.concurrent.ExecutionContext.Implicits.global + class CatsEffectTest extends AnyFlatSpec { type OptionIO[A] = OptionT[IO, A] @@ -33,4 +36,13 @@ class CatsEffectTest extends AnyFlatSpec { _ <- IO(println(r2)).to[OptionIO] } yield (r1, r2) } + + it should "still compile with `Future` with explicit type annotations" in { + for { + r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, Future](createIndex(index)) + _ <- Future(println(r1)) + r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, Future](deleteIndex(index)) + _ <- Future(println(r2)) + } yield (r1, r2) + } }