mirror of
https://github.com/apple/pkl.git
synced 2026-05-25 16:19:20 +02:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 19c292f9a2 | |||
| d720f21149 | |||
| b28cdcd631 | |||
| 825135a0f8 | |||
| 63b92ec72b | |||
| 3125fc4678 | |||
| 4bb6890621 | |||
| 8e15556201 | |||
| 2fb17fd283 | |||
| f4983c51be | |||
| 2cd2712589 | |||
| f9a3fc88fd | |||
| d097341abd | |||
| 0eab5fb552 | |||
| 7c3787396e | |||
| 57df7995fd | |||
| 6c97b09c29 | |||
| da19c3971e | |||
| efad356b7b | |||
| 261a2260a1 | |||
| 204c6b16c3 | |||
| f91f91fd30 | |||
| 309fb49fa1 |
@@ -1,2 +0,0 @@
|
|||||||
# Auto-format Kotlin code
|
|
||||||
816cd483c8adf4c04e14236c173a1dc6bd2579ea
|
|
||||||
@@ -15,10 +15,6 @@ generated/
|
|||||||
!.idea/scopes/
|
!.idea/scopes/
|
||||||
!.idea/vcs.xml
|
!.idea/vcs.xml
|
||||||
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
.pkl-lsp/
|
|
||||||
|
|
||||||
# :pkl-core:makeIntelliJAntlrPluginHappy
|
# :pkl-core:makeIntelliJAntlrPluginHappy
|
||||||
gen/
|
gen/
|
||||||
PklLexer.tokens
|
PklLexer.tokens
|
||||||
|
|||||||
+4
-13
@@ -3,19 +3,16 @@
|
|||||||
:uri-jenv: https://www.jenv.be
|
:uri-jenv: https://www.jenv.be
|
||||||
:uri-intellij: https://www.jetbrains.com/idea/download/
|
:uri-intellij: https://www.jetbrains.com/idea/download/
|
||||||
:uri-jdk: https://adoptopenjdk.net/releases.html?variant=openjdk17
|
:uri-jdk: https://adoptopenjdk.net/releases.html?variant=openjdk17
|
||||||
:uri-native-prerequisites: https://www.graalvm.org/latest/getting-started/windows/#prerequisites-for-native-image-on-windows
|
|
||||||
|
|
||||||
== Setup
|
== Setup
|
||||||
|
|
||||||
. (mandatory) Install {uri-jdk}[OpenJDK 17] or higher
|
. (mandatory) Install {uri-jdk}[OpenJDK 17] or higher
|
||||||
. (recommended) Install {uri-intellij}[IntelliJ IDEA] +
|
. (recommended) Install {uri-intellij}[IntelliJ IDEA 2023.x] +
|
||||||
To import the project into IntelliJ, go to File->Open and select the project's root directory.
|
To import the project into IntelliJ, go to File->Open and select the project's root directory.
|
||||||
If the project is opened but not imported, look for a popup in the lower right corner
|
If the project is opened but not imported, look for a popup in the lower right corner
|
||||||
and click its "Import Gradle Project" link.
|
and click its "Import Gradle Project" link.
|
||||||
. (recommended) Install {uri-gng}[gng] +
|
. (recommended) Install {uri-gng}[gng] +
|
||||||
_gng_ enables to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.
|
_gng_ enables to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.
|
||||||
. (recommended) Set up Git ignore-revs +
|
|
||||||
`git config blame.ignoreRevsFile .git-blame-ignore-revs`
|
|
||||||
. (recommended) Install {uri-jenv}[jenv] and plugins +
|
. (recommended) Install {uri-jenv}[jenv] and plugins +
|
||||||
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 17. +
|
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 17. +
|
||||||
Enable _jenv_ plugins for better handling by `gradle`:
|
Enable _jenv_ plugins for better handling by `gradle`:
|
||||||
@@ -26,12 +23,6 @@ jenv enable-plugin gradle
|
|||||||
jenv enable-plugin export
|
jenv enable-plugin export
|
||||||
----
|
----
|
||||||
|
|
||||||
=== Additional Windows Setup
|
|
||||||
. (optional) Go to `System->For developers` and enable `Developer Mode`.
|
|
||||||
Otherwise, some tests may fail due to insufficient file system privileges.
|
|
||||||
. (optional) To build the native executable (`./gradlew buildNative`),
|
|
||||||
install {uri-native-prerequisites}[Prerequisites For Native Image on Windows].
|
|
||||||
|
|
||||||
== Common Build Commands
|
== Common Build Commands
|
||||||
|
|
||||||
[source,shell]
|
[source,shell]
|
||||||
@@ -41,12 +32,12 @@ gw test # run all tests except native executable tests
|
|||||||
gw testNative # run native executable tests
|
gw testNative # run native executable tests
|
||||||
gw spotlessApply # fix code formatting
|
gw spotlessApply # fix code formatting
|
||||||
gw build # build everything except native executables
|
gw build # build everything except native executables
|
||||||
gw buildNative # build native executable(s) for current platform
|
gw buildNative # build macOS executable on macOS,
|
||||||
|
# Linux and Alpine executables on Linux
|
||||||
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists)
|
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists)
|
||||||
|
|
||||||
pkl-cli/build/executable/jpkl # run Java executable
|
pkl-cli/build/executable/jpkl # run Java executable
|
||||||
pkl-cli/build/executable/pkl-macos-aarch64 # run Mac executable
|
pkl-cli/build/executable/pkl-macos-amd64 # run Mac executable
|
||||||
pkl-cli/build/executable/pkl-macos-amd64 # run Intel Mac executable
|
|
||||||
pkl-cli/build/executable/pkl-linux-amd64 # run Linux executable
|
pkl-cli/build/executable/pkl-linux-amd64 # run Linux executable
|
||||||
pkl-cli/build/executable/pkl-alpine-linux-amd64 # run Alpine Linux executable
|
pkl-cli/build/executable/pkl-alpine-linux-amd64 # run Alpine Linux executable
|
||||||
pkl-cli/build/executable/pkl-windows-amd64.exe # run Windows executable
|
pkl-cli/build/executable/pkl-windows-amd64.exe # run Windows executable
|
||||||
|
|||||||
-70
@@ -41,73 +41,3 @@ We'd love to hear from you!
|
|||||||
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
|
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
|
||||||
* link:DEVELOPMENT.adoc[] for build instructions
|
* link:DEVELOPMENT.adoc[] for build instructions
|
||||||
* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).
|
* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).
|
||||||
|
|
||||||
== Pkl GitHub Repositories
|
|
||||||
|
|
||||||
[%autowidth]
|
|
||||||
|===
|
|
||||||
|Name |Description
|
|
||||||
|
|
||||||
|`apple/pkl`
|
|
||||||
|A configuration as code language with rich validation and tooling.
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-evolution[`apple/pkl-evolution`]
|
|
||||||
|Suggested Pkl Improvements, Changes, or Enhancements (SPICEs)
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-go[`apple/pkl-go`]
|
|
||||||
|Pkl bindings for the Go programming language
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-go-examples[`apple/pkl-go-examples`]
|
|
||||||
|Examples for using Pkl within Go applications
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-intellij[`apple/pkl-intellij`]
|
|
||||||
|JetBrains editor plugins providing Pkl language support
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-jvm-examples[`apple/pkl-jvm-examples`]
|
|
||||||
|Examples for using Pkl within JVM applications
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-k8s[`apple/pkl-k8s`]
|
|
||||||
|Templates for using Pkl with Kubernetes
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-k8s-examples[`apple/pkl-k8s-examples`]
|
|
||||||
|Examples for using Pkl with Kubernetes
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-lang.org[`apple/pkl-lang.org`]
|
|
||||||
|The pkl-lang.org website
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-lsp[`apple/pkl-lsp`]
|
|
||||||
| Language server for Pkl, implementing the server-side of the Language Server Protocol
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-neovim[`apple/pkl-neovim`]
|
|
||||||
|Pkl language support for Neovim
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-package-docs[`apple/pkl-package-docs`]
|
|
||||||
|Documentation for Pkl packages
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-pantry[`apple/pkl-pantry`]
|
|
||||||
|Shared Pkl packages
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-project-commons[`apple/pkl-project-commons`]
|
|
||||||
|Utility libraries for Pkl
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-spring[`apple/pkl-spring`]
|
|
||||||
|Spring Boot extension for configuring Boot apps with Pkl
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-swift[`apple/pkl-swift`]
|
|
||||||
|Pkl bindings for the Swift programming language
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-swift-examples[`apple/pkl-swift-examples`]
|
|
||||||
|Examples for using Pkl within Swift applications
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl-vscode[`apple/pkl-vscode`]
|
|
||||||
|Pkl language support for VS Code
|
|
||||||
|
|
||||||
|https://github.com/apple/pkl.tmbundle[`apple/pkl.tmbundle`]
|
|
||||||
|TextMate bundle for Pkl
|
|
||||||
|
|
||||||
|https://github.com/apple/rules_pkl[`apple/rules_pkl`]
|
|
||||||
| Bazel build rules for Pkl
|
|
||||||
|
|
||||||
|https://github.com/apple/tree-sitter-pkl[`apple/tree-sitter-pkl`]
|
|
||||||
|Tree-sitter parser for Pkl
|
|
||||||
|===
|
|
||||||
|
|||||||
+12
-25
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
plugins {
|
plugins {
|
||||||
pklAllProjects
|
pklAllProjects
|
||||||
pklJavaLibrary
|
pklJavaLibrary
|
||||||
@@ -33,15 +18,14 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
jmh {
|
jmh {
|
||||||
// include = ["fib_class_java"]
|
//include = ["fib_class_java"]
|
||||||
// include = ["fib_class_constrained1", "fib_class_constrained2"]
|
//include = ["fib_class_constrained1", "fib_class_constrained2"]
|
||||||
jmhVersion.set(libs.versions.jmh)
|
jmhVersion.set(libs.versions.jmh)
|
||||||
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
|
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
|
||||||
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
|
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
|
||||||
// "-Dgraal.TruffleFunctionInlining=false"
|
// "-Dgraal.TruffleFunctionInlining=false"
|
||||||
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java")
|
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java")
|
||||||
// see:
|
// see: https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
|
||||||
// https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
|
|
||||||
jvmArgs.set(
|
jvmArgs.set(
|
||||||
listOf(
|
listOf(
|
||||||
// one JVM arg per list element doesn't work, but the following does
|
// one JVM arg per list element doesn't work, but the following does
|
||||||
@@ -49,13 +33,16 @@ jmh {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
includeTests.set(false)
|
includeTests.set(false)
|
||||||
// threads = Runtime.runtime.availableProcessors() / 2 + 1
|
//threads = Runtime.runtime.availableProcessors() / 2 + 1
|
||||||
// synchronizeIterations = false
|
//synchronizeIterations = false
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.named("jmh") { dependsOn(":installGraalVmAmd64") }
|
tasks.named("jmh") {
|
||||||
|
dependsOn(":installGraalVmAmd64")
|
||||||
|
}
|
||||||
|
|
||||||
// Prevent this error which occurs when building in IntelliJ:
|
// Prevent this error which occurs when building in IntelliJ:
|
||||||
// "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has
|
// "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has been set."
|
||||||
// been set."
|
tasks.processJmhResources {
|
||||||
tasks.processJmhResources { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||||
|
}
|
||||||
|
|||||||
+12
-13
@@ -2,15 +2,15 @@
|
|||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
com.tunnelvisionlabs:antlr4-runtime:4.9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
com.tunnelvisionlabs:antlr4-runtime:4.9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
net.bytebuddy:byte-buddy:1.14.18=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
org.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
org.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||||
org.assertj:assertj-core:3.26.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.graalvm.compiler:compiler:23.0.6=graal
|
org.graalvm.compiler:compiler:23.0.2=graal
|
||||||
org.graalvm.sdk:graal-sdk:23.0.6=graal,jmh,jmhRuntimeClasspath,truffle
|
org.graalvm.sdk:graal-sdk:23.0.2=graal,jmh,jmhRuntimeClasspath,truffle
|
||||||
org.graalvm.truffle:truffle-api:23.0.6=graal,jmh,jmhRuntimeClasspath,truffle
|
org.graalvm.truffle:truffle-api:23.0.2=graal,jmh,jmhRuntimeClasspath,truffle
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
@@ -26,13 +26,12 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplemen
|
|||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.jupiter:junit-jupiter-api:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-engine:5.11.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-engine:5.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-params:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.platform:junit-platform-commons:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.platform:junit-platform-engine:1.11.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-engine:1.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit:junit-bom:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.msgpack:msgpack-core:0.9.8=jmh,jmhRuntimeClasspath
|
|
||||||
org.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
org.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
org.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
org.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
org.openjdk.jmh:jmh-generator-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
org.openjdk.jmh:jmh-generator-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
@@ -41,4 +40,4 @@ org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenc
|
|||||||
org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath
|
org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath
|
||||||
org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||||
org.snakeyaml:snakeyaml-engine:2.5=jmh,jmhRuntimeClasspath
|
org.snakeyaml:snakeyaml-engine:2.5=jmh,jmhRuntimeClasspath
|
||||||
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDef,jmhKotlinScriptDefExtensions,jmhRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
|
empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileClasspath,compileOnly,compileOnlyDependenciesMetadata,default,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompile,jmhCompileOnly,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDef,jmhKotlinScriptDefExtensions,jmhRuntime,jmhRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeClasspath,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -50,8 +50,7 @@ public class ListSort {
|
|||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
IoUtils.getCurrentWorkingDir(),
|
IoUtils.getCurrentWorkingDir(),
|
||||||
StackFrameTransformers.defaultTransformer,
|
StackFrameTransformers.defaultTransformer);
|
||||||
false);
|
|
||||||
private static final List<Object> list = new ArrayList<>(100000);
|
private static final List<Object> list = new ArrayList<>(100000);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
+9
-23
@@ -1,20 +1,5 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
// https://youtrack.jetbrains.com/issue/KTIJ-19369
|
// https://youtrack.jetbrains.com/issue/KTIJ-19369
|
||||||
@file:Suppress("DSL_SCOPE_VIOLATION")
|
@file:Suppress("DSL_SCOPE_VIOLATION")
|
||||||
|
|
||||||
import org.jetbrains.gradle.ext.ActionDelegationConfig
|
import org.jetbrains.gradle.ext.ActionDelegationConfig
|
||||||
import org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM
|
import org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM
|
||||||
@@ -55,12 +40,15 @@ idea {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val clean by tasks.existing { delete(layout.buildDirectory) }
|
val clean by tasks.registering(Delete::class) {
|
||||||
|
delete(layout.buildDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
val printVersion by tasks.registering { doFirst { println(buildInfo.pklVersion) } }
|
val printVersion by tasks.registering {
|
||||||
|
doFirst { println(buildInfo.pklVersion) }
|
||||||
|
}
|
||||||
|
|
||||||
val message =
|
val message = """
|
||||||
"""
|
|
||||||
====
|
====
|
||||||
Gradle version : ${gradle.gradleVersion}
|
Gradle version : ${gradle.gradleVersion}
|
||||||
Java version : ${System.getProperty("java.version")}
|
Java version : ${System.getProperty("java.version")}
|
||||||
@@ -75,7 +63,5 @@ Git Commit ID : ${buildInfo.commitId}
|
|||||||
====
|
====
|
||||||
"""
|
"""
|
||||||
|
|
||||||
val formattedMessage =
|
val formattedMessage = message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
|
||||||
message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
|
|
||||||
|
|
||||||
logger.info(formattedMessage)
|
logger.info(formattedMessage)
|
||||||
|
|||||||
+17
-18
@@ -1,24 +1,15 @@
|
|||||||
/*
|
import org.jetbrains.kotlin.config.JvmTarget
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
plugins {
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
`kotlin-dsl`
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
plugins { `kotlin-dsl` }
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(libs.downloadTaskPlugin)
|
implementation(libs.downloadTaskPlugin)
|
||||||
implementation(libs.spotlessPlugin)
|
implementation(libs.spotlessPlugin)
|
||||||
implementation(libs.kotlinPlugin) { exclude(module = "kotlin-android-extensions") }
|
implementation(libs.kotlinPlugin) {
|
||||||
|
exclude(module = "kotlin-android-extensions")
|
||||||
|
}
|
||||||
implementation(libs.shadowPlugin)
|
implementation(libs.shadowPlugin)
|
||||||
|
|
||||||
// fix from the Gradle team: makes version catalog symbols available in build scripts
|
// fix from the Gradle team: makes version catalog symbols available in build scripts
|
||||||
@@ -31,4 +22,12 @@ java {
|
|||||||
targetCompatibility = JavaVersion.VERSION_17
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin { target { compilations.configureEach { kotlinOptions { jvmTarget = "17" } } } }
|
kotlin {
|
||||||
|
target {
|
||||||
|
compilations.configureEach {
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
@file:Suppress("UnstableApiUsage")
|
@file:Suppress("UnstableApiUsage")
|
||||||
|
|
||||||
rootProject.name = "buildSrc"
|
rootProject.name = "buildSrc"
|
||||||
@@ -27,7 +12,11 @@ pluginManagement {
|
|||||||
// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional
|
// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
// use same version catalog as main build
|
// use same version catalog as main build
|
||||||
versionCatalogs { register("libs") { from(files("../gradle/libs.versions.toml")) } }
|
versionCatalogs {
|
||||||
|
register("libs") {
|
||||||
|
from(files("../gradle/libs.versions.toml"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
|
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
@file:Suppress("MemberVisibilityCanBePrivate")
|
@file:Suppress("MemberVisibilityCanBePrivate")
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -29,9 +14,13 @@ open class BuildInfo(project: Project) {
|
|||||||
System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm"
|
System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm"
|
||||||
}
|
}
|
||||||
|
|
||||||
val version: String by lazy { libs.findVersion("graalVm").get().toString() }
|
val version: String by lazy {
|
||||||
|
libs.findVersion("graalVm").get().toString()
|
||||||
|
}
|
||||||
|
|
||||||
val graalVmJdkVersion: String by lazy { libs.findVersion("graalVmJdkVersion").get().toString() }
|
val graalVmJdkVersion: String by lazy {
|
||||||
|
libs.findVersion("graalVmJdkVersion").get().toString()
|
||||||
|
}
|
||||||
|
|
||||||
val osName: String by lazy {
|
val osName: String by lazy {
|
||||||
when {
|
when {
|
||||||
@@ -42,7 +31,9 @@ open class BuildInfo(project: Project) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val baseName: String by lazy { "graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin" }
|
val baseName: String by lazy {
|
||||||
|
"graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin"
|
||||||
|
}
|
||||||
|
|
||||||
val downloadUrl: String by lazy {
|
val downloadUrl: String by lazy {
|
||||||
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' }
|
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' }
|
||||||
@@ -50,14 +41,18 @@ open class BuildInfo(project: Project) {
|
|||||||
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension"
|
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension"
|
||||||
}
|
}
|
||||||
|
|
||||||
val installDir: File by lazy { File(homeDir, baseName) }
|
val installDir: File by lazy {
|
||||||
|
File(homeDir, baseName)
|
||||||
|
}
|
||||||
|
|
||||||
val baseDir: String by lazy {
|
val baseDir: String by lazy {
|
||||||
if (os.isMacOsX) "$installDir/Contents/Home" else installDir.toString()
|
if (os.isMacOsX) "$installDir/Contents/Home" else installDir.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected. */
|
/**
|
||||||
|
* Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected.
|
||||||
|
*/
|
||||||
val arch: String by lazy {
|
val arch: String by lazy {
|
||||||
when (val arch = System.getProperty("os.arch")) {
|
when (val arch = System.getProperty("os.arch")) {
|
||||||
"x86" -> "i386"
|
"x86" -> "i386"
|
||||||
@@ -71,9 +66,13 @@ open class BuildInfo(project: Project) {
|
|||||||
|
|
||||||
val graalVmAmd64: GraalVm = GraalVm("x64")
|
val graalVmAmd64: GraalVm = GraalVm("x64")
|
||||||
|
|
||||||
val isCiBuild: Boolean by lazy { System.getenv("CI") != null }
|
val isCiBuild: Boolean by lazy {
|
||||||
|
System.getenv("CI") != null
|
||||||
|
}
|
||||||
|
|
||||||
val isReleaseBuild: Boolean by lazy { java.lang.Boolean.getBoolean("releaseBuild") }
|
val isReleaseBuild: Boolean by lazy {
|
||||||
|
java.lang.Boolean.getBoolean("releaseBuild")
|
||||||
|
}
|
||||||
|
|
||||||
val hasMuslToolchain: Boolean by lazy {
|
val hasMuslToolchain: Boolean by lazy {
|
||||||
// see "install musl" in .circleci/jobs/BuildNativeJob.pkl
|
// see "install musl" in .circleci/jobs/BuildNativeJob.pkl
|
||||||
@@ -88,11 +87,10 @@ open class BuildInfo(project: Project) {
|
|||||||
val commitId: String by lazy {
|
val commitId: String by lazy {
|
||||||
// only run command once per build invocation
|
// only run command once per build invocation
|
||||||
if (project === project.rootProject) {
|
if (project === project.rootProject) {
|
||||||
val process =
|
val process = ProcessBuilder()
|
||||||
ProcessBuilder()
|
.command("git", "rev-parse", "--short", "HEAD")
|
||||||
.command("git", "rev-parse", "--short", "HEAD")
|
.directory(project.rootDir)
|
||||||
.directory(project.rootDir)
|
.start()
|
||||||
.start()
|
|
||||||
process.waitFor().also { exitCode ->
|
process.waitFor().also { exitCode ->
|
||||||
if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())
|
if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())
|
||||||
}
|
}
|
||||||
@@ -102,7 +100,9 @@ open class BuildInfo(project: Project) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val commitish: String by lazy { if (isReleaseBuild) project.version.toString() else commitId }
|
val commitish: String by lazy {
|
||||||
|
if (isReleaseBuild) project.version.toString() else commitId
|
||||||
|
}
|
||||||
|
|
||||||
val pklVersion: String by lazy {
|
val pklVersion: String by lazy {
|
||||||
if (isReleaseBuild) {
|
if (isReleaseBuild) {
|
||||||
|
|||||||
@@ -1,52 +1,39 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.file.RegularFileProperty
|
import org.gradle.api.file.RegularFileProperty
|
||||||
import org.gradle.api.provider.ListProperty
|
import org.gradle.api.provider.ListProperty
|
||||||
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.tasks.Input
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.InputFile
|
import org.gradle.api.tasks.InputFile
|
||||||
import org.gradle.api.tasks.OutputFile
|
import org.gradle.api.tasks.OutputFile
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a self-contained Pkl CLI Jar that is directly executable on *nix and executable with `java
|
* Builds a self-contained Pkl CLI Jar that is directly executable on *nix
|
||||||
* -jar` on Windows.
|
* and executable with `java -jar` on Windows.
|
||||||
*
|
*
|
||||||
* For direct execution, the `java` command must be on the PATH.
|
* For direct execution, the `java` command must be on the PATH.
|
||||||
*
|
*
|
||||||
* https://skife.org/java/unix/2011/06/20/really_executable_jars.html
|
* https://skife.org/java/unix/2011/06/20/really_executable_jars.html
|
||||||
*/
|
*/
|
||||||
abstract class ExecutableJar : DefaultTask() {
|
abstract class ExecutableJar : DefaultTask() {
|
||||||
@get:InputFile abstract val inJar: RegularFileProperty
|
@get:InputFile
|
||||||
|
abstract val inJar: RegularFileProperty
|
||||||
|
|
||||||
@get:OutputFile abstract val outJar: RegularFileProperty
|
@get:OutputFile
|
||||||
|
abstract val outJar: RegularFileProperty
|
||||||
|
|
||||||
@get:Input abstract val jvmArgs: ListProperty<String>
|
@get:Input
|
||||||
|
abstract val jvmArgs: ListProperty<String>
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun buildJar() {
|
fun buildJar() {
|
||||||
val inFile = inJar.get().asFile
|
val inFile = inJar.get().asFile
|
||||||
val outFile = outJar.get().asFile
|
val outFile = outJar.get().asFile
|
||||||
val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" }
|
val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" }
|
||||||
val startScript =
|
val startScript = """
|
||||||
"""
|
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
exec java $escapedJvmArgs -jar $0 "$@"
|
exec java $escapedJvmArgs -jar $0 "$@"
|
||||||
"""
|
""".trimIndent() + "\n\n\n"
|
||||||
.trimIndent() + "\n\n\n"
|
|
||||||
outFile.outputStream().use { outStream ->
|
outFile.outputStream().use { outStream ->
|
||||||
startScript.byteInputStream().use { it.copyTo(outStream) }
|
startScript.byteInputStream().use { it.copyTo(outStream) }
|
||||||
inFile.inputStream().use { it.copyTo(outStream) }
|
inFile.inputStream().use { it.copyTo(outStream) }
|
||||||
|
|||||||
@@ -1,22 +1,7 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.util.GradleVersion
|
import org.gradle.util.GradleVersion
|
||||||
|
|
||||||
open class GradlePluginTests {
|
open class GradlePluginTests {
|
||||||
lateinit var minGradleVersion: GradleVersion
|
lateinit var minGradleVersion: GradleVersion
|
||||||
lateinit var maxGradleVersion: GradleVersion
|
lateinit var maxGradleVersion: GradleVersion
|
||||||
var skippedGradleVersions: List<GradleVersion> = listOf()
|
var skippedGradleVersions: List<GradleVersion> = listOf()
|
||||||
}
|
}
|
||||||
@@ -1,21 +1,6 @@
|
|||||||
/*
|
import org.gradle.util.GradleVersion
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import groovy.json.JsonSlurper
|
import groovy.json.JsonSlurper
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
import org.gradle.util.GradleVersion
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class GradleVersionInfo(json: Map<String, Any>) {
|
class GradleVersionInfo(json: Map<String, Any>) {
|
||||||
@@ -53,19 +38,15 @@ class GradleVersionInfo(json: Map<String, Any>) {
|
|||||||
val wrapperChecksumUrl: String by json
|
val wrapperChecksumUrl: String by json
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private fun fetchAll(): List<GradleVersionInfo> =
|
private fun fetchAll(): List<GradleVersionInfo> = fetchMultiple("https://services.gradle.org/versions/all")
|
||||||
fetchMultiple("https://services.gradle.org/versions/all")
|
|
||||||
|
|
||||||
fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion }
|
fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion }
|
||||||
|
|
||||||
fun fetchCurrent(): GradleVersionInfo =
|
fun fetchCurrent(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/current")
|
||||||
fetchSingle("https://services.gradle.org/versions/current")
|
|
||||||
|
|
||||||
fun fetchRc(): GradleVersionInfo? =
|
fun fetchRc(): GradleVersionInfo? = fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
|
||||||
fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
|
|
||||||
|
|
||||||
fun fetchNightly(): GradleVersionInfo =
|
fun fetchNightly(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/nightly")
|
||||||
fetchSingle("https://services.gradle.org/versions/nightly")
|
|
||||||
|
|
||||||
private fun fetchSingle(url: String): GradleVersionInfo {
|
private fun fetchSingle(url: String): GradleVersionInfo {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@@ -80,9 +61,8 @@ class GradleVersionInfo(json: Map<String, Any>) {
|
|||||||
|
|
||||||
private fun fetchMultiple(url: String): List<GradleVersionInfo> {
|
private fun fetchMultiple(url: String): List<GradleVersionInfo> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>).map {
|
return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>)
|
||||||
GradleVersionInfo(it)
|
.map { GradleVersionInfo(it) }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,6 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
|
|
||||||
open class HtmlValidator(project: Project) {
|
open class HtmlValidator(project: Project) {
|
||||||
var sources: FileCollection = project.files()
|
var sources: FileCollection = project.files()
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.regex.Matcher
|
import java.util.regex.Matcher
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
@@ -30,18 +15,21 @@ import org.gradle.kotlin.dsl.listProperty
|
|||||||
import org.gradle.kotlin.dsl.mapProperty
|
import org.gradle.kotlin.dsl.mapProperty
|
||||||
|
|
||||||
open class MergeSourcesJars : DefaultTask() {
|
open class MergeSourcesJars : DefaultTask() {
|
||||||
@get:InputFiles val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
|
@get:InputFiles
|
||||||
|
val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
|
||||||
|
|
||||||
@get:InputFiles
|
@get:InputFiles
|
||||||
val mergedBinaryJars: ConfigurableFileCollection = project.objects.fileCollection()
|
val mergedBinaryJars: ConfigurableFileCollection = project.objects.fileCollection()
|
||||||
|
|
||||||
@get:Input val relocatedPackages: MapProperty<String, String> = project.objects.mapProperty()
|
@get:Input
|
||||||
|
val relocatedPackages: MapProperty<String, String> = project.objects.mapProperty()
|
||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
var sourceFileExtensions: ListProperty<String> =
|
var sourceFileExtensions: ListProperty<String> = project.objects.listProperty<String>()
|
||||||
project.objects.listProperty<String>().convention(listOf(".java", ".kt"))
|
.convention(listOf(".java", ".kt"))
|
||||||
|
|
||||||
@get:OutputFile val outputJar: RegularFileProperty = project.objects.fileProperty()
|
@get:OutputFile
|
||||||
|
val outputJar: RegularFileProperty = project.objects.fileProperty()
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@@ -50,15 +38,12 @@ open class MergeSourcesJars : DefaultTask() {
|
|||||||
|
|
||||||
val relocatedPkgs = relocatedPackages.get()
|
val relocatedPkgs = relocatedPackages.get()
|
||||||
|
|
||||||
val relocatedPaths =
|
val relocatedPaths = relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
|
||||||
relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
|
|
||||||
|
|
||||||
// use negative lookbehind to match any that don't precede with
|
// use negative lookbehind to match any that don't precede with
|
||||||
// a word or a period character. should catch most cases.
|
// a word or a period character. should catch most cases.
|
||||||
val importPattern =
|
val importPattern = Pattern.compile("(?<!(\\w|\\.))(" +
|
||||||
Pattern.compile(
|
relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")")
|
||||||
"(?<!(\\w|\\.))(" + relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")"
|
|
||||||
)
|
|
||||||
|
|
||||||
val sourceFileExts = sourceFileExtensions.get()
|
val sourceFileExts = sourceFileExtensions.get()
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.artifacts.Configuration
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.artifacts.result.ResolvedArtifactResult
|
import org.gradle.api.artifacts.result.ResolvedArtifactResult
|
||||||
@@ -27,29 +12,27 @@ import org.gradle.kotlin.dsl.property
|
|||||||
import org.gradle.language.base.artifact.SourcesArtifact
|
import org.gradle.language.base.artifact.SourcesArtifact
|
||||||
|
|
||||||
open class ResolveSourcesJars : DefaultTask() {
|
open class ResolveSourcesJars : DefaultTask() {
|
||||||
@get:InputFiles val configuration: Property<Configuration> = project.objects.property()
|
@get:InputFiles
|
||||||
|
val configuration: Property<Configuration> = project.objects.property()
|
||||||
|
|
||||||
@get:OutputDirectory val outputDir: DirectoryProperty = project.objects.directoryProperty()
|
@get:OutputDirectory
|
||||||
|
val outputDir: DirectoryProperty = project.objects.directoryProperty()
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
@Suppress("UnstableApiUsage", "unused")
|
@Suppress("UnstableApiUsage", "unused")
|
||||||
fun resolve() {
|
fun resolve() {
|
||||||
val componentIds =
|
val componentIds = configuration.get().incoming.resolutionResult.allDependencies.map {
|
||||||
configuration.get().incoming.resolutionResult.allDependencies.map {
|
(it as ResolvedDependencyResult).selected.id
|
||||||
(it as ResolvedDependencyResult).selected.id
|
}
|
||||||
}
|
|
||||||
|
|
||||||
val resolutionResult =
|
val resolutionResult = project.dependencies.createArtifactResolutionQuery()
|
||||||
project.dependencies
|
.forComponents(componentIds)
|
||||||
.createArtifactResolutionQuery()
|
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
|
||||||
.forComponents(componentIds)
|
.execute()
|
||||||
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
val resolvedJars =
|
val resolvedJars = resolutionResult.resolvedComponents
|
||||||
resolutionResult.resolvedComponents
|
.flatMap { it.getArtifacts(SourcesArtifact::class.java) }
|
||||||
.flatMap { it.getArtifacts(SourcesArtifact::class.java) }
|
.map { (it as ResolvedArtifactResult).file }
|
||||||
.map { (it as ResolvedArtifactResult).file }
|
|
||||||
|
|
||||||
// copying to an output dir because I don't know how else to describe task outputs
|
// copying to an output dir because I don't know how else to describe task outputs
|
||||||
project.sync {
|
project.sync {
|
||||||
|
|||||||
@@ -1,27 +1,10 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import com.diffplug.gradle.spotless.KotlinGradleExtension
|
|
||||||
import org.gradle.accessors.dm.LibrariesForLibs
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
|
|
||||||
plugins { id("com.diffplug.spotless") }
|
|
||||||
|
|
||||||
val buildInfo = extensions.create<BuildInfo>("buildInfo", project)
|
val buildInfo = extensions.create<BuildInfo>("buildInfo", project)
|
||||||
|
|
||||||
dependencyLocking { lockAllConfigurations() }
|
dependencyLocking {
|
||||||
|
lockAllConfigurations()
|
||||||
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE)
|
val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE)
|
||||||
@@ -30,10 +13,8 @@ configurations {
|
|||||||
componentSelection {
|
componentSelection {
|
||||||
all {
|
all {
|
||||||
if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {
|
if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {
|
||||||
reject(
|
reject("Rejected dependency $candidate " +
|
||||||
"Rejected dependency $candidate " +
|
"because it has a prelease version suffix matching `$rejectedVersionSuffix`.")
|
||||||
"because it has a prelease version suffix matching `$rejectedVersionSuffix`."
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,13 +36,24 @@ tasks.withType<KotlinCompile>().configureEach {
|
|||||||
}
|
}
|
||||||
|
|
||||||
plugins.withType(IdeaPlugin::class).configureEach {
|
plugins.withType(IdeaPlugin::class).configureEach {
|
||||||
val errorMessage =
|
val errorMessage = "Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
|
||||||
"Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
|
|
||||||
|
|
||||||
tasks.named("idea") { doFirst { throw GradleException(errorMessage) } }
|
tasks.named("idea") {
|
||||||
tasks.named("ideaModule") { doFirst { throw GradleException(errorMessage) } }
|
doFirst {
|
||||||
|
throw GradleException(errorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tasks.named("ideaModule") {
|
||||||
|
doFirst {
|
||||||
|
throw GradleException(errorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
if (project == rootProject) {
|
if (project == rootProject) {
|
||||||
tasks.named("ideaProject") { doFirst { throw GradleException(errorMessage) } }
|
tasks.named("ideaProject") {
|
||||||
|
doFirst {
|
||||||
|
throw GradleException(errorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +72,11 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
|
|||||||
// dependency versions in generated POMs
|
// dependency versions in generated POMs
|
||||||
publications {
|
publications {
|
||||||
withType(MavenPublication::class.java) {
|
withType(MavenPublication::class.java) {
|
||||||
versionMapping { allVariants { fromResolutionResult() } }
|
versionMapping {
|
||||||
|
allVariants {
|
||||||
|
fromResolutionResult()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,10 +84,13 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
|
|||||||
|
|
||||||
// settings.gradle.kts sets `--write-locks`
|
// settings.gradle.kts sets `--write-locks`
|
||||||
// if Gradle command line contains this task name
|
// if Gradle command line contains this task name
|
||||||
val updateDependencyLocks by
|
val updateDependencyLocks by tasks.registering {
|
||||||
tasks.registering {
|
doLast {
|
||||||
doLast { configurations.filter { it.isCanBeResolved }.forEach { it.resolve() } }
|
configurations
|
||||||
|
.filter { it.isCanBeResolved }
|
||||||
|
.forEach { it.resolve() }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val allDependencies by tasks.registering(DependencyReportTask::class)
|
val allDependencies by tasks.registering(DependencyReportTask::class)
|
||||||
|
|
||||||
@@ -119,37 +118,3 @@ tasks.withType(JavaExec::class).configureEach {
|
|||||||
server = true
|
server = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Version Catalog library symbols.
|
|
||||||
private val libs = the<LibrariesForLibs>()
|
|
||||||
|
|
||||||
private val licenseHeaderFile by lazy {
|
|
||||||
rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun KotlinGradleExtension.configureFormatter() {
|
|
||||||
ktfmt(libs.versions.ktfmt.get()).googleStyle()
|
|
||||||
licenseHeaderFile(licenseHeaderFile, "([a-zA-Z]|@file|//)")
|
|
||||||
}
|
|
||||||
|
|
||||||
spotless {
|
|
||||||
// When building root project, format buildSrc files too.
|
|
||||||
// We need this because buildSrc is not a subproject of the root project, so a top-level
|
|
||||||
// `spotlessApply` will not trigger `buildSrc:spotlessApply`.
|
|
||||||
if (project === rootProject) {
|
|
||||||
kotlinGradle {
|
|
||||||
configureFormatter()
|
|
||||||
target("*.kts", "buildSrc/*.kts", "buildSrc/src/*/kotlin/**/*.kts")
|
|
||||||
}
|
|
||||||
kotlin {
|
|
||||||
ktfmt(libs.versions.ktfmt.get()).googleStyle()
|
|
||||||
target("buildSrc/src/*/kotlin/**/*.kt")
|
|
||||||
licenseHeaderFile(licenseHeaderFile)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
kotlinGradle {
|
|
||||||
configureFormatter()
|
|
||||||
target("*.kts")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.api.GradleException
|
import org.gradle.api.GradleException
|
||||||
import org.gradle.api.artifacts.Configuration
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.component.AdhocComponentWithVariants
|
import org.gradle.api.component.AdhocComponentWithVariants
|
||||||
@@ -33,43 +18,41 @@ val fatJarConfiguration: Configuration = configurations.create("fatJar")
|
|||||||
val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar")
|
val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar")
|
||||||
|
|
||||||
// ideally we'd configure this automatically based on project dependencies
|
// ideally we'd configure this automatically based on project dependencies
|
||||||
val firstPartySourcesJarsConfiguration: Configuration =
|
val firstPartySourcesJarsConfiguration: Configuration = configurations.create("firstPartySourcesJars")
|
||||||
configurations.create("firstPartySourcesJars")
|
|
||||||
|
|
||||||
val relocations =
|
val relocations = mapOf(
|
||||||
mapOf(
|
// pkl-core dependencies
|
||||||
// pkl-core dependencies
|
"org.antlr.v4." to "org.pkl.thirdparty.antlr.v4.",
|
||||||
"org.antlr.v4." to "org.pkl.thirdparty.antlr.v4.",
|
"com.oracle.truffle" to "org.pkl.thirdparty.truffle",
|
||||||
"com.oracle.truffle" to "org.pkl.thirdparty.truffle",
|
"org.graalvm." to "org.pkl.thirdparty.graalvm.",
|
||||||
"org.graalvm." to "org.pkl.thirdparty.graalvm.",
|
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
|
||||||
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
|
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
|
||||||
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
|
"org.msgpack." to "org.pkl.thirdparty.msgpack.",
|
||||||
"org.msgpack." to "org.pkl.thirdparty.msgpack.",
|
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom",
|
||||||
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom",
|
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
|
||||||
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
|
|
||||||
|
|
||||||
// pkl-cli dependencies
|
// pkl-cli dependencies
|
||||||
"org.jline." to "org.pkl.thirdparty.jline.",
|
"org.jline." to "org.pkl.thirdparty.jline.",
|
||||||
"com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.",
|
"com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.",
|
||||||
"kotlin." to "org.pkl.thirdparty.kotlin.",
|
"kotlin." to "org.pkl.thirdparty.kotlin.",
|
||||||
"kotlinx." to "org.pkl.thirdparty.kotlinx.",
|
"kotlinx." to "org.pkl.thirdparty.kotlinx.",
|
||||||
"org.intellij." to "org.pkl.thirdparty.intellij.",
|
"org.intellij." to "org.pkl.thirdparty.intellij.",
|
||||||
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi",
|
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi",
|
||||||
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni",
|
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni",
|
||||||
|
|
||||||
// pkl-doc dependencies
|
// pkl-doc dependencies
|
||||||
"org.commonmark." to "org.pkl.thirdparty.commonmark.",
|
"org.commonmark." to "org.pkl.thirdparty.commonmark.",
|
||||||
"org.jetbrains." to "org.pkl.thirdparty.jetbrains.",
|
"org.jetbrains." to "org.pkl.thirdparty.jetbrains.",
|
||||||
|
|
||||||
|
// pkl-config-java dependencies
|
||||||
|
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
|
||||||
|
|
||||||
// pkl-config-java dependencies
|
// pkl-codegen-java dependencies
|
||||||
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
|
"com.squareup.javapoet." to "org.pkl.thirdparty.javapoet.",
|
||||||
|
|
||||||
// pkl-codegen-java dependencies
|
// pkl-codegen-kotlin dependencies
|
||||||
"com.squareup.javapoet." to "org.pkl.thirdparty.javapoet.",
|
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
|
||||||
|
)
|
||||||
// pkl-codegen-kotlin dependencies
|
|
||||||
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
|
|
||||||
)
|
|
||||||
|
|
||||||
val nonRelocations = listOf("com/oracle/truffle/")
|
val nonRelocations = listOf("com/oracle/truffle/")
|
||||||
|
|
||||||
@@ -99,81 +82,82 @@ tasks.shadowJar {
|
|||||||
|
|
||||||
// workaround for https://github.com/johnrengelman/shadow/issues/651
|
// workaround for https://github.com/johnrengelman/shadow/issues/651
|
||||||
components.withType(AdhocComponentWithVariants::class.java).forEach { c ->
|
components.withType(AdhocComponentWithVariants::class.java).forEach { c ->
|
||||||
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() }
|
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) {
|
||||||
|
skip()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val testFatJar by
|
val testFatJar by tasks.registering(Test::class) {
|
||||||
tasks.registering(Test::class) {
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
||||||
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
classpath =
|
||||||
classpath =
|
// compiled test classes
|
||||||
// compiled test classes
|
sourceSets.test.get().output +
|
||||||
sourceSets.test.get().output +
|
// fat Jar
|
||||||
// fat Jar
|
tasks.shadowJar.get().outputs.files +
|
||||||
tasks.shadowJar.get().outputs.files +
|
// test-only dependencies
|
||||||
// test-only dependencies
|
// (test dependencies that are also main dependencies must already be contained in fat Jar;
|
||||||
// (test dependencies that are also main dependencies must already be contained in fat Jar;
|
// to verify that, we don't want to include them here)
|
||||||
// to verify that, we don't want to include them here)
|
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
||||||
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tasks.check { dependsOn(testFatJar) }
|
tasks.check {
|
||||||
|
dependsOn(testFatJar)
|
||||||
|
}
|
||||||
|
|
||||||
val validateFatJar by
|
val validateFatJar by tasks.registering {
|
||||||
tasks.registering {
|
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
|
||||||
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
|
inputs.files(tasks.shadowJar)
|
||||||
inputs.files(tasks.shadowJar)
|
inputs.property("nonRelocations", nonRelocations)
|
||||||
inputs.property("nonRelocations", nonRelocations)
|
outputs.file(outputFile)
|
||||||
outputs.file(outputFile)
|
|
||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
val unshadowedFiles = mutableListOf<String>()
|
val unshadowedFiles = mutableListOf<String>()
|
||||||
zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {
|
zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {
|
||||||
val fileDetails = this
|
val fileDetails = this
|
||||||
val path = fileDetails.relativePath.pathString
|
val path = fileDetails.relativePath.pathString
|
||||||
if (
|
if (!(fileDetails.isDirectory ||
|
||||||
!(fileDetails.isDirectory ||
|
path.startsWith("org/pkl/") ||
|
||||||
path.startsWith("org/pkl/") ||
|
path.startsWith("META-INF/") ||
|
||||||
path.startsWith("META-INF/") ||
|
nonRelocations.any { path.startsWith(it) })) {
|
||||||
nonRelocations.any { path.startsWith(it) })
|
// don't throw exception inside `visit`
|
||||||
) {
|
// as this gives a misleading "Could not expand ZIP" error message
|
||||||
// don't throw exception inside `visit`
|
unshadowedFiles.add(path)
|
||||||
// as this gives a misleading "Could not expand ZIP" error message
|
|
||||||
unshadowedFiles.add(path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (unshadowedFiles.isEmpty()) {
|
|
||||||
outputFile.get().asFile.writeText("SUCCESS")
|
|
||||||
} else {
|
|
||||||
outputFile.get().asFile.writeText("FAILURE")
|
|
||||||
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (unshadowedFiles.isEmpty()) {
|
||||||
|
outputFile.get().asFile.writeText("SUCCESS")
|
||||||
|
} else {
|
||||||
|
outputFile.get().asFile.writeText("FAILURE")
|
||||||
|
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
tasks.check {
|
||||||
|
dependsOn(validateFatJar)
|
||||||
|
}
|
||||||
|
|
||||||
tasks.check { dependsOn(validateFatJar) }
|
val resolveSourcesJars by tasks.registering(ResolveSourcesJars::class) {
|
||||||
|
configuration.set(configurations.runtimeClasspath)
|
||||||
|
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
|
||||||
|
}
|
||||||
|
|
||||||
val resolveSourcesJars by
|
val fatSourcesJar by tasks.registering(MergeSourcesJars::class) {
|
||||||
tasks.registering(ResolveSourcesJars::class) {
|
plugins.withId("pklJavaLibrary") {
|
||||||
configuration.set(configurations.runtimeClasspath)
|
inputJars.from(tasks.named("sourcesJar"))
|
||||||
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
|
|
||||||
}
|
}
|
||||||
|
inputJars.from(firstPartySourcesJarsConfiguration)
|
||||||
|
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
|
||||||
|
|
||||||
val fatSourcesJar by
|
mergedBinaryJars.from(tasks.shadowJar)
|
||||||
tasks.registering(MergeSourcesJars::class) {
|
relocatedPackages.set(relocations)
|
||||||
plugins.withId("pklJavaLibrary") { inputJars.from(tasks.named("sourcesJar")) }
|
outputJar.fileProvider(provider {
|
||||||
inputJars.from(firstPartySourcesJarsConfiguration)
|
file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar"))
|
||||||
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
|
})
|
||||||
|
}
|
||||||
|
|
||||||
mergedBinaryJars.from(tasks.shadowJar)
|
artifacts {
|
||||||
relocatedPackages.set(relocations)
|
add("fatJar", tasks.shadowJar)
|
||||||
outputJar.fileProvider(
|
}
|
||||||
provider {
|
|
||||||
file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar"))
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
artifacts { add("fatJar", tasks.shadowJar) }
|
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
@@ -181,12 +165,16 @@ publishing {
|
|||||||
project.shadow.component(this)
|
project.shadow.component(this)
|
||||||
|
|
||||||
// sources Jar is fat
|
// sources Jar is fat
|
||||||
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) { classifier = "sources" }
|
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) {
|
||||||
|
classifier = "sources"
|
||||||
|
}
|
||||||
|
|
||||||
plugins.withId("pklJavaLibrary") {
|
plugins.withId("pklJavaLibrary") {
|
||||||
val javadocJar by tasks.existing(Jar::class)
|
val javadocJar by tasks.existing(Jar::class)
|
||||||
// Javadoc Jar is not fat (didn't invest effort)
|
// Javadoc Jar is not fat (didn't invest effort)
|
||||||
artifact(javadocJar.flatMap { it.archiveFile }) { classifier = "javadoc" }
|
artifact(javadocJar.flatMap { it.archiveFile }) {
|
||||||
|
classifier = "javadoc"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,36 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import de.undercouch.gradle.tasks.download.Download
|
|
||||||
import de.undercouch.gradle.tasks.download.Verify
|
|
||||||
import java.nio.file.*
|
import java.nio.file.*
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
import de.undercouch.gradle.tasks.download.Download
|
||||||
|
import de.undercouch.gradle.tasks.download.Verify
|
||||||
import kotlin.io.path.createDirectories
|
import kotlin.io.path.createDirectories
|
||||||
|
|
||||||
plugins { id("de.undercouch.download") }
|
plugins {
|
||||||
|
id("de.undercouch.download")
|
||||||
|
}
|
||||||
|
|
||||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||||
|
|
||||||
val BuildInfo.GraalVm.downloadFile
|
val BuildInfo.GraalVm.downloadFile get(): File {
|
||||||
get(): File {
|
val extension = if (buildInfo.os.isWindows) "zip" else "tar.gz"
|
||||||
val extension = if (buildInfo.os.isWindows) "zip" else "tar.gz"
|
return file(homeDir).resolve("${baseName}.$extension")
|
||||||
return file(homeDir).resolve("${baseName}.$extension")
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// tries to minimize chance of corruption by download-to-temp-file-and-move
|
// tries to minimize chance of corruption by download-to-temp-file-and-move
|
||||||
val downloadGraalVmAarch64 by
|
val downloadGraalVmAarch64 by tasks.registering(Download::class) {
|
||||||
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAarch64) }
|
configureDownloadGraalVm(buildInfo.graalVmAarch64)
|
||||||
|
}
|
||||||
|
|
||||||
val downloadGraalVmAmd64 by
|
val downloadGraalVmAmd64 by tasks.registering(Download::class) {
|
||||||
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAmd64) }
|
configureDownloadGraalVm(buildInfo.graalVmAmd64)
|
||||||
|
}
|
||||||
|
|
||||||
fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
|
fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
|
||||||
onlyIf { !graalvm.installDir.exists() }
|
onlyIf {
|
||||||
doLast { println("Downloaded GraalVm to ${graalvm.downloadFile}") }
|
!graalvm.installDir.exists()
|
||||||
|
}
|
||||||
|
doLast {
|
||||||
|
println("Downloaded GraalVm to ${graalvm.downloadFile}")
|
||||||
|
}
|
||||||
|
|
||||||
src(graalvm.downloadUrl)
|
src(graalvm.downloadUrl)
|
||||||
dest(graalvm.downloadFile)
|
dest(graalvm.downloadFile)
|
||||||
@@ -46,44 +38,42 @@ fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
|
|||||||
tempAndMove(true)
|
tempAndMove(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
val verifyGraalVmAarch64 by
|
val verifyGraalVmAarch64 by tasks.registering(Verify::class) {
|
||||||
tasks.registering(Verify::class) {
|
configureVerifyGraalVm(buildInfo.graalVmAarch64)
|
||||||
configureVerifyGraalVm(buildInfo.graalVmAarch64)
|
dependsOn(downloadGraalVmAarch64)
|
||||||
dependsOn(downloadGraalVmAarch64)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
val verifyGraalVmAmd64 by
|
val verifyGraalVmAmd64 by tasks.registering(Verify::class) {
|
||||||
tasks.registering(Verify::class) {
|
configureVerifyGraalVm(buildInfo.graalVmAmd64)
|
||||||
configureVerifyGraalVm(buildInfo.graalVmAmd64)
|
dependsOn(downloadGraalVmAmd64)
|
||||||
dependsOn(downloadGraalVmAmd64)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {
|
fun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {
|
||||||
onlyIf { !graalvm.installDir.exists() }
|
onlyIf {
|
||||||
|
!graalvm.installDir.exists()
|
||||||
|
}
|
||||||
|
|
||||||
src(graalvm.downloadFile)
|
src(graalvm.downloadFile)
|
||||||
checksum(
|
checksum(buildInfo.libs.findVersion("graalVmSha256-${graalvm.osName}-${graalvm.arch}").get().toString())
|
||||||
buildInfo.libs.findVersion("graalVmSha256-${graalvm.osName}-${graalvm.arch}").get().toString()
|
|
||||||
)
|
|
||||||
algorithm("SHA-256")
|
algorithm("SHA-256")
|
||||||
}
|
}
|
||||||
|
|
||||||
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
|
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
|
||||||
val installGraalVmAarch64 by
|
val installGraalVmAarch64 by tasks.registering {
|
||||||
tasks.registering {
|
dependsOn(verifyGraalVmAarch64)
|
||||||
dependsOn(verifyGraalVmAarch64)
|
configureInstallGraalVm(buildInfo.graalVmAarch64)
|
||||||
configureInstallGraalVm(buildInfo.graalVmAarch64)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
|
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
|
||||||
val installGraalVmAmd64 by
|
val installGraalVmAmd64 by tasks.registering {
|
||||||
tasks.registering {
|
dependsOn(verifyGraalVmAmd64)
|
||||||
dependsOn(verifyGraalVmAmd64)
|
configureInstallGraalVm(buildInfo.graalVmAmd64)
|
||||||
configureInstallGraalVm(buildInfo.graalVmAmd64)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun Task.configureInstallGraalVm(graalVm: BuildInfo.GraalVm) {
|
fun Task.configureInstallGraalVm(graalVm: BuildInfo.GraalVm) {
|
||||||
onlyIf { !graalVm.installDir.exists() }
|
onlyIf {
|
||||||
|
!graalVm.installDir.exists()
|
||||||
|
}
|
||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
val distroDir = Paths.get(graalVm.homeDir, UUID.randomUUID().toString())
|
val distroDir = Paths.get(graalVm.homeDir, UUID.randomUUID().toString())
|
||||||
@@ -98,9 +88,7 @@ fun Task.configureInstallGraalVm(graalVm: BuildInfo.GraalVm) {
|
|||||||
args("--strip-components=1", "-xzf", graalVm.downloadFile)
|
args("--strip-components=1", "-xzf", graalVm.downloadFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
val distroBinDir =
|
val distroBinDir = if (buildInfo.os.isMacOsX) distroDir.resolve("Contents/Home/bin") else distroDir.resolve("bin")
|
||||||
if (buildInfo.os.isMacOsX) distroDir.resolve("Contents/Home/bin")
|
|
||||||
else distroDir.resolve("bin")
|
|
||||||
|
|
||||||
println("Installing native-image into $distroDir")
|
println("Installing native-image into $distroDir")
|
||||||
exec {
|
exec {
|
||||||
@@ -115,15 +103,11 @@ fun Task.configureInstallGraalVm(graalVm: BuildInfo.GraalVm) {
|
|||||||
try {
|
try {
|
||||||
Files.move(tempLink, graalVm.installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
|
Files.move(tempLink, graalVm.installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
try {
|
try { delete(tempLink.toFile()) } catch (ignored: Exception) {}
|
||||||
delete(tempLink.toFile())
|
|
||||||
} catch (ignored: Exception) {}
|
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
try {
|
try { delete(distroDir) } catch (ignored: Exception) {}
|
||||||
delete(distroDir)
|
|
||||||
} catch (ignored: Exception) {}
|
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Allows to run Gradle plugin tests against different Gradle versions.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Adds a `compatibilityTestX` task for every Gradle version X
|
||||||
* you may not use this file except in compliance with the License.
|
* between `ext.minSupportedGradleVersion` and `ext.maxSupportedGradleVersion`
|
||||||
* You may obtain a copy of the License at
|
* that is not in `ext.gradleVersionsExcludedFromTesting`.
|
||||||
*
|
* The list of available Gradle versions is obtained from services.gradle.org.
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* Adds lifecycle tasks to test against multiple Gradle versions at once, for example all Gradle release versions.
|
||||||
*
|
* Compatibility test tasks run the same tests and use the same task configuration as the project's `test` task.
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* They set system properties for the Gradle version and distribution URL to be used.
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* These properties are consumed by the `AbstractTest` class.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
plugins { java }
|
|
||||||
|
plugins {
|
||||||
|
java
|
||||||
|
}
|
||||||
|
|
||||||
val gradlePluginTests = extensions.create<GradlePluginTests>("gradlePluginTests")
|
val gradlePluginTests = extensions.create<GradlePluginTests>("gradlePluginTests")
|
||||||
|
|
||||||
@@ -24,23 +24,18 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
|||||||
when (val taskNameSuffix = matchResult.groupValues[1]) {
|
when (val taskNameSuffix = matchResult.groupValues[1]) {
|
||||||
"All" ->
|
"All" ->
|
||||||
task("compatibilityTestAll") {
|
task("compatibilityTestAll") {
|
||||||
dependsOn(
|
dependsOn("compatibilityTestReleases", "compatibilityTestCandidate", "compatibilityTestNightly")
|
||||||
"compatibilityTestReleases",
|
|
||||||
"compatibilityTestCandidate",
|
|
||||||
"compatibilityTestNightly"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
// releases in configured range
|
// releases in configured range
|
||||||
"Releases" ->
|
"Releases" ->
|
||||||
task("compatibilityTestReleases") {
|
task("compatibilityTestReleases") {
|
||||||
val versionInfos = GradleVersionInfo.fetchReleases()
|
val versionInfos = GradleVersionInfo.fetchReleases()
|
||||||
val versionsToTestAgainst =
|
val versionsToTestAgainst = versionInfos.filter { versionInfo ->
|
||||||
versionInfos.filter { versionInfo ->
|
val v = versionInfo.gradleVersion
|
||||||
val v = versionInfo.gradleVersion
|
!versionInfo.broken &&
|
||||||
!versionInfo.broken &&
|
|
||||||
v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&
|
v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&
|
||||||
v !in gradlePluginTests.skippedGradleVersions
|
v !in gradlePluginTests.skippedGradleVersions
|
||||||
}
|
}
|
||||||
|
|
||||||
dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) })
|
dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) })
|
||||||
}
|
}
|
||||||
@@ -50,10 +45,8 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
|||||||
val versionInfo = GradleVersionInfo.fetchCurrent()
|
val versionInfo = GradleVersionInfo.fetchCurrent()
|
||||||
if (versionInfo.version == gradle.gradleVersion) {
|
if (versionInfo.version == gradle.gradleVersion) {
|
||||||
doLast {
|
doLast {
|
||||||
println(
|
println("No new Gradle release available. " +
|
||||||
"No new Gradle release available. " +
|
"(Run `gradlew test` to test against ${versionInfo.version}.)")
|
||||||
"(Run `gradlew test` to test against ${versionInfo.version}.)"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dependsOn(createCompatibilityTestTask(versionInfo))
|
dependsOn(createCompatibilityTestTask(versionInfo))
|
||||||
@@ -66,7 +59,9 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
|||||||
if (versionInfo?.activeRc == true) {
|
if (versionInfo?.activeRc == true) {
|
||||||
dependsOn(createCompatibilityTestTask(versionInfo))
|
dependsOn(createCompatibilityTestTask(versionInfo))
|
||||||
} else {
|
} else {
|
||||||
doLast { println("No active Gradle release candidate available.") }
|
doLast {
|
||||||
|
println("No active Gradle release candidate available.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// latest nightly
|
// latest nightly
|
||||||
@@ -78,14 +73,14 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
|||||||
// explicit version
|
// explicit version
|
||||||
else ->
|
else ->
|
||||||
createCompatibilityTestTask(
|
createCompatibilityTestTask(
|
||||||
taskNameSuffix,
|
taskNameSuffix,
|
||||||
"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip"
|
"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): Task =
|
fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): Task =
|
||||||
createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)
|
createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)
|
||||||
|
|
||||||
fun createCompatibilityTestTask(version: String, downloadUrl: String): Task {
|
fun createCompatibilityTestTask(version: String, downloadUrl: String): Task {
|
||||||
return tasks.create("compatibilityTest$version", Test::class.java) {
|
return tasks.create("compatibilityTest$version", Test::class.java) {
|
||||||
|
|||||||
@@ -1,33 +1,20 @@
|
|||||||
/*
|
plugins {
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
base
|
||||||
*
|
}
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
plugins { base }
|
|
||||||
|
|
||||||
val htmlValidator = extensions.create<HtmlValidator>("htmlValidator", project)
|
val htmlValidator = extensions.create<HtmlValidator>("htmlValidator", project)
|
||||||
|
|
||||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||||
|
|
||||||
val validatorConfiguration: Configuration =
|
val validatorConfiguration: Configuration = configurations.create("validator") {
|
||||||
configurations.create("validator") {
|
resolutionStrategy.eachDependency {
|
||||||
resolutionStrategy.eachDependency {
|
if (requested.group == "log4j" && requested.name == "log4j") {
|
||||||
if (requested.group == "log4j" && requested.name == "log4j") {
|
@Suppress("UnstableApiUsage")
|
||||||
@Suppress("UnstableApiUsage") useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
|
useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
|
||||||
because("mitigate critical security vulnerabilities")
|
because("mitigate critical security vulnerabilities")
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@Suppress("UnstableApiUsage")
|
@Suppress("UnstableApiUsage")
|
||||||
@@ -45,29 +32,27 @@ dependencies {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val validateHtml by
|
val validateHtml by tasks.registering(JavaExec::class) {
|
||||||
tasks.registering(JavaExec::class) {
|
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
|
||||||
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
|
inputs.files(htmlValidator.sources)
|
||||||
inputs.files(htmlValidator.sources)
|
outputs.file(resultFile)
|
||||||
outputs.file(resultFile)
|
|
||||||
|
|
||||||
classpath = validatorConfiguration
|
classpath = validatorConfiguration
|
||||||
mainClass.set("nu.validator.client.SimpleCommandLineValidator")
|
mainClass.set("nu.validator.client.SimpleCommandLineValidator")
|
||||||
args(
|
args("--skip-non-html") // --also-check-css doesn't work (still checks css as html), so limit to html files
|
||||||
"--skip-non-html"
|
args("--filterpattern", "(.*)Consider adding “lang=(.*)")
|
||||||
) // --also-check-css doesn't work (still checks css as html), so limit to html files
|
args("--filterpattern", "(.*)Consider adding a “lang” attribute(.*)")
|
||||||
args("--filterpattern", "(.*)Consider adding “lang=(.*)")
|
args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle
|
||||||
args("--filterpattern", "(.*)Consider adding a “lang” attribute(.*)")
|
// for debugging
|
||||||
args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle
|
// args "--verbose"
|
||||||
// for debugging
|
args(htmlValidator.sources)
|
||||||
// args "--verbose"
|
|
||||||
args(htmlValidator.sources)
|
|
||||||
|
|
||||||
// write a basic result file s.t. gradle can consider task up-to-date
|
// write a basic result file s.t. gradle can consider task up-to-date
|
||||||
// writing a result file in case validation fails is not easily possible with JavaExec, but also
|
// writing a result file in case validation fails is not easily possible with JavaExec, but also not strictly necessary
|
||||||
// not strictly necessary
|
doFirst { project.delete(resultFile) }
|
||||||
doFirst { project.delete(resultFile) }
|
doLast { resultFile.get().asFile.writeText("Success.") }
|
||||||
doLast { resultFile.get().asFile.writeText("Success.") }
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tasks.check { dependsOn(validateHtml) }
|
tasks.check {
|
||||||
|
dependsOn(validateHtml)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
@file:Suppress("HttpUrlsUsage")
|
@file:Suppress("HttpUrlsUsage")
|
||||||
|
|
||||||
import org.gradle.accessors.dm.LibrariesForLibs
|
import org.gradle.accessors.dm.LibrariesForLibs
|
||||||
@@ -42,17 +27,14 @@ artifacts {
|
|||||||
spotless {
|
spotless {
|
||||||
java {
|
java {
|
||||||
googleJavaFormat(libs.versions.googleJavaFormat.get())
|
googleJavaFormat(libs.versions.googleJavaFormat.get())
|
||||||
target("src/*/java/**/*.java")
|
targetExclude("**/generated/**", "**/build/**")
|
||||||
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
|
||||||
}
|
|
||||||
kotlin {
|
|
||||||
ktfmt(libs.versions.ktfmt.get()).googleStyle()
|
|
||||||
target("src/*/kotlin/**/*.kt")
|
|
||||||
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.compileKotlin { enabled = false }
|
tasks.compileKotlin {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
tasks.jar {
|
tasks.jar {
|
||||||
manifest {
|
manifest {
|
||||||
@@ -67,18 +49,15 @@ tasks.javadoc {
|
|||||||
(options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet")
|
(options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet")
|
||||||
}
|
}
|
||||||
|
|
||||||
val workAroundKotlinGradlePluginBug by
|
val workAroundKotlinGradlePluginBug by tasks.registering {
|
||||||
tasks.registering {
|
doLast {
|
||||||
doLast {
|
// Works around this problem, which sporadically appears and disappears in different subprojects:
|
||||||
// Works around this problem, which sporadically appears and disappears in different
|
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type 'JavaCompile').
|
||||||
// subprojects:
|
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
|
||||||
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type
|
// specified for property 'compileKotlinOutputClasses' does not exist.
|
||||||
// 'JavaCompile').
|
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.mkdirs()
|
||||||
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
|
|
||||||
// specified for property 'compileKotlinOutputClasses' does not exist.
|
|
||||||
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.mkdirs()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tasks.compileJava {
|
tasks.compileJava {
|
||||||
dependsOn(workAroundKotlinGradlePluginBug)
|
dependsOn(workAroundKotlinGradlePluginBug)
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.gradle.accessors.dm.LibrariesForLibs
|
import org.gradle.accessors.dm.LibrariesForLibs
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
@@ -38,3 +23,11 @@ dependencies {
|
|||||||
tasks.compileKotlin {
|
tasks.compileKotlin {
|
||||||
enabled = true // disabled by pklJavaLibrary
|
enabled = true // disabled by pklJavaLibrary
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spotless {
|
||||||
|
kotlin {
|
||||||
|
ktfmt(libs.versions.ktfmt.get()).googleStyle()
|
||||||
|
targetExclude("**/generated/**", "**/build/**")
|
||||||
|
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,22 +1,9 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import java.net.URI
|
|
||||||
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
|
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
|
||||||
|
import java.net.URI
|
||||||
|
|
||||||
plugins { kotlin("jvm") }
|
plugins {
|
||||||
|
kotlin("jvm")
|
||||||
|
}
|
||||||
|
|
||||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||||
|
|
||||||
@@ -37,36 +24,34 @@ tasks.withType<Test>().configureEach {
|
|||||||
// enable checking of stdlib return types
|
// enable checking of stdlib return types
|
||||||
systemProperty("org.pkl.testMode", "true")
|
systemProperty("org.pkl.testMode", "true")
|
||||||
|
|
||||||
reports.named("html") { enabled = true }
|
reports.named("html") {
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
testLogging { exceptionFormat = TestExceptionFormat.FULL }
|
testLogging {
|
||||||
|
exceptionFormat = TestExceptionFormat.FULL
|
||||||
|
}
|
||||||
|
|
||||||
addTestListener(
|
addTestListener(object : TestListener {
|
||||||
object : TestListener {
|
override fun beforeSuite(suite: TestDescriptor) {}
|
||||||
override fun beforeSuite(suite: TestDescriptor) {}
|
override fun beforeTest(testDescriptor: TestDescriptor) {}
|
||||||
|
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
|
||||||
|
|
||||||
override fun beforeTest(testDescriptor: TestDescriptor) {}
|
// print report link at end of task, not just at end of build
|
||||||
|
override fun afterSuite(descriptor: TestDescriptor, result: TestResult) {
|
||||||
|
if (descriptor.parent != null) return // only interested in overall result
|
||||||
|
|
||||||
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
|
if (result.resultType == TestResult.ResultType.FAILURE) {
|
||||||
|
println("\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}")
|
||||||
// print report link at end of task, not just at end of build
|
|
||||||
override fun afterSuite(descriptor: TestDescriptor, result: TestResult) {
|
|
||||||
if (descriptor.parent != null) return // only interested in overall result
|
|
||||||
|
|
||||||
if (result.resultType == TestResult.ResultType.FAILURE) {
|
|
||||||
println(
|
|
||||||
"\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// makes links clickable on macOS
|
|
||||||
private fun fixFileUri(uri: URI): URI {
|
|
||||||
if ("file" == uri.scheme && !uri.schemeSpecificPart.startsWith("//")) {
|
|
||||||
return URI.create("file://" + uri.schemeSpecificPart)
|
|
||||||
}
|
|
||||||
return uri
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
// makes links clickable on macOS
|
||||||
|
private fun fixFileUri(uri: URI): URI {
|
||||||
|
if ("file" == uri.scheme && !uri.schemeSpecificPart.startsWith("//")) {
|
||||||
|
return URI.create("file://" + uri.schemeSpecificPart)
|
||||||
|
}
|
||||||
|
return uri
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,11 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
val assembleNative by tasks.registering {}
|
val assembleNative by tasks.registering {}
|
||||||
|
|
||||||
val testNative by tasks.registering {}
|
val testNative by tasks.registering {}
|
||||||
|
|
||||||
val checkNative by tasks.registering { dependsOn(testNative) }
|
val checkNative by tasks.registering {
|
||||||
|
dependsOn(testNative)
|
||||||
|
}
|
||||||
|
|
||||||
val buildNative by tasks.registering { dependsOn(assembleNative, checkNative) }
|
val buildNative by tasks.registering {
|
||||||
|
dependsOn(assembleNative, checkNative)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,21 +1,6 @@
|
|||||||
/*
|
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import java.util.Base64
|
import java.util.Base64
|
||||||
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
`maven-publish`
|
`maven-publish`
|
||||||
@@ -25,7 +10,9 @@ plugins {
|
|||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
components.findByName("java")?.let { javaComponent ->
|
components.findByName("java")?.let { javaComponent ->
|
||||||
create<MavenPublication>("library") { from(javaComponent) }
|
create<MavenPublication>("library") {
|
||||||
|
from(javaComponent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
withType<MavenPublication>().configureEach {
|
withType<MavenPublication>().configureEach {
|
||||||
pom {
|
pom {
|
||||||
@@ -62,66 +49,63 @@ publishing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val validatePom by
|
val validatePom by tasks.registering {
|
||||||
tasks.registering {
|
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
|
||||||
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
|
return@registering
|
||||||
return@registering
|
}
|
||||||
}
|
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
|
||||||
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
|
val outputFile = layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
|
||||||
val outputFile =
|
|
||||||
layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
|
|
||||||
|
|
||||||
dependsOn(generatePomFileForLibraryPublication)
|
dependsOn(generatePomFileForLibraryPublication)
|
||||||
inputs.file(generatePomFileForLibraryPublication.get().destination)
|
inputs.file(generatePomFileForLibraryPublication.get().destination)
|
||||||
outputs.file(outputFile)
|
outputs.file(outputFile)
|
||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
outputFile.get().asFile.delete()
|
outputFile.get().asFile.delete()
|
||||||
|
|
||||||
val pomFile = generatePomFileForLibraryPublication.get().destination
|
val pomFile = generatePomFileForLibraryPublication.get().destination
|
||||||
assert(pomFile.exists())
|
assert(pomFile.exists())
|
||||||
|
|
||||||
val text = pomFile.readText()
|
val text = pomFile.readText()
|
||||||
|
|
||||||
run {
|
run {
|
||||||
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
|
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
|
||||||
val matches = unresolvedVersion.findAll(text).toList()
|
val matches = unresolvedVersion.findAll(text).toList()
|
||||||
if (matches.isNotEmpty()) {
|
if (matches.isNotEmpty()) {
|
||||||
throw GradleException(
|
throw GradleException(
|
||||||
"""
|
"""
|
||||||
Found unresolved version selector(s) in generated POM:
|
Found unresolved version selector(s) in generated POM:
|
||||||
${matches.joinToString("\n") { it.groupValues[0] }}
|
${matches.joinToString("\n") { it.groupValues[0] }}
|
||||||
"""
|
""".trimIndent()
|
||||||
.trimIndent()
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||||
if (buildInfo.isReleaseBuild) {
|
if (buildInfo.isReleaseBuild) {
|
||||||
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
|
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
|
||||||
val matches = snapshotVersion.findAll(text).toList()
|
val matches = snapshotVersion.findAll(text).toList()
|
||||||
if (matches.isNotEmpty()) {
|
if (matches.isNotEmpty()) {
|
||||||
throw GradleException(
|
throw GradleException(
|
||||||
"""
|
"""
|
||||||
Found snapshot version(s) in generated POM of Pkl release version:
|
Found snapshot version(s) in generated POM of Pkl release version:
|
||||||
${matches.joinToString("\n") { it.groupValues[0] }}
|
${matches.joinToString("\n") { it.groupValues[0] }}
|
||||||
"""
|
""".trimIndent()
|
||||||
.trimIndent()
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
outputFile.get().asFile.writeText("OK")
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tasks.publish { dependsOn(validatePom) }
|
outputFile.get().asFile.writeText("OK")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.publish {
|
||||||
|
dependsOn(validatePom)
|
||||||
|
}
|
||||||
|
|
||||||
// Workaround for maven publish plugin not setting up dependencies correctly.
|
// Workaround for maven publish plugin not setting up dependencies correctly.
|
||||||
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
|
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
|
||||||
val dependsOnTasks = mutableListOf<String>()
|
val dependsOnTasks = mutableListOf<String>()
|
||||||
|
|
||||||
tasks.withType<AbstractPublishToMaven>().configureEach {
|
tasks.withType<AbstractPublishToMaven>().configureEach {
|
||||||
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
|
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
|
||||||
dependsOn(dependsOnTasks)
|
dependsOn(dependsOnTasks)
|
||||||
@@ -130,10 +114,8 @@ tasks.withType<AbstractPublishToMaven>().configureEach {
|
|||||||
signing {
|
signing {
|
||||||
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
|
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
|
||||||
// in CI.
|
// in CI.
|
||||||
val signingKey =
|
val signingKey = (findProperty("signingKey") as String?)
|
||||||
(findProperty("signingKey") as String?)?.let {
|
?.let { Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII) }
|
||||||
Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)
|
|
||||||
}
|
|
||||||
val signingPassword = findProperty("signingPassword") as String?
|
val signingPassword = findProperty("signingPassword") as String?
|
||||||
if (signingKey != null && signingPassword != null) {
|
if (signingKey != null && signingPassword != null) {
|
||||||
useInMemoryPgpKeys(signingKey, signingPassword)
|
useInMemoryPgpKeys(signingKey, signingPassword)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
name: main
|
name: main
|
||||||
title: Main Project
|
title: Main Project
|
||||||
version: 0.27.0
|
version: 0.26.3
|
||||||
prerelease: false
|
prerelease: false
|
||||||
nav:
|
nav:
|
||||||
- nav.adoc
|
- nav.adoc
|
||||||
|
|||||||
+7
-20
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
@@ -27,7 +12,10 @@ sourceSets {
|
|||||||
srcDir(file("modules/pkl-config-java/examples"))
|
srcDir(file("modules/pkl-config-java/examples"))
|
||||||
srcDir(file("modules/java-binding/examples"))
|
srcDir(file("modules/java-binding/examples"))
|
||||||
}
|
}
|
||||||
val kotlin = project.extensions.getByType<KotlinJvmProjectExtension>().sourceSets[name].kotlin
|
val kotlin = project.extensions
|
||||||
|
.getByType<KotlinJvmProjectExtension>()
|
||||||
|
.sourceSets[name]
|
||||||
|
.kotlin
|
||||||
kotlin.srcDir(file("modules/kotlin-binding/examples"))
|
kotlin.srcDir(file("modules/kotlin-binding/examples"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,8 +30,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.test {
|
tasks.test {
|
||||||
inputs
|
inputs.files(fileTree("modules").matching {
|
||||||
.files(fileTree("modules").matching { include("**/pages/*.adoc") })
|
include("**/pages/*.adoc")
|
||||||
.withPropertyName("asciiDocFiles")
|
}).withPropertyName("asciiDocFiles").withPathSensitivity(PathSensitivity.RELATIVE)
|
||||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-13
@@ -2,13 +2,13 @@
|
|||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath
|
io.leangen.geantyref:geantyref:1.3.15=testRuntimeClasspath
|
||||||
net.bytebuddy:byte-buddy:1.14.18=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||||
org.assertj:assertj-core:3.26.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.graalvm.sdk:graal-sdk:23.0.6=testRuntimeClasspath
|
org.graalvm.sdk:graal-sdk:23.0.2=testRuntimeClasspath
|
||||||
org.graalvm.truffle:truffle-api:23.0.6=testRuntimeClasspath
|
org.graalvm.truffle:truffle-api:23.0.2=testRuntimeClasspath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
@@ -24,14 +24,13 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplemen
|
|||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.jupiter:junit-jupiter-api:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-engine:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-engine:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-params:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.platform:junit-platform-commons:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.platform:junit-platform-engine:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit:junit-bom:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.msgpack:msgpack-core:0.9.8=testRuntimeClasspath
|
|
||||||
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
|
org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
|
||||||
org.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
|
org.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
|
||||||
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
|
empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileClasspath,compileOnly,compileOnlyDependenciesMetadata,default,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
// the following attributes must be updated immediately before a release
|
// the following attributes must be updated immediately before a release
|
||||||
|
|
||||||
// pkl version corresponding to current git commit without -dev suffix or git hash
|
// pkl version corresponding to current git commit without -dev suffix or git hash
|
||||||
:pkl-version-no-suffix: 0.27.0
|
:pkl-version-no-suffix: 0.26.3
|
||||||
// tells whether pkl version corresponding to current git commit
|
// tells whether pkl version corresponding to current git commit
|
||||||
// is a release version (:is-release-version: '') or dev version (:!is-release-version:)
|
// is a release version (:is-release-version: '') or dev version (:!is-release-version:)
|
||||||
:is-release-version: ''
|
:is-release-version: ''
|
||||||
@@ -68,18 +68,15 @@ endif::[]
|
|||||||
:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc
|
:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc
|
||||||
|
|
||||||
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
|
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
|
||||||
:uri-stdlib-analyzeModule: {uri-pkl-stdlib-docs}/analyze
|
|
||||||
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
|
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
|
||||||
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
|
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
|
||||||
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
|
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
|
||||||
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
|
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
|
||||||
:uri-stdlib-evaluatorSettingsModule: {uri-pkl-stdlib-docs}/EvaluatorSettings
|
|
||||||
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
|
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
|
||||||
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
|
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
|
||||||
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
|
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
|
||||||
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
|
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
|
||||||
:uri-stdlib-String: {uri-stdlib-baseModule}/String
|
:uri-stdlib-String: {uri-stdlib-baseModule}/String
|
||||||
:uri-stdlib-StringToInt: {uri-stdlib-baseModule}/String#toInt()
|
|
||||||
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
|
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
|
||||||
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
|
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
|
||||||
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
|
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ The first element of the array is a code that designates the message's type, enc
|
|||||||
The second element of the array is the message body, encoded as a map.
|
The second element of the array is the message body, encoded as a map.
|
||||||
|
|
||||||
Messages are passed between the _client_ and the _server_.
|
Messages are passed between the _client_ and the _server_.
|
||||||
When hosting Pkl (for example, the Swift application when using pkl-swift), the _client_ is the host program and the _server_ is the entity that provides controls for interacting with Pkl.
|
The _client_ is the host language (for example, the Swift application when using pkl-swift).
|
||||||
When implementing an xref:language-reference:index.adoc#external-readers[external reader], the _client_ is the external reader process and the _server_ is the Pkl evaluator.
|
The _server_ is the entity that provides controls for interacting with Pkl.
|
||||||
|
|
||||||
For example, in JSON representation:
|
For example, in JSON representation:
|
||||||
|
|
||||||
@@ -414,8 +414,6 @@ The response to <<read-resource-request>>.
|
|||||||
If successful, `contents` is set.
|
If successful, `contents` is set.
|
||||||
Otherwise, `error` is set.
|
Otherwise, `error` is set.
|
||||||
|
|
||||||
If neither is set, `contents` defaults to an empty byte array.
|
|
||||||
|
|
||||||
[source,pkl]
|
[source,pkl]
|
||||||
----
|
----
|
||||||
/// A number identifying this request.
|
/// A number identifying this request.
|
||||||
@@ -465,8 +463,6 @@ The response to <<read-module-request>>.
|
|||||||
If successful, `contents` is set.
|
If successful, `contents` is set.
|
||||||
Otherwise, `error` is set.
|
Otherwise, `error` is set.
|
||||||
|
|
||||||
If neither is set, `contents` defaults to an empty string.
|
|
||||||
|
|
||||||
[source,pkl]
|
[source,pkl]
|
||||||
----
|
----
|
||||||
/// A number identifying this request.
|
/// A number identifying this request.
|
||||||
@@ -597,96 +593,3 @@ class PathElement {
|
|||||||
isDirectory: Boolean
|
isDirectory: Boolean
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
[[initialize-module-reader-request]]
|
|
||||||
=== Initialize Module Reader Request
|
|
||||||
|
|
||||||
Code: `0x2e` +
|
|
||||||
Type: <<server-message,Server>> <<request-message,Request>>
|
|
||||||
|
|
||||||
Initialize an xref:language-reference:index.adoc#external-readers[External Module Reader].
|
|
||||||
This message is sent to external reader processes the first time a module scheme it is registered for is read.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
/// A number identifying this request.
|
|
||||||
requestId: Int
|
|
||||||
|
|
||||||
/// The module scheme to initialize.
|
|
||||||
scheme: String
|
|
||||||
----
|
|
||||||
|
|
||||||
[[initialize-module-reader-response]]
|
|
||||||
=== Initialize Module Reader Response
|
|
||||||
|
|
||||||
Code: `0x2f` +
|
|
||||||
Type: <<client-message,Client>> <<response-message,Response>>
|
|
||||||
|
|
||||||
Return the requested external module reader specification.
|
|
||||||
The `spec` field should be set to `null` when the external process does not implement the requested module scheme.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
/// A number identifying this request.
|
|
||||||
requestId: Int
|
|
||||||
|
|
||||||
/// Client-side module reader spec.
|
|
||||||
///
|
|
||||||
/// Null when the external process does not implement the requested module scheme.
|
|
||||||
spec: ClientModuleReader?
|
|
||||||
----
|
|
||||||
|
|
||||||
`ClientModuleReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>.
|
|
||||||
|
|
||||||
[[initialize-resource-reader-request]]
|
|
||||||
=== Initialize Resource Reader Request
|
|
||||||
|
|
||||||
Code: `0x30` +
|
|
||||||
Type: <<server-message,Server>> <<request-message,Request>>
|
|
||||||
|
|
||||||
Initialize an xref:language-reference:index.adoc#external-readers[External Resource Reader].
|
|
||||||
This message is sent to external reader processes the first time a resource scheme it is registered for is read.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
/// A number identifying this request.
|
|
||||||
requestId: Int
|
|
||||||
|
|
||||||
/// The resource scheme to initialize.
|
|
||||||
scheme: String
|
|
||||||
----
|
|
||||||
|
|
||||||
[[initialize-resource-reader-response]]
|
|
||||||
=== Initialize Resource Reader Response
|
|
||||||
|
|
||||||
Code: `0x31` +
|
|
||||||
Type: <<client-message,Client>> <<response-message,Response>>
|
|
||||||
|
|
||||||
Return the requested external resource reader specification.
|
|
||||||
The `spec` field should be set to `null` when the external process does not implement the requested resource scheme.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
/// A number identifying this request.
|
|
||||||
requestId: Int
|
|
||||||
|
|
||||||
/// Client-side resource reader spec.
|
|
||||||
///
|
|
||||||
/// Null when the external process does not implement the requested resource scheme.
|
|
||||||
spec: ClientResourceReader?
|
|
||||||
----
|
|
||||||
|
|
||||||
`ClientResourceReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>.
|
|
||||||
|
|
||||||
[[close-external-process]]
|
|
||||||
=== Close External Process
|
|
||||||
|
|
||||||
Code: `0x32` +
|
|
||||||
Type: <<server-message,Server>> <<one-way-message,One Way>>
|
|
||||||
|
|
||||||
Initiate graceful shutdown of the external reader process.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
/// This message has no properties.
|
|
||||||
----
|
|
||||||
|
|||||||
@@ -3199,8 +3199,7 @@ This section discusses language features that are generally more relevant to tem
|
|||||||
<<grammar-definition,Grammar Definition>> +
|
<<grammar-definition,Grammar Definition>> +
|
||||||
<<reserved-keywords,Reserved Keywords>> +
|
<<reserved-keywords,Reserved Keywords>> +
|
||||||
<<blank-identifiers,Blank Identifiers>> +
|
<<blank-identifiers,Blank Identifiers>> +
|
||||||
<<projects,Projects>> +
|
<<projects,Projects>>
|
||||||
<<external-readers,External Readers>>
|
|
||||||
|
|
||||||
[[meaning-of-new]]
|
[[meaning-of-new]]
|
||||||
=== Meaning of `new`
|
=== Meaning of `new`
|
||||||
@@ -3381,7 +3380,7 @@ Here is an example:
|
|||||||
----
|
----
|
||||||
birdDiets =
|
birdDiets =
|
||||||
let (diets = List("Seeds", "Berries", "Mice"))
|
let (diets = List("Seeds", "Berries", "Mice"))
|
||||||
List(diets[2], diets[0]) // <1>
|
List(diets[2], diets[0]) // <1>
|
||||||
----
|
----
|
||||||
<1> result: `birdDiets = List("Mice", "Seeds")`
|
<1> result: `birdDiets = List("Mice", "Seeds")`
|
||||||
|
|
||||||
@@ -3396,7 +3395,7 @@ birdDiets =
|
|||||||
----
|
----
|
||||||
birdDiets =
|
birdDiets =
|
||||||
let (diets: List<String> = List("Seeds", "Berries", "Mice"))
|
let (diets: List<String> = List("Seeds", "Berries", "Mice"))
|
||||||
diets[2] + diets[0] // <1>
|
diets[2] + diets[0] // <1>
|
||||||
----
|
----
|
||||||
<1> result: `birdDiets = List("Mice", "Seeds")`
|
<1> result: `birdDiets = List("Mice", "Seeds")`
|
||||||
|
|
||||||
@@ -3407,7 +3406,7 @@ birdDiets =
|
|||||||
birdDiets =
|
birdDiets =
|
||||||
let (birds = List("Pigeon", "Barn owl", "Parrot"))
|
let (birds = List("Pigeon", "Barn owl", "Parrot"))
|
||||||
let (diet = List("Seeds", "Mice", "Berries"))
|
let (diet = List("Seeds", "Mice", "Berries"))
|
||||||
birds.zip(diet) // <1>
|
birds.zip(diet) // <1>
|
||||||
----
|
----
|
||||||
<1> result: `birdDiets = List(Pair("Pigeon", "Seeds"), Pair("Barn owl", "Mice"), Pair("Parrot", "Berries"))`
|
<1> result: `birdDiets = List(Pair("Pigeon", "Seeds"), Pair("Barn owl", "Mice"), Pair("Parrot", "Berries"))`
|
||||||
|
|
||||||
@@ -4743,7 +4742,7 @@ oldPets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
newPets {
|
newPets {
|
||||||
...oldPets
|
...cast
|
||||||
["Pigeon"] = "Toby the Pigeon" // <1>
|
["Pigeon"] = "Toby the Pigeon" // <1>
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
@@ -5408,7 +5407,7 @@ package {
|
|||||||
packageZipUrl = "https://example.com/\(name)/\(name)@\(version).zip" // <4>
|
packageZipUrl = "https://example.com/\(name)/\(name)@\(version).zip" // <4>
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
<1> The display name of the package.For display purposes only.
|
<1> The display name of the package. For display purposes only.
|
||||||
<2> The package URI, without the version part.
|
<2> The package URI, without the version part.
|
||||||
<3> The version of the package.
|
<3> The version of the package.
|
||||||
<4> The URL to download the package's ZIP file.
|
<4> The URL to download the package's ZIP file.
|
||||||
@@ -5416,9 +5415,8 @@ package {
|
|||||||
The package itself is created by the command xref:pkl-cli:index.adoc#command-project-package[`pkl project package`].
|
The package itself is created by the command xref:pkl-cli:index.adoc#command-project-package[`pkl project package`].
|
||||||
|
|
||||||
This command only prepares artifacts to be published.
|
This command only prepares artifacts to be published.
|
||||||
Once the artifacts are prepared, they are expected to be uploaded to an HTTPS server such that the ZIP asset can be downloaded at path `packageZipUrl`, and the metadata can be downloaded at `+https://<package uri>+`.
|
Once the artifacts are prepared, they are expected to be uploaded to an HTTPS server such that the ZIP asset can be downloaded at path `packageZipUrl`, and the metadata can be downloaded at `+https://<package uri>+`.
|
||||||
|
|
||||||
[[local-dependencies]]
|
|
||||||
==== Local dependencies
|
==== Local dependencies
|
||||||
|
|
||||||
A project can depend on a local project as a dependency.
|
A project can depend on a local project as a dependency.
|
||||||
@@ -5466,68 +5464,3 @@ It can be imported using dependency notation, i.e. `import "@fruit/Pear.pkl"`.
|
|||||||
At runtime, it will resolve to relative path `../fruit/Pear.pkl`.
|
At runtime, it will resolve to relative path `../fruit/Pear.pkl`.
|
||||||
|
|
||||||
When packaging projects with local dependencies, both the project and its dependent project must be passed to the xref:pkl-cli:index.adoc#command-project-package[`pkl project package`] command.
|
When packaging projects with local dependencies, both the project and its dependent project must be passed to the xref:pkl-cli:index.adoc#command-project-package[`pkl project package`] command.
|
||||||
|
|
||||||
[[external-readers]]
|
|
||||||
=== External Readers
|
|
||||||
|
|
||||||
External readers are a mechanism to extend the <<modules,module>> and <<resources,resource>> URI schemes that Pkl supports.
|
|
||||||
Readers are implemented as ordinary executables and use Pkl's xref:bindings-specification:message-passing-api.adoc[message passing API] to communicate with the hosting Pkl evaluator.
|
|
||||||
The xref:swift:ROOT:index.adoc[Swift] and xref:go:ROOT:index.adoc[Go] language binding libraries provide an `ExternalReaderRuntime` type to facilitate implementing external readers.
|
|
||||||
|
|
||||||
External readers are configured separately for modules and resources.
|
|
||||||
They are registered by mapping their URI scheme to the executable to run and additonal arguments to pass.
|
|
||||||
This is done on the command line by passing `--external-resource-reader` and `--external-module-reader` flags, which may both be passed multiple times.
|
|
||||||
|
|
||||||
[source,text]
|
|
||||||
----
|
|
||||||
$ pkl eval <module> --external-resource-reader <scheme>=<executable> --external-module-reader <scheme>='<executable> <argument> <argument>'
|
|
||||||
----
|
|
||||||
|
|
||||||
External readers may also be configured in a <<projects, Project's>> `PklProject` file.
|
|
||||||
[source,{pkl}]
|
|
||||||
----
|
|
||||||
evaluatorSettings {
|
|
||||||
externalResourceReaders {
|
|
||||||
["<scheme>"] {
|
|
||||||
executable = "<executable>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
externalModuleReaders {
|
|
||||||
["<scheme>"] {
|
|
||||||
executable = "<executable>"
|
|
||||||
arguments { "<arg>"; "<arg>" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
Registering an external reader for a scheme automatically adds that scheme to the default allowed modules/resources.
|
|
||||||
As with Pkl's built-in module and resource schemes, setting explicit allowed modules or resources overrides this behavior and appropriate patterns must be specified to allow use of external readers.
|
|
||||||
|
|
||||||
==== Example
|
|
||||||
|
|
||||||
Consider this module:
|
|
||||||
|
|
||||||
[source,{pkl}]
|
|
||||||
----
|
|
||||||
username = "pigeon"
|
|
||||||
|
|
||||||
email = read("ldap://ds.example.com:389/dc=example,dc=com?mail?sub?(uid=\(username))").text
|
|
||||||
----
|
|
||||||
|
|
||||||
Pkl doesn't implement the `ldap:` resource URI scheme natively, but an external reader can provide it.
|
|
||||||
Assuming a hypothetical `pkl-ldap` executable implementing the external reader protocol and the `ldap:` scheme is in the `$PATH`, this module can be evaluated as:
|
|
||||||
|
|
||||||
[source,text]
|
|
||||||
----
|
|
||||||
$ pkl eval <module> --external-resource-reader ldap=pkl-ldap
|
|
||||||
username = "pigeon"
|
|
||||||
email = "pigeon@example.com"
|
|
||||||
----
|
|
||||||
|
|
||||||
In this example, the external reader may provide both `ldap:` and `ldaps:` schemes.
|
|
||||||
To support both schemes during evaluation, both would need to be registered explicitly:
|
|
||||||
[source,text]
|
|
||||||
----
|
|
||||||
$ pkl eval <module> --external-resource-reader ldap=pkl-ldap --external-resource-reader ldaps=pkl-ldap
|
|
||||||
----
|
|
||||||
|
|||||||
@@ -409,10 +409,6 @@ Evaluate the given `<modules>` as _tests_, producing a test report and appropria
|
|||||||
|
|
||||||
Renderers defined in test files will be ignored by the `test` command.
|
Renderers defined in test files will be ignored by the `test` command.
|
||||||
|
|
||||||
Tests that result in writing `pkl-expected.pcf` files are considered failing tests.
|
|
||||||
If these are the only failures, the command exits with exit code 10.
|
|
||||||
Otherwise, failures result in exit code 1.
|
|
||||||
|
|
||||||
<modules>::
|
<modules>::
|
||||||
The absolute or relative URIs of the modules to test. Relative URIs are resolved against the working directory.
|
The absolute or relative URIs of the modules to test. Relative URIs are resolved against the working directory.
|
||||||
|
|
||||||
@@ -562,64 +558,14 @@ package already exists in the cache directory, this command is a no-op.
|
|||||||
|
|
||||||
This command accepts <<common-options,common options>>.
|
This command accepts <<common-options,common options>>.
|
||||||
|
|
||||||
[[command-analyze-imports]]
|
|
||||||
=== `pkl analyze imports`
|
|
||||||
|
|
||||||
*Synopsis*: `pkl analyze imports [<modules>]`
|
|
||||||
|
|
||||||
This command builds a graph of imports declared in the provided modules.
|
|
||||||
|
|
||||||
This is a lower level command that is meant to be useful for Pkl-related tooling.
|
|
||||||
For example, this command feeds into the xref:pkl-gradle:index.adoc[] to determine if tasks are considered up-to-date or not.
|
|
||||||
|
|
||||||
This command produces an object with two properties, `imports` and `resolvedImports`.
|
|
||||||
|
|
||||||
The `imports` property is a mapping of a module's absolute URI, to the set of imports declared within that module.
|
|
||||||
|
|
||||||
The `resolvedImports` property is a mapping of a module's absolute URI (as stated in `imports`), to the resolved absolute URI that might be useful for fetching the module's contents.
|
|
||||||
For example, a xref:language-reference:index.adoc#local-dependencies[local dependency] import will have an in-language URI with scheme `projectpackage:`, and may have resolved URI with scheme `file:` (assuming that the project is file-based).
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
[source,shell]
|
|
||||||
----
|
|
||||||
# Analyze the imports of a single module
|
|
||||||
pkl analyze imports myModule.pkl
|
|
||||||
|
|
||||||
# Same as the previous command, but output in JSON.
|
|
||||||
pkl analyze imports -f json myModule.pkl
|
|
||||||
|
|
||||||
# Analyze imports of all modules declared within src/
|
|
||||||
pkl analyze imports src/*.pkl
|
|
||||||
----
|
|
||||||
|
|
||||||
<modules>::
|
|
||||||
The absolute or relative URIs of the modules to analyze. Relative URIs are resolved against the working directory.
|
|
||||||
|
|
||||||
==== Options
|
|
||||||
|
|
||||||
.-f, --format
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Same meaning as <<format>> in <<command-eval>>.
|
|
||||||
====
|
|
||||||
|
|
||||||
.-o, --output-path
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Same meaning as <<output-path>> in <<command-eval>>.
|
|
||||||
====
|
|
||||||
|
|
||||||
This command also takes <<common-options,common options>>.
|
|
||||||
|
|
||||||
[[common-options]]
|
[[common-options]]
|
||||||
=== Common options
|
=== Common options
|
||||||
|
|
||||||
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, <<command-download-package>>, and <<command-analyze-imports>> commands support the following common options:
|
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, and <<command-download-package>> commands support the following common options:
|
||||||
|
|
||||||
include::../../pkl-cli/partials/cli-common-options.adoc[]
|
include::../../pkl-cli/partials/cli-common-options.adoc[]
|
||||||
|
|
||||||
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-download-package>>, and <<command-analyze-imports>> commands also take the following options:
|
The <<command-eval>>, <<command-test>>, <<command-repl>>, and <<command-download-package>> commands also take the following options:
|
||||||
|
|
||||||
include::../../pkl-cli/partials/cli-project-options.adoc[]
|
include::../../pkl-cli/partials/cli-project-options.adoc[]
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Comma-separated list of URI patterns that determine which modules can be loaded
|
|||||||
Patterns are matched against the beginning of module URIs.
|
Patterns are matched against the beginning of module URIs.
|
||||||
(File paths have been converted to `file:` URLs at this stage.)
|
(File paths have been converted to `file:` URLs at this stage.)
|
||||||
At least one pattern needs to match for a module to be loadable.
|
At least one pattern needs to match for a module to be loadable.
|
||||||
|
Both source modules and transitive modules are subject to this check.
|
||||||
====
|
====
|
||||||
|
|
||||||
[[allowed-resources]]
|
[[allowed-resources]]
|
||||||
@@ -19,19 +20,6 @@ Patterns are matched against the beginning of resource URIs.
|
|||||||
At least one pattern needs to match for a resource to be readable.
|
At least one pattern needs to match for a resource to be readable.
|
||||||
====
|
====
|
||||||
|
|
||||||
[[color]]
|
|
||||||
.--color
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Default: `auto` +
|
|
||||||
When to format messages with ANSI color codes.
|
|
||||||
Possible values:
|
|
||||||
|
|
||||||
- `"never"`: Never format
|
|
||||||
- `"auto"`: Format if `stdin`, `stdout`, or `stderr` are connected to a console.
|
|
||||||
- `"always"`: Always format
|
|
||||||
====
|
|
||||||
|
|
||||||
[[cache-dir]]
|
[[cache-dir]]
|
||||||
.--cache-dir
|
.--cache-dir
|
||||||
[%collapsible]
|
[%collapsible]
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ We recommend to provision it with a Maven compatible build tool as shown in <<in
|
|||||||
The Pkldoc tool is offered as Gradle plugin, Java library, and CLI.
|
The Pkldoc tool is offered as Gradle plugin, Java library, and CLI.
|
||||||
It can generate documentation either for modules directly, or generate documentation for _package uris_.
|
It can generate documentation either for modules directly, or generate documentation for _package uris_.
|
||||||
|
|
||||||
The tool requires an argument of a module named _docsite-info.pkl_, that amends link:{uri-DocsiteInfo}[pkl.DocsiteInfo].
|
The tool requires an argument of a module named `_docsite-info.pkl`, that amends link:{uri-DocsiteInfo}[pkl.DocsiteInfo].
|
||||||
|
|
||||||
[discrete]
|
[discrete]
|
||||||
==== Generating documentation for modules directly
|
==== Generating documentation for modules directly
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ pkl {
|
|||||||
evaluators {
|
evaluators {
|
||||||
evalPkl {
|
evalPkl {
|
||||||
sourceModules.add(file("module1.pkl"))
|
sourceModules.add(file("module1.pkl"))
|
||||||
|
transitiveModules.from file("module2.pkl")
|
||||||
outputFile = layout.buildDirectory.file("module1.yaml")
|
outputFile = layout.buildDirectory.file("module1.yaml")
|
||||||
outputFormat = "yaml"
|
outputFormat = "yaml"
|
||||||
}
|
}
|
||||||
@@ -117,6 +118,7 @@ pkl {
|
|||||||
evaluators {
|
evaluators {
|
||||||
register("evalPkl") {
|
register("evalPkl") {
|
||||||
sourceModules.add(file("module1.pkl"))
|
sourceModules.add(file("module1.pkl"))
|
||||||
|
transitiveModules.from(file("module2.pkl"))
|
||||||
outputFile.set(layout.buildDirectory.file("module1.yaml"))
|
outputFile.set(layout.buildDirectory.file("module1.yaml"))
|
||||||
outputFormat.set("yaml")
|
outputFormat.set("yaml")
|
||||||
}
|
}
|
||||||
@@ -125,6 +127,9 @@ pkl {
|
|||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
|
To guarantee correct Gradle up-to-date behavior,
|
||||||
|
`transitiveModules` needs to contain all module files transitively referenced by `sourceModules`.
|
||||||
|
|
||||||
For each declared evaluator, the Pkl plugin creates an equally named task.
|
For each declared evaluator, the Pkl plugin creates an equally named task.
|
||||||
Hence the above evaluator can be run with:
|
Hence the above evaluator can be run with:
|
||||||
|
|
||||||
@@ -686,61 +691,3 @@ The project directories to create packages for.
|
|||||||
Common properties:
|
Common properties:
|
||||||
|
|
||||||
include::../partials/gradle-common-properties.adoc[]
|
include::../partials/gradle-common-properties.adoc[]
|
||||||
|
|
||||||
[[analyze-imports]]
|
|
||||||
== Analyze Imports
|
|
||||||
|
|
||||||
This feature is the Gradle analogy for the xref:pkl-cli:index.adoc#command-analyze-imports[analyze imports] command in the CLI. It builds a graph of imports of the provided source modules.
|
|
||||||
|
|
||||||
=== Usage
|
|
||||||
|
|
||||||
[tabs]
|
|
||||||
====
|
|
||||||
build.gradle::
|
|
||||||
+
|
|
||||||
[source,groovy]
|
|
||||||
----
|
|
||||||
pkl {
|
|
||||||
analyzers {
|
|
||||||
imports {
|
|
||||||
appConfig {
|
|
||||||
sourceModules.add(file("src/main/resources/appConfig.pkl"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
build.gradle.kts::
|
|
||||||
+
|
|
||||||
[source,kotlin]
|
|
||||||
----
|
|
||||||
pkl {
|
|
||||||
analyzers {
|
|
||||||
imports {
|
|
||||||
register("appConfig") {
|
|
||||||
sourceModules.add(file("src/main/resources/appConfig.pkl"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
====
|
|
||||||
|
|
||||||
=== Configuration Options
|
|
||||||
|
|
||||||
.outputFormat: Property<String>
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Same meaning as <<output-format,outputFormat>> in <<module-evaluation>>.
|
|
||||||
====
|
|
||||||
|
|
||||||
.outputFile: RegularFileProperty<String>
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Same meaning as <<output-file,outputFile>> in <<module-evaluation>>.
|
|
||||||
====
|
|
||||||
|
|
||||||
Common properties:
|
|
||||||
|
|
||||||
include::../partials/gradle-modules-properties.adoc[]
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ URI patterns that determine which modules can be loaded and evaluated.
|
|||||||
Patterns are matched against the beginning of module URIs.
|
Patterns are matched against the beginning of module URIs.
|
||||||
(File paths have been converted to `file:` URLs at this stage.)
|
(File paths have been converted to `file:` URLs at this stage.)
|
||||||
At least one pattern needs to match for a module to be loadable.
|
At least one pattern needs to match for a module to be loadable.
|
||||||
|
Both source modules and transitive modules are subject to this check.
|
||||||
====
|
====
|
||||||
|
|
||||||
.allowedResources: ListProperty<String>
|
.allowedResources: ListProperty<String>
|
||||||
@@ -67,13 +68,6 @@ The cache directory for storing packages.
|
|||||||
If `null`, defaults to `~/.pkl/cache`.
|
If `null`, defaults to `~/.pkl/cache`.
|
||||||
====
|
====
|
||||||
|
|
||||||
.color: Property<Boolean>
|
|
||||||
[%collapsible]
|
|
||||||
====
|
|
||||||
Default: `false` +
|
|
||||||
Format messages using ANSI color.
|
|
||||||
====
|
|
||||||
|
|
||||||
.noCache: Property<Boolean>
|
.noCache: Property<Boolean>
|
||||||
[%collapsible]
|
[%collapsible]
|
||||||
====
|
====
|
||||||
|
|||||||
@@ -20,17 +20,11 @@ This property accepts the following types to represent a module:
|
|||||||
.transitiveModules: ConfigurableFileCollection
|
.transitiveModules: ConfigurableFileCollection
|
||||||
[%collapsible]
|
[%collapsible]
|
||||||
====
|
====
|
||||||
Default: [computed by pkl-gradle] +
|
Default: `files()` (empty collection) +
|
||||||
Example 1: `transitiveModules.from files("module1.pkl", "module2.pkl")` +
|
Example 1: `transitiveModules.from files("module1.pkl", "module2.pkl")` +
|
||||||
Example 2: `+transitiveModules.from fileTree("config").include("**/*.pkl")+` +
|
Example 2: `+transitiveModules.from fileTree("config").include("**/*.pkl")+` +
|
||||||
|
|
||||||
File paths of modules that are directly or indirectly used by source modules.
|
File paths of modules that are directly or indirectly used by source modules.
|
||||||
|
Setting this option enables correct Gradle up-to-date checks, which ensures that your Pkl tasks are executed if any of the transitive files are modified; it does not affect evaluation otherwise.
|
||||||
This property, along with `sourceModules`, is the set of input files used to determine whether this task is up-to-date or not.
|
|
||||||
|
|
||||||
By default, Pkl computes this property by analyzing the imports of the source modules.
|
|
||||||
Setting this property explicitly causes Pkl to skip the analyze imports step.
|
|
||||||
|
|
||||||
Including source modules in `transitiveModules` is permitted but not required.
|
Including source modules in `transitiveModules` is permitted but not required.
|
||||||
Relative paths are resolved against the project directory.
|
Relative paths are resolved against the project directory.
|
||||||
====
|
====
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 70 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 71 KiB |
@@ -1,542 +0,0 @@
|
|||||||
= Pkl 0.27 Release Notes
|
|
||||||
:version: 0.27
|
|
||||||
:version-minor: 0.27.0
|
|
||||||
:release-date: November 5th, 2024
|
|
||||||
|
|
||||||
include::ROOT:partial$component-attributes.adoc[]
|
|
||||||
|
|
||||||
Pkl {version} was released on {release-date}. +
|
|
||||||
[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#
|
|
||||||
|
|
||||||
This release brings improvements in typechecking of `Listing` and `Mapping`, the ability to use readers from external processes, as well as a new import graph analyzer API.
|
|
||||||
|
|
||||||
The next release (0.28) is scheduled for February 2025.
|
|
||||||
|
|
||||||
Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[Github]. +
|
|
||||||
|
|
||||||
[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].
|
|
||||||
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
|
|
||||||
|
|
||||||
== Highlights [small]#💖#
|
|
||||||
|
|
||||||
News you don't want to miss.
|
|
||||||
|
|
||||||
[#typecheck-improvements]
|
|
||||||
=== Improved typechecking of `Listing` and `Mapping` types
|
|
||||||
|
|
||||||
Typechecking of `Listing` and `Mapping` types has been improved (https://github.com/apple/pkl/pull/628[#628], https://github.com/apple/pkl/pull/725[#725], https://github.com/apple/pkl/pull/740[#740], https://github.com/apple/pkl/pull/752[#752], https://github.com/apple/pkl/pull/778[#778], https://github.com/apple/pkl/pull/781[#781]).
|
|
||||||
|
|
||||||
Today, the typecheck `listing: Listing<E>` immediately evaluates all listing elements to check that they have type `E`.
|
|
||||||
Likewise, the typecheck `mapping: Mapping<K, V>` immediately evaluates all mapping values to check that they have type `V`.
|
|
||||||
|
|
||||||
For example, the typecheck `listing: Listing<Bird>` proceeds as follows:
|
|
||||||
|
|
||||||
1. Check that `listing` has type `Listing`
|
|
||||||
2. Evaluate each listing element and check that it has type `Bird`
|
|
||||||
|
|
||||||
This behavior is different from how the rest of Pkl works.
|
|
||||||
Generally, Pkl only evaluates code that affects program output.
|
|
||||||
|
|
||||||
For example, consider the following program:
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
class Bird {
|
|
||||||
name: String
|
|
||||||
canFly: Boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
local bird: Bird = new {
|
|
||||||
name = "Pidgy"
|
|
||||||
canFly = throw("uh oh")
|
|
||||||
}
|
|
||||||
|
|
||||||
birdName = bird.name
|
|
||||||
----
|
|
||||||
|
|
||||||
Even though `bird.canFly` throws an error, the above program succeeds because `bird.canFly` is not part of the program's output and hence is never accessed (Note that `bird` is a _local_ property).
|
|
||||||
|
|
||||||
Typechecks of `Mapping` and `Listing` types have been changed to match this behavior.
|
|
||||||
Mapping and listing values are now only typechecked if and when they are accessed.
|
|
||||||
|
|
||||||
NOTE: Mapping _keys_ are still eagerly checked.
|
|
||||||
|
|
||||||
This change causes some previously failing programs to evaluate successfully:
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
local myNumbers: Listing<Int> = new { 1; 2; "uh oh" }
|
|
||||||
result = myNumbers[0]
|
|
||||||
----
|
|
||||||
In Pkl 0.26 and below, the above program fails with a type mismatch error because element `"uh oh"` is typechecked when `myNumbers` is accessed.
|
|
||||||
In Pkl 0.27, the same program succeeds, because only element `myNumbers[0]` is part of the program's output and its typecheck succeeds.
|
|
||||||
|
|
||||||
As another consequence of this change, some Pkl programs now complete more quickly:
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
local allBirds: Mapping<String, Bird> = import*("**/bird.pkl")
|
|
||||||
|
|
||||||
environment: "prod"|"qa"
|
|
||||||
|
|
||||||
cluster: String
|
|
||||||
|
|
||||||
myBird = allBirds["\(environment)/\(cluster)/bird.pkl"] // <1>
|
|
||||||
----
|
|
||||||
In Pkl 0.26 and below, all modules matching `**/bird.pkl` are imported when `allBirds` is accessed and typechecked.
|
|
||||||
This can take a long time.
|
|
||||||
In Pkl 0.27, only module `"\(environment)/\(cluster)/bird.pkl"` is imported because only this module is part of the program's output.
|
|
||||||
|
|
||||||
To learn more about this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0010-overhauled-mapping-listing-typechecks.adoc[SPICE-0010].
|
|
||||||
|
|
||||||
=== External readers
|
|
||||||
|
|
||||||
A new feature has been added to allow Pkl to spawn external processes to read resources and modules (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/762[#762], https://github.com/apple/pkl/pull/766[#766], https://github.com/apple/pkl/pull/770[#770]).
|
|
||||||
|
|
||||||
Today, users who use Pkl as a library can define custom module and resource readers.
|
|
||||||
This allows authors to extend how Pkl performs I/O.
|
|
||||||
|
|
||||||
For example, users can implement a reader that reads the `secret:` scheme, where they define exactly how the bytes are fetched in the host runtime.
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
result = read("secret:mypassword") // <1>
|
|
||||||
----
|
|
||||||
<1> `secret:` is a custom scheme defined by the host runtime.
|
|
||||||
|
|
||||||
However, CLI users have been left out.
|
|
||||||
|
|
||||||
In Pkl 0.27, a new extension point is added to allow users to implement module and resource readers as external processes.
|
|
||||||
When run, Pkl will spawn the external process, and talk to the process via xref:bindings-specification:message-passing-api.adoc[message passing].
|
|
||||||
|
|
||||||
To learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0009-external-readers.adoc[SPICE-0009].
|
|
||||||
|
|
||||||
Thanks to https://github.com/HT154[@HT154] for contributing the feature!
|
|
||||||
|
|
||||||
[[import-analysis]]
|
|
||||||
=== Import analysis API
|
|
||||||
|
|
||||||
A new API has been added to analyze the import graph of Pkl modules (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
This API comes in four forms:
|
|
||||||
|
|
||||||
1. A standard library module: `pkl:analyze`
|
|
||||||
2. A CLI command: `pkl anaylze imports`
|
|
||||||
3. A Java API: `org.pkl.core.Analyzer`
|
|
||||||
4. A Gradle API: `org.pkl.gradle.task.AnalyzeImportsTask`
|
|
||||||
|
|
||||||
Some use-cases for this API are:
|
|
||||||
|
|
||||||
* For build tools to perform out-of-date checks. Build tools can invalidate a cached result if any of the transitive modules have changed.
|
|
||||||
* Static code analysis, to determine how Pkl modules depend on each other.
|
|
||||||
|
|
||||||
With this API, xref:pkl-gradle:index.adoc[] now by default <<transitive-modules-computed-by-default,computes the transitive modules>> for many of its tasks.
|
|
||||||
|
|
||||||
Here is an example of the CLI in use:
|
|
||||||
|
|
||||||
[source,shell]
|
|
||||||
----
|
|
||||||
pkl analyze imports -f json myModule.pkl # <1>
|
|
||||||
----
|
|
||||||
<1> `-f` means: produce output in JSON.
|
|
||||||
|
|
||||||
Produces:
|
|
||||||
|
|
||||||
[source,json]
|
|
||||||
----
|
|
||||||
{
|
|
||||||
"imports": {
|
|
||||||
"file:///my/proj/myModule.pkl": [
|
|
||||||
{
|
|
||||||
"uri": "projectpackage://example.com/birds@1.0.0#/Bird.pkl"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"projectpackage://example.com/birds@1.0.0#/Bird.pkl": []
|
|
||||||
},
|
|
||||||
"resolvedImports": {
|
|
||||||
"file:///my/proj/myModule.pkl": "file:///my/proj/myModule.pkl",
|
|
||||||
"projectpackage://example.com/birds@1.0.0#/Bird.pkl": "file:///my/birds/Bird.pkl"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
From this output, we can see that `myModule.pkl` imports `Bird.pkl` from the `birds` package.
|
|
||||||
We can also see that the module `projectpackage://example.com/birds@1.0.0#/Bird.pkl` resolves to disk location `\file:///my/birds/Bird.pkl` (we can deduce that `birds` is a xref:language-reference:index.adoc#local-dependencies[local dependency]).
|
|
||||||
|
|
||||||
To learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0001-import-graph-analyzer-api.adoc[SPICE-0001].
|
|
||||||
|
|
||||||
== Noteworthy [small]#🎶#
|
|
||||||
|
|
||||||
Ready when you need them.
|
|
||||||
|
|
||||||
=== Colored output
|
|
||||||
|
|
||||||
The Pkl CLI will now emit some messages in color (https://github.com/apple/pkl/pull/552[#552], https://github.com/apple/pkl/pull/746[#746], https://github.com/apple/pkl/pull/771[#771], https://github.com/apple/pkl/pull/779[#779]).
|
|
||||||
|
|
||||||
Here is a sneak peek of colored error messages in action.
|
|
||||||
|
|
||||||
image::error_sample.png[syntax highlighted output]
|
|
||||||
|
|
||||||
Thanks to https://github.com/thomaspurchas[@thomaspurchas] for contributing to this feature!
|
|
||||||
|
|
||||||
=== `const local` object members
|
|
||||||
|
|
||||||
The `const` modifier can be applied to object members, provided that they are also `local` (https://github.com/apple/pkl/pull/678[#678]).
|
|
||||||
|
|
||||||
Currently, regular object members are not allowed to have the `const` modifier.
|
|
||||||
This introduces an artificial pain point.
|
|
||||||
|
|
||||||
For example, given the following module:
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
amends "Bird.pkl"
|
|
||||||
|
|
||||||
import "Bird.pkl"
|
|
||||||
|
|
||||||
local northAmerica = "North America"
|
|
||||||
|
|
||||||
local typealias NorthAmericanBird = Bird(this.origin == northAmerica) // <1>
|
|
||||||
----
|
|
||||||
<1> Error: cannot reference `northAmerica` from here because it is not `const`.
|
|
||||||
|
|
||||||
This is invalid code, because this typealias is referencing a non-const value on the enclosing module.
|
|
||||||
However, is not possible fix this by adding the `const` modifier to `northAmerica`.
|
|
||||||
This is because this module `amends "Bird.pkl"`, which means that this module is considered a regular object and not a class.
|
|
||||||
This means that any members declared here are _object members_, and not _class members_.
|
|
||||||
|
|
||||||
In Pkl 0.27, a new rule is introduced to allow the `const` modifier to be applied to object members, provided that they are also `local`.
|
|
||||||
|
|
||||||
This change affects object properties, as well as object methods.
|
|
||||||
|
|
||||||
To read more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0011-const-object-members.adoc[SPICE-0011].
|
|
||||||
|
|
||||||
=== Pkl CLI changes
|
|
||||||
|
|
||||||
==== New CLI Flags
|
|
||||||
|
|
||||||
Some new common flags have been added to the CLI (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).
|
|
||||||
|
|
||||||
|===
|
|
||||||
|Flag |Description
|
|
||||||
|
|
||||||
|`--color`
|
|
||||||
|Format messages with ANSI color codes
|
|
||||||
|
|
||||||
|`--external-module-reader`
|
|
||||||
|Shell out to a process to read certain modules.
|
|
||||||
|
|
||||||
|`--external-resource-reader`
|
|
||||||
|Shell out to a process to read certain resources.
|
|
||||||
|===
|
|
||||||
|
|
||||||
==== New command: `pkl analyze imports`
|
|
||||||
|
|
||||||
As part of the set of APIs added for <<import-analysis,import analysis>>, a new subcommand has been added called `analyze imports` (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
For details, consult the xref:pkl-cli:index.adoc#command-analyze-imports[CLI documentation].
|
|
||||||
|
|
||||||
=== Kotlin/Java code generator improvements
|
|
||||||
|
|
||||||
Various improvements have been made to the Kotlin and Java code generators (https://github.com/apple/pkl/pull/705[#705], https://github.com/apple/pkl/pull/710[#710], https://github.com/apple/pkl/pull/714[#714], https://github.com/apple/pkl/pull/721[#721], https://github.com/apple/pkl/pull/729[#729]).
|
|
||||||
|
|
||||||
==== Java codegen improvements
|
|
||||||
|
|
||||||
* Only generate `hashCode()`, `equals()`, and `toString()` methods for Java classes that are instantiable.
|
|
||||||
* Add support for Spring Boot 3.
|
|
||||||
* Make module classes also implement serializable.
|
|
||||||
* Make empty Java classes instantiable.
|
|
||||||
|
|
||||||
==== Kotlin codegen improvements
|
|
||||||
|
|
||||||
* Skip generation of `copy()`, `equals()`, `hashCode()`, `toString()` methods for abstract Kotlin classes.
|
|
||||||
* Don't implement `Serializable` for abstract classes
|
|
||||||
* Add support for Spring Boot 3.
|
|
||||||
|
|
||||||
Thanks to https://github.com/translatenix[@translatenix] for contributing these improvements!
|
|
||||||
|
|
||||||
=== Gradle Plugin changes
|
|
||||||
|
|
||||||
==== New `AnalyzeImportsTask`
|
|
||||||
|
|
||||||
A new task called `org.pkl.gradle.task.AnalyzeImportsTask` is introduced (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
This task is the Gradle analogy to `pkl analyze imports`.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
[tabs]
|
|
||||||
====
|
|
||||||
build.gradle::
|
|
||||||
+
|
|
||||||
[source,groovy]
|
|
||||||
----
|
|
||||||
pkl {
|
|
||||||
analyzers {
|
|
||||||
imports {
|
|
||||||
appConfig {
|
|
||||||
sourceModules.add(file("src/main/resources/appConfig.pkl"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
build.gradle.kts::
|
|
||||||
+
|
|
||||||
[source,kotlin]
|
|
||||||
----
|
|
||||||
pkl {
|
|
||||||
analyzers {
|
|
||||||
imports {
|
|
||||||
register("appConfig") {
|
|
||||||
sourceModules.add(file("src/main/resources/appConfig.pkl"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
====
|
|
||||||
|
|
||||||
For more details, consult the xref:pkl-gradle:index.adoc#analyze-imports[documentation].
|
|
||||||
|
|
||||||
==== Tracked file outputs
|
|
||||||
|
|
||||||
Tasks created by the Pkl plugin now declare tracked output files (https://github.com/apple/pkl/pull/403[#403]).
|
|
||||||
|
|
||||||
This means that downstream tasks do not need to declare an explicit dependency on the Pkl task.
|
|
||||||
|
|
||||||
For example, assuming that `evalPkl` is an `EvalTask`:
|
|
||||||
|
|
||||||
.build.gradle.kts
|
|
||||||
[source,diff]
|
|
||||||
----
|
|
||||||
val myGradleTask by tasks.registering {
|
|
||||||
inputs.files(evalPkl)
|
|
||||||
- dependsOn(evalPkl) // <1>
|
|
||||||
}
|
|
||||||
----
|
|
||||||
<1> No longer necessary to declare this dependency.
|
|
||||||
|
|
||||||
[[transitive-modules-computed-by-default]]
|
|
||||||
==== `transitiveModules` computed by default
|
|
||||||
|
|
||||||
The `transitiveModules` property of a task is now computed by building the import graph of the source modules (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
This means that Pkl-related tasks no longer need to declare their set of transitive modules, because the pkl-gradle plugin will compute this automatically.
|
|
||||||
|
|
||||||
NOTE: This adds latency to each task. To opt out of this behavior, set `transitiveModules` explicitly.
|
|
||||||
|
|
||||||
=== Standard library changes
|
|
||||||
|
|
||||||
==== Additions to `pkl:base`
|
|
||||||
|
|
||||||
New properties and methods have been added to the classes of `pkl:base` (https://github.com/apple/pkl/pull/666[#666], https://github.com/apple/pkl/pull/683[#683]).
|
|
||||||
|
|
||||||
New properties and methods have been added to {uri-stdlib-Listing}[`Listing`] and {uri-stdlib-Mapping}[`Mapping`].
|
|
||||||
|
|
||||||
One of the goals of this change is to improve the experience of authoring constraints.
|
|
||||||
This eliminates the need to convert to collection types as often.
|
|
||||||
|
|
||||||
The added properties and methods are:
|
|
||||||
|
|
||||||
* {uri-stdlib-Listing}#first[`Listing.first`]
|
|
||||||
* {uri-stdlib-Listing}#firstOrNull[`Listing.firstOrNull`]
|
|
||||||
* {uri-stdlib-Listing}#last[`Listing.last`]
|
|
||||||
* {uri-stdlib-Listing}#lastOrNull[`Listing.lastOrNull`]
|
|
||||||
* {uri-stdlib-Listing}#single[`Listing.single`]
|
|
||||||
* {uri-stdlib-Listing}#singleOrNull[`Listing.singleOrNull`]
|
|
||||||
* {uri-stdlib-Listing}#every()[`Listing.every()`]
|
|
||||||
* {uri-stdlib-Listing}#any()[`Listing.any()`]
|
|
||||||
* {uri-stdlib-Listing}#contains()[`Listing.contains()`]
|
|
||||||
* {uri-stdlib-Mapping}#containsValue()[`Mapping.containsValue()`]
|
|
||||||
* {uri-stdlib-Mapping}#every()[`Mapping.every()`]
|
|
||||||
* {uri-stdlib-Mapping}#any()[`Mapping.any()`]
|
|
||||||
|
|
||||||
With this, the following change can be made to existing constraints:
|
|
||||||
|
|
||||||
[source,diff]
|
|
||||||
----
|
|
||||||
-ipAddresses: Listing<String>(toList().contains("127.0.0.1"))
|
|
||||||
+ipAddresses: Listing<String>(contains("127.0.0.1"))
|
|
||||||
----
|
|
||||||
|
|
||||||
Additionally, a new method is added to `String`, called {uri-stdlib-String}#splitLimit()[`String.splitLimit()`].
|
|
||||||
|
|
||||||
==== Additions to `pkl:EvaluatorSettings`
|
|
||||||
|
|
||||||
New properties have been added to `pkl:EvaluatorSettings` (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).
|
|
||||||
|
|
||||||
These are:
|
|
||||||
|
|
||||||
* {uri-stdlib-evaluatorSettingsModule}/#color[`color`]
|
|
||||||
* {uri-stdlib-evaluatorSettingsModule}/#externalModuleReaders[`externalModuleReaders`]
|
|
||||||
* {uri-stdlib-evaluatorSettingsModule}/#externalResourceReaders[`externalResourceReaders`]
|
|
||||||
|
|
||||||
==== `String` to `Number` conversion improvements.
|
|
||||||
|
|
||||||
The `String` to `Number` converter methods, for example, {uri-stdlib-StringToInt}[`String.toInt()`], can now handle underscore separators (https://github.com/apple/pkl/pull/578[#578], https://github.com/apple/pkl/pull/580[#580]).
|
|
||||||
|
|
||||||
This better aligns with the source code representation of file:///Users/danielchao/code/apple/pkl-lang.org/build/local/main/current/language-reference/index.html#integers[number literals].
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
myNum = "1_000".toInt() // <1>
|
|
||||||
----
|
|
||||||
<1> Result: `1000`
|
|
||||||
|
|
||||||
==== New module: `pkl:analyze`
|
|
||||||
|
|
||||||
As part of <<import-analysis>>, a new standard library module is added called `pkl:analyze` (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
This module provides an API for computing the total import graph given a set of input modules.
|
|
||||||
This API treats the inputs as entrypoints, and produces a graph representing the entire dependency tree, including transitive imports.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
import "pkl:analyze"
|
|
||||||
|
|
||||||
importGraph: analyze.ImportGraph = analyze.importGraph(Set("file:///path/to/my/module.pkl"))
|
|
||||||
----
|
|
||||||
|
|
||||||
For details, see the {uri-stdlib-analyzeModule}[documentation].
|
|
||||||
|
|
||||||
=== Annotations on `PklProject` added to packages
|
|
||||||
|
|
||||||
When creating packages, some annotations on a `PklProject` will affect how pkldoc generates documentation.
|
|
||||||
|
|
||||||
* `@Unlisted`: Omit the package from publishing documentation.
|
|
||||||
* `@Deprecated`: Add information on the package to show that it is deprecated.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
.PklProject
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
@Deprecated
|
|
||||||
amends "pkl:Project"
|
|
||||||
----
|
|
||||||
|
|
||||||
=== Test report improvements
|
|
||||||
|
|
||||||
The report generated from `pkl test` has been overhauled and improved (https://github.com/apple/pkl/pull/498[#498], https://github.com/apple/pkl/pull/628[#682], https://github.com/apple/pkl/pull/738[#738], https://github.com/apple/pkl/pull/771[#771]).
|
|
||||||
|
|
||||||
* Tests are grouped into either the `facts` or `examples` section.
|
|
||||||
* A summary line is added, describing how many tests have passed and failed, and how many assertions have passed and failed.
|
|
||||||
* Test results are colored.
|
|
||||||
* The ✅ and ❌ emojis are replaced with ✔ and ✘.
|
|
||||||
* Thrown errors are reported within the test.
|
|
||||||
|
|
||||||
Here is a sneak peek of the new test result output.
|
|
||||||
|
|
||||||
image::test_sample.png[]
|
|
||||||
|
|
||||||
Thanks to https://github.com/jjmaestro[@jjmaestro] for contributing to this improvement!
|
|
||||||
|
|
||||||
=== Java API additions
|
|
||||||
|
|
||||||
==== New API: `org.pkl.core.Analyzer`
|
|
||||||
|
|
||||||
As part of <<import-analysis>>, a new Java API called `org.pkl.core.Analyzer` is introduced (https://github.com/apple/pkl/pull/695[#695]).
|
|
||||||
|
|
||||||
==== New methods
|
|
||||||
|
|
||||||
The following methods are added:
|
|
||||||
|
|
||||||
**pkl-executor**
|
|
||||||
|
|
||||||
* `org.pkl.executor.ExecutorException.getPklVersion`
|
|
||||||
* `org.pkl.executor.ExecutorException.ExecutorException(java.lang.String, java.lang.Throwable, java.lang.String)`
|
|
||||||
|
|
||||||
**pkl-core**
|
|
||||||
|
|
||||||
* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess)`
|
|
||||||
* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess, long)`
|
|
||||||
|
|
||||||
== Breaking Changes [small]#💔#
|
|
||||||
|
|
||||||
Things to watch out for when upgrading.
|
|
||||||
|
|
||||||
=== Java API breaking changes
|
|
||||||
|
|
||||||
The following Java APIs have breaking changes:
|
|
||||||
|
|
||||||
|===
|
|
||||||
|Class/method | Breaking change
|
|
||||||
|
|
||||||
|`org.pkl.core.runtime.TestResults`
|
|
||||||
|Moved to `org.pkl.core.TestResults`, turned into a record, and largely restructured.
|
|
||||||
|
|
||||||
|`org.pkl.core.module.ModuleKeyFactories.closeQuietly`
|
|
||||||
|Deprecated for removal in favor of `org.pkl.core.Closeables.closeQuietly`.
|
|
||||||
|===
|
|
||||||
|
|
||||||
=== Spring Boot 2 support dropped
|
|
||||||
|
|
||||||
The Java code generator no longer supports Spring Boot 2.x (https://github.com/apple/pkl/pull/729[#729]).
|
|
||||||
|
|
||||||
Spring Boot 2 users can continue to use the Pkl 0.26 code generator.
|
|
||||||
|
|
||||||
=== `pkl test` considered failing when writing examples
|
|
||||||
|
|
||||||
If running `pkl test` results in `pkl-expected.pcf` files being written, the test now exits with exit code `10` (https://github.com/apple/pkl/pull/738[#738]).
|
|
||||||
|
|
||||||
Additionally, the junit reports will consider the test as failing.
|
|
||||||
|
|
||||||
=== `Listing` and `Mapping` typecheck changes
|
|
||||||
|
|
||||||
Due to changes to <<typecheck-improvements,Listing and Mapping typechecking>>, some previously failing programs now succeed.
|
|
||||||
This can happen when erroneous code is never evaluated because it does not affect program output:
|
|
||||||
|
|
||||||
[source,pkl]
|
|
||||||
----
|
|
||||||
local myNumbers: Listing<Int> = new { 1; 2; "uh oh" }
|
|
||||||
result = myNumbers[0] // <1>
|
|
||||||
----
|
|
||||||
<1> In Pkl 0.26 and below, throws a type mismatch error.
|
|
||||||
+
|
|
||||||
In Pkl 0.27, yields `1`.
|
|
||||||
|
|
||||||
== Miscellaneous [small]#🐸#
|
|
||||||
|
|
||||||
* Make pkl-doc top box include a preview of the rest of module-level documentation (https://github.com/apple/pkl/pull/570[#570]).
|
|
||||||
* Module `pkl-core` now has a dependency on `org.msgpack:msgpack-core` (https://github.com/apple/pkl/pull/660[#660]). Users concerned about potential version conflicts can use one of Pkl's shaded fat JARs (`pkl-config-java-all`, `pkl-tools`).
|
|
||||||
* Make PklProject.deps.json files end in a newline (https://github.com/apple/pkl/pull/664[#644]).
|
|
||||||
* Fix invalid syntax of code examples in stdlib doc comments (https://github.com/apple/pkl/pull/703[#703]).
|
|
||||||
* Update Java dependencies (https://github.com/apple/pkl/pull/689[#689], https://github.com/apple/pkl/pull/767[#767]).
|
|
||||||
* Add jbang catalog support (https://github.com/apple/pkl/pull/655[#655]).
|
|
||||||
* Documentation improvements (https://github.com/apple/pkl/pull/623[#623], https://github.com/apple/pkl/pull/680[#680], https://github.com/apple/pkl/pull/682[#682], https://github.com/apple/pkl/pull/685[#685], https://github.com/apple/pkl/pull/687[#687], https://github.com/apple/pkl/pull/703[#703], https://github.com/apple/pkl/pull/704[#704], https://github.com/apple/pkl/pull/715[#715], https://github.com/apple/pkl/pull/730[#730], https://github.com/apple/pkl/pull/753[#753]).
|
|
||||||
|
|
||||||
== Bug Fixes [small]#🐜#
|
|
||||||
|
|
||||||
The following bugs have been fixed.
|
|
||||||
|
|
||||||
* CLI `--property` flags containing `=` in property values are not parsed correctly (https://github.com/apple/pkl/issues/630[#630]).
|
|
||||||
* Thrown `PklBugException` when reading assets from a local project dependency (https://github.com/apple/pkl/issues/641[#641]).
|
|
||||||
* Thrown `PklBugException` when PklProjects have a cyclical local dependency (https://github.com/apple/pkl/pull/731[#731]).
|
|
||||||
* Thrown exception when sending `ReadResourceResponse` or `ReadModuleResponse` where both `contents` and `error` are `null` (https://github.com/apple/pkl/pull/657[#657]).
|
|
||||||
* Double unary minus is evaluated as single unary minus (https://github.com/apple/pkl/pull/697[#697]).
|
|
||||||
* Kotlin compiler fails to compiler generated classes with "copy overrides nothing" for subclasses of abstract classes (https://github.com/apple/pkl/issues/569[#569]).
|
|
||||||
* "Unexpected error" thrown when `Module.output` has its type overridden (https://github.com/apple/pkl/issues/709[#709]).
|
|
||||||
* "Unexpected error" thrown when loading files with non-ASCII characters (https://github.com/apple/pkl/issues/653[#653]).
|
|
||||||
* Type parameters in `new Mapping<TypeA, TypeB>`/`new Listing <Type>` are not checked (https://github.com/apple/pkl/issues/405[#405]).
|
|
||||||
* Comparison methods of `pkl:semver` are incorrect (https://github.com/apple/pkl/issues/772[#772]).
|
|
||||||
|
|
||||||
== Contributors [small]#🙏#
|
|
||||||
|
|
||||||
We would like to thank the contributors to this release (in alphabetical order):
|
|
||||||
|
|
||||||
* https://github.com/djarnis73[@djarnis73]
|
|
||||||
* https://github.com/kasugamirai[@kasugamirai]
|
|
||||||
* https://github.com/KushalP[@KushalP]
|
|
||||||
* https://github.com/jjmaestro[@jjmaestro]
|
|
||||||
* https://github.com/HT154[@HT154]
|
|
||||||
* https://github.com/lamtrinhdev[@lamtrinhdev]
|
|
||||||
* https://github.com/ManuW[@ManuW]
|
|
||||||
* https://github.com/maxandersen[@maxandersen]
|
|
||||||
* https://github.com/netvl[@netvl]
|
|
||||||
* https://github.com/StefMa[@StefMa]
|
|
||||||
* https://github.com/taichi-ishitani[@taichi-ishitani]
|
|
||||||
* https://github.com/thomaspurchas[@thomaspurchas]
|
|
||||||
* https://github.com/translatenix[@translatenix]
|
|
||||||
@@ -1,11 +1,6 @@
|
|||||||
= Changelog
|
= Changelog
|
||||||
include::ROOT:partial$component-attributes.adoc[]
|
include::ROOT:partial$component-attributes.adoc[]
|
||||||
|
|
||||||
[[release-0.27.0]]
|
|
||||||
== 0.27.0 (2024-11-05)
|
|
||||||
|
|
||||||
xref:0.27.adoc[Release notes]
|
|
||||||
|
|
||||||
[[release-0.26.3]]
|
[[release-0.26.3]]
|
||||||
== 0.26.3 (2024-08-06)
|
== 0.26.3 (2024-08-06)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
= Release Notes
|
= Release Notes
|
||||||
|
|
||||||
* xref:0.27.adoc[0.27 Release Notes]
|
|
||||||
* xref:0.26.adoc[0.26 Release Notes]
|
* xref:0.26.adoc[0.26 Release Notes]
|
||||||
* xref:0.25.adoc[0.25 Release Notes]
|
* xref:0.25.adoc[0.25 Release Notes]
|
||||||
* xref:changelog.adoc[Changelog]
|
* xref:changelog.adoc[Changelog]
|
||||||
|
|||||||
@@ -39,7 +39,6 @@
|
|||||||
* xref:ROOT:examples.adoc[Examples]
|
* xref:ROOT:examples.adoc[Examples]
|
||||||
|
|
||||||
* xref:release-notes:index.adoc[Release Notes]
|
* xref:release-notes:index.adoc[Release Notes]
|
||||||
** xref:release-notes:0.27.adoc[0.27 Release Notes]
|
|
||||||
** xref:release-notes:0.26.adoc[0.26 Release Notes]
|
** xref:release-notes:0.26.adoc[0.26 Release Notes]
|
||||||
** xref:release-notes:0.25.adoc[0.25 Release Notes]
|
** xref:release-notes:0.25.adoc[0.25 Release Notes]
|
||||||
** xref:release-notes:changelog.adoc[Changelog]
|
** xref:release-notes:changelog.adoc[Changelog]
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ import org.pkl.core.parser.antlr.PklParser
|
|||||||
import org.pkl.core.repl.ReplRequest
|
import org.pkl.core.repl.ReplRequest
|
||||||
import org.pkl.core.repl.ReplResponse
|
import org.pkl.core.repl.ReplResponse
|
||||||
import org.pkl.core.repl.ReplServer
|
import org.pkl.core.repl.ReplServer
|
||||||
|
import org.pkl.core.resource.ResourceReaders
|
||||||
import org.pkl.core.util.IoUtils
|
import org.pkl.core.util.IoUtils
|
||||||
import org.antlr.v4.runtime.ParserRuleContext
|
import org.antlr.v4.runtime.ParserRuleContext
|
||||||
import org.pkl.core.http.HttpClient
|
import org.pkl.core.http.HttpClient
|
||||||
import org.pkl.core.resource.ResourceReaders
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import kotlin.io.path.isDirectory
|
import kotlin.io.path.isDirectory
|
||||||
import kotlin.io.path.isRegularFile
|
import kotlin.io.path.isRegularFile
|
||||||
@@ -41,7 +41,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
|||||||
companion object {
|
companion object {
|
||||||
val headingRegex = Regex("""(?u)^\s*(=++)\s*(.+)""")
|
val headingRegex = Regex("""(?u)^\s*(=++)\s*(.+)""")
|
||||||
val collapsibleBlockRegex = Regex("""(?u)^\s*\[%collapsible""")
|
val collapsibleBlockRegex = Regex("""(?u)^\s*\[%collapsible""")
|
||||||
val codeBlockRegex = Regex("""(?u)^\s*\[source(?:%(tested|parsed)(%error)?)?(?:,\{?([a-zA-Z-_]+)}?)?""")
|
val codeBlockRegex = Regex("""(?u)^\s*\[source(?:%(tested|parsed)(%error)?)?(?:,(?:\{)?([a-zA-Z-_]+)}?)?""")
|
||||||
val codeBlockNameRegex = Regex("""(?u)^\s*\.(.+)""")
|
val codeBlockNameRegex = Regex("""(?u)^\s*\.(.+)""")
|
||||||
val codeBlockDelimiterRegex = Regex("""(?u)^\s*----""")
|
val codeBlockDelimiterRegex = Regex("""(?u)^\s*----""")
|
||||||
val graphicsRegex = Regex("\\[small]#.+#")
|
val graphicsRegex = Regex("\\[small]#.+#")
|
||||||
@@ -96,8 +96,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
|||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
IoUtils.getCurrentWorkingDir(),
|
IoUtils.getCurrentWorkingDir(),
|
||||||
StackFrameTransformers.defaultTransformer,
|
StackFrameTransformers.defaultTransformer
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
return ExecutionContext(replServer)
|
return ExecutionContext(replServer)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# suppress inspection "UnusedProperty" for whole file
|
# suppress inspection "UnusedProperty" for whole file
|
||||||
|
|
||||||
group=org.pkl-lang
|
group=org.pkl-lang
|
||||||
version=0.27.0
|
version=0.26.3
|
||||||
|
|
||||||
# google-java-format requires jdk.compiler exports
|
# google-java-format requires jdk.compiler exports
|
||||||
org.gradle.jvmargs= \
|
org.gradle.jvmargs= \
|
||||||
|
|||||||
+16
-19
@@ -1,32 +1,30 @@
|
|||||||
[versions] # ordered alphabetically
|
[versions] # ordered alphabetically
|
||||||
antlr = "4.+"
|
antlr = "4.+"
|
||||||
assertj = "3.+"
|
assertj = "3.+"
|
||||||
checksumPlugin = "1.4.0"
|
checksumPlugin = "1.2.0"
|
||||||
clikt = "3.+"
|
clikt = "3.5.1"
|
||||||
commonMark = "0.+"
|
commonMark = "0.+"
|
||||||
downloadTaskPlugin = "5.6.0"
|
downloadTaskPlugin = "5.6.0"
|
||||||
geantyref = "1.+"
|
geantyref = "1.+"
|
||||||
googleJavaFormat = "1.21.0"
|
googleJavaFormat = "1.21.0"
|
||||||
# must not use `+` because used in download URL
|
# must not use `+` because used in download URL
|
||||||
# 23.1.x requires JDK 20+
|
graalVm = "23.0.2"
|
||||||
graalVm = "23.0.6"
|
graalVmJdkVersion = "17.0.10"
|
||||||
graalVmJdkVersion = "17.0.12"
|
|
||||||
# slightly hacky but convenient place so we remember to update the checksum
|
# slightly hacky but convenient place so we remember to update the checksum
|
||||||
graalVmSha256-macos-x64 = "3ecac1471f3fa95a56c5b75c65db9e60ac4551f56eda09eb9da95e6049ea77d7"
|
graalVmSha256-macos-x64 = "14f4bd6417809905f86e786c779d0fc2feb840d7dac35ae3503eb25af0530da0"
|
||||||
graalVmSha256-macos-aarch64 = "4cdfdc6c9395f6773efcd191b6605f1b7c8e1b78ab900ab5cff34720a3feffc5"
|
graalVmSha256-macos-aarch64 = "e944c5ce5da56e683fc8f1a57191b46d9cb702930b1688bda064fcf467d876b8"
|
||||||
graalVmSha256-linux-x64 = "b6f3dace24cf1960ec790216f4c86f00d4f43df64e4e8b548f6382f04894713f"
|
graalVmSha256-linux-x64 = "112dc9b92d81a946f1b5b334646151b790785c813e76fcf13527a319003d7e2c"
|
||||||
graalVmSha256-linux-aarch64 = "bd991d486b92deb74337b881e0f13a764c9c1e90fc358819080f7321fa5175e8"
|
graalVmSha256-linux-aarch64 = "c95ac550d070f06666cf8c1023a098380dd565be00866473caf6ff1b7cdf680c"
|
||||||
graalVmSha256-windows-x64 = "8b978e56dddc0edc60db99794b56975740d9c52293b31549cfc3f7516fc18b43"
|
graalVmSha256-windows-x64 = "1ab2291e71f54d73e3e57b7fccbf184cabcba37e16ca9d1cf42d08474a7c02f0"
|
||||||
ideaExtPlugin = "1.1.9"
|
ideaExtPlugin = "1.1"
|
||||||
javaPoet = "1.+"
|
javaPoet = "1.+"
|
||||||
javaxInject = "1"
|
javaxInject = "1"
|
||||||
jansi = "2.+"
|
jansi = "2.+"
|
||||||
jimfs = "1.+"
|
jimfs = "1.+"
|
||||||
# later versions don't work with native image
|
# 3.25.1 doesn't work with native image
|
||||||
# (at least not without additional configuration; tested with 3.25.1 and 3.27.1)
|
|
||||||
jline = "3.23.0"
|
jline = "3.23.0"
|
||||||
jmh = "1.+"
|
jmh = "1.+"
|
||||||
jmhPlugin = "0.7.2"
|
jmhPlugin = "0.6.6"
|
||||||
jsr305 = "3.+"
|
jsr305 = "3.+"
|
||||||
junit = "5.+"
|
junit = "5.+"
|
||||||
kotlin = "1.7.10"
|
kotlin = "1.7.10"
|
||||||
@@ -40,16 +38,15 @@ ktfmt = "0.44"
|
|||||||
# replaces nuValidator's log4j dependency
|
# replaces nuValidator's log4j dependency
|
||||||
# something related to log4j-1.2-api is apparently broken in 2.17.2
|
# something related to log4j-1.2-api is apparently broken in 2.17.2
|
||||||
log4j = "2.17.1"
|
log4j = "2.17.1"
|
||||||
msgpack = "0.9.8"
|
msgpack = "0.9.0"
|
||||||
nexusPublishPlugin = "2.0.0"
|
nexusPublishPlugin = "1.3.0"
|
||||||
nuValidator = "20.+"
|
nuValidator = "20.+"
|
||||||
paguro = "3.+"
|
paguro = "3.+"
|
||||||
shadowPlugin = "8.1.1"
|
shadowPlugin = "8.1.1"
|
||||||
slf4j = "1.+"
|
slf4j = "1.+"
|
||||||
# snakeYaml 2.6 removed DumpSettingsBuilder::setScalarResolver,
|
# Breaking change in snakeYaml 2.6 (removing DumpSettingsBuilder::setScalarResolver), so pin to 2.5
|
||||||
# which is used by the external YAML renderer (org.pkl.core.YamlRenderer)
|
|
||||||
snakeYaml = "2.5"
|
snakeYaml = "2.5"
|
||||||
spotlessPlugin = "6.25.0"
|
spotlessPlugin = "6.11.0"
|
||||||
wiremock = "3.+"
|
wiremock = "3.+"
|
||||||
|
|
||||||
[libraries] # ordered alphabetically
|
[libraries] # ordered alphabetically
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
@@ -57,7 +55,7 @@
|
|||||||
# Darwin, MinGW, and NonStop.
|
# Darwin, MinGW, and NonStop.
|
||||||
#
|
#
|
||||||
# (3) This script is generated from the Groovy template
|
# (3) This script is generated from the Groovy template
|
||||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
# within the Gradle project.
|
# within the Gradle project.
|
||||||
#
|
#
|
||||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
@@ -86,8 +84,7 @@ done
|
|||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
APP_BASE_NAME=${0##*/}
|
APP_BASE_NAME=${0##*/}
|
||||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||||
' "$PWD" ) || exit
|
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD=maximum
|
MAX_FD=maximum
|
||||||
|
|||||||
Vendored
-2
@@ -13,8 +13,6 @@
|
|||||||
@rem See the License for the specific language governing permissions and
|
@rem See the License for the specific language governing permissions and
|
||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
@rem SPDX-License-Identifier: Apache-2.0
|
|
||||||
@rem
|
|
||||||
|
|
||||||
@if "%DEBUG%"=="" @echo off
|
@if "%DEBUG%"=="" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"catalogs": {},
|
|
||||||
"aliases": {
|
|
||||||
"pkl": {
|
|
||||||
"script-ref": "org.pkl-lang:pkl-cli-java:0.27.0",
|
|
||||||
"java-agents": []
|
|
||||||
},
|
|
||||||
"pkl-codegen-java": {
|
|
||||||
"script-ref": "org.pkl-lang:pkl-codegen-java:0.27.0",
|
|
||||||
"java-agents": []
|
|
||||||
},
|
|
||||||
"pkl-codegen-kotlin": {
|
|
||||||
"script-ref": "org.pkl-lang:pkl-codegen-kotlin:0.27.0",
|
|
||||||
"java-agents": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"templates": {}
|
|
||||||
}
|
|
||||||
+67
-65
@@ -1,30 +1,30 @@
|
|||||||
# This is a Gradle generated file for dependency locking.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
com.ethlo.time:itu:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.ethlo.time:itu:1.8.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson.core:jackson-annotations:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson.core:jackson-annotations:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson.core:jackson-core:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson.core:jackson-core:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson.core:jackson-databind:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson.core:jackson-databind:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.fasterxml.jackson:jackson-bom:2.17.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.fasterxml.jackson:jackson-bom:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.github.ajalt.clikt:clikt-jvm:3.5.4=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
|
com.github.ajalt.clikt:clikt-jvm:3.5.1=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
|
||||||
com.github.ajalt.clikt:clikt:3.5.4=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.github.ajalt.clikt:clikt:3.5.1=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.github.jknack:handlebars-helpers:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.github.jknack:handlebars-helpers:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.github.jknack:handlebars:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.github.jknack:handlebars:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.google.errorprone:error_prone_annotations:2.28.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.google.errorprone:error_prone_annotations:2.26.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.google.guava:failureaccess:1.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.google.guava:failureaccess:1.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.google.guava:guava:33.3.1-jre=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.google.guava:guava:33.2.0-jre=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.google.j2objc:j2objc-annotations:3.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.google.j2objc:j2objc-annotations:3.0.0=testCompileClasspath,testImplementationDependenciesMetadata
|
||||||
com.jayway.jsonpath:json-path:2.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.jayway.jsonpath:json-path:2.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.networknt:json-schema-validator:1.5.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.networknt:json-schema-validator:1.4.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.tunnelvisionlabs:antlr4-runtime:4.9.0=runtimeClasspath,testRuntimeClasspath
|
com.tunnelvisionlabs:antlr4-runtime:4.9.0=default,runtimeClasspath,testRuntimeClasspath
|
||||||
commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
commons-io:commons-io:2.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
commons-io:commons-io:2.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.bytebuddy:byte-buddy:1.14.18=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
net.javacrumbs.json-unit:json-unit-core:2.40.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.javacrumbs.json-unit:json-unit-core:2.38.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.minidev:accessors-smart:2.5.1=testRuntimeClasspath
|
net.minidev:accessors-smart:2.5.1=testRuntimeClasspath
|
||||||
net.minidev:json-smart:2.5.1=testRuntimeClasspath
|
net.minidev:json-smart:2.5.1=testRuntimeClasspath
|
||||||
net.sf.jopt-simple:jopt-simple:5.0.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.sf.jopt-simple:jopt-simple:5.0.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
@@ -32,36 +32,37 @@ org.apache.httpcomponents.client5:httpclient5:5.3.1=testCompileClasspath,testImp
|
|||||||
org.apache.httpcomponents.core5:httpcore5-h2:5.2.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.apache.httpcomponents.core5:httpcore5-h2:5.2.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.apache.httpcomponents.core5:httpcore5:5.2.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.apache.httpcomponents.core5:httpcore5:5.2.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||||
org.assertj:assertj-core:3.26.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.checkerframework:checker-qual:3.43.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.checkerframework:checker-qual:3.42.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty.http2:http2-common:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty.http2:http2-common:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty.http2:http2-hpack:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty.http2:http2-hpack:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty.http2:http2-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty.http2:http2-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-alpn-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-alpn-client:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-alpn-java-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-alpn-java-client:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-alpn-java-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-alpn-java-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-alpn-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-alpn-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-bom:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-bom:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-client:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-http:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-http:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-io:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-io:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-proxy:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-proxy:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-security:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-security:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-servlet:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-servlet:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-servlets:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-servlets:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-util:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-util:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-webapp:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-webapp:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.eclipse.jetty:jetty-xml:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.eclipse.jetty:jetty-xml:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
|
org.fusesource.jansi:jansi:2.4.0=default
|
||||||
org.fusesource.jansi:jansi:2.4.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.fusesource.jansi:jansi:2.4.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.graalvm.compiler:compiler:23.0.6=compileClasspath,compileOnlyDependenciesMetadata
|
org.graalvm.compiler:compiler:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
|
||||||
org.graalvm.nativeimage:native-image-base:23.0.6=compileClasspath,compileOnlyDependenciesMetadata
|
org.graalvm.nativeimage:native-image-base:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
|
||||||
org.graalvm.nativeimage:objectfile:23.0.6=compileClasspath,compileOnlyDependenciesMetadata
|
org.graalvm.nativeimage:objectfile:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
|
||||||
org.graalvm.nativeimage:pointsto:23.0.6=compileClasspath,compileOnlyDependenciesMetadata
|
org.graalvm.nativeimage:pointsto:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
|
||||||
org.graalvm.nativeimage:svm:23.0.6=compileClasspath,compileOnlyDependenciesMetadata
|
org.graalvm.nativeimage:svm:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
|
||||||
org.graalvm.sdk:graal-sdk:23.0.6=compileClasspath,compileOnlyDependenciesMetadata,runtimeClasspath,testRuntimeClasspath
|
org.graalvm.sdk:graal-sdk:23.0.2=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.graalvm.truffle:truffle-api:23.0.6=compileClasspath,compileOnlyDependenciesMetadata,runtimeClasspath,testRuntimeClasspath
|
org.graalvm.truffle:truffle-api:23.0.2=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.hamcrest:hamcrest-core:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.hamcrest:hamcrest-core:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.hamcrest:hamcrest:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.hamcrest:hamcrest:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
@@ -74,29 +75,30 @@ org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspat
|
|||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jline:jline-native:3.23.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jline:jline-native:3.23.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jline:jline-reader:3.23.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jline:jline-reader:3.23.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jline:jline-terminal-jansi:3.23.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jline:jline-terminal-jansi:3.23.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jline:jline-terminal:3.23.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jline:jline-terminal:3.23.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.jupiter:junit-jupiter-api:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-engine:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-engine:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-params:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.platform:junit-platform-commons:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.platform:junit-platform-engine:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit:junit-bom:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.msgpack:msgpack-core:0.9.8=runtimeClasspath,testRuntimeClasspath
|
org.msgpack:msgpack-core:0.9.0=default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath
|
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.slf4j:slf4j-api:2.0.13=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.slf4j:slf4j-api:2.0.11=testRuntimeClasspath
|
||||||
org.snakeyaml:snakeyaml-engine:2.5=runtimeClasspath,testRuntimeClasspath
|
org.slf4j:slf4j-api:2.0.9=testCompileClasspath,testImplementationDependenciesMetadata
|
||||||
org.wiremock:wiremock:3.9.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
|
||||||
|
org.wiremock:wiremock:3.6.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.xmlunit:xmlunit-core:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.xmlunit:xmlunit-core:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.xmlunit:xmlunit-legacy:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.xmlunit:xmlunit-legacy:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.xmlunit:xmlunit-placeholders:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.xmlunit:xmlunit-placeholders:2.10.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.yaml:snakeyaml:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.yaml:snakeyaml:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
empty=annotationProcessor,archives,compile,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,shadow,signatures,sourcesJar,stagedAlpineLinuxAmd64Executable,stagedLinuxAarch64Executable,stagedLinuxAmd64Executable,stagedMacAarch64Executable,stagedMacAmd64Executable,stagedWindowsAmd64Executable,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
|
empty=annotationProcessor,archives,compile,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,shadow,signatures,sourcesJar,stagedAlpineLinuxAmd64Executable,stagedLinuxAarch64Executable,stagedLinuxAmd64Executable,stagedMacAarch64Executable,stagedMacAmd64Executable,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
|
||||||
|
|||||||
+158
-177
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
plugins {
|
plugins {
|
||||||
pklAllProjects
|
pklAllProjects
|
||||||
pklKotlinLibrary
|
pklKotlinLibrary
|
||||||
@@ -22,9 +7,11 @@ plugins {
|
|||||||
|
|
||||||
// already on build script class path (see buildSrc/build.gradle.kts),
|
// already on build script class path (see buildSrc/build.gradle.kts),
|
||||||
// hence must only specify plugin ID here
|
// hence must only specify plugin ID here
|
||||||
@Suppress("DSL_SCOPE_VIOLATION") id(libs.plugins.shadow.get().pluginId)
|
@Suppress("DSL_SCOPE_VIOLATION")
|
||||||
|
id(libs.plugins.shadow.get().pluginId)
|
||||||
|
|
||||||
@Suppress("DSL_SCOPE_VIOLATION") alias(libs.plugins.checksum)
|
@Suppress("DSL_SCOPE_VIOLATION")
|
||||||
|
alias(libs.plugins.checksum)
|
||||||
}
|
}
|
||||||
|
|
||||||
// make Java executable available to other subprojects
|
// make Java executable available to other subprojects
|
||||||
@@ -82,13 +69,17 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.jar {
|
tasks.jar {
|
||||||
manifest { attributes += mapOf("Main-Class" to "org.pkl.cli.Main") }
|
manifest {
|
||||||
|
attributes += mapOf("Main-Class" to "org.pkl.cli.Main")
|
||||||
|
}
|
||||||
|
|
||||||
// not required at runtime
|
// not required at runtime
|
||||||
exclude("org/pkl/cli/svm/**")
|
exclude("org/pkl/cli/svm/**")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.javadoc { enabled = false }
|
tasks.javadoc {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
tasks.shadowJar {
|
tasks.shadowJar {
|
||||||
archiveFileName.set("jpkl")
|
archiveFileName.set("jpkl")
|
||||||
@@ -102,74 +93,72 @@ tasks.shadowJar {
|
|||||||
exclude("module-info.*")
|
exclude("module-info.*")
|
||||||
}
|
}
|
||||||
|
|
||||||
val javaExecutable by
|
val javaExecutable by tasks.registering(ExecutableJar::class) {
|
||||||
tasks.registering(ExecutableJar::class) {
|
inJar.set(tasks.shadowJar.flatMap { it.archiveFile })
|
||||||
inJar.set(tasks.shadowJar.flatMap { it.archiveFile })
|
outJar.set(layout.buildDirectory.file("executable/jpkl"))
|
||||||
outJar.set(layout.buildDirectory.file("executable/jpkl"))
|
|
||||||
|
|
||||||
// uncomment for debugging
|
// uncomment for debugging
|
||||||
// jvmArgs.addAll("-ea", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
|
//jvmArgs.addAll("-ea", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
|
||||||
}
|
}
|
||||||
|
|
||||||
val testJavaExecutable by
|
val testJavaExecutable by tasks.registering(Test::class) {
|
||||||
tasks.registering(Test::class) {
|
testClassesDirs = tasks.test.get().testClassesDirs
|
||||||
testClassesDirs = tasks.test.get().testClassesDirs
|
classpath =
|
||||||
classpath =
|
// compiled test classes
|
||||||
// compiled test classes
|
sourceSets.test.get().output +
|
||||||
sourceSets.test.get().output +
|
// java executable
|
||||||
// java executable
|
javaExecutable.get().outputs.files +
|
||||||
javaExecutable.get().outputs.files +
|
// test-only dependencies
|
||||||
// test-only dependencies
|
// (test dependencies that are also main dependencies must already be contained in java executable;
|
||||||
// (test dependencies that are also main dependencies must already be contained in java
|
// to verify that, we don't want to include them here)
|
||||||
// executable;
|
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
||||||
// to verify that, we don't want to include them here)
|
}
|
||||||
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.check { dependsOn(testJavaExecutable) }
|
tasks.check {
|
||||||
|
dependsOn(testJavaExecutable)
|
||||||
|
}
|
||||||
|
|
||||||
// 0.14 Java executable was broken because javaExecutable.jvmArgs wasn't commented out.
|
// 0.14 Java executable was broken because javaExecutable.jvmArgs wasn't commented out.
|
||||||
// To catch this and similar problems, test that Java executable starts successfully.
|
// To catch this and similar problems, test that Java executable starts successfully.
|
||||||
val testStartJavaExecutable by
|
val testStartJavaExecutable by tasks.registering(Exec::class) {
|
||||||
tasks.registering(Exec::class) {
|
dependsOn(javaExecutable)
|
||||||
dependsOn(javaExecutable)
|
val outputFile =
|
||||||
val outputFile =
|
layout.buildDirectory.file("testStartJavaExecutable") // dummy output to satisfy up-to-date check
|
||||||
layout.buildDirectory.file(
|
outputs.file(outputFile)
|
||||||
"testStartJavaExecutable"
|
|
||||||
) // dummy output to satisfy up-to-date check
|
|
||||||
outputs.file(outputFile)
|
|
||||||
|
|
||||||
if (buildInfo.os.isWindows) {
|
if (buildInfo.os.isWindows) {
|
||||||
executable = "java"
|
executable = "java"
|
||||||
args("-jar", javaExecutable.get().outputs.files.singleFile.toString(), "--version")
|
args("-jar", javaExecutable.get().outputs.files.singleFile.toString(), "--version")
|
||||||
} else {
|
} else {
|
||||||
executable = javaExecutable.get().outputs.files.singleFile.toString()
|
executable = javaExecutable.get().outputs.files.singleFile.toString()
|
||||||
args("--version")
|
args("--version")
|
||||||
}
|
|
||||||
|
|
||||||
doFirst { outputFile.get().asFile.delete() }
|
|
||||||
|
|
||||||
doLast { outputFile.get().asFile.writeText("OK") }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.check { dependsOn(testStartJavaExecutable) }
|
doFirst { outputFile.get().asFile.delete() }
|
||||||
|
|
||||||
|
doLast { outputFile.get().asFile.writeText("OK") }
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.check {
|
||||||
|
dependsOn(testStartJavaExecutable)
|
||||||
|
}
|
||||||
|
|
||||||
fun Exec.configureExecutable(
|
fun Exec.configureExecutable(
|
||||||
graalVm: BuildInfo.GraalVm,
|
graalVm: BuildInfo.GraalVm,
|
||||||
outputFile: Provider<RegularFile>,
|
outputFile: Provider<RegularFile>,
|
||||||
extraArgs: List<String> = listOf()
|
extraArgs: List<String> = listOf()
|
||||||
) {
|
) {
|
||||||
inputs
|
inputs.files(sourceSets.main.map { it.output })
|
||||||
.files(sourceSets.main.map { it.output })
|
|
||||||
.withPropertyName("mainSourceSets")
|
.withPropertyName("mainSourceSets")
|
||||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||||
inputs
|
inputs.files(configurations.runtimeClasspath)
|
||||||
.files(configurations.runtimeClasspath)
|
|
||||||
.withPropertyName("runtimeClasspath")
|
.withPropertyName("runtimeClasspath")
|
||||||
.withNormalizer(ClasspathNormalizer::class)
|
.withNormalizer(ClasspathNormalizer::class)
|
||||||
val nativeImageCommandName = if (buildInfo.os.isWindows) "native-image.cmd" else "native-image"
|
val nativeImageCommandName = if (buildInfo.os.isWindows) "native-image.cmd" else "native-image"
|
||||||
inputs
|
inputs.files(
|
||||||
.files(file(graalVm.baseDir).resolve("bin/$nativeImageCommandName"))
|
file(graalVm.baseDir)
|
||||||
|
.resolve("bin/$nativeImageCommandName")
|
||||||
|
)
|
||||||
.withPropertyName("graalVmNativeImage")
|
.withPropertyName("graalVmNativeImage")
|
||||||
.withPathSensitivity(PathSensitivity.ABSOLUTE)
|
.withPathSensitivity(PathSensitivity.ABSOLUTE)
|
||||||
outputs.file(outputFile)
|
outputs.file(outputFile)
|
||||||
@@ -181,104 +170,96 @@ fun Exec.configureExecutable(
|
|||||||
// JARs to exclude from the class path for the native-image build.
|
// JARs to exclude from the class path for the native-image build.
|
||||||
val exclusions = listOf(libs.truffleApi, libs.graalSdk).map { it.get().module.name }
|
val exclusions = listOf(libs.truffleApi, libs.graalSdk).map { it.get().module.name }
|
||||||
// https://www.graalvm.org/22.0/reference-manual/native-image/Options/
|
// https://www.graalvm.org/22.0/reference-manual/native-image/Options/
|
||||||
argumentProviders.add(
|
argumentProviders.add(CommandLineArgumentProvider {
|
||||||
CommandLineArgumentProvider {
|
buildList {
|
||||||
buildList {
|
// currently gives a deprecation warning, but we've been told
|
||||||
// currently gives a deprecation warning, but we've been told
|
// that the "initialize everything at build time" *CLI* option is likely here to stay
|
||||||
// that the "initialize everything at build time" *CLI* option is likely here to stay
|
add("--initialize-at-build-time=")
|
||||||
add("--initialize-at-build-time=")
|
// needed for messagepack-java (see https://github.com/msgpack/msgpack-java/issues/600)
|
||||||
// needed for messagepack-java (see https://github.com/msgpack/msgpack-java/issues/600)
|
add("--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess")
|
||||||
add("--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess")
|
add("--no-fallback")
|
||||||
add("--no-fallback")
|
add("-H:IncludeResources=org/pkl/core/stdlib/.*\\.pkl")
|
||||||
add("-H:IncludeResources=org/pkl/core/stdlib/.*\\.pkl")
|
add("-H:IncludeResources=org/jline/utils/.*")
|
||||||
add("-H:IncludeResources=org/jline/utils/.*")
|
add("-H:IncludeResourceBundles=org.pkl.core.errorMessages")
|
||||||
add("-H:IncludeResourceBundles=org.pkl.core.errorMessages")
|
add("-H:IncludeResources=org/pkl/commons/cli/PklCARoots.pem")
|
||||||
add("-H:IncludeResources=org/pkl/commons/cli/PklCARoots.pem")
|
add("--macro:truffle")
|
||||||
add("--macro:truffle")
|
add("-H:Class=org.pkl.cli.Main")
|
||||||
add("-H:Class=org.pkl.cli.Main")
|
add("-H:Name=${outputFile.get().asFile.name}")
|
||||||
add("-H:Name=${outputFile.get().asFile.name}")
|
// the actual limit (currently) used by native-image is this number + 1400 (idea is to compensate for Truffle's own nodes)
|
||||||
// the actual limit (currently) used by native-image is this number + 1400 (idea is to
|
add("-H:MaxRuntimeCompileMethods=1800")
|
||||||
// compensate for Truffle's own nodes)
|
add("-H:+EnforceMaxRuntimeCompileMethods")
|
||||||
add("-H:MaxRuntimeCompileMethods=1800")
|
add("--enable-url-protocols=http,https")
|
||||||
add("-H:+EnforceMaxRuntimeCompileMethods")
|
add("-H:+ReportExceptionStackTraces")
|
||||||
add("--enable-url-protocols=http,https")
|
// disable automatic support for JVM CLI options (puts our main class in full control of argument parsing)
|
||||||
add("-H:+ReportExceptionStackTraces")
|
add("-H:-ParseRuntimeOptions")
|
||||||
// disable automatic support for JVM CLI options (puts our main class in full control of
|
// quick build mode: 40% faster compilation, 20% smaller (but presumably also slower) executable
|
||||||
// argument parsing)
|
if (!buildInfo.isReleaseBuild) {
|
||||||
add("-H:-ParseRuntimeOptions")
|
add("-Ob")
|
||||||
// quick build mode: 40% faster compilation, 20% smaller (but presumably also slower)
|
|
||||||
// executable
|
|
||||||
if (!buildInfo.isReleaseBuild) {
|
|
||||||
add("-Ob")
|
|
||||||
}
|
|
||||||
add("-march=compatibility")
|
|
||||||
// native-image rejects non-existing class path entries -> filter
|
|
||||||
add("--class-path")
|
|
||||||
val pathInput =
|
|
||||||
sourceSets.main.get().output +
|
|
||||||
configurations.runtimeClasspath.get().filter {
|
|
||||||
it.exists() && !exclusions.any { exclude -> it.name.contains(exclude) }
|
|
||||||
}
|
|
||||||
add(pathInput.asPath)
|
|
||||||
// make sure dev machine stays responsive (15% slowdown on my laptop)
|
|
||||||
val processors =
|
|
||||||
Runtime.getRuntime().availableProcessors() /
|
|
||||||
if (buildInfo.os.isMacOsX && !buildInfo.isCiBuild) 4 else 1
|
|
||||||
add("-J-XX:ActiveProcessorCount=${processors}")
|
|
||||||
// Pass through all `HOMEBREW_` prefixed environment variables to allow build with shimmed
|
|
||||||
// tools.
|
|
||||||
addAll(environment.keys.filter { it.startsWith("HOMEBREW_") }.map { "-E$it" })
|
|
||||||
addAll(extraArgs)
|
|
||||||
}
|
}
|
||||||
|
add("-march=compatibility")
|
||||||
|
// native-image rejects non-existing class path entries -> filter
|
||||||
|
add("--class-path")
|
||||||
|
val pathInput = sourceSets.main.get().output + configurations.runtimeClasspath.get()
|
||||||
|
.filter { it.exists() && !exclusions.any { exclude -> it.name.contains(exclude) } }
|
||||||
|
add(pathInput.asPath)
|
||||||
|
// make sure dev machine stays responsive (15% slowdown on my laptop)
|
||||||
|
val processors = Runtime.getRuntime().availableProcessors() /
|
||||||
|
if (buildInfo.os.isMacOsX && !buildInfo.isCiBuild) 4 else 1
|
||||||
|
add("-J-XX:ActiveProcessorCount=${processors}")
|
||||||
|
addAll(extraArgs)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the pkl CLI for macOS/amd64.
|
||||||
|
*/
|
||||||
|
val macExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
|
dependsOn(":installGraalVmAmd64")
|
||||||
|
configureExecutable(
|
||||||
|
buildInfo.graalVmAmd64,
|
||||||
|
layout.buildDirectory.file("executable/pkl-macos-amd64")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Builds the pkl CLI for macOS/amd64. */
|
/**
|
||||||
val macExecutableAmd64: TaskProvider<Exec> by
|
* Builds the pkl CLI for macOS/aarch64.
|
||||||
tasks.registering(Exec::class) {
|
*/
|
||||||
dependsOn(":installGraalVmAmd64")
|
val macExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
configureExecutable(
|
dependsOn(":installGraalVmAarch64")
|
||||||
buildInfo.graalVmAmd64,
|
configureExecutable(
|
||||||
layout.buildDirectory.file("executable/pkl-macos-amd64")
|
buildInfo.graalVmAarch64,
|
||||||
|
layout.buildDirectory.file("executable/pkl-macos-aarch64"),
|
||||||
|
listOf(
|
||||||
|
"-H:+AllowDeprecatedBuilderClassesOnImageClasspath"
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/** Builds the pkl CLI for macOS/aarch64. */
|
/**
|
||||||
val macExecutableAarch64: TaskProvider<Exec> by
|
* Builds the pkl CLI for linux/amd64.
|
||||||
tasks.registering(Exec::class) {
|
*/
|
||||||
dependsOn(":installGraalVmAarch64")
|
val linuxExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
configureExecutable(
|
dependsOn(":installGraalVmAmd64")
|
||||||
buildInfo.graalVmAarch64,
|
configureExecutable(
|
||||||
layout.buildDirectory.file("executable/pkl-macos-aarch64"),
|
buildInfo.graalVmAmd64,
|
||||||
listOf("-H:+AllowDeprecatedBuilderClassesOnImageClasspath")
|
layout.buildDirectory.file("executable/pkl-linux-amd64")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Builds the pkl CLI for linux/amd64. */
|
|
||||||
val linuxExecutableAmd64: TaskProvider<Exec> by
|
|
||||||
tasks.registering(Exec::class) {
|
|
||||||
dependsOn(":installGraalVmAmd64")
|
|
||||||
configureExecutable(
|
|
||||||
buildInfo.graalVmAmd64,
|
|
||||||
layout.buildDirectory.file("executable/pkl-linux-amd64")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds the pkl CLI for linux/aarch64.
|
* Builds the pkl CLI for linux/aarch64.
|
||||||
*
|
*
|
||||||
* Right now, this is built within a container on Mac using emulation because CI does not have ARM
|
* Right now, this is built within a container on Mac using emulation because CI does not have
|
||||||
* instances.
|
* ARM instances.
|
||||||
*/
|
*/
|
||||||
val linuxExecutableAarch64: TaskProvider<Exec> by
|
val linuxExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
tasks.registering(Exec::class) {
|
dependsOn(":installGraalVmAarch64")
|
||||||
dependsOn(":installGraalVmAarch64")
|
configureExecutable(
|
||||||
configureExecutable(
|
buildInfo.graalVmAarch64,
|
||||||
buildInfo.graalVmAarch64,
|
layout.buildDirectory.file("executable/pkl-linux-aarch64")
|
||||||
layout.buildDirectory.file("executable/pkl-linux-aarch64")
|
)
|
||||||
)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a statically linked CLI for linux/amd64.
|
* Builds a statically linked CLI for linux/amd64.
|
||||||
@@ -286,25 +267,23 @@ val linuxExecutableAarch64: TaskProvider<Exec> by
|
|||||||
* Note: we don't publish the same for linux/aarch64 because native-image doesn't support this.
|
* Note: we don't publish the same for linux/aarch64 because native-image doesn't support this.
|
||||||
* Details: https://www.graalvm.org/22.0/reference-manual/native-image/ARM64/
|
* Details: https://www.graalvm.org/22.0/reference-manual/native-image/ARM64/
|
||||||
*/
|
*/
|
||||||
val alpineExecutableAmd64: TaskProvider<Exec> by
|
val alpineExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
tasks.registering(Exec::class) {
|
dependsOn(":installGraalVmAmd64")
|
||||||
dependsOn(":installGraalVmAmd64")
|
configureExecutable(
|
||||||
configureExecutable(
|
buildInfo.graalVmAmd64,
|
||||||
buildInfo.graalVmAmd64,
|
layout.buildDirectory.file("executable/pkl-alpine-linux-amd64"),
|
||||||
layout.buildDirectory.file("executable/pkl-alpine-linux-amd64"),
|
listOf("--static", "--libc=musl")
|
||||||
listOf("--static", "--libc=musl")
|
)
|
||||||
)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
val windowsExecutableAmd64: TaskProvider<Exec> by
|
val windowsExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
|
||||||
tasks.registering(Exec::class) {
|
dependsOn(":installGraalVmAmd64")
|
||||||
dependsOn(":installGraalVmAmd64")
|
configureExecutable(
|
||||||
configureExecutable(
|
buildInfo.graalVmAmd64,
|
||||||
buildInfo.graalVmAmd64,
|
layout.buildDirectory.file("executable/pkl-windows-amd64"),
|
||||||
layout.buildDirectory.file("executable/pkl-windows-amd64"),
|
listOf("-Dfile.encoding=UTF-8")
|
||||||
listOf("-Dfile.encoding=UTF-8")
|
)
|
||||||
)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tasks.assembleNative {
|
tasks.assembleNative {
|
||||||
when {
|
when {
|
||||||
@@ -314,12 +293,15 @@ tasks.assembleNative {
|
|||||||
dependsOn(macExecutableAarch64)
|
dependsOn(macExecutableAarch64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildInfo.os.isWindows -> {
|
buildInfo.os.isWindows -> {
|
||||||
dependsOn(windowsExecutableAmd64)
|
dependsOn(windowsExecutableAmd64)
|
||||||
}
|
}
|
||||||
|
|
||||||
buildInfo.os.isLinux && buildInfo.arch == "aarch64" -> {
|
buildInfo.os.isLinux && buildInfo.arch == "aarch64" -> {
|
||||||
dependsOn(linuxExecutableAarch64)
|
dependsOn(linuxExecutableAarch64)
|
||||||
}
|
}
|
||||||
|
|
||||||
buildInfo.os.isLinux && buildInfo.arch == "amd64" -> {
|
buildInfo.os.isLinux && buildInfo.arch == "amd64" -> {
|
||||||
dependsOn(linuxExecutableAmd64)
|
dependsOn(linuxExecutableAmd64)
|
||||||
if (buildInfo.hasMuslToolchain) {
|
if (buildInfo.hasMuslToolchain) {
|
||||||
@@ -330,8 +312,7 @@ tasks.assembleNative {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make Java executable available to other subprojects
|
// make Java executable available to other subprojects
|
||||||
// (we don't do the same for native executables because we don't want tasks assemble/build to build
|
// (we don't do the same for native executables because we don't want tasks assemble/build to build them)
|
||||||
// them)
|
|
||||||
artifacts {
|
artifacts {
|
||||||
add("javaExecutable", javaExecutable.map { it.outputs.files.singleFile }) {
|
add("javaExecutable", javaExecutable.map { it.outputs.files.singleFile }) {
|
||||||
name = "pkl-cli-java"
|
name = "pkl-cli-java"
|
||||||
@@ -341,7 +322,7 @@ artifacts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// region Maven Publishing
|
//region Maven Publishing
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
register<MavenPublication>("javaExecutable") {
|
register<MavenPublication>("javaExecutable") {
|
||||||
@@ -360,8 +341,7 @@ publishing {
|
|||||||
Pkl CLI executable for Java.
|
Pkl CLI executable for Java.
|
||||||
Can be executed directly on *nix (if the `java` command is found on the PATH) and with `java -jar` otherwise.
|
Can be executed directly on *nix (if the `java` command is found on the PATH) and with `java -jar` otherwise.
|
||||||
Requires Java 17 or higher.
|
Requires Java 17 or higher.
|
||||||
"""
|
""".trimIndent()
|
||||||
.trimIndent()
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -455,4 +435,5 @@ signing {
|
|||||||
sign(publishing.publications["macExecutableAmd64"])
|
sign(publishing.publications["macExecutableAmd64"])
|
||||||
sign(publishing.publications["alpineLinuxExecutableAmd64"])
|
sign(publishing.publications["alpineLinuxExecutableAmd64"])
|
||||||
sign(publishing.publications["windowsExecutableAmd64"])
|
sign(publishing.publications["windowsExecutableAmd64"])
|
||||||
} // endregion
|
}
|
||||||
|
//endregion
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -28,10 +28,10 @@ import org.pkl.commons.cli.CliException
|
|||||||
import org.pkl.commons.createParentDirectories
|
import org.pkl.commons.createParentDirectories
|
||||||
import org.pkl.commons.currentWorkingDir
|
import org.pkl.commons.currentWorkingDir
|
||||||
import org.pkl.commons.writeString
|
import org.pkl.commons.writeString
|
||||||
import org.pkl.core.Closeables
|
|
||||||
import org.pkl.core.EvaluatorBuilder
|
import org.pkl.core.EvaluatorBuilder
|
||||||
import org.pkl.core.ModuleSource
|
import org.pkl.core.ModuleSource
|
||||||
import org.pkl.core.PklException
|
import org.pkl.core.PklException
|
||||||
|
import org.pkl.core.module.ModuleKeyFactories
|
||||||
import org.pkl.core.module.ModulePathResolver
|
import org.pkl.core.module.ModulePathResolver
|
||||||
import org.pkl.core.runtime.ModuleResolver
|
import org.pkl.core.runtime.ModuleResolver
|
||||||
import org.pkl.core.runtime.VmException
|
import org.pkl.core.runtime.VmException
|
||||||
@@ -51,10 +51,9 @@ constructor(
|
|||||||
private val consoleWriter: Writer = System.out.writer(),
|
private val consoleWriter: Writer = System.out.writer(),
|
||||||
) : CliCommand(options.base) {
|
) : CliCommand(options.base) {
|
||||||
/**
|
/**
|
||||||
* Output files for the modules to be evaluated. Returns `null` if `options.outputPath` is `null`
|
* Output files for the modules to be evaluated. Returns `null` if `options.outputPath` is `null`.
|
||||||
* or if `options.multipleFileOutputPath` is not `null`. Multiple modules may be mapped to the
|
* Multiple modules may be mapped to the same output file, in which case their outputs are
|
||||||
* same output file, in which case their outputs are concatenated with
|
* concatenated with [CliEvaluatorOptions.moduleOutputSeparator].
|
||||||
* [CliEvaluatorOptions.moduleOutputSeparator].
|
|
||||||
*/
|
*/
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
val outputFiles: Set<File>? by lazy {
|
val outputFiles: Set<File>? by lazy {
|
||||||
@@ -100,8 +99,7 @@ constructor(
|
|||||||
writeOutput(builder)
|
writeOutput(builder)
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Closeables.closeQuietly(builder.moduleKeyFactories)
|
ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)
|
||||||
Closeables.closeQuietly(builder.resourceReaders)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +118,7 @@ constructor(
|
|||||||
try {
|
try {
|
||||||
moduleResolver.resolve(uri)
|
moduleResolver.resolve(uri)
|
||||||
} catch (e: VmException) {
|
} catch (e: VmException) {
|
||||||
throw e.toPklException(stackFrameTransformer, options.base.color?.hasColor() ?: false)
|
throw e.toPklException(stackFrameTransformer)
|
||||||
}
|
}
|
||||||
val substituted =
|
val substituted =
|
||||||
pathStr
|
pathStr
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package org.pkl.cli
|
|
||||||
|
|
||||||
import java.io.Writer
|
|
||||||
import org.pkl.commons.cli.CliCommand
|
|
||||||
import org.pkl.commons.createParentDirectories
|
|
||||||
import org.pkl.commons.writeString
|
|
||||||
import org.pkl.core.Closeables
|
|
||||||
import org.pkl.core.ModuleSource
|
|
||||||
|
|
||||||
class CliImportAnalyzer
|
|
||||||
@JvmOverloads
|
|
||||||
constructor(
|
|
||||||
private val options: CliImportAnalyzerOptions,
|
|
||||||
private val consoleWriter: Writer = System.out.writer()
|
|
||||||
) : CliCommand(options.base) {
|
|
||||||
|
|
||||||
override fun doRun() {
|
|
||||||
val rendered = render()
|
|
||||||
if (options.outputPath != null) {
|
|
||||||
options.outputPath.createParentDirectories()
|
|
||||||
options.outputPath.writeString(rendered)
|
|
||||||
} else {
|
|
||||||
consoleWriter.write(rendered)
|
|
||||||
consoleWriter.flush()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// language=pkl
|
|
||||||
private val sourceModule =
|
|
||||||
ModuleSource.text(
|
|
||||||
"""
|
|
||||||
import "pkl:analyze"
|
|
||||||
|
|
||||||
local importStrings = read*("prop:pkl.analyzeImports.**").toMap().values.toSet()
|
|
||||||
|
|
||||||
output {
|
|
||||||
value = analyze.importGraph(importStrings)
|
|
||||||
renderer {
|
|
||||||
converters {
|
|
||||||
[Map] = (it) -> it.toMapping()
|
|
||||||
[Set] = (it) -> it.toListing()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun render(): String {
|
|
||||||
val builder = evaluatorBuilder().setOutputFormat(options.outputFormat)
|
|
||||||
try {
|
|
||||||
return builder
|
|
||||||
.apply {
|
|
||||||
for ((idx, sourceModule) in options.base.normalizedSourceModules.withIndex()) {
|
|
||||||
addExternalProperty("pkl.analyzeImports.$idx", sourceModule.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.build()
|
|
||||||
.use { it.evaluateOutputText(sourceModule) }
|
|
||||||
} finally {
|
|
||||||
Closeables.closeQuietly(builder.moduleKeyFactories)
|
|
||||||
Closeables.closeQuietly(builder.resourceReaders)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package org.pkl.cli
|
|
||||||
|
|
||||||
import java.nio.file.Path
|
|
||||||
import org.pkl.commons.cli.CliBaseOptions
|
|
||||||
|
|
||||||
data class CliImportAnalyzerOptions(
|
|
||||||
/** Base options shared between CLI commands. */
|
|
||||||
val base: CliBaseOptions,
|
|
||||||
|
|
||||||
/** The file path where the output file is placed. */
|
|
||||||
val outputPath: Path? = null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The output format to generate.
|
|
||||||
*
|
|
||||||
* These accept the same options as [CliEvaluatorOptions.outputFormat].
|
|
||||||
*/
|
|
||||||
val outputFormat: String? = null,
|
|
||||||
)
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -81,7 +81,6 @@ class CliProjectPackager(
|
|||||||
cliOptions.normalizedWorkingDir,
|
cliOptions.normalizedWorkingDir,
|
||||||
outputPath,
|
outputPath,
|
||||||
stackFrameTransformer,
|
stackFrameTransformer,
|
||||||
cliOptions.color?.hasColor() ?: false,
|
|
||||||
securityManager,
|
securityManager,
|
||||||
httpClient,
|
httpClient,
|
||||||
skipPublishCheck,
|
skipPublishCheck,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -66,8 +66,7 @@ internal class CliRepl(private val options: CliEvaluatorOptions) : CliCommand(op
|
|||||||
project?.dependencies,
|
project?.dependencies,
|
||||||
options.outputFormat,
|
options.outputFormat,
|
||||||
options.base.normalizedWorkingDir,
|
options.base.normalizedWorkingDir,
|
||||||
stackFrameTransformer,
|
stackFrameTransformer
|
||||||
options.base.color?.hasColor() ?: false,
|
|
||||||
)
|
)
|
||||||
Repl(options.base.normalizedWorkingDir, server).run()
|
Repl(options.base.normalizedWorkingDir, server).run()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -18,13 +18,14 @@ package org.pkl.cli
|
|||||||
import org.pkl.commons.cli.CliBaseOptions
|
import org.pkl.commons.cli.CliBaseOptions
|
||||||
import org.pkl.commons.cli.CliCommand
|
import org.pkl.commons.cli.CliCommand
|
||||||
import org.pkl.commons.cli.CliException
|
import org.pkl.commons.cli.CliException
|
||||||
import org.pkl.core.messaging.ProtocolException
|
import org.pkl.server.MessageTransports
|
||||||
|
import org.pkl.server.ProtocolException
|
||||||
import org.pkl.server.Server
|
import org.pkl.server.Server
|
||||||
|
|
||||||
class CliServer(options: CliBaseOptions) : CliCommand(options) {
|
class CliServer(options: CliBaseOptions) : CliCommand(options) {
|
||||||
override fun doRun() =
|
override fun doRun() =
|
||||||
try {
|
try {
|
||||||
val server = Server.stream(System.`in`, System.out)
|
val server = Server(MessageTransports.stream(System.`in`, System.out))
|
||||||
server.use { it.start() }
|
server.use { it.start() }
|
||||||
} catch (e: ProtocolException) {
|
} catch (e: ProtocolException) {
|
||||||
throw CliException(e.message!!)
|
throw CliException(e.message!!)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -17,10 +17,9 @@ package org.pkl.cli
|
|||||||
|
|
||||||
import java.io.Writer
|
import java.io.Writer
|
||||||
import org.pkl.commons.cli.*
|
import org.pkl.commons.cli.*
|
||||||
import org.pkl.core.Closeables
|
|
||||||
import org.pkl.core.EvaluatorBuilder
|
import org.pkl.core.EvaluatorBuilder
|
||||||
import org.pkl.core.ModuleSource.uri
|
import org.pkl.core.ModuleSource.uri
|
||||||
import org.pkl.core.TestResults
|
import org.pkl.core.module.ModuleKeyFactories
|
||||||
import org.pkl.core.stdlib.test.report.JUnitReport
|
import org.pkl.core.stdlib.test.report.JUnitReport
|
||||||
import org.pkl.core.stdlib.test.report.SimpleReport
|
import org.pkl.core.stdlib.test.report.SimpleReport
|
||||||
import org.pkl.core.util.ErrorMessages
|
import org.pkl.core.util.ErrorMessages
|
||||||
@@ -39,8 +38,7 @@ constructor(
|
|||||||
try {
|
try {
|
||||||
evalTest(builder)
|
evalTest(builder)
|
||||||
} finally {
|
} finally {
|
||||||
Closeables.closeQuietly(builder.moduleKeyFactories)
|
ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)
|
||||||
Closeables.closeQuietly(builder.resourceReaders)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,22 +59,14 @@ constructor(
|
|||||||
val evaluator = builder.build()
|
val evaluator = builder.build()
|
||||||
evaluator.use {
|
evaluator.use {
|
||||||
var failed = false
|
var failed = false
|
||||||
var isExampleWrittenFailure = true
|
|
||||||
val moduleNames = mutableSetOf<String>()
|
val moduleNames = mutableSetOf<String>()
|
||||||
val reporter = SimpleReport(useColor)
|
for (moduleUri in sources) {
|
||||||
val allTestResults = mutableListOf<TestResults>()
|
|
||||||
for ((idx, moduleUri) in sources.withIndex()) {
|
|
||||||
try {
|
try {
|
||||||
val results = evaluator.evaluateTest(uri(moduleUri), testOptions.overwrite)
|
val results = evaluator.evaluateTest(uri(moduleUri), testOptions.overwrite)
|
||||||
allTestResults.add(results)
|
|
||||||
if (!failed) {
|
if (!failed) {
|
||||||
failed = results.failed()
|
failed = results.failed()
|
||||||
isExampleWrittenFailure = results.isExampleWrittenFailure.and(isExampleWrittenFailure)
|
|
||||||
}
|
|
||||||
reporter.report(results, consoleWriter)
|
|
||||||
if (sources.size > 1 && idx != sources.size - 1) {
|
|
||||||
consoleWriter.append('\n')
|
|
||||||
}
|
}
|
||||||
|
SimpleReport().report(results, consoleWriter)
|
||||||
consoleWriter.flush()
|
consoleWriter.flush()
|
||||||
val junitDir = testOptions.junitDir
|
val junitDir = testOptions.junitDir
|
||||||
if (junitDir != null) {
|
if (junitDir != null) {
|
||||||
@@ -106,12 +96,8 @@ constructor(
|
|||||||
failed = true
|
failed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
consoleWriter.append('\n')
|
|
||||||
reporter.summarize(allTestResults, consoleWriter)
|
|
||||||
consoleWriter.flush()
|
|
||||||
if (failed) {
|
if (failed) {
|
||||||
val exitCode = if (isExampleWrittenFailure) 10 else 1
|
throw CliTestException(ErrorMessages.create("testsFailed"))
|
||||||
throw CliTestException(ErrorMessages.create("testsFailed"), exitCode)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -34,8 +34,7 @@ internal fun main(args: Array<String>) {
|
|||||||
ServerCommand(helpLink),
|
ServerCommand(helpLink),
|
||||||
TestCommand(helpLink),
|
TestCommand(helpLink),
|
||||||
ProjectCommand(helpLink),
|
ProjectCommand(helpLink),
|
||||||
DownloadPackageCommand(helpLink),
|
DownloadPackageCommand(helpLink)
|
||||||
AnalyzeCommand(helpLink),
|
|
||||||
)
|
)
|
||||||
.main(args)
|
.main(args)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package org.pkl.cli.commands
|
|
||||||
|
|
||||||
import com.github.ajalt.clikt.core.NoOpCliktCommand
|
|
||||||
import com.github.ajalt.clikt.core.subcommands
|
|
||||||
import com.github.ajalt.clikt.parameters.options.option
|
|
||||||
import com.github.ajalt.clikt.parameters.types.path
|
|
||||||
import java.nio.file.Path
|
|
||||||
import org.pkl.cli.CliImportAnalyzer
|
|
||||||
import org.pkl.cli.CliImportAnalyzerOptions
|
|
||||||
import org.pkl.commons.cli.commands.ModulesCommand
|
|
||||||
import org.pkl.commons.cli.commands.single
|
|
||||||
|
|
||||||
class AnalyzeCommand(helpLink: String) :
|
|
||||||
NoOpCliktCommand(
|
|
||||||
name = "analyze",
|
|
||||||
help = "Commands related to static analysis",
|
|
||||||
epilog = "For more information, visit $helpLink"
|
|
||||||
) {
|
|
||||||
init {
|
|
||||||
subcommands(AnalyzeImportsCommand(helpLink))
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
class AnalyzeImportsCommand(helpLink: String) :
|
|
||||||
ModulesCommand(
|
|
||||||
name = "imports",
|
|
||||||
helpLink = helpLink,
|
|
||||||
help = "Prints the the graph of modules imported by the input module(s)."
|
|
||||||
) {
|
|
||||||
|
|
||||||
private val outputPath: Path? by
|
|
||||||
option(
|
|
||||||
names = arrayOf("-o", "--output-path"),
|
|
||||||
metavar = "<path>",
|
|
||||||
help = "File path where the output file is placed."
|
|
||||||
)
|
|
||||||
.path()
|
|
||||||
.single()
|
|
||||||
|
|
||||||
override fun run() {
|
|
||||||
val options =
|
|
||||||
CliImportAnalyzerOptions(
|
|
||||||
base = baseOptions.baseOptions(modules, projectOptions),
|
|
||||||
outputFormat = baseOptions.format,
|
|
||||||
outputPath = outputPath
|
|
||||||
)
|
|
||||||
CliImportAnalyzer(options).run()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -1457,62 +1457,6 @@ result = someLib.x
|
|||||||
assertThat(output).isEqualTo("result = 1\n")
|
assertThat(output).isEqualTo("result = 1\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `eval file with non-ASCII name`() {
|
|
||||||
val tempDirUri = tempDir.toUri()
|
|
||||||
val dir = tempDir.resolve("🤬").createDirectory()
|
|
||||||
val file =
|
|
||||||
writePklFile(
|
|
||||||
dir.resolve("日本語.pkl").toString(),
|
|
||||||
"""
|
|
||||||
日本語 = "Japanese language"
|
|
||||||
readDir = read(".").text
|
|
||||||
readDirFile = read("$tempDirUri🤬").text
|
|
||||||
readOne = read("日本語.pkl").text.split("\n").first
|
|
||||||
readOneFile = read("$tempDirUri🤬/日本語.pkl").text.split("\n").first
|
|
||||||
readGlob = read*("./日*.pkl").keys
|
|
||||||
readGlobFile = read*("$tempDirUri**/*.pkl").keys.map((it) -> it.replaceAll("$tempDirUri".replaceAll("///", "/"), ""))
|
|
||||||
importOne = import("日本語.pkl").readOne
|
|
||||||
importOneFile = import("$tempDirUri🤬/日本語.pkl").日本語
|
|
||||||
importGlob = import*("./日*.pkl").keys
|
|
||||||
importGlobFile = import*("$tempDirUri**/*.pkl").keys.map((it) -> it.replaceAll("$tempDirUri".replaceAll("///", "/"), ""))
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
val output =
|
|
||||||
evalToConsole(
|
|
||||||
CliEvaluatorOptions(
|
|
||||||
CliBaseOptions(sourceModules = listOf(file)),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val tripleQuote = "\"\"\""
|
|
||||||
assertThat(output)
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
日本語 = "Japanese language"
|
|
||||||
readDir = $tripleQuote
|
|
||||||
日本語.pkl
|
|
||||||
|
|
||||||
$tripleQuote
|
|
||||||
readDirFile = $tripleQuote
|
|
||||||
日本語.pkl
|
|
||||||
|
|
||||||
$tripleQuote
|
|
||||||
readOne = "日本語 = \"Japanese language\""
|
|
||||||
readOneFile = "日本語 = \"Japanese language\""
|
|
||||||
readGlob = Set("./日本語.pkl")
|
|
||||||
readGlobFile = Set("🤬/日本語.pkl")
|
|
||||||
importOne = "日本語 = \"Japanese language\""
|
|
||||||
importOneFile = "Japanese language"
|
|
||||||
importGlob = Set("./日本語.pkl")
|
|
||||||
importGlobFile = Set("🤬/日本語.pkl")
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun evalModuleThatImportsPackage(certsFile: Path?, testPort: Int = -1) {
|
private fun evalModuleThatImportsPackage(certsFile: Path?, testPort: Int = -1) {
|
||||||
val moduleUri =
|
val moduleUri =
|
||||||
writePklFile(
|
writePklFile(
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package org.pkl.cli
|
|
||||||
|
|
||||||
import java.net.URI
|
|
||||||
import java.nio.file.Path
|
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
|
||||||
import org.assertj.core.api.Assertions.assertThatCode
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import org.junit.jupiter.api.io.TempDir
|
|
||||||
import org.pkl.commons.cli.CliBaseOptions
|
|
||||||
import org.pkl.commons.writeString
|
|
||||||
import org.pkl.core.OutputFormat
|
|
||||||
import org.pkl.core.util.StringBuilderWriter
|
|
||||||
|
|
||||||
class CliImportAnalyzerTest {
|
|
||||||
@Test
|
|
||||||
fun `write to console writer`(@TempDir tempDir: Path) {
|
|
||||||
val file = tempDir.resolve("test.pkl").writeString("import \"bar.pkl\"")
|
|
||||||
val otherFile = tempDir.resolve("bar.pkl").writeString("")
|
|
||||||
val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))
|
|
||||||
val sb = StringBuilder()
|
|
||||||
val analyzer = CliImportAnalyzer(CliImportAnalyzerOptions(baseOptions), StringBuilderWriter(sb))
|
|
||||||
analyzer.run()
|
|
||||||
assertThat(sb.toString())
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
imports {
|
|
||||||
["${otherFile.toUri()}"] {}
|
|
||||||
["${file.toUri()}"] {
|
|
||||||
new {
|
|
||||||
uri = "${otherFile.toUri()}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resolvedImports {
|
|
||||||
["${otherFile.toUri()}"] = "${otherFile.toRealPath().toUri()}"
|
|
||||||
["${file.toUri()}"] = "${file.toRealPath().toUri()}"
|
|
||||||
}
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `different output format`(@TempDir tempDir: Path) {
|
|
||||||
val file = tempDir.resolve("test.pkl").writeString("import \"bar.pkl\"")
|
|
||||||
val otherFile = tempDir.resolve("bar.pkl").writeString("")
|
|
||||||
val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))
|
|
||||||
val sb = StringBuilder()
|
|
||||||
val analyzer =
|
|
||||||
CliImportAnalyzer(
|
|
||||||
CliImportAnalyzerOptions(baseOptions, outputFormat = OutputFormat.JSON.toString()),
|
|
||||||
StringBuilderWriter(sb)
|
|
||||||
)
|
|
||||||
analyzer.run()
|
|
||||||
assertThat(sb.toString())
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
{
|
|
||||||
"imports": {
|
|
||||||
"${otherFile.toUri()}": [],
|
|
||||||
"${file.toUri()}": [
|
|
||||||
{
|
|
||||||
"uri": "${otherFile.toUri()}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"resolvedImports": {
|
|
||||||
"${otherFile.toUri()}": "${otherFile.toRealPath().toUri()}",
|
|
||||||
"${file.toUri()}": "${file.toRealPath().toUri()}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `write to output file`(@TempDir tempDir: Path) {
|
|
||||||
val file = tempDir.resolve("test.pkl").writeString("import \"bar.pkl\"")
|
|
||||||
val otherFile = tempDir.resolve("bar.pkl").writeString("")
|
|
||||||
val outputPath = tempDir.resolve("imports.pcf")
|
|
||||||
val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))
|
|
||||||
val analyzer = CliImportAnalyzer(CliImportAnalyzerOptions(baseOptions, outputPath = outputPath))
|
|
||||||
analyzer.run()
|
|
||||||
assertThat(outputPath)
|
|
||||||
.hasContent(
|
|
||||||
"""
|
|
||||||
imports {
|
|
||||||
["${otherFile.toUri()}"] {}
|
|
||||||
["${file.toUri()}"] {
|
|
||||||
new {
|
|
||||||
uri = "${otherFile.toUri()}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resolvedImports {
|
|
||||||
["${otherFile.toUri()}"] = "${otherFile.toRealPath().toUri()}"
|
|
||||||
["${file.toUri()}"] = "${file.toRealPath().toUri()}"
|
|
||||||
}
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `invalid syntax in module`(@TempDir tempDir: Path) {
|
|
||||||
val file = tempDir.resolve("test.pkl").writeString("foo = bar(]")
|
|
||||||
assertThatCode {
|
|
||||||
CliImportAnalyzer(
|
|
||||||
CliImportAnalyzerOptions(
|
|
||||||
CliBaseOptions(sourceModules = listOf(file.toUri()), settings = URI("pkl:settings"))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.run()
|
|
||||||
}
|
|
||||||
.hasMessageContaining(
|
|
||||||
"""
|
|
||||||
–– Pkl Error ––
|
|
||||||
Found a syntax error when parsing module `${file.toUri()}`.
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -27,7 +27,6 @@ import org.junit.jupiter.api.assertThrows
|
|||||||
import org.junit.jupiter.api.condition.DisabledOnOs
|
import org.junit.jupiter.api.condition.DisabledOnOs
|
||||||
import org.junit.jupiter.api.condition.OS
|
import org.junit.jupiter.api.condition.OS
|
||||||
import org.junit.jupiter.api.io.TempDir
|
import org.junit.jupiter.api.io.TempDir
|
||||||
import org.pkl.cli.commands.AnalyzeCommand
|
|
||||||
import org.pkl.cli.commands.EvalCommand
|
import org.pkl.cli.commands.EvalCommand
|
||||||
import org.pkl.cli.commands.RootCommand
|
import org.pkl.cli.commands.RootCommand
|
||||||
import org.pkl.commons.writeString
|
import org.pkl.commons.writeString
|
||||||
@@ -35,8 +34,7 @@ import org.pkl.commons.writeString
|
|||||||
class CliMainTest {
|
class CliMainTest {
|
||||||
|
|
||||||
private val evalCmd = EvalCommand("")
|
private val evalCmd = EvalCommand("")
|
||||||
private val analyzeCommand = AnalyzeCommand("")
|
private val cmd = RootCommand("pkl", "pkl version 1", "").subcommands(evalCmd)
|
||||||
private val cmd = RootCommand("pkl", "pkl version 1", "").subcommands(evalCmd, analyzeCommand)
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `duplicate CLI option produces meaningful error message`(@TempDir tempDir: Path) {
|
fun `duplicate CLI option produces meaningful error message`(@TempDir tempDir: Path) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -212,24 +212,6 @@ class CliProjectPackagerTest {
|
|||||||
"""
|
"""
|
||||||
.trimIndent()
|
.trimIndent()
|
||||||
)
|
)
|
||||||
projectDir
|
|
||||||
.resolve("myTest.pkl-expected.pcf")
|
|
||||||
.writeString(
|
|
||||||
"""
|
|
||||||
examples {
|
|
||||||
["Bird"] {
|
|
||||||
new {
|
|
||||||
name = "Finch"
|
|
||||||
favoriteFruit {
|
|
||||||
name = "Tangerine"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
projectDir
|
projectDir
|
||||||
.resolve("PklProject")
|
.resolve("PklProject")
|
||||||
.writeString(
|
.writeString(
|
||||||
@@ -998,92 +980,6 @@ class CliProjectPackagerTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `generate annotations`(@TempDir tempDir: Path) {
|
|
||||||
tempDir
|
|
||||||
.resolve("PklProject")
|
|
||||||
.writeString(
|
|
||||||
"""
|
|
||||||
@Unlisted
|
|
||||||
@Deprecated { since = "0.26.1"; message = "do not use" }
|
|
||||||
@ModuleInfo { minPklVersion = "0.26.0" }
|
|
||||||
amends "pkl:Project"
|
|
||||||
|
|
||||||
package {
|
|
||||||
name = "mypackage"
|
|
||||||
version = "1.0.0"
|
|
||||||
baseUri = "package://example.com/mypackage"
|
|
||||||
packageZipUrl = "https://foo.com"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
val packager =
|
|
||||||
CliProjectPackager(
|
|
||||||
CliBaseOptions(workingDir = tempDir),
|
|
||||||
listOf(tempDir),
|
|
||||||
CliTestOptions(),
|
|
||||||
".out/%{name}@%{version}",
|
|
||||||
skipPublishCheck = true,
|
|
||||||
consoleWriter = StringWriter()
|
|
||||||
)
|
|
||||||
packager.run()
|
|
||||||
val expectedMetadata = tempDir.resolve(".out/mypackage@1.0.0/mypackage@1.0.0")
|
|
||||||
assertThat(expectedMetadata).exists()
|
|
||||||
assertThat(expectedMetadata)
|
|
||||||
.hasContent(
|
|
||||||
"""
|
|
||||||
{
|
|
||||||
"name": "mypackage",
|
|
||||||
"packageUri": "package://example.com/mypackage@1.0.0",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"packageZipUrl": "https://foo.com",
|
|
||||||
"packageZipChecksums": {
|
|
||||||
"sha256": "8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85"
|
|
||||||
},
|
|
||||||
"dependencies": {},
|
|
||||||
"authors": [],
|
|
||||||
"annotations": [
|
|
||||||
{
|
|
||||||
"type": "PObject",
|
|
||||||
"classInfo": {
|
|
||||||
"moduleName": "pkl.base",
|
|
||||||
"class": "Unlisted",
|
|
||||||
"moduleUri": "pkl:base"
|
|
||||||
},
|
|
||||||
"properties": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "PObject",
|
|
||||||
"classInfo": {
|
|
||||||
"moduleName": "pkl.base",
|
|
||||||
"class": "Deprecated",
|
|
||||||
"moduleUri": "pkl:base"
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"since": "0.26.1",
|
|
||||||
"message": "do not use",
|
|
||||||
"replaceWith": null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "PObject",
|
|
||||||
"classInfo": {
|
|
||||||
"moduleName": "pkl.base",
|
|
||||||
"class": "ModuleInfo",
|
|
||||||
"moduleUri": "pkl:base"
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"minPklVersion": "0.26.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Path.zipFilePaths(): List<String> {
|
private fun Path.zipFilePaths(): List<String> {
|
||||||
return FileSystems.newFileSystem(URI("jar:${toUri()}"), emptyMap<String, String>()).use { fs ->
|
return FileSystems.newFileSystem(URI("jar:${toUri()}"), emptyMap<String, String>()).use { fs ->
|
||||||
Files.walk(fs.getPath("/")).map(IoUtils::toNormalizedPathString).collect(Collectors.toList())
|
Files.walk(fs.getPath("/")).map(IoUtils::toNormalizedPathString).collect(Collectors.toList())
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -18,7 +18,6 @@ package org.pkl.cli
|
|||||||
import com.github.ajalt.clikt.core.MissingArgument
|
import com.github.ajalt.clikt.core.MissingArgument
|
||||||
import com.github.ajalt.clikt.core.subcommands
|
import com.github.ajalt.clikt.core.subcommands
|
||||||
import java.io.StringWriter
|
import java.io.StringWriter
|
||||||
import java.io.Writer
|
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
@@ -37,6 +36,7 @@ import org.pkl.commons.writeString
|
|||||||
import org.pkl.core.Release
|
import org.pkl.core.Release
|
||||||
|
|
||||||
class CliTestRunnerTest {
|
class CliTestRunnerTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `CliTestRunner succeed test`(@TempDir tempDir: Path) {
|
fun `CliTestRunner succeed test`(@TempDir tempDir: Path) {
|
||||||
val code =
|
val code =
|
||||||
@@ -63,11 +63,8 @@ class CliTestRunnerTest {
|
|||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
"""
|
"""
|
||||||
module test
|
module test
|
||||||
facts
|
succeed ✅
|
||||||
✔ succeed
|
|
||||||
|
|
||||||
100.0% tests pass [1 passed], 100.0% asserts pass [2 passed]
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
.trimIndent()
|
.trimIndent()
|
||||||
)
|
)
|
||||||
@@ -83,86 +80,7 @@ class CliTestRunnerTest {
|
|||||||
facts {
|
facts {
|
||||||
["fail"] {
|
["fail"] {
|
||||||
4 == 9
|
4 == 9
|
||||||
"foo" != "bar"
|
"foo" == "bar"
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
val out = StringWriter()
|
|
||||||
val err = StringWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions()
|
|
||||||
val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)
|
|
||||||
assertThatCode { runner.run() }.hasMessage("Tests failed.")
|
|
||||||
|
|
||||||
assertThat(out.toString().stripFileAndLines(tempDir))
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
module test
|
|
||||||
facts
|
|
||||||
✘ fail
|
|
||||||
4 == 9 (/tempDir/test.pkl, line xx)
|
|
||||||
|
|
||||||
0.0% tests pass [1/1 failed], 50.0% asserts pass [1/2 failed]
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
assertThat(err.toString()).isEqualTo("")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `CliTestRunner with thrown error in facts`(@TempDir tempDir: Path) {
|
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
facts {
|
|
||||||
["fail"] {
|
|
||||||
throw("uh oh")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
val out = StringWriter()
|
|
||||||
val err = StringWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions()
|
|
||||||
val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)
|
|
||||||
assertThatCode { runner.run() }.hasMessage("Tests failed.")
|
|
||||||
|
|
||||||
assertThat(out.toString().stripFileAndLines(tempDir))
|
|
||||||
.isEqualToNormalizingNewlines(
|
|
||||||
"""
|
|
||||||
module test
|
|
||||||
facts
|
|
||||||
✘ fail
|
|
||||||
–– Pkl Error ––
|
|
||||||
uh oh
|
|
||||||
|
|
||||||
5 | throw("uh oh")
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
at test#facts["fail"][#1] (/tempDir/test.pkl, line xx)
|
|
||||||
|
|
||||||
0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
assertThat(err.toString()).isEqualTo("")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `CliTestRunner with thrown error in examples -- no expected output`(@TempDir tempDir: Path) {
|
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
examples {
|
|
||||||
["fail"] {
|
|
||||||
throw("uh oh")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@@ -179,73 +97,10 @@ class CliTestRunnerTest {
|
|||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
"""
|
"""
|
||||||
module test
|
module test
|
||||||
examples
|
fail ❌
|
||||||
✘ fail
|
4 == 9 ❌
|
||||||
–– Pkl Error ––
|
"foo" == "bar" ❌
|
||||||
uh oh
|
|
||||||
|
|
||||||
5 | throw("uh oh")
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
at test#examples["fail"][#1] (/tempDir/test.pkl, line xx)
|
|
||||||
|
|
||||||
0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
assertThat(err.toString()).isEqualTo("")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `CliTestRunner with thrown error in examples -- existing expected output`(
|
|
||||||
@TempDir tempDir: Path
|
|
||||||
) {
|
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
examples {
|
|
||||||
["fail"] {
|
|
||||||
throw("uh oh")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
tempDir
|
|
||||||
.resolve("test.pkl-expected.pcf")
|
|
||||||
.writeString(
|
|
||||||
"""
|
|
||||||
examples {
|
|
||||||
["fail"] {
|
|
||||||
"never compared to"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
val out = StringWriter()
|
|
||||||
val err = StringWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions()
|
|
||||||
val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)
|
|
||||||
assertThatCode { runner.run() }.hasMessage("Tests failed.")
|
|
||||||
|
|
||||||
assertThat(out.toString().stripFileAndLines(tempDir))
|
|
||||||
.isEqualToNormalizingNewlines(
|
|
||||||
"""
|
|
||||||
module test
|
|
||||||
examples
|
|
||||||
✘ fail
|
|
||||||
–– Pkl Error ––
|
|
||||||
uh oh
|
|
||||||
|
|
||||||
5 | throw("uh oh")
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
at test#examples["fail"][#1] (/tempDir/test.pkl, line xx)
|
|
||||||
|
|
||||||
0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
.trimIndent()
|
.trimIndent()
|
||||||
)
|
)
|
||||||
@@ -263,18 +118,16 @@ class CliTestRunnerTest {
|
|||||||
9 == trace(9)
|
9 == trace(9)
|
||||||
"foo" == "foo"
|
"foo" == "foo"
|
||||||
}
|
}
|
||||||
["bar"] {
|
["fail"] {
|
||||||
"foo" == "foo"
|
|
||||||
5 == 9
|
5 == 9
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
.trimIndent()
|
.trimIndent()
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
||||||
val noopWriter = noopWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
||||||
val testOpts = CliTestOptions(junitDir = tempDir)
|
val testOpts = CliTestOptions(junitDir = tempDir)
|
||||||
val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)
|
val runner = CliTestRunner(opts, testOpts)
|
||||||
assertThatCode { runner.run() }.hasMessageContaining("failed")
|
assertThatCode { runner.run() }.hasMessageContaining("failed")
|
||||||
|
|
||||||
val junitReport = tempDir.resolve("test.xml").readString().stripFileAndLines(tempDir)
|
val junitReport = tempDir.resolve("test.xml").readString().stripFileAndLines(tempDir)
|
||||||
@@ -283,58 +136,9 @@ class CliTestRunnerTest {
|
|||||||
"""
|
"""
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuite name="test" tests="2" failures="1">
|
<testsuite name="test" tests="2" failures="1">
|
||||||
<testcase classname="test.facts" name="foo"></testcase>
|
<testcase classname="test" name="foo"></testcase>
|
||||||
<testcase classname="test.facts" name="bar">
|
<testcase classname="test" name="fail">
|
||||||
<failure message="Fact Failure">5 == 9 (/tempDir/test.pkl, line xx)</failure>
|
<failure message="Fact Failure">5 == 9 ❌</failure>
|
||||||
</testcase>
|
|
||||||
<system-err><![CDATA[9 = 9
|
|
||||||
]]></system-err>
|
|
||||||
</testsuite>
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `CliTestRunner JUnit reports, with thrown error`(@TempDir tempDir: Path) {
|
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
facts {
|
|
||||||
["foo"] {
|
|
||||||
9 == trace(9)
|
|
||||||
"foo" == "foo"
|
|
||||||
}
|
|
||||||
["fail"] {
|
|
||||||
throw("uh oh")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
val noopWriter = noopWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions(junitDir = tempDir)
|
|
||||||
val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)
|
|
||||||
assertThatCode { runner.run() }.hasMessageContaining("failed")
|
|
||||||
|
|
||||||
val junitReport = tempDir.resolve("test.xml").readString().stripFileAndLines(tempDir)
|
|
||||||
assertThat(junitReport)
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<testsuite name="test" tests="2" failures="1">
|
|
||||||
<testcase classname="test.facts" name="foo"></testcase>
|
|
||||||
<testcase classname="test.facts" name="fail">
|
|
||||||
<error message="uh oh">–– Pkl Error ––
|
|
||||||
uh oh
|
|
||||||
|
|
||||||
9 | throw("uh oh")
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
at test#facts["fail"][#1] (/tempDir/test.pkl, line xx)
|
|
||||||
</error>
|
|
||||||
</testcase>
|
</testcase>
|
||||||
<system-err><![CDATA[9 = 9
|
<system-err><![CDATA[9 = 9
|
||||||
]]></system-err>
|
]]></system-err>
|
||||||
@@ -376,14 +180,13 @@ class CliTestRunnerTest {
|
|||||||
.trimIndent()
|
.trimIndent()
|
||||||
val input = tempDir.resolve("test.pkl").writeString(foo).toString()
|
val input = tempDir.resolve("test.pkl").writeString(foo).toString()
|
||||||
val input2 = tempDir.resolve("test.pkl").writeString(bar).toString()
|
val input2 = tempDir.resolve("test.pkl").writeString(bar).toString()
|
||||||
val noopWriter = noopWriter()
|
|
||||||
val opts =
|
val opts =
|
||||||
CliBaseOptions(
|
CliBaseOptions(
|
||||||
sourceModules = listOf(input.toUri(), input2.toUri()),
|
sourceModules = listOf(input.toUri(), input2.toUri()),
|
||||||
settings = URI("pkl:settings")
|
settings = URI("pkl:settings")
|
||||||
)
|
)
|
||||||
val testOpts = CliTestOptions(junitDir = tempDir)
|
val testOpts = CliTestOptions(junitDir = tempDir)
|
||||||
val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)
|
val runner = CliTestRunner(opts, testOpts)
|
||||||
assertThatCode { runner.run() }.hasMessageContaining("failed")
|
assertThatCode { runner.run() }.hasMessageContaining("failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,107 +203,6 @@ class CliTestRunnerTest {
|
|||||||
assertThat(e1.message!!.replace("test", "eval")).isEqualTo(e2.helpMessage())
|
assertThat(e1.message!!.replace("test", "eval")).isEqualTo(e2.helpMessage())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private fun String.stripFileAndLines(tmpDir: Path) =
|
||||||
fun `example length mismatch`(@TempDir tempDir: Path) {
|
replace(tmpDir.toUri().toString(), "/tempDir/").replace(Regex(""" \(.*, line \d+\)"""), "")
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
examples {
|
|
||||||
["nums"] {
|
|
||||||
1
|
|
||||||
2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
tempDir
|
|
||||||
.resolve("test.pkl-expected.pcf")
|
|
||||||
.writeString(
|
|
||||||
"""
|
|
||||||
examples {
|
|
||||||
["nums"] {
|
|
||||||
1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
val out = StringWriter()
|
|
||||||
val err = StringWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions()
|
|
||||||
val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)
|
|
||||||
assertThatCode { runner.run() }.hasMessage("Tests failed.")
|
|
||||||
|
|
||||||
assertThat(out.toString().stripFileAndLines(tempDir))
|
|
||||||
.isEqualToNormalizingNewlines(
|
|
||||||
"""
|
|
||||||
module test
|
|
||||||
examples
|
|
||||||
✘ nums
|
|
||||||
(/tempDir/test.pkl, line xx)
|
|
||||||
Output mismatch: Expected "nums" to contain 1 examples, but found 2
|
|
||||||
|
|
||||||
0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `only written examples`(@TempDir tempDir: Path) {
|
|
||||||
|
|
||||||
val code =
|
|
||||||
"""
|
|
||||||
amends "pkl:test"
|
|
||||||
|
|
||||||
examples {
|
|
||||||
["nums"] {
|
|
||||||
1
|
|
||||||
2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
val input = tempDir.resolve("test.pkl").writeString(code).toString()
|
|
||||||
val out = StringWriter()
|
|
||||||
val err = StringWriter()
|
|
||||||
val opts = CliBaseOptions(sourceModules = listOf(input.toUri()), settings = URI("pkl:settings"))
|
|
||||||
val testOpts = CliTestOptions()
|
|
||||||
val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)
|
|
||||||
val exception = assertThrows<CliException> { runner.run() }
|
|
||||||
assertThat(exception.exitCode).isEqualTo(10)
|
|
||||||
assertThat(out.toString())
|
|
||||||
.isEqualTo(
|
|
||||||
"""
|
|
||||||
module test
|
|
||||||
examples
|
|
||||||
✍️ nums
|
|
||||||
|
|
||||||
1 examples written
|
|
||||||
|
|
||||||
"""
|
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun String.stripFileAndLines(tmpDir: Path): String {
|
|
||||||
// handle platform differences in handling of file URIs
|
|
||||||
// (file:/// on *nix vs. file:/ on Windows)
|
|
||||||
return replace(tmpDir.toFile().toURI().toString(), "/tempDir/")
|
|
||||||
.replace(tmpDir.toUri().toString(), "/tempDir/")
|
|
||||||
.replace(Regex("line \\d+"), "line xx")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun noopWriter(): Writer =
|
|
||||||
object : Writer() {
|
|
||||||
override fun close() {}
|
|
||||||
|
|
||||||
override fun flush() {}
|
|
||||||
|
|
||||||
override fun write(cbuf: CharArray, off: Int, len: Int) {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -41,8 +41,7 @@ class ReplMessagesTest {
|
|||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"/".toPath(),
|
"/".toPath(),
|
||||||
StackFrameTransformers.defaultTransformer,
|
StackFrameTransformers.defaultTransformer
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# This is a Gradle generated file for dependency locking.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
com.github.ajalt.clikt:clikt-jvm:3.5.4=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
|
com.github.ajalt.clikt:clikt-jvm:3.5.1=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
|
||||||
com.github.ajalt.clikt:clikt:3.5.4=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.github.ajalt.clikt:clikt:3.5.1=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.squareup:javapoet:1.13.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
com.squareup:javapoet:1.13.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
com.tunnelvisionlabs:antlr4-runtime:4.9.0=runtimeClasspath,testRuntimeClasspath
|
com.tunnelvisionlabs:antlr4-runtime:4.9.0=default,runtimeClasspath,testRuntimeClasspath
|
||||||
io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath
|
io.leangen.geantyref:geantyref:1.3.15=testRuntimeClasspath
|
||||||
net.bytebuddy:byte-buddy:1.14.18=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||||
org.assertj:assertj-core:3.26.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.graalvm.sdk:graal-sdk:23.0.6=runtimeClasspath,testRuntimeClasspath
|
org.graalvm.sdk:graal-sdk:23.0.2=default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.graalvm.truffle:truffle-api:23.0.6=runtimeClasspath,testRuntimeClasspath
|
org.graalvm.truffle:truffle-api:23.0.2=default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
@@ -22,19 +22,18 @@ org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspat
|
|||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.jupiter:junit-jupiter-api:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-engine:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.jupiter:junit-jupiter-engine:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.jupiter:junit-jupiter-params:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||||
org.junit.platform:junit-platform-commons:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit.platform:junit-platform-engine:1.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.junit:junit-bom:5.11.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.msgpack:msgpack-core:0.9.8=runtimeClasspath,testRuntimeClasspath
|
|
||||||
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||||
org.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath
|
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
|
||||||
org.snakeyaml:snakeyaml-engine:2.5=runtimeClasspath,testRuntimeClasspath
|
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
|
||||||
empty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
|
empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
plugins {
|
plugins {
|
||||||
pklAllProjects
|
pklAllProjects
|
||||||
pklKotlinLibrary
|
pklKotlinLibrary
|
||||||
@@ -34,22 +19,25 @@ dependencies {
|
|||||||
// with `org.gradle.parallel=true` and without the line below, `test` strangely runs into:
|
// with `org.gradle.parallel=true` and without the line below, `test` strangely runs into:
|
||||||
// java.lang.NoClassDefFoundError: Lorg/pkl/config/java/ConfigEvaluator;
|
// java.lang.NoClassDefFoundError: Lorg/pkl/config/java/ConfigEvaluator;
|
||||||
// perhaps somehow related to InMemoryJavaCompiler?
|
// perhaps somehow related to InMemoryJavaCompiler?
|
||||||
tasks.test { mustRunAfter(":pkl-config-java:testFatJar") }
|
tasks.test {
|
||||||
|
mustRunAfter(":pkl-config-java:testFatJar")
|
||||||
|
}
|
||||||
|
|
||||||
tasks.jar { manifest { attributes += mapOf("Main-Class" to "org.pkl.codegen.java.Main") } }
|
tasks.jar {
|
||||||
|
manifest {
|
||||||
|
attributes += mapOf("Main-Class" to "org.pkl.codegen.java.Main")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
named<MavenPublication>("library") {
|
named<MavenPublication>("library") {
|
||||||
pom {
|
pom {
|
||||||
url.set("https://github.com/apple/pkl/tree/main/pkl-codegen-java")
|
url.set("https://github.com/apple/pkl/tree/main/pkl-codegen-java")
|
||||||
description.set(
|
description.set("""
|
||||||
"""
|
|
||||||
Java source code generator that generates corresponding Java classes for Pkl classes,
|
Java source code generator that generates corresponding Java classes for Pkl classes,
|
||||||
simplifying consumption of Pkl configuration as statically typed Java objects.
|
simplifying consumption of Pkl configuration as statically typed Java objects.
|
||||||
"""
|
""".trimIndent())
|
||||||
.trimIndent()
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/**
|
||||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -20,8 +20,8 @@ import org.pkl.commons.cli.CliCommand
|
|||||||
import org.pkl.commons.cli.CliException
|
import org.pkl.commons.cli.CliException
|
||||||
import org.pkl.commons.createParentDirectories
|
import org.pkl.commons.createParentDirectories
|
||||||
import org.pkl.commons.writeString
|
import org.pkl.commons.writeString
|
||||||
import org.pkl.core.Closeables
|
|
||||||
import org.pkl.core.ModuleSource
|
import org.pkl.core.ModuleSource
|
||||||
|
import org.pkl.core.module.ModuleKeyFactories
|
||||||
|
|
||||||
/** API for the Java code generator CLI. */
|
/** API for the Java code generator CLI. */
|
||||||
class CliJavaCodeGenerator(private val options: CliJavaCodeGeneratorOptions) :
|
class CliJavaCodeGenerator(private val options: CliJavaCodeGeneratorOptions) :
|
||||||
@@ -49,8 +49,7 @@ class CliJavaCodeGenerator(private val options: CliJavaCodeGeneratorOptions) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Closeables.closeQuietly(builder.moduleKeyFactories)
|
ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)
|
||||||
Closeables.closeQuietly(builder.resourceReaders)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user