Skip to content

Commit

Permalink
Require props task / PoC
Browse files Browse the repository at this point in the history
  • Loading branch information
Krystian Panek committed Feb 28, 2020
1 parent 4e47297 commit a39d8b8
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 58 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ defaultTasks("clean", "publishToMavenLocal")
repositories {
mavenLocal()
jcenter()
maven { url = uri("https://dl.bintray.com/neva-dev/maven-public") }
maven("https://dl.bintray.com/neva-dev/maven-public")
}

dependencies {
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
29 changes: 12 additions & 17 deletions gradlew
Original file line number Diff line number Diff line change
Expand Up @@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
i=`expr $i + 1`
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi

Expand All @@ -175,14 +175,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
APP_ARGS=`save "$@"`

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"
52 changes: 32 additions & 20 deletions src/main/kotlin/com/neva/gradle/fork/ForkExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,57 @@ import com.neva.gradle.fork.config.properties.PropertyDefinitions
import com.neva.gradle.fork.tasks.ConfigTask
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.UnknownTaskException
import org.gradle.api.Task
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskProvider
import org.gradle.internal.Actions
import java.io.File
import java.util.*

open class ForkExtension(val project: Project, val props: PropsExtension) {

private val logger = project.logger

fun config(configurer: Action<in SourceTargetConfig>) = config(Config.NAME_DEFAULT, configurer)
private val configs = mutableMapOf<String, Config>()

fun config(name: String, configurer: Action<in SourceTargetConfig>): TaskProvider<ConfigTask> {
return try {
project.tasks.named(name, ConfigTask::class.java) { configurer.execute(it.config as SourceTargetConfig) }
} catch (e: UnknownTaskException) {
project.tasks.register(name, ConfigTask::class.java, SourceTargetConfig(this, name)).apply {
configure { configurer.execute(it.config as SourceTargetConfig) }
}
}
}

fun inPlaceConfig(name: String, configurer: Action<in InPlaceConfig>): TaskProvider<ConfigTask> {
return try {
project.tasks.named(name, ConfigTask::class.java) { configurer.execute(it.config as InPlaceConfig) }
} catch (e: UnknownTaskException) {
project.tasks.register(name, ConfigTask::class.java, InPlaceConfig(this, name)).apply {
configure { configurer.execute(it.config as InPlaceConfig) }
}
}
fun config(name: String = Config.NAME_DEFAULT, configurer: Action<in SourceTargetConfig> = Actions.doNothing()): Config {
return configs.getOrPut(name) { SourceTargetConfig(this, name) }.apply { configurer.execute(this as SourceTargetConfig) }
}

fun inPlaceConfig(name: String, configurer: Action<in InPlaceConfig> = Actions.doNothing()) = configs.getOrPut(name) { InPlaceConfig(this, name) }.apply { configurer.execute(this as InPlaceConfig) }

fun props(configurer: Action<in InPlaceConfig> = Actions.doNothing()) = inPlaceConfig(Config.NAME_PROPERTIES, configurer)

@Internal
val propertyDefinitions = PropertyDefinitions(this)

fun properties(action: Action<in PropertyDefinitions>) {
action.execute(propertyDefinitions)
}

fun properties(
configName: String,
filePath: String,
generateOptions: Action<in Task> = Actions.doNothing(),
requireOptions: Action<in Task> = Actions.doNothing()
) {
props(Action { c ->
c.copyTemplateFile(filePath)

project.tasks.register(configName, ConfigTask::class.java, c as Config).configure(generateOptions)
project.tasks.register("require${configName.capitalize()}") {
it.doLast {
if (!c.getTargetFile(filePath).exists()) {
throw ForkException("Required properties file '$filePath' does not exist!\n" +
"Run task '$configName' to generate it interactively.")
}
}
}.configure(requireOptions)
})

loadProperties(filePath)
}

fun loadProperties(file: File) {
if (!file.exists()) {
return
Expand Down
17 changes: 10 additions & 7 deletions src/main/kotlin/com/neva/gradle/fork/ForkPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.neva.gradle.fork

import com.neva.gradle.fork.config.Config
import com.neva.gradle.fork.tasks.ConfigTask
import org.gradle.api.Action
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand All @@ -24,15 +25,17 @@ open class ForkPlugin : Plugin<Project> {

// Predefine configurations
extension.apply {
config(Config.NAME_DEFAULT, Action {}).configure {
it.description = "Generates new project basing on itself."
config(Config.NAME_DEFAULT).apply {
project.tasks.register(Config.NAME_DEFAULT, ConfigTask::class.java) {
it.description = "Generates new project basing on itself."
}
}
inPlaceConfig(Config.NAME_PROPERTIES, Action {
it.copyTemplateFile("gradle.user.properties")
}).configure {

properties(Config.NAME_PROPERTIES, "gradle.user.properties", Action {
it.description = "Generates user specific 'gradle.properties' file basing on template and prompted values."
}
loadProperties("gradle.user.properties")
}, Action {
it.description = "Requires having generated user specific 'gradle.properties' file."
})
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/kotlin/com/neva/gradle/fork/config/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ abstract class Config(val fork: ForkExtension, val name: String) {

val templateEngine = TemplateEngine(project)

fun findTemplateFile(templateName: String): File? {
val pebFile = templateDir.resolve("$templateName.peb")
val regularFile = templateDir.resolve(templateName)
return listOf(pebFile, regularFile).firstOrNull { it.exists() }
}

fun getTargetFile(targetName: String) = targetDir.resolve(targetName)

var propsFile = project.file(project.properties.getOrElse("fork.properties") { "fork.properties" } as String)

private val previousPropsFile = File(project.buildDir, "fork/config/$name.properties")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Property(

val label: String
get() {
val text = definition.label ?: prompt.label
val text = definition.label

return if (definition.required) {
"$text*"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,9 @@ class CopyTemplateFilesRule(config: Config, private val files: Map<String, Strin
registerPromptsForTemplateFiles()
}

private fun findTemplateFile(templateName: String): File? {
val pebFile = File(config.templateDir, "$templateName.peb")
val regularFile = File(config.templateDir, templateName)
return listOf(pebFile, regularFile).firstOrNull { it.exists() }
}

private fun registerPromptsForTemplateFiles() {
files.keys.forEach { templateName ->
val templateFile = findTemplateFile(templateName)
val templateFile = config.findTemplateFile(templateName)
if (templateFile != null) {
val template = FileHandler(config, templateFile).read()

Expand All @@ -34,9 +28,9 @@ class CopyTemplateFilesRule(config: Config, private val files: Map<String, Strin

private fun copyAndExpandTemplateFiles() {
files.forEach { (templateName, targetName) ->
val templateFile = findTemplateFile(templateName)
val templateFile = config.findTemplateFile(templateName)
if (templateFile != null) {
val targetFile = File(config.targetDir, targetName)
val targetFile = config.getTargetFile(targetName)

FileHandler(config, templateFile).copy(targetFile).perform()
FileHandler(config, targetFile).expand()
Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/com/neva/gradle/fork/tasks/ConfigTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import javax.inject.Inject
import com.neva.gradle.fork.config.Config as Base
import com.neva.gradle.fork.config.Config

open class ConfigTask @Inject constructor(@Internal val config: Base) : DefaultTask() {
open class ConfigTask @Inject constructor(@Internal val config: Config) : DefaultTask() {

init {
description = "Executes fork configuration named '${config.name}'"
Expand Down

0 comments on commit a39d8b8

Please sign in to comment.