diff --git a/.scalafmt.conf b/.scalafmt.conf index efcb51b..a94fa17 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "2.7.5" +version = "3.0.8" style = defaultWithAlign diff --git a/build.sbt b/build.sbt index c14a30a..cc9b238 100644 --- a/build.sbt +++ b/build.sbt @@ -2,17 +2,16 @@ val scalaV = "3.0.0-RC1" val catsEffectV = "3.0.2" -val flywayV = "7.8.2" +val flywayV = "7.8.2" // Test -val specs2V = "4.12.0" +val specs2V = "4.12.0" -val testContainersScalaV = "0.39.4" // https://github.com/testcontainers/testcontainers-scala/releases +val testContainersScalaV = "0.39.4" // https://github.com/testcontainers/testcontainers-scala/releases val testContainersPostgresV = "1.15.3" // https://github.com/testcontainers/testcontainers-java/releases -val postgresV = "42.2.20" - +val postgresV = "42.2.20" lazy val `flutterby` = (project in file(".")) @@ -41,7 +40,7 @@ lazy val `flutterby-cats` = project lazy val commonSettings = Seq( organization := "dev.shawngarner", - scalaVersion := scalaV , + scalaVersion := scalaV, // scalacOptions ++= Seq( // "-rewrite", // "-new-syntax", @@ -49,8 +48,8 @@ lazy val commonSettings = Seq( // ), libraryDependencies ++= Seq( "org.flywaydb" % "flyway-core" % flywayV, - ("org.specs2" %% "specs2-core" % specs2V % Test).cross(CrossVersion.for3Use2_13), - ("org.specs2" %% "specs2-scalacheck" % specs2V % Test).cross(CrossVersion.for3Use2_13) + ("org.specs2" %% "specs2-core" % specs2V % Test).cross(CrossVersion.for3Use2_13), + ("org.specs2" %% "specs2-scalacheck" % specs2V % Test).cross(CrossVersion.for3Use2_13) ) ) @@ -60,18 +59,18 @@ lazy val contributors = Seq( lazy val releaseSettings = Seq( Test / publishArtifact := false, - scmInfo := Some( + scmInfo := Some( ScmInfo( url("https://github.com/BusyByte/flutterby"), "git@github.com:BusyByte/flutterby.git" ) ), - homepage := Some(url("https://github.com/BusyByte/flutterby")), - licenses := Seq("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.html")), - pomIncludeRepository := { _ => + homepage := Some(url("https://github.com/BusyByte/flutterby")), + licenses := Seq("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.html")), + pomIncludeRepository := { _ => false }, - pomExtra := { + pomExtra := { { for ((username, name) <- contributors) @@ -87,7 +86,7 @@ lazy val releaseSettings = Seq( lazy val noPublishSettings = Seq( - publish := {}, - publishLocal := {}, + publish := {}, + publishLocal := {}, publishArtifact := false ) diff --git a/modules/cats/src/main/scala/flutterby/cats/FlutterbyCats.scala b/modules/cats/src/main/scala/flutterby/cats/FlutterbyCats.scala index 8c8ea57..444e802 100644 --- a/modules/cats/src/main/scala/flutterby/cats/FlutterbyCats.scala +++ b/modules/cats/src/main/scala/flutterby/cats/FlutterbyCats.scala @@ -11,9 +11,8 @@ object FlutterbyCats { def fromConfig[F[_]](config: Config[F])( implicit F: Sync[F] ): F[Flutterby[F]] = - for - c <- config.config - flyway <- F.blocking(Flyway.configure(c.getClassLoader).configuration(c).load()) + for c <- config.config + flyway <- F.blocking(Flyway.configure(c.getClassLoader).configuration(c).load()) yield new Flutterby[F] { override def baseline(): F[Unit] = F.blocking(flyway.baseline()).void // TODO: support new model instead of void override def migrate(): F[Int] = F.blocking(flyway.migrate().migrationsExecuted) // TODO: support new model diff --git a/modules/cats/src/main/scala/flutterby/cats/config/ConfigBuilder.scala b/modules/cats/src/main/scala/flutterby/cats/config/ConfigBuilder.scala index fbbf8b0..c6daebf 100644 --- a/modules/cats/src/main/scala/flutterby/cats/config/ConfigBuilder.scala +++ b/modules/cats/src/main/scala/flutterby/cats/config/ConfigBuilder.scala @@ -23,324 +23,324 @@ package object config { import flutterby.core.Flutterby import org.flywaydb.core.api.migration.JavaMigration - extension [F[_]](s: ConfigBuilder[F]) { + extension[F[_]](s: ConfigBuilder[F]) { def dataSource(url: String, user: String, password: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.dataSource[F](url, user, password).apply(s) def dataSource(dataSource: DataSource)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.dataSource(dataSource).apply(s) def dryRunOutput(dryRunOutput: OutputStream)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.dryRunOutput(dryRunOutput).apply(s) def dryRunOutput(dryRunOutput: File)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.dryRunOutput(dryRunOutput).apply(s) def dryRunOutput(dryRunOutputFileName: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.dryRunOutput(dryRunOutputFileName).apply(s) def errorOverrides(errorOverrides: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.errorOverrides(errorOverrides: _*).apply(s) def group(group: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.group(group).apply(s) def installedBy(installedBy: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.installedBy(installedBy).apply(s) def mixed(mixed: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.mixed(mixed).apply(s) def ignoreMissingMigrations(ignoreMissingMigrations: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.ignoreMissingMigrations(ignoreMissingMigrations).apply(s) def ignoreIgnoredMigrations(ignoreIgnoredMigrations: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.ignoreIgnoredMigrations(ignoreIgnoredMigrations).apply(s) def ignorePendingMigrations(ignorePendingMigrations: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.ignorePendingMigrations(ignorePendingMigrations).apply(s) def ignoreFutureMigrations(ignoreFutureMigrations: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.ignoreFutureMigrations(ignoreFutureMigrations).apply(s) def validateMigrationNaming(validateMigrationNaming: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.validateMigrationNaming(validateMigrationNaming).apply(s) def validateOnMigrate(validateOnMigrate: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.validateOnMigrate(validateOnMigrate).apply(s) def cleanOnValidationError(cleanOnValidationError: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.cleanOnValidationError(cleanOnValidationError).apply(s) def cleanDisabled(cleanDisabled: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.cleanDisabled(cleanDisabled).apply(s) def locations(locations: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.locations(locations: _*).apply(s) def locations(locations: List[Location])( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.locations(locations).apply(s) def encoding(encoding: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.encoding(encoding).apply(s) def encoding(encoding: Charset)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.encoding(encoding).apply(s) def defaultSchema(schema: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.defaultSchema(schema).apply(s) def schemas(schemas: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.schemas(schemas: _*).apply(s) def table(table: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.table(table).apply(s) def tablespace(tablespace: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.tablespace(tablespace).apply(s) def target(target: MigrationVersion)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.target(target).apply(s) def target(target: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.target(target).apply(s) def placeholderReplacement(placeholderReplacement: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.placeholderReplacement(placeholderReplacement).apply(s) def placeholders(placeholders: Map[String, String])( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.placeholders(placeholders).apply(s) def placeholderPrefix(placeholderPrefix: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.placeholderPrefix(placeholderPrefix).apply(s) def placeholderSuffix(placeholderSuffix: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.placeholderSuffix(placeholderSuffix).apply(s) def sqlMigrationPrefix(sqlMigrationPrefix: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.sqlMigrationPrefix(sqlMigrationPrefix).apply(s) def undoSqlMigrationPrefix(undoSqlMigrationPrefix: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.undoSqlMigrationPrefix(undoSqlMigrationPrefix).apply(s) def repeatableSqlMigrationPrefix(repeatableSqlMigrationPrefix: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.repeatableSqlMigrationPrefix(repeatableSqlMigrationPrefix).apply(s) def sqlMigrationSeparator(sqlMigrationSeparator: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.sqlMigrationSeparator(sqlMigrationSeparator).apply(s) def sqlMigrationSuffixes(sqlMigrationSuffixes: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.sqlMigrationSuffixes(sqlMigrationSuffixes: _*).apply(s) def javaMigrations(javaMigrations: JavaMigration*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.javaMigrations(javaMigrations: _*).apply(s) def connectRetries(connectRetries: Int)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.connectRetries(connectRetries).apply(s) def initSql(initSql: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.initSql(initSql).apply(s) def baselineVersion(baselineVersion: MigrationVersion)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.baselineVersion(baselineVersion).apply(s) def baselineVersion(baselineVersion: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.baselineVersion(baselineVersion).apply(s) def baselineDescription(baselineDescription: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.baselineDescription(baselineDescription).apply(s) def baselineOnMigrate(baselineOnMigrate: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.baselineOnMigrate(baselineOnMigrate).apply(s) def outOfOrder(outOfOrder: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.outOfOrder(outOfOrder).apply(s) def callbacks(callbacks: Callback*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.callbacks(callbacks: _*).apply(s) def callbackClassnames(callbacks: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.callbackClassnames(callbacks: _*).apply(s) def skipDefaultCallbacks(skipDefaultCallbacks: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.skipDefaultCallbacks(skipDefaultCallbacks).apply(s) def resolvers(resolvers: MigrationResolver*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.resolvers(resolvers: _*).apply(s) def resolverClassnames(resolvers: String*)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.resolverClassnames(resolvers: _*).apply(s) def skipDefaultResolvers(skipDefaultResolvers: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.skipDefaultResolvers(skipDefaultResolvers).apply(s) def stream(stream: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.stream(stream).apply(s) def batch(batch: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.batch(batch).apply(s) def oracleSqlplus(oracleSqlplus: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.oracleSqlplus(oracleSqlplus).apply(s) def licenseKey(licenseKey: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.licenseKey(licenseKey).apply(s) def configuration(properties: Properties)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.configuration(properties).apply(s) def configuration(props: Map[String, String])( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.configuration(props).apply(s) def loadDefaultConfigurationFiles(encoding: String)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.loadDefaultConfigurationFiles(encoding).apply(s) def envVars()( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.envVars().apply(s) def resourceProvider(resourceProvider: ResourceProvider)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.resourceProvider(resourceProvider).apply(s) def javaMigrationClassProvider(javaMigrationClassProvider: ClassProvider[JavaMigration])( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.javaMigrationClassProvider(javaMigrationClassProvider).apply(s) def createSchemas(createSchemas: Boolean)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = ConfigBuilder.createSchemas(createSchemas).apply(s) def updateConf(fn: FluentConfiguration => FluentConfiguration)( - implicit F: Sync[F] + implicit F: Sync[F] ): ConfigBuilder[F] = s.flatMapF((f: FluentConfiguration) => F.delay(fn(f))) def build( - implicit F: Sync[F] - ): Config[F] = + implicit F: Sync[F] + ): Config[F] = ConfigBuilder.build(s) def build(classLoader: ClassLoader)( - implicit F: Sync[F] + implicit F: Sync[F] ): Config[F] = ConfigBuilder.build(s, classLoader) @@ -557,13 +557,12 @@ package config { def createSchemas[F[_]: Sync](createSchemas: Boolean): Endo[F] = _.updateConf(_.createSchemas(createSchemas)) - def build[F[_]: Sync](s: ConfigBuilder[F]): Config[F] = + def build[F[_]: Sync](s: ConfigBuilder[F]): Config[F] = new Config[F](s.run(new FluentConfiguration()).widen[Configuration]) {} def build[F[_]: Sync](s: ConfigBuilder[F], classLoader: ClassLoader): Config[F] = new Config[F](s.run(new FluentConfiguration(classLoader)).widen[Configuration]) {} - } } diff --git a/modules/cats/src/test/scala/flutterby/cats/FlutterbyCatsSpec.scala b/modules/cats/src/test/scala/flutterby/cats/FlutterbyCatsSpec.scala index 9518587..5bb150e 100644 --- a/modules/cats/src/test/scala/flutterby/cats/FlutterbyCatsSpec.scala +++ b/modules/cats/src/test/scala/flutterby/cats/FlutterbyCatsSpec.scala @@ -56,8 +56,8 @@ class FlutterbyCatsSpec extends Specification with ForAllTestContainer with Befo .withTimes(2) .withStartupTimeout(Duration.of(60, SECONDS)) ) - lazy val driverName = "org.postgresql.Driver" - lazy val jdbcUrl = + lazy val driverName = "org.postgresql.Driver" + lazy val jdbcUrl = s"jdbc:postgresql://${container.containerIpAddress}:${container.mappedPort(dbPort)}/$dbName" lazy val flutterby: IO[Flutterby[IO]] = @@ -66,10 +66,10 @@ class FlutterbyCatsSpec extends Specification with ForAllTestContainer with Befo .dataSource(jdbcUrl, dbUserName, dbPassword) .load - lazy val dbClean: IO[Unit] = for - fb <- flutterby - _ <- fb.clean() - yield () + lazy val dbClean: IO[Unit] = + for fb <- flutterby + _ <- fb.clean() + yield () override protected def before: Any = dbClean.unsafeRunSync() @@ -77,8 +77,8 @@ class FlutterbyCatsSpec extends Specification with ForAllTestContainer with Befo override protected def after: Any = {} "happy path" in { - val result: IO[MatchResult[Any]] = for - fb <- flutterby + val result: IO[MatchResult[Any]] = + for fb <- flutterby validateResultBeforeMigrate <- fb.validate().attempt infoBeforeMigrate <- fb.info() _ <- fb.baseline() @@ -86,27 +86,27 @@ class FlutterbyCatsSpec extends Specification with ForAllTestContainer with Befo _ <- fb.baseline() _ <- fb.validate() infoAfterMigrate <- fb.info() - yield { - validateResultBeforeMigrate.leftMap(_.getMessage) aka "validateResultBeforeMigrate" must beLeft.which { - case msg: String => - msg must contain("Validate failed:") - msg must contain("Detected resolved migration not applied to database: 1") - msg must contain("Detected resolved migration not applied to database: 2") + yield { + validateResultBeforeMigrate.leftMap(_.getMessage) aka "validateResultBeforeMigrate" must beLeft.which { + case msg: String => + msg must contain("Validate failed:") + msg must contain("Detected resolved migration not applied to database: 1") + msg must contain("Detected resolved migration not applied to database: 2") + } + + infoBeforeMigrate.all aka "allMigrationsBeforeMigrate" must haveSize(2) + infoBeforeMigrate.pending aka "pendingMigrationsBeforeMigrate" must haveSize(2) + infoBeforeMigrate.current aka "currentMigrationBeforeMigrate" must beNone + infoBeforeMigrate.applied aka "appliedMigrationsBeforeMigrate" must haveSize(0) + + successfullyAppliedMigrationCount aka "successfullyAppliedMigrationCount" must_== 1 + + infoAfterMigrate.all aka "allMigrationsAfterMigrate" must haveSize(2) + infoAfterMigrate.pending aka "pendingMigrationsAfterMigrate" must haveSize(0) + infoAfterMigrate.current.flatMap(_.version.version) aka "currentMigrationAfterMigrate" must beSome("2") + infoAfterMigrate.applied aka "appliedMigrationsAfterMigrate" must haveSize(2) } - infoBeforeMigrate.all aka "allMigrationsBeforeMigrate" must haveSize(2) - infoBeforeMigrate.pending aka "pendingMigrationsBeforeMigrate" must haveSize(2) - infoBeforeMigrate.current aka "currentMigrationBeforeMigrate" must beNone - infoBeforeMigrate.applied aka "appliedMigrationsBeforeMigrate" must haveSize(0) - - successfullyAppliedMigrationCount aka "successfullyAppliedMigrationCount" must_== 1 - - infoAfterMigrate.all aka "allMigrationsAfterMigrate" must haveSize(2) - infoAfterMigrate.pending aka "pendingMigrationsAfterMigrate" must haveSize(0) - infoAfterMigrate.current.flatMap(_.version.version) aka "currentMigrationAfterMigrate" must beSome("2") - infoAfterMigrate.applied aka "appliedMigrationsAfterMigrate" must haveSize(2) - } - result.unsafeRunSync() } diff --git a/modules/cats/src/test/scala/flutterby/cats/config/ConfigBuilderSpec.scala b/modules/cats/src/test/scala/flutterby/cats/config/ConfigBuilderSpec.scala index 7136978..61c8262 100644 --- a/modules/cats/src/test/scala/flutterby/cats/config/ConfigBuilderSpec.scala +++ b/modules/cats/src/test/scala/flutterby/cats/config/ConfigBuilderSpec.scala @@ -134,8 +134,7 @@ object TestData { object Arbitraries { implicit val arbJdbcUrl: Arbitrary[JdbcUrl] = Arbitrary { - for - dbName <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) + for dbName <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) yield JdbcUrl(s"jdbc:postgresql://127.0.0.1:5432/$dbName") } @@ -146,30 +145,26 @@ object Arbitraries { Arbitrary(Gen.asciiPrintableStr.map(Password.apply)) implicit val arbJdbcUrlDatasource: Arbitrary[JdbcUrlDatasource] = Arbitrary { - for - jdbcUrl <- Arbitrary.arbitrary[JdbcUrl] - username <- Arbitrary.arbitrary[Username] - password <- Arbitrary.arbitrary[Password] + for jdbcUrl <- Arbitrary.arbitrary[JdbcUrl] + username <- Arbitrary.arbitrary[Username] + password <- Arbitrary.arbitrary[Password] yield JdbcUrlDatasource(jdbcUrl, username, password) } implicit val arbStringMigrationResolver: Arbitrary[StringMigrationResolver] = Arbitrary { - for - migrator <- - Gen.oneOf(classOf[MigrationResolver1], classOf[MigrationResolver2], classOf[MigrationResolver3]).map(_.getName) + for migrator <- + Gen.oneOf(classOf[MigrationResolver1], classOf[MigrationResolver2], classOf[MigrationResolver3]).map(_.getName) yield StringMigrationResolver(migrator) } implicit val arbStringCallback: Arbitrary[StringCallback] = Arbitrary { - for - callback <- Gen.oneOf(classOf[Callback1], classOf[Callback2], classOf[Callback3]).map(_.getName) + for callback <- Gen.oneOf(classOf[Callback1], classOf[Callback2], classOf[Callback3]).map(_.getName) yield StringCallback(callback) } implicit val arbCallback: Arbitrary[Callback] = Arbitrary { - for - supportsResult <- Arbitrary.arbitrary[Boolean] - canHandleInTransactionResult <- Arbitrary.arbitrary[Boolean] + for supportsResult <- Arbitrary.arbitrary[Boolean] + canHandleInTransactionResult <- Arbitrary.arbitrary[Boolean] yield new Callback { override def supports(event: Event, context: callback.Context): Boolean = supportsResult override def canHandleInTransaction(event: Event, context: callback.Context): Boolean = @@ -181,26 +176,23 @@ object Arbitraries { } implicit val arbStringVersion: Arbitrary[StringVersion] = Arbitrary { - for - target <- - Gen.oneOf[String](Gen.const(null), Gen.const("current"), Gen.const("latest"), Gen.posNum[Int].map(_.toString)) + for target <- + Gen.oneOf[String](Gen.const(null), Gen.const("current"), Gen.const("latest"), Gen.posNum[Int].map(_.toString)) yield StringVersion(target) } implicit val arbMigrationVersion: Arbitrary[MigrationVersion] = Arbitrary { - for - version <- Arbitrary.arbitrary[StringVersion] + for version <- Arbitrary.arbitrary[StringVersion] yield MigrationVersion.fromVersion(version.value) } implicit val arbMigrationType: Arbitrary[MigrationType] = Arbitrary(Gen.oneOf(MigrationType.values().toList)) implicit val arbMigrationExecutor: Arbitrary[MigrationExecutor] = Arbitrary { - for - executeResult <- Gen - .oneOf[Try[Unit]](Failure(new RuntimeException("Boom!")), Success(())) - executeInTransaction <- Arbitrary.arbitrary[Boolean] - canExecute <- Arbitrary.arbitrary[Boolean] + for executeResult <- Gen + .oneOf[Try[Unit]](Failure(new RuntimeException("Boom!")), Success(())) + executeInTransaction <- Arbitrary.arbitrary[Boolean] + canExecute <- Arbitrary.arbitrary[Boolean] yield new MigrationExecutor { override def execute(context: executor.Context): Unit = executeResult.get @@ -210,16 +202,15 @@ object Arbitraries { } implicit val arbResolvedMigration: Arbitrary[ResolvedMigration] = Arbitrary { - for - version <- Arbitrary.arbitrary[MigrationVersion] - description <- Gen.asciiPrintableStr - script <- Gen.alphaNumStr - checksum <- Gen.posNum[Int] - migrationType <- Arbitrary.arbitrary[MigrationType] - physicalLocation <- Gen.alphaNumStr - executor <- Arbitrary.arbitrary[MigrationExecutor] - checksumMatchesResult <- Arbitrary.arbitrary[Boolean] - checksumMatchesWithoutBeingIdenticalResult <- Arbitrary.arbitrary[Boolean] + for version <- Arbitrary.arbitrary[MigrationVersion] + description <- Gen.asciiPrintableStr + script <- Gen.alphaNumStr + checksum <- Gen.posNum[Int] + migrationType <- Arbitrary.arbitrary[MigrationType] + physicalLocation <- Gen.alphaNumStr + executor <- Arbitrary.arbitrary[MigrationExecutor] + checksumMatchesResult <- Arbitrary.arbitrary[Boolean] + checksumMatchesWithoutBeingIdenticalResult <- Arbitrary.arbitrary[Boolean] yield new ResolvedMigration { override def getVersion: MigrationVersion = version override def getDescription: String = description @@ -236,8 +227,7 @@ object Arbitraries { } implicit val arbMigrationResolver: Arbitrary[MigrationResolver] = Arbitrary { - for - resolvedMigrations <- Gen.listOf(Arbitrary.arbitrary[ResolvedMigration]) + for resolvedMigrations <- Gen.listOf(Arbitrary.arbitrary[ResolvedMigration]) yield new MigrationResolver { override def resolveMigrations(context: resolver.Context): util.Collection[ResolvedMigration] = CollectionConversions.toJavaCollection(resolvedMigrations) @@ -245,39 +235,34 @@ object Arbitraries { } implicit val arbStringLocation: Arbitrary[StringLocation] = Arbitrary { - for - locationPrefix <- Gen.oneOf("filesystem:", "classpath:") - location <- Gen.alphaNumStr + for locationPrefix <- Gen.oneOf("filesystem:", "classpath:") + location <- Gen.alphaNumStr yield StringLocation(locationPrefix + location) } implicit val arbLocation: Arbitrary[Location] = Arbitrary { - for - loc <- Arbitrary.arbitrary[StringLocation] + for loc <- Arbitrary.arbitrary[StringLocation] yield new Location(loc.value) } implicit val arbCharsetEncoding: Arbitrary[Charset] = Arbitrary { - for - encoding <- Gen.oneOf(StandardCharsets.UTF_8, StandardCharsets.US_ASCII, StandardCharsets.ISO_8859_1) + for encoding <- Gen.oneOf(StandardCharsets.UTF_8, StandardCharsets.US_ASCII, StandardCharsets.ISO_8859_1) yield encoding } implicit val arbStringEncoding: Arbitrary[StringEncoding] = Arbitrary { - for - encoding <- Arbitrary.arbitrary[Charset].map(_.name()) + for encoding <- Arbitrary.arbitrary[Charset].map(_.name()) yield StringEncoding(encoding) } implicit val arbJavaMigration: Arbitrary[JavaMigration] = Arbitrary { - for - version <- Arbitrary.arbitrary[MigrationVersion] - description <- Gen.asciiPrintableStr - checksum <- Gen.posNum[Int] - undo <- Arbitrary.arbitrary[Boolean] - executeInTransaction <- Arbitrary.arbitrary[Boolean] - migrateResult <- Gen - .oneOf[Try[Unit]](Failure(new RuntimeException("Boom!")), Success(())) + for version <- Arbitrary.arbitrary[MigrationVersion] + description <- Gen.asciiPrintableStr + checksum <- Gen.posNum[Int] + undo <- Arbitrary.arbitrary[Boolean] + executeInTransaction <- Arbitrary.arbitrary[Boolean] + migrateResult <- Gen + .oneOf[Try[Unit]](Failure(new RuntimeException("Boom!")), Success(())) yield new JavaMigration { override def getVersion: MigrationVersion = version override def getDescription: String = description @@ -294,124 +279,123 @@ object Arbitraries { implicit val arbFluentConfiguration: Arbitrary[FluentConfigurationWithDatasource] = Arbitrary { - for - locationsEndo <- Gen.oneOf( - Gen - .listOf(Arbitrary.arbitrary[StringLocation]) - .map[FluentEndo](l => c => c.locations(l.map(_.value): _*)), - Gen.listOf(Arbitrary.arbitrary[Location]).map[FluentEndo](l => c => c.locations(l: _*)) - ) - encodingEndo <- Gen.oneOf( - Arbitrary.arbitrary[StringEncoding].map[FluentEndo](e => c => c.encoding(e.value)), - Arbitrary.arbitrary[Charset].map[FluentEndo](e => c => c.encoding(e)) - ) - targetEndo <- Gen.oneOf( - Arbitrary.arbitrary[StringVersion].map[FluentEndo](e => c => c.target(e.value)), - Arbitrary.arbitrary[MigrationVersion].map[FluentEndo](e => c => c.target(e)) - ) - baselineVersionEndo <- Gen.oneOf( - Arbitrary.arbitrary[StringVersion].map[FluentEndo](e => c => c.target(e.value)), - Arbitrary.arbitrary[MigrationVersion].map[FluentEndo](e => c => c.target(e)) - ) - callbacksEndo <- Gen.oneOf( - Gen - .listOf(Arbitrary.arbitrary[StringCallback]) - .map[FluentEndo](l => c => c.callbacks(l.map(_.value): _*)), - Gen.listOf(Arbitrary.arbitrary[Callback]).map[FluentEndo](l => c => c.callbacks(l: _*)) - ) - resolversEndo <- Gen.oneOf( - Gen - .listOf(Arbitrary.arbitrary[StringMigrationResolver]) - .map[FluentEndo](l => c => c.resolvers(l.map(_.value): _*)), - Gen - .listOf(Arbitrary.arbitrary[MigrationResolver]) - .map[FluentEndo](l => c => c.resolvers(l: _*)) - ) - dataSource <- Gen.oneOf[TestDataSource]( - Arbitrary.arbitrary[JdbcUrlDatasource], - Gen.const(TestDataSourceImpl) - ) - dataSourceEndo = dataSource match { - case JdbcUrlDatasource(url, username, password) => - (c: FluentConfiguration) => c.dataSource(url.value, username.value, password.value) - case t: TestDataSourceImpl.type => (c: FluentConfiguration) => c.dataSource(t) - } - defaultSchema <- Gen.alphaNumStr - schemas <- Gen.listOf(Gen.alphaNumStr) - table <- Gen.alphaNumStr - tableSpace <- Gen.alphaNumStr - isPlaceholderReplacement <- Arbitrary.arbitrary[Boolean] - placeholders <- Gen.mapOf(Gen.alphaNumStr.flatMap(a => Gen.alphaNumStr.map(b => (a, b)))) - placeholderPrefix <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) - placeholderSuffix <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) - sqlMigrationPrefix <- Gen.alphaNumStr - repeatableSqlMigrationPrefix <- Gen.alphaNumStr - sqlMigrationSeparator <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) - sqlMigrationSuffixes <- Gen.listOf(Gen.alphaNumStr) - javaMigrations <- Gen.listOf(Arbitrary.arbitrary[JavaMigration]) - ignoreMissingMigrations <- Arbitrary.arbitrary[Boolean] - ignoreIgnoredMigrations <- Arbitrary.arbitrary[Boolean] - ignorePendingMigrations <- Arbitrary.arbitrary[Boolean] - ignoreFutureMigrations <- Arbitrary.arbitrary[Boolean] - validateMigrationNaming <- Arbitrary.arbitrary[Boolean] - validateOnMigrate <- Arbitrary.arbitrary[Boolean] - cleanOnValidationError <- Arbitrary.arbitrary[Boolean] - cleanDisabled <- Arbitrary.arbitrary[Boolean] - baselineDescription <- Gen.asciiPrintableStr - baselineOnMigrate <- Arbitrary.arbitrary[Boolean] - skipDefaultCallbacks <- Arbitrary.arbitrary[Boolean] - outOfOrder <- Arbitrary.arbitrary[Boolean] - skipDefaultResolvers <- Arbitrary.arbitrary[Boolean] - connectRetries <- Gen.chooseNum[Int](0, Int.MaxValue) - initSql <- Gen.asciiPrintableStr - mixed <- Arbitrary.arbitrary[Boolean] - installedBy <- Gen.asciiPrintableStr - group <- Arbitrary.arbitrary[Boolean] - licenseKey <- Gen.asciiPrintableStr - createSchemas <- Arbitrary.arbitrary[Boolean] - f1 = new FluentConfiguration(Thread.currentThread.getContextClassLoader) - .defaultSchema(defaultSchema) - .schemas(schemas: _*) - .table(table) - .tablespace(tableSpace) - .placeholderReplacement(isPlaceholderReplacement) - .placeholders(CollectionConversions.toJavaMap(placeholders)) - .placeholderPrefix(placeholderPrefix) - .placeholderSuffix(placeholderSuffix) - .sqlMigrationPrefix(sqlMigrationPrefix) - .repeatableSqlMigrationPrefix(repeatableSqlMigrationPrefix) - .sqlMigrationSeparator(sqlMigrationSeparator) - .sqlMigrationSuffixes(sqlMigrationSuffixes: _*) - .javaMigrations(javaMigrations: _*) - .ignoreMissingMigrations(ignoreMissingMigrations) - .ignoreIgnoredMigrations(ignoreIgnoredMigrations) - .ignorePendingMigrations(ignorePendingMigrations) - .ignoreFutureMigrations(ignoreFutureMigrations) - .validateMigrationNaming(validateMigrationNaming) - .validateOnMigrate(validateOnMigrate) - .cleanOnValidationError(cleanOnValidationError) - .cleanDisabled(cleanDisabled) - .baselineDescription(baselineDescription) - .baselineOnMigrate(baselineOnMigrate) - .skipDefaultCallbacks(skipDefaultCallbacks) - .outOfOrder(outOfOrder) - .skipDefaultResolvers(skipDefaultResolvers) - .connectRetries(connectRetries) - .initSql(initSql) - .mixed(mixed) - .installedBy(installedBy) - .group(group) - .licenseKey(licenseKey) - .createSchemas(createSchemas) - .resourceProvider(TestResourceProvider) - .javaMigrationClassProvider(TestJavaMigrationClassProvider) - f2 = locationsEndo(f1) - f3 = encodingEndo(f2) - f4 = targetEndo(f3) - f5 = baselineVersionEndo(f4) - f6 = callbacksEndo(f5) - f7 = resolversEndo(f6) - f8 = dataSourceEndo(f7) + for locationsEndo <- Gen.oneOf( + Gen + .listOf(Arbitrary.arbitrary[StringLocation]) + .map[FluentEndo](l => c => c.locations(l.map(_.value): _*)), + Gen.listOf(Arbitrary.arbitrary[Location]).map[FluentEndo](l => c => c.locations(l: _*)) + ) + encodingEndo <- Gen.oneOf( + Arbitrary.arbitrary[StringEncoding].map[FluentEndo](e => c => c.encoding(e.value)), + Arbitrary.arbitrary[Charset].map[FluentEndo](e => c => c.encoding(e)) + ) + targetEndo <- Gen.oneOf( + Arbitrary.arbitrary[StringVersion].map[FluentEndo](e => c => c.target(e.value)), + Arbitrary.arbitrary[MigrationVersion].map[FluentEndo](e => c => c.target(e)) + ) + baselineVersionEndo <- Gen.oneOf( + Arbitrary.arbitrary[StringVersion].map[FluentEndo](e => c => c.target(e.value)), + Arbitrary.arbitrary[MigrationVersion].map[FluentEndo](e => c => c.target(e)) + ) + callbacksEndo <- Gen.oneOf( + Gen + .listOf(Arbitrary.arbitrary[StringCallback]) + .map[FluentEndo](l => c => c.callbacks(l.map(_.value): _*)), + Gen.listOf(Arbitrary.arbitrary[Callback]).map[FluentEndo](l => c => c.callbacks(l: _*)) + ) + resolversEndo <- Gen.oneOf( + Gen + .listOf(Arbitrary.arbitrary[StringMigrationResolver]) + .map[FluentEndo](l => c => c.resolvers(l.map(_.value): _*)), + Gen + .listOf(Arbitrary.arbitrary[MigrationResolver]) + .map[FluentEndo](l => c => c.resolvers(l: _*)) + ) + dataSource <- Gen.oneOf[TestDataSource]( + Arbitrary.arbitrary[JdbcUrlDatasource], + Gen.const(TestDataSourceImpl) + ) + dataSourceEndo = dataSource match { + case JdbcUrlDatasource(url, username, password) => + (c: FluentConfiguration) => c.dataSource(url.value, username.value, password.value) + case t: TestDataSourceImpl.type => (c: FluentConfiguration) => c.dataSource(t) + } + defaultSchema <- Gen.alphaNumStr + schemas <- Gen.listOf(Gen.alphaNumStr) + table <- Gen.alphaNumStr + tableSpace <- Gen.alphaNumStr + isPlaceholderReplacement <- Arbitrary.arbitrary[Boolean] + placeholders <- Gen.mapOf(Gen.alphaNumStr.flatMap(a => Gen.alphaNumStr.map(b => (a, b)))) + placeholderPrefix <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) + placeholderSuffix <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) + sqlMigrationPrefix <- Gen.alphaNumStr + repeatableSqlMigrationPrefix <- Gen.alphaNumStr + sqlMigrationSeparator <- Gen.alphaNumStr.suchThat(v => Option(v).exists(_.trim.length > 0)) + sqlMigrationSuffixes <- Gen.listOf(Gen.alphaNumStr) + javaMigrations <- Gen.listOf(Arbitrary.arbitrary[JavaMigration]) + ignoreMissingMigrations <- Arbitrary.arbitrary[Boolean] + ignoreIgnoredMigrations <- Arbitrary.arbitrary[Boolean] + ignorePendingMigrations <- Arbitrary.arbitrary[Boolean] + ignoreFutureMigrations <- Arbitrary.arbitrary[Boolean] + validateMigrationNaming <- Arbitrary.arbitrary[Boolean] + validateOnMigrate <- Arbitrary.arbitrary[Boolean] + cleanOnValidationError <- Arbitrary.arbitrary[Boolean] + cleanDisabled <- Arbitrary.arbitrary[Boolean] + baselineDescription <- Gen.asciiPrintableStr + baselineOnMigrate <- Arbitrary.arbitrary[Boolean] + skipDefaultCallbacks <- Arbitrary.arbitrary[Boolean] + outOfOrder <- Arbitrary.arbitrary[Boolean] + skipDefaultResolvers <- Arbitrary.arbitrary[Boolean] + connectRetries <- Gen.chooseNum[Int](0, Int.MaxValue) + initSql <- Gen.asciiPrintableStr + mixed <- Arbitrary.arbitrary[Boolean] + installedBy <- Gen.asciiPrintableStr + group <- Arbitrary.arbitrary[Boolean] + licenseKey <- Gen.asciiPrintableStr + createSchemas <- Arbitrary.arbitrary[Boolean] + f1 = new FluentConfiguration(Thread.currentThread.getContextClassLoader) + .defaultSchema(defaultSchema) + .schemas(schemas: _*) + .table(table) + .tablespace(tableSpace) + .placeholderReplacement(isPlaceholderReplacement) + .placeholders(CollectionConversions.toJavaMap(placeholders)) + .placeholderPrefix(placeholderPrefix) + .placeholderSuffix(placeholderSuffix) + .sqlMigrationPrefix(sqlMigrationPrefix) + .repeatableSqlMigrationPrefix(repeatableSqlMigrationPrefix) + .sqlMigrationSeparator(sqlMigrationSeparator) + .sqlMigrationSuffixes(sqlMigrationSuffixes: _*) + .javaMigrations(javaMigrations: _*) + .ignoreMissingMigrations(ignoreMissingMigrations) + .ignoreIgnoredMigrations(ignoreIgnoredMigrations) + .ignorePendingMigrations(ignorePendingMigrations) + .ignoreFutureMigrations(ignoreFutureMigrations) + .validateMigrationNaming(validateMigrationNaming) + .validateOnMigrate(validateOnMigrate) + .cleanOnValidationError(cleanOnValidationError) + .cleanDisabled(cleanDisabled) + .baselineDescription(baselineDescription) + .baselineOnMigrate(baselineOnMigrate) + .skipDefaultCallbacks(skipDefaultCallbacks) + .outOfOrder(outOfOrder) + .skipDefaultResolvers(skipDefaultResolvers) + .connectRetries(connectRetries) + .initSql(initSql) + .mixed(mixed) + .installedBy(installedBy) + .group(group) + .licenseKey(licenseKey) + .createSchemas(createSchemas) + .resourceProvider(TestResourceProvider) + .javaMigrationClassProvider(TestJavaMigrationClassProvider) + f2 = locationsEndo(f1) + f3 = encodingEndo(f2) + f4 = targetEndo(f3) + f5 = baselineVersionEndo(f4) + f6 = callbacksEndo(f5) + f7 = resolversEndo(f6) + f8 = dataSourceEndo(f7) yield FluentConfigurationWithDatasource(f8, dataSource) } } diff --git a/modules/core/src/main/scala/flutterby/core/jdk/CollectionConversions.scala b/modules/core/src/main/scala/flutterby/core/jdk/CollectionConversions.scala index 4975ef0..0f6f071 100644 --- a/modules/core/src/main/scala/flutterby/core/jdk/CollectionConversions.scala +++ b/modules/core/src/main/scala/flutterby/core/jdk/CollectionConversions.scala @@ -2,7 +2,8 @@ package flutterby.core.jdk import java.util -/** @author Shawn Garner +/** @author + * Shawn Garner */ object CollectionConversions {