diff --git a/pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt b/pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt index dfd8d354e..6349aea22 100644 --- a/pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt +++ b/pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt @@ -123,18 +123,23 @@ constructor( return options.base.normalizedSourceModules.associateWith { uri -> val moduleDir: String? = - IoUtils.toPath(uri)?.let { - IoUtils.relativize(it.parent, workingDir).toString().ifEmpty { "." } - } - val moduleKey = - try { - moduleResolver.resolve(uri) - } catch (e: VmException) { - throw e.toPklException(stackFrameTransformer, options.base.color?.hasColor() ?: false) - } + if (!uri.isAbsolute && uri.schemeSpecificPart.startsWith("@")) null + else + IoUtils.toPath(uri)?.let { + IoUtils.relativize(it.parent, workingDir).toString().ifEmpty { "." } + } + val moduleName = + if (!uri.isAbsolute && uri.schemeSpecificPart.startsWith("@")) + IoUtils.getNameWithoutExtension(uri.path) + else + try { + IoUtils.inferModuleName(moduleResolver.resolve(uri)) + } catch (e: VmException) { + throw e.toPklException(stackFrameTransformer, options.base.color?.hasColor() ?: false) + } val substituted = pathStr - .replace("%{moduleName}", IoUtils.inferModuleName(moduleKey)) + .replace("%{moduleName}", moduleName) .replace("%{outputFormat}", options.outputFormat ?: "%{outputFormat}") .replace("%{moduleDir}", moduleDir ?: "%{moduleDir}") if (substituted.contains("%{moduleDir}")) { diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt index cbc8b0e54..dbeb139b5 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt @@ -1798,6 +1798,31 @@ result = someLib.x ) } + @Test + fun `eval dependency notation source with multiple file output`( + @TempDir tempDir: Path, + @TempDir cacheDir: Path, + ) { + PackageServer.populateCacheDir(cacheDir) + val projectPath = + FileTestUtils.rootProjectDir.resolve( + "pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/" + ) + val options = + CliEvaluatorOptions( + CliBaseOptions( + sourceModules = listOf(URI("@fruit/catalog/basket.pkl")), + projectDir = projectPath, + moduleCacheDir = cacheDir, + workingDir = tempDir, + ), + multipleFileOutputPath = "output", + ) + val output = evalToConsole(options) + assertThat(output.split('\n')).hasSize(3) + assertThat(tempDir.resolve("output").listDirectoryEntries()).hasSize(2) + } + private fun evalModuleThatImportsPackage(certsFile: Path?, testPort: Int = -1) { val moduleUri = writePklFile( diff --git a/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject b/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject index e8a2a74e2..02c13abd1 100644 --- a/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject +++ b/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject @@ -1,5 +1,5 @@ amends "pkl:Project" dependencies { - ["fruit"] { uri = "package://localhost:0/fruit@1.1.0" } + ["fruit"] { uri = "package://localhost:0/fruit@1.2.0" } } diff --git a/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject.deps.json b/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject.deps.json index 09a8d03b0..fd15f0863 100644 --- a/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject.deps.json +++ b/pkl-commons-cli/src/test/resources/org/pkl/commons/cli/project1/PklProject.deps.json @@ -3,7 +3,7 @@ "resolvedDependencies": { "package://localhost:0/fruit@1": { "type": "remote", - "uri": "projectpackage://localhost:0/fruit@1.1.0", + "uri": "projectpackage://localhost:0/fruit@1.2.0", "checksums": { "sha256": "$skipChecksumVerification" } diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/fruit@1.2.0.json b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/fruit@1.2.0.json new file mode 100644 index 000000000..242ad7839 --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/fruit@1.2.0.json @@ -0,0 +1,19 @@ +{ + "schemaVersion": 1, + "packageUri": "package://localhost:0/fruit@1.2.0", + "name": "fruit", + "version": "1.2.0", + "packageZipUrl": "https://localhost:0/fruit@1.2.0/fruit@1.2.0.zip", + "dependencies": {}, + "packageZipChecksums": { + "sha256": "$computedChecksum" + }, + "sourceCode": "https://example.com/fruit", + "documentation": "https://example.com/fruit-docs", + "license": "UNLICENSED", + "authors": [ + "apple-1@example.com", + "banana-2@example.com" + ], + "issueTracker": "https://example.com/fruit/issues" +} diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruit.pkl b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruit.pkl new file mode 100644 index 000000000..3dbfa98b6 --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruit.pkl @@ -0,0 +1,3 @@ +module fruit.Fruit + +name: String diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruits.pkl b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruits.pkl new file mode 100644 index 000000000..6c00fd62c --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/Fruits.pkl @@ -0,0 +1,13 @@ +module fruit.Fruits + +import "Fruit.pkl" + +fruits: Listing + +output { + files { + for (fruit in fruits) { + [fruit.name] = fruit.output + } + } +} diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/apple.pkl b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/apple.pkl new file mode 100644 index 000000000..b6d2f16ed --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/apple.pkl @@ -0,0 +1,3 @@ +amends "../Fruit.pkl" + +name = "Apple 🍎" diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/basket.pkl b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/basket.pkl new file mode 100644 index 000000000..23ef5de32 --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/basket.pkl @@ -0,0 +1,6 @@ +amends "../Fruits.pkl" + +fruits { + import("apple.pkl") + import("pineapple.pkl") +} diff --git a/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/pineapple.pkl b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/pineapple.pkl new file mode 100644 index 000000000..e1a02b700 --- /dev/null +++ b/pkl-commons-test/src/main/files/packages/fruit@1.2.0/package/catalog/pineapple.pkl @@ -0,0 +1,3 @@ +amends "../Fruit.pkl" + +name = "Pineapple 🍍"