Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ jobs:

- name: Make target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
run: mkdir -p modules/skunk/js/target modules/sql-core/.js/target modules/circe/.jvm/target modules/generic/.jvm/target modules/doobie-pg/target unidocs/target modules/core/.native/target modules/skunk/jvm/target modules/core/.js/target modules/doobie-core/target modules/circe/.js/target modules/skunk/native/target modules/generic/.js/target modules/doobie-oracle/target modules/sql-core/.jvm/target modules/core/.jvm/target modules/sql-pg/native/target modules/doobie-mssql/target modules/sql-pg/js/target modules/circe/.native/target modules/generic/.native/target modules/sql-pg/jvm/target modules/sql-core/.native/target project/target
run: mkdir -p modules/skunk/js/target modules/sql-core/.js/target modules/circe/.jvm/target modules/generic/.jvm/target modules/doobie-mysql/target modules/doobie-pg/target unidocs/target modules/core/.native/target modules/skunk/jvm/target modules/core/.js/target modules/doobie-core/target modules/circe/.js/target modules/skunk/native/target modules/generic/.js/target modules/doobie-oracle/target modules/sql-core/.jvm/target modules/core/.jvm/target modules/sql-pg/native/target modules/doobie-mssql/target modules/sql-pg/js/target modules/doobie-sqlite/target modules/circe/.native/target modules/generic/.native/target modules/sql-pg/jvm/target modules/doobie-mariadb/target modules/sql-core/.native/target project/target

- name: Compress target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
run: tar cf targets.tar modules/skunk/js/target modules/sql-core/.js/target modules/circe/.jvm/target modules/generic/.jvm/target modules/doobie-pg/target unidocs/target modules/core/.native/target modules/skunk/jvm/target modules/core/.js/target modules/doobie-core/target modules/circe/.js/target modules/skunk/native/target modules/generic/.js/target modules/doobie-oracle/target modules/sql-core/.jvm/target modules/core/.jvm/target modules/sql-pg/native/target modules/doobie-mssql/target modules/sql-pg/js/target modules/circe/.native/target modules/generic/.native/target modules/sql-pg/jvm/target modules/sql-core/.native/target project/target
run: tar cf targets.tar modules/skunk/js/target modules/sql-core/.js/target modules/circe/.jvm/target modules/generic/.jvm/target modules/doobie-mysql/target modules/doobie-pg/target unidocs/target modules/core/.native/target modules/skunk/jvm/target modules/core/.js/target modules/doobie-core/target modules/circe/.js/target modules/skunk/native/target modules/generic/.js/target modules/doobie-oracle/target modules/sql-core/.jvm/target modules/core/.jvm/target modules/sql-pg/native/target modules/doobie-mssql/target modules/sql-pg/js/target modules/doobie-sqlite/target modules/circe/.native/target modules/generic/.native/target modules/sql-pg/jvm/target modules/doobie-mariadb/target modules/sql-core/.native/target project/target

- name: Upload target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
Expand Down
91 changes: 90 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@ val kindProjectorVersion = "0.13.4"
val literallyVersion = "1.2.0"
val logbackVersion = "1.5.37"
val log4catsVersion = "2.8.0"
val mariadbDriverVersion = "3.5.9"
val mssqlDriverVersion = "13.4.0.jre11"
val munitVersion = "1.3.3"
val munitCatsEffectVersion = "2.2.0"
val munitScalaCheckVersion = "1.3.0"
val mysqlDriverVersion = "9.3.0"
val oracleDriverVersion = "23.26.2.0.0"
val postgresVersion = "42.7.13"
val skunkVersion = "1.0.0"
val sqliteDriverVersion = "3.53.2.0"
val shapeless2Version = "2.3.13"
val shapeless3Version = "3.6.0"
val sourcePosVersion = "1.2.0"
Expand All @@ -36,7 +39,7 @@ ThisBuild / scalaVersion := Scala2
ThisBuild / crossScalaVersions := Seq(Scala2, Scala3)
ThisBuild / tlJdkRelease := Some(11)

ThisBuild / tlBaseVersion := "0.29"
ThisBuild / tlBaseVersion := "0.30"
ThisBuild / startYear := Some(2019)
ThisBuild / licenses := Seq(License.Apache2)
ThisBuild / developers := List(
Expand Down Expand Up @@ -171,6 +174,13 @@ lazy val nativeSettings = Seq(
)
)

