diff --git a/build.sbt b/build.sbt index 30ab5b7..02896db 100644 --- a/build.sbt +++ b/build.sbt @@ -31,22 +31,25 @@ lazy val publishSettings = Seq( ) -lazy val `launaskil-codegen` = +enablePlugins(PackPlugin) +import xerial.sbt.pack.PackPlugin.packSettings + +lazy val `scala-db-codegen` = (project in file(".")) .settings(packSettings) .settings(publishSettings) .settings( name := "scala-db-codegen", organization := "com.geirsson", - scalaVersion := "2.11.8", + scalaVersion := "2.12.4", version := com.geirsson.codegen.Versions.nightly, packMain := Map("scala-db-codegen" -> "com.geirsson.codegen.Codegen"), libraryDependencies ++= Seq( - "com.geirsson" %% "scalafmt-core" % "0.3.0", - "io.getquill" %% "quill-core" % "0.8.0", - "com.h2database" % "h2" % "1.4.192", - "org.postgresql" % "postgresql" % "9.4-1201-jdbc41", - "com.github.alexarchambault" %% "case-app" % "1.0.0-RC3", - "org.scalatest" %% "scalatest" % "3.0.0" % "test" + "com.geirsson" %% "scalafmt-core" % "1.2.0", + "io.getquill" %% "quill-core" % "2.2.0", + "com.h2database" % "h2" % "1.4.196", + "org.postgresql" % "postgresql" % "42.1.4", + "com.github.alexarchambault" %% "case-app" % "1.2.0", + "org.scalatest" %% "scalatest" % "3.0.4" % "test" ) ) diff --git a/project/build.properties b/project/build.properties index 35c88ba..9abea12 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.12 +sbt.version=1.0.3 diff --git a/project/plugins.sbt b/project/plugins.sbt index 3b9f410..32d6289 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,3 +1,3 @@ -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1") -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") -addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.8.0") +addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.0") +addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0") +addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.9.2") diff --git a/src/main/scala/com/geirsson/codegen/Codegen.scala b/src/main/scala/com/geirsson/codegen/Codegen.scala index cf188fa..acc4515 100644 --- a/src/main/scala/com/geirsson/codegen/Codegen.scala +++ b/src/main/scala/com/geirsson/codegen/Codegen.scala @@ -12,9 +12,8 @@ import caseapp.AppOf import caseapp._ import com.typesafe.scalalogging.Logger import io.getquill.NamingStrategy -import org.scalafmt.FormatResult -import org.scalafmt.Scalafmt -import org.scalafmt.ScalafmtStyle +import org.scalafmt.{Formatted, Scalafmt} +import org.scalafmt.config.ScalafmtConfig case class Error(msg: String) extends Exception(msg) @@ -42,9 +41,7 @@ case class CodegenOptions( @HelpMessage( "Write generated code to this filename. Prints to stdout if not set." ) file: Option[String] = None -) extends App { - Codegen.cliRun(this) -} +) { } case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) { import Codegen._ @@ -59,19 +56,25 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) { } def getForeignKeys(db: Connection): Set[ForeignKey] = { - val foreignKeys = - db.getMetaData.getExportedKeys(null, options.schema, null) - results(foreignKeys).map { row => - ForeignKey( - from = SimpleColumn( - tableName = row.getString(FK_TABLE_NAME), - columnName = row.getString(FK_COLUMN_NAME) - ), - to = SimpleColumn( - tableName = row.getString(PK_TABLE_NAME), - columnName = row.getString(PK_COLUMN_NAME) + val allTables = + results(db.getMetaData.getTables(null, options.schema, "%", Array("TABLE"))).map { row => + row.getString(TABLE_NAME) + } + + allTables.flatMap { table => + val foreignKeys = db.getMetaData.getExportedKeys(null, options.schema, table) + results(foreignKeys).map { row => + ForeignKey( + from = SimpleColumn( + tableName = row.getString(FK_TABLE_NAME), + columnName = row.getString(FK_COLUMN_NAME) + ), + to = SimpleColumn( + tableName = row.getString(PK_TABLE_NAME), + columnName = row.getString(PK_COLUMN_NAME) + ) ) - ) + } }.toSet } @@ -178,7 +181,7 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) { def toSimple = references.getOrElse(SimpleColumn(tableName, columnName)) def toClass: String = { - s"case class ${namingStrategy.table(columnName)}(value: $scalaType) extends AnyVal with WrappedValue[$scalaType]" + s"case class ${namingStrategy.table(columnName)}(value: $scalaType) extends AnyVal" } } @@ -218,7 +221,7 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) { } } -object Codegen extends AppOf[CodegenOptions] { +object Codegen extends CaseApp[CodegenOptions] { val TABLE_NAME = "TABLE_NAME" val COLUMN_NAME = "COLUMN_NAME" val TYPE_NAME = "TYPE_NAME" @@ -235,25 +238,21 @@ object Codegen extends AppOf[CodegenOptions] { } } - def cliRun(codegenOptions: CodegenOptions, - outstream: PrintStream = System.out): Unit = { - try { - run(codegenOptions, outstream) - } catch { - case Error(msg) => - System.err.println(msg) - System.exit(1) + def run(codegenOptions: CodegenOptions, + remainingArgs: RemainingArgs): Unit = { + val outstream = System.out + + if (remainingArgs.args.size != 0) { + outstream.println("Invalid options specified") + CaseApp.printUsage() } - } - def run(codegenOptions: CodegenOptions, - outstream: PrintStream = System.out): Unit = { codegenOptions.file.foreach { x => outstream.println("Starting...") } val startTime = System.currentTimeMillis() - Class.forName(codegenOptions.jdbcDriver) + Class.forName(codegenOptions.jdbcDriver).newInstance() val db: Connection = DriverManager.getConnection(codegenOptions.url, codegenOptions.user, @@ -273,9 +272,9 @@ object Codegen extends AppOf[CodegenOptions] { val tables = codegen.getTables(db, foreignKeys) val generatedCode = codegen.tables2code(tables, SnakeCaseReverse, codegenOptions) - val codeStyle = ScalafmtStyle.defaultWithAlign.copy(maxColumn = 120) + val codeStyle = ScalafmtConfig.defaultWithAlign.copy(maxColumn = 120) val code = Scalafmt.format(generatedCode, style = codeStyle) match { - case FormatResult.Success(x) => x + case Formatted.Success(x) => x case _ => generatedCode } codegenOptions.file match { diff --git a/src/main/scala/com/geirsson/codegen/TypeMap.scala b/src/main/scala/com/geirsson/codegen/TypeMap.scala index 15e986e..649de7e 100644 --- a/src/main/scala/com/geirsson/codegen/TypeMap.scala +++ b/src/main/scala/com/geirsson/codegen/TypeMap.scala @@ -6,7 +6,7 @@ import caseapp.core.ArgParser object TypeMap { implicit val parser: ArgParser[TypeMap] = - ArgParser.instance[TypeMap] { s => + ArgParser.instance[TypeMap] ("Type map") { s => try { val pairs = s.split(";").map { pair => val from :: to :: Nil = pair.split(",", 2).toList diff --git a/src/test/scala/com/geirsson/codegen/CodegenTest.scala b/src/test/scala/com/geirsson/codegen/CodegenTest.scala index 5f0b464..a6593b6 100644 --- a/src/test/scala/com/geirsson/codegen/CodegenTest.scala +++ b/src/test/scala/com/geirsson/codegen/CodegenTest.scala @@ -8,10 +8,10 @@ import java.nio.file.Files import java.nio.file.Paths import java.sql.DriverManager -import caseapp.CaseApp +import caseapp.{CaseApp, RemainingArgs} import org.scalatest.FunSuite -class CodegenTest extends FunSuite { +class sbtCodegenTest extends FunSuite { def structure(code: String): String = { import scala.meta._ @@ -100,7 +100,7 @@ class CodegenTest extends FunSuite { ) val baos = new ByteArrayOutputStream() val ps = new PrintStream(baos) - Codegen.run(options, ps) + Codegen.run(options, RemainingArgs(Seq(), Seq())) val obtained = new String(baos.toByteArray, StandardCharsets.UTF_8) println(obtained) assert(structure(expected) == structure(obtained)) diff --git a/src/test/scala/com/geirsson/codegen/Tables.scala b/src/test/scala/com/geirsson/codegen/Tables.scala index f974349..063ab88 100644 --- a/src/test/scala/com/geirsson/codegen/Tables.scala +++ b/src/test/scala/com/geirsson/codegen/Tables.scala @@ -1,5 +1,4 @@ package com.geirsson.codegen -import io.getquill.WrappedValue //noinspection ScalaStyle object Tables { @@ -20,9 +19,9 @@ object Tables { authorId.map(TestUser.Id.apply), isPublished.map(IsPublished.apply)) } - case class Id(value: Int) extends AnyVal with WrappedValue[Int] - case class ArticleUniqueId(value: java.util.UUID) extends AnyVal with WrappedValue[java.util.UUID] - case class IsPublished(value: Boolean) extends AnyVal with WrappedValue[Boolean] + case class Id(value: Int) extends AnyVal + case class ArticleUniqueId(value: java.util.UUID) extends AnyVal + case class IsPublished(value: Boolean) extends AnyVal } ///////////////////////////////////////////////////// @@ -33,7 +32,7 @@ object Tables { def create(articleId: Int, active: Option[Boolean]): ArticleActive = { ArticleActive(Article.Id(articleId), active.map(Active.apply)) } - case class Active(value: Boolean) extends AnyVal with WrappedValue[Boolean] + case class Active(value: Boolean) extends AnyVal } ///////////////////////////////////////////////////// @@ -44,7 +43,7 @@ object Tables { def create(id: Int, name: Option[String]): TestUser = { TestUser(Id(id), name.map(Name.apply)) } - case class Id(value: Int) extends AnyVal with WrappedValue[Int] - case class Name(value: String) extends AnyVal with WrappedValue[String] + case class Id(value: Int) extends AnyVal + case class Name(value: String) extends AnyVal } } \ No newline at end of file