diff --git a/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt b/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt index 6b25c8d1..2637d2cf 100644 --- a/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt @@ -19,6 +19,15 @@ import java.util.HashMap * Generate a new project. */ public class ProjectGenerator : KobaltLogger { + companion object { + /** + * Turns a dot property into a proper Kotlin identifier, e.g. common.version -> commonVersion + */ + fun translate(key: String): String { + return key.split('.').mapIndexed( { index, value -> if (index == 0) value else value.upperFirst() }).join("") + } + } + fun run(args: Args) { if (File(args.buildFile).exists()) { log(1, "Build file ${args.buildFile} already exists, not overwriting it") @@ -52,7 +61,7 @@ public class ProjectGenerator : KobaltLogger { map.put("mainDependencies", mainDeps) map.put("testDependencies", testDeps) File("pom.xml").let { - if (it.exists()) { + if (it.absoluteFile.exists()) { importPom(it, mainDeps, testDeps, map) } } @@ -68,12 +77,13 @@ public class ProjectGenerator : KobaltLogger { private fun importPom(pomFile: File, mainDeps: ArrayList, testDeps: ArrayList, map: HashMap) { - var pom = Pom("imported", pomFile) + var pom = Pom("imported", pomFile.absoluteFile) with(map) { put("group", pom.groupId ?: "com.example") put("artifactId", pom.artifactId ?: "com.example") put("version", pom.version ?: "0.1") put("name", pom.name ?: pom.artifactId) + put("repositories", pom.repositories.map({ "\"${it}\"" }).join(",")) } val properties = pom.properties @@ -101,18 +111,6 @@ public class ProjectGenerator : KobaltLogger { dep } - /** - * Turns a dot property into a proper Kotlin identifier, e.g. common.version -> commonVersion - */ - private fun translate(key: String) = - key.split('.').mapIndexed( { index, value -> if (index == 0) value else value.upperFirst() }).join("") - - private fun String.upperFirst() = - if (this.isBlank()) { - this - } else { - this.substring(0, 1).toUpperCase() + this.substring(1) - } /** * Detect all the languages contained in this project. @@ -129,3 +127,7 @@ public class ProjectGenerator : KobaltLogger { return result.map { it.first } } } + +private fun String.upperFirst(): String { + return if (this.isBlank()) this else this.substring(0, 1).toUpperCase() + this.substring(1) +} diff --git a/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt b/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt index cb49e913..9b138b2e 100644 --- a/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt +++ b/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt @@ -45,7 +45,7 @@ public class Kobalt { val repos = ArrayList(DEFAULT_REPOS) - fun addRepo(repo: String) = repos.add(repo) + fun addRepo(repo: String) = repos.add(if (repo.endsWith("/")) repo else repo + "/") private val PROPERTY_KOBALT_VERSION = "kobalt.version" private val KOBALT_PROPERTIES = "kobalt.properties" diff --git a/src/main/kotlin/com/beust/kobalt/maven/Pom.kt b/src/main/kotlin/com/beust/kobalt/maven/Pom.kt index 0bfea321..5643e50f 100644 --- a/src/main/kotlin/com/beust/kobalt/maven/Pom.kt +++ b/src/main/kotlin/com/beust/kobalt/maven/Pom.kt @@ -11,7 +11,7 @@ import javax.xml.xpath.XPathConstants import kotlin.dom.childElements public class Pom @javax.inject.Inject constructor(@Assisted val id: String, - @Assisted documentFile: java.io.File) : KobaltLogger { + @Assisted documentFile: java.io.File) : KobaltLogger { val XPATH_FACTORY = javax.xml.xpath.XPathFactory.newInstance() val XPATH = XPATH_FACTORY.newXPath() var groupId: String? = null @@ -19,21 +19,22 @@ public class Pom @javax.inject.Inject constructor(@Assisted val id: String, var version: String? = null var name: String? = null var properties = sortedMapOf() + var repositories = listOf() public interface IFactory { - fun create(@Assisted id: String, @Assisted documentFile : java.io.File) : Pom + fun create(@Assisted id: String, @Assisted documentFile: java.io.File): Pom } data public class Dependency(val groupId: String, val artifactId: String, val version: String, - val optional: Boolean = false, val scope: String? = null) : KobaltLogger { + val optional: Boolean = false, val scope: String? = null) : KobaltLogger { /** When a variable is used in a maven file, e.g. ${version} */ private val VAR = "$" + "{" val mustDownload: Boolean - get() = ! optional && "provided" != scope && "test" != scope + get() = !optional && "provided" != scope && "test" != scope - val isValid : Boolean + val isValid: Boolean get() { var result = false if (version.contains(VAR)) { @@ -62,10 +63,14 @@ public class Pom @javax.inject.Inject constructor(@Assisted val id: String, artifactId = XPATH.compile("/project/artifactId").evaluate(document) version = XPATH.compile("/project/version").evaluate(document) name = XPATH.compile("/project/name").evaluate(document) + var repositoriesList = XPATH.compile("/project/repositories").evaluate(document, XPathConstants.NODESET) as NodeList + var repoElem = repositoriesList.item(0) as Element? + repositories = repoElem.childElements() + .map({ it.getElementsByTagName("url").item(0).textContent }) - var list = XPATH.compile("/project/properties").evaluate(document, XPathConstants.NODESET) as NodeList - var elem = list.item(0) as Element? - elem.childElements().forEach { + val propertiesList = XPATH.compile("/project/properties").evaluate(document, XPathConstants.NODESET) as NodeList + var propsElem = propertiesList.item(0) as Element? + propsElem.childElements().forEach { properties.put(it.nodeName, it.textContent) } diff --git a/src/main/resources/build-template.mustache b/src/main/resources/build-template.mustache index 663f032c..adde7a4e 100644 --- a/src/main/resources/build-template.mustache +++ b/src/main/resources/build-template.mustache @@ -2,6 +2,8 @@ import com.beust.kobalt.* import com.beust.kobalt.plugin.packaging.assemble {{imports}} +val repos = repos({{{repositories}}}) + {{#properties}} val {{first}} = "{{second}}" {{/properties}} diff --git a/src/test/kotlin/com/beust/kobalt/maven/PomTest.kt b/src/test/kotlin/com/beust/kobalt/maven/PomTest.kt index 376cd79a..b840bd99 100644 --- a/src/test/kotlin/com/beust/kobalt/maven/PomTest.kt +++ b/src/test/kotlin/com/beust/kobalt/maven/PomTest.kt @@ -1,5 +1,7 @@ package com.beust.kobalt.maven +import com.beust.kobalt.Args +import com.beust.kobalt.ProjectGenerator import org.testng.Assert import org.testng.annotations.Test import java.io.File @@ -7,7 +9,8 @@ import java.io.File class PomTest { @Test fun importPom() { - val pom = Pom("testing", File("src/test/resources/pom.xml")); + val pomSrc = File("src/test/resources/pom.xml") + val pom = Pom("testing", pomSrc); Assert.assertEquals(pom.groupId, "com.foo.bob") Assert.assertEquals(pom.artifactId, "rawr") @@ -15,5 +18,54 @@ class PomTest { Assert.assertEquals(pom.version, "1.2.3") Assert.assertEquals(pom.properties.get("commons.version"), "2.1.1") Assert.assertEquals(pom.properties.get("guice.version"), "4.0") + + validateGeneratedFile(pom, pomSrc) + } + + @Test + fun importBasicPom() { + val pomSrc = File("src/test/resources/pom-norepositories-properties.xml") + val pom = Pom("testing", pomSrc); + + Assert.assertEquals(pom.groupId, "com.foo.bob") + Assert.assertEquals(pom.artifactId, "rawr") + Assert.assertEquals(pom.name, "rawr") + Assert.assertEquals(pom.version, "1.2.3") + Assert.assertTrue(pom.properties.isEmpty()) + Assert.assertTrue(pom.repositories.isEmpty()) + + validateGeneratedFile(pom, pomSrc) + } + + private fun validateGeneratedFile(pom: Pom, pomSrc: File) { + val temp = File(System.getProperty("java.io.tmpdir")) + val original = System.getProperty("user.dir") + System.setProperty("user.dir", temp.absolutePath) + val pomFile = File(temp, "pom.xml") + pomFile.deleteOnExit() + pomSrc.copyTo(pomFile, true) + try { + val file = File(temp, "Build.kt") + file.delete() + + file.deleteOnExit() + val args = Args() + args.buildFile = file.absolutePath + args.init = true + ProjectGenerator().run(args) + var contents = file.readText() + Assert.assertTrue(contents.contains("group = \"${pom.groupId}\""), "Should find the group defined") + Assert.assertTrue(contents.contains("name = \"${pom.name}\""), "Should find the name defined") + Assert.assertTrue(contents.contains("version = \"${pom.version}\""), "Should find the version defined") + pom.properties.forEach { + Assert.assertTrue(contents.contains("val ${ProjectGenerator.translate(it.key)} = \"${it.value}\""), "Should find the " + + "property defined") + } + pom.repositories.forEach { + Assert.assertTrue(contents.contains(it), "Should find the repository defined") + } + } finally { + System.getProperty("user.dir", original) + } } } \ No newline at end of file diff --git a/src/test/resources/pom-norepositories-properties.xml b/src/test/resources/pom-norepositories-properties.xml new file mode 100644 index 00000000..c467fa10 --- /dev/null +++ b/src/test/resources/pom-norepositories-properties.xml @@ -0,0 +1,11 @@ + + 4.0.0 + + com.foo.bob + rawr + jar + 1.2.3 + + rawr +