Skip to content

Commit 782f088

Browse files
ileasilenikitinas
authored andcommitted
Remove LibraryFactory class
Fix resources processing, add tests Decide how to resolve libraries "by default" just before resolution Fix formatting
1 parent 20aabea commit 782f088

30 files changed

+232
-200
lines changed

jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/api/libraries/libraryResources.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,25 @@ data class ResourceLocation(
5050
}
5151

5252
@Serializable(ResourceBunchSerializer::class)
53-
data class ResourceFallbacksBunch(
53+
data class ResourceFallbacksBundle(
5454
val locations: List<ResourceLocation>,
55-
) : VariablesSubstitutionAware<ResourceFallbacksBunch> {
55+
) : VariablesSubstitutionAware<ResourceFallbacksBundle> {
5656
constructor(vararg locations: ResourceLocation) : this(listOf(*locations))
5757

58-
override fun replaceVariables(mapping: Map<String, String>): ResourceFallbacksBunch {
59-
return ResourceFallbacksBunch(locations.map { it.replaceVariables(mapping) })
58+
override fun replaceVariables(mapping: Map<String, String>): ResourceFallbacksBundle {
59+
return ResourceFallbacksBundle(locations.map { it.replaceVariables(mapping) })
6060
}
6161
}
6262

6363
@Serializable
6464
data class LibraryResource(
65-
val bunches: List<ResourceFallbacksBunch>,
65+
val bundles: List<ResourceFallbacksBundle>,
6666
val type: ResourceType,
6767
val name: String,
6868
) : VariablesSubstitutionAware<LibraryResource> {
6969
override fun replaceVariables(mapping: Map<String, String>): LibraryResource {
7070
return LibraryResource(
71-
bunches.map { it.replaceVariables(mapping) },
71+
bundles.map { it.replaceVariables(mapping) },
7272
type,
7373
replaceVariables(name, mapping)
7474
)

jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/util/serializers.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import org.jetbrains.kotlinx.jupyter.api.ExactRendererTypeHandler
1717
import org.jetbrains.kotlinx.jupyter.api.KotlinKernelVersion
1818
import org.jetbrains.kotlinx.jupyter.api.ResultHandlerCodeExecution
1919
import org.jetbrains.kotlinx.jupyter.api.libraries.CodeExecution
20-
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBunch
20+
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBundle
2121
import kotlin.reflect.KClass
2222
import kotlin.reflect.KProperty1
2323

@@ -88,20 +88,20 @@ object KotlinKernelVersionSerializer : KSerializer<KotlinKernelVersion> {
8888
}
8989
}
9090

91-
object ResourceBunchSerializer : KSerializer<ResourceFallbacksBunch> {
92-
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(ResourceFallbacksBunch::class.qualifiedName!!, PrimitiveKind.STRING)
91+
object ResourceBunchSerializer : KSerializer<ResourceFallbacksBundle> {
92+
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(ResourceFallbacksBundle::class.qualifiedName!!, PrimitiveKind.STRING)
9393

94-
override fun deserialize(decoder: Decoder): ResourceFallbacksBunch {
94+
override fun deserialize(decoder: Decoder): ResourceFallbacksBundle {
9595
return when (val obj = decoder.decodeSerializableValue(serializer<JsonElement>())) {
9696
is JsonArray -> {
97-
ResourceFallbacksBunch(
97+
ResourceFallbacksBundle(
9898
obj.map {
9999
Json.decodeFromJsonElement(it)
100100
}
101101
)
102102
}
103103
is JsonObject -> {
104-
ResourceFallbacksBunch(
104+
ResourceFallbacksBundle(
105105
listOf(
106106
Json.decodeFromJsonElement(obj)
107107
)
@@ -111,7 +111,7 @@ object ResourceBunchSerializer : KSerializer<ResourceFallbacksBunch> {
111111
}
112112
}
113113

114-
override fun serialize(encoder: Encoder, value: ResourceFallbacksBunch) {
114+
override fun serialize(encoder: Encoder, value: ResourceFallbacksBundle) {
115115
encoder.encodeSerializableValue(serializer(), value.locations)
116116
}
117117
}

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/CssLibraryResourcesProcessor.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package org.jetbrains.kotlinx.jupyter.libraries
22

33
import org.jetbrains.kotlinx.jupyter.api.libraries.LibraryResource
4-
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBunch
4+
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBundle
55
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourcePathType
66
import java.io.File
77
import java.io.IOException
88

99
class CssLibraryResourcesProcessor : LibraryResourcesProcessor {
10-
private fun loadCssAsText(bunch: ResourceFallbacksBunch, classLoader: ClassLoader): String {
10+
private fun loadCssAsText(bundle: ResourceFallbacksBundle, classLoader: ClassLoader): String {
1111
val exceptions = mutableListOf<Exception>()
12-
for (resourceLocation in bunch.locations) {
12+
for (resourceLocation in bundle.locations) {
1313
val path = resourceLocation.path
1414

1515
fun wrapInTag(text: String) = """
@@ -37,6 +37,6 @@ class CssLibraryResourcesProcessor : LibraryResourcesProcessor {
3737
}
3838

3939
override fun wrapLibrary(resource: LibraryResource, classLoader: ClassLoader): String {
40-
return resource.bunches.joinToString("\n") { loadCssAsText(it, classLoader) }
40+
return resource.bundles.joinToString("\n") { loadCssAsText(it, classLoader) }
4141
}
4242
}

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/JsLibraryResourcesProcessor.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import kotlinx.serialization.json.Json
55
import org.intellij.lang.annotations.Language
66
import org.jetbrains.kotlinx.jupyter.api.Code
77
import org.jetbrains.kotlinx.jupyter.api.libraries.LibraryResource
8-
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBunch
8+
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceFallbacksBundle
99
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourcePathType
1010
import org.jetbrains.kotlinx.jupyter.config.getLogger
1111
import java.io.File
@@ -14,9 +14,9 @@ import java.io.IOException
1414
class JsLibraryResourcesProcessor : LibraryResourcesProcessor {
1515
private var outputCounter = 0
1616

17-
private fun loadBunch(bunch: ResourceFallbacksBunch, classLoader: ClassLoader): ScriptModifierFunctionGenerator {
17+
private fun loadBunch(bundle: ResourceFallbacksBundle, classLoader: ClassLoader): ScriptModifierFunctionGenerator {
1818
val exceptions = mutableListOf<Exception>()
19-
for (resourceLocation in bunch.locations) {
19+
for (resourceLocation in bundle.locations) {
2020
val path = resourceLocation.path
2121

2222
return try {
@@ -47,7 +47,7 @@ class JsLibraryResourcesProcessor : LibraryResourcesProcessor {
4747
}
4848

4949
private fun loadResourceAsText(resource: LibraryResource, classLoader: ClassLoader): List<ScriptModifierFunctionGenerator> {
50-
return resource.bunches.map { loadBunch(it, classLoader) }
50+
return resource.bundles.map { loadBunch(it, classLoader) }
5151
}
5252

5353
override fun wrapLibrary(resource: LibraryResource, classLoader: ClassLoader): String {

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibrariesProcessor.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ import org.jetbrains.kotlinx.jupyter.compiler.util.ReplCompilerException
77

88
interface LibrariesProcessor {
99
fun processNewLibraries(arg: String): List<LibraryDefinitionProducer>
10-
val libraryFactory: LibraryFactory
1110
}
1211

1312
class LibrariesProcessorImpl(
1413
private val libraries: LibraryResolver?,
1514
private val kernelVersion: KotlinKernelVersion?,
16-
override val libraryFactory: LibraryFactory,
1715
) : LibrariesProcessor {
1816

1917
/**
@@ -63,7 +61,7 @@ class LibrariesProcessorImpl(
6361

6462
override fun processNewLibraries(arg: String): List<LibraryDefinitionProducer> =
6563
splitLibraryCalls(arg).map {
66-
val (libRef, vars) = libraryFactory.parseReferenceWithArgs(it)
64+
val (libRef, vars) = parseReferenceWithArgs(it)
6765
val library = libraries?.resolve(libRef, vars)
6866
?: throw ReplCompilerException("Unknown library '$libRef'")
6967

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibraryFactory.kt

-76
This file was deleted.

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibraryReference.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ data class LibraryReference(
1414
key = namePart + info.key
1515
}
1616

17-
fun resolve(): LibraryDefinition {
18-
val text = info.resolve(name)
17+
fun resolve(): LibraryDefinition? {
18+
val text = info.resolve(name) ?: return null
1919
return parseLibraryDescriptor(text)
2020
}
2121

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibraryResolutionInfo.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,18 @@ abstract class LibraryResolutionInfo(
7070
}
7171
}
7272

73+
class Default(val string: String = "") : LibraryResolutionInfo("default") {
74+
override val args: List<Variable> = listOf()
75+
76+
override fun resolve(name: String?): Nothing? = null
77+
}
78+
7379
protected abstract val args: List<Variable>
7480
protected open val valueKey: String
7581
get() = args.joinToString { it.value }
7682

7783
val key: String by lazy { "${typeKey}_${replaceForbiddenChars(valueKey)}" }
78-
abstract fun resolve(name: String?): String
84+
abstract fun resolve(name: String?): String?
7985

8086
override fun hashCode(): Int {
8187
return key.hashCode()

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibraryResolver.kt

+10-6
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ abstract class LibraryDescriptorResolver(private val parent: LibraryResolver? =
1818
protected abstract fun save(reference: LibraryReference, definition: LibraryDefinition)
1919
protected open fun shouldResolve(reference: LibraryReference): Boolean = true
2020

21-
open val cache: Map<LibraryReference, LibraryDefinition>? = null
22-
2321
override fun resolve(reference: LibraryReference, vars: List<Variable>): LibraryDefinition? {
2422
val shouldBeResolved = shouldResolve(reference)
2523
if (shouldBeResolved) {
@@ -80,16 +78,22 @@ abstract class LibraryDescriptorResolver(private val parent: LibraryResolver? =
8078
shutdown = library.shutdown.replaceVariables(mapping),
8179
initCell = library.initCell.replaceVariables(mapping),
8280
renderers = library.renderers.replaceVariables(mapping),
83-
converters = library.converters,
8481
resources = library.resources.replaceVariables(mapping),
8582
minKernelVersion = library.minKernelVersion
8683
)
8784
}
8885
}
8986

90-
class FallbackLibraryResolver : LibraryDescriptorResolver() {
91-
override fun tryResolve(reference: LibraryReference): LibraryDefinition {
92-
return reference.resolve()
87+
class FallbackLibraryResolver(private val infoProvider: ResolutionInfoProvider) : LibraryDescriptorResolver() {
88+
override fun tryResolve(reference: LibraryReference): LibraryDefinition? {
89+
val result = reference.resolve()
90+
if (result != null) return result
91+
92+
val infoStub = reference.info
93+
if (infoStub !is LibraryResolutionInfo.Default) return null
94+
95+
val info = infoProvider.get(infoStub.string)
96+
return info.resolve(reference.name)?.let { parseLibraryDescriptor(it) }
9397
}
9498

9599
override fun save(reference: LibraryReference, definition: LibraryDefinition) {

jupyter-lib/shared-compiler/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/ResolutionInfoProvider.kt

+17-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,19 @@ import java.net.URL
66
interface ResolutionInfoProvider {
77
var fallback: LibraryResolutionInfo
88

9-
fun get(): LibraryResolutionInfo = fallback
109
fun get(string: String): LibraryResolutionInfo
10+
11+
companion object {
12+
fun withDefaultDirectoryResolution(dir: File) = StandardResolutionInfoProvider(
13+
LibraryResolutionInfo.ByDir(dir)
14+
)
15+
16+
// Used in Kotlin Jupyter plugin for IDEA
17+
@Suppress("unused")
18+
fun withDefaultGitRefResolution(ref: String) = StandardResolutionInfoProvider(
19+
LibraryResolutionInfo.getInfoByRef(ref)
20+
)
21+
}
1122
}
1223

1324
object EmptyResolutionInfoProvider : ResolutionInfoProvider {
@@ -17,11 +28,15 @@ object EmptyResolutionInfoProvider : ResolutionInfoProvider {
1728
get() = fallbackInfo
1829
set(_) {}
1930

20-
override fun get(string: String) = LibraryResolutionInfo.getInfoByRef(string)
31+
override fun get(string: String): LibraryResolutionInfo {
32+
if (string.isEmpty()) return fallback
33+
return LibraryResolutionInfo.getInfoByRef(string)
34+
}
2135
}
2236

2337
class StandardResolutionInfoProvider(override var fallback: LibraryResolutionInfo) : ResolutionInfoProvider {
2438
override fun get(string: String): LibraryResolutionInfo {
39+
if (string.isEmpty()) return fallback
2540
return tryGetAsRef(string) ?: tryGetAsDir(string) ?: tryGetAsFile(string) ?: tryGetAsURL(string) ?: fallback
2641
}
2742

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.jetbrains.kotlinx.jupyter.libraries
2+
3+
import java.io.File
4+
import java.net.URL
5+
6+
fun parseReferenceWithArgs(str: String): Pair<LibraryReference, List<Variable>> {
7+
val (fullName, vars) = parseLibraryName(str)
8+
val reference = parseReference(fullName)
9+
return reference to vars
10+
}
11+
12+
private fun parseResolutionInfo(string: String): LibraryResolutionInfo {
13+
// In case of empty string after `@`: %use lib@
14+
if (string.isBlank()) return LibraryResolutionInfo.Default()
15+
16+
val (type, vars) = parseCall(string, Brackets.SQUARE)
17+
return defaultParsers[type]?.getInfo(vars) ?: LibraryResolutionInfo.Default(type)
18+
}
19+
20+
private fun parseReference(string: String): LibraryReference {
21+
val sepIndex = string.indexOf('@')
22+
if (sepIndex == -1) return LibraryReference(LibraryResolutionInfo.Default(), string)
23+
24+
val nameString = string.substring(0, sepIndex)
25+
val infoString = string.substring(sepIndex + 1)
26+
val info = parseResolutionInfo(infoString)
27+
return LibraryReference(info, nameString)
28+
}
29+
30+
private val defaultParsers = listOf(
31+
LibraryResolutionInfoParser.make("ref", listOf(Parameter.Required("ref"))) { args ->
32+
LibraryResolutionInfo.getInfoByRef(args["ref"] ?: error("Argument 'ref' should be specified"))
33+
},
34+
LibraryResolutionInfoParser.make("file", listOf(Parameter.Required("path"))) { args ->
35+
LibraryResolutionInfo.ByFile(File(args["path"] ?: error("Argument 'path' should be specified")))
36+
},
37+
LibraryResolutionInfoParser.make("dir", listOf(Parameter.Required("dir"))) { args ->
38+
LibraryResolutionInfo.ByDir(File(args["dir"] ?: error("Argument 'dir' should be specified")))
39+
},
40+
LibraryResolutionInfoParser.make("url", listOf(Parameter.Required("url"))) { args ->
41+
LibraryResolutionInfo.ByURL(URL(args["url"] ?: error("Argument 'url' should be specified")))
42+
},
43+
).map { it.name to it }.toMap()

0 commit comments

Comments
 (0)