io.chrisdavenport.log4cats.slf4j.Slf4jLogger Scala Examples
The following examples show how to use io.chrisdavenport.log4cats.slf4j.Slf4jLogger.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: ServiceAccountsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect._ import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class ServiceAccountsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, ServiceAccount] with GettableTests[IO, ServiceAccount] with ListableTests[IO, ServiceAccount, ServiceAccountList] with ReplaceableTests[IO, ServiceAccount] with DeletableTests[IO, ServiceAccount, ServiceAccountList] with WatchableTests[IO, ServiceAccount] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[ServiceAccount].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.serviceAccounts override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.serviceAccounts.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = ServiceAccount( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))) ) val labels = Option(Map("test" -> "updated-label")) override def modifyResource(resource: ServiceAccount) = resource.copy(metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name), labels = labels))) override def checkUpdated(updatedResource: ServiceAccount) = updatedResource.metadata.value.labels shouldBe labels override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.serviceAccounts.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, ServiceAccount] = client.serviceAccounts.namespace(namespaceName) }
Example 2
Source File: Main.scala From pfps-shopping-cart with Apache License 2.0 | 5 votes |
package shop import cats.effect._ import cats.implicits._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.http4s.server.blaze.BlazeServerBuilder import shop.modules._ object Main extends IOApp { implicit val logger = Slf4jLogger.getLogger[IO] override def run(args: List[String]): IO[ExitCode] = config.load[IO].flatMap { cfg => Logger[IO].info(s"Loaded config $cfg") >> AppResources.make[IO](cfg).use { res => for { security <- Security.make[IO](cfg, res.psql, res.redis) algebras <- Algebras.make[IO](res.redis, res.psql, cfg.cartExpiration) clients <- HttpClients.make[IO](cfg.paymentConfig, res.client) programs <- Programs.make[IO](cfg.checkoutConfig, algebras, clients) api <- HttpApi.make[IO](algebras, programs, security) _ <- BlazeServerBuilder[IO] .bindHttp( cfg.httpServerConfig.port.value, cfg.httpServerConfig.host.value ) .withHttpApp(api.httpApp) .serve .compile .drain } yield ExitCode.Success } } }
Example 3
Source File: PaymentServiceClient.scala From zio-saga with MIT License | 5 votes |
package com.vladkopanev.zio.saga.example.client import java.util.UUID import com.vladkopanev.zio.saga.example.TaskC import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import zio.Task trait PaymentServiceClient { def collectPayments(userId: UUID, amount: BigDecimal, traceId: String): TaskC[Unit] def refundPayments(userId: UUID, amount: BigDecimal, traceId: String): TaskC[Unit] } class PaymentServiceClientStub(logger: Logger[Task], maxRequestTimeout: Int, flaky: Boolean) extends PaymentServiceClient { override def collectPayments(userId: UUID, amount: BigDecimal, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("collectPayments").when(flaky) _ <- logger.info(s"Payments collected from user #$userId") } yield () override def refundPayments(userId: UUID, amount: BigDecimal, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("refundPayments").when(flaky) _ <- logger.info(s"Payments refunded to user #$userId") } yield () } object PaymentServiceClientStub { import zio.interop.catz._ def apply(maxRequestTimeout: Int, flaky: Boolean): Task[PaymentServiceClient] = Slf4jLogger.create[Task].map(new PaymentServiceClientStub(_, maxRequestTimeout, flaky)) }
Example 4
Source File: LoyaltyPointsServiceClient.scala From zio-saga with MIT License | 5 votes |
package com.vladkopanev.zio.saga.example.client import java.util.UUID import com.vladkopanev.zio.saga.example.TaskC import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import zio.Task trait LoyaltyPointsServiceClient { def assignLoyaltyPoints(userId: UUID, amount: Double, traceId: String): TaskC[Unit] def cancelLoyaltyPoints(userId: UUID, amount: Double, traceId: String): TaskC[Unit] } class LoyaltyPointsServiceClientStub(logger: Logger[Task], maxRequestTimeout: Int, flaky: Boolean) extends LoyaltyPointsServiceClient { override def assignLoyaltyPoints(userId: UUID, amount: Double, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("assignLoyaltyPoints").when(flaky) _ <- logger.info(s"Loyalty points assigned to user $userId") } yield () override def cancelLoyaltyPoints(userId: UUID, amount: Double, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("cancelLoyaltyPoints").when(flaky) _ <- logger.info(s"Loyalty points canceled for user $userId") } yield () } object LoyaltyPointsServiceClientStub { import zio.interop.catz._ def apply(maxRequestTimeout: Int, flaky: Boolean): Task[LoyaltyPointsServiceClientStub] = Slf4jLogger.create[Task].map(new LoyaltyPointsServiceClientStub(_, maxRequestTimeout, flaky)) }
Example 5
Source File: OrderServiceClient.scala From zio-saga with MIT License | 5 votes |
package com.vladkopanev.zio.saga.example.client import java.util.UUID import com.vladkopanev.zio.saga.example.TaskC import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import zio.Task trait OrderServiceClient { def closeOrder(userId: UUID, orderId: BigInt, traceId: String): TaskC[Unit] def reopenOrder(userId: UUID, orderId: BigInt, traceId: String): TaskC[Unit] } class OrderServiceClientStub(logger: Logger[Task], maxRequestTimeout: Int, flaky: Boolean) extends OrderServiceClient { override def closeOrder(userId: UUID, orderId: BigInt, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("closeOrder").when(flaky) _ <- logger.info(s"Order #$orderId closed") } yield () override def reopenOrder(userId: UUID, orderId: BigInt, traceId: String): TaskC[Unit] = for { _ <- randomSleep(maxRequestTimeout) _ <- randomFail("reopenOrder").when(flaky) _ <- logger.info(s"Order #$orderId reopened") } yield () } object OrderServiceClientStub { import zio.interop.catz._ def apply(maxRequestTimeout: Int, flaky: Boolean): Task[OrderServiceClientStub] = Slf4jLogger.create[Task].map(new OrderServiceClientStub(_, maxRequestTimeout, flaky)) }
Example 6
Source File: DynamoDBStreamer.scala From fs2-aws with MIT License | 5 votes |
import cats.effect.{ ExitCode, IO, IOApp } import fs2.aws.dynamodb import fs2.aws.dynamodb.parsers import io.chrisdavenport.log4cats.SelfAwareStructuredLogger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.circe.Json import io.github.howardjohn.scanamo.CirceDynamoFormat._ object DynamoDBStreamer extends IOApp { override def run(args: List[String]): IO[ExitCode] = for { implicit0(logger: SelfAwareStructuredLogger[IO]) <- Slf4jLogger.fromName[IO]("example") _ <- dynamodb .readFromDynamDBStream[IO]( "dynamo_db_example", "arn:aws:dynamodb:us-east-1:023006903388:table/nightly-sync-events-Production/stream/2020-01-27T22:49:13.204" ) .evalMap(cr => parsers.parseDynamoEvent[IO, Json](cr.record)) .evalTap(msg => logger.info(s"received $msg")) .compile .drain } yield ExitCode.Success }
Example 7
Source File: ServerApp.scala From fs2-chat with MIT License | 5 votes |
package fs2chat package server import cats.effect.{Blocker, ExitCode, IO, IOApp} import cats.implicits._ import com.comcast.ip4s._ import com.monovore.decline._ import fs2.io.tcp.SocketGroup import io.chrisdavenport.log4cats.slf4j.Slf4jLogger object ServerApp extends IOApp { private val argsParser: Command[Port] = Command("fs2chat-server", "FS2 Chat Server") { Opts .option[Int]("port", "Port to bind for connection requests") .withDefault(5555) .mapValidated(p => Port(p).toValidNel("Invalid port number")) } def run(args: List[String]): IO[ExitCode] = argsParser.parse(args) match { case Left(help) => IO(System.err.println(help)).as(ExitCode.Error) case Right(port) => Blocker[IO] .use { blocker => SocketGroup[IO](blocker).use { socketGroup => Slf4jLogger.create[IO].flatMap { implicit logger => Server.start[IO](socketGroup, port).compile.drain } } } .as(ExitCode.Success) } }
Example 8
Source File: InMemoryKafka.scala From kafka4s with Apache License 2.0 | 5 votes |
package com.banno.kafka import org.scalatest.{BeforeAndAfterAll, Suite} import org.scalacheck.Gen import com.banno.kafka.admin.AdminApi import cats.effect.IO import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.apache.kafka.clients.admin.NewTopic trait InMemoryKafka extends BeforeAndAfterAll { this: Suite => val log = Slf4jLogger.getLoggerFromClass[IO](this.getClass) val bootstrapServer = "localhost:9092" // val bootstrapServer = "kafka.local:9092" val schemaRegistryUrl = "http://localhost:8081" // val schemaRegistryUrl = "http://kafka.local:8081" override def beforeAll(): Unit = log.info(s"Using docker-machine Kafka cluster for ${getClass.getName}").unsafeRunSync() override def afterAll(): Unit = log.info(s"Used docker-machine Kafka cluster for ${getClass.getName}").unsafeRunSync() def randomId: String = Gen.listOfN(10, Gen.alphaChar).map(_.mkString).sample.get def genGroupId: String = randomId def genTopic: String = randomId def createTopic(partitionCount: Int = 1): String = { val topic = genTopic AdminApi .createTopicsIdempotent[IO]( bootstrapServer, List(new NewTopic(topic, partitionCount, 1.toShort)) ) .unsafeRunSync() topic } }
Example 9
Source File: StatefulSetsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect.{ConcurrentEffect, IO} import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.apps.v1._ import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.{LabelSelector, ObjectMeta} import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class StatefulSetsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, StatefulSet] with GettableTests[IO, StatefulSet] with ListableTests[IO, StatefulSet, StatefulSetList] with ReplaceableTests[IO, StatefulSet] with DeletableTests[IO, StatefulSet, StatefulSetList] with DeletableTerminatedTests[IO, StatefulSet, StatefulSetList] with WatchableTests[IO, StatefulSet] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[StatefulSet].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.statefulSets override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.statefulSets.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = { val label = Option(Map("app" -> "test")) StatefulSet( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( StatefulSetSpec( serviceName = "service-name", selector = LabelSelector(matchLabels = label), template = PodTemplateSpec( metadata = Option(ObjectMeta(name = Option(resourceName), labels = label)), spec = Option(PodSpec(containers = Seq(Container("test", image = Option("docker"))))) ) ) ) ) } val updateStrategy = Option( StatefulSetUpdateStrategy( `type` = Option("RollingUpdate"), rollingUpdate = Option(RollingUpdateStatefulSetStrategy(partition = Option(10))) ) ) override def modifyResource(resource: StatefulSet) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = resource.spec.map(_.copy(updateStrategy = updateStrategy)) ) override def checkUpdated(updatedResource: StatefulSet) = updatedResource.spec.value.updateStrategy shouldBe updateStrategy override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.statefulSets.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, StatefulSet] = client.statefulSets.namespace(namespaceName) }
Example 10
Source File: ReplicaSetsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect.{ConcurrentEffect, IO} import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.apps.v1._ import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.{LabelSelector, ObjectMeta} import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class ReplicaSetsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, ReplicaSet] with GettableTests[IO, ReplicaSet] with ListableTests[IO, ReplicaSet, ReplicaSetList] with ReplaceableTests[IO, ReplicaSet] with DeletableTests[IO, ReplicaSet, ReplicaSetList] with DeletableTerminatedTests[IO, ReplicaSet, ReplicaSetList] with WatchableTests[IO, ReplicaSet] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[ReplicaSet].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.replicaSets override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.replicaSets.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = { val label = Option(Map("app" -> "test")) ReplicaSet( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( ReplicaSetSpec( selector = LabelSelector(matchLabels = label), template = Option( PodTemplateSpec( metadata = Option(ObjectMeta(name = Option(resourceName), labels = label)), spec = Option(PodSpec(containers = Seq(Container("test", image = Option("docker"))))) ) ) ) ) ) } val replicas = Option(5) override def modifyResource(resource: ReplicaSet) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = resource.spec.map(_.copy(replicas = replicas)) ) override def checkUpdated(updatedResource: ReplicaSet) = updatedResource.spec.value.replicas shouldBe replicas override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.replicaSets.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, ReplicaSet] = client.replicaSets.namespace(namespaceName) }
Example 11
Source File: ConfigMapsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect._ import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.core.v1.{ConfigMap, ConfigMapList} import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class ConfigMapsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, ConfigMap] with GettableTests[IO, ConfigMap] with ListableTests[IO, ConfigMap, ConfigMapList] with ReplaceableTests[IO, ConfigMap] with DeletableTests[IO, ConfigMap, ConfigMapList] with WatchableTests[IO, ConfigMap] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[ConfigMap].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.configMaps override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.configMaps.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = ConfigMap( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), data = Option(Map("test" -> "data")) ) val data = Option(Map("test" -> "updated-data")) override def modifyResource(resource: ConfigMap) = resource.copy(metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), data = data) override def checkUpdated(updatedResource: ConfigMap) = updatedResource.data shouldBe data override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.configMaps.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, ConfigMap] = client.configMaps.namespace(namespaceName) }
Example 12
Source File: CronJobsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect.{ConcurrentEffect, IO} import com.goyeau.kubernetes.client.operation._ import com.goyeau.kubernetes.client.KubernetesClient import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.batch.v1.JobSpec import io.k8s.api.batch.v1beta1.{CronJob, CronJobList, CronJobSpec, JobTemplateSpec} import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class CronJobsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, CronJob] with GettableTests[IO, CronJob] with ListableTests[IO, CronJob, CronJobList] with ReplaceableTests[IO, CronJob] with DeletableTests[IO, CronJob, CronJobList] with DeletableTerminatedTests[IO, CronJob, CronJobList] with WatchableTests[IO, CronJob] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[CronJob].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.cronJobs override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.cronJobs.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = CronJob( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( CronJobSpec( schedule = "1 * * * *", jobTemplate = JobTemplateSpec( spec = Option( JobSpec( template = PodTemplateSpec( metadata = Option(ObjectMeta(name = Option(resourceName))), spec = Option( PodSpec( containers = Seq(Container("test", image = Option("docker"))), restartPolicy = Option("Never") ) ) ) ) ) ) ) ) ) val schedule = "2 * * * *" override def modifyResource(resource: CronJob) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = resource.spec.map(_.copy(schedule = schedule)) ) override def checkUpdated(updatedResource: CronJob) = updatedResource.spec.value.schedule shouldBe schedule override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.cronJobs.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, CronJob] = client.cronJobs.namespace(namespaceName) }
Example 13
Source File: MetadataAlgebraSpec.scala From hydra with Apache License 2.0 | 5 votes |
package hydra.kafka.algebras import java.time.Instant import cats.data.NonEmptyList import cats.effect.{Concurrent, ContextShift, IO, Sync, Timer} import cats.implicits._ import hydra.avro.registry.SchemaRegistry import hydra.core.marshallers.History import hydra.kafka.algebras.MetadataAlgebra.TopicMetadataContainer import hydra.kafka.model.ContactMethod.Slack import hydra.kafka.model.TopicMetadataV2Request.Subject import hydra.kafka.model.{Public, StreamTypeV2, TopicMetadataV2, TopicMetadataV2Key, TopicMetadataV2Request, TopicMetadataV2Value} import io.chrisdavenport.log4cats.SelfAwareStructuredLogger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.apache.avro.generic.GenericRecord import org.scalatest.Assertion import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike import retry.RetryPolicies._ import retry.syntax.all._ import retry.{RetryPolicy, _} import scala.concurrent.ExecutionContext import scala.concurrent.duration._ class MetadataAlgebraSpec extends AnyWordSpecLike with Matchers { implicit private val contextShift: ContextShift[IO] = IO.contextShift(ExecutionContext.global) private implicit val concurrentEffect: Concurrent[IO] = IO.ioConcurrentEffect private implicit val policy: RetryPolicy[IO] = limitRetries[IO](5) |+| exponentialBackoff[IO](500.milliseconds) private implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global) private implicit def noop[A]: (A, RetryDetails) => IO[Unit] = retry.noop[IO, A] implicit private def unsafeLogger[F[_]: Sync]: SelfAwareStructuredLogger[F] = Slf4jLogger.getLogger[F] private implicit class RetryAndAssert[A](boolIO: IO[A]) { def retryIfFalse(check: A => Boolean): IO[Assertion] = boolIO.map(check).retryingM(identity, policy, noop).map(assert(_)) } private val metadataTopicName = "_internal.metadataTopic" private val consumerGroup = "Consumer Group" (for { kafkaClient <- KafkaClientAlgebra.test[IO] schemaRegistry <- SchemaRegistry.test[IO] metadata <- MetadataAlgebra.make(metadataTopicName, consumerGroup, kafkaClient, schemaRegistry, consumeMetadataEnabled = true) } yield { runTests(metadata, kafkaClient) }).unsafeRunSync() private def runTests(metadataAlgebra: MetadataAlgebra[IO], kafkaClientAlgebra: KafkaClientAlgebra[IO]): Unit = { "MetadataAlgebraSpec" should { "retrieve none for non-existant topic" in { val subject = Subject.createValidated("Non-existantTopic").get metadataAlgebra.getMetadataFor(subject).unsafeRunSync() shouldBe None } "retrieve metadata" in { val subject = Subject.createValidated("subject1").get val (genericRecordsIO, key, value) = getMetadataGenericRecords(subject) (for { record <- genericRecordsIO _ <- kafkaClientAlgebra.publishMessage(record, metadataTopicName) _ <- metadataAlgebra.getMetadataFor(subject).retryIfFalse(_.isDefined) metadata <- metadataAlgebra.getMetadataFor(subject) } yield metadata shouldBe Some(TopicMetadataContainer(key, value, None, None))).unsafeRunSync() } "retrieve all metadata" in { val subject = Subject.createValidated("subject2").get val (genericRecordsIO, key, value) = getMetadataGenericRecords(subject) (for { record <- genericRecordsIO _ <- kafkaClientAlgebra.publishMessage(record, metadataTopicName) _ <- metadataAlgebra.getMetadataFor(subject).retryIfFalse(_.isDefined) allMetadata <- metadataAlgebra.getAllMetadata } yield allMetadata should have length 2).unsafeRunSync() } } } private def getMetadataGenericRecords(subject: Subject): (IO[(GenericRecord, Option[GenericRecord])], TopicMetadataV2Key, TopicMetadataV2Value) = { val key = TopicMetadataV2Key(subject) val value = TopicMetadataV2Value( StreamTypeV2.Entity, deprecated = false, Public, NonEmptyList.one(Slack.create("#channel").get), Instant.now, List(), None) (TopicMetadataV2.encode[IO](key, Some(value)), key, value) } }
Example 14
Source File: HorizontalPodAutoscalersApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect._ import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.autoscaling.v1.{ CrossVersionObjectReference, HorizontalPodAutoscaler, HorizontalPodAutoscalerList, HorizontalPodAutoscalerSpec } import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class HorizontalPodAutoscalersApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, HorizontalPodAutoscaler] with GettableTests[IO, HorizontalPodAutoscaler] with ListableTests[IO, HorizontalPodAutoscaler, HorizontalPodAutoscalerList] with ReplaceableTests[IO, HorizontalPodAutoscaler] with DeletableTests[IO, HorizontalPodAutoscaler, HorizontalPodAutoscalerList] with WatchableTests[IO, HorizontalPodAutoscaler] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[HorizontalPodAutoscaler].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.horizontalPodAutoscalers override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.horizontalPodAutoscalers.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = HorizontalPodAutoscaler( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option(HorizontalPodAutoscalerSpec(scaleTargetRef = CrossVersionObjectReference("kind", "name"), maxReplicas = 2)) ) val maxReplicas = 3 override def modifyResource(resource: HorizontalPodAutoscaler) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = resource.spec.map(_.copy(maxReplicas = maxReplicas)) ) override def checkUpdated(updatedResource: HorizontalPodAutoscaler) = updatedResource.spec.get.maxReplicas shouldBe maxReplicas override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.horizontalPodAutoscalers.namespace(namespaceName) override def watchApi( namespaceName: String )(implicit client: KubernetesClient[IO]): Watchable[IO, HorizontalPodAutoscaler] = client.horizontalPodAutoscalers.namespace(namespaceName) }
Example 15
Source File: DeploymentsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect.{ConcurrentEffect, IO} import com.goyeau.kubernetes.client.operation._ import com.goyeau.kubernetes.client.{IntValue, KubernetesClient, StringValue} import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.apps.v1._ import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.{LabelSelector, ObjectMeta} import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class DeploymentsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, Deployment] with GettableTests[IO, Deployment] with ListableTests[IO, Deployment, DeploymentList] with ReplaceableTests[IO, Deployment] with DeletableTests[IO, Deployment, DeploymentList] with DeletableTerminatedTests[IO, Deployment, DeploymentList] with WatchableTests[IO, Deployment] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[Deployment].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.deployments override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.deployments.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = { val label = Option(Map("app" -> "test")) Deployment( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( DeploymentSpec( selector = LabelSelector(matchLabels = label), template = PodTemplateSpec( metadata = Option(ObjectMeta(name = Option(resourceName), labels = label)), spec = Option(PodSpec(containers = Seq(Container("test", image = Option("docker"))))) ) ) ) ) } val strategy = Option( DeploymentStrategy( `type` = Option("RollingUpdate"), rollingUpdate = Option(RollingUpdateDeployment(maxSurge = Option(StringValue("25%")), maxUnavailable = Option(IntValue(10)))) ) ) override def modifyResource(resource: Deployment) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = resource.spec.map(_.copy(strategy = strategy)) ) override def checkUpdated(updatedResource: Deployment) = updatedResource.spec.value.strategy shouldBe strategy override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.deployments.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, Deployment] = client.deployments.namespace(namespaceName) }
Example 16
Source File: ServicesApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect._ import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers class ServicesApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, Service] with GettableTests[IO, Service] with ListableTests[IO, Service, ServiceList] with ReplaceableTests[IO, Service] with DeletableTests[IO, Service, ServiceList] with WatchableTests[IO, Service] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[Service].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.services override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.services.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = Service( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option(ServiceSpec(ports = Option(Seq(ServicePort(2000))))) ) val labels = Option(Map("test" -> "updated-label")) override def modifyResource(resource: Service) = resource.copy(metadata = resource.metadata.map(_.copy(labels = labels))) override def checkUpdated(updatedResource: Service) = updatedResource.metadata.value.labels shouldBe labels override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.services.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, Service] = client.services.namespace(namespaceName) }
Example 17
Source File: IngressesApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect._ import com.goyeau.kubernetes.client.KubernetesClient import com.goyeau.kubernetes.client.operation._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.networking.v1beta1.{Ingress, IngressList, IngressRule, IngressSpec} import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.OptionValues import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers class IngressesApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, Ingress] with GettableTests[IO, Ingress] with ListableTests[IO, Ingress, IngressList] with ReplaceableTests[IO, Ingress] with DeletableTests[IO, Ingress, IngressList] with WatchableTests[IO, Ingress] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[Ingress].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.ingresses override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.ingresses.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = Ingress( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( IngressSpec( rules = Some(Seq(IngressRule(Some("host")))) ) ) ) private val updatedHost: Option[IngressSpec] = Option( IngressSpec( rules = Some(Seq(IngressRule(Some("host2")))) ) ) override def modifyResource(resource: Ingress) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name))), spec = updatedHost ) override def checkUpdated(updatedResource: Ingress) = updatedResource.spec should be( updatedHost ) override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.ingresses.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, Ingress] = client.ingresses.namespace(namespaceName) }
Example 18
Source File: JobsApiTest.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client.api import cats.effect.{ConcurrentEffect, IO} import com.goyeau.kubernetes.client.operation._ import com.goyeau.kubernetes.client.KubernetesClient import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import io.k8s.api.batch.v1.{Job, JobList, JobSpec} import io.k8s.api.core.v1._ import io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta import org.scalatest.OptionValues import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers class JobsApiTest extends AnyFlatSpec with Matchers with OptionValues with CreatableTests[IO, Job] with GettableTests[IO, Job] with ListableTests[IO, Job, JobList] with ReplaceableTests[IO, Job] with DeletableTests[IO, Job, JobList] with DeletableTerminatedTests[IO, Job, JobList] with WatchableTests[IO, Job] with ContextProvider { implicit lazy val F: ConcurrentEffect[IO] = IO.ioConcurrentEffect implicit lazy val logger: Logger[IO] = Slf4jLogger.getLogger[IO] lazy val resourceName = classOf[Job].getSimpleName override def api(implicit client: KubernetesClient[IO]) = client.jobs override def namespacedApi(namespaceName: String)(implicit client: KubernetesClient[IO]) = client.jobs.namespace(namespaceName) override def sampleResource(resourceName: String, labels: Map[String, String]) = Job( metadata = Option(ObjectMeta(name = Option(resourceName), labels = Option(labels))), spec = Option( JobSpec( template = PodTemplateSpec( metadata = Option(ObjectMeta(name = Option(resourceName))), spec = Option( PodSpec(containers = Seq(Container("test", image = Option("docker"))), restartPolicy = Option("Never")) ) ) ) ) ) val labels = Map("app" -> "test") override def modifyResource(resource: Job) = resource.copy( metadata = Option(ObjectMeta(name = resource.metadata.flatMap(_.name), labels = Option(labels))) ) override def checkUpdated(updatedResource: Job) = (updatedResource.metadata.value.labels.value.toSeq should contain).allElementsOf(labels.toSeq) override def deleteApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Deletable[IO] = client.jobs.namespace(namespaceName) override def watchApi(namespaceName: String)(implicit client: KubernetesClient[IO]): Watchable[IO, Job] = client.jobs.namespace(namespaceName) }
Example 19
Source File: BookingViewProjectionWiring.scala From ticket-booking-aecor with Apache License 2.0 | 5 votes |
package ru.pavkin.booking.booking.view import aecor.data._ import aecor.distributedprocessing.DistributedProcessing import cats.effect.ConcurrentEffect import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import ru.pavkin.booking.booking.entity.{ BookingEvent, EventMetadata } import ru.pavkin.booking.booking.view.BookingViewProjectionWiring.EventSource import ru.pavkin.booking.common.models.BookingKey import ru.pavkin.booking.common.streaming.Fs2Process import ru.pavkin.booking.common.view.ProjectionFlow class BookingViewProjectionWiring[F[_]]( repo: BookingViewRepository[F], eventSource: (EventTag, ConsumerId) => EventSource[F], tagging: Tagging[BookingKey] )(implicit F: ConcurrentEffect[F]) { val consumerId = ConsumerId("BookingViewProjection") val sink = ProjectionFlow(Slf4jLogger.unsafeCreate[F], new BookingViewProjection[F](repo)) def tagProcess(tag: EventTag): fs2.Stream[F, Unit] = eventSource(tag, consumerId).through(sink) def processes: List[DistributedProcessing.Process[F]] = tagging.tags.map(tag => Fs2Process(tagProcess(tag))) } object BookingViewProjectionWiring { type EventSource[F[_]] = fs2.Stream[F, Committable[F, EntityEvent[BookingKey, Enriched[EventMetadata, BookingEvent]]]] }
Example 20
Source File: ProcessWirings.scala From ticket-booking-aecor with Apache License 2.0 | 5 votes |
package ru.pavkin.booking import aecor.data._ import aecor.distributedprocessing.DistributedProcessing import aecor.journal.postgres.Offset import akka.actor.ActorSystem import cats.effect.{ Clock, ConcurrentEffect, Timer } import cats.implicits._ import cats.temp.par._ import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import ru.pavkin.booking.booking.entity.{ BookingEvent, EventMetadata, EventsourcedBooking } import ru.pavkin.booking.booking.process.{ BookingPaymentProcess, _ } import ru.pavkin.booking.booking.view.BookingViewProjectionWiring import ru.pavkin.booking.common.models.BookingKey import scala.concurrent.duration._ final class ProcessWirings[F[_]: Timer: ConcurrentEffect: Par](system: ActorSystem, clock: Clock[F], postgresWirings: PostgresWirings[F], kafkaWirings: KafkaWirings[F], serviceWirings: ServiceWirings[F], entityWirings: EntityWirings[F]) { import serviceWirings._ import postgresWirings._ import kafkaWirings._ import entityWirings._ val distributedProcessing = DistributedProcessing(system) val bookingQueries = bookingsJournal.queries(journals.booking.pollingInterval).withOffsetStore(offsetStore) def bookingEvents( eventTag: EventTag, consumerId: ConsumerId ): fs2.Stream[F, Committable[F, (Offset, EntityEvent[BookingKey, Enriched[EventMetadata, BookingEvent]])]] = fs2.Stream.force(bookingQueries.eventsByTag(eventTag, consumerId)) val bookingViewProjection = new BookingViewProjectionWiring( bookingViewRepo, bookingEvents(_, _).map(_.map(_._2)), EventsourcedBooking.tagging ) val bookingConfirmationProcess = new BookingConfirmationProcess( bookings, confirmationService, Slf4jLogger.unsafeFromName("BookingConfirmationProcess") ) val bookingConfirmationProcessWiring = new BookingConfirmationProcessWiring( bookingEvents(_, _).map(_.map(_._2.map(_.event))), EventsourcedBooking.tagging, bookingConfirmationProcess ) val bookingExpirationProcess = new BookingExpirationProcess(bookings, bookingViewRepo) val bookingExpirationProcessWiring = new BookingExpirationProcessWiring(clock, frequency = 30.seconds, bookingExpirationProcess) val bookingPaymentProcess = new BookingPaymentProcess(bookings, Slf4jLogger.unsafeFromName("BookingPaymentProcess")) val bookingPaymentProcessWiring = new BookingPaymentProcessWiring(paymentReceivedEventStream, bookingPaymentProcess) // Launcher val launchProcesses: F[List[DistributedProcessing.KillSwitch[F]]] = List( "BookingViewProjectionProcessing" -> bookingViewProjection.processes, "BookingConfirmationProcessing" -> bookingConfirmationProcessWiring.processes, "BookingExpirationProcessing" -> bookingExpirationProcessWiring.processes, "BookingPaymentProcessing" -> bookingPaymentProcessWiring.processes ).parTraverse { case (name, processes) => distributedProcessing.start(name, processes) } }
Example 21
Source File: Context.scala From scala-steward with Apache License 2.0 | 5 votes |
package org.scalasteward.core.application import cats.Parallel import cats.effect._ import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.http4s.client.Client import org.http4s.client.asynchttpclient.AsyncHttpClient import org.scalasteward.core.buildtool.BuildToolDispatcher import org.scalasteward.core.buildtool.maven.MavenAlg import org.scalasteward.core.buildtool.mill.MillAlg import org.scalasteward.core.buildtool.sbt.SbtAlg import org.scalasteward.core.coursier.{CoursierAlg, VersionsCache} import org.scalasteward.core.edit.EditAlg import org.scalasteward.core.git.GitAlg import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg} import org.scalasteward.core.nurture.{NurtureAlg, PullRequestRepository} import org.scalasteward.core.persistence.JsonKeyValueStore import org.scalasteward.core.repocache.{RefreshErrorAlg, RepoCacheAlg, RepoCacheRepository} import org.scalasteward.core.repoconfig.RepoConfigAlg import org.scalasteward.core.scalafix.MigrationAlg import org.scalasteward.core.scalafmt.ScalafmtAlg import org.scalasteward.core.update.{FilterAlg, GroupMigrations, PruningAlg, UpdateAlg} import org.scalasteward.core.util._ import org.scalasteward.core.util.uri._ import org.scalasteward.core.vcs.data.AuthenticatedUser import org.scalasteward.core.vcs.{VCSApiAlg, VCSExtraAlg, VCSRepoAlg, VCSSelection} object Context { def create[F[_]: ConcurrentEffect: ContextShift: Parallel: Timer]( args: List[String] ): Resource[F, StewardAlg[F]] = for { blocker <- Blocker[F] cliArgs_ <- Resource.liftF(new Cli[F].parseArgs(args)) implicit0(config: Config) <- Resource.liftF(Config.create[F](cliArgs_)) implicit0(client: Client[F]) <- AsyncHttpClient.resource[F]() implicit0(logger: Logger[F]) <- Resource.liftF(Slf4jLogger.create[F]) implicit0(httpExistenceClient: HttpExistenceClient[F]) <- HttpExistenceClient.create[F] implicit0(user: AuthenticatedUser) <- Resource.liftF(config.vcsUser[F]) implicit0(fileAlg: FileAlg[F]) = FileAlg.create[F] implicit0(migrationAlg: MigrationAlg) <- Resource.liftF( MigrationAlg.create[F](config.scalafixMigrations) ) implicit0(groupMigration: GroupMigrations) <- Resource.liftF(GroupMigrations.create[F]) } yield { val kvsPrefix = Some(config.vcsType.asString) implicit val dateTimeAlg: DateTimeAlg[F] = DateTimeAlg.create[F] implicit val processAlg: ProcessAlg[F] = ProcessAlg.create[F](blocker) implicit val workspaceAlg: WorkspaceAlg[F] = WorkspaceAlg.create[F] implicit val repoConfigAlg: RepoConfigAlg[F] = new RepoConfigAlg[F] implicit val filterAlg: FilterAlg[F] = new FilterAlg[F] implicit val gitAlg: GitAlg[F] = GitAlg.create[F] implicit val httpJsonClient: HttpJsonClient[F] = new HttpJsonClient[F] implicit val repoCacheRepository: RepoCacheRepository[F] = new RepoCacheRepository[F](new JsonKeyValueStore("repo_cache", "1", kvsPrefix)) implicit val selfCheckAlg: SelfCheckAlg[F] = new SelfCheckAlg[F] val vcsSelection = new VCSSelection[F] implicit val vcsApiAlg: VCSApiAlg[F] = vcsSelection.getAlg(config) implicit val vcsRepoAlg: VCSRepoAlg[F] = VCSRepoAlg.create[F](config, gitAlg) implicit val vcsExtraAlg: VCSExtraAlg[F] = VCSExtraAlg.create[F] implicit val pullRequestRepository: PullRequestRepository[F] = new PullRequestRepository[F](new JsonKeyValueStore("pull_requests", "2", kvsPrefix)) implicit val scalafmtAlg: ScalafmtAlg[F] = ScalafmtAlg.create[F] implicit val coursierAlg: CoursierAlg[F] = CoursierAlg.create[F] implicit val versionsCache: VersionsCache[F] = new VersionsCache[F](config.cacheTtl, new JsonKeyValueStore("versions", "2")) implicit val updateAlg: UpdateAlg[F] = new UpdateAlg[F] implicit val mavenAlg: MavenAlg[F] = MavenAlg.create[F] implicit val sbtAlg: SbtAlg[F] = SbtAlg.create[F] implicit val millAlg: MillAlg[F] = MillAlg.create[F] implicit val buildToolDispatcher: BuildToolDispatcher[F] = BuildToolDispatcher.create[F] implicit val refreshErrorAlg: RefreshErrorAlg[F] = new RefreshErrorAlg[F](new JsonKeyValueStore("refresh_error", "1", kvsPrefix)) implicit val repoCacheAlg: RepoCacheAlg[F] = new RepoCacheAlg[F] implicit val editAlg: EditAlg[F] = new EditAlg[F] implicit val nurtureAlg: NurtureAlg[F] = new NurtureAlg[F] implicit val pruningAlg: PruningAlg[F] = new PruningAlg[F] new StewardAlg[F] } }
Example 22
Source File: Http4sClientSpec.scala From canoe with MIT License | 5 votes |
package canoe.api.clients import canoe.api._ import canoe.methods.Method import canoe.models.InputFile import cats.effect.IO import io.circe.{Decoder, Encoder} import org.http4s.HttpApp import org.http4s.client.Client import org.http4s.dsl.io._ import io.circe.Json import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.scalatest.freespec.AnyFreeSpec class Http4sClientSpec extends AnyFreeSpec { private case class TestMethod(name: String = "test", encoder: Encoder[String] = Encoder.encodeString, decoder: Decoder[String] = Decoder.decodeString, files: List[InputFile] = Nil) extends Method[String, String] { def attachments(request: String): List[(String, InputFile)] = files.map("" -> _) } private implicit val testMethod = TestMethod() private def response(s: String) = s"""{"ok" : true, "result" : "$s"}""" private implicit val logger = Slf4jLogger.getLogger[IO] "Client" - { "sends" - { "to correct Telegram endpoint" in { val client: Client[IO] = Client.fromHttpApp(HttpApp(r => Ok(response(r.uri.toString)))) val tgClient = new Http4sTelegramClient("token", client) assert(tgClient.execute("any").unsafeRunSync() == s"https://api.telegram.org/bottoken/${testMethod.name}") } val tgClient = new Http4sTelegramClient("", Client.fromHttpApp(HttpApp[IO] { r => Ok(response(r.headers.get(org.http4s.headers.`Content-Type`).map(_.value.replace("\"", "''")).getOrElse(""))) })) "json POST request if attachments contain file upload" in { assert(tgClient.execute("any").unsafeRunSync() == "application/json") } "multipart POST request if attachments contain file upload" in { val resp = tgClient.execute("any")(testMethod.copy(files = List(InputFile.Upload("", Array.emptyByteArray)))) assert(resp.unsafeRunSync().startsWith("multipart/form-data")) } } "encodes/decodes" - { "request entity with method encoder" in { val tgClient = new Http4sTelegramClient( "", Client.fromHttpApp(HttpApp[IO](_.bodyAsText.compile.string.flatMap(s => Ok(response(s.replace("\"", "'")))))) ) val res = tgClient.execute("")(testMethod.copy(encoder = Encoder.instance(_ => Json.fromString("encoded")))) assert(res.unsafeRunSync() == "'encoded'") } "result entity with method decoder" in { val tgClient = new Http4sTelegramClient("", Client.fromHttpApp(HttpApp[IO](_ => Ok(response(""))))) val res = tgClient.execute("")(testMethod.copy(decoder = Decoder.const("decoded"))) assert(res.unsafeRunSync() == "decoded") } } "handles" - { "decode failure as ResponseDecodingError" in { val tgClient = new Http4sTelegramClient("", Client.fromHttpApp(HttpApp[IO](_ => Ok("{}")))) assertThrows[ResponseDecodingError](tgClient.execute("any").unsafeRunSync()) } "unsuccessful result as FailedMethod" in { val response = """{"ok" : false, "result" : "any"}""" val tgClient = new Http4sTelegramClient("", Client.fromHttpApp(HttpApp[IO](_ => Ok(response)))) assertThrows[FailedMethod[String, String]](tgClient.execute("any").unsafeRunSync()) } } } }
Example 23
Source File: Hook.scala From canoe with MIT License | 5 votes |
package canoe.api.sources import canoe.api.{TelegramClient} import canoe.methods.webhooks.{DeleteWebhook, SetWebhook} import canoe.models.{InputFile, Update} import canoe.syntax.methodOps import cats.Monad import cats.effect.{ConcurrentEffect, Resource, Timer} import cats.syntax.all._ import fs2.Stream import fs2.concurrent.Queue import io.chrisdavenport.log4cats.Logger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger import org.http4s._ import org.http4s.circe.jsonOf import org.http4s.dsl.Http4sDsl import org.http4s.implicits._ import org.http4s.server.Server import org.http4s.server.blaze.BlazeServerBuilder class Hook[F[_]](queue: Queue[F, Update]) { def updates: Stream[F, Update] = queue.dequeue } object Hook { private def listenServer[F[_]: ConcurrentEffect: Timer: Logger](port: Int): Resource[F, Hook[F]] = { val dsl = Http4sDsl[F] import dsl._ def app(queue: Queue[F, Update]): HttpApp[F] = HttpRoutes .of[F] { case req @ POST -> Root => req .decodeWith(jsonOf[F, Update], strict = true)(queue.enqueue1(_) *> Ok()) .recoverWith { case InvalidMessageBodyFailure(details, _) => F.error(s"Received unknown type of update. $details") *> Ok() } } .orNotFound def server(queue: Queue[F, Update]): Resource[F, Server[F]] = BlazeServerBuilder[F].bindHttp(port).withHttpApp(app(queue)).resource Resource.suspend(Queue.unbounded[F, Update].map(q => server(q).map(_ => new Hook[F](q)))) } }