Skip to content

Commit 2dfd893

Browse files
committed
tests for append patterns
1 parent 4a3e115 commit 2dfd893

File tree

4 files changed

+156
-88
lines changed

4 files changed

+156
-88
lines changed

main/src/mill/modules/Assembly.scala

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package mill.modules
2+
3+
import java.util.jar.JarFile
4+
import java.util.regex.Pattern
5+
6+
import upickle.default.{ReadWriter => RW}
7+
8+
object Assembly {
9+
10+
val defaultRules: Seq[Rule] = Seq(
11+
Rule.Append("reference.conf"),
12+
Rule.Exclude(JarFile.MANIFEST_NAME),
13+
Rule.ExcludePattern(".*\\.[sS][fF]"),
14+
Rule.ExcludePattern(".*\\.[dD][sS][aA]"),
15+
Rule.ExcludePattern(".*\\.[rR][sS][aA]")
16+
)
17+
18+
sealed trait Rule extends Product with Serializable
19+
object Rule {
20+
case class Append(path: String) extends Rule
21+
22+
object AppendPattern {
23+
def apply(pattern: String): AppendPattern = AppendPattern(Pattern.compile(pattern))
24+
}
25+
case class AppendPattern(pattern: Pattern) extends Rule
26+
27+
case class Exclude(path: String) extends Rule
28+
29+
object ExcludePattern {
30+
def apply(pattern: String): ExcludePattern = ExcludePattern(Pattern.compile(pattern))
31+
}
32+
case class ExcludePattern(pattern: Pattern) extends Rule
33+
34+
implicit lazy val appendRW: RW[Append] = upickle.default.macroRW
35+
implicit lazy val appendPatternRW: RW[AppendPattern] = upickle.default.macroRW
36+
implicit lazy val excludeRW: RW[Exclude] = upickle.default.macroRW
37+
implicit lazy val excludePatternRW: RW[ExcludePattern] = upickle.default.macroRW
38+
implicit lazy val regexRW: RW[Pattern] = upickle.default.readwriter[String].bimap[Pattern](
39+
_.pattern(), Pattern.compile
40+
)
41+
implicit lazy val rulesFormat: RW[Rule] = {
42+
RW.merge(appendRW, appendPatternRW, excludeRW, excludePatternRW)
43+
}
44+
}
45+
}

main/src/mill/modules/Jvm.scala

-29
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import java.nio.file.{FileSystems, Files, StandardOpenOption}
77
import java.nio.file.attribute.PosixFilePermission
88
import java.util.Collections
99
import java.util.jar.{JarEntry, JarFile, JarOutputStream}
10-
import java.util.regex.Pattern
1110

1211
import ammonite.ops._
1312
import geny.Generator
@@ -19,34 +18,6 @@ import mill.util.Loose.Agg
1918
import scala.collection.mutable
2019
import scala.collection.JavaConverters._
2120

