11import sbt .util
22import scoverage .ScoverageKeys ._
3+ import sbtdynver .DynVerPlugin .autoImport ._
34
45import scala .collection .Seq
56// ===== GLOBAL BUILD SETTINGS =====
67ThisBuild / organization := " com.flowforge"
78
8- ThisBuild / version := " 0.1.0-SNAPSHOT"
9+ // Versioning: derive from git tags via sbt-dynver (v0.8.1 -> 0.8.1)
10+ ThisBuild / versionScheme := Some (" early-semver" )
11+ ThisBuild / dynverVTagPrefix := true
12+ ThisBuild / dynverSeparator := " -"
13+ ThisBuild / dynverSonatypeSnapshots := true
914// Default Scala stays 2.13 for most modules; Spark/Deequ modules are handled pragmatically via deps.
1015ThisBuild / scalaVersion := Dependencies .Versions .scala213
1116// Cross-compile defaults: build-level + commands iterate over Scala 2.13 and 3 for speed and stability.
@@ -131,6 +136,15 @@ def moduleProject(name: String): Project =
131136 libraryDependencies ++= Dependencies .common,
132137 )
133138
139+ // Binary compatibility: previous version can be supplied via env MIMA_PREVIOUS_VERSION
140+ def mimaSettings (module : String ): Seq [Setting [_]] =
141+ Seq (
142+ mimaPreviousArtifacts := sys.env
143+ .get(" MIMA_PREVIOUS_VERSION" )
144+ .map(v => Set (organization.value %% s " flowforge- $module" % v))
145+ .getOrElse(Set .empty),
146+ )
147+
134148// ===== ROOT PROJECT =====
135149lazy val root = (project in file(" ." ))
136150 .aggregate(
@@ -170,6 +184,7 @@ lazy val infrastructure = moduleProject("infrastructure")
170184 " com.flowforge.infrastructure.DistributedTracing" ,
171185 ).mkString(" ;" ),
172186 )
187+ .settings(mimaSettings(" infrastructure" ): _* )
173188
174189// ===== CORE MODULES =====
175190lazy val core = moduleProject(" core" )
@@ -225,6 +240,7 @@ lazy val core = moduleProject("core")
225240 }
226241 },
227242 )
243+ .settings(mimaSettings(" core" ): _* )
228244
229245lazy val contracts = moduleProject(" contracts" )
230246 .dependsOn(core)
@@ -236,6 +252,7 @@ lazy val contracts = moduleProject("contracts")
236252 coverageMinimumBranchTotal := 85 ,
237253 coverageFailOnMinimum := enforceCoverageThreshold,
238254 )
255+ .settings(mimaSettings(" contracts" ): _* )
239256
240257// Sample "contract SDK" to demonstrate typed endpoints without local codegen
241258
@@ -253,13 +270,15 @@ lazy val connectors = moduleProject("connectors")
253270 " .*CloudStorageConnector.scala" ,
254271 ).mkString(" ;" ),
255272 )
273+ .settings(mimaSettings(" connectors" ): _* )
256274
257275lazy val connectorsGcs = moduleProject(" connectors-gcs" )
258276 .dependsOn(connectors)
259277 .settings(
260278 description := " Google Cloud Storage connector" ,
261279 libraryDependencies ++= Dependencies .forModule(" connectors-gcs" ),
262280 )
281+ .settings(mimaSettings(" connectors-gcs" ): _* )
263282
264283lazy val connectorsJdbc = moduleProject(" connectors-jdbc" )
265284 .dependsOn(core, connectors, enginesSpark % " test->compile" )
@@ -268,6 +287,7 @@ lazy val connectorsJdbc = moduleProject("connectors-jdbc")
268287 libraryDependencies ++= Dependencies .forModule(" connectors-jdbc" ),
269288 Test / fork := true ,
270289 )
290+ .settings(mimaSettings(" connectors-jdbc" ): _* )
271291
272292// ===== ENGINE MODULES =====
273293
@@ -277,6 +297,7 @@ lazy val enginesSpark = moduleProject("engines-spark")
277297 description := " Apache Spark execution engine" ,
278298 libraryDependencies ++= Dependencies .forModule(" engines-spark" ),
279299 )
300+ .settings(mimaSettings(" engines-spark" ): _* )
280301
281302// typed-spark merged into engines-spark under com.flowforge.engines.spark.typed
282303
@@ -288,6 +309,7 @@ lazy val enginesFlink = moduleProject("engines-flink")
288309 crossScalaVersions := Seq (Dependencies .Versions .scala212),
289310 libraryDependencies ++= Dependencies .forModule(" engines-flink" ),
290311 )
312+ .settings(mimaSettings(" engines-flink" ): _* )
291313
292314// ===== QUALITY MODULES =====
293315// Removed empty quality module shell per v1.0-2 plan requirements
@@ -310,6 +332,7 @@ lazy val qualityDeequ = moduleProject("quality-deequ")
310332 // Make it runnable for ffCheck command
311333 Compile / mainClass := Some (" com.flowforge.quality.deequ.ContractToDeltaExample" ),
312334 )
335+ .settings(mimaSettings(" quality-deequ" ): _* )
313336
314337// ===== SUPPORT MODULES =====
315338
@@ -477,6 +500,7 @@ lazy val contractsSdk = moduleProject("contracts-sdk")
477500 generated
478501 }.taskValue,
479502 )
503+ .settings(mimaSettings(" contracts-sdk" ): _* )
480504// Experimental Scala 3 module for capture checking demos (opt-in)
481505lazy val experimental = moduleProject(" experimental" )
482506 .settings(
0 commit comments