// Pin the forked test JVM to UTC: mssql-jdbc binds a zone-naive java.sql.Timestamp using the
// ambient JVM zone, so MSSQL datetime tests fail off-UTC unless pinned. Only meaningful where
// Test / fork := true.
lazy val utcTestSettings = Seq(
Test / javaOptions += "-Duser.timezone=UTC"
)

lazy val modules: List[CompositeProject] = List(
core,
circe,
Expand All @@ -180,6 +190,9 @@ lazy val modules: List[CompositeProject] = List(
doobiepg,
doobieoracle,
doobiemssql,
doobiemysql,
doobiemariadb,
doobiesqlite,
skunk,
generic,
docs,
Expand Down Expand Up @@ -272,6 +285,7 @@ lazy val doobiecore = project
.disablePlugins(RevolverPlugin)
.dependsOn(sqlcore.jvm % "test->test;compile->compile", circe.jvm)
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-core",
Test / fork := true,
Expand All @@ -291,6 +305,7 @@ lazy val doobiepg = project
doobiecore % "test->test;compile->compile",
sqlpg.jvm % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-pg",
Test / fork := true,
Expand All @@ -310,6 +325,7 @@ lazy val doobieoracle = project
.disablePlugins(RevolverPlugin)
.dependsOn(doobiecore % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-oracle",
Test / fork := true,
Expand All @@ -327,6 +343,7 @@ lazy val doobiemssql = project
.disablePlugins(RevolverPlugin)
.dependsOn(doobiecore % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-mssql",
Test / fork := true,
Expand All @@ -338,6 +355,74 @@ lazy val doobiemssql = project
)
)

lazy val doobiemysql = project
.in(file("modules/doobie-mysql"))
.enablePlugins(AutomateHeaderPlugin)
.disablePlugins(RevolverPlugin)
.dependsOn(doobiecore % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-mysql",
Test / fork := true,
Test / parallelExecution := false,
Test / testOptions += Tests
.Setup(_ => runDocker("docker compose up -d --wait --quiet-pull mysql")),
libraryDependencies ++= Seq(
"com.mysql" % "mysql-connector-j" % mysqlDriverVersion
)
)

lazy val doobiemariadb = project
.in(file("modules/doobie-mariadb"))
.enablePlugins(AutomateHeaderPlugin)
.disablePlugins(RevolverPlugin)
.dependsOn(doobiecore % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-mariadb",
Test / fork := true,
Test / parallelExecution := false,
Test / testOptions += Tests
.Setup(_ => runDocker("docker compose up -d --wait --quiet-pull mariadb")),
libraryDependencies ++= Seq(
"org.mariadb.jdbc" % "mariadb-java-client" % mariadbDriverVersion
)
)

lazy val doobiesqlite = project
.in(file("modules/doobie-sqlite"))
.enablePlugins(AutomateHeaderPlugin)
.disablePlugins(RevolverPlugin)
.dependsOn(doobiecore % "test->test;compile->compile")
.settings(commonSettings)
.settings(utcTestSettings)
.settings(
name := "grackle-doobie-sqlite",
Test / fork := true,
Test / parallelExecution := false,
// SQLite has no docker service: unlike Oracle/MSSQL, whose containers auto-run the seed SQL
// mounted from testdata/<db>/, the test harness loads and executes testdata/sqlite/*.sql
// itself against a fresh temp database file per suite. Pass the directory as a system property
// (fork'd tests don't share the build's working directory) rather than relying on a relative
// path guess.
Test / javaOptions += s"-Dgrackle.sqlite.testdata=${(ThisBuild / baseDirectory).value / "testdata" / "sqlite"}",
// sqlite-jdbc's native cleanup on Connection#close touches JNI from what recent JDKs treat as
// a restricted context; without this the forked test JVM logs "restricted method" warnings and
// native handle teardown can throw spuriously. The flag only exists on JDK 17+ (JEP 412) -
// older JVMs, such as CI's temurin@11, refuse to start when given it (the forked JVM inherits
// the JDK sbt runs on), so it has to be supplied conditionally.
Test / javaOptions ++= {
if (sys.props("java.specification.version").toDouble >= 17)
Seq("--enable-native-access=ALL-UNNAMED")
else Nil
},
libraryDependencies ++= Seq(
"org.xerial" % "sqlite-jdbc" % sqliteDriverVersion
)
)

lazy val skunk = crossProject(JVMPlatform, JSPlatform, NativePlatform)
.crossType(CrossType.Full)
.in(file("modules/skunk"))
Expand All @@ -354,6 +439,7 @@ lazy val skunk = crossProject(JVMPlatform, JSPlatform, NativePlatform)
"org.typelevel" %% "log4cats-core" % log4catsVersion
)
)
.jvmSettings(utcTestSettings)
.jvmSettings(
Test / fork := true,
Test / testOptions += Tests.Setup(_ =>
Expand Down Expand Up @@ -486,6 +572,9 @@ lazy val unidocs = project
doobiepg,
doobieoracle,
doobiemssql,
doobiemysql,
doobiemariadb,
doobiesqlite,
skunk.jvm,
generic.jvm
)
Expand Down
54 changes: 54 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,57 @@ services:
retries: 10
start_period: 5s
start_interval: 5s

mysql:
# Defaults to the current LTS. The backend's documented floor is MySQL 8.0.14 (the first
# release with LATERAL); override to re-verify it, e.g.
# `MYSQL_VERSION=8.0.14 sbt doobiemysql/test` - green on 8.0.14, 8.0.46 and 8.4.
image: mysql:${MYSQL_VERSION:-8.4}
# initdb.d loads fixtures through the mysql CLI whose handshake may request latin1; force
# utf8mb4 for every session so fixture content can never be double-encoded.
# (--skip-character-set-client-handshake, the older way to pin this server-side, was
# removed in MySQL 8.3+; entrypoint.sh pins the client default instead - see its header
# comment for why that can't just be a bind-mounted conf.d file.)
command: ["--character-set-server=utf8mb4"]
entrypoint: ["/bin/bash", "/container-entrypoint-initdb.d/entrypoint.sh"]
ports:
- "3306:3306"
environment:
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=test
volumes:
- ./testdata/mysql/:/docker-entrypoint-initdb.d/
- ./modules/doobie-mysql/src/test/resources/scripts/:/container-entrypoint-initdb.d/
healthcheck:
# mysqladmin ping answers during the image's temporary init server phase too; a real
# TCP query against the test schema only succeeds once init (and initdb.d) finished.
test: ["CMD-SHELL", "mysql -h127.0.0.1 -utest -ptest -e 'SELECT 1' test"]
interval: 5s
timeout: 5s
retries: 20

mariadb:
# The official image's `lts` tag always tracks MariaDB's current long-term-support
# release, so no version number needs to be pinned or re-pinned later. Override to test a
# specific version, e.g. `MARIADB_VERSION=11.4 sbt doobiemariadb/test`.
image: mariadb:${MARIADB_VERSION:-lts}
ports:
- "3307:3306"
environment:
- MARIADB_DATABASE=test
- MARIADB_USER=test
- MARIADB_PASSWORD=test
- MARIADB_ROOT_PASSWORD=test
volumes:
# Reuses the MySQL backend's fixtures unchanged - verified by inspection to be plain
# standard SQL (CREATE TABLE/INSERT, nothing MySQL-8-exclusive). Do NOT copy this to a
# testdata/mariadb/ directory; if Task 3 finds a real incompatibility, fork only the one
# file that needs to differ and note it in the report.
- ./testdata/mysql/:/docker-entrypoint-initdb.d/
healthcheck:
test: ["CMD-SHELL", "mariadb-admin ping -h127.0.0.1 -utest -ptest --silent"]
interval: 5s
timeout: 5s
retries: 20
3 changes: 1 addition & 2 deletions modules/doobie-core/src/test/scala/DoobieDatabaseSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@ package grackle.doobie.test
import java.time.Duration

import io.circe.{Decoder => CDecoder, Encoder => CEncoder}
import munit.CatsEffectSuite
import org.typelevel.doobie.Meta

import grackle.doobie.DoobieMappingLike
import grackle.sql.test._

trait DoobieDatabaseSuite extends CatsEffectSuite {
trait DoobieDatabaseSuite extends SqlDatabaseSuite {
trait DoobieTestMapping[F[_]] extends DoobieMappingLike[F] with SqlTestMapping[F] {

type TestCodec[T] = (Meta[T], Boolean)
Expand Down
Loading
Loading