From a248617e7407604df4e6604a290ca92d693e6633 Mon Sep 17 00:00:00 2001 From: Barry O'Neill Date: Thu, 10 Oct 2024 15:23:04 -0400 Subject: [PATCH] Upgrades --- .scalafmt.conf | 97 +++++---------- .../mysql/binlog/models/BinaryLogs.scala | 6 +- .../binlog/models/DeleteRowsEventData.scala | 2 +- .../mysql/binlog/models/EventHeaderV4.scala | 2 +- .../mysql/binlog/models/QueryEventData.scala | 2 +- .../mysql/binlog/models/RotateEventData.scala | 2 +- .../mysql/binlog/models/SchemaMetadata.scala | 24 ++-- .../binlog/models/TableMapEventData.scala | 2 +- .../binlog/models/UpdateRowsEventData.scala | 4 +- .../binlog/models/WriteRowsEventData.scala | 2 +- .../mysql/binlog/models/XidEventData.scala | 2 +- .../binlog/models/SchemaMetadataTest.scala | 30 +++-- .../binlog/checkpoint/BinlogOffset.scala | 3 +- .../mysql/binlog/client/package.scala | 4 +- .../mysql/binlog/compaction/package.scala | 2 +- .../mysql/binlog/config/package.scala | 4 +- .../mysql/binlog/database/database.scala | 14 +-- .../binlog/stream/MysqlBinlogStream.scala | 32 ++--- .../binlog/stream/TransactionState.scala | 111 +++++++++--------- .../mysql/binlog/stream/package.scala | 18 ++- .../binlog/stream/MysqlBinlogStreamTest.scala | 10 +- .../mysql/binlog/stream/PipesTest.scala | 24 ++-- .../binlog/stream/TransactionStateTest.scala | 20 ++-- build.sbt | 4 +- .../app/main/BinLogListener.scala | 24 ++-- .../mysql/binlog/config/BinLogConfig.scala | 18 +-- .../mysql/binlog/event/EventMessage.scala | 18 +-- .../test/db/MySqlContainer.scala | 4 +- .../binlog/config/BinLogConfigSpec.scala | 2 +- .../mysql/binlog/event/OffsetTest.scala | 4 +- project/Dependencies.scala | 42 +++---- project/build.properties | 2 +- project/plugins.sbt | 4 +- 33 files changed, 245 insertions(+), 294 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 52db288..a38fd91 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,80 +1,39 @@ -version=2.7.5 +version = 3.8.3 -maxColumn = 100 +runner.dialect = scala213 -align.tokens = [ - { - code = "←" - owner = "Enumerator.Generator" - }, { - code = "%" - owner = "Term.ApplyInfix" - }, { - code = "{" - owner = Template - }, { - code = "⇒" - owner = Case - }, { - code = extends - owner = "Defn.(Class|Trait|Object)" - }, { - code = "→" - owner = "Term.ApplyInfix" - }, { - code = "=" - owner = "(Enumerator.Val|Defn.(Va(l|r)|Def|Type))" - }, { - code = "<-" - owner = "Enumerator.Generator" - }, { - code = "//" - owner = ".*" - }, { - code = "->" - owner = "Term.ApplyInfix" - }, { - code = "%%" - owner = "Term.ApplyInfix" - }, { - code = "=>" - owner = Case - }, { - code = "}" - owner = Template - }, { - code = "%%%" - owner = "Term.ApplyInfix" - }, - ":=", - "+=", - "++=", - in, - shouldBe, - should, - be +align.preset = more # For pretty alignment. +maxColumn = 140 # For my wide 30" display. + +project.excludePaths = ["glob:**/ProtocolBenchArr.scala"] + +rewrite.sortModifiers.order = [ + "override" + "private" + "protected" + "implicit" + "final" + "sealed" + "abstract" + "lazy" ] -align.openParenCallSite = false -align.openParenDefnSite = false -align.arrowEnumeratorGenerator = true -align.tokenCategory.Equals = Assign -align.tokenCategory.LeftArrow = Assign +rewrite.rules = [ + SortModifiers + RedundantBraces + RedundantParens + AsciiSortImports + PreferCurlyFors +] -danglingParentheses = true +spaces.inByNameTypes = false -rewrite.rules = [SortImports, RedundantBraces, SortModifiers, PreferCurlyFors] rewrite.redundantBraces.stringInterpolation = true rewrite.redundantBraces.includeUnitMethods = true -spaces.inImportCurlyBraces = true -spaces.inByNameTypes = false - +newlines.afterCurlyLambda = preserve +newlines.neverInResultType = true +newlines.beforeMultilineDef = keep newlines.sometimesBeforeColonInMethodReturnType = false newlines.penalizeSingleSelectMultiArgList = false -newlines.neverInResultType = true - -verticalMultiline.atDefnSite = false -newlines.implicitParamListModifierPrefer = before - -continuationIndent.defnSite = 2 +newlines.implicitParamListModifierPrefer = before \ No newline at end of file diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/BinaryLogs.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/BinaryLogs.scala index b1e7d87..6235b14 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/BinaryLogs.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/BinaryLogs.scala @@ -9,13 +9,13 @@ case class BinaryLogs(fileName: String, size: Long) object BinaryLogs { def showLogs[F[_]]( - implicit xa: Transactor[F], - ev: MonadCancel[F, Throwable] + implicit xa: Transactor[F], + ev: MonadCancel[F, Throwable] ): F[List[BinaryLogs]] = sql"""show binary logs""".query[BinaryLogs].to[List].transact(xa) def bytesBehindTheHead[F[_]: Transactor](fileName: String, pos: Long)( - implicit ev: MonadCancel[F, Throwable] + implicit ev: MonadCancel[F, Throwable] ): F[Long] = showLogs[F].map { logs => logs.dropWhile(log => log.fileName != fileName).foldLeft(0L) { case (sum, l) => diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/DeleteRowsEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/DeleteRowsEventData.scala index 24311c0..cf60294 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/DeleteRowsEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/DeleteRowsEventData.scala @@ -2,7 +2,7 @@ package io.laserdisc.mysql.binlog.models import java.io.Serializable -import com.github.shyiko.mysql.binlog.event.{ DeleteRowsEventData => JDeleteRowsEventData } +import com.github.shyiko.mysql.binlog.event.{DeleteRowsEventData => JDeleteRowsEventData} import scala.jdk.CollectionConverters._ object DeleteRowsEventData { diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/EventHeaderV4.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/EventHeaderV4.scala index 9d9814e..f7b3ae2 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/EventHeaderV4.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/EventHeaderV4.scala @@ -1,6 +1,6 @@ package io.laserdisc.mysql.binlog.models -import com.github.shyiko.mysql.binlog.event.{ EventType, EventHeaderV4 => JEventHeaderV4 } +import com.github.shyiko.mysql.binlog.event.{EventHeaderV4 => JEventHeaderV4, EventType} object EventHeaderV4 { def unapply(arg: JEventHeaderV4): Option[(EventType, Long, Long)] = diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/QueryEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/QueryEventData.scala index 3cda425..e21f54a 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/QueryEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/QueryEventData.scala @@ -1,6 +1,6 @@ package io.laserdisc.mysql.binlog.models -import com.github.shyiko.mysql.binlog.event.{ QueryEventData => JQueryEventData } +import com.github.shyiko.mysql.binlog.event.{QueryEventData => JQueryEventData} object QueryEventData { def truncateTable(sql: String) = { diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/RotateEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/RotateEventData.scala index 2010504..59d4b96 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/RotateEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/RotateEventData.scala @@ -1,6 +1,6 @@ package io.laserdisc.mysql.binlog.models -import com.github.shyiko.mysql.binlog.event.{ RotateEventData => JRotateEventData } +import com.github.shyiko.mysql.binlog.event.{RotateEventData => JRotateEventData} object RotateEventData { def unapply(arg: JRotateEventData): Option[(String, Long)] = Some((arg.getBinlogFilename, arg.getBinlogPosition)) diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/SchemaMetadata.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/SchemaMetadata.scala index 494441b..3bcfcce 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/SchemaMetadata.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/SchemaMetadata.scala @@ -7,20 +7,20 @@ import scala.collection.mutable import cats.effect.MonadCancel case class Metadata( - table_name: String, - column_name: String, - data_type: String, - character_set_name: Option[String], - ordinal_position: Int, - column_type: String, - datetime_precision: Option[Long], - column_key: String, - is_pk: Boolean + table_name: String, + column_name: String, + data_type: String, + character_set_name: Option[String], + ordinal_position: Int, + column_type: String, + datetime_precision: Option[Long], + column_key: String, + is_pk: Boolean ) case class SchemaMetadata( - tables: Map[String, TableMetadata], - idToTable: mutable.Map[Long, TableMetadata] + tables: Map[String, TableMetadata], + idToTable: mutable.Map[Long, TableMetadata] ) case class ColumnMetadata(name: String, dataType: String, ordinal: Int, isPk: Boolean) @@ -49,7 +49,7 @@ object SchemaMetadata { |ORDER BY TABLE_NAME, ORDINAL_POSITION""".stripMargin.query[Metadata] def buildSchemaMetadata[F[_]]( - schema: String + schema: String )(implicit xa: Transactor[F], ev: MonadCancel[F, Throwable]): F[SchemaMetadata] = getMetadata(schema).to[List].map(metaToSchema).transact(xa) diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/TableMapEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/TableMapEventData.scala index fc563b8..41d4f18 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/TableMapEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/TableMapEventData.scala @@ -1,6 +1,6 @@ package io.laserdisc.mysql.binlog.models -import com.github.shyiko.mysql.binlog.event.{ TableMapEventData => JTableMapEventData } +import com.github.shyiko.mysql.binlog.event.{TableMapEventData => JTableMapEventData} object TableMapEventData { def unapply(arg: JTableMapEventData): Option[(Long, String)] = diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/UpdateRowsEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/UpdateRowsEventData.scala index 45c40aa..713800f 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/UpdateRowsEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/UpdateRowsEventData.scala @@ -2,13 +2,13 @@ package io.laserdisc.mysql.binlog.models import java.io -import com.github.shyiko.mysql.binlog.event.{ UpdateRowsEventData => JUpdateRowsEventData } +import com.github.shyiko.mysql.binlog.event.{UpdateRowsEventData => JUpdateRowsEventData} import scala.jdk.CollectionConverters._ object UpdateRowsEventData { def unapply( - arg: JUpdateRowsEventData + arg: JUpdateRowsEventData ): Some[(Long, List[(Array[io.Serializable], Array[io.Serializable])], Array[Int])] = { val beforeAfter = arg.getRows.asScala.toList.map(entry => entry.getKey -> entry.getValue) diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/WriteRowsEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/WriteRowsEventData.scala index e69b271..aaf2a12 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/WriteRowsEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/WriteRowsEventData.scala @@ -2,7 +2,7 @@ package io.laserdisc.mysql.binlog.models import java.io.Serializable -import com.github.shyiko.mysql.binlog.event.{ WriteRowsEventData => JWriteRowsEventData } +import com.github.shyiko.mysql.binlog.event.{WriteRowsEventData => JWriteRowsEventData} import scala.jdk.CollectionConverters._ diff --git a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/XidEventData.scala b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/XidEventData.scala index 6341aca..181cd22 100644 --- a/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/XidEventData.scala +++ b/binlog-stream-models/app/io/laserdisc/mysql/binlog/models/XidEventData.scala @@ -1,6 +1,6 @@ package io.laserdisc.mysql.binlog.models -import com.github.shyiko.mysql.binlog.event.{ XidEventData => JXidEventData } +import com.github.shyiko.mysql.binlog.event.{XidEventData => JXidEventData} object XidEventData { def unapply(arg: JXidEventData): Option[Long] = Some(arg.getXid) diff --git a/binlog-stream-models/test/io/laserdisc/mysql/binlog/models/SchemaMetadataTest.scala b/binlog-stream-models/test/io/laserdisc/mysql/binlog/models/SchemaMetadataTest.scala index 1eebfa0..f0ad78f 100644 --- a/binlog-stream-models/test/io/laserdisc/mysql/binlog/models/SchemaMetadataTest.scala +++ b/binlog-stream-models/test/io/laserdisc/mysql/binlog/models/SchemaMetadataTest.scala @@ -3,32 +3,36 @@ package io.laserdisc.mysql.binlog.models import cats.effect.IO import com.dimafeng.testcontainers.ForAllTestContainer import db.MySqlContainer -import doobie.util.transactor.Transactor import doobie.util.transactor.Transactor.Aux import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec import cats.effect.unsafe.implicits.global +import doobie.util.transactor.Transactor -class SchemaMetadataTest - extends AnyWordSpec - with ForAllTestContainer - with MySqlContainer - with Matchers { +import java.util.Properties + +class SchemaMetadataTest extends AnyWordSpec with ForAllTestContainer with MySqlContainer with Matchers { "Schema Metadata" should { "restore schema state from DB" in { implicit val testTransactor: Aux[IO, Unit] = - Transactor.fromDriverManager[IO]( - mySqlContainer.getDriverClassName, - s"${mySqlContainer.getJdbcUrl}?useSSL=false", - mySqlContainer.getUsername, - mySqlContainer.getPassword + Transactor.fromDriverManager( + driver = mySqlContainer.getDriverClassName, + url = s"${mySqlContainer.getJdbcUrl}?useSSL=false", + info = { + // ugh + val p = new Properties() + p.put("user", mySqlContainer.getUsername) + p.put("password", mySqlContainer.getPassword) + p + }, + None ) val schemaState = SchemaMetadata.buildSchemaMetadata("test").unsafeRunSync() - schemaState.tables should have size 2 + schemaState.tables should have size 2 schemaState.tables("sku").columns should have size 2 schemaState .tables("sku") @@ -36,7 +40,7 @@ class SchemaMetadataTest .values .filter(_.isPk) .head - .name should be("id") + .name should be("id") schemaState.tables("variant").columns should have size 2 schemaState .tables("variant") diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/checkpoint/BinlogOffset.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/checkpoint/BinlogOffset.scala index 687a677..b3616b8 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/checkpoint/BinlogOffset.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/checkpoint/BinlogOffset.scala @@ -2,8 +2,7 @@ package io.laserdisc.mysql.binlog.checkpoint import io.laserdisc.mysql.binlog.event.Offset -case class BinlogOffset(appName: String, override val fileName: String, override val offset: Long) - extends Offset +case class BinlogOffset(appName: String, override val fileName: String, override val offset: Long) extends Offset object BinlogOffset { diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/client/package.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/client/package.scala index be2836d..b0a19a9 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/client/package.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/client/package.scala @@ -10,8 +10,8 @@ import io.laserdisc.mysql.binlog.config.BinLogConfig package object client { def createBinLogClient[F[_]: Sync: Logger]( - config: BinLogConfig, - offset: Option[BinlogOffset] = None + config: BinLogConfig, + offset: Option[BinlogOffset] = None ): F[BinaryLogClient] = for { client <- Sync[F].delay(config.mkBinaryLogClient(offset)) diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/compaction/package.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/compaction/package.scala index 95b7a6e..0ddd3df 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/compaction/package.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/compaction/package.scala @@ -25,7 +25,7 @@ package object compaction { case None => acc.remove(emId) } } - //TODO: use this code, once Scala 2.12 support ends, or updateWith back ported to 2.12A + // TODO: use this code, once Scala 2.12 support ends, or updateWith back ported to 2.12A // acc.updateWith(evt.pk) { // case Some(latest) => // mkNewEvent(evt).andThen(finalizeNewEvent).run(latest) diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/config/package.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/config/package.scala index 1f34db2..1b857df 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/config/package.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/config/package.scala @@ -14,14 +14,14 @@ package object config { val blc = new BinaryLogClient(v.host, v.port, v.user, v.password) - blc.setEventDeserializer({ + blc.setEventDeserializer { val ed = new EventDeserializer() ed.setCompatibilityMode( CompatibilityMode.DATE_AND_TIME_AS_LONG_MICRO, CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY ) ed - }) + } blc.setSSLMode(if (v.useSSL) SSLMode.VERIFY_IDENTITY else SSLMode.DISABLED) diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/database/database.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/database/database.scala index c71f986..449c1f3 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/database/database.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/database/database.scala @@ -7,18 +7,18 @@ import io.laserdisc.mysql.binlog.config.BinLogConfig package object database { def transactor[F[_]: Async]( - config: BinLogConfig + config: BinLogConfig ): Resource[F, HikariTransactor[F]] = for { ce <- ExecutionContexts.fixedThreadPool[F](32) // our connect EC _ <- Resource.eval(Sync[F].delay(Class.forName(config.driverClass))) xa <- HikariTransactor.newHikariTransactor[F]( - config.driverClass, - config.connectionURL, - config.user, - config.password, - ce - ) + config.driverClass, + config.connectionURL, + config.user, + config.password, + ce + ) } yield xa } diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/MysqlBinlogStream.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/MysqlBinlogStream.scala index 0e9a86e..2e3f17e 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/MysqlBinlogStream.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/MysqlBinlogStream.scala @@ -1,7 +1,7 @@ package io.laserdisc.mysql.binlog.stream -import cats.effect.std.{ Dispatcher, Queue } -import cats.effect.{ Async, IO, LiftIO } +import cats.effect.std.{Dispatcher, Queue} +import cats.effect.{Async, IO, LiftIO} import cats.implicits._ import com.github.shyiko.mysql.binlog.BinaryLogClient import com.github.shyiko.mysql.binlog.event.Event @@ -9,9 +9,9 @@ import fs2.Stream import org.typelevel.log4cats.Logger class MysSqlBinlogEventProcessor[F[_]: Async: Logger]( - binlogClient: BinaryLogClient, - queue: Queue[F, Option[Event]], - dispatcher: Dispatcher[F] + binlogClient: BinaryLogClient, + queue: Queue[F, Option[Event]], + dispatcher: Dispatcher[F] ) { def run(): Unit = { @@ -45,26 +45,26 @@ class MysSqlBinlogEventProcessor[F[_]: Async: Logger]( object MysqlBinlogStream { def rawEvents[F[_]: Async: Logger: LiftIO]( - client: BinaryLogClient + client: BinaryLogClient ): Stream[F, Event] = for { - d <- Stream.resource(Dispatcher[F]) - q <- Stream.eval(Queue.bounded[F, Option[Event]](10000)) + d <- Stream.resource(Dispatcher.parallel[F]) + q <- Stream.eval(Queue.bounded[F, Option[Event]](10000)) proc = new MysSqlBinlogEventProcessor[F](client, q, d) /* some difficulties here during the cats3 migration. Basically, we would have used: * .eval(Async[F].interruptible(many = true)(proc.run())) * instead of the below code to start `proc`. Unfortunately, the binlogger library uses SocketStream.read * which blocks and can't be terminated normally. See https://github.com/typelevel/fs2/issues/2362 */ procStream = Stream - .eval( - LiftIO[F].liftIO( - IO.delay[Unit](proc.run()).start.flatMap(_.joinWithNever) - ) - ) + .eval( + LiftIO[F].liftIO( + IO.delay[Unit](proc.run()).start.flatMap(_.joinWithNever) + ) + ) evtStream <- Stream - .fromQueueNoneTerminated(q) - .concurrently(procStream) - .onFinalize(Async[F].delay(client.disconnect())) + .fromQueueNoneTerminated(q) + .concurrently(procStream) + .onFinalize(Async[F].delay(client.disconnect())) } yield evtStream } diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/TransactionState.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/TransactionState.scala index c8a9771..0ffd4fa 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/TransactionState.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/TransactionState.scala @@ -4,13 +4,8 @@ import cats.data.State import cats.effect.Sync import cats.implicits._ import com.github.shyiko.mysql.binlog.BinaryLogClient -import com.github.shyiko.mysql.binlog.event.EventType.{ EXT_UPDATE_ROWS, UPDATE_ROWS } -import com.github.shyiko.mysql.binlog.event.{ - Event, - EventData, - EventType, - EventHeaderV4 => JEventHeaderV4 -} +import com.github.shyiko.mysql.binlog.event.EventType.{EXT_UPDATE_ROWS, UPDATE_ROWS} +import com.github.shyiko.mysql.binlog.event.{Event, EventData, EventHeaderV4 => JEventHeaderV4, EventType} import org.typelevel.log4cats.Logger import io.circe.Json import io.laserdisc.mysql.binlog.event.EventMessage @@ -22,13 +17,13 @@ import scala.collection.immutable.Queue import cats.effect.Ref case class TransactionState( - transactionEvents: Queue[EventMessage], - start: Long = 0, - end: Long = 0, - timestamp: Long, - fileName: String, - offset: Long, - schemaMetadata: SchemaMetadata + transactionEvents: Queue[EventMessage], + start: Long = 0, + end: Long = 0, + timestamp: Long, + fileName: String, + offset: Long, + schemaMetadata: SchemaMetadata ) { def assemblePackage: TransactionPackage = TransactionPackage( @@ -43,9 +38,9 @@ case class TransactionState( } case class TransactionPackage( - events: List[EventMessage], - offset: Long, - transactionDuration: Long + events: List[EventMessage], + offset: Long, + transactionDuration: Long ) object TransactionState { @@ -112,11 +107,11 @@ object TransactionState { } def handleCreate( - tableId: Long, - offset: Long, - timestamp: Long, - rows: List[Array[Serializable]], - includedColumns: Array[Int] + tableId: Long, + offset: Long, + timestamp: Long, + rows: List[Array[Serializable]], + includedColumns: Array[Int] )(implicit transactionState: TransactionState): (TransactionState, Option[TransactionPackage]) = { val jsonRows = (for { @@ -143,13 +138,13 @@ object TransactionState { } def handleUpdate( - tableId: Long, - offset: Long, - timestamp: Long, - beforeAfter: List[(Array[Serializable], Array[Serializable])], - includedColumns: Array[Int] + tableId: Long, + offset: Long, + timestamp: Long, + beforeAfter: List[(Array[Serializable], Array[Serializable])], + includedColumns: Array[Int] )( - implicit transactionState: TransactionState + implicit transactionState: TransactionState ): (TransactionState, Option[TransactionPackage]) = { val jsonRows = (for { @@ -179,13 +174,13 @@ object TransactionState { } def handleDelete( - tableId: Long, - offset: Long, - timestamp: Long, - rows: List[Array[Serializable]], - includedColumns: Array[Int] + tableId: Long, + offset: Long, + timestamp: Long, + rows: List[Array[Serializable]], + includedColumns: Array[Int] )( - implicit transactionState: TransactionState + implicit transactionState: TransactionState ): (TransactionState, Option[TransactionPackage]) = { val jsonRows = (for { tableName <- toTableName(tableId) @@ -213,12 +208,12 @@ object TransactionState { } def handleDdl( - table: String, - timestamp: Long, - offset: Long, - sqlAction: String + table: String, + timestamp: Long, + offset: Long, + sqlAction: String )( - implicit transactionState: TransactionState + implicit transactionState: TransactionState ): (TransactionState, Option[TransactionPackage]) = { val ddlEvent = Queue( EventMessage( @@ -254,10 +249,10 @@ object TransactionState { } def handleCommit( - transactionState: TransactionState, - offset: Long, - timestamp: Long, - xaId: Option[Long] + transactionState: TransactionState, + offset: Long, + timestamp: Long, + xaId: Option[Long] ): (TransactionState, Option[TransactionPackage]) = { val marked = (transactionState.transactionEvents match { case xs :+ x => xs :+ x.copy(endOfTransaction = true, offset = offset) @@ -280,13 +275,13 @@ object TransactionState { } def convertToJson( - tableMeta: TableMetadata, - timestamp: Long, - action: String, - fileName: String, - offset: Long, - includedColumns: Array[Int], - record: (Option[Row], Option[Row]) + tableMeta: TableMetadata, + timestamp: Long, + action: String, + fileName: String, + offset: Long, + includedColumns: Array[Int], + record: (Option[Row], Option[Row]) ): EventMessage = { val ba = record match { @@ -329,9 +324,9 @@ object TransactionState { } def extractPk( - metadata: TableMetadata, - columns: Array[Int], - row: Array[Option[Serializable]] + metadata: TableMetadata, + columns: Array[Int], + row: Array[Option[Serializable]] ): Array[(String, Json)] = columns .map(i => metadata.columns(i + 1)) @@ -343,9 +338,9 @@ object TransactionState { transactionState.schemaMetadata.idToTable.get(tableId).map(_.name) def recordToJson( - tableMetadata: TableMetadata, - includedColumns: Array[Int], - record: Array[Option[Serializable]] + tableMetadata: TableMetadata, + includedColumns: Array[Int], + record: Array[Option[Serializable]] ): Iterable[(String, Json)] = includedColumns .map(i => tableMetadata.columns(i + 1)) @@ -371,8 +366,8 @@ object TransactionState { def nullsToOptions(row: Array[Serializable]): Row = row.map(Option(_)) def createTransactionState[F[_]: Sync: Logger]( - schemaMetadata: SchemaMetadata, - binlogClient: BinaryLogClient + schemaMetadata: SchemaMetadata, + binlogClient: BinaryLogClient ): F[Ref[F, TransactionState]] = Ref[F] .of( diff --git a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/package.scala b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/package.scala index 35d8019..06eb6bd 100644 --- a/binlog-stream/app/io/laserdisc/mysql/binlog/stream/package.scala +++ b/binlog-stream/app/io/laserdisc/mysql/binlog/stream/package.scala @@ -1,7 +1,7 @@ package io.laserdisc.mysql.binlog import cats.effect.kernel.Ref -import cats.effect.{ Concurrent, Sync } +import cats.effect.{Concurrent, Sync} import cats.implicits._ import com.github.shyiko.mysql.binlog.event.Event import org.typelevel.log4cats.Logger @@ -9,21 +9,19 @@ import io.laserdisc.mysql.binlog.event.EventMessage package object stream { def streamEvents[F[_]: Concurrent: Sync: Logger]( - transactionState: Ref[F, TransactionState] + transactionState: Ref[F, TransactionState] ): fs2.Pipe[F, Event, EventMessage] = _.through(streamTransactionPackages[F](transactionState)).flatMap(pkg => fs2.Stream.eval(warnBigTransactionPackage(pkg)) >> fs2.Stream(pkg.events: _*) ) def streamCompactedEvents[F[_]: Concurrent: Logger]( - transactionState: Ref[F, TransactionState] + transactionState: Ref[F, TransactionState] ): fs2.Pipe[F, Event, EventMessage] = - _.through(streamTransactionPackages[F](transactionState)).flatMap(pkg => - fs2.Stream(compaction.compact(pkg.events): _*) - ) + _.through(streamTransactionPackages[F](transactionState)).flatMap(pkg => fs2.Stream(compaction.compact(pkg.events): _*)) def streamTransactionPackages[F[_]: Concurrent: Logger]( - transactionState: Ref[F, TransactionState] + transactionState: Ref[F, TransactionState] ): fs2.Pipe[F, Event, TransactionPackage] = _.evalMap(event => Logger[F].debug(s"received binlog event $event") >> transactionState.modifyState( @@ -32,13 +30,13 @@ package object stream { ).unNone def warnBigTransactionPackage[F[_]: Sync: Logger]( - transactionPackage: TransactionPackage + transactionPackage: TransactionPackage ): F[Unit] = if (transactionPackage.events.size >= 1000) for { distro <- Sync[F].delay(transactionPackage.events.groupBy(_.table).map { case (k, v) => - k -> v.size - }) + k -> v.size + }) _ <- Logger[F].warn(s"""Transaction has > then 1000 elements in it with |following distribution $distro """.stripMargin) diff --git a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/MysqlBinlogStreamTest.scala b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/MysqlBinlogStreamTest.scala index f58c790..e676ad9 100644 --- a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/MysqlBinlogStreamTest.scala +++ b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/MysqlBinlogStreamTest.scala @@ -1,10 +1,10 @@ package io.laserdisc.mysql.binlog.stream import cats.effect.unsafe.implicits.global -import cats.effect.{ IO, Resource } +import cats.effect.{IO, Resource} import com.dimafeng.testcontainers.ForAllTestContainer import com.github.shyiko.mysql.binlog.BinaryLogClient -import com.github.shyiko.mysql.binlog.event.{ EventHeaderV4, EventType } +import com.github.shyiko.mysql.binlog.event.{EventHeaderV4, EventType} import db.MySqlContainer import doobie.hikari.HikariTransactor import doobie.implicits._ @@ -16,11 +16,7 @@ import org.typelevel.log4cats.slf4j.Slf4jLogger import scala.language.reflectiveCalls -class MysqlBinlogStreamTest - extends AnyWordSpec - with ForAllTestContainer - with MySqlContainer - with Matchers { +class MysqlBinlogStreamTest extends AnyWordSpec with ForAllTestContainer with MySqlContainer with Matchers { def fixture = new { diff --git a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/PipesTest.scala b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/PipesTest.scala index cdcc5e1..7c1826d 100644 --- a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/PipesTest.scala +++ b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/PipesTest.scala @@ -1,7 +1,7 @@ package io.laserdisc.mysql.binlog.stream import cats.effect.unsafe.implicits.global -import cats.effect.{ IO, Resource } +import cats.effect.{IO, Resource} import cats.implicits._ import com.dimafeng.testcontainers.ForAllTestContainer import com.github.shyiko.mysql.binlog.BinaryLogClient @@ -41,14 +41,14 @@ class PipesTest extends AnyWordSpec with Matchers with ForAllTestContainer with .use { xa => for { _ <- (Sku.truncate.run *> Sku.insert(5, "sku5").run *> - Sku.insert(2, "sku2").run).transact(xa) + Sku.insert(2, "sku2").run).transact(xa) _ <- (Sku.insert(6, "sku6").run *> Sku.truncate.run *> - Sku.insert(2, "sku2").run).transact(xa) + Sku.insert(2, "sku2").run).transact(xa) _ <- (Sku.insert(5, "sku5").run *> - Sku.insert(7, "sku7").run *> Sku.truncate.run) - .transact(xa) + Sku.insert(7, "sku7").run *> Sku.truncate.run) + .transact(xa) _ <- Sku.truncate.run.transact(xa) } yield () @@ -63,14 +63,14 @@ class PipesTest extends AnyWordSpec with Matchers with ForAllTestContainer with implicit0(logger: Logger[IO]) <- Slf4jLogger.fromName[IO]("testing") schemaMetadata <- SchemaMetadata.buildSchemaMetadata("test") transactionState <- TransactionState - .createTransactionState[IO](schemaMetadata, client) + .createTransactionState[IO](schemaMetadata, client) actions <- MysqlBinlogStream - .rawEvents[IO](client) - .through(streamEvents(transactionState)) - .map(_.action) - .take(10) - .compile - .toList + .rawEvents[IO](client) + .through(streamEvents(transactionState)) + .map(_.action) + .take(10) + .compile + .toList } yield actions } .unsafeRunSync() diff --git a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/TransactionStateTest.scala b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/TransactionStateTest.scala index ab2b211..17e398f 100644 --- a/binlog-stream/test/io/laserdisc/mysql/binlog/stream/TransactionStateTest.scala +++ b/binlog-stream/test/io/laserdisc/mysql/binlog/stream/TransactionStateTest.scala @@ -7,7 +7,7 @@ import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import java.{ io, util } +import java.{io, util} import scala.collection.immutable.Queue import scala.collection.mutable @@ -93,7 +93,7 @@ class TransactionStateTest extends AnyWordSpec with Matchers with OptionValues { .value match { case (state, None) => state.transactionEvents should have size 0 - state.isTransaction should be(true) + state.isTransaction should be(true) case res => fail(s"Assertion failed with $res") } } @@ -131,11 +131,11 @@ class TransactionStateTest extends AnyWordSpec with Matchers with OptionValues { ) .value match { case (state, txnPackage) => - state.isTransaction should be(false) - state.transactionEvents should be(empty) - txnPackage.value.events should have size 2 + state.isTransaction should be(false) + state.transactionEvents should be(empty) + txnPackage.value.events should have size 2 txnPackage.value.events.forall(_.fileName == "file.123") should be(true) - txnPackage.value.events.map(_.endOfTransaction) should be(List(false, true)) + txnPackage.value.events.map(_.endOfTransaction) should be(List(false, true)) } } @@ -172,11 +172,11 @@ class TransactionStateTest extends AnyWordSpec with Matchers with OptionValues { val _pk = root.id.int val _id = root.after.id.int val _sku = root.after.sku.string - json.table should be("sku") - json.timestamp should be(12345L) - _id.getOption(json.row).value should be(1) + json.table should be("sku") + json.timestamp should be(12345L) + _id.getOption(json.row).value should be(1) _sku.getOption(json.row).value should be("sku1") - _pk.getOption(json.pk).value should be(1) + _pk.getOption(json.pk).value should be(1) } "extract 'truncated table sku' from SQL" in { diff --git a/build.sbt b/build.sbt index a25b406..b5e344c 100644 --- a/build.sbt +++ b/build.sbt @@ -3,7 +3,7 @@ import sbt.Keys.scalaSource organization := "io.laserdisc" name := "mysql-binlog-stream" -ThisBuild / scalaVersion := "2.13.9" +ThisBuild / scalaVersion := "2.13.15" lazy val commonSettings = Seq( organization := "io.laserdisc", @@ -21,7 +21,7 @@ lazy val commonSettings = Seq( url("https://github.com/semenodm") ) ), - licenses ++= Seq(("MIT", url("http://opensource.org/licenses/MIT"))), + licenses ++= Seq(("MIT", url("http://opensource.org/licenses/MIT"))), homepage := Some(url("https://github.com/laserdisc-io/fs2-aws")), Compile / scalaSource := baseDirectory.value / "app", Compile / resourceDirectory := baseDirectory.value / "conf", diff --git a/mysql-binlog-stream-examples/app/main/BinLogListener.scala b/mysql-binlog-stream-examples/app/main/BinLogListener.scala index 9a2348a..8bcc973 100644 --- a/mysql-binlog-stream-examples/app/main/BinLogListener.scala +++ b/mysql-binlog-stream-examples/app/main/BinLogListener.scala @@ -1,6 +1,6 @@ package main -import cats.effect.{ ExitCode, IO, IOApp } +import cats.effect.{ExitCode, IO, IOApp} import cats.implicits._ import ciris._ import ciris.refined._ @@ -10,8 +10,8 @@ import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger import io.laserdisc.mysql.binlog.config.BinLogConfig import io.laserdisc.mysql.binlog.models.SchemaMetadata -import io.laserdisc.mysql.binlog.stream.{ streamEvents, MysqlBinlogStream, TransactionState } -import io.laserdisc.mysql.binlog.{ client, database } +import io.laserdisc.mysql.binlog.stream.{MysqlBinlogStream, TransactionState, streamEvents} +import io.laserdisc.mysql.binlog.{client, database} object BinLogListener extends IOApp { @@ -42,19 +42,19 @@ object BinLogListener extends IOApp { database.transactor[IO](config).use { implicit xa => for { implicit0(logger: Logger[IO]) <- Slf4jLogger.fromName[IO]("application") - //Here we do not provide binlog offset, client will be initialized with default file and offset + // Here we do not provide binlog offset, client will be initialized with default file and offset binlogClient <- client.createBinLogClient[IO](config) schemaMetadata <- SchemaMetadata.buildSchemaMetadata(config.schema) transactionState <- TransactionState - .createTransactionState[IO](schemaMetadata, binlogClient) + .createTransactionState[IO](schemaMetadata, binlogClient) _ <- MysqlBinlogStream - .rawEvents[IO](binlogClient) - .through(streamEvents[IO](transactionState)) - .evalTap(msg => logger.info(s"received $msg")) - //Here you should do the checkpoint - .compile - .drain - } yield (ExitCode.Success) + .rawEvents[IO](binlogClient) + .through(streamEvents[IO](transactionState)) + .evalTap(msg => logger.info(s"received $msg")) + // Here you should do the checkpoint + .compile + .drain + } yield ExitCode.Success } } } diff --git a/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/config/BinLogConfig.scala b/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/config/BinLogConfig.scala index f1eb561..b5ff50d 100644 --- a/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/config/BinLogConfig.scala +++ b/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/config/BinLogConfig.scala @@ -1,15 +1,15 @@ package io.laserdisc.mysql.binlog.config case class BinLogConfig( - host: String, - port: Int = 3306, - user: String, - password: String, - schema: String, - useSSL: Boolean = true, - driverClass: String = "com.mysql.cj.jdbc.Driver", - urlOverride: Option[String] = None, - poolSize: Int + host: String, + port: Int = 3306, + user: String, + password: String, + schema: String, + useSSL: Boolean = true, + driverClass: String = "com.mysql.cj.jdbc.Driver", + urlOverride: Option[String] = None, + poolSize: Int ) { def connectionURL: String = urlOverride.getOrElse(s"jdbc:mysql://$host:$port/$schema${if (useSSL) "?useSSL=true" else ""}") diff --git a/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/event/EventMessage.scala b/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/event/EventMessage.scala index e839d3e..322c632 100644 --- a/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/event/EventMessage.scala +++ b/mysql-binlog-stream-shared/app/io/laserdisc/mysql/binlog/event/EventMessage.scala @@ -3,13 +3,13 @@ package io.laserdisc.mysql.binlog.event import io.circe.Json case class EventMessage( - table: String, - timestamp: Long, - action: String, - xaId: Option[Long], - override val fileName: String, - override val offset: Long, - endOfTransaction: Boolean, - pk: Json, - row: Json + table: String, + timestamp: Long, + action: String, + xaId: Option[Long], + override val fileName: String, + override val offset: Long, + endOfTransaction: Boolean, + pk: Json, + row: Json ) extends Offset diff --git a/mysql-binlog-stream-shared/test/db/MySqlContainer.scala b/mysql-binlog-stream-shared/test/db/MySqlContainer.scala index b0dc102..7cdd32a 100644 --- a/mysql-binlog-stream-shared/test/db/MySqlContainer.scala +++ b/mysql-binlog-stream-shared/test/db/MySqlContainer.scala @@ -1,6 +1,6 @@ package db -import com.dimafeng.testcontainers.{ ForAllTestContainer, SingleContainer } +import com.dimafeng.testcontainers.{ForAllTestContainer, SingleContainer} import io.laserdisc.mysql.binlog.config.BinLogConfig import org.testcontainers.containers.MySQLContainer @@ -21,7 +21,7 @@ trait MySqlContainer { override val container: SingleContainer[MySQLContainer[_]] = new SingleContainer[MySQLContainer[_]] { - implicit override val container: MySQLContainer[_] = mySqlContainer + override implicit val container: MySQLContainer[_] = mySqlContainer } implicit val ec: ExecutionContext = Implicits.global diff --git a/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/config/BinLogConfigSpec.scala b/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/config/BinLogConfigSpec.scala index b72f8e2..2d7f323 100644 --- a/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/config/BinLogConfigSpec.scala +++ b/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/config/BinLogConfigSpec.scala @@ -37,7 +37,7 @@ class BinLogConfigSpec extends AnyWordSpec with Matchers { "not expose password on toString" in { - template.copy(password = "TOPSECRET").toString should not include ("TOPSECRET") + template.copy(password = "TOPSECRET").toString should not include "TOPSECRET" } diff --git a/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/event/OffsetTest.scala b/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/event/OffsetTest.scala index e4898fe..dc88f43 100644 --- a/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/event/OffsetTest.scala +++ b/mysql-binlog-stream-shared/test/io/laserdisc/mysql/binlog/event/OffsetTest.scala @@ -13,8 +13,8 @@ object OffsetTest { class OffsetTest extends AnyWordSpec with Matchers { case class Foo( - override val fileName: String, - override val offset: Long + override val fileName: String, + override val offset: Long ) extends Offset "OrderedBinLogOffset" should { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 14c60a4..7d0cece 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -1,19 +1,19 @@ -import sbt.Keys.{ libraryDependencies, _ } +import sbt.Keys.{libraryDependencies, _} import sbt._ object Dependencies { - val cirisVersion = "2.4.0" - val doobieVersion = "1.0.0-RC2" - val circeVersion = "0.14.1" - val catsEffectVersion = "3.3.14" + val cirisVersion = "3.6.0" + val doobieVersion = "1.0.0-RC6" + val circeVersion = "0.14.10" + val catsEffectVersion = "3.5.4" val TestLib = Seq( libraryDependencies ++= Seq( - "org.scalamock" %% "scalamock" % "5.2.0" % Test, - "org.scalatest" %% "scalatest" % "3.2.14" % Test, - "com.dimafeng" %% "testcontainers-scala" % "0.40.11" % Test, - "org.testcontainers" % "mysql" % "1.17.5" % Test, - "org.testcontainers" % "testcontainers" % "1.17.5" % Test + "org.scalamock" %% "scalamock" % "6.0.0" % Test, + "org.scalatest" %% "scalatest" % "3.2.19" % Test, + "com.dimafeng" %% "testcontainers-scala" % "0.41.4" % Test, + "org.testcontainers" % "mysql" % "1.20.2" % Test, + "org.testcontainers" % "testcontainers" % "1.20.2" % Test ) ) @@ -21,17 +21,17 @@ object Dependencies { libraryDependencies ++= Seq( "is.cir" %% "ciris-enumeratum" % cirisVersion, "is.cir" %% "ciris-refined" % cirisVersion, - "eu.timepit" %% "refined" % "0.10.1" + "eu.timepit" %% "refined" % "0.11.2" ) ) val Logging = Seq( libraryDependencies ++= Seq( - "ch.qos.logback" % "logback-classic" % "1.4.4", - "ch.qos.logback" % "logback-core" % "1.4.4", - "org.slf4j" % "jcl-over-slf4j" % "2.0.3", - "org.slf4j" % "jul-to-slf4j" % "2.0.3", - "org.typelevel" %% "log4cats-slf4j" % "2.5.0" + "ch.qos.logback" % "logback-classic" % "1.5.9", + "ch.qos.logback" % "logback-core" % "1.5.9", + "org.slf4j" % "jcl-over-slf4j" % "2.0.16", + "org.slf4j" % "jul-to-slf4j" % "2.0.16", + "org.typelevel" %% "log4cats-slf4j" % "2.7.0" ) ) @@ -41,8 +41,8 @@ object Dependencies { "org.tpolecat" %% "doobie-hikari" % doobieVersion, // HikariCP transactor. "org.tpolecat" %% "doobie-refined" % doobieVersion, // Postgres driver 42.1.4 + type mappings. "org.tpolecat" %% "doobie-scalatest" % doobieVersion % Test, // Support for doobie scalatest - "mysql" % "mysql-connector-java" % "8.0.30", - "com.zendesk" % "mysql-binlog-connector-java" % "0.27.3" + "mysql" % "mysql-connector-java" % "8.0.33", + "com.zendesk" % "mysql-binlog-connector-java" % "0.29.2" ) ) @@ -51,7 +51,7 @@ object Dependencies { "io.circe" %% "circe-core" % circeVersion, "io.circe" %% "circe-generic" % circeVersion, "io.circe" %% "circe-parser" % circeVersion, - "io.circe" %% "circe-optics" % circeVersion % Test + "io.circe" %% "circe-optics" % "0.15.0" % Test ) ) @@ -64,8 +64,8 @@ object Dependencies { val XML = Seq( libraryDependencies ++= Seq( "javax.xml.bind" % "jaxb-api" % "2.3.1", - "com.sun.xml.bind" % "jaxb-impl" % "4.0.1", - "com.sun.xml.bind" % "jaxb-core" % "4.0.1", + "com.sun.xml.bind" % "jaxb-impl" % "4.0.5", + "com.sun.xml.bind" % "jaxb-core" % "4.0.5", "javax.activation" % "activation" % "1.1.1" ) ) diff --git a/project/build.properties b/project/build.properties index c12f2b9..0b699c3 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.2 \ No newline at end of file +sbt.version=1.10.2 diff --git a/project/plugins.sbt b/project/plugins.sbt index 7b4b340..005b0ce 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,5 @@ -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") -addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.2") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") +addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.14") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.9.3") addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.8.1") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7")