diff --git a/.mill-version b/.mill-version index 511144623..edda4c06b 100644 --- a/.mill-version +++ b/.mill-version @@ -1 +1,2 @@ -0.10.12 \ No newline at end of file +0.11.0 + diff --git a/build.sc b/build.sc index c4b736414..530310bc3 100644 --- a/build.sc +++ b/build.sc @@ -1,6 +1,6 @@ // plugins -import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.3.0` -import $ivy.`com.github.lolgab::mill-mima::0.0.13` +import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0` +import $ivy.`com.github.lolgab::mill-mima::0.0.23` // imports import mill._ @@ -9,8 +9,7 @@ import mill.scalalib._ import mill.scalalib.publish._ import mill.scalajslib._ import mill.scalanativelib._ -import mill.modules._ -import mill.scalalib.api.Util.isScala3 +import mill.scalalib.api.ZincWorkerUtil.isScala3 import mill.scalanativelib.api.{LTO, ReleaseMode} import de.tobiasroeser.mill.vcs.version.VcsVersion import com.github.lolgab.mill.mima._ @@ -19,7 +18,6 @@ val scala212 = "2.12.17" val scala213 = "2.13.10" val scala3 = "3.2.2" -val scalaJS = "1.13.0" val scalaNative = "0.4.10" val acyclic = "0.3.6" val sourcecode = "0.3.0" @@ -27,21 +25,14 @@ val sourcecode = "0.3.0" val dottyCustomVersion = Option(sys.props("dottyVersion")) val scala2JVMVersions = Seq(scala212, scala213) -val scalaJVMVersions = scala2JVMVersions ++ Seq(scala3) ++ dottyCustomVersion +val scalaVersions = scala2JVMVersions ++ Seq(scala3) ++ dottyCustomVersion -val scalaJSVersions = scalaJVMVersions.map((_, scalaJS)) -val scalaNativeVersions = scalaJVMVersions.map((_, scalaNative)) +trait CommonPlatformModule extends ScalaModule with PlatformScalaModule{ -trait CommonBaseModule extends ScalaModule { - def platformSegment: String - - def sources = T.sources{ + def sources = T.sources { super.sources() ++ - Seq(PathRef(millSourcePath / s"src-$platformSegment")) ++ - (if (scalaVersion() != scala212) { - Seq(PathRef(millSourcePath / "src-2.13+")) - } else Seq()) ++ - (platformSegment match { + Option.when(scalaVersion() != scala212)(PathRef(millSourcePath / "src-2.13+")) ++ + (platformScalaSuffix match { case "jvm" => Seq(PathRef(millSourcePath / "src-jvm-native")) case "native" => Seq(PathRef(millSourcePath / "src-js-native"), PathRef(millSourcePath / "src-jvm-native")) case "js" => Seq(PathRef(millSourcePath / "src-js-native")) @@ -49,21 +40,8 @@ trait CommonBaseModule extends ScalaModule { } } -trait CommonModule extends CommonBaseModule { - def scalacOptions = T{ - super.scalacOptions() ++ { - if (scalaVersion() == scala212) Seq("-opt:l:method") else Nil - } ++ Seq( - "-unchecked", - "-deprecation", - "-encoding", "utf8", - "-feature", - "-Xfatal-warnings" - ) - } -} - -trait CommonPublishModule extends CommonModule with PublishModule with Mima with CrossScalaModule { +trait CommonPublishModule + extends ScalaModule with PublishModule with Mima with CrossScalaModule { outer => def publishVersion = VcsVersion.vcsState().format() def mimaPreviousVersions = Seq("3.0.0") @@ -82,63 +60,54 @@ trait CommonPublishModule extends CommonModule with PublishModule with Mima with def publishProperties: Target[Map[String, String]] = super.publishProperties() ++ Map( "info.releaseNotesURL" -> "https://com-lihaoyi.github.io/upickle/#VersionHistory" ) + def versionScheme: T[Option[VersionScheme]] = T(Some(VersionScheme.SemVerSpec)) - def templates = T.sources(millSourcePath / "templates", millSourcePath / s"templates-$platformSegment") + + def templates = T.sources { + for(src <- sources()) yield{ + val s"src$rest" = src.path.last + PathRef(src.path / os.up / s"templates$rest") + } + } def generatedSources = T{ for{ pathRef <- templates() p <- if (os.exists(pathRef.path)) os.list(pathRef.path) else Nil rename <- Seq("Char", "Byte") }{ - os.write( - T.dest / p.last.replace("Elem", rename).replace("elem", rename.toLowerCase), - os.read(p).replace("Elem", rename).replace("elem", rename.toLowerCase) - ) + def replace(s: String) = s.replace("Elem", rename).replace("elem", rename.toLowerCase) + os.write(T.dest / replace(p.last), replace(os.read(p))) } + Seq(PathRef(T.dest)) } - def docJar = { - if (isScala3(crossScalaVersion)) T { - val outDir = T.ctx().dest - val javadocDir = outDir / "javadoc" - os.makeDir.all(javadocDir) - mill.modules.Jvm.createJar(Agg(javadocDir))(outDir) - } else { - super.docJar - } + + def scalacOptions = T { + Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-feature", "-Xfatal-warnings") ++ + Agg.when(!isScala3(scalaVersion()))("-opt:l:method").toSeq } -} -trait CommonTestModule extends CommonBaseModule with TestModule.Utest{ - def ivyDeps = Agg(ivy"com.lihaoyi::utest::0.8.1") ++ ( - if (isScala3(scalaVersion())) Agg.empty[mill.scalalib.Dep] - else Agg(ivy"com.lihaoyi:::acyclic:$acyclic") - ) - def docJar = T { - val outDir = T.ctx().dest - val javadocDir = outDir / "javadoc" - os.makeDir.all(javadocDir) - mill.modules.Jvm.createJar(Agg(javadocDir))(outDir) + trait CommonTestModule0 extends ScalaModule with TestModule.Utest { + def ivyDeps = { + Agg(ivy"com.lihaoyi::utest::0.8.1") ++ + Option.when(!isScala3(scalaVersion()))(ivy"com.lihaoyi:::acyclic:$acyclic") + } + + def scalacOptions = super.scalacOptions() ++ + Agg.when(isScala3(scalaVersion())) ( + "-Ximplicit-search-limit", + "200000" + ) } - def scalacOptions = super.scalacOptions() ++ - (if (isScala3(scalaVersion())) Seq( - "-Ximplicit-search-limit", - "200000" - ) else Seq.empty[String]) } -trait CommonJvmModule extends CommonPublishModule{ - def platformSegment = "jvm" - def millSourcePath = super.millSourcePath / os.up - trait Tests extends super.Tests with CommonTestModule{ - def platformSegment = "jvm" - } +trait CommonJvmModule extends CommonPublishModule with CommonPlatformModule{ + trait CommonTestModule extends ScalaTests with CommonTestModule0 } -trait CommonJsModule extends CommonPublishModule with ScalaJSModule{ - def platformSegment = "js" - def crossScalaJSVersion: String - def scalaJSVersion = crossScalaJSVersion - + +trait CommonJsModule extends CommonPublishModule with ScalaJSModule with CommonPlatformModule { + def scalaJSVersion = "1.13.0" + private def sourceMapOptions = T.task { val vcsState = VcsVersion.vcsState() vcsState.lastTag.collect { @@ -148,209 +117,82 @@ trait CommonJsModule extends CommonPublishModule with ScalaJSModule{ s"$sourcesOptionName:${T.workspace.toIO.toURI}->$baseUrl/$tag/" } } - def scalacOptions = super.scalacOptions() ++ sourceMapOptions() - - def millSourcePath = super.millSourcePath / os.up / os.up - trait Tests extends super.Tests with CommonTestModule{ - def platformSegment = "js" - def scalaJSVersion = crossScalaJSVersion - } -} - -trait CommonNativeModule extends CommonPublishModule with ScalaNativeModule{ - def platformSegment = "native" - def crossScalaNativeVersion: String - def scalaNativeVersion = crossScalaNativeVersion - def millSourcePath = super.millSourcePath / os.up / os.up - trait Tests extends super.Tests with CommonTestModule{ - def platformSegment = "native" - def scalaNativeVersion = crossScalaNativeVersion - } -} - -trait CommonCoreModule extends CommonPublishModule { - def artifactName = "upickle-core" - def ivyDeps = Agg(ivy"com.lihaoyi::geny::1.0.0") -} -object core extends Module { - object js extends Cross[CoreJsModule](scalaJSVersions:_*) - class CoreJsModule(val crossScalaVersion: String, val crossScalaJSVersion: String) extends CommonJsModule with CommonCoreModule{ - object test extends Tests - } - - object jvm extends Cross[CoreJvmModule](scalaJVMVersions:_*) - class CoreJvmModule(val crossScalaVersion: String) extends CommonJvmModule with CommonCoreModule{ - object test extends Tests - } + def scalacOptions = super.scalacOptions() ++ sourceMapOptions() - object native extends Cross[CoreNativeModule](scalaNativeVersions:_*) - class CoreNativeModule(val crossScalaVersion: String, val crossScalaNativeVersion: String) extends CommonNativeModule with CommonCoreModule{ - object test extends Tests - } + trait CommonTestModule extends ScalaJSTests with CommonTestModule0 } -object implicits extends Module { - - trait ImplicitsModule extends CommonPublishModule{ - def compileIvyDeps = if (!isDotty) Agg( - ivy"com.lihaoyi:::acyclic:$acyclic", - ivy"org.scala-lang:scala-reflect:${scalaVersion()}" - ) - else Agg.empty[Dep] - def generatedSources = T{ - val dir = T.ctx().dest - val file = dir / "upickle" / "Generated.scala" - os.makeDir(dir / "upickle") - val tuples = (1 to 22).map{ i => - def commaSeparated(s: Int => String) = (1 to i).map(s).mkString(", ") - val writerTypes = commaSeparated(j => s"T$j: Writer") - val readerTypes = commaSeparated(j => s"T$j: Reader") - val typeTuple = commaSeparated(j => s"T$j") - val implicitWriterTuple = commaSeparated(j => s"implicitly[Writer[T$j]]") - val implicitReaderTuple = commaSeparated(j => s"implicitly[Reader[T$j]]") - val lookupTuple = commaSeparated(j => s"x(${j-1})") - val fieldTuple = commaSeparated(j => s"x._$j") - s""" - implicit def Tuple${i}Writer[$writerTypes]: TupleNWriter[Tuple$i[$typeTuple]] = - new TupleNWriter[Tuple$i[$typeTuple]](Array($implicitWriterTuple), x => if (x == null) null else Array($fieldTuple)) - implicit def Tuple${i}Reader[$readerTypes]: TupleNReader[Tuple$i[$typeTuple]] = - new TupleNReader(Array($implicitReaderTuple), x => Tuple$i($lookupTuple).asInstanceOf[Tuple$i[$typeTuple]]) - """ - } - - os.write(file, s""" - package upickle.implicits - /** - * Auto-generated picklers and unpicklers, used for creating the 22 - * versions of tuple-picklers and case-class picklers - */ - trait Generated extends TupleReadWriters{ - ${tuples.mkString("\n")} - } - """) - Seq(PathRef(dir)) - } - - } - object js extends Cross[JsModule](scalaJSVersions:_*) - - class JsModule(val crossScalaVersion: String, val crossScalaJSVersion: String) extends ImplicitsModule with CommonJsModule{ - def moduleDeps = Seq(core.js(crossScalaVersion, crossScalaJSVersion)) - def artifactName = "upickle-implicits" - - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq( - ujson.js(crossScalaVersion, crossScalaJSVersion).test, - core.js(crossScalaVersion, crossScalaJSVersion).test - ) - } - } - - object jvm extends Cross[JvmModule](scalaJVMVersions:_*) - class JvmModule(val crossScalaVersion: String) extends ImplicitsModule with CommonJvmModule{ - def moduleDeps = Seq(core.jvm()) - def artifactName = "upickle-implicits" - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq(ujson.jvm().test, core.jvm().test) - } - } - - object native extends Cross[NativeModule](scalaNativeVersions:_*) +trait CommonNativeModule extends CommonPublishModule with ScalaNativeModule with CommonPlatformModule { + def scalaNativeVersion = "0.4.10" - class NativeModule(val crossScalaVersion: String, val crossScalaNativeVersion: String) extends ImplicitsModule with CommonNativeModule{ - def moduleDeps = Seq(core.native(crossScalaVersion, crossScalaNativeVersion)) - def artifactName = "upickle-implicits" - - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq(core.native(crossScalaVersion, crossScalaNativeVersion).test) - } - } + trait CommonTestModule extends ScalaNativeTests with CommonTestModule0 } object upack extends Module { + object js extends Cross[JsModule](scalaVersions) + trait JsModule extends CommonJsModule { + def moduleDeps = Seq(upickle.core.js()) - object js extends Cross[JsModule](scalaJSVersions:_*) - - class JsModule(val crossScalaVersion: String, val crossScalaJSVersion: String) extends CommonJsModule { - def moduleDeps = Seq(core.js(crossScalaVersion, crossScalaJSVersion)) - def artifactName = "upack" - - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq( - ujson.js(crossScalaVersion, crossScalaJSVersion).test, - core.js(crossScalaVersion, crossScalaJSVersion).test - ) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.js().test, upickle.core.js().test) } } - object jvm extends Cross[JvmModule](scalaJVMVersions:_*) - class JvmModule(val crossScalaVersion: String) extends CommonJvmModule { - def moduleDeps = Seq(core.jvm()) - def artifactName = "upack" - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq(ujson.jvm().test, core.jvm().test) + object jvm extends Cross[JvmModule](scalaVersions) + trait JvmModule extends CommonJvmModule { + def moduleDeps = Seq(upickle.core.jvm()) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.jvm().test, upickle.core.jvm().test) } } - object native extends Cross[NativeModule](scalaNativeVersions:_*) - - class NativeModule(val crossScalaVersion: String, val crossScalaNativeVersion: String) extends CommonNativeModule { - def moduleDeps = Seq(core.native(crossScalaVersion, crossScalaNativeVersion)) - def artifactName = "upack" + object native extends Cross[NativeModule](scalaVersions) + trait NativeModule extends CommonNativeModule { + def moduleDeps = Seq(upickle.core.native()) - object test extends Tests { - def moduleDeps = super.moduleDeps ++ Seq( - ujson.native(crossScalaVersion, crossScalaNativeVersion).test, - core.native(crossScalaVersion, crossScalaNativeVersion).test - ) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.native().test, upickle.core.native().test) } } } - object ujson extends Module{ - trait JsonModule extends CommonPublishModule{ - def artifactName = "ujson" - } + object js extends Cross[JsModule](scalaVersions) + trait JsModule extends CommonJsModule { + def moduleDeps = Seq(upickle.core.js()) - object js extends Cross[JsModule](scalaJSVersions:_*) - class JsModule(val crossScalaVersion: String, val crossScalaJSVersion: String) extends JsonModule with CommonJsModule{ - def moduleDeps = Seq(core.js(crossScalaVersion, crossScalaJSVersion)) - - object test extends Tests with CommonTestModule{ - def moduleDeps = super.moduleDeps ++ Seq(core.js(crossScalaVersion, crossScalaJSVersion).test) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(upickle.core.js().test) } } - object jvm extends Cross[JvmModule](scalaJVMVersions:_*) - class JvmModule(val crossScalaVersion: String) extends JsonModule with CommonJvmModule{ - def moduleDeps = Seq(core.jvm()) - object test extends Tests with CommonTestModule{ - def moduleDeps = super.moduleDeps ++ Seq(core.jvm().test) + object jvm extends Cross[JvmModule](scalaVersions) + trait JvmModule extends CommonJvmModule{ + def moduleDeps = Seq(upickle.core.jvm()) + + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(upickle.core.jvm().test) } } - object native extends Cross[NativeModule](scalaNativeVersions:_*) - class NativeModule(val crossScalaVersion: String, val crossScalaNativeVersion: String) extends JsonModule with CommonNativeModule{ - def moduleDeps = Seq(core.native(crossScalaVersion, crossScalaNativeVersion)) + object native extends Cross[NativeModule](scalaVersions) + trait NativeModule extends CommonNativeModule { + def moduleDeps = Seq(upickle.core.native()) - object test extends Tests with CommonTestModule{ - def moduleDeps = super.moduleDeps ++ Seq(core.native(crossScalaVersion, crossScalaNativeVersion).test) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(upickle.core.native().test) } } - object argonaut extends Cross[ArgonautModule](scala2JVMVersions:_*) - class ArgonautModule(val crossScalaVersion: String) extends CommonPublishModule{ - def artifactName = "ujson-argonaut" - def platformSegment = "jvm" + object argonaut extends Cross[ArgonautModule](scala2JVMVersions) + trait ArgonautModule extends CommonPublishModule{ def moduleDeps = Seq(ujson.jvm()) def ivyDeps = Agg(ivy"io.argonaut::argonaut:6.2.6") } - object json4s extends Cross[Json4sModule](scalaJVMVersions:_*) - class Json4sModule(val crossScalaVersion: String) extends CommonPublishModule{ - def artifactName = "ujson-json4s" - def platformSegment = "jvm" + + object json4s extends Cross[Json4sModule](scalaVersions) + trait Json4sModule extends CommonPublishModule{ def moduleDeps = Seq(ujson.jvm()) def ivyDeps = Agg( ivy"org.json4s::json4s-ast:4.0.6", @@ -358,99 +200,171 @@ object ujson extends Module{ ) } - object circe extends Cross[CirceModule](scalaJVMVersions:_*) - class CirceModule(val crossScalaVersion: String) extends CommonPublishModule{ - def artifactName = "ujson-circe" - def platformSegment = "jvm" + object circe extends Cross[CirceModule](scalaVersions) + trait CirceModule extends CommonPublishModule{ def moduleDeps = Seq(ujson.jvm()) val circeVersion = "0.14.5" def ivyDeps = Agg(ivy"io.circe::circe-parser:$circeVersion") } - object play extends Cross[PlayModule](scala2JVMVersions:_*) - class PlayModule(val crossScalaVersion: String) extends CommonPublishModule{ - def artifactName = "ujson-play" - def platformSegment = "jvm" + object play extends Cross[PlayModule](scala2JVMVersions) + trait PlayModule extends CommonPublishModule{ def moduleDeps = Seq(ujson.jvm()) val playJsonVersion = "2.9.4" - def ivyDeps = Agg( - ivy"com.typesafe.play::play-json:$playJsonVersion" - ) + def ivyDeps = Agg(ivy"com.typesafe.play::play-json:$playJsonVersion") } } -trait UpickleModule extends CommonPublishModule{ - def artifactName = "upickle" - def compileIvyDeps = if (!isDotty) Agg( - ivy"com.lihaoyi:::acyclic:$acyclic", - ivy"org.scala-lang:scala-reflect:${scalaVersion()}", - ivy"org.scala-lang:scala-compiler:${scalaVersion()}" - ) - else Agg.empty[Dep] -} +object upickle extends Module{ + object core extends Module { + trait CommonCoreModule extends CommonPublishModule { + def ivyDeps = Agg(ivy"com.lihaoyi::geny::1.0.0") + } + object js extends Cross[CoreJsModule](scalaVersions) + trait CoreJsModule extends CommonJsModule with CommonCoreModule { + object test extends CommonTestModule + } -object upickle extends Module{ - object jvm extends Cross[JvmModule](scalaJVMVersions:_*) - class JvmModule(val crossScalaVersion: String) extends UpickleModule with CommonJvmModule{ - def moduleDeps = Seq(ujson.jvm(), upack.jvm(), implicits.jvm()) + object jvm extends Cross[CoreJvmModule](scalaVersions) + trait CoreJvmModule extends CommonJvmModule with CommonCoreModule{ + object test extends CommonTestModule + } + + object native extends Cross[CoreNativeModule](scalaVersions) + trait CoreNativeModule extends CommonNativeModule with CommonCoreModule { + object test extends CommonTestModule + } + } + + object implicits extends Module { + trait ImplicitsModule extends CommonPublishModule{ + def compileIvyDeps = T{ + Agg.when(!isDotty)( + ivy"com.lihaoyi:::acyclic:$acyclic", + ivy"org.scala-lang:scala-reflect:${scalaVersion()}" + ) + } - object test extends Tests with CommonBaseModule{ - def moduleDeps = { - (super.moduleDeps :+ core.jvm().test) ++ ( - if (isDotty) Nil else Seq( - ujson.argonaut(), - ujson.circe(), - ujson.json4s(), - ujson.play(), - )) + def generatedSources = T{ + val dir = T.ctx().dest + val file = dir / "upickle" / "Generated.scala" + os.makeDir(dir / "upickle") + val tuples = (1 to 22).map{ i => + def commaSeparated(s: Int => String) = (1 to i).map(s).mkString(", ") + val writerTypes = commaSeparated(j => s"T$j: Writer") + val readerTypes = commaSeparated(j => s"T$j: Reader") + val typeTuple = commaSeparated(j => s"T$j") + val implicitWriterTuple = commaSeparated(j => s"implicitly[Writer[T$j]]") + val implicitReaderTuple = commaSeparated(j => s"implicitly[Reader[T$j]]") + val lookupTuple = commaSeparated(j => s"x(${j-1})") + val fieldTuple = commaSeparated(j => s"x._$j") + s""" + implicit def Tuple${i}Writer[$writerTypes]: TupleNWriter[Tuple$i[$typeTuple]] = + new TupleNWriter[Tuple$i[$typeTuple]](Array($implicitWriterTuple), x => if (x == null) null else Array($fieldTuple)) + implicit def Tuple${i}Reader[$readerTypes]: TupleNReader[Tuple$i[$typeTuple]] = + new TupleNReader(Array($implicitReaderTuple), x => Tuple$i($lookupTuple).asInstanceOf[Tuple$i[$typeTuple]]) + """ + } + + os.write(file, s""" + package upickle.implicits + /** + * Auto-generated picklers and unpicklers, used for creating the 22 + * versions of tuple-picklers and case-class picklers + */ + trait Generated extends TupleReadWriters{ + ${tuples.mkString("\n")} + } + """) + Seq(PathRef(dir)) } + } + + object js extends Cross[JsModule](scalaVersions) + trait JsModule extends ImplicitsModule with CommonJsModule { + def moduleDeps = Seq(core.js()) - def scalacOptions = super.scalacOptions() ++ { - if (isDotty) Seq("-Ximport-suggestion-timeout", "0") - else Nil + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.js().test, core.js().test) } } - object testNonUtf8 extends Tests with CommonTestModule { - def forkArgs = T { - Seq("-Dfile.encoding=US-ASCII") + object jvm extends Cross[JvmModule](scalaVersions) + trait JvmModule extends ImplicitsModule with CommonJvmModule{ + def moduleDeps = Seq(core.jvm()) + + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.jvm().test, core.jvm().test) + } + } + + object native extends Cross[NativeModule](scalaVersions) + trait NativeModule extends ImplicitsModule with CommonNativeModule { + def moduleDeps = Seq(core.native()) + + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(ujson.native().test, core.native().test) } } - object testSlow extends Tests with CommonTestModule{ + } + + trait UpickleModule extends CommonPublishModule { + def compileIvyDeps = + Agg.when(!isDotty)( + ivy"com.lihaoyi:::acyclic:$acyclic", + ivy"org.scala-lang:scala-reflect:${scalaVersion()}", + ivy"org.scala-lang:scala-compiler:${scalaVersion()}" + ) + } + + object jvm extends Cross[JvmModule](scalaVersions) + trait JvmModule extends UpickleModule with CommonJvmModule{ + def moduleDeps = Seq(ujson.jvm(), upack.jvm(), implicits.jvm()) + + object test extends CommonTestModule{ + def moduleDeps = + super.moduleDeps ++ + Seq(core.jvm().test) ++ + ( + if (isDotty) Nil + else Seq(ujson.argonaut(), ujson.circe(), ujson.json4s(), ujson.play()) + ) + } + + object testNonUtf8 extends CommonTestModule { + def forkArgs = Seq("-Dfile.encoding=US-ASCII") + } + + object testSlow extends CommonTestModule{ def moduleDeps = super.moduleDeps ++ Seq(JvmModule.this.test) } } - object js extends Cross[JsModule](scalaJSVersions:_*) - class JsModule(val crossScalaVersion: String, val crossScalaJSVersion: String) extends UpickleModule with CommonJsModule { - def moduleDeps = Seq( - ujson.js(crossScalaVersion, crossScalaJSVersion), - upack.js(crossScalaVersion, crossScalaJSVersion), - implicits.js(crossScalaVersion, crossScalaJSVersion) - ) + object js extends Cross[JsModule](scalaVersions) + trait JsModule extends UpickleModule with CommonJsModule { + def moduleDeps = Seq(ujson.js(), upack.js(), implicits.js()) - object test extends Tests with CommonModule{ - def moduleDeps = super.moduleDeps ++ Seq(core.js(crossScalaVersion, crossScalaJSVersion).test) + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(core.js().test) } } - object native extends Cross[NativeModule](scalaNativeVersions:_*) - class NativeModule(val crossScalaVersion: String, val crossScalaNativeVersion: String) extends UpickleModule with CommonNativeModule { - def moduleDeps = Seq( - ujson.native(crossScalaVersion, crossScalaNativeVersion), - upack.native(crossScalaVersion, crossScalaNativeVersion), - implicits.native(crossScalaVersion, crossScalaNativeVersion) - ) - object test extends Tests with CommonTestModule{ - def moduleDeps = super.moduleDeps ++ Seq(core.native(crossScalaVersion, crossScalaNativeVersion).test) + + object native extends Cross[NativeModule](scalaVersions) + trait NativeModule extends UpickleModule with CommonNativeModule { + def moduleDeps = Seq(ujson.native(), upack.native(), implicits.native()) + + object test extends CommonTestModule{ + def moduleDeps = super.moduleDeps ++ Seq(core.native().test) def allSourceFiles = T(super.allSourceFiles().filter(_.path.last != "DurationsTests.scala")) } } } + def exampleJson = T.source(millSourcePath / "exampleJson") -trait BenchModule extends CommonModule{ + +trait BenchModule extends CommonPlatformModule{ def scalaVersion = scala213 - def millSourcePath = build.millSourcePath / "bench" def ivyDeps = Agg( ivy"io.circe::circe-core::0.14.5", ivy"io.circe::circe-generic::0.14.5", @@ -464,32 +378,17 @@ trait BenchModule extends CommonModule{ object bench extends Module { object js extends BenchModule with ScalaJSModule { - def scalaJSVersion = scalaJSVersions.last._2 - def platformSegment = "js" - def moduleDeps = Seq(upickle.js(scala213, scalaJS).test) - def run(args: String*) = T.command { - finalMainClassOpt() match{ - case Left(err) => mill.api.Result.Failure(err) - case Right(_) => - ScalaJSWorkerApi.scalaJSWorker().run( - scalaJSToolsClasspath().map(_.path), - jsEnvConfig(), - fullOpt().path.toIO - ) - mill.api.Result.Success(()) - } - } + def scalaJSVersion = "1.13.0" + def moduleDeps = Seq(upickle.js(scala213).test) } object jvm extends BenchModule { - def platformSegment = "jvm" def moduleDeps = Seq(upickle.jvm(scala213).test) } object native extends BenchModule with ScalaNativeModule { - def platformSegment = "native" def scalaNativeVersion = scalaNative - def moduleDeps = Seq(upickle.native(scala213, scalaNative).test) + def moduleDeps = Seq(upickle.native(scala213).test) def ivyDeps = Agg(ivy"com.lihaoyi::sourcecode::$sourcecode") def allSourceFiles = T(super.allSourceFiles().filter(_.path.last != "NonNative.scala")) def releaseMode = ReleaseMode.ReleaseFast diff --git a/mill b/mill index e616548f0..cb1ee32f7 100755 --- a/mill +++ b/mill @@ -3,13 +3,18 @@ # This is a wrapper script, that automatically download mill from GitHub release pages # You can give the required mill version with MILL_VERSION env variable # If no version is given, it falls back to the value of DEFAULT_MILL_VERSION -DEFAULT_MILL_VERSION=0.10.5 set -e +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then + DEFAULT_MILL_VERSION=0.11.0 +fi + if [ -z "$MILL_VERSION" ] ; then if [ -f ".mill-version" ] ; then MILL_VERSION="$(head -n 1 .mill-version 2> /dev/null)" + elif [ -f ".config/mill-version" ] ; then + MILL_VERSION="$(head -n 1 .config/mill-version 2> /dev/null)" elif [ -f "mill" ] && [ "$0" != "mill" ] ; then MILL_VERSION=$(grep -F "DEFAULT_MILL_VERSION=" "mill" | head -n 1 | cut -d= -f2) else @@ -35,7 +40,7 @@ if [ ! -s "$MILL_EXEC_PATH" ] ; then fi DOWNLOAD_FILE=$MILL_EXEC_PATH-tmp-download MILL_VERSION_TAG=$(echo $MILL_VERSION | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') - MILL_DOWNLOAD_URL="https://github.com/lihaoyi/mill/releases/download/${MILL_VERSION_TAG}/$MILL_VERSION${ASSEMBLY}" + MILL_DOWNLOAD_URL="https://repo1.maven.org/maven2/com/lihaoyi/mill-dist/$MILL_VERSION/mill-dist-$MILL_VERSION.jar" curl --fail -L -o "$DOWNLOAD_FILE" "$MILL_DOWNLOAD_URL" chmod +x "$DOWNLOAD_FILE" mv "$DOWNLOAD_FILE" "$MILL_EXEC_PATH" @@ -43,7 +48,18 @@ if [ ! -s "$MILL_EXEC_PATH" ] ; then unset MILL_DOWNLOAD_URL fi +if [ -z "$MILL_MAIN_CLI" ] ; then + MILL_MAIN_CLI="${0}" +fi + +MILL_FIRST_ARG="" +if [ "$1" = "--bsp" ] || [ "$1" = "-i" ] || [ "$1" = "--interactive" ] || [ "$1" = "--no-server" ] || [ "$1" = "--repl" ] || [ "$1" = "--help" ] ; then + # Need to preserve the first position of those listed options + MILL_FIRST_ARG=$1 + shift +fi + unset MILL_DOWNLOAD_PATH unset MILL_VERSION -exec $MILL_EXEC_PATH "$@" +exec $MILL_EXEC_PATH $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@" diff --git a/core/src-2.12/upickle/core/compat/LinkedHashMapCompat.scala b/upickle/core/src-2.12/upickle/core/compat/LinkedHashMapCompat.scala similarity index 100% rename from core/src-2.12/upickle/core/compat/LinkedHashMapCompat.scala rename to upickle/core/src-2.12/upickle/core/compat/LinkedHashMapCompat.scala diff --git a/core/src-2.12/upickle/core/compat/package.scala b/upickle/core/src-2.12/upickle/core/compat/package.scala similarity index 100% rename from core/src-2.12/upickle/core/compat/package.scala rename to upickle/core/src-2.12/upickle/core/compat/package.scala diff --git a/core/src-2.13+/upickle/core/LinkedHashMapCompat.scala b/upickle/core/src-2.13+/upickle/core/LinkedHashMapCompat.scala similarity index 100% rename from core/src-2.13+/upickle/core/LinkedHashMapCompat.scala rename to upickle/core/src-2.13+/upickle/core/LinkedHashMapCompat.scala diff --git a/core/src-2.13+/upickle/core/compat/package.scala b/upickle/core/src-2.13+/upickle/core/compat/package.scala similarity index 100% rename from core/src-2.13+/upickle/core/compat/package.scala rename to upickle/core/src-2.13+/upickle/core/compat/package.scala diff --git a/core/src/upickle/core/BufferingInputStreamParser.scala b/upickle/core/src/upickle/core/BufferingInputStreamParser.scala similarity index 100% rename from core/src/upickle/core/BufferingInputStreamParser.scala rename to upickle/core/src/upickle/core/BufferingInputStreamParser.scala diff --git a/core/src/upickle/core/ElemAppendC.scala b/upickle/core/src/upickle/core/ElemAppendC.scala similarity index 100% rename from core/src/upickle/core/ElemAppendC.scala rename to upickle/core/src/upickle/core/ElemAppendC.scala diff --git a/core/src/upickle/core/ElemOps.scala b/upickle/core/src/upickle/core/ElemOps.scala similarity index 100% rename from core/src/upickle/core/ElemOps.scala rename to upickle/core/src/upickle/core/ElemOps.scala diff --git a/core/src/upickle/core/LinkedHashMap.scala b/upickle/core/src/upickle/core/LinkedHashMap.scala similarity index 100% rename from core/src/upickle/core/LinkedHashMap.scala rename to upickle/core/src/upickle/core/LinkedHashMap.scala diff --git a/core/src/upickle/core/LogVisitor.scala b/upickle/core/src/upickle/core/LogVisitor.scala similarity index 100% rename from core/src/upickle/core/LogVisitor.scala rename to upickle/core/src/upickle/core/LogVisitor.scala diff --git a/core/src/upickle/core/NoOpVisitor.scala b/upickle/core/src/upickle/core/NoOpVisitor.scala similarity index 100% rename from core/src/upickle/core/NoOpVisitor.scala rename to upickle/core/src/upickle/core/NoOpVisitor.scala diff --git a/core/src/upickle/core/ParseUtils.scala b/upickle/core/src/upickle/core/ParseUtils.scala similarity index 100% rename from core/src/upickle/core/ParseUtils.scala rename to upickle/core/src/upickle/core/ParseUtils.scala diff --git a/core/src/upickle/core/RenderUtils.scala b/upickle/core/src/upickle/core/RenderUtils.scala similarity index 100% rename from core/src/upickle/core/RenderUtils.scala rename to upickle/core/src/upickle/core/RenderUtils.scala diff --git a/core/src/upickle/core/SimpleVisitor.scala b/upickle/core/src/upickle/core/SimpleVisitor.scala similarity index 100% rename from core/src/upickle/core/SimpleVisitor.scala rename to upickle/core/src/upickle/core/SimpleVisitor.scala diff --git a/core/src/upickle/core/StringVisitor.scala b/upickle/core/src/upickle/core/StringVisitor.scala similarity index 100% rename from core/src/upickle/core/StringVisitor.scala rename to upickle/core/src/upickle/core/StringVisitor.scala diff --git a/core/src/upickle/core/TraceVisitor.scala b/upickle/core/src/upickle/core/TraceVisitor.scala similarity index 100% rename from core/src/upickle/core/TraceVisitor.scala rename to upickle/core/src/upickle/core/TraceVisitor.scala diff --git a/core/src/upickle/core/Types.scala b/upickle/core/src/upickle/core/Types.scala similarity index 100% rename from core/src/upickle/core/Types.scala rename to upickle/core/src/upickle/core/Types.scala diff --git a/core/src/upickle/core/Visitor.scala b/upickle/core/src/upickle/core/Visitor.scala similarity index 100% rename from core/src/upickle/core/Visitor.scala rename to upickle/core/src/upickle/core/Visitor.scala diff --git a/core/templates/BufferingElemParser.scala b/upickle/core/templates/BufferingElemParser.scala similarity index 100% rename from core/templates/BufferingElemParser.scala rename to upickle/core/templates/BufferingElemParser.scala diff --git a/core/templates/ElemBuilder.scala b/upickle/core/templates/ElemBuilder.scala similarity index 100% rename from core/templates/ElemBuilder.scala rename to upickle/core/templates/ElemBuilder.scala diff --git a/core/templates/ElemUtils.scala b/upickle/core/templates/ElemUtils.scala similarity index 100% rename from core/templates/ElemUtils.scala rename to upickle/core/templates/ElemUtils.scala diff --git a/core/templates/WrapElemArrayCharSeq.scala b/upickle/core/templates/WrapElemArrayCharSeq.scala similarity index 100% rename from core/templates/WrapElemArrayCharSeq.scala rename to upickle/core/templates/WrapElemArrayCharSeq.scala diff --git a/core/test/src/upickle/core/CharBuilderTests.scala b/upickle/core/test/src/upickle/core/CharBuilderTests.scala similarity index 100% rename from core/test/src/upickle/core/CharBuilderTests.scala rename to upickle/core/test/src/upickle/core/CharBuilderTests.scala diff --git a/core/test/src/upickle/core/LinkedHashMapTests.scala b/upickle/core/test/src/upickle/core/LinkedHashMapTests.scala similarity index 100% rename from core/test/src/upickle/core/LinkedHashMapTests.scala rename to upickle/core/test/src/upickle/core/LinkedHashMapTests.scala diff --git a/core/test/src/upickle/core/ParseUtilTests.scala b/upickle/core/test/src/upickle/core/ParseUtilTests.scala similarity index 100% rename from core/test/src/upickle/core/ParseUtilTests.scala rename to upickle/core/test/src/upickle/core/ParseUtilTests.scala diff --git a/core/test/src/upickle/core/UTestFramework.scala b/upickle/core/test/src/upickle/core/UTestFramework.scala similarity index 100% rename from core/test/src/upickle/core/UTestFramework.scala rename to upickle/core/test/src/upickle/core/UTestFramework.scala diff --git a/implicits/src-2/upickle/implicits/MacroImplicits.scala b/upickle/implicits/src-2/upickle/implicits/MacroImplicits.scala similarity index 100% rename from implicits/src-2/upickle/implicits/MacroImplicits.scala rename to upickle/implicits/src-2/upickle/implicits/MacroImplicits.scala diff --git a/implicits/src-2/upickle/implicits/Readers.scala b/upickle/implicits/src-2/upickle/implicits/Readers.scala similarity index 100% rename from implicits/src-2/upickle/implicits/Readers.scala rename to upickle/implicits/src-2/upickle/implicits/Readers.scala diff --git a/implicits/src-2/upickle/implicits/Writers.scala b/upickle/implicits/src-2/upickle/implicits/Writers.scala similarity index 100% rename from implicits/src-2/upickle/implicits/Writers.scala rename to upickle/implicits/src-2/upickle/implicits/Writers.scala diff --git a/implicits/src-2/upickle/implicits/internal/Macros.scala b/upickle/implicits/src-2/upickle/implicits/internal/Macros.scala similarity index 100% rename from implicits/src-2/upickle/implicits/internal/Macros.scala rename to upickle/implicits/src-2/upickle/implicits/internal/Macros.scala diff --git a/implicits/src-3/upickle/implicits/MacroImplicits.scala b/upickle/implicits/src-3/upickle/implicits/MacroImplicits.scala similarity index 100% rename from implicits/src-3/upickle/implicits/MacroImplicits.scala rename to upickle/implicits/src-3/upickle/implicits/MacroImplicits.scala diff --git a/implicits/src-3/upickle/implicits/Readers.scala b/upickle/implicits/src-3/upickle/implicits/Readers.scala similarity index 100% rename from implicits/src-3/upickle/implicits/Readers.scala rename to upickle/implicits/src-3/upickle/implicits/Readers.scala diff --git a/implicits/src-3/upickle/implicits/Writers.scala b/upickle/implicits/src-3/upickle/implicits/Writers.scala similarity index 100% rename from implicits/src-3/upickle/implicits/Writers.scala rename to upickle/implicits/src-3/upickle/implicits/Writers.scala diff --git a/implicits/src-3/upickle/implicits/macros.scala b/upickle/implicits/src-3/upickle/implicits/macros.scala similarity index 100% rename from implicits/src-3/upickle/implicits/macros.scala rename to upickle/implicits/src-3/upickle/implicits/macros.scala diff --git a/implicits/src/upickle/implicits/CaseClassReadWriters.scala b/upickle/implicits/src/upickle/implicits/CaseClassReadWriters.scala similarity index 100% rename from implicits/src/upickle/implicits/CaseClassReadWriters.scala rename to upickle/implicits/src/upickle/implicits/CaseClassReadWriters.scala diff --git a/implicits/src/upickle/implicits/MacrosCommon.scala b/upickle/implicits/src/upickle/implicits/MacrosCommon.scala similarity index 100% rename from implicits/src/upickle/implicits/MacrosCommon.scala rename to upickle/implicits/src/upickle/implicits/MacrosCommon.scala diff --git a/implicits/src/upickle/implicits/ObjectContexts.scala b/upickle/implicits/src/upickle/implicits/ObjectContexts.scala similarity index 100% rename from implicits/src/upickle/implicits/ObjectContexts.scala rename to upickle/implicits/src/upickle/implicits/ObjectContexts.scala diff --git a/implicits/src/upickle/implicits/Readers.scala b/upickle/implicits/src/upickle/implicits/Readers.scala similarity index 100% rename from implicits/src/upickle/implicits/Readers.scala rename to upickle/implicits/src/upickle/implicits/Readers.scala diff --git a/implicits/src/upickle/implicits/TupleReadWriters.scala b/upickle/implicits/src/upickle/implicits/TupleReadWriters.scala similarity index 100% rename from implicits/src/upickle/implicits/TupleReadWriters.scala rename to upickle/implicits/src/upickle/implicits/TupleReadWriters.scala diff --git a/implicits/src/upickle/implicits/Writers.scala b/upickle/implicits/src/upickle/implicits/Writers.scala similarity index 100% rename from implicits/src/upickle/implicits/Writers.scala rename to upickle/implicits/src/upickle/implicits/Writers.scala diff --git a/implicits/src/upickle/implicits/key.scala b/upickle/implicits/src/upickle/implicits/key.scala similarity index 100% rename from implicits/src/upickle/implicits/key.scala rename to upickle/implicits/src/upickle/implicits/key.scala