Skip to content

Commit 25c469c

Browse files
authored
add mill plugin (#1)
1 parent a0863ea commit 25c469c

File tree

13 files changed

+285
-43
lines changed

13 files changed

+285
-43
lines changed

.envrc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Automatically sets up your devbox environment whenever you cd into this
2+
# directory via our direnv integration:
3+
4+
eval "$(devbox generate direnv --print-envrc)"
5+
6+
# check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/
7+
# for more details

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
- uses: olafurpg/setup-scala@v12
1616

1717
- name: Test
18-
run: sbt ++test
18+
run: sbt test
1919

2020
publish:
2121
needs: [build]

.gitignore

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,32 @@
1-
# bloop and metals
2-
.bloop
3-
.bsp
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
49

5-
# metals
6-
.metals
10+
node_modules
11+
dist
12+
dist-ssr
13+
*.local
714

8-
# sbt
9-
target/
15+
# Editor directories and files
16+
.vscode/*
17+
!.vscode/extensions.json
18+
.idea
19+
.DS_Store
20+
*.suo
21+
*.ntvs*
22+
*.njsproj
23+
*.sln
24+
*.sw?
1025

26+
# Scala stuff
27+
.bloop/
28+
.bsp/
29+
.metals/
30+
target/
31+
metals.sbt
32+
out/

README.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
# sbt-quillcodegen
1+
# scala-quillcodegen
22

3-
This is an sbt-plugin that uses the [quill-codegen-jdbc](https://zio.dev/zio-quill/code-generation/) to generate case classes and query schemas from a database schema.
3+
This is an sbt-plugin and mill-plugin that uses the [quill-codegen-jdbc](https://zio.dev/zio-quill/code-generation/) to generate case classes and query schemas from a database schema.
44

55
Works with scala 2 and 3.
66

77
## Usage
88

9+
### sbt
10+
911
In `project/plugins.sbt`:
1012
```sbt
11-
addSbtPlugin("com.github.cornerman" % "sbt-quillcodegen" % "0.1.5")
13+
addSbtPlugin("com.github.cornerman" % "sbt-quillcodegen" % "0.2.0")
1214
```
1315

1416
In `build.sbt`:
@@ -46,7 +48,7 @@ lazy val db = project
4648
)
4749
```
4850

49-
### Setup database before codegen
51+
#### Setup database before codegen
5052

5153
An example for using the `quillcodegenSetupTask` to setup an sqlite database with a `schema.sql` file before the code generation runs:
5254
```sbt
@@ -58,3 +60,21 @@ quillcodegenSetupTask := Def.taskDyn {
5860

5961
The functions `executeSql` and `executeSqlFile` are provided for these kind of use-cases and use the provided jdbcUrl, username, and password.
6062

63+
64+
### mill
65+
66+
In `build.sc`:
67+
```
68+
import mill._, scalalib._
69+
import $ivy.`com.github.cornerman::mill-quillcodegen:0.2.0`, quillcodegen.plugin.QuillCodegenModule
70+
71+
object backend extends ScalaModule with QuillCodegenModule {
72+
def quillcodegenJdbcUrl = "com.example.db",
73+
def quillcodegenPackagePrefix = "dbtypes"
74+
def quillcodegenSetupTask = T.task {
75+
val dbpath = quillcodegenJdbcUrl.stripPrefix("jdbc:sqlite:")
76+
os.remove(os.pwd / dbpath)
77+
executeSqlFile(PathRef(os.pwd / "schema.sql"))
78+
}
79+
}
80+
```

build.sbt

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ Global / onChangedBuildSource := ReloadOnSourceChanges
22

33
inThisBuild(
44
Seq(
5-
organization := "com.github.cornerman",
6-
scalaVersion := "2.12.12",
7-
crossScalaVersions := Seq("2.12.12"),
8-
licenses := Seq("MIT License" -> url("https://opensource.org/licenses/MIT")),
9-
homepage := Some(url("https://github.com/cornerman/sbt-quillcodegen")),
5+
organization := "com.github.cornerman",
6+
licenses := Seq("MIT License" -> url("https://opensource.org/licenses/MIT")),
7+
homepage := Some(url("https://github.com/cornerman/sbt-quillcodegen")),
108
scmInfo := Some(
119
ScmInfo(
1210
url("https://github.com/cornerman/sbt-quillcodegen"),
@@ -25,10 +23,10 @@ inThisBuild(
2523
)
2624
)
2725

26+
// TODO: Use sbt-cross to workaround: https://github.com/sbt/sbt/issues/5586
2827
lazy val codegen = project
2928
.settings(
30-
name := "quillcodegen",
31-
crossScalaVersions := Seq("2.12.12", "2.13.12"),
29+
name := "quillcodegen",
3230
libraryDependencies ++= Seq(
3331
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
3432
// Should be same as in Codegen.scala for generated code
@@ -40,11 +38,30 @@ lazy val codegen = project
4038
"org.mybatis" % "mybatis" % "3.5.15",
4139
),
4240
)
41+
.cross
4342

44-
lazy val codegenPlugin = project
43+
lazy val codegen212 = codegen("2.12.19")
44+
lazy val codegen213 = codegen("2.13.13")
45+
46+
lazy val pluginSbt = project
47+
.settings(
48+
name := "sbt-quillcodegen",
49+
scalaVersion := "2.12.19",
50+
crossScalaVersions := Seq("2.12.19"),
51+
sbtPlugin := true,
52+
publishMavenStyle := true,
53+
)
54+
.dependsOn(codegen212)
55+
56+
lazy val pluginMill = project
4557
.settings(
46-
name := "sbt-quillcodegen",
47-
sbtPlugin := true,
48-
publishMavenStyle := true,
58+
name := "mill-quillcodegen",
59+
scalaVersion := "2.13.13",
60+
crossScalaVersions := Seq("2.13.13"),
61+
libraryDependencies ++= Seq(
62+
"com.lihaoyi" %% "mill-main" % "0.11.7",
63+
"com.lihaoyi" %% "mill-main-api" % "0.11.7",
64+
"com.lihaoyi" %% "mill-scalalib" % "0.11.7",
65+
),
4966
)
50-
.dependsOn(codegen)
67+
.dependsOn(codegen213)

codegen/src/main/scala/quillcodegen/Codegen.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,28 @@ object Codegen {
3131
val dataSource = SqlExecutor.getDataSource(jdbcUrl, username = username, password = password)
3232

3333
object gen extends ComposeableTraitsJdbcCodegen(dataSource, packagePrefix = packagePrefix, nestedTrait = nestedTrait) {
34-
override def typer: Typer = tpe => typeMapping(tpe, super.typer(tpe))
35-
override def unrecognizedTypeStrategy: UnrecognizedTypeStrategy = unrecognizedType
36-
override def numericPreference: NumericPreference = numericType
34+
override def typer: Typer = tpe => typeMapping(tpe, super.typer(tpe))
35+
override def unrecognizedTypeStrategy: UnrecognizedTypeStrategy = unrecognizedType
36+
override def numericPreference: NumericPreference = numericType
3737
override def filter(tc: RawSchema[JdbcTableMeta, JdbcColumnMeta]): Boolean = super.filter(tc) && tableFilter(tc)
38-
override def nameParser: NameParser = sanitizedNameParser(naming, shouldGenerateQuerySchema = generateQuerySchema)
39-
override def packagingStrategy: PackagingStrategy = PackagingStrategy.ByPackageHeader.TablePerSchema(this.packagePrefix)
38+
override def nameParser: NameParser = sanitizedNameParser(naming, shouldGenerateQuerySchema = generateQuerySchema)
39+
override def packagingStrategy: PackagingStrategy = PackagingStrategy.ByPackageHeader.TablePerSchema(this.packagePrefix)
4040

4141
override def generatorMaker = new SingleGeneratorFactory[ContextifiedUnitGenerator] {
4242
override def apply(emitterSettings: EmitterSettings[JdbcTableMeta, JdbcColumnMeta]): ContextifiedUnitGenerator = {
4343
new ContextifiedUnitGeneratorWrap(emitterSettings)
4444
}
4545
}
4646

47-
class ContextifiedUnitGeneratorWrap(emitterSettings: EmitterSettings[JdbcTableMeta, JdbcColumnMeta]) extends ContextifiedUnitGenerator(emitterSettings) {
47+
class ContextifiedUnitGeneratorWrap(emitterSettings: EmitterSettings[JdbcTableMeta, JdbcColumnMeta])
48+
extends ContextifiedUnitGenerator(emitterSettings) {
4849
private val scala3CodeEmitter = new CodeEmitter(emitterSettings) {
4950
override def CombinedTableSchemas = new CombinedTableSchemasGenWrap(_, _)
5051

5152
class CombinedTableSchemasGenWrap(
52-
tableColumns: TableStereotype[TableMeta, ColumnMeta],
53-
querySchemaNaming: QuerySchemaNaming
54-
) extends CombinedTableSchemasGen(tableColumns, querySchemaNaming) {
53+
tableColumns: TableStereotype[TableMeta, ColumnMeta],
54+
querySchemaNaming: QuerySchemaNaming,
55+
) extends CombinedTableSchemasGen(tableColumns, querySchemaNaming) {
5556
override def objectName: Option[String] = super.objectName.map(_ + "Dao")
5657

5758
override def body: String = {
@@ -65,7 +66,7 @@ object Codegen {
6566
override def QuerySchema = new QuerySchemaGenWrap(_, _)
6667

6768
class QuerySchemaGenWrap(tableColumns: TableStereotype[TableMeta, ColumnMeta], schema: TableMeta)
68-
extends QuerySchemaGen(tableColumns, schema) {
69+
extends QuerySchemaGen(tableColumns, schema) {
6970

7071
override def code: String = indent(querySchema)
7172
}
@@ -75,8 +76,7 @@ object Codegen {
7576
override def tableSchemasCode: String =
7677
if (isScala3) {
7778
scala3CodeEmitter.tableSchemasCode.notEmpty
78-
.map(tsCode =>
79-
s"""
79+
.map(tsCode => s"""
8080
|object ${traitName} {
8181
| import io.getquill.*
8282
|
@@ -105,6 +105,6 @@ object Codegen {
105105
cm => sanitizeScalaName(naming.parseColumn(cm)),
106106
tm => sanitizeScalaName(naming.parseTable(tm)),
107107
) {
108-
override def generateQuerySchemas: Boolean = shouldGenerateQuerySchema
108+
override def generateQuerySchemas: Boolean = shouldGenerateQuerySchema
109109
}
110110
}

codegen/src/main/scala/quillcodegen/SqlExecutor.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ object SqlExecutor {
1919
}
2020

2121
def executeSql(dataSource: DataSource, sql: String): Unit = {
22-
val connection = dataSource.getConnection
23-
val reader = new StringReader(sql)
22+
val connection = dataSource.getConnection
23+
val reader = new StringReader(sql)
2424

2525
try {
2626
createScriptRunner(connection).runScript(reader)

devbox.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/jetpack-io/devbox/0.10.3/.schema/devbox.schema.json",
3+
"packages": ["sbt@latest"],
4+
"shell": {
5+
"init_hook": [
6+
"echo 'Welcome to devbox!' > /dev/null"
7+
],
8+
"scripts": {
9+
"test": [
10+
"echo \"Error: no test specified\" && exit 1"
11+
]
12+
}
13+
}
14+
}

devbox.lock

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"lockfile_version": "1",
3+
"packages": {
4+
"sbt@latest": {
5+
"last_modified": "2024-03-22T11:26:23Z",
6+
"resolved": "github:NixOS/nixpkgs/a3ed7406349a9335cb4c2a71369b697cecd9d351#sbt",
7+
"source": "devbox-search",
8+
"version": "1.9.9",
9+
"systems": {
10+
"aarch64-darwin": {
11+
"outputs": [
12+
{
13+
"name": "out",
14+
"path": "/nix/store/clrwyandbc3ig6f3g6yrs36d8z5jb7lp-sbt-1.9.9",
15+
"default": true
16+
}
17+
],
18+
"store_path": "/nix/store/clrwyandbc3ig6f3g6yrs36d8z5jb7lp-sbt-1.9.9"
19+
},
20+
"aarch64-linux": {
21+
"outputs": [
22+
{
23+
"name": "out",
24+
"path": "/nix/store/c8pk0h3i5ddzw2fiz2qwrlqy4mm1nib1-sbt-1.9.9",
25+
"default": true
26+
}
27+
],
28+
"store_path": "/nix/store/c8pk0h3i5ddzw2fiz2qwrlqy4mm1nib1-sbt-1.9.9"
29+
},
30+
"x86_64-darwin": {
31+
"outputs": [
32+
{
33+
"name": "out",
34+
"path": "/nix/store/p0nh7i03z5mp1l9pzjirc2zkd6c294vi-sbt-1.9.9",
35+
"default": true
36+
}
37+
],
38+
"store_path": "/nix/store/p0nh7i03z5mp1l9pzjirc2zkd6c294vi-sbt-1.9.9"
39+
},
40+
"x86_64-linux": {
41+
"outputs": [
42+
{
43+
"name": "out",
44+
"path": "/nix/store/zadhq90vpjaflmczlzz2828h08dfbl1z-sbt-1.9.9",
45+
"default": true
46+
}
47+
],
48+
"store_path": "/nix/store/zadhq90vpjaflmczlzz2828h08dfbl1z-sbt-1.9.9"
49+
}
50+
}
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)