22-
object Assembly {
23-
24-
val defaultRules: Seq[Rule] = Seq(
25-
Rule.Append("reference.conf"),
26-
Rule.Exclude(JarFile.MANIFEST_NAME),
27-
Rule.ExcludePattern(".*\\.[sS][fF]"),
28-
Rule.ExcludePattern(".*\\.[dD][sS][aA]"),
29-
Rule.ExcludePattern(".*\\.[rR][sS][aA]")
30-
)
31-
32-
sealed trait Rule extends Product with Serializable
33-
object Rule {
34-
case class Append(path: String) extends Rule
35-
36-
object AppendPattern {
37-
def apply(pattern: String): AppendPattern = AppendPattern(Pattern.compile(pattern))
38-
}
39-
case class AppendPattern(pattern: Pattern) extends Rule
40-
41-
case class Exclude(path: String) extends Rule
42-
43-
object ExcludePattern {
44-
def apply(pattern: String): ExcludePattern = ExcludePattern(Pattern.compile(pattern))
45-
}
46-
case class ExcludePattern(pattern: Pattern) extends Rule
47-
}
48-
}
49-
5021
object Jvm {
5122

5223
def interactiveSubprocess(mainClass: String,

scalalib/src/mill/scalalib/JavaModule.scala

+11-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import coursier.Repository
77
import mill.define.Task
88
import mill.define.TaskModule
99
import mill.eval.{PathRef, Result}
10-
import mill.modules.Jvm
10+
import mill.modules.{Assembly, Jvm}
1111
import mill.modules.Jvm.{createAssembly, createJar}
1212
import Lib._
1313
import mill.scalalib.publish.{Artifact, Scope}
@@ -108,6 +108,8 @@ trait JavaModule extends mill.Module with TaskModule { outer =>
108108
}
109109
}
110110

111+
def assemblyRules: T[Seq[Assembly.Rule]] = T { Assembly.defaultRules }
112+
111113
def sources = T.sources{ millSourcePath / 'src }
112114
def resources = T.sources{ millSourcePath / 'resources }
113115
def generatedSources = T{ Seq.empty[PathRef] }
@@ -130,6 +132,7 @@ trait JavaModule extends mill.Module with TaskModule { outer =>
130132
upstreamCompileOutput()
131133
)
132134
}
135+
133136
def localClasspath = T{
134137
resources() ++ Agg(compile().classes)
135138
}
@@ -158,19 +161,23 @@ trait JavaModule extends mill.Module with TaskModule { outer =>
158161
* upstream dependencies do not change
159162
*/
160163
def upstreamAssembly = T{
161-
createAssembly(upstreamAssemblyClasspath().map(_.path), mainClass())
164+
createAssembly(
165+
upstreamAssemblyClasspath().map(_.path),
166+
mainClass(),
167+
assemblyRules = assemblyRules()
168+
)
162169
}
163170

164171
def assembly = T{
165172
createAssembly(
166173
Agg.from(localClasspath().map(_.path)),
167174
mainClass(),
168175
prependShellScript(),
169-
Some(upstreamAssembly().path)
176+
Some(upstreamAssembly().path),
177+
assemblyRules()
170178
)
171179
}
172180

173-
174181
def jar = T{
175182
createJar(
176183
localClasspath().map(_.path).filter(exists),

scalalib/test/src/mill/scalalib/HelloWorldTests.scala

+100-55
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import ammonite.ops._
66
import mill._
77
import mill.define.Target
88
import mill.eval.{Evaluator, Result}
9+
import mill.modules.Assembly
910
import mill.scalalib.publish._
1011
import mill.util.{TestEvaluator, TestUtil}
1112
import mill.scalalib.publish.VersionControl
@@ -19,10 +20,14 @@ object HelloWorldTests extends TestSuite {
1920
trait HelloBase extends TestUtil.BaseModule{
2021
def millSourcePath = TestUtil.getSrcPathBase() / millOuterCtx.enclosing.split('.')
2122
}
23+
2224
trait HelloWorldModule extends scalalib.ScalaModule {
2325
def scalaVersion = "2.12.4"
2426
}
2527

28+
trait HelloWorldModuleWithMain extends HelloWorldModule {
29+
def mainClass = Some("Main")
30+
}
2631

2732
object HelloWorld extends HelloBase {
2833
object core extends HelloWorldModule
@@ -43,24 +48,41 @@ object HelloWorldTests extends TestSuite {
4348
}
4449

4550
object HelloWorldWithMain extends HelloBase {
46-
object core extends HelloWorldModule{
47-
def mainClass = Some("Main")
51+
object core extends HelloWorldModuleWithMain
52+
}
53+
54+
val akkaHttpDep = Agg(ivy"com.typesafe.akka::akka-http:10.0.13")
55+
56+
object HelloWorldAkkaHttpAppend extends HelloBase {
57+
object core extends HelloWorldModuleWithMain {
58+
def ivyDeps = akkaHttpDep
59+
60+
def assemblyRules = T { Seq(Assembly.Rule.Append("reference.conf")) }
4861
}
4962
}
5063

51-
object HelloWorldAkkaHttp extends HelloBase {
52-
object core extends HelloWorldModule{
53-
def mainClass = Some("Main")
54-
def ivyDeps = Agg(
55-
ivy"com.typesafe.akka::akka-http:10.0.13"
56-
)
64+
object HelloWorldAkkaHttpAppendPattern extends HelloBase {
65+
object core extends HelloWorldModuleWithMain {
66+
def ivyDeps = akkaHttpDep
67+
68+
def assemblyRules = T { Seq(Assembly.Rule.AppendPattern(".*.conf")) }
5769
}
5870
}
5971

60-
object HelloWorldMulti extends HelloBase {
61-
object core extends HelloWorldModule {
62-
def mainClass = Some("Main")
72+
object HelloWorldMultiAppend extends HelloBase {
73+
object core extends HelloWorldModuleWithMain {
74+
def moduleDeps = Seq(model)
75+
76+
def assemblyRules = T { Seq(Assembly.Rule.Append("reference.conf")) }
77+
}
78+
object model extends HelloWorldModule
79+
}
80+
81+
object HelloWorldMultiAppendPattern extends HelloBase {
82+
object core extends HelloWorldModuleWithMain {
6383
def moduleDeps = Seq(model)
84+
85+
def assemblyRules = T { Seq(Assembly.Rule.AppendPattern(".*.conf")) }
6486
}
6587
object model extends HelloWorldModule
6688
}
@@ -192,14 +214,14 @@ object HelloWorldTests extends TestSuite {
192214
cp(resourcePath, m.millSourcePath)
193215
t(eval)
194216
}
195-
217+
196218

197219

198220

199221
def tests: Tests = Tests {
200222
'scalaVersion - {
201-
202-
'fromBuild - workspaceTest(HelloWorld){eval =>
223+
224+
'fromBuild - workspaceTest(HelloWorld){eval =>
203225
val Right((result, evalCount)) = eval.apply(HelloWorld.core.scalaVersion)
204226

205227
assert(
@@ -478,49 +500,72 @@ object HelloWorldTests extends TestSuite {
478500
}
479501

480502
'assemblyRules - {
481-
'appendWithDeps - workspaceTest(HelloWorldAkkaHttp) { eval =>
482-
val Right((result, _)) = eval.apply(HelloWorldAkkaHttp.core.assembly)
483-
484-
val jarFile = new JarFile(result.path.toIO)
485-
486-
assert(jarEntries(jarFile).contains("reference.conf"))
487-
488-
val referenceContent = readFileFromJar(jarFile, "reference.conf")
489-
490-
assert(
491-
// akka modules configs are present
492-
referenceContent.contains("akka-http Reference Config File"),
493-
referenceContent.contains("Akka Actor Reference Config File"),
494-
referenceContent.contains("Akka Stream Reference Config File"),
495-
// our application config is present too
496-
referenceContent.contains("My application Reference Config File"),
497-
referenceContent.contains(
498-
"""akka.http.client.user-agent-header="hello-world-client""""
503+
def checkAppend[M <: TestUtil.BaseModule](module: M,
504+
target: Target[PathRef]) =
505+
workspaceTest(module) { eval =>
506+
val Right((result, _)) = eval.apply(target)
507+
508+
val jarFile = new JarFile(result.path.toIO)
509+
510+
assert(jarEntries(jarFile).contains("reference.conf"))
511+
512+
val referenceContent = readFileFromJar(jarFile, "reference.conf")
513+
514+
assert(
515+
// akka modules configs are present
516+
referenceContent.contains("akka-http Reference Config File"),
517+
referenceContent.contains("Akka Actor Reference Config File"),
518+
referenceContent.contains("Akka Stream Reference Config File"),
519+
// our application config is present too
520+
referenceContent.contains("My application Reference Config File"),
521+
referenceContent.contains(
522+
"""akka.http.client.user-agent-header="hello-world-client""""
523+
)
499524
)
500-
)
501-
}
502-
'appendMultiModule - workspaceTest(
503-
HelloWorldMulti,
504-
resourcePath = pwd / 'scalalib / 'test / 'resources / "hello-world-multi"
505-
) { eval =>
506-
val Right((result, _)) = eval.apply(HelloWorldMulti.core.assembly)
507-
508-
val jarFile = new JarFile(result.path.toIO)
509-
510-
assert(jarEntries(jarFile).contains("reference.conf"))
511-
512-
val referenceContent = readFileFromJar(jarFile, "reference.conf")
525+
}
526+
527+
def checkAppendMulti[M <: TestUtil.BaseModule](
528+
module: M,
529+
target: Target[PathRef]) =
530+
workspaceTest(
531+
module,
532+
resourcePath = pwd / 'scalalib / 'test / 'resources / "hello-world-multi"
533+
) { eval =>
534+
val Right((result, _)) = eval.apply(target)
535+
536+
val jarFile = new JarFile(result.path.toIO)
537+
538+
assert(jarEntries(jarFile).contains("reference.conf"))
539+
540+
val referenceContent = readFileFromJar(jarFile, "reference.conf")
541+
542+
assert(
543+
// reference config from core module
544+
referenceContent.contains("Core Reference Config File"),
545+
// reference config from model module
546+
referenceContent.contains("Model Reference Config File"),
547+
// concatenated content
548+
referenceContent.contains("bar.baz=hello"),
549+
referenceContent.contains("foo.bar=2")
550+
)
551+
}
513552

514-
assert(
515-
// reference config from core module
516-
referenceContent.contains("Core Reference Config File"),
517-
// reference config from model module
518-
referenceContent.contains("Model Reference Config File"),
519-
// concatenated content
520-
referenceContent.contains("bar.baz=hello"),
521-
referenceContent.contains("foo.bar=2")
522-
)
523-
}
553+
'appendWithDeps - checkAppend(
554+
HelloWorldAkkaHttpAppend,
555+
HelloWorldAkkaHttpAppend.core.assembly
556+
)
557+
'appendMultiModule - checkAppendMulti(
558+
HelloWorldMultiAppend,
559+
HelloWorldMultiAppend.core.assembly
560+
)
561+
'appendPatternWithDeps - checkAppend(
562+
HelloWorldAkkaHttpAppendPattern,
563+
HelloWorldAkkaHttpAppendPattern.core.assembly
564+
)
565+
'appendMultiModule - checkAppendMulti(
566+
HelloWorldMultiAppendPattern,
567+
HelloWorldMultiAppendPattern.core.assembly
568+
)
524569
}
525570

526571
'run - workspaceTest(HelloWorldWithMain){eval =>

0 commit comments

Comments
 (0)