From 8e3660274060fbeb96a76532d544d67d6e14fa6b Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Sat, 19 Jul 2025 16:01:12 +0000 Subject: [PATCH 01/11] Update smithy4s-core, smithy4s-http4s, ... to 0.18.39 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index d0a2c8dd..1a9ee47e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.14.3") -addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.38") +addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.39") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") From 9478a9d4cb2be83afec8f8a324b71ccc7055f537 Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Sat, 19 Jul 2025 16:01:18 +0000 Subject: [PATCH 02/11] Update scalachess to 17.9.0 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 19cd409c..bef00802 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -9,7 +9,7 @@ object Dependencies { object V { val catsEffect = "3.6.2" - val chess = "17.8.5" + val chess = "17.9.0" val ciris = "3.9.0" val decline = "2.5.0" val elastic4s = "9.0.0" From 824910168fbae1d6ddb4a041528302a4a3e8b37b Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Wed, 23 Jul 2025 16:34:21 +0000 Subject: [PATCH 03/11] Update cats-effect to 3.6.3 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index bef00802..df6d108c 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -8,7 +8,7 @@ object Dependencies { val ourResolvers = Seq(lilaMaven, jitpack) object V { - val catsEffect = "3.6.2" + val catsEffect = "3.6.3" val chess = "17.9.0" val ciris = "3.9.0" val decline = "2.5.0" From adcf303d99abee49f1266dad223bb3e5e34bd73f Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Fri, 25 Jul 2025 09:40:02 +0200 Subject: [PATCH 04/11] scalafmt align.preset = none --- .sbtops | 2 + .scalafmt.conf | 2 +- modules/app/src/main/scala/app.config.scala | 8 +- modules/app/src/main/scala/app.scala | 12 +-- .../main/scala/http.routes.prometheus.scala | 2 +- .../app/src/main/scala/service.health.scala | 6 +- .../app/src/main/scala/service.search.scala | 16 ++-- modules/core/src/main/scala/models.scala | 14 +-- modules/e2e/src/test/scala/CompatSuite.scala | 6 +- .../test/scala/ElasticSearchContainer.scala | 6 +- .../e2e/src/test/scala/IntegrationSuite.scala | 12 +-- modules/elastic/src/main/scala/ESClient.scala | 8 +- modules/elastic/src/main/scala/forum.scala | 12 +-- modules/elastic/src/main/scala/game.scala | 38 ++++---- modules/elastic/src/main/scala/package.scala | 10 +- modules/elastic/src/main/scala/study.scala | 12 +-- modules/elastic/src/main/scala/team.scala | 4 +- modules/elastic/src/main/scala/ublog.scala | 8 +- .../ingestor/src/main/scala/app.config.scala | 2 +- modules/ingestor/src/main/scala/app.scala | 12 +-- modules/ingestor/src/main/scala/cli.scala | 10 +- modules/ingestor/src/main/scala/kvstore.scala | 2 +- .../src/main/scala/mongo.chapter.scala | 16 ++-- .../ingestor/src/main/scala/mongo.forum.scala | 14 +-- .../ingestor/src/main/scala/mongo.game.scala | 92 +++++++++---------- .../ingestor/src/main/scala/mongo.study.scala | 24 ++--- .../ingestor/src/main/scala/mongo.team.scala | 20 ++-- .../ingestor/src/main/scala/mongo.ublog.scala | 30 +++--- .../src/test/scala/HasDocIdTest.scala | 6 +- 29 files changed, 204 insertions(+), 202 deletions(-) create mode 100644 .sbtops diff --git a/.sbtops b/.sbtops new file mode 100644 index 00000000..27f4f7b4 --- /dev/null +++ b/.sbtops @@ -0,0 +1,2 @@ +-J--add-opens=java.base/java.util=ALL-UNNAMED +-J--add-opens=java.base/java.lang=ALL-UNNAMED diff --git a/.scalafmt.conf b/.scalafmt.conf index f84e447e..ca23448d 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,7 +1,7 @@ version = "3.9.8" runner.dialect = scala3 -align.preset = more +align.preset = none maxColumn = 110 spaces.inImportCurlyBraces = true diff --git a/modules/app/src/main/scala/app.config.scala b/modules/app/src/main/scala/app.config.scala index d45f4380..66a14127 100644 --- a/modules/app/src/main/scala/app.config.scala +++ b/modules/app/src/main/scala/app.config.scala @@ -32,13 +32,13 @@ case class HttpServerConfig( ) object HttpServerConfig: - private def host = env("HTTP_HOST").or(prop("http.host")).as[Host].default(ip"0.0.0.0") - private def port = env("HTTP_PORT").or(prop("http.port")).as[Port].default(port"9673") - private def logger = env("HTTP_API_LOGGER").or(prop("http.api.logger")).as[Boolean].default(false) + private def host = env("HTTP_HOST").or(prop("http.host")).as[Host].default(ip"0.0.0.0") + private def port = env("HTTP_PORT").or(prop("http.port")).as[Port].default(port"9673") + private def logger = env("HTTP_API_LOGGER").or(prop("http.api.logger")).as[Boolean].default(false) private def shutdownTimeout = env("HTTP_SHUTDOWN_TIMEOUT").or(prop("http.shutdown.timeout")).as[Int].default(30) private def enableDocs = env("HTTP_ENABLE_DOCS").or(prop("http.enable.docs")).as[Boolean].default(false) - def config = (host, port, logger, shutdownTimeout, enableDocs).parMapN(HttpServerConfig.apply) + def config = (host, port, logger, shutdownTimeout, enableDocs).parMapN(HttpServerConfig.apply) case class ElasticConfig(uri: Uri) diff --git a/modules/app/src/main/scala/app.scala b/modules/app/src/main/scala/app.scala index c46b6543..5415aa50 100644 --- a/modules/app/src/main/scala/app.scala +++ b/modules/app/src/main/scala/app.scala @@ -15,19 +15,19 @@ import org.typelevel.otel4s.sdk.metrics.exporter.MetricExporter object App extends IOApp.Simple: given LoggerFactory[IO] = Slf4jFactory.create[IO] - given Logger[IO] = LoggerFactory[IO].getLogger + given Logger[IO] = LoggerFactory[IO].getLogger override def run: IO[Unit] = app.useForever def app: Resource[IO, Unit] = for given MetricExporter.Pull[IO] <- PrometheusMetricExporter.builder[IO].build.toResource - given Meter[IO] <- mkMeter - _ <- RuntimeMetrics.register[IO] - config <- AppConfig.load.toResource - _ <- Logger[IO].info(s"Starting lila-search with config: ${config.toString}").toResource + given Meter[IO] <- mkMeter + _ <- RuntimeMetrics.register[IO] + config <- AppConfig.load.toResource + _ <- Logger[IO].info(s"Starting lila-search with config: ${config.toString}").toResource res <- AppResources.instance(config) - _ <- mkServer(res, config) + _ <- mkServer(res, config) yield () def mkMeter(using exporter: MetricExporter.Pull[IO]) = SdkMetrics diff --git a/modules/app/src/main/scala/http.routes.prometheus.scala b/modules/app/src/main/scala/http.routes.prometheus.scala index e33763e9..8dd35aa9 100644 --- a/modules/app/src/main/scala/http.routes.prometheus.scala +++ b/modules/app/src/main/scala/http.routes.prometheus.scala @@ -8,6 +8,6 @@ import org.typelevel.otel4s.sdk.exporter.prometheus.* import org.typelevel.otel4s.sdk.metrics.exporter.MetricExporter def mkPrometheusRoutes(using exporter: MetricExporter.Pull[IO]): HttpRoutes[IO] = - val writerConfig = PrometheusWriter.Config.default + val writerConfig = PrometheusWriter.Config.default val prometheusRoutes = PrometheusHttpRoutes.routes[IO](exporter, writerConfig) Router("/metrics" -> prometheusRoutes) diff --git a/modules/app/src/main/scala/service.health.scala b/modules/app/src/main/scala/service.health.scala index cea3ca1d..3c3f8bfa 100644 --- a/modules/app/src/main/scala/service.health.scala +++ b/modules/app/src/main/scala/service.health.scala @@ -20,7 +20,7 @@ class HealthServiceImpl(esClient: ESClient[IO])(using LoggerFactory[IO]) extends private def transform(status: String): IO[ElasticStatus] = status match - case "green" => ElasticStatus.green.pure[IO] + case "green" => ElasticStatus.green.pure[IO] case "yellow" => ElasticStatus.yellow.pure[IO] - case "red" => ElasticStatus.red.pure[IO] - case _ => IO.raiseError(new Exception(s"Unknown status: $status")) + case "red" => ElasticStatus.red.pure[IO] + case _ => IO.raiseError(new Exception(s"Unknown status: $status")) diff --git a/modules/app/src/main/scala/service.search.scala b/modules/app/src/main/scala/service.search.scala index f6e5db79..ed9ff73f 100644 --- a/modules/app/src/main/scala/service.search.scala +++ b/modules/app/src/main/scala/service.search.scala @@ -26,7 +26,7 @@ class SearchServiceImpl(esClient: ESClient[IO], metric: Histogram[IO, Double])(u private val logger: Logger[IO] = LoggerFactory[IO].getLogger private val baseAttributes = Attributes(Attribute("http.request.method", "POST")) - private val countMetric = + private val countMetric = metric .recordDuration( TimeUnit.MILLISECONDS, @@ -46,7 +46,7 @@ class SearchServiceImpl(esClient: ESClient[IO], metric: Histogram[IO, Double])(u ) ) - private def countRecord[A](f: IO[A]) = countMetric.surround(f) + private def countRecord[A](f: IO[A]) = countMetric.surround(f) private def searchRecord[A](f: IO[A]) = searchMetric.surround(f) override def count(query: Query): IO[CountOutput] = @@ -84,24 +84,24 @@ object SearchServiceImpl: query match case q: Query.Forum => q.to[Forum].searchDef(from, size) case q: Query.Ublog => q.to[Ublog].searchDef(from, size) - case q: Query.Game => q.to[Game].searchDef(from, size) + case q: Query.Game => q.to[Game].searchDef(from, size) case q: Query.Study => q.to[Study].searchDef(from, size) - case q: Query.Team => q.to[Team].searchDef(from, size) + case q: Query.Team => q.to[Team].searchDef(from, size) def countDef = query match case q: Query.Forum => q.to[Forum].countDef case q: Query.Ublog => q.to[Ublog].countDef - case q: Query.Game => q.to[Game].countDef + case q: Query.Game => q.to[Game].countDef case q: Query.Study => q.to[Study].countDef - case q: Query.Team => q.to[Team].countDef + case q: Query.Team => q.to[Team].countDef def index = query match case _: Query.Forum => Index.Forum case _: Query.Ublog => Index.Ublog - case _: Query.Game => Index.Game + case _: Query.Game => Index.Game case _: Query.Study => Index.Study - case _: Query.Team => Index.Team + case _: Query.Team => Index.Team def apply(elastic: ESClient[IO])(using Meter[IO], LoggerFactory[IO]): IO[SearchService[IO]] = Meter[IO] diff --git a/modules/core/src/main/scala/models.scala b/modules/core/src/main/scala/models.scala index b99a7c43..e6d5f638 100644 --- a/modules/core/src/main/scala/models.scala +++ b/modules/core/src/main/scala/models.scala @@ -17,32 +17,32 @@ object SearchDateTime: def fromInstant(value: java.time.Instant): SearchDateTime = formatter.format(value) - val format = "yyyy-MM-dd HH:mm:ss" + val format = "yyyy-MM-dd HH:mm:ss" val formatter = java.time.format.DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()) extension (x: SearchDateTime) def value: String = x opaque type Id = String object Id: - def apply(value: String): Id = value + def apply(value: String): Id = value extension (x: Id) def value: String = x enum Index(val value: String): case Forum extends Index("forum") case Ublog extends Index("ublog") - case Game extends Index("game") + case Game extends Index("game") case Study extends Index("study") - case Team extends Index("team") + case Team extends Index("team") object Index: def fromString(value: String): Either[String, Index] = value match case "forum" => Index.Forum.asRight case "ublog" => Index.Ublog.asRight - case "game" => Index.Game.asRight + case "game" => Index.Game.asRight case "study" => Index.Study.asRight - case "team" => Index.Team.asRight - case _ => s"Invalid index: $value. It must be in ${Index.valuesStrings}".asLeft + case "team" => Index.Team.asRight + case _ => s"Invalid index: $value. It must be in ${Index.valuesStrings}".asLeft private def valuesStrings = Index.values.map(_.value).toList.mkString_("{", ", ", "}") diff --git a/modules/e2e/src/test/scala/CompatSuite.scala b/modules/e2e/src/test/scala/CompatSuite.scala index 68492e7d..e628eed6 100644 --- a/modules/e2e/src/test/scala/CompatSuite.scala +++ b/modules/e2e/src/test/scala/CompatSuite.scala @@ -20,9 +20,9 @@ import scala.concurrent.ExecutionContext.Implicits.* object CompatSuite extends weaver.IOSuite: - given Logger[IO] = NoOpLogger[IO] + given Logger[IO] = NoOpLogger[IO] given LoggerFactory[IO] = NoOpFactory[IO] - given Meter[IO] = Meter.noop[IO] + given Meter[IO] = Meter.noop[IO] override type Res = SearchClient @@ -30,7 +30,7 @@ object CompatSuite extends weaver.IOSuite: val res = AppResources(fakeClient) for given MetricExporter.Pull[IO] <- PrometheusMetricExporter.builder[IO].build.toResource - res <- App + res <- App .mkServer(res, testAppConfig) .flatMap(_ => wsClient) .map(SearchClient.play(_, "http://localhost:9999/api")) diff --git a/modules/e2e/src/test/scala/ElasticSearchContainer.scala b/modules/e2e/src/test/scala/ElasticSearchContainer.scala index 2dadbf1d..de49f90c 100644 --- a/modules/e2e/src/test/scala/ElasticSearchContainer.scala +++ b/modules/e2e/src/test/scala/ElasticSearchContainer.scala @@ -8,12 +8,12 @@ import org.testcontainers.containers.wait.strategy.Wait object ElasticSearchContainer: - private val PORT = 9200 + private val PORT = 9200 private val container = val env = Map( - "discovery.type" -> "single-node", + "discovery.type" -> "single-node", "http.cors.allow-origin" -> "/.*/", - "http.cors.enabled" -> "true", + "http.cors.enabled" -> "true", "xpack.security.enabled" -> "false" ) val start = IO( diff --git a/modules/e2e/src/test/scala/IntegrationSuite.scala b/modules/e2e/src/test/scala/IntegrationSuite.scala index 337131d4..59abc78b 100644 --- a/modules/e2e/src/test/scala/IntegrationSuite.scala +++ b/modules/e2e/src/test/scala/IntegrationSuite.scala @@ -19,9 +19,9 @@ import java.time.Instant object IntegrationSuite extends IOSuite: - given Logger[IO] = NoOpLogger[IO] + given Logger[IO] = NoOpLogger[IO] given LoggerFactory[IO] = NoOpFactory[IO] - given Meter[IO] = Meter.noop[IO] + given Meter[IO] = Meter.noop[IO] private val uri = Uri.unsafeFromString("http://localhost:9999") @@ -33,9 +33,9 @@ object IntegrationSuite extends IOSuite: for elastic <- ElasticSearchContainer.start config = testAppConfig(elastic) - res <- AppResources.instance(config) + res <- AppResources.instance(config) given MetricExporter.Pull[IO] <- PrometheusMetricExporter.builder[IO].build.toResource - _ <- App.mkServer(res, config) + _ <- App.mkServer(res, config) yield res def testAppConfig(elastic: ElasticConfig) = AppConfig( @@ -142,9 +142,9 @@ object IntegrationSuite extends IOSuite: c <- service.search(Query.study("topic1"), from, size) yield expect(a.hitIds.size == 1 && b == a && c == a) - val defaultIntRange = IntRange(none, none) + val defaultIntRange = IntRange(none, none) val defaultDateRange = DateRange(none, none) - val defaultGame = Query.game( + val defaultGame = Query.game( turns = defaultIntRange, averageRating = defaultIntRange, aiLevel = defaultIntRange, diff --git a/modules/elastic/src/main/scala/ESClient.scala b/modules/elastic/src/main/scala/ESClient.scala index d5d80756..6ee6751f 100644 --- a/modules/elastic/src/main/scala/ESClient.scala +++ b/modules/elastic/src/main/scala/ESClient.scala @@ -97,7 +97,7 @@ object ESClient: .flatMap(_.unitOrFail) def storeBulk[A](index: Index, objs: Seq[SourceWithId[A]])(using Indexable[A]): F[Unit] = - val request = indexInto(index.value) + val request = indexInto(index.value) val requests = bulk(objs.map { case (id, source) => request.source(source).id(id) }) metric .recordDuration( @@ -167,9 +167,9 @@ object ESClient: object MetricKeys: val dbCollectionName = AttributeKey.string("db.collection.name") - val dbBatchSize = AttributeKey.long("db.operation.batch.size") - val dbOperationName = AttributeKey.string("db.operation.name") - val errorType = AttributeKey.string("error.type") + val dbBatchSize = AttributeKey.long("db.operation.batch.size") + val dbOperationName = AttributeKey.string("db.operation.name") + val errorType = AttributeKey.string("error.type") private def withErrorType(static: Attributes)(ec: Resource.ExitCase): Attributes = ec match case Resource.ExitCase.Succeeded => diff --git a/modules/elastic/src/main/scala/forum.scala b/modules/elastic/src/main/scala/forum.scala index d59df1d9..20f83a99 100644 --- a/modules/elastic/src/main/scala/forum.scala +++ b/modules/elastic/src/main/scala/forum.scala @@ -25,16 +25,16 @@ case class Forum(text: String, troll: Boolean): ).flatten.compile object Forum: - val index = "forum" + val index = "forum" private val searchableFields = List(Fields.body, Fields.topic, Fields.author) object Fields: - val body = "bo" - val topic = "to" + val body = "bo" + val topic = "to" val topicId = "ti" - val author = "au" - val troll = "tr" - val date = "da" + val author = "au" + val troll = "tr" + val date = "da" object Mapping: import Fields.* diff --git a/modules/elastic/src/main/scala/game.scala b/modules/elastic/src/main/scala/game.scala index 5556203b..b6aa6d82 100644 --- a/modules/elastic/src/main/scala/game.scala +++ b/modules/elastic/src/main/scala/game.scala @@ -56,7 +56,7 @@ case class Game( def toQueries(query: Option[String | Int | Boolean], name: String): List[TermQuery] = query.toList.map: case s: String => termQuery(name, s.toLowerCase) - case x => termQuery(name, x) + case x => termQuery(name, x) List( usernames.map(termQuery(Fields.uids, _)), @@ -81,24 +81,24 @@ case class Game( ).flatten.compile object Fields: - val status = "s" - val turns = "t" - val rated = "r" - val perf = "p" - val uids = "u" - val winner = "w" - val loser = "o" - val winnerColor = "c" + val status = "s" + val turns = "t" + val rated = "r" + val perf = "p" + val uids = "u" + val winner = "w" + val loser = "o" + val winnerColor = "c" val averageRating = "a" - val ai = "i" - val date = "d" - val duration = "l" - val clockInit = "ct" - val clockInc = "ci" - val analysed = "n" - val whiteUser = "wu" - val blackUser = "bu" - val source = "so" + val ai = "i" + val date = "d" + val duration = "l" + val clockInit = "ct" + val clockInc = "ci" + val analysed = "n" + val whiteUser = "wu" + val blackUser = "bu" + val source = "so" object Mapping: import Fields.* @@ -135,5 +135,5 @@ case class Sorting(f: String, order: String): object Sorting: - val default = Sorting(Fields.date, "desc") + val default = Sorting(Fields.date, "desc") val fieldKeys = List(Fields.date, Fields.turns, Fields.averageRating) diff --git a/modules/elastic/src/main/scala/package.scala b/modules/elastic/src/main/scala/package.scala index e791c479..616e6fae 100644 --- a/modules/elastic/src/main/scala/package.scala +++ b/modules/elastic/src/main/scala/package.scala @@ -12,9 +12,9 @@ extension (self: Boolean) def fold[A](t: => A, f: => A): A = if self then t else extension (queries: List[Query]) def compile: Query = queries match - case Nil => matchAllQuery() + case Nil => matchAllQuery() case q :: Nil => q - case _ => boolQuery().filter(queries) + case _ => boolQuery().filter(queries) extension (index: Index) def toES: ESIndex = ESIndex(index.value) @@ -22,14 +22,14 @@ extension (index: Index) def mapping = index match case Index.Forum => forum.Mapping.fields case Index.Ublog => ublog.Mapping.fields - case Index.Game => game.Mapping.fields + case Index.Game => game.Mapping.fields case Index.Study => study.Mapping.fields - case Index.Team => team.Mapping.fields + case Index.Team => team.Mapping.fields def refreshInterval = index match case Index.Study => "10s" - case _ => "300s" + case _ => "300s" extension [F[_]: MonadThrow, A](response: Response[A]) def toResult: F[A] = diff --git a/modules/elastic/src/main/scala/study.scala b/modules/elastic/src/main/scala/study.scala index d7ec6b66..b7110df4 100644 --- a/modules/elastic/src/main/scala/study.scala +++ b/modules/elastic/src/main/scala/study.scala @@ -21,7 +21,7 @@ case class Study(text: String, userId: Option[String]): def countDef = count(Study.index).query(makeQuery()) private def makeQuery() = { - val parsed = QueryParser(text, List("owner", "member")) + val parsed = QueryParser(text, List("owner", "member")) val matcher: Query = if parsed.terms.isEmpty then matchAllQuery() else @@ -50,16 +50,16 @@ case class Study(text: String, userId: Option[String]): private def selectUserId(userId: String) = termQuery(Fields.members, userId) object Fields: - val name = "name" - val owner = "owner" - val members = "members" + val name = "name" + val owner = "owner" + val members = "members" val chapterNames = "chapterNames" val chapterTexts = "chapterTexts" - val topics = "topics" + val topics = "topics" // val createdAt = "createdAt" // val updatedAt = "updatedAt" // val rank = "rank" - val likes = "likes" + val likes = "likes" val public = "public" object Mapping: diff --git a/modules/elastic/src/main/scala/team.scala b/modules/elastic/src/main/scala/team.scala index b663f208..ea654bb5 100644 --- a/modules/elastic/src/main/scala/team.scala +++ b/modules/elastic/src/main/scala/team.scala @@ -20,9 +20,9 @@ case class Team(text: String): QueryParser(text, Nil).terms.map(term => multiMatchQuery(term).fields(Team.searchableFields*)).compile private object Fields: - val name = "na" + val name = "na" val description = "de" - val nbMembers = "nbm" + val nbMembers = "nbm" object Mapping: import Fields.* diff --git a/modules/elastic/src/main/scala/ublog.scala b/modules/elastic/src/main/scala/ublog.scala index 0f0ee927..3d7d26e2 100644 --- a/modules/elastic/src/main/scala/ublog.scala +++ b/modules/elastic/src/main/scala/ublog.scala @@ -58,11 +58,11 @@ object Ublog: val index = "ublog" object Fields: - val text = "text" - val likes = "likes" - val quality = "quality" + val text = "text" + val likes = "likes" + val quality = "quality" val language = "language" - val date = "date" + val date = "date" object Mapping: import Fields.* diff --git a/modules/ingestor/src/main/scala/app.config.scala b/modules/ingestor/src/main/scala/app.config.scala index 1f4f4e16..8763b846 100644 --- a/modules/ingestor/src/main/scala/app.config.scala +++ b/modules/ingestor/src/main/scala/app.config.scala @@ -35,7 +35,7 @@ private def studyDatabase = object MongoConfig: - private def uri = env("MONGO_URI").or(prop("mongo.uri")).as[String] + private def uri = env("MONGO_URI").or(prop("mongo.uri")).as[String] private def name = env("MONGO_DATABASE").or(prop("mongo.database")).as[String].default("lichess") private def studyUri = env("MONGO_STUDY_URI").or(prop("mongo.study.uri")).as[String] diff --git a/modules/ingestor/src/main/scala/app.scala b/modules/ingestor/src/main/scala/app.scala index c2c47130..8aa6f6eb 100644 --- a/modules/ingestor/src/main/scala/app.scala +++ b/modules/ingestor/src/main/scala/app.scala @@ -14,19 +14,19 @@ import org.typelevel.otel4s.sdk.metrics.SdkMetrics object App extends IOApp.Simple: given LoggerFactory[IO] = Slf4jFactory.create[IO] - given Logger[IO] = LoggerFactory[IO].getLogger + given Logger[IO] = LoggerFactory[IO].getLogger override def run: IO[Unit] = app.useForever def app: Resource[IO, Unit] = for given Meter[IO] <- mkMeter - _ <- RuntimeMetrics.register[IO] - config <- AppConfig.load.toResource - _ <- Logger[IO].info(s"Starting lila-search ingestor with config: ${config.toString}").toResource - _ <- Logger[IO].info(s"BuildInfo: ${BuildInfo.toString}").toResource + _ <- RuntimeMetrics.register[IO] + config <- AppConfig.load.toResource + _ <- Logger[IO].info(s"Starting lila-search ingestor with config: ${config.toString}").toResource + _ <- Logger[IO].info(s"BuildInfo: ${BuildInfo.toString}").toResource res <- AppResources.instance(config) - _ <- IngestorApp(res, config).run() + _ <- IngestorApp(res, config).run() yield () def mkMeter = SdkMetrics diff --git a/modules/ingestor/src/main/scala/cli.scala b/modules/ingestor/src/main/scala/cli.scala index c512c2f2..0bc99ed2 100644 --- a/modules/ingestor/src/main/scala/cli.scala +++ b/modules/ingestor/src/main/scala/cli.scala @@ -22,9 +22,9 @@ object cli ): given LoggerFactory[IO] = Slf4jFactory.create[IO] - given Logger[IO] = LoggerFactory[IO].getLogger - given Meter[IO] = Meter.noop[IO] - given IORuntime = runtime + given Logger[IO] = LoggerFactory[IO].getLogger + given Meter[IO] = Meter.noop[IO] + given IORuntime = runtime override def main: Opts[IO[ExitCode]] = opts.parse.map: opts => @@ -32,8 +32,8 @@ object cli def makeIngestor: Resource[IO, Ingestors] = for - config <- AppConfig.load.toResource - res <- AppResources.instance(config) + config <- AppConfig.load.toResource + res <- AppResources.instance(config) ingestor <- Ingestors( res.lichess, res.study, diff --git a/modules/ingestor/src/main/scala/kvstore.scala b/modules/ingestor/src/main/scala/kvstore.scala index c1da8b6c..6163964b 100644 --- a/modules/ingestor/src/main/scala/kvstore.scala +++ b/modules/ingestor/src/main/scala/kvstore.scala @@ -15,7 +15,7 @@ trait KVStore: object KVStore: - val file: String = "store.json" + val file: String = "store.json" given JsonValueCodec[Map[String, Long]] = JsonCodecMaker.make type State = Map[String, Long] diff --git a/modules/ingestor/src/main/scala/mongo.chapter.scala b/modules/ingestor/src/main/scala/mongo.chapter.scala index 60a0af11..834753a1 100644 --- a/modules/ingestor/src/main/scala/mongo.chapter.scala +++ b/modules/ingestor/src/main/scala/mongo.chapter.scala @@ -46,7 +46,7 @@ object StudyData: given Decoder[Tag] = Decoder.decodeString.emap: s => s.split(":", 2) match case Array(name, value) => Tag(name, value).asRight - case _ => "Invalid pgn tag $v".asLeft + case _ => "Invalid pgn tag $v".asLeft given Encoder[Tag] = Encoder.encodeString.contramap(t => s"${t.name.toString}:${t.value}") @@ -69,16 +69,16 @@ object ChapterRepo: object F: - val name = "name" - val studyId = "studyId" - val tags = "tags" - val conceal = "conceal" + val name = "name" + val studyId = "studyId" + val tags = "tags" + val conceal = "conceal" val description = "description" - val practice = "practice" - val gamebook = "gamebook" + val practice = "practice" + val gamebook = "gamebook" // accumulates comments into a list - val comments = "comments" + val comments = "comments" val commentTexts = "comments.v.co.text" object Query: diff --git a/modules/ingestor/src/main/scala/mongo.forum.scala b/modules/ingestor/src/main/scala/mongo.forum.scala index 57f3de7b..a590680c 100644 --- a/modules/ingestor/src/main/scala/mongo.forum.scala +++ b/modules/ingestor/src/main/scala/mongo.forum.scala @@ -28,7 +28,7 @@ object ForumRepo: Filter.in("operationType", interestedOperations) && maxPostSizeFilter(maxPostLength) private val interestedFields = List(_id, F.text, F.topicId, F.troll, F.createdAt, F.userId, F.erasedAt) - private val postProjection = Projection.include(interestedFields) + private val postProjection = Projection.include(interestedFields) private val interestedEventFields = List("operationType", "clusterTime", "documentKey._id") ++ interestedFields.map("fullDocument." + _) @@ -82,7 +82,7 @@ object ForumRepo: .evalTap(_.traverse_(x => debug"received $x")) .map(_.toList.distincByDocId) .evalMap: events => - val lastEventTimestamp = events.flatten(using _.clusterTime.flatMap(_.asInstant)).maxOption + val lastEventTimestamp = events.flatten(using _.clusterTime.flatMap(_.asInstant)).maxOption val (toDelete, toIndex) = events.partition(_.isDelete) toIndex .flatten(using _.fullDocument) @@ -148,13 +148,13 @@ object ForumRepo: event.operationType == DELETE || event.fullDocument.exists(_.isErased) object F: - val text = "text" - val topicId = "topicId" - val troll = "troll" - val userId = "userId" + val text = "text" + val topicId = "topicId" + val troll = "troll" + val userId = "userId" val createdAt = "createdAt" val updatedAt = "updatedAt" - val erasedAt = "erasedAt" + val erasedAt = "erasedAt" object Topic: val name = "name" diff --git a/modules/ingestor/src/main/scala/mongo.game.scala b/modules/ingestor/src/main/scala/mongo.game.scala index 203af199..84debcba 100644 --- a/modules/ingestor/src/main/scala/mongo.game.scala +++ b/modules/ingestor/src/main/scala/mongo.game.scala @@ -25,7 +25,7 @@ import Repo.{ *, given } object GameRepo: private val interestedOperations = List(UPDATE, DELETE).map(_.getValue) - private val eventFilter = Filter.in("operationType", interestedOperations) + private val eventFilter = Filter.in("operationType", interestedOperations) private val interestedEventFields = List( @@ -41,7 +41,7 @@ object GameRepo: val gameFilter: Filter = // Filter games that finished // https://github.com/lichess-org/scalachess/blob/18edf46a50445048fdc2ee5a83752e5b3884f490/core/src/main/scala/Status.scala#L18-L27 - val statusFilter = Filter.gte("s", 30) + val statusFilter = Filter.gte("s", 30) val noImportFilter = Filter.ne("so", 7) // us fields is the list of player ids, if it's missing then it's // an all anonymous (or anonymous vs stockfish) game @@ -52,7 +52,7 @@ object GameRepo: val changeFilter: Filter = // Filter games that finished // https://github.com/lichess-org/scalachess/blob/18edf46a50445048fdc2ee5a83752e5b3884f490/core/src/main/scala/Status.scala#L18-L27 - val statusFilter = Filter.gte("fullDocument.s", 30) + val statusFilter = Filter.gte("fullDocument.s", 30) val noImportFilter = Filter.ne("fullDocument.so", 7) // us fields is the list of player ids, if it's missing then it's // an all anonymous (or anonymous vs stockfish) game @@ -75,7 +75,7 @@ object GameRepo: def watch(since: Option[Instant]): fs2.Stream[IO, Result[GameSource]] = changes(since) .map: events => - val lastEventTimestamp = events.lastOption.flatMap(_.clusterTime).flatMap(_.asInstant) + val lastEventTimestamp = events.lastOption.flatMap(_.clusterTime).flatMap(_.asInstant) val (toDelete, toIndex) = events.partition(_.operationType == DELETE) Result( toIndex.flatten(using _.fullDocument.map(_.toSource)), @@ -117,44 +117,44 @@ object GameRepo: type PlayerId = String case class DbGame( - id: String, // _id - players: List[PlayerId], // us - winnerId: Option[PlayerId], // wid - createdAt: Instant, // ca - movedAt: Instant, // ua - ply: Int, // t - analysed: Option[Boolean], // an - whitePlayer: Option[DbPlayer], // p0 - blackPlayer: Option[DbPlayer], // p1 - playerIds: String, // is - binaryPieces: Option[Array[Byte]], // ps - huffmanPgn: Option[Array[Byte]], // hp - status: Int, // s - encodedClock: Option[Array[Byte]], // c - moveTimes: Option[Array[Byte]], // mt + id: String, // _id + players: List[PlayerId], // us + winnerId: Option[PlayerId], // wid + createdAt: Instant, // ca + movedAt: Instant, // ua + ply: Int, // t + analysed: Option[Boolean], // an + whitePlayer: Option[DbPlayer], // p0 + blackPlayer: Option[DbPlayer], // p1 + playerIds: String, // is + binaryPieces: Option[Array[Byte]], // ps + huffmanPgn: Option[Array[Byte]], // hp + status: Int, // s + encodedClock: Option[Array[Byte]], // c + moveTimes: Option[Array[Byte]], // mt encodedWhiteClock: Option[Array[Byte]], // cw encodedBlackClock: Option[Array[Byte]], // cb - rated: Option[Boolean], // ra - variant: Option[Int], // v - source: Option[Int], // so - winnerColor: Option[Boolean] // w + rated: Option[Boolean], // ra + variant: Option[Int], // v + source: Option[Int], // so + winnerColor: Option[Boolean] // w ): def clockConfig: Option[Config] = encodedClock.flatMap(ClockDecoder.read) - def clockInit: Option[Int] = clockConfig.map(_.limitSeconds.value) - def clockInc: Option[Int] = clockConfig.map(_.incrementSeconds.value) - def whiteId: Option[PlayerId] = players.headOption - def blackId: Option[PlayerId] = players.lift(1) - def variantOrDefault: Variant = Variant.idOrDefault(variant.map(Variant.Id.apply)) - def speed: Speed = Speed(clockConfig) - def loser: Option[PlayerId] = players.find(_.some != winnerId) - def aiLevel: Option[Int] = whitePlayer.flatMap(_.aiLevel).orElse(blackPlayer.flatMap(_.aiLevel)) + def clockInit: Option[Int] = clockConfig.map(_.limitSeconds.value) + def clockInc: Option[Int] = clockConfig.map(_.incrementSeconds.value) + def whiteId: Option[PlayerId] = players.headOption + def blackId: Option[PlayerId] = players.lift(1) + def variantOrDefault: Variant = Variant.idOrDefault(variant.map(Variant.Id.apply)) + def speed: Speed = Speed(clockConfig) + def loser: Option[PlayerId] = players.find(_.some != winnerId) + def aiLevel: Option[Int] = whitePlayer.flatMap(_.aiLevel).orElse(blackPlayer.flatMap(_.aiLevel)) // https://github.com/lichess-org/lila/blob/65e6dd88e99cfa0068bc790a4518a6edb3513f54/modules/core/src/main/game/Game.scala#L261 private def averageUsersRating = List(whitePlayer.flatMap(_.rating), blackPlayer.flatMap(_.rating)).flatten match case a :: b :: Nil => Some((a + b) / 2) - case a :: Nil => Some((a + 1500) / 2) - case _ => None + case a :: Nil => Some((a + 1500) / 2) + case _ => None // https://github.com/lichess-org/lila/blob/02ac57c4584b89a0df8f343f34074c0135c2d2b4/modules/core/src/main/game/Game.scala#L90-L97 def durationSeconds: Option[Int] = @@ -207,20 +207,20 @@ object DbGame: variant.match case Standard | FromPosition => speed match - case Speed.UltraBullet => 0 - case Speed.Bullet => 1 - case Speed.Blitz => 2 - case Speed.Rapid => 6 - case Speed.Classical => 3 + case Speed.UltraBullet => 0 + case Speed.Bullet => 1 + case Speed.Blitz => 2 + case Speed.Rapid => 6 + case Speed.Classical => 3 case Speed.Correspondence => 4 - case Crazyhouse => 18 - case Chess960 => 11 + case Crazyhouse => 18 + case Chess960 => 11 case KingOfTheHill => 12 - case ThreeCheck => 15 - case Antichess => 13 - case Atomic => 14 - case Horde => 16 - case RacingKings => 17 + case ThreeCheck => 15 + case Antichess => 13 + case Atomic => 14 + case Horde => 16 + case RacingKings => 17 case class DbPlayer( rating: Option[Int], @@ -246,4 +246,4 @@ object ClockDecoder: def read(ba: Array[Byte]): Option[Clock.Config] = ba.take(2).map(toInt) match case Array(b1, b2) => Clock.Config(readClockLimit(b1), Clock.IncrementSeconds(b2)).some - case _ => None + case _ => None diff --git a/modules/ingestor/src/main/scala/mongo.study.scala b/modules/ingestor/src/main/scala/mongo.study.scala index 19a76df6..5cfa41d2 100644 --- a/modules/ingestor/src/main/scala/mongo.study.scala +++ b/modules/ingestor/src/main/scala/mongo.study.scala @@ -17,7 +17,7 @@ object StudyRepo: private val interestedfields = List("_id", F.name, F.members, F.ownerId, F.visibility, F.topics, F.likes) - private val indexDocProjection = Projection.include(interestedfields) + private val indexDocProjection = Projection.include(interestedfields) private val deleteDocProjection = Projection.include(F.oplogId) def apply( @@ -122,11 +122,11 @@ object StudyRepo: + doc.getChapterTexts(chapters).fold("missing doc.chapterTexts; ")(_ => "") info"failed to convert document to source: $doc because $reason".whenA(source.isEmpty) - private def getName = doc.getString(F.name) + private def getName = doc.getString(F.name) private def getOwnerId = doc.getString(F.ownerId) private def getMembers = doc.getDocument(F.members).fold(Nil)(_.toMap.keys.toList) - private def getTopics = doc.getList(F.topics).map(_.flatMap(_.asString)).getOrElse(Nil) - private def getLikes = doc.getInt(F.likes).getOrElse(0) + private def getTopics = doc.getList(F.topics).map(_.flatMap(_.asString)).getOrElse(Nil) + private def getLikes = doc.getInt(F.likes).getOrElse(0) private def getChapterTexts(chapters: Map[String, StudyData]) = chapters.get(doc.id.getOrElse("")).map(_.chapterTexts) private def getChapterNames(chapters: Map[String, StudyData]) = @@ -134,12 +134,12 @@ object StudyRepo: private def getPublic = doc.getString(F.visibility).map(_ == "public").getOrElse(true) object F: - val name = "name" - val likes = "likes" - val members = "members" - val ownerId = "ownerId" + val name = "name" + val likes = "likes" + val members = "members" + val ownerId = "ownerId" val visibility = "visibility" - val topics = "topics" - val createdAt = "createdAt" - val updatedAt = "updatedAt" - val oplogId = "o._id" + val topics = "topics" + val createdAt = "createdAt" + val updatedAt = "updatedAt" + val oplogId = "o._id" diff --git a/modules/ingestor/src/main/scala/mongo.team.scala b/modules/ingestor/src/main/scala/mongo.team.scala index 0adafd23..47afdf77 100644 --- a/modules/ingestor/src/main/scala/mongo.team.scala +++ b/modules/ingestor/src/main/scala/mongo.team.scala @@ -20,10 +20,10 @@ import Repo.{ *, given } object TeamRepo: private val interestedOperations = List(DELETE, INSERT, UPDATE, REPLACE).map(_.getValue) - private val eventFilter = Filter.in("operationType", interestedOperations) + private val eventFilter = Filter.in("operationType", interestedOperations) private val interestedFields = List("_id", F.name, F.description, F.nbMembers, F.name, F.enabled) - private val postProjection = Projection.include(interestedFields) + private val postProjection = Projection.include(interestedFields) private val interestedEventFields = List("operationType", "clusterTime", "documentKey._id") ++ interestedFields.map("fullDocument." + _) @@ -42,7 +42,7 @@ object TeamRepo: def watch(since: Option[Instant]) = // skip the first event if we're starting from a specific timestamp // since the event at that timestamp is already indexed - val skip = since.fold(0)(_ => 1) + val skip = since.fold(0)(_ => 1) val builder = teams.watch(aggregate) since .fold(builder)(x => builder.startAtOperationTime(x.asBsonTimestamp)) @@ -54,7 +54,7 @@ object TeamRepo: .groupWithin(config.batchSize, config.timeWindows.second) .map(_.toList.distincByDocId) .map: docs => - val lastEventTimestamp = docs.lastOption.flatMap(_.clusterTime).flatMap(_.asInstant) + val lastEventTimestamp = docs.lastOption.flatMap(_.clusterTime).flatMap(_.asInstant) val (toDelete, toIndex) = docs.partition(_.isDelete) Result( toIndex.flatten(using _.fullDocument).toSources, @@ -103,10 +103,10 @@ object TeamRepo: event.fullDocument.fold(false)(x => !x.isEnabled) object F: - val name = "name" + val name = "name" val description = "description" - val nbMembers = "nbMembers" - val enabled = "enabled" - val createdAt = "createdAt" - val updatedAt = "updatedAt" - val erasedAt = "erasedAt" + val nbMembers = "nbMembers" + val enabled = "enabled" + val createdAt = "createdAt" + val updatedAt = "updatedAt" + val erasedAt = "erasedAt" diff --git a/modules/ingestor/src/main/scala/mongo.ublog.scala b/modules/ingestor/src/main/scala/mongo.ublog.scala index 981d165e..0eb79b83 100644 --- a/modules/ingestor/src/main/scala/mongo.ublog.scala +++ b/modules/ingestor/src/main/scala/mongo.ublog.scala @@ -85,7 +85,7 @@ object UblogRepo: .groupWithin(config.batchSize, config.timeWindows.second) .map(_.toList.distincByDocId) .map: docs => - val lastEventTimestamp = docs.flatten(using _.clusterTime.flatMap(_.asInstant)).maxOption + val lastEventTimestamp = docs.flatten(using _.clusterTime.flatMap(_.asInstant)).maxOption val (toDelete, toIndex) = docs.partition(_.isDelete) Result( toIndex.flatten(using _.fullDocument).toSources, @@ -100,13 +100,13 @@ object UblogRepo: extension (doc: Document) private def toSource: Option[UblogSource] = for - title <- doc.getString(F.title) - intro <- doc.getString(F.intro) - body <- doc.getString(F.markdown) - author <- doc.getString(F.blog).map(_.split(":")(1)) + title <- doc.getString(F.title) + intro <- doc.getString(F.intro) + body <- doc.getString(F.markdown) + author <- doc.getString(F.blog).map(_.split(":")(1)) language <- doc.getString(F.language) - likes <- doc.getAs[Int](F.likes) - topics <- doc.getAs[List[String]](F.topics).map(_.mkString(" ").replaceAll("Chess", "")) + likes <- doc.getAs[Int](F.likes) + topics <- doc.getAs[List[String]](F.topics).map(_.mkString(" ").replaceAll("Chess", "")) text = s"$title\n$topics\n$author\n$intro\n$body" date <- doc.getNested(F.livedAt).flatMap(_.asInstant).map(_.toEpochMilli) quality = doc.getNestedAs[Int](F.quality) @@ -121,12 +121,12 @@ object UblogRepo: object F: val markdown = "markdown" - val title = "title" - val intro = "intro" - val blog = "blog" + val title = "title" + val intro = "intro" + val blog = "blog" val language = "language" - val likes = "likes" - val live = "live" - val livedAt = "lived.at" - val quality = "automod.quality" - val topics = "topics" + val likes = "likes" + val live = "live" + val livedAt = "lived.at" + val quality = "automod.quality" + val topics = "topics" diff --git a/modules/ingestor/src/test/scala/HasDocIdTest.scala b/modules/ingestor/src/test/scala/HasDocIdTest.scala index 33afa1dd..6bef44cd 100644 --- a/modules/ingestor/src/test/scala/HasDocIdTest.scala +++ b/modules/ingestor/src/test/scala/HasDocIdTest.scala @@ -14,7 +14,7 @@ object HasDocIdTest extends SimpleIOSuite with Checkers: given HasDocId[Change]: extension (a: Change) def docId: Option[String] = a.docId - given Show[Change] = Show.fromToString + given Show[Change] = Show.fromToString given Arbitrary[Change] = Arbitrary: for value <- Gen.posNum[Int] @@ -23,7 +23,7 @@ object HasDocIdTest extends SimpleIOSuite with Checkers: test("distincByDocId is empty when input is empty"): val changes = List.empty[Change] - val result = changes.distincByDocId + val result = changes.distincByDocId IO(expect(List.empty[Option[String]] == result)) test("distincByDocId is empty when all docIds are none"): @@ -41,6 +41,6 @@ object HasDocIdTest extends SimpleIOSuite with Checkers: test("distincByDocId == reverse.distincBy.reverse"): forall: (changes: List[Change]) => - val result = changes.distincByDocId + val result = changes.distincByDocId val doubleReversed = changes.reverse.filter(_.docId.isDefined).distinctBy(_.docId).reverse expect(result == doubleReversed) From 4ca256d5d710e6a332e0526b4e944857359969fe Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Fri, 25 Jul 2025 09:40:02 +0200 Subject: [PATCH 05/11] add scalafmt to git blame ignore revs --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 17f4776a..fef72f09 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -15,3 +15,6 @@ d233965417545163fb51ec91988f1a654a36b1b0 # Scala Steward: Reformat with scalafmt 3.9.8 ed503a2852d8148f39ac99b7188e47f569bdf01a + +# scalafmt align.preset = none +adcf303d99abee49f1266dad223bb3e5e34bd73f From f69055198143e01892814633185720875292c298 Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Fri, 25 Jul 2025 16:44:35 +0000 Subject: [PATCH 06/11] Update smithy4s-core, smithy4s-http4s, ... to 0.18.40 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 1a9ee47e..c7240eff 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.14.3") -addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.39") +addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.40") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") From 27094dcee186f31819ab0af134dac5f3d4bc4855 Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Fri, 25 Jul 2025 16:44:44 +0000 Subject: [PATCH 07/11] Update scalachess to 17.9.1 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index df6d108c..85d64b42 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -9,7 +9,7 @@ object Dependencies { object V { val catsEffect = "3.6.3" - val chess = "17.9.0" + val chess = "17.9.1" val ciris = "3.9.0" val decline = "2.5.0" val elastic4s = "9.0.0" From 80bdcf48f726029cc0f714b7137869de20dac585 Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Fri, 25 Jul 2025 16:44:47 +0000 Subject: [PATCH 08/11] Update jsoniter-scala-core, ... to 2.37.0 --- project/Dependencies.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index df6d108c..958006d1 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -45,8 +45,8 @@ object Dependencies { lazy val smithy4sHttp4sSwagger = smithy4s("http4s-swagger") lazy val smithy4sJson = smithy4s("json") - val jsoniterCore = "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.36.7" - val jsoniterMacro = "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.36.7" + val jsoniterCore = "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.37.0" + val jsoniterMacro = "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.37.0" val playWS = "com.typesafe.play" %% "play-ahc-ws-standalone" % "2.2.11" From c01d63bfdd681df9205b93815baa4b779f285b32 Mon Sep 17 00:00:00 2001 From: Scala Steward Date: Fri, 25 Jul 2025 16:44:51 +0000 Subject: [PATCH 09/11] Update weaver-cats, weaver-scalacheck to 0.9.3 --- project/Dependencies.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index df6d108c..8b33c998 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -71,8 +71,8 @@ object Dependencies { val declineCatsEffect = "com.monovore" %% "decline-effect" % V.decline val testContainers = "com.dimafeng" %% "testcontainers-scala-core" % "0.43.0" % Test - val weaver = "org.typelevel" %% "weaver-cats" % "0.9.2" % Test - val weaverScalaCheck = "org.typelevel" %% "weaver-scalacheck" % "0.9.2" % Test + val weaver = "org.typelevel" %% "weaver-cats" % "0.9.3" % Test + val weaverScalaCheck = "org.typelevel" %% "weaver-scalacheck" % "0.9.3" % Test val catsEffectTestKit = "org.typelevel" %% "cats-effect-testkit" % V.catsEffect % Test val scalacheck = "org.scalacheck" %% "scalacheck" % "1.17.0" % Test } From 39a2224029741bcbadb4c93b5ef2a53319546cf4 Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Sat, 26 Jul 2025 10:14:03 +0200 Subject: [PATCH 10/11] 3.2.1-SNAPSHOT --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index e451539c..ab540231 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -ThisBuild / version := "3.2.0" \ No newline at end of file +ThisBuild / version := "3.2.1-SNAPSHOT" \ No newline at end of file From ec0b98c7dc1716735bcfcf597499b2d799a9f8ad Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Sat, 26 Jul 2025 10:14:38 +0200 Subject: [PATCH 11/11] Setting version to 3.2.1 --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index ab540231..310864c6 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -ThisBuild / version := "3.2.1-SNAPSHOT" \ No newline at end of file +ThisBuild / version := "3.2.1"