Skip to content

Commit 089be93

Browse files
committed
PythonInspector: Fix a deserialization issue
If a project defines no dependencies python-inspector returns an empty object instead of an empty array [1]. Create a custom deserializer as a workaround to not fail during deserialization. [1]: aboutcode-org/python-inspector#94 Signed-off-by: Martin Nonnenmacher <[email protected]>
1 parent edf1e9b commit 089be93

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

analyzer/src/funTest/kotlin/managers/PipFunTest.kt

+11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package org.ossreviewtoolkit.analyzer.managers
2121

2222
import io.kotest.core.spec.style.WordSpec
23+
import io.kotest.matchers.collections.beEmpty
24+
import io.kotest.matchers.should
2325
import io.kotest.matchers.shouldBe
2426

2527
import java.io.File
@@ -31,6 +33,7 @@ import org.ossreviewtoolkit.model.config.RepositoryConfiguration
3133
import org.ossreviewtoolkit.utils.common.Os
3234
import org.ossreviewtoolkit.utils.ort.normalizeVcsUrl
3335
import org.ossreviewtoolkit.utils.test.USER_DIR
36+
import org.ossreviewtoolkit.utils.test.createTestTempFile
3437
import org.ossreviewtoolkit.utils.test.patchExpectedResult
3538

3639
class PipFunTest : WordSpec({
@@ -114,6 +117,14 @@ class PipFunTest : WordSpec({
114117

115118
result.toYaml() shouldBe expectedResult
116119
}
120+
121+
"not fail if the requirements file is empty" {
122+
val definitionFile = createTestTempFile(prefix = "requirements", suffix = ".txt")
123+
124+
val result = createPip().resolveSingleProject(definitionFile)
125+
126+
result.issues should beEmpty()
127+
}
117128
}
118129
})
119130

analyzer/src/main/kotlin/managers/utils/PythonInspector.kt

+13-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ import java.util.SortedSet
2626

2727
import kotlinx.serialization.SerialName
2828
import kotlinx.serialization.Serializable
29+
import kotlinx.serialization.builtins.ListSerializer
2930
import kotlinx.serialization.json.Json
31+
import kotlinx.serialization.json.JsonArray
32+
import kotlinx.serialization.json.JsonElement
33+
import kotlinx.serialization.json.JsonTransformingSerializer
3034
import kotlinx.serialization.json.decodeFromStream
3135

3236
import org.apache.logging.log4j.kotlin.Logging
@@ -112,10 +116,18 @@ internal object PythonInspector : CommandLineTool, Logging {
112116
@Serializable
113117
internal data class Result(
114118
@SerialName("files") val projects: List<Project>,
115-
@SerialName("resolved_dependencies_graph") val resolvedDependenciesGraph: List<ResolvedDependency>,
119+
@SerialName("resolved_dependencies_graph")
120+
@Serializable(with = DependencyGraphDeserializer::class)
121+
val resolvedDependenciesGraph: List<ResolvedDependency>,
116122
val packages: List<Package>
117123
)
118124

125+
object DependencyGraphDeserializer :
126+
JsonTransformingSerializer<List<ResolvedDependency>>(ListSerializer(ResolvedDependency.serializer())) {
127+
override fun transformDeserialize(element: JsonElement): JsonElement =
128+
if (element !is JsonArray) JsonArray(emptyList()) else element
129+
}
130+
119131
@Serializable
120132
internal data class Project(
121133
val path: String,

0 commit comments

Comments
 (0)