1
0

Compare commits

..

9 Commits

Author SHA1 Message Date
hubert 2c0a1e44ec Fix http4k client artifact 2020-09-11 17:14:32 +02:00
hubert 6f691fcd75 Add custom repositories + arrow 2020-09-11 16:51:41 +02:00
hubert 3155a2bbe8 Fix gitignore 2020-09-11 16:27:08 +02:00
hubert 91a82c3736 Add serialization deps 2020-09-11 16:26:19 +02:00
hubert 8ea5207cde Rename templates 2020-09-11 16:13:54 +02:00
hubert deb086f4b9 Fix missing directory prefix 2020-09-11 15:46:04 +02:00
hubert c7a199fb2f Add logback config 2020-09-11 15:43:49 +02:00
hubert 658ac10375 400 when a path is entered 2020-09-10 23:26:32 +02:00
hubert 94269c7a87 Merge branch 'zip' into master 2020-09-10 23:17:02 +02:00
16 changed files with 159 additions and 41 deletions
+1
View File
@@ -39,3 +39,4 @@ node_modules/
.yarn-integrity .yarn-integrity
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
*.zip
+34 -1
View File
@@ -16,6 +16,15 @@ display = "Java Version"
default = "1.4.10" default = "1.4.10"
display = "Kotlin Version" display = "Kotlin Version"
[repositories]
[repositories.jcenter]
url = "https://jcenter.bintray.com"
default = true # TODO: find where this is needed
[repositories.arrow]
url = "https://dl.bintray.com/arrow-kt/arrow-kt/"
[dependencies] [dependencies]
[dependencies.http4k] [dependencies.http4k]
@@ -31,6 +40,7 @@ artifactId = "http4k-server-jetty"
version = "3.260.0" version = "3.260.0"
category = "server" category = "server"
default = true default = true
logger = "org.eclipse.jetty"
[dependencies.http4k-server-apache] [dependencies.http4k-server-apache]
groupId = "org.http4k" groupId = "org.http4k"
@@ -40,7 +50,7 @@ category = "server"
[dependencies.http4k-client-apache] [dependencies.http4k-client-apache]
groupId = "org.http4k" groupId = "org.http4k"
artifactId = "http4k-server-apache" artifactId = "http4k-client-apache"
version = "3.260.0" version = "3.260.0"
category = "server" category = "server"
@@ -49,12 +59,14 @@ groupId = "io.javalin"
artifactId = "javalin" artifactId = "javalin"
version = "3.10.1" version = "3.10.1"
category = "server" category = "server"
logger = "org.eclipse.jetty"
[dependencies.pebble] [dependencies.pebble]
groupId = "io.pebbletemplates" groupId = "io.pebbletemplates"
artifactId = "pebble" artifactId = "pebble"
version = "3.1.4" version = "3.1.4"
default = true default = true
logger = "com.mitchellbosecke.pebble"
[dependencies.logback] [dependencies.logback]
groupId = "ch.qos.logback" groupId = "ch.qos.logback"
@@ -79,18 +91,21 @@ groupId = "org.flywaydb"
artifactId = "flyway-core" artifactId = "flyway-core"
version = "6.5.4" version = "6.5.4"
category = "database" category = "database"
logger = "org.flywaydb.core"
[dependencies.HikariCP] [dependencies.HikariCP]
groupId = "com.zaxxer" groupId = "com.zaxxer"
artifactId = "HikariCP" artifactId = "HikariCP"
version = "3.4.5" version = "3.4.5"
category = "database" category = "database"
logger = "com.zaxxer.hikari"
[dependencies.Ktorm] [dependencies.Ktorm]
groupId = "me.liuwj.ktorm" groupId = "me.liuwj.ktorm"
artifactId = "ktorm-core" artifactId = "ktorm-core"
version = "3.0.0" version = "3.0.0"
category = "database" category = "database"
logger = "me.liuwj.ktorm.database"
[dependencies.Ktorm-Mysql] [dependencies.Ktorm-Mysql]
groupId = "me.liuwj.ktorm" groupId = "me.liuwj.ktorm"
@@ -148,3 +163,21 @@ artifactId = "koin-core"
version = "2.1.6" version = "2.1.6"
category = "injection" category = "injection"
default = true default = true
[dependencies.Jackson]
groupId = "com.fasterxml.jackson.module"
artifactId = "jackson-module-kotlin"
version = "2.11.2"
category = "serialization"
[dependencies.Kotlinx-serialization]
groupId = "org.jetbrains.kotlinx"
artifactId = "kotlinx-serialization-runtime"
version = "1.0-M1-1.4.0-rc"
category = "serialization"
[dependencies.Arrow-core]
groupId = "io.arrow-kt"
artifactId = "arrow-core"
version = "0.10.5"
repository = "arrow"
+22 -8
View File
@@ -3,15 +3,23 @@ package starter
import com.electronwill.nightconfig.core.file.FileConfig import com.electronwill.nightconfig.core.file.FileConfig
import com.electronwill.nightconfig.core.Config as NightConfig import com.electronwill.nightconfig.core.Config as NightConfig
data class StarterConfig(val dependencies: List<Dependency>, val inputs: List<Input>) data class StarterConfig(
val dependencies: List<Dependency>,
val inputs: List<Input>,
val repositories: List<Repository>,
)
class Config { class Config {
@Suppress("UNCHECKED_CAST")
private fun FileConfig.configMap(key: String) = this.get<NightConfig>(key).valueMap() as Map<String, NightConfig>
fun load(): StarterConfig { fun load(): StarterConfig {
val cfg = FileConfig.of("config.toml") val cfg = FileConfig.of("config.toml")
cfg.load() cfg.load()
val dependenciesNode: NightConfig = cfg["dependencies"]
@Suppress("UNCHECKED_CAST") val dependenciesMap = dependenciesNode.valueMap() as Map<String, NightConfig> val dependencies = cfg.configMap("dependencies")
val dependencies = dependenciesMap.map { (name, values) -> .map { (name, values) ->
Dependency( Dependency(
name, name,
values["groupId"], values["groupId"],
@@ -20,16 +28,22 @@ class Config {
values.getOrElse("default", false), values.getOrElse("default", false),
values.getEnumOrElse("category", Category.Other), values.getEnumOrElse("category", Category.Other),
values.getEnumOrElse("scope", Scope.Compile), values.getEnumOrElse("scope", Scope.Compile),
values["logger"],
values["repository"],
) )
} }
val inputsNode: NightConfig = cfg["inputs"] val inputs = cfg.configMap("inputs")
@Suppress("UNCHECKED_CAST") val inputMap = inputsNode.valueMap() as Map<String, NightConfig> .map { (name, values) ->
val inputs = inputMap.map { (name, values) ->
Input(name, values["display"], values["default"]) Input(name, values["display"], values["default"])
} }
return StarterConfig(dependencies, inputs) val repositories = cfg.configMap("repositories")
.map { (name, values) ->
Repository(name, values["url"], values.getOrElse("default", false))
}
return StarterConfig(dependencies, inputs, repositories)
} }
} }
+2
View File
@@ -3,6 +3,7 @@ package starter
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
import org.koin.dsl.bind import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
import starter.templates.LogbackTemplate
import starter.templates.MainTemplate import starter.templates.MainTemplate
import starter.templates.PomTemplate import starter.templates.PomTemplate
import starter.templates.Template import starter.templates.Template
@@ -18,6 +19,7 @@ val mainModule = module {
val templateModule = module { val templateModule = module {
single { PomTemplate(get()) } bind Template::class single { PomTemplate(get()) } bind Template::class
single { MainTemplate(get()) } bind Template::class single { MainTemplate(get()) } bind Template::class
single { LogbackTemplate(get()) } bind Template::class
} }
fun main() { fun main() {
+7 -2
View File
@@ -1,7 +1,7 @@
package starter package starter
enum class Category { enum class Category {
Server, Injection, Database, Test, Other Server, Injection, Database, Serialization, Test, Other
} }
enum class Scope { enum class Scope {
@@ -15,9 +15,13 @@ data class Dependency(
val version: String, val version: String,
val default: Boolean, val default: Boolean,
val category: Category, val category: Category,
val scope: Scope val scope: Scope,
val logger: String?,
val repository: String?,
) )
data class Repository(val name: String, val url: String, val default: Boolean)
data class Input(val name: String, val display: String, val value: String? = null) data class Input(val name: String, val display: String, val value: String? = null)
data class Project( data class Project(
@@ -25,4 +29,5 @@ data class Project(
val basePackage: String, val basePackage: String,
val inputs: List<Input>, val inputs: List<Input>,
val dependencies: List<Dependency>, val dependencies: List<Dependency>,
val repositories: List<Repository>,
) )
+4 -4
View File
@@ -9,11 +9,11 @@ class ProjectZip(private val templates: List<Template>) {
fun createZip(project: Project): String { fun createZip(project: Project): String {
val name: String val name: String
ZipOutput(sanitizeFilename(project.name)).use { ZipOutput(sanitizeFilename(project.name)).use { zip ->
name = it.name name = zip.name
templates.forEach { template -> templates.filter { it.enabled(project) }.forEach { template ->
it.write(template.path(project), template.render(project)) zip.write(template.path(project), template.render(project))
} }
} }
+11 -1
View File
@@ -33,7 +33,17 @@ class Server(
val projectName = inputs.find { it.name == "name" }!!.value!! val projectName = inputs.find { it.name == "name" }!!.value!!
val basePackage = inputs.find { it.name == "basePackage" }!!.value!! val basePackage = inputs.find { it.name == "basePackage" }!!.value!!
val project = Project(projectName, basePackage, inputs, deps)
if (basePackage.contains("/") || basePackage.contains("..")) {
ctx.status(400)
ctx.result("Invalid Base Package")
return@post
}
val repositories = conf.repositories
.filter { repo -> repo.default || repo.name in deps.mapNotNull { it.repository } }
val project = Project(projectName, basePackage, inputs, deps, repositories)
ctx.contentType("application/zip") ctx.contentType("application/zip")
ctx.header("Content-Disposition", "attachment; filename=\"${sanitizeFilename(projectName)}.zip\"") ctx.header("Content-Disposition", "attachment; filename=\"${sanitizeFilename(projectName)}.zip\"")
@@ -0,0 +1,20 @@
package starter.templates
import com.mitchellbosecke.pebble.PebbleEngine
import starter.Project
import starter.utils.prettyPrintXml
import starter.utils.render
class LogbackTemplate(private val engine: PebbleEngine) : Template {
override fun path(project: Project) = "src/main/resources/logback.xml"
override fun enabled(project: Project) = project.dependencies.any { it.name == "logback" }
override fun render(project: Project): String {
val args = mapOf(
"loggers" to project.dependencies.mapNotNull { it.logger }.toSet()
)
val rendered = engine.render("starter/logback/index", args)
return prettyPrintXml(rendered)
}
}
@@ -6,8 +6,8 @@ import starter.utils.render
class MainTemplate(private val engine: PebbleEngine) : Template { class MainTemplate(private val engine: PebbleEngine) : Template {
override fun path(project: Project) = override fun path(project: Project) =
project.basePackage.replace('.', '/') + "/" + project.name.toLowerCase().capitalize() + ".kt" "src/main/kotlin/" + project.basePackage.replace('.', '/') + "/" + project.name.toLowerCase().capitalize() + ".kt"
override fun render(project: Project) = override fun render(project: Project) =
engine.render("starter/main/main", mapOf("basePackage" to project.basePackage)) engine.render("starter/main/index", mapOf("basePackage" to project.basePackage))
} }
@@ -11,13 +11,15 @@ class PomTemplate(private val engine: PebbleEngine) : Template {
override fun render(project: Project): String { override fun render(project: Project): String {
val args: MutableMap<String, Any?> = mutableMapOf( val args: MutableMap<String, Any?> = mutableMapOf(
"dependencies" to project.dependencies.sortedBy { it.scope }, "dependencies" to project.dependencies.sortedBy { it.scope },
"repositories" to project.repositories,
"kotlinxSerialization" to project.dependencies.any { it.name == "Kotlinx-serialization" },
) )
project.inputs.forEach { project.inputs.forEach {
args[it.name] = it.value args[it.name] = it.value
} }
val rendered = engine.render("starter/pom/pom", args) val rendered = engine.render("starter/pom/index", args)
return prettyPrintXml(rendered) return prettyPrintXml(rendered)
} }
} }
@@ -4,5 +4,6 @@ import starter.Project
interface Template { interface Template {
fun path(project: Project): String fun path(project: Project): String
fun enabled(project: Project): Boolean = true
fun render(project: Project): String fun render(project: Project): String
} }
@@ -0,0 +1,15 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>%cyan(%d{YYYY-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{36}) - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
{% for logger in loggers %}
<logger name="{{ logger }}" level="INFO"/>
{% endfor %}
</configuration>
@@ -1,7 +1,8 @@
<repositories> <repositories>
{% for repo in repositories %}
<repository> <repository>
<id>jcenter</id> <id>{{ repo.name }}</id>
<name>jcenter</name> <url>{{ repo.url }}</url>
<url>https://jcenter.bintray.com</url>
</repository> </repository>
{% endfor %}
</repositories> </repositories>
@@ -20,5 +20,19 @@
</executions> </executions>
<configuration> <configuration>
<jvmTarget>${java.version}</jvmTarget> <jvmTarget>${java.version}</jvmTarget>
{% if kotlinxSerialization %}
<compilerPlugins>
<plugin>kotlinx-serialization</plugin>
</compilerPlugins>
{% endif %}
</configuration> </configuration>
{% if kotlinxSerialization %}
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-serialization</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
{% endif %}
</plugin> </plugin>