diff --git a/plugins/package-managers/pub/src/main/kotlin/Pub.kt b/plugins/package-managers/pub/src/main/kotlin/Pub.kt index 805e8beac19e3..63e2827b28494 100644 --- a/plugins/package-managers/pub/src/main/kotlin/Pub.kt +++ b/plugins/package-managers/pub/src/main/kotlin/Pub.kt @@ -52,9 +52,13 @@ import org.ossreviewtoolkit.model.config.AnalyzerConfiguration import org.ossreviewtoolkit.model.config.PackageManagerConfiguration import org.ossreviewtoolkit.model.config.RepositoryConfiguration import org.ossreviewtoolkit.model.createAndLogIssue -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.Dependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.SdkDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.utils.PubCacheReader +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Lockfile +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.PackageInfo +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.Dependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.SdkDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.parseLockfile +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.parsePubspec import org.ossreviewtoolkit.utils.common.CommandLineTool import org.ossreviewtoolkit.utils.common.Os import org.ossreviewtoolkit.utils.common.ProcessCapture diff --git a/plugins/package-managers/pub/src/main/kotlin/utils/PubCacheReader.kt b/plugins/package-managers/pub/src/main/kotlin/PubCacheReader.kt similarity index 97% rename from plugins/package-managers/pub/src/main/kotlin/utils/PubCacheReader.kt rename to plugins/package-managers/pub/src/main/kotlin/PubCacheReader.kt index b9df31622a664..048566e7a7417 100644 --- a/plugins/package-managers/pub/src/main/kotlin/utils/PubCacheReader.kt +++ b/plugins/package-managers/pub/src/main/kotlin/PubCacheReader.kt @@ -17,14 +17,14 @@ * License-Filename: LICENSE */ -package org.ossreviewtoolkit.plugins.packagemanagers.pub.utils +package org.ossreviewtoolkit.plugins.packagemanagers.pub import java.io.File import org.apache.logging.log4j.kotlin.logger import org.ossreviewtoolkit.downloader.VcsHost -import org.ossreviewtoolkit.plugins.packagemanagers.pub.PackageInfo +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.PackageInfo import org.ossreviewtoolkit.utils.common.Os import org.ossreviewtoolkit.utils.common.isSymbolicLink diff --git a/plugins/package-managers/pub/src/main/kotlin/Lockfile.kt b/plugins/package-managers/pub/src/main/kotlin/model/Lockfile.kt similarity index 89% rename from plugins/package-managers/pub/src/main/kotlin/Lockfile.kt rename to plugins/package-managers/pub/src/main/kotlin/model/Lockfile.kt index 166e8e3eee14e..75c0790626813 100644 --- a/plugins/package-managers/pub/src/main/kotlin/Lockfile.kt +++ b/plugins/package-managers/pub/src/main/kotlin/model/Lockfile.kt @@ -17,10 +17,8 @@ * License-Filename: LICENSE */ -package org.ossreviewtoolkit.plugins.packagemanagers.pub +package org.ossreviewtoolkit.plugins.packagemanagers.pub.model -import com.charleskorn.kaml.Yaml -import com.charleskorn.kaml.YamlConfiguration import com.charleskorn.kaml.YamlInput import com.charleskorn.kaml.YamlScalar @@ -39,9 +37,7 @@ import kotlinx.serialization.descriptors.SerialKind import kotlinx.serialization.descriptors.buildSerialDescriptor import kotlinx.serialization.encoding.Decoder -import org.ossreviewtoolkit.plugins.packagemanagers.pub.PackageInfo.Description - -private val YAML = Yaml(configuration = YamlConfiguration(strictMode = false)) +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.PackageInfo.Description internal fun parseLockfile(lockfile: File) = YAML.decodeFromString(lockfile.readText()) @@ -76,7 +72,7 @@ internal data class PackageInfo( ) } -private class DescriptionDeserializer : KSerializer by Description.generatedSerializer() { +private object DescriptionDeserializer : KSerializer by Description.generatedSerializer() { @OptIn(InternalSerializationApi::class) override val descriptor: SerialDescriptor by lazy { val serialName = checkNotNull(Description::class.qualifiedName) diff --git a/plugins/package-managers/pub/src/main/kotlin/Pubspec.kt b/plugins/package-managers/pub/src/main/kotlin/model/Pubspec.kt similarity index 77% rename from plugins/package-managers/pub/src/main/kotlin/Pubspec.kt rename to plugins/package-managers/pub/src/main/kotlin/model/Pubspec.kt index 6e78758cb29b9..cf50f79b9db63 100644 --- a/plugins/package-managers/pub/src/main/kotlin/Pubspec.kt +++ b/plugins/package-managers/pub/src/main/kotlin/model/Pubspec.kt @@ -17,10 +17,8 @@ * License-Filename: LICENSE */ -package org.ossreviewtoolkit.plugins.packagemanagers.pub +package org.ossreviewtoolkit.plugins.packagemanagers.pub.model -import com.charleskorn.kaml.Yaml -import com.charleskorn.kaml.YamlConfiguration import com.charleskorn.kaml.YamlInput import com.charleskorn.kaml.YamlMap import com.charleskorn.kaml.YamlNode @@ -35,17 +33,14 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.decodeFromString -import kotlinx.serialization.descriptors.serialDescriptor import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.serializer -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.Dependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.GitDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.HostedDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.PathDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.SdkDependency - -private val YAML = Yaml(configuration = YamlConfiguration(strictMode = false)) +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.Dependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.GitDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.HostedDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.PathDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.SdkDependency internal fun parsePubspec(pubspecFile: File): Pubspec = parsePubspec(pubspecFile.readText()) @@ -73,49 +68,43 @@ internal data class Pubspec( @Serializable sealed interface Dependency + /** See https://dart.dev/tools/pub/dependencies#hosted-packages. */ @Serializable data class HostedDependency( val version: String, val url: String? = null ) : Dependency + /** See https://dart.dev/tools/pub/dependencies#git-packages. */ + @Serializable + data class GitDependency( + val url: String, + val path: String? = null, + val ref: String? = null + ) : Dependency + + /** See https://dart.dev/tools/pub/dependencies#path-packages. */ @Serializable data class PathDependency( val path: String ) : Dependency + /** See https://dart.dev/tools/pub/dependencies#sdk. */ @Serializable data class SdkDependency( val sdk: String ) : Dependency - - @Serializable - data class GitDependency( - val url: String, - val path: String? = null, - val ref: String? = null - ) : Dependency } /** * If transformations like for JSON were available in kaml, this serializer could be simplified, see also * https://github.com/charleskorn/kaml/issues/29. */ -private object DependencyMapSerializer : KSerializer> { - override val descriptor = serialDescriptor>() - - override fun serialize(encoder: Encoder, value: Map) { - TODO("Not implemented yet.") - } - +private object DependencyMapSerializer : KSerializer> by serializer>() { override fun deserialize(decoder: Decoder): Map { val input = decoder.beginStructure(descriptor) as YamlInput - val result = when (val node = input.node) { - is YamlScalar -> emptyMap() - is YamlMap -> node.entries.asSequence().associateBy({ it.key.content }, { it.value.decodeDependency() }) - else -> throw SerializationException("Unexpected YAML node type: ${node.javaClass.simpleName}.") - } + val result = input.node.yamlMap.entries.asSequence().associate { it.key.content to it.value.decodeDependency() } input.endStructure(descriptor) @@ -125,14 +114,6 @@ private object DependencyMapSerializer : KSerializer> { private fun YamlNode.decodeDependency(): Dependency { if (this is YamlScalar) return HostedDependency(yamlScalar.content) - yamlMap.get("sdk")?.let { sdk -> - return SdkDependency(sdk = sdk.content) - } - - yamlMap.get("path")?.let { path -> - return PathDependency(path = path.content) - } - yamlMap.get("hosted")?.let { hosted -> val version = checkNotNull(yamlMap.get("version")).content val url = if (hosted is YamlMap) { @@ -156,6 +137,14 @@ private object DependencyMapSerializer : KSerializer> { } } + yamlMap.get("path")?.let { path -> + return PathDependency(path = path.content) + } + + yamlMap.get("sdk")?.let { sdk -> + return SdkDependency(sdk = sdk.content) + } + throw SerializationException("Unexpected dependency node format.") } } diff --git a/plugins/package-managers/pub/src/main/kotlin/model/Yaml.kt b/plugins/package-managers/pub/src/main/kotlin/model/Yaml.kt new file mode 100644 index 0000000000000..469d6febd539a --- /dev/null +++ b/plugins/package-managers/pub/src/main/kotlin/model/Yaml.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 The ORT Project Authors (see ) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * License-Filename: LICENSE + */ + +package org.ossreviewtoolkit.plugins.packagemanagers.pub.model + +import com.charleskorn.kaml.Yaml +import com.charleskorn.kaml.YamlConfiguration + +internal val YAML = Yaml(configuration = YamlConfiguration(strictMode = false)) diff --git a/plugins/package-managers/pub/src/test/kotlin/utils/PubCacheReaderTest.kt b/plugins/package-managers/pub/src/test/kotlin/PubCacheReaderTest.kt similarity index 97% rename from plugins/package-managers/pub/src/test/kotlin/utils/PubCacheReaderTest.kt rename to plugins/package-managers/pub/src/test/kotlin/PubCacheReaderTest.kt index bb3a81de3608d..549d89e71083d 100644 --- a/plugins/package-managers/pub/src/test/kotlin/utils/PubCacheReaderTest.kt +++ b/plugins/package-managers/pub/src/test/kotlin/PubCacheReaderTest.kt @@ -17,7 +17,7 @@ * License-Filename: LICENSE */ -package org.ossreviewtoolkit.plugins.packagemanagers.pub.utils +package org.ossreviewtoolkit.plugins.packagemanagers.pub import io.kotest.core.spec.style.WordSpec import io.kotest.engine.spec.tempdir @@ -25,7 +25,7 @@ import io.kotest.matchers.shouldBe import java.io.File -import org.ossreviewtoolkit.plugins.packagemanagers.pub.PackageInfo +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.PackageInfo import org.ossreviewtoolkit.utils.common.Os import org.ossreviewtoolkit.utils.common.safeMkdirs diff --git a/plugins/package-managers/pub/src/test/kotlin/PubspecTest.kt b/plugins/package-managers/pub/src/test/kotlin/model/PubspecTest.kt similarity index 91% rename from plugins/package-managers/pub/src/test/kotlin/PubspecTest.kt rename to plugins/package-managers/pub/src/test/kotlin/model/PubspecTest.kt index 2cdd67517079d..36b28bfe429f2 100644 --- a/plugins/package-managers/pub/src/test/kotlin/PubspecTest.kt +++ b/plugins/package-managers/pub/src/test/kotlin/model/PubspecTest.kt @@ -17,17 +17,17 @@ * License-Filename: LICENSE */ -package org.ossreviewtoolkit.plugins.packagemanagers.pub +package org.ossreviewtoolkit.plugins.packagemanagers.pub.model import io.kotest.core.spec.style.WordSpec import io.kotest.matchers.nulls.beNull import io.kotest.matchers.should import io.kotest.matchers.shouldBe -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.GitDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.HostedDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.PathDependency -import org.ossreviewtoolkit.plugins.packagemanagers.pub.Pubspec.SdkDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.GitDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.HostedDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.PathDependency +import org.ossreviewtoolkit.plugins.packagemanagers.pub.model.Pubspec.SdkDependency class PubspecTest : WordSpec({ "parsePubspec()" should {