Refactor scripting examples:

- split into script def and host part
- remove bad dependencies
- organize it in a way that should be typical for user scenarios
This commit is contained in:
Ilya Chernikov
2018-03-23 16:08:22 +01:00
parent 7cca1a72d3
commit 2c3a50e4b3
22 changed files with 97 additions and 102 deletions
@@ -1 +0,0 @@
import org.jetbrains.kotlin.gradle.dsl.Coroutines
@@ -0,0 +1 @@
import org.jetbrains.kotlin.gradle.dsl.Coroutines
@@ -0,0 +1,48 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.script.examples.jvm.resolve.maven.host
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.MyScriptWithMavenDeps
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.myJvmConfig
import java.io.File
import kotlin.script.experimental.api.EvaluationResult
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptEvaluationEnvironment
import kotlin.script.experimental.api.toConfigEntry
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.DummyCompiledJvmScriptCache
import kotlin.script.experimental.jvm.JvmBasicScriptingHost
import kotlin.script.experimental.jvm.JvmScriptCompiler
import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScriptWithMavenDeps::class)
val host = JvmBasicScriptingHost(
scriptDefinition.configurator,
scriptCompiler,
scriptDefinition.runner
)
return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment())
}
fun main(vararg args: String) {
if (args.size != 1) {
println("usage: <app> <script file>")
} else {
val scriptFile = File(args[0])
println("Executing script $scriptFile")
val res = evalFile(scriptFile)
res.reports.forEach {
println(" : ${it.message}" + if (it.exception == null) "" else ": ${it.exception}")
}
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.script.examples.jvm.resolve.maven.test
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.evalFile
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.host.evalFile
import org.junit.Assert
import org.junit.Test
import java.io.File
@@ -1,35 +1,47 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.script.examples.jvm.resolve.maven
import org.jetbrains.kotlin.script.util.*
import org.jetbrains.kotlin.script.util.impl.getResourcePathForClass
import org.jetbrains.kotlin.script.util.DependsOn
import org.jetbrains.kotlin.script.util.FilesAndMavenResolver
import org.jetbrains.kotlin.script.util.Repository
import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext
import java.io.File
import kotlin.reflect.KClass
import kotlin.script.dependencies.ScriptContents
import kotlin.script.dependencies.ScriptDependenciesResolver
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.api.*
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.basic.DefaultScriptSelector
import kotlin.script.experimental.jvm.*
import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner
val stdlibFile: File by lazy {
KotlinJars.stdlib
?: throw Exception("Unable to find kotlin stdlib, please specify it explicitly via \"kotlin.java.stdlib.jar\" property")
@KotlinScript(
DefaultScriptSelector::class,
MyConfigurator::class,
BasicJvmScriptRunner::class
)
abstract class MyScriptWithMavenDeps {
// abstract fun body(vararg args: String): Int
}
val selfFile: File by lazy {
getResourcePathForClass(MyScriptWithMavenDeps::class.java).takeIf(File::exists)
?: throw Exception("Unable to get path to the script base")
}
val scriptUtilsJarFile: File by lazy {
getResourcePathForClass(DependsOn::class.java).takeIf(File::exists)
?: throw Exception("Unable to get path to the kotlin-script-util.jar")
inline fun myJvmConfig(
from: HeterogeneousMap = HeterogeneousMap(),
crossinline body: JvmScriptCompileConfigurationParams.Builder.() -> Unit = {}
) = jvmConfigWithJavaHome(from) {
signature<MyScriptWithMavenDeps>()
ScriptCompileConfigurationParams.importedPackages(listOf(DependsOn::class.qualifiedName!!, Repository::class.qualifiedName!!))
dependencies(
scriptCompilationClasspathFromContext(
"script", // script library jar name
"kotlin-script-util" // DependsOn annotation is taken from script-util
)
)
ScriptCompileConfigurationParams.updateConfigurationOnAnnotations(listOf(DependsOn::class, Repository::class))
body()
}
class MyConfigurator(val baseClass: KClass<Any>? = null) : ScriptConfigurator {
@@ -69,45 +81,3 @@ class MyConfigurator(val baseClass: KClass<Any>? = null) : ScriptConfigurator {
}
}
inline fun myJvmConfig(
from: HeterogeneousMap = HeterogeneousMap(),
crossinline body: JvmScriptCompileConfigurationParams.Builder.() -> Unit = {}
) = jvmConfigWithJavaHome(from) {
signature<MyScriptWithMavenDeps>()
ScriptCompileConfigurationParams.importedPackages(listOf(DependsOn::class.qualifiedName!!, Repository::class.qualifiedName!!))
dependencies(
listOf(stdlibFile),
listOf(selfFile),
listOf(scriptUtilsJarFile)
)
ScriptCompileConfigurationParams.updateConfigurationOnAnnotations(listOf(DependsOn::class, Repository::class))
body()
}
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScriptWithMavenDeps::class)
val host = JvmBasicScriptingHost(
scriptDefinition.configurator,
scriptCompiler,
scriptDefinition.runner
)
return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment())
}
fun main(vararg args: String) {
if (args.size != 1) {
println("usage: <app> <script file>")
} else {
val scriptFile = File(args[0])
println("Executing script $scriptFile")
val res = evalFile(scriptFile)
res.reports.forEach {
println(" : ${it.message}" + if (it.exception == null) "" else ": ${it.exception}")
}
}
}
@@ -1,19 +0,0 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.script.examples.jvm.resolve.maven
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.basic.DefaultScriptSelector
import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner
@KotlinScript(
DefaultScriptSelector::class,
MyConfigurator::class,
BasicJvmScriptRunner::class
)
abstract class MyScriptWithMavenDeps {
// abstract fun body(vararg args: String): Int
}
@@ -1 +0,0 @@
import org.jetbrains.kotlin.gradle.dsl.Coroutines
@@ -0,0 +1 @@
import org.jetbrains.kotlin.gradle.dsl.Coroutines
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.script.examples.jvm.simple
package org.jetbrains.kotlin.script.examples.jvm.simple.host
import org.jetbrains.kotlin.script.util.KotlinJars
import org.jetbrains.kotlin.utils.PathUtil
import org.jetbrains.kotlin.script.examples.jvm.simple.MyScript
import org.jetbrains.kotlin.script.util.*
import java.io.File
import kotlin.script.experimental.api.*
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
@@ -14,26 +14,15 @@ import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.*
import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
val stdlibFile: File by lazy {
KotlinJars.stdlib
?: throw Exception("Unable to find kotlin stdlib, please specify it explicitly via \"kotlin.java.stdlib.jar\" property")
}
val selfFile: File by lazy {
PathUtil.getResourcePathForClass(MyScript::class.java).takeIf(File::exists)
?: throw Exception("Unable to get path to the script base")
}
inline fun myJvmConfig(
from: HeterogeneousMap = HeterogeneousMap(),
crossinline body: JvmScriptCompileConfigurationParams.Builder.() -> Unit = {}
) = jvmConfigWithJavaHome(from) {
signature<MyScript>()
dependencies(listOf(stdlibFile), listOf(selfFile))
dependencies(scriptCompilationClasspathFromContext("script" /* script library jar name */))
body()
}
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScript::class)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.script.examples.jvm.simple.test
import org.jetbrains.kotlin.script.examples.jvm.simple.evalFile
import org.jetbrains.kotlin.script.examples.jvm.simple.host.evalFile
import org.junit.Assert
import java.io.File
import org.junit.Test