Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

play-contrib: Various improvents #1332

Merged
merged 4 commits into from
May 21, 2021
Merged
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
19 changes: 12 additions & 7 deletions build.sc
Original file line number Diff line number Diff line change
Expand Up @@ -473,10 +473,10 @@ object contrib extends MillModule {
}

object playlib extends MillModule {
def moduleDeps = Seq(twirllib, playlib.api)
override def moduleDeps = Seq(twirllib, playlib.api)
override def compileModuleDeps = Seq(scalalib)

def testArgs = T {
override def testArgs = T {
val mapping = Map(
"MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_6" -> worker("2.6").assembly().path,
"MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_7" -> worker("2.7").assembly().path,
Expand All @@ -491,19 +491,24 @@ object contrib extends MillModule {
object api extends MillPublishModule

object worker extends Cross[WorkerModule]("2.6", "2.7", "2.8")

class WorkerModule(playBinary: String) extends MillApiModule {
def scalaVersion = playBinary match {
class WorkerModule(playBinary: String) extends MillApiModule {
override def sources = T.sources {
// We want to avoid duplicating code as long as the Play APIs allow.
// But if newer Play versions introduce incompatibilities,
// just remove the shared source dir for that worker and implement directly.
Seq(PathRef(millSourcePath / os.up / "src-shared")) ++ super.sources()
}
override def scalaVersion = playBinary match {
case "2.6" => Deps.workerScalaVersion212
case _ => Deps.scalaVersion
}
def moduleDeps = Seq(playlib.api)
override def moduleDeps = Seq(playlib.api)
def playVersion = playBinary match {
case "2.6" => "2.6.25"
case "2.7" => "2.7.9"
case "2.8" => "2.8.8"
}
def ivyDeps = Agg(
override def ivyDeps = Agg(
Deps.osLib,
ivy"com.typesafe.play::routes-compiler::$playVersion"
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package mill.playlib.api;

public interface RouteCompilerWorkerApi {
String compile(java.io.File[] files,
String[] additionalImports,
Expand Down
1 change: 1 addition & 0 deletions contrib/playlib/api/src/mill/playlib/api/Versions.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package mill.playlib.api;

public class Versions {
public static final String PLAY_2_6 = "2.6";
public static final String PLAY_2_7 = "2.7";
Expand Down
4 changes: 2 additions & 2 deletions contrib/playlib/src/mill/playlib/Dependencies.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package mill
package playlib
package mill.playlib

import mill.{Agg, T}
import mill.scalalib._

private [playlib] trait Dependencies extends ScalaModule with Version{
Expand Down
4 changes: 2 additions & 2 deletions contrib/playlib/src/mill/playlib/Layout.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package mill
package playlib
package mill.playlib

import mill.T
import mill.scalalib._

private[playlib] trait Layout extends JavaModule{
Expand Down
10 changes: 4 additions & 6 deletions contrib/playlib/src/mill/playlib/PlayModule.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package mill
package playlib
package mill.playlib

import mill.define.Target
import mill.scalalib._
import mill.playlib.api.Versions
import mill.scalalib._
import mill.{Agg, T}

trait PlayApiModule extends Dependencies with Router with Server{
trait PlayTests extends super.Tests{
def testFrameworks = Seq("org.scalatest.tools.Framework")
trait PlayTests extends super.Tests with TestModule.ScalaTest {
override def ivyDeps = T{
val scalatestPlusPlayVersion = playMinorVersion() match {
case Versions.PLAY_2_6 => "3.1.2"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,49 +1,48 @@
package mill
package playlib
package mill.playlib

import mill.api.{Ctx, Result}
import mill.define.{Discover, ExternalModule, Worker}
import mill.playlib.api.RouteCompilerType
import mill.api.{Ctx, PathRef, Result}
import mill.playlib.api.{RouteCompilerType, RouteCompilerWorkerApi}
import mill.scalalib.api.CompilationResult
import mill.{Agg, T}

private[playlib] class RouteCompilerWorker {
private var routeCompilerInstanceCache = Option.empty[(Long, mill.playlib.api.RouteCompilerWorkerApi)]

private def bridge(toolsClasspath: Agg[os.Path])
(implicit ctx: Ctx) = {
private var routeCompilerInstanceCache =
Option.empty[(Long, mill.playlib.api.RouteCompilerWorkerApi)]

protected def bridge(toolsClasspath: Agg[os.Path])(
implicit ctx: Ctx): RouteCompilerWorkerApi = {
val classloaderSig =
toolsClasspath.map(p => p.toString().hashCode + os.mtime(p)).sum
routeCompilerInstanceCache match {
case Some((sig, bridge)) if sig == classloaderSig => bridge
case _ =>
val toolsClassPath = toolsClasspath.map(_.toIO.toURI.toURL).toVector
ctx.log.debug("Loading classes from\n"+toolsClassPath.mkString("\n"))
ctx.log.debug("Loading classes from\n" + toolsClassPath.mkString("\n"))
val cl = mill.api.ClassLoader.create(
toolsClassPath,
null,
sharedLoader = getClass().getClassLoader(),
sharedPrefixes = Seq("mill.playlib.api.")
sharedPrefixes = Seq("mill.playlib.api."),
logger = Some(ctx.log)
)
val bridge = cl
.loadClass("mill.playlib.worker.RouteCompilerWorker")
.getDeclaredConstructor()
.newInstance()
.asInstanceOf[mill.playlib.api.RouteCompilerWorkerApi]
routeCompilerInstanceCache = Some((classloaderSig, bridge))
bridge
}
}


def compile(routerClasspath: Agg[os.Path],
files: Seq[os.Path],
additionalImports: Seq[String],
forwardsRouter: Boolean,
reverseRouter: Boolean,
namespaceReverseRouter: Boolean,
generatorType: RouteCompilerType,
dest: os.Path)(implicit ctx: Ctx)
: Result[CompilationResult] = {
dest: os.Path)(implicit ctx: Ctx): Result[CompilationResult] = {
//the routes file must come last as it can include the routers generated
//by the others
bridge(routerClasspath)
Expand All @@ -55,17 +54,10 @@ private[playlib] class RouteCompilerWorker {
namespaceReverseRouter,
generatorType,
dest.toIO
) match{
case null => Result.Success(CompilationResult(T.dest / 'zinc, PathRef(T.dest)))
) match {
case null =>
Result.Success(CompilationResult(T.dest / 'zinc, PathRef(T.dest)))
case err => Result.Failure(err)
}
}
}

private[playlib] object RouteCompilerWorkerModule extends ExternalModule {
def routeCompilerWorker: Worker[RouteCompilerWorker] = T.worker {
new RouteCompilerWorker()
}

lazy val millDiscover = Discover[this.type]
}
14 changes: 14 additions & 0 deletions contrib/playlib/src/mill/playlib/RouteCompilerWorkerModule.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package mill.playlib

import mill.{Module, T}
import mill.define.{Discover, ExternalModule, Worker}

trait RouteCompilerWorkerModule extends Module {
def routeCompilerWorker: Worker[RouteCompilerWorker] = T.worker {
new RouteCompilerWorker()
}
}

private[playlib] object RouteCompilerWorkerModule extends ExternalModule with RouteCompilerWorkerModule {
lazy val millDiscover = Discover[this.type]
}
5 changes: 3 additions & 2 deletions contrib/playlib/src/mill/playlib/Router.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package mill
package playlib
package mill.playlib

import mill.T

private[playlib] trait Router extends RouterModule with Layout {
override def routes = T{ conf() }
Expand Down
16 changes: 9 additions & 7 deletions contrib/playlib/src/mill/playlib/RouterModule.scala
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package mill
package playlib
package mill.playlib

import coursier.MavenRepository
import mill.api.PathRef
import mill.playlib.api.RouteCompilerType
import mill.scalalib.Lib.resolveDependencies
import mill.scalalib._
import mill.scalalib.api._
import mill.{Agg, T}

trait RouterModule extends ScalaModule with Version {

def routes: T[Seq[PathRef]] = T.sources { millSourcePath / 'routes }

private def routeFiles = T {
def routeFiles = T {
val paths = routes().flatMap(file => os.walk(file.path))
val routeFiles=paths.filter(_.ext=="routes") ++ paths.filter(_.last == "routes")
routeFiles.map(f=>PathRef(f))
Expand Down Expand Up @@ -59,9 +59,11 @@ trait RouterModule extends ScalaModule with Version {
)
}

final def compileRouter: T[CompilationResult] = T.persistent {
protected val routeCompilerWorker: RouteCompilerWorkerModule = RouteCompilerWorkerModule

def compileRouter: T[CompilationResult] = T.persistent {
T.log.debug(s"compiling play routes with ${playVersion()} worker")
RouteCompilerWorkerModule.routeCompilerWorker().compile(
routeCompilerWorker.routeCompilerWorker().compile(
toolsClasspath().map(_.path),
routeFiles().map(_.path),
routesAdditionalImport,
Expand All @@ -72,7 +74,7 @@ trait RouterModule extends ScalaModule with Version {
T.dest)
}

private def playRouteCompilerWorkerClasspath = T {
def playRouteCompilerWorkerClasspath = T {
val workerKey = "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_" + playMinorVersion().replace(".", "_")

mill.modules.Util.millProjectModule(
Expand All @@ -86,7 +88,7 @@ trait RouterModule extends ScalaModule with Version {
)
}

private def toolsClasspath = T {
def toolsClasspath = T {
playRouteCompilerWorkerClasspath() ++ routerClasspath()
}

Expand Down
4 changes: 2 additions & 2 deletions contrib/playlib/src/mill/playlib/Server.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package mill
package playlib
package mill.playlib

import mill.scalalib._
import mill.{Agg, T}

private[playlib] trait Server extends ScalaModule with Version {

Expand Down
5 changes: 3 additions & 2 deletions contrib/playlib/src/mill/playlib/SingleModule.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package mill
package playlib
package mill.playlib

import mill.define.Module

trait SingleModule extends Module {
override def millSourcePath: os.Path = super.millSourcePath / os.up
Expand Down
4 changes: 2 additions & 2 deletions contrib/playlib/src/mill/playlib/Static.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import java.nio.file._
import java.nio.file.attribute.BasicFileAttributes
import java.util

import mill.{PathRef, T}
import mill.scalalib.{Lib, ScalaModule}
import mill.{PathRef, T}

trait Static extends ScalaModule {
/**
Expand Down Expand Up @@ -65,7 +65,7 @@ trait Static extends ScalaModule {
}

private def extractWebJars(jars: Seq[PathRef], webJarBase: os.Path): Unit = {
import scala.collection.JavaConverters._
import scala.jdk.CollectionConverters._
val prefix = "/META-INF/resources/webjars/"

jars.foreach{ jarRef =>
Expand Down
12 changes: 7 additions & 5 deletions contrib/playlib/src/mill/playlib/Twirl.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package mill
package playlib
package mill.playlib

import mill.T
import mill.twirllib._

trait Twirl extends TwirlModule with Layout {

override def twirlSources=T.sources{ app() }
override def twirlSources = T.sources { app() }

override def twirlImports = T {
super.twirlImports() ++ Seq(
Expand All @@ -19,7 +19,9 @@ trait Twirl extends TwirlModule with Layout {
)
}

def twirlOutput = T{Seq(compileTwirl().classes)}
def twirlOutput = T { Seq(compileTwirl().classes) }

override def generatedSources = T{ super.generatedSources() ++ twirlOutput() }
override def generatedSources = T {
super.generatedSources() ++ twirlOutput()
}
}
8 changes: 4 additions & 4 deletions contrib/playlib/src/mill/playlib/Version.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package mill
package playlib
package mill.playlib

import mill.define.{Target, Task}
import mill.T
import mill.define.Module
import mill.scalalib._

private[playlib] trait Version extends Module{
private[playlib] trait Version extends Module {

def playVersion: T[String]

Expand Down
Loading