Skip to content

Commit db87263

Browse files
committed
Add support for reading parameters from environment
Resolves #10
1 parent 06b8dc7 commit db87263

File tree

7 files changed

+264
-2
lines changed

7 files changed

+264
-2
lines changed

src/main/java/org/gradlex/buildparameters/BuildParameter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,16 @@ public String getPropertyPath() {
4040
@Input
4141
@Optional
4242
public abstract Property<String> getDescription();
43+
44+
@Input
45+
@Optional
46+
public abstract Property<String> getEnvironmentVariableName();
47+
48+
public void fromEnvironment() {
49+
getEnvironmentVariableName().set("");
50+
}
51+
52+
public void fromEnvironment(String variableName) {
53+
getEnvironmentVariableName().set(variableName);
54+
}
4355
}

src/main/java/org/gradlex/buildparameters/CodeGeneratingBuildParameter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ public String getType() {
6262

6363
@Override
6464
public String getValue() {
65+
if (parameter.getEnvironmentVariableName().isPresent()) {
66+
String envName = parameter.getEnvironmentVariableName().get();
67+
envName = envName.isEmpty() ? parameter.id.toEnvironmentVariableName() : envName;
68+
return "providers.gradleProperty(\"" + parameter.id.toPropertyPath() + "\").orElse(providers.environmentVariable(\"" + envName + "\"))" + type.transformation + ".getOrElse(" + getDefaultValue() + ")";
69+
}
6570
return "providers.gradleProperty(\"" + parameter.id.toPropertyPath() + "\")" + type.transformation + ".getOrElse(" + getDefaultValue() + ")";
6671
}
6772

@@ -91,7 +96,13 @@ public String getType() {
9196

9297
@Override
9398
public String getValue() {
94-
return "providers.gradleProperty(\"" + parameter.id.toPropertyPath() + "\")" + type.transformation;
99+
if (parameter.getEnvironmentVariableName().isPresent()) {
100+
String envName = parameter.getEnvironmentVariableName().get();
101+
envName = envName.isEmpty() ? parameter.id.toEnvironmentVariableName() : envName;
102+
return "providers.gradleProperty(\"" + parameter.id.toPropertyPath() + "\").orElse(providers.environmentVariable(\"" + envName + "\"))" + type.transformation;
103+
} else {
104+
return "providers.gradleProperty(\"" + parameter.id.toPropertyPath() + "\")" + type.transformation;
105+
}
95106
}
96107

97108
@Override

src/main/java/org/gradlex/buildparameters/Identifier.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ public String toFullQualifiedTypeName() {
6161
return toPackageName() + "." + toSimpleTypeName();
6262
}
6363

64+
public String toEnvironmentVariableName() {
65+
return Strings.screamingSnakeCase(toPropertyPath());
66+
}
67+
6468
private static void checkNotEmpty(String s) {
6569
if (s.trim().isEmpty()) {
6670
throw new IllegalArgumentException("Must not be empty.");

src/main/java/org/gradlex/buildparameters/Strings.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,8 @@ final class Strings {
2121
static String capitalize(String str) {
2222
return str.substring(0, 1).toUpperCase() + str.substring(1);
2323
}
24+
25+
static String screamingSnakeCase(String str) {
26+
return str.toUpperCase().replace(".", "_");
27+
}
2428
}

src/test/groovy/org/gradlex/buildparameters/BuildParametersPluginFuncTest.groovy

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,4 +337,228 @@ class BuildParametersPluginFuncTest extends Specification {
337337
expect:
338338
build("help")
339339
}
340+
341+
def "parameter values without default can be derived from environment variable"() {
342+
given:
343+
buildLogicBuildFile << """
344+
buildParameters {
345+
string("myString") {
346+
fromEnvironment()
347+
}
348+
integer("myInt") {
349+
fromEnvironment()
350+
}
351+
bool("myBool") {
352+
fromEnvironment()
353+
}
354+
enumeration("myEnum") {
355+
fromEnvironment()
356+
values = ['A', 'B']
357+
}
358+
}
359+
"""
360+
buildFile << """
361+
println "myString: " + buildParameters.myString.get()
362+
println "myInt: " + buildParameters.myInt.get()
363+
println "myBool: " + buildParameters.myBool.get()
364+
println "myEnum: " + buildParameters.myEnum.get()
365+
"""
366+
367+
and:
368+
environment.MYSTRING = "something else"
369+
environment.MYINT = "13"
370+
environment.MYBOOL = "true"
371+
environment.MYENUM = "A"
372+
373+
when:
374+
def result = build("help")
375+
376+
then:
377+
result.output.contains("myString: something else")
378+
result.output.contains("myInt: 13")
379+
result.output.contains("myBool: true")
380+
result.output.contains("myEnum: A")
381+
}
382+
383+
def "parameter values can be derived from environment variable"() {
384+
given:
385+
buildLogicBuildFile << """
386+
buildParameters {
387+
string("myString") {
388+
fromEnvironment()
389+
defaultValue = "fooDefault"
390+
}
391+
integer("myInt") {
392+
fromEnvironment()
393+
defaultValue = 19
394+
}
395+
bool("myBool") {
396+
fromEnvironment()
397+
defaultValue = true
398+
}
399+
enumeration("myEnum") {
400+
fromEnvironment()
401+
values = ['A', 'B']
402+
defaultValue = 'B'
403+
}
404+
}
405+
"""
406+
buildFile << """
407+
println "myString: " + buildParameters.myString
408+
println "myInt: " + buildParameters.myInt
409+
println "myBool: " + buildParameters.myBool
410+
println "myEnum: " + buildParameters.myEnum
411+
"""
412+
413+
and:
414+
environment.MYSTRING = "something else"
415+
environment.MYINT = "13"
416+
environment.MYBOOL = "false"
417+
environment.MYENUM = "A"
418+
419+
when:
420+
def result = build("help")
421+
422+
then:
423+
result.output.contains("myString: something else")
424+
result.output.contains("myInt: 13")
425+
result.output.contains("myBool: false")
426+
result.output.contains("myEnum: A")
427+
}
428+
429+
def "parameter values can be derived from custom environment variable"() {
430+
given:
431+
buildLogicBuildFile << """
432+
buildParameters {
433+
string("myString") {
434+
fromEnvironment("CUSTOM_STRING")
435+
defaultValue = "fooDefault"
436+
}
437+
integer("myInt") {
438+
fromEnvironment("CUSTOM_INT")
439+
defaultValue = 19
440+
}
441+
bool("myBool") {
442+
fromEnvironment("CUSTOM_BOOL")
443+
defaultValue = true
444+
}
445+
enumeration("myEnum") {
446+
fromEnvironment("CUSTOM_ENUM")
447+
values = ['A', 'B']
448+
defaultValue = 'B'
449+
}
450+
}
451+
"""
452+
buildFile << """
453+
println "myString: " + buildParameters.myString
454+
println "myInt: " + buildParameters.myInt
455+
println "myBool: " + buildParameters.myBool
456+
println "myEnum: " + buildParameters.myEnum
457+
"""
458+
459+
and:
460+
environment.CUSTOM_STRING = "something else"
461+
environment.CUSTOM_INT = "13"
462+
environment.CUSTOM_BOOL = "false"
463+
environment.CUSTOM_ENUM = "A"
464+
465+
when:
466+
def result = build("help")
467+
468+
then:
469+
result.output.contains("myString: something else")
470+
result.output.contains("myInt: 13")
471+
result.output.contains("myBool: false")
472+
result.output.contains("myEnum: A")
473+
}
474+
475+
def "parameter values can be derived from custom environment variable"() {
476+
given:
477+
buildLogicBuildFile << """
478+
buildParameters {
479+
group("group") {
480+
string("myString") {
481+
fromEnvironment()
482+
defaultValue = "fooDefault"
483+
}
484+
integer("myInt") {
485+
fromEnvironment()
486+
defaultValue = 19
487+
}
488+
bool("myBool") {
489+
fromEnvironment()
490+
defaultValue = true
491+
}
492+
enumeration("myEnum") {
493+
fromEnvironment()
494+
values = ['A', 'B']
495+
defaultValue = 'B'
496+
}
497+
}
498+
}
499+
"""
500+
buildFile << """
501+
println "myString: " + buildParameters.group.myString
502+
println "myInt: " + buildParameters.group.myInt
503+
println "myBool: " + buildParameters.group.myBool
504+
println "myEnum: " + buildParameters.group.myEnum
505+
"""
506+
507+
and:
508+
environment.GROUP_MYSTRING = "something else"
509+
environment.GROUP_MYINT = "13"
510+
environment.GROUP_MYBOOL = "false"
511+
environment.GROUP_MYENUM = "A"
512+
513+
when:
514+
def result = build("help")
515+
516+
then:
517+
result.output.contains("myString: something else")
518+
result.output.contains("myInt: 13")
519+
result.output.contains("myBool: false")
520+
result.output.contains("myEnum: A")
521+
}
522+
523+
def "parameter values are taken from command line first"() {
524+
given:
525+
buildLogicBuildFile << """
526+
buildParameters {
527+
string("myString") {
528+
fromEnvironment()
529+
}
530+
integer("myInt") {
531+
fromEnvironment()
532+
}
533+
bool("myBool") {
534+
fromEnvironment()
535+
}
536+
enumeration("myEnum") {
537+
fromEnvironment()
538+
values = ['A', 'B']
539+
}
540+
}
541+
"""
542+
buildFile << """
543+
println "myString: " + buildParameters.myString.get()
544+
println "myInt: " + buildParameters.myInt.get()
545+
println "myBool: " + buildParameters.myBool.get()
546+
println "myEnum: " + buildParameters.myEnum.get()
547+
"""
548+
549+
and:
550+
environment.MYSTRING = "mystring from env"
551+
environment.MYINT = "13"
552+
environment.MYBOOL = "true"
553+
environment.MYENUM = "A"
554+
555+
when:
556+
def result = build("help", "-PmyString=Something", "-PmyInt=2", "-PmyBool=false", "-PmyEnum=B")
557+
558+
then:
559+
result.output.contains("myString: Something")
560+
result.output.contains("myInt: 2")
561+
result.output.contains("myBool: false")
562+
result.output.contains("myEnum: B")
563+
}
340564
}

src/test/groovy/org/gradlex/buildparameters/IdentifierTest.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class IdentifierTest extends Specification {
3939
id.toPackageName() == "buildparameters"
4040
id.toPropertyPath() == "connection"
4141
id.toSimpleTypeName() == "Connection"
42+
id.toEnvironmentVariableName() == "CONNECTION"
4243
}
4344

4445
def "id with group can be converted"() {
@@ -52,5 +53,6 @@ class IdentifierTest extends Specification {
5253
id.toPackageName() == "buildparameters.db"
5354
id.toPropertyPath() == "db.connection"
5455
id.toSimpleTypeName() == "Connection"
56+
id.toEnvironmentVariableName() == "DB_CONNECTION"
5557
}
5658
}

src/test/groovy/org/gradlex/buildparameters/fixture/GradleBuild.groovy

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class GradleBuild {
2929
final File buildFile
3030
final File settingsFile
3131
final File gradleProperties
32+
final Map<String, String> environment = [:]
3233

3334
GradleBuild(File projectDir = Files.createTempDirectory("gradle-build").toFile()) {
3435
this.projectDir = new Directory(projectDir)
@@ -46,12 +47,16 @@ class GradleBuild {
4647
}
4748

4849
GradleRunner runner(String... args) {
49-
GradleRunner.create()
50+
def runner = GradleRunner.create()
5051
.withProjectDir(projectDir.dir)
5152
.withPluginClasspath()
5253
.withArguments(args)
5354
.forwardOutput()
5455
.withDebug(ManagementFactory.getRuntimeMXBean().getInputArguments().toString().indexOf("-agentlib:jdwp") > 0)
56+
if (!environment.isEmpty()) {
57+
runner.withEnvironment(environment)
58+
}
59+
runner
5560
}
5661

5762
def close() {

0 commit comments

Comments
 (0)