diff --git a/jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/util/acceptanceRules.kt b/jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/util/acceptanceRules.kt index 5c1b83275..1cba3959e 100644 --- a/jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/util/acceptanceRules.kt +++ b/jupyter-lib/api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/util/acceptanceRules.kt @@ -99,5 +99,13 @@ class PatternNameAcceptanceRule( * 3) returns `null` if all acceptance results are `null` or the iterable is empty */ fun Iterable>.accepts(obj: T): Boolean? { - return mapNotNull { it.accepts(obj) }.lastOrNull() + return unionAcceptance(map { it.accepts(obj) }) +} + +fun unionAcceptance(results: Iterable): Boolean? { + return results.filterNotNull().lastOrNull() +} + +fun unionAcceptance(vararg result: Boolean?): Boolean? { + return unionAcceptance(result.toList()) } diff --git a/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibrariesScanner.kt b/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibrariesScanner.kt index 5b05a7faf..4b6ffc683 100644 --- a/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibrariesScanner.kt +++ b/src/main/kotlin/org/jetbrains/kotlinx/jupyter/libraries/LibrariesScanner.kt @@ -16,15 +16,24 @@ import org.jetbrains.kotlinx.jupyter.api.libraries.LibraryDefinition import org.jetbrains.kotlinx.jupyter.config.errorForUser import org.jetbrains.kotlinx.jupyter.config.getLogger import org.jetbrains.kotlinx.jupyter.exceptions.ReplException +import org.jetbrains.kotlinx.jupyter.util.AcceptanceRule +import org.jetbrains.kotlinx.jupyter.util.accepts +import org.jetbrains.kotlinx.jupyter.util.unionAcceptance class LibrariesScanner(val notebook: Notebook) { private val processedFQNs = mutableSetOf() private val discardedFQNs = mutableSetOf() - private fun > Iterable.filterNamesToLoad(host: KotlinKernelHost): List { + private fun > Iterable.filterNamesToLoad( + host: KotlinKernelHost, + integrationTypeNameRules: Iterable>, + ): List { return filter { val typeName = it.fqn - val acceptance = host.acceptsIntegrationTypeName(typeName) + val acceptance = unionAcceptance( + host.acceptsIntegrationTypeName(typeName), + integrationTypeNameRules.accepts(typeName) + ) log.debug("Acceptance result for $typeName: $acceptance") when (acceptance) { true -> processedFQNs.add(typeName) @@ -37,15 +46,15 @@ class LibrariesScanner(val notebook: Notebook) { } } - fun addLibrariesFromClassLoader(classLoader: ClassLoader, host: KotlinKernelHost) { - val scanResult = scanForLibraries(classLoader, host) + fun addLibrariesFromClassLoader(classLoader: ClassLoader, host: KotlinKernelHost, integrationTypeNameRules: List> = listOf()) { + val scanResult = scanForLibraries(classLoader, host, integrationTypeNameRules) log.debug("Scanning for libraries is done. Detected FQNs: ${Json.encodeToString(scanResult)}") val libraries = instantiateLibraries(classLoader, scanResult, notebook) log.debug("Number of detected definitions: ${libraries.size}") host.addLibraries(libraries) } - private fun scanForLibraries(classLoader: ClassLoader, host: KotlinKernelHost): LibrariesScanResult { + private fun scanForLibraries(classLoader: ClassLoader, host: KotlinKernelHost, integrationTypeNameRules: List> = listOf()): LibrariesScanResult { val results = classLoader.getResources("$KOTLIN_JUPYTER_RESOURCES_PATH/$KOTLIN_JUPYTER_LIBRARIES_FILE_NAME").toList().map { url -> val contents = url.readText() Json.decodeFromString(contents) @@ -59,9 +68,11 @@ class LibrariesScanner(val notebook: Notebook) { producers.addAll(result.producers) } + fun > Iterable.filterNames() = filterNamesToLoad(host, integrationTypeNameRules) + return LibrariesScanResult( - definitions.filterNamesToLoad(host), - producers.filterNamesToLoad(host), + definitions.filterNames(), + producers.filterNames(), ) }