Skip to content

Commit 350ab43

Browse files
committed
Add needs
1 parent a4ec066 commit 350ab43

File tree

2 files changed

+72
-12
lines changed

2 files changed

+72
-12
lines changed

github-actions/src/main/scala/org/typelevel/sbt/gha/GenerativePlugin.scala

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ object GenerativePlugin extends AutoPlugin {
196196

197197
def compileSecrets(secrets: Secrets): String = secrets match {
198198
case Secrets.Inherit => s"\nsecrets: inherit"
199-
case Secrets.Values(values) => compileEnv(values, prefix = "\nsecrets")
199+
case Secrets.Values(values) => compileMap(values, prefix = "\nsecrets")
200200
}
201201

202202
def compileRef(ref: Ref): String = ref match {
@@ -247,11 +247,12 @@ object GenerativePlugin extends AutoPlugin {
247247
s"environment: ${wrap(environment.name)}"
248248
}
249249

250-
def compileEnv(env: Map[String, String], prefix: String = "env"): String =
251-
if (env.isEmpty) {
250+
def compileEnv(env: Map[String, String]): String = compileMap(env, prefix = "env")
251+
def compileMap(data: Map[String, String], prefix: String): String =
252+
if (data.isEmpty) {
252253
""
253254
} else {
254-
val rendered = env map {
255+
val rendered = data.map {
255256
case (key, value) =>
256257
if (!isSafeString(key) || key.indexOf(' ') >= 0)
257258
sys.error(s"'$key' is not a valid environment variable name")
@@ -404,7 +405,7 @@ object GenerativePlugin extends AutoPlugin {
404405
commands.mkString("\n")) + renderParams(params)
405406

406407
def renderParams(params: Map[String, String]): String = {
407-
val renderedParamsPre = compileEnv(params, prefix = "with")
408+
val renderedParamsPre = compileMap(params, prefix = "with")
408409
val renderedParams =
409410
if (renderedParamsPre.isEmpty)
410411
""
@@ -419,29 +420,33 @@ object GenerativePlugin extends AutoPlugin {
419420
case job: WorkflowJob.Use => compileUseJob(job)
420421
}
421422
def compileUseJob(job: WorkflowJob.Use): String = {
422-
val renderedUses = s"uses: ${job.uses}\n"
423+
val renderedNeeds =
424+
if (job.needs.isEmpty)
425+
""
426+
else
427+
s"\nneeds: [${job.needs.mkString(", ")}]"
423428

424429
val renderedSecrets = job.secrets.fold("")(compileSecrets)
425430

426431
val renderedOutputs = {
427-
val renderedOutputsPre = compileEnv(job.outputs, prefix = "outputs")
432+
val renderedOutputsPre = compileMap(job.outputs, prefix = "outputs")
428433
if (renderedOutputsPre.isEmpty)
429434
""
430435
else
431436
"\n" + renderedOutputsPre
432437
}
433438

434439
val renderedInputs = {
435-
val renderedInputsPre = compileEnv(job.params, prefix = "with")
440+
val renderedInputsPre = compileMap(job.params, prefix = "with")
436441
if (renderedInputsPre.isEmpty)
437442
""
438443
else
439444
"\n" + renderedInputsPre
440445
}
441446

442447
// format: off
443-
val body = s"""name: ${wrap(job.name)}
444-
${renderedUses}${renderedInputs}${renderedOutputs}${renderedSecrets}
448+
val body = s"""name: ${wrap(job.name)}${renderedNeeds}
449+
|uses: ${job.uses}${renderedInputs}${renderedOutputs}${renderedSecrets}
445450
|""".stripMargin
446451
// format: on
447452

@@ -516,7 +521,7 @@ object GenerativePlugin extends AutoPlugin {
516521
else
517522
"\n" + renderedEnvPre
518523

519-
val renderedOutputsPre = compileEnv(job.outputs, prefix = "outputs")
524+
val renderedOutputsPre = compileMap(job.outputs, prefix = "outputs")
520525
val renderedOutputs =
521526
if (renderedOutputsPre.isEmpty)
522527
""

github-actions/src/main/scala/org/typelevel/sbt/gha/WorkflowJob.scala

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,66 @@ package org.typelevel.sbt.gha
1919
sealed abstract class WorkflowJob extends Product with Serializable {
2020
def id: String
2121
def name: String
22+
def needs: List[String]
2223
def outputs: Map[String, String]
2324
// TODO: Check for other common properites, like `cond` and `need`
2425

2526
def withId(id: String): WorkflowJob
2627
def withName(name: String): WorkflowJob
28+
def withNeeds(needs: List[String]): WorkflowJob
2729
def withOutputs(outputs: Map[String, String]): WorkflowJob
2830

2931
def updatedOutputs(name: String, value: String): WorkflowJob
3032
def concatOutputs(outputs: TraversableOnce[(String, String)]): WorkflowJob
3133
}
3234

3335
object WorkflowJob {
36+
def apply(
37+
id: String,
38+
name: String,
39+
steps: List[WorkflowStep],
40+
sbtStepPreamble: List[String] = List(s"++ $${{ matrix.scala }}"),
41+
cond: Option[String] = None,
42+
permissions: Option[Permissions] = None,
43+
env: Map[String, String] = Map(),
44+
outputs: Map[String, String] = Map.empty,
45+
oses: List[String] = List("ubuntu-22.04"),
46+
scalas: List[String] = List("2.13"),
47+
javas: List[JavaSpec] = List(JavaSpec.temurin("11")),
48+
needs: List[String] = List(),
49+
matrixFailFast: Option[Boolean] = None,
50+
matrixAdds: Map[String, List[String]] = Map(),
51+
matrixIncs: List[MatrixInclude] = List(),
52+
matrixExcs: List[MatrixExclude] = List(),
53+
runsOnExtraLabels: List[String] = List(),
54+
container: Option[JobContainer] = None,
55+
environment: Option[JobEnvironment] = None,
56+
concurrency: Option[Concurrency] = None,
57+
timeoutMinutes: Option[Int] = None
58+
): Run =
59+
Run(
60+
id = id,
61+
name = name,
62+
steps = steps,
63+
sbtStepPreamble = sbtStepPreamble,
64+
cond = cond,
65+
permissions = permissions,
66+
env = env,
67+
outputs = outputs,
68+
oses = oses,
69+
scalas = scalas,
70+
javas = javas,
71+
needs = needs,
72+
matrixFailFast = matrixFailFast,
73+
matrixAdds = matrixAdds,
74+
matrixIncs = matrixIncs,
75+
matrixExcs = matrixExcs,
76+
runsOnExtraLabels = runsOnExtraLabels,
77+
container = container,
78+
environment = environment,
79+
concurrency = concurrency,
80+
timeoutMinutes = timeoutMinutes
81+
)
3482
sealed abstract class Run extends WorkflowJob {
3583
def id: String
3684
def name: String
@@ -92,6 +140,7 @@ object WorkflowJob {
92140
cond: Option[String] = None,
93141
permissions: Option[Permissions] = None,
94142
env: Map[String, String] = Map(),
143+
outputs: Map[String, String] = Map.empty,
95144
oses: List[String] = List("ubuntu-22.04"),
96145
scalas: List[String] = List("2.13"),
97146
javas: List[JavaSpec] = List(JavaSpec.temurin("11")),
@@ -114,7 +163,7 @@ object WorkflowJob {
114163
cond = cond,
115164
permissions = permissions,
116165
env = env,
117-
outputs = Map.empty,
166+
outputs = outputs,
118167
oses = oses,
119168
scalas = scalas,
120169
javas = javas,
@@ -192,12 +241,14 @@ object WorkflowJob {
192241
def id: String
193242
def name: String
194243
def uses: String
244+
def needs: List[String]
195245
def secrets: Option[Secrets]
196246
def params: Map[String, String]
197247
def outputs: Map[String, String]
198248

199249
def withId(id: String): Use
200250
def withName(name: String): Use
251+
def withNeeds(needs: List[String]): Use
201252
def withUses(uses: String): Use
202253
def withSecrets(secrets: Option[Secrets]): Use
203254
def withParams(params: Map[String, String]): Use
@@ -213,13 +264,15 @@ object WorkflowJob {
213264
id: String,
214265
name: String,
215266
uses: String,
267+
needs: List[String] = List.empty,
216268
secrets: Option[Secrets] = None,
217269
params: Map[String, String] = Map.empty,
218270
outputs: Map[String, String] = Map.empty
219271
): Use = new Impl(
220272
id = id,
221273
name = name,
222274
uses = uses,
275+
needs = needs,
223276
secrets = secrets,
224277
params = params,
225278
outputs = outputs
@@ -228,12 +281,14 @@ object WorkflowJob {
228281
id: String,
229282
name: String,
230283
uses: String,
284+
needs: List[String],
231285
secrets: Option[Secrets],
232286
params: Map[String, String],
233287
outputs: Map[String, String]
234288
) extends Use {
235289
override def withId(id: String): Use = copy(id = id)
236290
override def withName(name: String): Use = copy(name = name)
291+
override def withNeeds(needs: List[String]): Use = copy(needs = needs)
237292
override def withUses(uses: String): Use = copy(uses = uses)
238293
override def withSecrets(secrets: Option[Secrets]): Use = copy(secrets = secrets)
239294
override def withParams(params: Map[String, String]): Use = copy(params = params)

0 commit comments

Comments
 (0)