228 Commits

Author SHA1 Message Date
Dan Chao
d097341abd Prepare 0.26.2 release 2024-07-18 09:13:58 -07:00
Daniel Chao
0eab5fb552 Add release notes for 0.26.2 (#586) 2024-07-18 09:13:11 -07:00
Daniel Chao
7c3787396e Fix race condition when concurrently downloading packages (#584)
This fixes a possible race condition where multiple processes download
the same package into the same temp dir.
2024-07-18 09:12:03 -07:00
Dan Chao
57df7995fd Prepare 0.26.1 release 2024-06-28 09:28:36 -07:00
Daniel Chao
6c97b09c29 Add notes for 0.26.1 (#556) 2024-06-28 09:28:23 -07:00
Daniel Chao
da19c3971e Do not enable TLS certificate revocation checks by default (#553)
This addresses an issue where network requests may fail if cert revocation checks
error, which may occur due to availability issues, or due to lack of internet access.

Revocation checking can still be enabled by setting JVM property com.sun.net.ssl.checkRevocation if on the JVM.

Also:
* Load built-in certs from resources, and move them to pkl-commons-cli
* Fix an issue where HttpInitException is not caught when loading a module
2024-06-28 09:02:44 -07:00
Daniel Chao
efad356b7b Only run Gradle compatibility tests against releases in CI (#554)
This fixes our CI tests on main. It mitigates an issue where the current RC is borked right now.
2024-06-28 09:02:37 -07:00
Daniel Chao
261a2260a1 Use compatible architecture in native executables (#551)
Use the most compatible architecture; for example, x86-64 instead of
x86-64-v3.
2024-06-28 09:02:25 -07:00
Philip K.F. Hölzenspies
204c6b16c3 Resolve project dirs from working dir by default 2024-06-28 09:02:02 -07:00
Daniel Chao
f91f91fd30 docs: add contributor for 0.26 release (#546)
Add a contributor name who was missing from acknowledgements.
2024-06-24 08:52:23 -07:00
Philip K.F. Hölzenspies
309fb49fa1 Prepare 0.26.0 release 2024-06-17 18:49:29 +01:00
Daniel Chao
570c2085b3 Recover if rm command removes no files (#538) 2024-06-17 10:47:58 -07:00
Philip K.F. Hölzenspies
d55866a04b Fix commitish detection in LanguageSnippetTest to also cover release versions (#537) 2024-06-17 18:21:22 +01:00
Philip K.F. Hölzenspies
600939457a Set Windows build to use compatibility mode for native-image builds (#536) 2024-06-17 17:25:17 +01:00
Philip K.F. Hölzenspies
e996a342cc Remove links from headers in release notes (#535) 2024-06-17 16:43:22 +01:00
Daniel Chao
00c2e00bb9 Add release notes for 0.26 (#529)
This adds release notes for 0.26.

Also:

* Adjust IJ settings to ignore certain http: strings
* Add note about http introduced in 0.26 in message passing api

Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-06-17 08:03:41 -07:00
Philip K.F. Hölzenspies
bcee291fdc Fix release build gradle setup (#533) 2024-06-17 16:01:28 +01:00
Alan Scherger
4a7f90157a Documentation fix: const cannot be assigned/amended (#485) 2024-06-14 10:10:41 -07:00
Daniel Chao
f15ad6ec06 Change CLI flag and Gradle name for proxy options (#526)
Rationale: "proxy" can mean very different things (e.g. java.lang.reflect.Proxy in Java).
This makes the flag name more specific.

CLI:
* `--proxy` -> `--http-proxy`
* `--no-proxy` -> `--http-no-proxy`

Gradle:
* `proxyAddress` -> `httpProxy`
* `noProxy` -> `httpNoProxy`
2024-06-14 08:08:21 -07:00
Daniel Chao
380095c8a7 Change Gradle property to "rename" (#528)
This changes the property to match the name of the CLI flag.
2024-06-14 07:36:28 -07:00
Daniel Chao
9c287a2e48 Catch PklException errors coming from project load (#527)
This fixes an issue where an error coming from loading a project file is shown as a PklBugException.

There were two problems here:

1. proxyAddress needs to be a lazy value, because it can try to load a PklProject
2. accessing proxyAddress can throw a PklException, so it needs to be within the try/catch
2024-06-14 07:33:44 -07:00
Daniel Chao
3bd9214858 Adjust docs for proxying (#523)
Update/polish up the documentation around http proxying
2024-06-13 09:46:21 -07:00
Daniel Chao
919de4838c Improve handling of CA certificates (#518)
Instead of bundling Pkl's built-in CA certificates as a class path resource and loading them at runtime,
pass them to the native image compiler as the default SSL context's trust store.
This results in faster SSL initialization and is more consistent with how default certificates
are handled when running on the JVM.

Further related improvements:
- Remove HttpClientBuilder methods `addDefaultCliCertificates` and `addBuiltInCertificates`.
- Remove pkl-certs subproject and the optional dependencies on it.
- Move `PklCARoots.pem` to `pkl-cli/src/certs`.
- Fix certificate related error messages that were missing an argument.
- Prevent PklBugException if initialization of `CliBaseOptions.httpClient` fails.
- Add ability to set CA certificates as a byte array
- Add CA certificates option to message passing API
2024-06-12 17:53:03 -07:00
Vladimir Matveev
d7a1778199 Allow renaming Java/Kotlin classes/packages during code generation (#499)
Adds a `rename` field to the Java/Kotlin code generators that allows renaming packages and classes during codegen.

* Add `--rename` flag to CLIs
* Add `rename` property to Gradle API
2024-06-12 15:43:43 -07:00
Philip K.F. Hölzenspies
b03530ed1f Add support for HTTP proxying (#506)
* Add `--proxy` and `--no-proxy` CLI flags
* Add property `http` to `pkl:settings`
* Move `EvaluatorSettings` from `pkl:Project` to its own module and add property `http`
* Add support for proxying in server mode, and through Gradle
* Add `setProxy()` to `HttpClient`
* Add documentation
2024-06-12 11:54:22 -07:00
Daniel Chao
a520ae7d04 Fix missing paragraph in Windows installation docs (#520) 2024-06-11 08:00:37 -07:00
Daniel Chao
21749f5c82 Use Pkl syntax highlighting instead of Groovy (#519)
Now that Pkl syntax highlighting is available on GitHub,
we can remove the Groovy association with these files.

This also adds changes to mark `*.pcf` and `PklProject` files as Pkl.
2024-06-11 07:58:24 -07:00
Daniel Chao
a4c0a271b4 Require references from typealiases to be const (#516)
This adds a language change that requires references from typealiases
to the enclosing module to be `const`.

This is required because typealiases are not late-bound.

Rationale is laid out in SPICE-0007.

Also:
* Update documentation to reflect new rules.
* Fix `Project.pkl`; mark method `const` to not break said rule.
2024-06-10 09:01:05 -07:00
Daniel Chao
9cc9816440 Fix native tests in CircleCI (#514)
Fix an issue where the CI job attempts to install the wrong executable
when on macOS/aarch64.

Also, adjusts native test definitions in pkl-server to match pkl-core.
2024-06-05 09:05:16 -07:00
Daniel Chao
d5ba8fa736 Support scheme-agnostic projects (#486)
This adds changes to support loading project dependencies in non-file based projects.

The design for this feature can be found in SPICE-0005: https://github.com/apple/pkl-evolution/pull/6

Changes:
* Consider all imports prefixed with `@` as dependency notation.
* Bugfix: fix resolution of glob expressions in a local dependency.
* Adjust pkl.Project:
  - Allow local dependencies from a scheme-local paths.
  - Disallow certain evaluator settings if not loaded as a file-based module.
* Breaking API change: `ProjectDependenciesManager` constructor now requires `ModuleResolver` and `SecurityManager`.
2024-06-04 16:52:20 -07:00
Daniel Chao
c0a7080287 Fix line endings (#513)
* Adjust gitattributes file (mark some files binary, mark bat files as using crlf endings)
* Fix remaining line endings issues
2024-06-04 07:55:33 -07:00
translatenix
207d0c78f0 Fix globbed read/import bugs (#449)
* Split MemberNode into (Regular/Shared)MemberNode

SharedMemberNode enables generating non-constant object members
at run time without generating an unbounded number of Truffle root nodes.

* Invert shouldRunTypeCheck to match its name

* Introduce VmObjectBuilder

Introduce VmObjectBuilder, a uniform way to build `VmObject`s
whose `ObjectMember`s are determined at run time.
Replace some manual object building code with VmObjectBuilder.
Add some assertions to fix IntelliJ warnings.

* Improve implementation of globbed read/import nodes

- Leverage SharedMemberNode to have a single Truffle root node per globbed
  read/import expression instead of one root node per resolved glob element.
- Remove caching in ReadGlobNode because it only works correctly if glob pattern is a string *constant*.
- Remove caching in StaticReadNode (now ReadGlobElementNode/ImportGlobElementNode)
  because it seems unnecessary and the implementation doesn't look quite right.

* Simplify code

* Fix ClassCastException when reflecting on globbed import

* Fix caching of globbed reads

Problem:
The result of a globbed read depends not only on the glob pattern but also on the current module URI.
However, ResourceManager does not take this into account when caching globbed reads, causing wrong results.

Changes:
- Cache globbed reads per read expression.
  This is also how globbed imports are cached, except that import URIs are constant.
- Make ReadGlobNode and ImportGlobNode code as similar as possible.
- Reduce code duplication by inheriting from AbstractReadNode.
- Add some tests.
2024-06-03 17:10:56 -07:00
Daniel Chao
d81a12352c Improve configuration and tests for native-image (#509)
* Don't expose JDK internal classes; instead solve msgpack issue with `--initialize-at-run-time`.
* Use quick build mode for non-release builds:  40% faster compilation, 20% smaller executable.
* Remove options that were commented out.
* Also run ServerTest against native executable
2024-06-03 17:08:30 -07:00
Kushal Pisavadia
a48748cb9c Remove documentation references to packageInfos (#512)
It references something that isn't present and should be removed.
2024-06-03 09:19:28 -07:00
Daniel Chao
5b7123131f Change line endings from CRLF to LF (#511) 2024-05-30 08:41:21 -07:00
Daniel Chao
8ec06e631f Add support for Windows (#492)
This adds support for Windows.
The in-language path separator is still `/`, to ensure Pkl programs are cross-platform.

Log lines are written using CRLF endings on Windows.
Modules that are combined with `--module-output-separator` uses LF endings to ensure
consistent rendering across platforms.

`jpkl` does not work on Windows as a direct executable.
However, it can work with `java -jar jpkl`.

Additional details:

* Adjust git settings for Windows
* Add native executable for pkl cli
* Add jdk17 windows Gradle check in CI
* Adjust CI test reports to be staged within Gradle rather than by shell script.
* Fix: encode more characters that are not safe Windows paths
* Skip running tests involving symbolic links on Windows (these require administrator privileges to run).
* Introduce custom implementation of `IoUtils.relativize`
* Allow Gradle to initialize ExecutableJar `Property` values
* Add Gradle flag to enable remote JVM debugging

Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-05-28 15:56:20 -07:00
Daniel Chao
5e4ccfd4e8 Omit showing stdlib as dependency in pkldoc (#503)
The stdlib is an implicit dependency for every package.
Showing this as a dependency is unnecessary noise.
2024-05-28 13:42:57 -07:00
Daniel Chao
47f161a211 Clean up unnecessary CI (#502) 2024-05-21 08:48:02 -07:00
Nikola Irinchev
c1949a99b0 Update amending example in tutorial (#491)
* Update amending example

* Make sure wood pigeon amends stock pigeon

Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>

---------

Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-05-17 13:05:28 +01:00
Daniel Chao
d0def765a2 Make http(s) URIs their own module key (#495)
GenericUrl is a catch-all that uses URL.openConnection().
Since we now have special handling of HTTP urls, it makes more sense to
put it in its own module key.
2024-05-16 08:38:43 -07:00
Daniel Chao
5f4d475d84 Fix local dependency globbing (#496)
This fixes an issue where globbing resources within a local dependency
fails to match anything.
2024-05-16 08:36:37 -07:00
Dan Chao
a5c13e325a Encode filepaths to be safe on Windows
This changes the file paths to use characters that are safe for Windows.

Channges the output of the following:
* Package cache directory
* Generated pkl-doc files
* Kotlin generated code

Unsafe characters are encoded as (<hex>).
For example, the colon character `:` is encoded as `(3a)`.

Additionally, this changes the cache directory prefix (package-1 to
package-2).

Follows the design of https://github.com/apple/pkl-evolution/pull/3
2024-05-13 14:06:28 -07:00
Dan Chao
110dc89e86 Improve URI encoding in pkldoc
Only encode characters that are strictly necessary in URI paths.

This removes encoding for parentheses, for example.
2024-05-13 14:06:28 -07:00
Gary Sassano
2d31bc5ef5 Adjust filename according to style guide (#484) 2024-05-13 10:09:43 -07:00
Daniel Chao
7da643fc8f Handle null pathElements gracefully in message passing API (#480)
In messages "List Resources Response" and "List Modules Response",
if `pathElements` and `error` are both null, default to an empty list.
2024-05-08 07:22:57 -07:00
Daniel Chao
21aa44cfc4 Require global settings file to use pkl:settings (#477)
This is technically a breaking change, but follows the intended use-case
and documentation of settings.

* Require that the global settings file at `~/.pkl/settings.pkl`
amends stdlib module `pkl:settings`, or otherwise sets `output.value`
to an instance of `pkl.Settings`.
* Simplify the object mapping of `PklSettings.java`
2024-05-07 07:49:00 -07:00
translatenix
aeb17588b3 Simplify implementation of RequestCapturingClient (#473) 2024-05-06 12:02:45 +02:00
Daniel Chao
d28313bca8 Declare members of http package NonnullByDefault (#471)
* Add a package-info.java with NonnullByDefault annotation
* Make RequestCapturingClient return a response to satisfy the type checker
2024-05-03 09:58:01 -07:00
Islon Scherer
27d8a030b1 Remove hidden modifier from many reflect properties for better equality/rendering (#470) 2024-05-03 11:04:15 +02:00
Philip K.F. Hölzenspies
b5208a2b5b Swap Kotlin/Groovy tab order in documentation (#469)
* Swap Kotlin/Groovy tab order in documentation

* Use Kotlin DSL repository extension function
2024-05-02 15:26:43 +01:00
kuu(Fumiya Kume)
c959888f0b Fix CI to use JDK17 in deployment jobs (#468) 2024-05-01 09:09:36 -07:00
translatenix
ea3e8f115b Improve conditional configuration of native build tasks (#465)
- Move all conditional configuration to the `assembleNative` and `testNative` "root" tasks
- Don't build aarch64 executable on Intel Mac
2024-04-30 15:57:39 -07:00
translatenix
e49a36e318 Make Java classes final if possible
Also add private no-arg constructors for classes that aren't meant to be instantiated.
2024-04-30 15:14:14 -07:00
translatenix
ae69e4776f Fix IntelliJ warnings in Java code
Fix all IntelliJ warnings in Java production code except for
bogus spelling warnings and warnings about unused public methods.
Also fix some warnings emitted by Code->Inspect Code.

Changes made:
- use text block instead of string concatenation
- extract method to avoid code duplication
- use switch expression
- fix Javadoc syntax and spelling
- fix spelling in comment
- increase class visibility to match visibility of use site
- delete overriding method with same implementation
- use String.isEmpty() and StringBuilder.isEmpty()
- add @Serial annotation
- make field final
- remove unused field
- remove unused private method
- remove exceptions that aren't thrown from throws clause
- insert non-null assertion
- annotate overriding method with @Nonnull
- suppress warning
- delete unused class (WriteAuxiliarySlotNode)
- add final modifier
- remove unused error message
- repeat @Nullable modifier in overriding method
- remove never thrown exception from throws clause
- remove redundant suppression
2024-04-30 15:14:14 -07:00
translatenix
5feaa2aaf7 Remove remnants of Alpine Linux workaround (#466) 2024-04-30 15:12:30 -07:00
Daniel Chao
ed1b317801 Fix formatting error (#463) 2024-04-30 07:33:36 -07:00
Daniel Chao
0d3400fb59 Don't install GraalVM for an architecture that can't be built (#452)
This fixes an issue where the build native tasks will try
to install GraalVM for an architecture that it can't build.
2024-04-29 15:36:27 -07:00
translatenix
fd1c294146 Remove obsolete Alpine Linux workaround (#457)
The bug necessitating this workaround was fixed in October 2022.

For details: https://github.com/oracle/graal/issues/3398
2024-04-29 11:13:01 -07:00
Mark Robinson
c3a99f8ae6 Fix error handler to use new message 2024-04-29 14:52:29 +02:00
Mark Robinson
b433500e04 Update pkl-core/src/main/resources/org/pkl/core/errorMessages.properties
Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-04-29 14:52:29 +02:00
Mark Robinson
f857223511 Update pkl-core/src/main/resources/org/pkl/core/errorMessages.properties
Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-04-29 14:52:29 +02:00
Mark Robinson
c331dede3c Adjust wording in error 2024-04-29 14:52:29 +02:00
Mark Robinson
b9e94b94ae Fix handling of other http error codes when creating packages 2024-04-29 14:52:29 +02:00
Daniel Chao
e28d747418 JDK version bump cleaups, bump minimum Gradle version to 8.1 (#454)
* Bump JDK when running simple gradle CI jobs
* Bump minimum Gradle version to 8.1
* Fix docs, and fix minimum version checker
2024-04-26 07:42:39 -07:00
translatenix
a7c7e51180 Leverage basic Java 17 features (#451)
- Refactor code to use the following basic Java 17 features:
  - pattern matching for instanceof
  - @Serial annotation
  - switch expressions
  - enhanced switch statements
  - StringBuilder.isEmpty()
- Replace two switch statements with simpler if statements.
- Rename a few local variables.
2024-04-25 12:52:28 -07:00
Daniel Chao
3ab9e4184e Drop java 11, bump GraalVM to 23.0 (#439)
* Remove unnecessary strictfp modifier
* Add annotations to address Truffle DSL warnings (@Idempotent, @Exclusive)
* Adjust build logic to allow building cross-arch on macOS
* Add warning suppression for specialization limit (left this one as a TODO)
2024-04-24 16:17:19 -07:00
Mitch Capper
583dfc6927 Windows installation notes 2024-04-24 12:37:11 +02:00
translatenix
3a31188cc1 Improve method.isConst() check in InvokeSuperMethodNode
Check const-ness every time a method is resolved instead of every time it is called.
2024-04-19 15:35:57 -07:00
translatenix
5de90d5868 Improve method.isConst() checks in InvokeMethodVirtualNode
- Check `method.isConst()` every time a method is resolved
  instead of once per node instance (`isConstChecked`).
  Given that `needsConst` only happens in very specific circumstances,
  I'm not entirely sure if every resolved method needs to be checked.
  However, it's a cleaner solution in any case, and `method.isConst()`
  is a fast check that also never happens on the `evalCached` fast path.
- Do not check for const-ness of `FunctionN.apply` methods.
  This check seems unnecessary and would always fail if triggered.
  (According to `base.pkl`, none of the `FunctionN.apply` methods is const.)
- Remove unnecessary Truffle boundaries for modifier checks,
  which are just bitwise operations.
- Improve const/import docs.
2024-04-19 15:35:57 -07:00
Lily Ballard
76f1b92039 Enable useCustomStringDelimiters for pkl test example output (#416)
This makes the `<file>-expected.pcf` file a bit easier to read when examples contain quotes or
backslashes.
2024-04-18 12:58:05 -07:00
Stefano Baghino
81bfdb7cbd Enable caching of native image building and test tasks (#409)
Enable caching for the native image building task and improves the caching effectiveness of some of the test tasks in the project.
2024-04-18 08:28:56 -07:00
Kushal Pisavadia
31917d1556 Suppress warnings for System.getProperty("line.separator") (#432)
`class System` gets initialized at build time through `native-image`
and added to the heap. We initialize everything at build time via the
`--initialize-at-build-time=` flag.
2024-04-17 21:23:24 -07:00
Phillip
ccf95d2af1 Correct spelling and grammar issues in Language Reference (#435)
Changes include:
1. Spelling correction addressing #401
2. Grammer and punctuation corrections.
3. Rephrasing of some harder-to-read sentences. Most are simple one or two-word additions to make reading less jarring.
4. Changed hyphenation occurrences that included &ndash; rather than a regular hyphen-dash.
2024-04-17 16:44:19 -07:00
translatenix
5510bf12d2 Eliminate redundant map lookup (#433) 2024-04-17 16:37:55 -07:00
translatenix
52ce6815d1 Fix IntelliJ scope definition (#434) 2024-04-17 13:38:09 -07:00
Takumi Muraishi
5fa598f636 Fix typos (#436) 2024-04-17 13:37:59 -07:00
translatenix
e688b4d4e1 Fix typo (#437) 2024-04-17 13:37:45 -07:00
luuvish
2f0436ff2f Cannot assign property with fixed/const in spread (#428)
When using spread syntax with typed object, properties that are fixed
or const cannot be assigned or amended.
This should be checked in the checkTypedProperty() function.
2024-04-16 14:45:33 -07:00
Daniel Chao
6e2ea07986 Fix documentation about ValueRenderer converters (#422)
* Class-based converters are covariant, not invariant.
* The most specific class-based converter wins
* The first declared path-based converter that matches wins
2024-04-16 10:28:05 -07:00
translatenix
90b461aa58 Support building with JDK 21 (#234)
- Update google-java-format to a version compatible with JDK 21 and run "gw spotlessApply".
- Fix wrong test assumption
  JavaCodeGenerator writes a properties file using java.util.Properties,
  which doesn't guarantee order of entries.
- Fix most deprecation warnings
- Add CI job for JDK 21
2024-04-12 13:38:31 -07:00
Lily Ballard
f71323024c Fix pkl.reflect#typedType to mirror the right type (#426) 2024-04-12 13:35:35 -07:00
Lily Ballard
889e64586a Fix member links custom link text examples in language reference (#427) 2024-04-12 13:35:08 -07:00
translatenix
af66532377 Lock JLine to previous version (3.23.0) (#424)
JLine 3.25.1 does not work with native image.
2024-04-11 21:55:38 -07:00
Stefan M
033db30b04 Convert CODE_OF_CONDUCT to Markdown (#417) 2024-04-11 21:25:53 -07:00
translatenix
bba5387f17 Update dependencies (#350)
* Update various dependencies
* Freeze kotlinx.html and kotlinx.serialization versions until Kotlin itself is updated.
2024-04-11 20:54:01 -07:00
Philip K.F. Hölzenspies
309e3ff4f6 Update expected test outcome 2024-04-10 14:02:36 +01:00
luuvish
375b88f53e Fix the sequence length in the YAML parser
The initialSize in EconomicsMaps.create() is not the actual stored size,
hence the accurate size is not determined until ObjectMembers are added
after addMembers() called.

Since the size set during the creation of VmListing cannot be changed
afterwards, the size of node.getValue() is used instead of members'
size.
2024-04-10 14:02:36 +01:00
translatenix
3c6df1fe34 Turn EvalTask into a tracked Gradle task
Rationale: "Output file names are known only after execution"
isn't a legitimate reason to make this task untracked
because the output directory is known in this case.
This is no different from (say) the `JavaCompile` task,
where only the class file output directory is known upfront.
Forum discussion didn't reveal another reason why this task
should be untracked.
2024-04-05 15:04:48 +01:00
translatenix
2392a3c22f Add quick link to standard library docs
Motivation:
The standard library docs are some of the most important docs
but currently very hard to find. I've noticed that even advanced
users have never heard of them and complain about "zero docs".
2024-04-05 12:38:55 +01:00
Jungwoo
0f9ef53126 fix: add test 2024-04-05 11:18:02 +01:00
Jungwoo Yang
35490dc559 Fix MergeSort.java 2024-04-05 11:18:02 +01:00
translatenix
d916345d2c Use Files.newInputStream()/newOutputStream() where appropriate (#383)
Use `Files.newInputStream(path)` instead of `new FileInputStream(path.toFile())`
and `Files.newOutputStream(path)` instead of `new FileOutputStream(path.toFile())`.
2024-04-04 16:04:14 -07:00
translatenix
57f45c80c6 Update to Gradle 8.7 (#396)
Update Gradle by running the following command:
gw wrapper --gradle-version latest --gradle-distribution-sha256-sum
544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d

Manually verify wrapper JAR according to:
https://docs.gradle.org/current/userguide/gradle_wrapper.html#manually_verifying_the_gradle_wrapper_jar
2024-04-04 16:02:22 -07:00
Daniel Chao
58ed8242af Fix links for downloading snapshot executables (#391)
Also, quote the URLs for better shell compatibility
2024-04-04 07:43:42 -07:00
translatenix
3bd91b92ee Fix "amends declaration vs. expression" mistakes in language reference 2024-04-03 19:06:54 +01:00
Daniel Chao
28448b5512 Ensure owner and receiver are reset after executing alias (#373)
This fixes an issue where the frame's owner/receiver are not reset
if a type test on a typealias fails.
2024-03-28 07:58:22 -07:00
Daniel Chao
759d4806c0 Fix java/kotlin usage examples (#372)
Co-authored-by: Fruxz <28064149+TheFruxz@users.noreply.github.com>
2024-03-28 07:57:28 -07:00
Daniel Chao
c28e478d5a Fix links to pkl-go and pkl-swift repos (#364)
Using `xref` turns these links into fragments.
2024-03-27 12:30:41 -07:00
Daniel Chao
4bdfe40816 Import release notes for 0.25.3 (#365)
This adds the release notes for 0.25.3 into CHANGELOG.
2024-03-27 11:56:29 -07:00
Philip K.F. Hölzenspies
e347b26cf6 Avoid resolving paths on fragments (#357)
Fixes an issue where modules with fragment paths are resolved against the URI path.
2024-03-26 08:16:02 -07:00
Daniel Chao
c9ed183891 Fix source links in pkldoc (#362)
Fixes an issue where source links are incorrectly URI encoded; i.e. `https%3A//github.com` instead of `https://github.com`.

This was causing the browser to resolve these as relative to the enclosing page.
2024-03-26 07:48:55 -07:00
translatenix
11a2343a65 Change HttpClientInitException to extend RuntimeException (#359)
PklException is mainly used to indicate errors during evaluation of Pkl code.
It isn't a suitable superclass for HttpClientInitException.
2024-03-22 16:32:16 -07:00
translatenix
deaf6983c4 Follow HTTP redirects (#328)
- Change HttpClient to follow all redirects except HTTPS to HTTP.
- Run language snippet tests with --no-cache and real PackageServer
  instead of pre-seeded cache.
  This increases HTTP test coverage and enables testing of package redirects.
- Change PackageServer to return 301 for request paths starting with /HTTP301/
  and 307 for request paths starting with /HTTP307/.
- Update some outdated test package checksums that apparently weren't verified.
2024-03-21 10:26:07 -07:00
translatenix
60bcd56672 Eliminate unnecessary use of GregorianCalendar (#344)
Switch from `java.util.GregorianCalendar` to `java.time.LocalDateTime`
2024-03-21 08:50:14 -07:00
Daniel Chao
1a16619522 Re-enable gradle compatibility tests (#349) 2024-03-21 08:14:08 -07:00
Stefan M
7584fb8d25 Enable Gradle caching (#324) 2024-03-20 10:48:19 -07:00
translatenix
dfe85b786e Replace magic test port 12110 with 0 (#345)
Also introduce constants for some test package SHAs
to make them easier to update.
2024-03-20 10:47:28 -07:00
Islon Scherer
2aa60eaf1f change security file to markdown (#347) 2024-03-20 14:39:51 +01:00
Daniel Chao
7e948d317c Add workaround for configuration error during maven publish (#342)
The maven publish plugin isn't setting up dependencies correctly,
and we are getting errors like:

 "Task ':pkl-config-java:publishFatJarPublicationToMavenLocal' uses
  this output of task ':pkl-config-java:signLibraryPublication' without
   declaring an explicit or implicit dependency."

This adds a workaround for this type of error.
2024-03-19 11:40:13 -07:00
Stefan M
46d65506d5 Do not package empty directories (#330)
Changes the packager to exclude any empty directories.

This change means that pkl project package for an already published packages will fail. The packager checks for an existing package at this version, and compares checksums. It will then error if the checksum has changed.

This is technically a breaking change, albeit a minor one. The workaround is to publish new versions of packages.

Published packages should still be compatible with Pkl 0.25.
2024-03-19 09:34:47 -07:00
Malix
5d0d2ce7a1 Add TOML to comparison page (#337)
Puts TOML next to JSON, XML, YAML
2024-03-19 09:14:56 -07:00
Zihlu Wang
2bf1fa215a Update pkl-config-java.adoc (#340)
Remove unpaired back curly bracket.
2024-03-19 09:13:46 -07:00
Zihlu Wang
4ce7a82db5 Removed undeclared method reference in examples. (#341)
There is no method `evaluateText` in `ConfigEvaluator` or `ConfigEvaluatorImpl`.
2024-03-19 09:13:33 -07:00
Daniel Chao
76f3890cff Fix buildSrc Kotlin/Java compat (#339)
This fixes an issue where Gradle fails to build because of
Java/Kotlin getting mismatching versions when targeting macOS/aarch64.
2024-03-19 08:38:42 -07:00
Daniel Chao
e4ccf517fa Use layout.buildDirectory (#326)
This switches Gradle scripts to use `layout.buildDirectory` instead
of hard-coded "build".
2024-03-18 21:42:16 -07:00
Daniel Chao
1f68cf0251 Add approval for release/x.x branch (#338)
Temporary workaround for now because our CI policy requires it.
2024-03-18 15:17:22 -07:00
Daniel Chao
4be03b0eaf Add CI to release/x.x branch (#333)
Adds logic to build (but not deploy) commits on the release branch.

This is so we have CI coverage for new patch releases of older versions.
2024-03-18 09:45:51 -07:00
translatenix
6264f4b631 Fix build issue where test fixtures weren't generated (#327)
Make sure that declaring a dependency on project `pkl-commons-test`
suffices to have its test fixtures generated.

This fix should work reliably.
However, there may be a more idiomatic way to achieve the same result.
2024-03-15 22:08:37 -07:00
translatenix
496e064caf Update to Gradle 8.6 (#245)
- Fix and clean up the pkl-commons-test build script.
- Change tests to read test packages/certs directly from
  the file system instead of packaging and reading them
  from the class path.
- Update expected checksums of some test packages.
- Fix a conflict between Pkl's and Gradle's
  Kotlin libraries in the pkl-gradle project.
- Fix build deprecation warnings.
- Ensure Gradle distribution integrity with `distributionSha256Sum`.
- Manually verify integrity of Gradle wrapper added by this commit.
2024-03-15 17:00:23 -07:00
Daniel Chao
faa7ac69bb Fix amending module with abstract class (#319)
This fixes an assertion error that gets thrown if:
1. A module declares a class as abstract
2. An amending module does not use that abstract class as a type

Underneath the hood, the modifiers of the class/typelias object member
is considered different from the modifiers on the VmClass/VmTypeAlias
values.

The object model skips forcing any explicitly members that are explicitly
declared hidden, abstract, or local.
However, it _should_ evaluate any abstract classes found in a module.
So, it's incorrect to apply the same modifiers on the class to the object member.
2024-03-15 07:53:09 -07:00
Daniel Chao
9c1ae0d683 Use smaller compute resource for patch test (#315)
Change resource size to "small".
2024-03-13 16:04:45 -07:00
translatenix
014b3a8816 Bind PackageServer to ephemeral port to avoid port conflicts (#227)
This is a comprehensive solution to the "flaky PackageServer tests"
problem. It rules out port conflicts and imposes no limits on test
parallelism. The same solution can be used for other test servers
in the future.

Major changes:
- Turn `PackageServer` from a singleton into a class that is
  instantiated per test class or test method.
- Start the server the first time its `port` property is read.
  Bind the server to an ephemeral port instead of port 12110.
- For every test that uses `PackageServer`, pass the server port to
  `--test-port`, `HttpClient.Builder.setTestPort`, the `CliBaseOptions`
  or `ExecutorOptions` constructor, or the Gradle plugin's `testPort` property.
  Wire all of these to `RequestRewritingClient`'s `testPort` constructor parameter.
- Enhance `RequestRewritingClient` to replace port 12110 with `testPort`
  in request URIs unless `testPort` is -1 (its default).
- Introduce `ExecutorOptions.Builder`.
  This makes executor options more comfortable to create
  and allows to hide options such as `testPort`.
- Deprecate the `ExecutorOptions` constructor to steer users towards the builder.
- Get rid of `ExecutorOptions2`, which is no longer needed.
- Clean up `EmbeddedExecutorTest` with the help of the builder.
2024-03-13 10:40:55 -07:00
Kushal Pisavadia
1e608b2aae Persist jpkl to the workspace for releases (#314)
This is something that was published to Maven but not as a GitHub release.
 Persist it so that it can go out with a release.
2024-03-13 10:00:04 -07:00
Islon Scherer
8dc258ef7d fix bug with for generator variables in mixin (#297) 2024-03-07 20:47:21 +01:00
Daniel Chao
9defe868c0 Clean up http-client changes (#295)
* pkl-excutor tests: symlink 0.25.0 distribution into pkl-executable/build
* Use `IoUtils.getPklHomeDir` in HttpClientBuilder
* Simplify Exceptions.java
* Enable testing for older pkl-executor distribution
2024-03-07 10:43:04 -08:00
d4wae89d498
3fb1f03780 Fix missing closing quotes in Local dependencies #298 (#299)
Fix missing closing quotes in 'Local Dependencies' section of index.adoc to ensure syntax correctness.
2024-03-07 10:42:10 -08:00
translatenix
3f3dfdeb1e Use java.net.http.HttpClient instead of java.net.Http(s)URLConnection (#217)
Moving to java.net.http.HttpClient brings many benefits, including
HTTP/2 support and the ability to make asynchronous requests.

Major additions and changes:
- Introduce a lightweight org.pkl.core.http.HttpClient API.
  This keeps some flexibility and allows to enforce behavior
  such as setting the User-Agent header.
- Provide an implementation that delegates to java.net.http.HttpClient.
- Use HttpClient for all HTTP(s) requests across the codebase.
  This required adding an HttpClient parameter to constructors and
  factory methods of multiple classes, some of which are public APIs.
- Manage CA certificates per HTTP client instead of per JVM.
  This makes it unnecessary to set JVM-wide system/security properties
  and default SSLSocketFactory's.
- Add executor v2 options to the executor SPI
- Add pkl-certs as a new artifact, and remove certs from pkl-commons-cli artifact

Each HTTP client maintains its own connection pool and SSLContext.
For efficiency reasons, It's best to reuse clients whenever feasible.
To avoid memory leaks, clients are not stored in static fields.

HTTP clients are expensive to create. For this reason,
EvaluatorBuilder defaults to a "lazy" client that creates the underlying
java.net.http.HttpClient on the first send (which may never happen).
2024-03-06 10:25:56 -08:00
Daniel Chao
106743354c Improve CircleCI builds (#294)
* Prevent build_artifacts.txt files from being published as
  GitHub releases
* Bump version to 1.0.2; make PRBs not depend on flakey pr-approval job
2024-03-06 09:25:40 -08:00
Daniel Chao
11f07d1ce8 Revert "Add setting for Kotlin package to codegen (#194)" (#271)
This reverts commit 7f404fff49.

The package is derived from the module name.
Having `module com.example.Foo` in Pkl
will create Kotlin `package com.example`.

Eventually, we may want to introduce a way to map
Pkl names to package names that provides finer
controls to the code generator.
2024-03-04 07:51:39 -08:00
Daniel Chao
4f3858aaaf Docs fix: Container is not a type, add more types (#282)
Adjusts documentation to remove legacy `Container` type,
and add the rest of the generic types in the stdlib.
2024-03-04 07:49:44 -08:00
Daniel Chao
d7196e1207 Docs fix: Java 8 is not supported (#283)
Java 11 is the minimum version, rather than 8.
2024-03-04 07:49:20 -08:00
Islon Scherer
9c3a761cfa add test for checking out of sync snippets (#240) 2024-03-01 16:44:36 +01:00
Daniel Chao
0ae9e0c5c0 Add homebrew instructions to docs (#270) 2024-02-29 11:02:36 -08:00
Daniel Chao
6746040362 Fix: add missing "const" and "fixed" modifiers to reflect API (#265)
This fixes an issue where the reflect API does not show fixed or const modifiers on a property.
2024-02-29 07:02:09 -08:00
Daniel Chao
ddfab2a280 Add CI check to test patch file (#253)
This tests that the patch file can apply in CI.
2024-02-28 08:10:54 -08:00
Daniel Chao
b0161a4777 Add specification for language binding API (#257)
This adds documentation for how the language bindings works, for those that wish to create their own bindings.
2024-02-28 08:10:16 -08:00
Daniel Chao
2499e2c493 Fix patch file (#252)
This fixes an issue that is perventing our patch from from being
applied.
2024-02-27 07:50:00 -08:00
translatenix
813572f0d2 Add Pkl logo to README (#242) 2024-02-26 18:28:29 +01:00
Islon Scherer
90dedb7837 remove file with \ on the name as windows does not support it (#251) 2024-02-26 15:03:46 +01:00
translatenix
b7b0e65cc6 Delete unused image (#243)
This image is not used anywhere.
2024-02-23 14:50:48 -08:00
Daniel Chao
96c0e5fb03 Add com.oracle.truffle to shaded libs (#238)
This allows two libraries that use Truffle to coexist
in a host application.
2024-02-23 09:07:18 -08:00
translatenix
32bc75bf50 Add targets for org.pkl.core.util.Nullable (#235)
Also, change `java.time.@Nullable Duration` to `@Nullable java.time.Duration` to reduce the chance
of false positive errors in IDEs.
2024-02-23 07:07:08 -08:00
Sam Gammon
7f404fff49 Add setting for Kotlin package to codegen (#194) 2024-02-23 11:54:05 +01:00
translatenix
48a000aa1a Fix Gradle test tasks in pkl-server (#176)
Before: "test" runs no tests, "unitTests" runs all tests
After : "test" runs all tests
2024-02-22 19:58:06 -08:00
translatenix
2c54643037 Breaking: rename some CLI classes for consistency (#169)
CliDownloadPackageCommand -> CliPackageDownloader (consistent with CliProjectPackager/CliProjectResolver)
CliAbstractProjectCommand -> CliProjectCommand (consistent with CliCommand)
2024-02-22 19:53:01 -08:00
translatenix
a85ffd3cab Order entries alphabetically (as stated) (#236)
Also remove an obsolete comment.
2024-02-22 17:04:20 -08:00
translatenix
115e775d1b Fix Gradle build warning (#232)
The warning was introduced by 1e502009.
2024-02-22 15:06:17 -08:00
translatenix
d756dff0e7 Delete stale files in LanguageSnippetTests/output
When I delete pkl-core/src/test/files/LanguageSnippetTests/output and
run "gw test", most output files are regenerated, but 46 of them aren't.
I assume these are stale files that should be deleted.
2024-02-22 15:05:14 +00:00
Mitch Capper
9cc1796429 Minor development/contributing/ci doc links / additions 2024-02-22 15:04:12 +00:00
Sam Gammon
eb170017f6 Fix dropped implementSerializable flag
Fixes and closes apple/pkl#191

Signed-off-by: Sam Gammon <sam@elide.ventures>
2024-02-22 13:23:09 +00:00
Zack McCauley
8f130d8d49 Fix multiple output example code (#205) 2024-02-22 10:28:23 +01:00
Islon Scherer
c652bbe5cd fix typo in doc for Listing default (#224) 2024-02-21 18:56:11 +01:00
Sam Gammon
ca31185302 Move tool versions to Version Catalog
- fix: make version catalog accessible from `buildSrc` plugins
- chore: declare `googleFormatVersion` in version catalog
- chore: declare `ktfmt` in version catalog

Relates-To: apple/pkl#204
Signed-off-by: Sam Gammon <sam@elide.ventures>
2024-02-21 12:01:49 +00:00
translatenix
21e0e149ac Tweak User-Agent header
It is customary to separate elements with a semicolon.
2024-02-21 11:40:46 +00:00
Sam Gammon
1e50200969 Use Gradle typed project accessors
This change activates the `TYPESAFE_PROJECT_ACCESSORS` feature
preview in Gradle, and switches to such accessors instead of
string-based project references, where possible

Relates-To: apple/pkl#204
Signed-off-by: Sam Gammon <sam@elide.ventures>
2024-02-21 11:36:02 +00:00
Sam Gammon
cb33a7cdb0 Skip POM validation for unpublished projects
This small change fixes a bug introduced by the `validatePom` task
within the `pklPublishLibrary` plugin. When running project-wide
tasks like `./gradle tasks`, projects which don't provide a POM
fail the build, because the `generatePomFileForLibraryPublication`
cannot be found, but it is expected to be present.

Fixes and closes apple/pkl#215

Signed-off-by: Sam Gammon <sam@elide.ventures>
2024-02-21 11:32:47 +00:00
Sam Gammon
fc0f6f1ef0 Add IDEA project icon
Adds an icon for the Pkl project which is used in IDEA's "New UI"
when opening Pkl
2024-02-21 11:31:22 +00:00
Islon Scherer
611ab3b55c make reflected values renderable (#170) 2024-02-21 09:57:08 +01:00
GrantA
1cfcc5ec38 Fix incorrect filename in tutorial
The referenced filename should be `ispklTutorialPart3.pkl`, not `pklTutorial.pkl`.

Also, changes dates from 2023 to 2024

Co-authored-by: grant-abbott <gaabbott@apple.com>
2024-02-20 21:09:08 -08:00
Manuel Blanco
dd49236e00 Breaking: add private final modifier to InvalidMappingException fields. (#218)
This makes the class more closely follow Java conventions.
2024-02-20 21:04:25 -08:00
translatenix
6175d16d6a Update Gradle syntax in docs (#210)
Replace the legacy "compile" scope with "implementation".
This matches Maven Central's recommended syntax:
https://central.sonatype.com/artifact/org.pkl-lang/pkl-core
2024-02-20 21:02:45 -08:00
translatenix
91367ed065 Fix unnecessary temp path resolution in PackageResolvers (#219)
The only call site already resolved the path against tmpDir.
2024-02-20 20:47:28 -08:00
translatenix
ffc629f28f Fix concurrency bug in PackageResolvers (#220)
Access to field "isClosed" must be guarded.
2024-02-20 16:46:09 -08:00
translatenix
277f1e0cdb Mark generated/truffle as generated source dir in IntelliJ
This fixes many "unknown symbol" errors in Java source files.
2024-02-20 15:18:39 +00:00
translatenix
50a006b1b5 Simplify code in ResourceReaders (#175) 2024-02-19 13:48:56 +01:00
Lily Ballard
bbb4d828a0 Update Reserved keywords list in the Language Reference (#171)
`const` is not reserved, it has a meaning already. And `match` is not a keyword at all.
2024-02-19 13:37:47 +01:00
translatenix
3b2feb45cf Replace some if-statements with if-expressions (#168) 2024-02-16 14:41:41 +01:00
Josh B
0405db8d80 [pkl-doc] Sort stdlib first on the main page (#165) 2024-02-16 14:25:49 +01:00
Kushal Pisavadia
3d1db25864 Fix name resolution in typealias with constraint (#144)
The body of a typealias gets inlined into wherever the typealias
is used. This fixes a bug where the references in the typealias body can
resolve to the wrong value.
2024-02-15 13:28:10 -08:00
translatenix
1c29287344 Fix usage of wrong lock object (#163)
This changes the lock object to `lock`, which every other method is locking on.
2024-02-15 13:25:43 -08:00
Kushal Pisavadia
699cdc623e Update GraalVM to 22.3.3 (from 22.3.1) (#156)
This bumps GraalVM's version.

References:
- https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.3.3
- https://github.com/oracle/graal/compare/vm-22.3.1...vm-22.3.3
- https://www.graalvm.org/release-notes/22_3/
2024-02-15 09:48:15 -08:00
translatenix
810a755702 Fix typo in constructor parameter name (#162)
Breaking change: changes param name `noTranstive` to `noTransitive`.
2024-02-15 09:35:21 -08:00
translatenix
c3473cc626 Add Gradle task "testNative"
Support running native tests with "gw testNative" for consistency with "gw test".
2024-02-14 19:53:40 +00:00
Philip K.F. Hölzenspies
a49526649d Update docs/modules/language-tutorial/pages/02_filling_out_a_template.adoc 2024-02-13 21:30:18 +00:00
GrantA
1b208f852c Update docs/modules/language-tutorial/pages/02_filling_out_a_template.adoc
Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-02-13 21:30:18 +00:00
GrantA
1a1d2f9908 Update docs/modules/language-tutorial/pages/02_filling_out_a_template.adoc
Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-02-13 21:30:18 +00:00
grant-abbott
0b680be32b Addressing documentation discrepancies from pkl examples. 2024-02-13 21:30:18 +00:00
Hoxell
f2470f3e85 Apply suggested update to note on amending types 2024-02-13 21:16:06 +00:00
Freddy
7d9603afd7 Update docs/modules/language-tutorial/pages/02_filling_out_a_template.adoc
Co-authored-by: Philip K.F. Hölzenspies <holzensp@gmail.com>
2024-02-13 21:16:06 +00:00
Hoxell
8c254a9976 Introduce Typed objects before referring to them
Currently, typed objects are only briefly mentioned in the sentence
stating that (typed) objects cannot be amended with new properties, only
existing ones. This is unnecessarily confusing since all examples up
until that point have been concerned with dynamic objects. Since the
tutorial goes on to amend a dynamic object with a new property in the
next section, a reader who isn't yet aware there are two types of
objects might be confused by what seems to be a contradiction.
2024-02-13 21:16:06 +00:00
Les Hill
14dec716cf Add details to show amending working when using modules
Running through the tutorial, the amending was stated in the tutorial text but not visible in the tutorial output since `parrot.pkl` was replacing all the members of `pigeon.pkl`.
2024-02-13 20:56:17 +00:00
Philip K.F. Hölzenspies
aa98123c93 Update pkl-core/src/test/kotlin/org/pkl/core/LanguageSnippetTestsEngine.kt 2024-02-13 20:53:29 +00:00
translatenix
da597d838d Don't run JUnit tests for non-existing native executables
This allows to "Run all Tests" in IntelliJ without getting lots of test errors because "pkl-alpine-linux-amd64" etc. doesn't exist.
2024-02-13 20:53:29 +00:00
Philip K.F. Hölzenspies
b3fb5dced6 Apply suggestions from code review 2024-02-13 16:57:12 +00:00
Hoxell
4bf6d3069d Fix mislabeled object name 2024-02-13 16:57:12 +00:00
Hoxell
28d98b461b Use object name instead of 'name' property 2024-02-13 16:57:12 +00:00
Hoxell
99717c61af Pigeon -> dodo 2024-02-13 16:57:12 +00:00
translatenix
a28ef85698 Update development instructions
- remove "Setup Gradle on your system" (too vague and doesn't seem necessary)
- remove "gw pkldoc" (obsolete)
- improve docs for common build commands
2024-02-13 10:43:34 +00:00
Daniel Chao
6f915e5b90 Fix docs pointing to wrong maven repo (#106) 2024-02-12 08:24:22 -08:00
shubham gupta
db55c527c6 logical and fix in mathUtils (#102) 2024-02-08 21:21:49 -08:00
Dan Chao
0a3a618091 Remove line from changelog
This change got reverted prior to the release.
2024-02-08 17:33:26 -08:00
Dan Chao
5ce205c2c0 Update changelog for release 0.25.2 2024-02-08 17:33:19 -08:00
Dan Chao
4f1189c163 Revert "remove duplicate publishing of pkl-cli-java (#98)"
This reverts commit 8e6ddfb9b7.
2024-02-08 15:52:10 -08:00
Daniel Chao
97f4193c15 Fix more links (#104)
This fixes more documentation links that are producing 404's.
2024-02-08 15:20:02 -08:00
Daniel Chao
dddae1190f Fixes for pkldoc (#96)
* Add URI encoding to paths and fragments
* Render quotes around identifiers when appropriate
2024-02-08 11:28:34 -08:00
Daniel Chao
9dc7eb2938 Use packages for CircleCI definition (#95) 2024-02-08 09:58:29 -08:00
Islon Scherer
8e6ddfb9b7 remove duplicate publishing of pkl-cli-java (#98) 2024-02-08 18:56:27 +01:00
Miroslav Shakhmaykin
71fd8591ae Fix doc navigation 2024-02-08 13:22:21 +00:00
Ricardo Pinheiro
20adac9919 Update Hidden Properties documentation (#91) 2024-02-07 21:15:53 -08:00
translatenix
77d0f5b8ca Only build static executable if musl toolchain is installed (#83)
This improves the development experience for (WSL) Linux users.
They can now run "./gradlew buildNative" without having a musl toolchain installed.
In this case, only the dynamically linked executable will be built.
2024-02-07 20:57:53 -08:00
Dan Chao
a6e59c07ff Revert "Update to Gradle 7.6.4 (latest 7.x release) (#58)"
This reverts commit 6eb3d20b47.

Reverting this because it might be the cause of some test flakiness.
2024-02-07 20:02:19 -08:00
Daniel Chao
52bc9612ea Reword verbage to "pantry" (#64)
* Reword verbage to "pantry"

* Fix verbage
2024-02-07 19:40:43 -08:00
The L D O
5a311d3b86 update 'Loading Modules' example to match config contents (#84)
Co-authored-by: Daniel Chao <dan.chao@apple.com>
2024-02-07 17:58:57 -08:00
Adrian Lanzafame
e9df244485 fix concat operator and string typo 2024-02-07 20:23:51 +00:00
James Ward
604bb83acb Fix artifact name 2024-02-07 20:23:17 +00:00
Shubham Gupta
5a8d8680c4 fix mangled url
Crash help text has mangled URL #61
2024-02-07 20:12:23 +00:00
kelvine
9bc7ada4ae fixed typo on transiti[ti]on 2024-02-07 20:09:57 +00:00
Lily Ballard
0538044fee Fix CLI docs examples for -x
The examples were using the wrong key.
2024-02-07 20:04:41 +00:00
Lily Ballard
bb3e3929ac Fix missing pkl eval subcommand in documentation examples 2024-02-07 20:04:41 +00:00
Daniel Chao
9f4fd58577 Fix documentation homepage (#81)
This adds a trailing slash that was missing from the documentation
homepage.
2024-02-07 07:33:19 -08:00
Ryosuke Hayashi
5c541aa168 Minor fix in the code of the docs 2024-02-06 16:13:10 +00:00
Islon Scherer
3f8fae4873 fix wrong stdlib doc links (#74) 2024-02-06 13:01:45 +01:00
Dan Chao
f0ae1be76a Fix broken search on pkldoc 2024-02-06 11:23:23 +00:00
Edward Knight
90c60c700d Fix minor discrepancy in workshop example (#60)
Map values of `agenda` should have a `name` instead of a `title` to be
consistent with the `TutorialPart` module.

Fixes #11.
2024-02-05 18:08:16 -08:00
translatenix
6eb3d20b47 Update to Gradle 7.6.4 (latest 7.x release) (#58) 2024-02-05 10:44:28 -08:00
Scott Henson
b3ccdda222 Merge pull request #57 from shenson/merge-back-to-main
`taxonomy` nesting fix
2024-02-05 15:24:16 +00:00
Philip Hölzenspies
eeb9f0b86e Remove lingering, outdated build target pkldoc 2024-02-05 14:49:08 +00:00
Brian Pfeil
58e7cc188a taxonomy nesting fix 2024-02-05 14:13:31 +00:00
Scott Henson
ba52ac73da Merge pull request #44 from rex4539/typos
Fix typos
2024-02-05 13:50:32 +00:00
Philip K.F. Hölzenspies
d5bd21fc69 Fix tutorial; uninterpreted value (fixes #10) 2024-02-05 10:40:44 +00:00
Philip Hölzenspies
27ecb8c389 Fix tutorial; uninterpreted value 2024-02-05 10:18:57 +00:00
Dimitris Apostolou
80aff3afad Fix typos 2024-02-04 18:55:08 +02:00
Tinko
38f2e9a1cf Fix macOS download URL mismatch (#29)
* Fix macOS download URL mismatch

* Update index.adoc

List aarch64 first

---------

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2024-02-03 20:07:45 -08:00
Daniel Chao
6e75c4a656 Fix download instructions (#21)
This fixes the download URLs for the pkl CLI
2024-02-03 14:25:40 -08:00
Dan Chao
ce65290aae Start next dev iteration 2024-02-01 20:55:37 -08:00
Dan Chao
1543909566 Polish release notes 2024-02-01 19:23:49 -08:00
Dan Chao
c31119e41f Prepare 0.25.1 release 2024-02-01 19:23:49 -08:00
Dan Chao
c0959fb3e2 Add dummy javadoc to pkl-tools 2024-02-01 19:23:49 -08:00
785 changed files with 17655 additions and 8223 deletions

View File

@@ -14,7 +14,7 @@
// limitations under the License.
//===----------------------------------------------------------------------===//
// File gets rendered to .circleci/config.yml via git hook.
amends ".../pkl-project-commons/packages/pkl.impl.circleci/PklCI.pkl"
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.1.1#/PklCI.pkl"
import "jobs/BuildNativeJob.pkl"
import "jobs/GradleCheckJob.pkl"
@@ -25,13 +25,13 @@ local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
local buildAndTestJobs = (prbJobs) {
"bench"
// "gradle-compatibility"
"gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot"))
}
local releaseJobs = (prbJobs) {
"bench"
// "gradle-compatibility"
"gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("release"))
}
@@ -71,6 +71,10 @@ release {
}
}
releaseBranch {
jobs = releaseJobs
}
triggerDocsBuild = "both"
triggerPackageDocsBuild = "release"
@@ -92,18 +96,28 @@ local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
musl = true
isRelease = _dist == "release"
}
["pkl-cli-windows-amd64-\(_dist)"] {
arch = "amd64"
os = "windows"
isRelease = _dist == "release"
}
}
}
local gradleCheckJobs: Mapping<String, GradleCheckJob> = new {
["gradle-check-jdk11"] {
javaVersion = "11.0"
isRelease = false
}
["gradle-check-jdk17"] {
javaVersion = "17.0"
isRelease = false
}
["gradle-check-jdk21"] {
javaVersion = "21.0"
isRelease = false
}
["gradle-check-jdk17-windows"] {
javaVersion = "17.0"
isRelease = false
os = "windows"
}
}
jobs {
@@ -118,28 +132,25 @@ jobs {
name = "gradle compatibility"
command = #"""
:pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases \
:pkl-gradle:compatibilityTestCandidate
:pkl-gradle:compatibilityTestReleases
"""#
}.job
["deploy-snapshot"] = new DeployJob {
command = "publishToSonatype"
}.job
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job
["deploy-release"] = new DeployJob {
isRelease = true
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
}.job
["github-release"] {
docker {
new {
image = "maniator/gh:v2.40.1"
}
new { image = "maniator/gh:v2.40.1" }
}
steps {
new AttachWorkspaceStep { at = "." }
new RunStep {
name = "Publish release on GitHub"
command = #"""
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \

View File

@@ -12,25 +12,19 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: macos.m1.large.gen1
macos:
xcode: 15.2.0
xcode: 15.3.0
pkl-cli-linux-amd64-release:
steps:
- checkout
@@ -46,7 +40,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -94,18 +88,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -117,30 +105,22 @@ jobs:
pkl-cli-macOS-aarch64-release:
steps:
- checkout
- run:
command: git apply patches/graalVm23.patch
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: macos.m1.large.gen1
macos:
xcode: 15.2.0
xcode: 15.3.0
pkl-cli-linux-aarch64-release:
steps:
- checkout
@@ -156,7 +136,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -188,18 +168,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -223,7 +197,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -271,18 +245,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -291,6 +259,26 @@ jobs:
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
pkl-cli-windows-amd64-release:
steps:
- checkout
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
pkl-cli-macOS-amd64-snapshot:
steps:
- checkout
@@ -300,25 +288,19 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: macos.m1.large.gen1
macos:
xcode: 15.2.0
xcode: 15.3.0
pkl-cli-linux-amd64-snapshot:
steps:
- checkout
@@ -334,7 +316,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -382,18 +364,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -405,30 +381,22 @@ jobs:
pkl-cli-macOS-aarch64-snapshot:
steps:
- checkout
- run:
command: git apply patches/graalVm23.patch
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: macos.m1.large.gen1
macos:
xcode: 15.2.0
xcode: 15.3.0
pkl-cli-linux-aarch64-snapshot:
steps:
- checkout
@@ -444,7 +412,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -476,18 +444,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -511,7 +473,7 @@ jobs:
# install jdk
curl -L \
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
@@ -559,18 +521,12 @@ jobs:
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
@@ -579,125 +535,131 @@ jobs:
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
gradle-check-jdk11:
pkl-cli-windows-amd64-snapshot:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace check
name: gradle check
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:11.0
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
gradle-check-jdk17:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace check
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results check
name: gradle check
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:17.0
bench:
gradle-check-jdk21:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace bench:jmh
name: bench:jmh
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results check
name: gradle check
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:11.0
- image: cimg/openjdk:21.0
gradle-check-jdk17-windows:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results check
name: gradle check
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
bench:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results bench:jmh
name: bench:jmh
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:17.0
gradle-compatibility:
steps:
- checkout
- run:
command: |-
./gradlew --info --stacktrace :pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases \
:pkl-gradle:compatibilityTestCandidate
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results :pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases
name: gradle compatibility
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:11.0
- image: cimg/openjdk:17.0
deploy-snapshot:
steps:
- checkout
- attach_workspace:
at: '.'
- run:
command: ./gradlew --info --stacktrace publishToSonatype
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results publishToSonatype
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:11.0
- image: cimg/openjdk:17.0
deploy-release:
steps:
- checkout
- attach_workspace:
at: '.'
- run:
command: ./gradlew --info --stacktrace -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:11.0
- image: cimg/openjdk:17.0
github-release:
steps:
- attach_workspace:
at: '.'
- run:
command: |-
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \
@@ -741,38 +703,45 @@ workflows:
type: approval
- pr-approval/authenticate:
context: pkl-pr-approval
- gradle-check-jdk11:
requires:
- hold
- pr-approval/authenticate
- gradle-check-jdk17:
requires:
- hold
- pr-approval/authenticate
- gradle-check-jdk21:
requires:
- hold
- gradle-check-jdk17-windows:
requires:
- hold
when:
matches:
value: << pipeline.git.branch >>
pattern: ^pull/\d+(/head)?$
main:
jobs:
- gradle-check-jdk11
- gradle-check-jdk17
- gradle-check-jdk21
- gradle-check-jdk17-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
- deploy-snapshot:
requires:
- gradle-check-jdk11
- gradle-check-jdk17
- gradle-check-jdk21
- gradle-check-jdk17-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
context: pkl-maven-release
- trigger-docsite-build:
requires:
@@ -785,24 +754,36 @@ workflows:
- << pipeline.git.branch >>
release:
jobs:
- gradle-check-jdk11:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-check-jdk17:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-check-jdk21:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-check-jdk17-windows:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- bench:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-compatibility:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-macOS-amd64-release:
filters:
branches:
@@ -833,16 +814,25 @@ workflows:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-windows-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- github-release:
requires:
- gradle-check-jdk11
- gradle-check-jdk17
- gradle-check-jdk21
- gradle-check-jdk17-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
context: pkl-github-release
filters:
branches:
@@ -868,3 +858,20 @@ workflows:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
release-branch:
jobs:
- gradle-check-jdk17
- gradle-check-jdk21
- gradle-check-jdk17-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
when:
matches:
value: << pipeline.git.branch >>
pattern: ^release/\d+\.\d+$

View File

@@ -16,12 +16,8 @@
/// Builds the native `pkl` CLI
extends "GradleJob.pkl"
// TODO(oss) replace these with package imports
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
import ".../pkl-pantry/packages/pkl.experimental.uri/URI.pkl"
/// The OS to run on
os: "macOS"|"linux"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.uri@1.0.0#/URI.pkl"
/// The architecture to use
arch: "amd64"|"aarch64"
@@ -29,8 +25,8 @@ arch: "amd64"|"aarch64"
/// Whether to link to musl. Otherwise, links to glibc.
musl: Boolean = false
local setupLinuxEnvironment: CircleCI.RunStep =
let (jdkVersion = "11.0.20.1+1")
local setupLinuxEnvironment: Config.RunStep =
let (jdkVersion = "17.0.9+9")
let (muslVersion = "1.2.2")
let (zlibVersion = "1.2.13")
let (jdkVersionEncoded = URI.encodeComponent(jdkVersion))
@@ -96,12 +92,12 @@ local setupLinuxEnvironment: CircleCI.RunStep =
steps {
when (os == "linux") {
new CircleCI.RestoreCacheStep {
new Config.RestoreCacheStep {
name = "Restore static deps from cache"
key = "staticdeps-\(arch)"
}
setupLinuxEnvironment
new CircleCI.SaveCacheStep {
new Config.SaveCacheStep {
name = "Save statics deps to cache"
key = "staticdeps-\(arch)"
paths {
@@ -110,34 +106,30 @@ steps {
}
}
when (os == "macOS" && arch == "amd64") {
new CircleCI.RunStep {
new Config.RunStep {
name = "Installing Rosetta 2"
command = """
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
"""
}
}
// If building macOS/aarch64, we need to use GraalVM 23.
// We can't use GraalVM 23 for any other build because we need to support Java 11, which was
// dropped in GraalVM 23.
when (os == "macOS" && arch == "aarch64") {
new CircleCI.RunStep {
command = "git apply patches/graalVm23.patch"
}
}
new CircleCI.RunStep {
new Config.RunStep {
name = "gradle buildNative"
local _os =
if (os == "macOS") "mac"
if (module.os == "macOS") "mac"
else if (musl) "alpine"
else if (module.os == "windows") "windows"
else "linux"
local jobName = "\(_os)Executable\(arch.capitalize())"
when (module.os == "windows") {
shell = "bash.exe"
}
command = #"""
export PATH=~/staticdeps/bin:$PATH
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize())
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize()) pkl-server:test\#(jobName.capitalize())
"""#
}
new CircleCI.PersistToWorkspaceStep {
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
@@ -148,12 +140,11 @@ steps {
job {
when (os == "macOS") {
macos {
xcode = "15.2.0"
xcode = "15.3.0"
}
// Use M1 for all architectures. We build amd64/aarch64 based on the GraalVM version,
// which gets patched in via `git apply patches/graalVm23.patch`.
resource_class = "macos.m1.large.gen1"
} else {
}
when (os == "linux") {
docker {
new {
image = if (arch == "aarch64") "arm64v8/oraclelinux:8-slim" else "oraclelinux:8-slim"
@@ -164,4 +155,10 @@ job {
}
resource_class = if (arch == "aarch64") "arm.xlarge" else "xlarge"
}
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
}
}

View File

@@ -15,7 +15,7 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
local self = this
@@ -23,13 +23,22 @@ command: String
job {
docker {
new { image = "cimg/openjdk:11.0" }
new { image = "cimg/openjdk:17.0" }
}
}
os = "linux"
steps {
new CircleCI.AttachWorkspaceStep { at = "." }
new CircleCI.RunStep {
new Config.AttachWorkspaceStep { at = "." }
new Config.RunStep {
command = "./gradlew \(self.gradleArgs) \(module.command)"
}
// add jpkl to workspace so it gets published as a GitHub release
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
}
}
}

View File

@@ -15,21 +15,31 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
javaVersion: "11.0"|"17.0"
javaVersion: "17.0"|"21.0"
os = "linux"
steps {
new CircleCI.RunStep {
new Config.RunStep {
name = "gradle check"
command = "./gradlew \(module.gradleArgs) check"
}
}
job {
docker {
new {
image = "cimg/openjdk:\(javaVersion)"
when (os == "linux") {
docker {
new {
image = "cimg/openjdk:\(javaVersion)"
}
}
}
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
}
}

View File

@@ -15,38 +15,33 @@
//===----------------------------------------------------------------------===//
abstract module GradleJob
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
/// Whether this is a release build or not.
isRelease: Boolean = false
/// The OS to run on
os: "macOS"|"linux"|"windows"
fixed gradleArgs = new Listing {
"--info"
"--stacktrace"
"-DtestReportsDir=${HOME}/test-results"
when (isRelease) {
"-DreleaseBuild=true"
}
}.join(" ")
steps: Listing<CircleCI.Step>
steps: Listing<Config.Step>
job: CircleCI.Job = new {
job: Config.Job = new {
environment {
["LANG"] = "en_US.UTF-8"
}
steps {
"checkout"
...module.steps
new CircleCI.RunStep {
// find all test results and write them to the home dir
name = "Gather test results"
command = """
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \\;
"""
`when` = "always"
}
new CircleCI.StoreTestResults {
new Config.StoreTestResults {
path = "~/test-results"
}
}

View File

@@ -15,14 +15,16 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
name: String = command
command: String
os = "linux"
steps {
new CircleCI.RunStep {
new Config.RunStep {
name = module.name
command = """
./gradlew \(module.gradleArgs) \(module.command)
@@ -32,6 +34,6 @@ steps {
job {
docker {
new { image = "cimg/openjdk:11.0" }
new { image = "cimg/openjdk:17.0" }
}
}

12
.gitattributes vendored
View File

@@ -3,4 +3,14 @@
/docs/** linguist-documentation
*.pkl linguist-language=Groovy
*.pcf linguist-language=Pkl
PklProject linguist-language=Pkl
* text eol=lf
*.bat text eol=crlf
*.gif binary
*.jar binary
*.woff2 binary
*.pem binary
*.png binary

1
.gitignore vendored
View File

@@ -8,6 +8,7 @@ generated/
# IntelliJ
.idea/
!.idea/icon.svg
!.idea/codestyles/
!.idea/inspectionProfiles/
!.idea/runConfigurations/

23
.idea/icon.svg generated Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100.58 98.63">
<path d="m75.57,19.78l2.43-13.25c-3.69-2.46-7.7-4.42-11.91-5.83l-8.97,10.05c-4.37-.8-8.85-.83-13.23-.08L35.03.5c-4.23,1.35-8.26,3.26-11.99,5.68l2.26,13.28c-3.35,2.92-6.17,6.4-8.32,10.3l-13.46.58c-1.58,4.15-2.6,8.49-3.03,12.91l11.8,6.51c.19,4.44,1.16,8.81,2.86,12.92l-7.94,10.89c2.26,3.82,5.02,7.33,8.2,10.42l12.45-5.16c3.59,2.62,7.62,4.59,11.89,5.82l3.56,13c4.4.62,8.86.64,13.26.08l3.72-12.95c4.29-1.17,8.34-3.09,11.96-5.67l12.38,5.32c3.22-3.05,6.03-6.52,8.33-10.32l-7.8-10.99c1.75-4.08,2.78-8.45,3.03-12.88l11.88-6.36c-.38-4.42-1.34-8.78-2.87-12.95l-13.45-.75c-2.1-3.92-4.87-7.44-8.19-10.4Z"
style="fill:#6b9543; stroke-width:0px;"/>
<circle cx="51.05" cy="47.72" r="31.49" style="fill:#e9f4ca; stroke-width:0px;"/>
<g id="_Radial_Repeat_">
<path d="m28.79,62.54c8.22,14.22,24.82,18.97,20.85-10.47h0c-.31-2.29-1.56-4.35-3.45-5.68-24.66-17.36-26.37.64-17.4,16.15Zm15.42-8.25h0c.7-.17,1.24.13,1.49.83,3.27,9.16-2.6,12.49-6.71,10.44-3.77-1.88-3.77-9.01,5.22-11.27Zm-2.14-5.45c.48.57.47,1.19-.03,1.7h0c-6.44,6.67-12.62,3.1-12.37-1.09.27-4.58,6.09-8.01,12.4-.61Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="38.62" cy="55.01" rx="7.64" ry="14.03" transform="translate(-22.33 26.68) rotate(-30)"
style="fill:#c8d987; stroke-width:0px;"/>
</g>
<g id="_Radial_Repeat_-2">
<path d="m49.34,21.03c-16.42.01-28.84,12.01-1.36,23.29h0c2.14.88,4.54.82,6.64-.15,27.37-12.67,12.63-23.16-5.29-23.15Zm-.56,17.48h0c-.2.69-.73,1.01-1.46.88-9.57-1.75-9.52-8.5-5.69-11.03,3.51-2.32,9.69,1.24,7.15,10.16Zm5.79.87c-.73.13-1.27-.18-1.46-.88h0c-2.56-8.91,3.62-12.48,7.13-10.17,3.83,2.53,3.9,9.28-5.67,11.04Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="50.94" cy="33.31" rx="14.03" ry="7.64" style="fill:#c8d987; stroke-width:0px;"/>
</g>
<g id="_Radial_Repeat_-3">
<path d="m75.02,59.59c8.2-14.23,4.02-30.98-19.5-12.82h0c-1.83,1.41-2.99,3.52-3.19,5.83-2.71,30.04,13.74,22.52,22.69,7Zm-14.86-9.23h0c-.5-.52-.51-1.14-.03-1.7,6.3-7.41,12.12-3.99,12.4.59.26,4.2-5.92,7.77-12.37,1.11Zm-3.65,4.58c.25-.7.79-1,1.49-.83h0c8.99,2.24,9,9.38,5.24,11.26-4.1,2.05-9.98-1.26-6.73-10.43Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="63.58" cy="54.83" rx="14.03" ry="7.64" transform="translate(-15.7 82.48) rotate(-60)"
style="fill:#c8d987; stroke-width:0px;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -15,6 +15,37 @@
<inspection_tool class="FieldMayBeFinal" enabled="true" level="INFORMATION" enabled_by_default="true">
<scope name="AllExceptTruffleAst" level="WARNING" enabled="true" />
</inspection_tool>
<inspection_tool class="HttpUrlsUsage" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredUrls">
<list>
<option value="http://" />
<option value="http://0.0.0.0" />
<option value="http://127.0.0.1" />
<option value="http://activemq.apache.org/schema/" />
<option value="http://cxf.apache.org/schemas/" />
<option value="http://java.sun.com/" />
<option value="http://javafx.com/fxml" />
<option value="http://javafx.com/javafx/" />
<option value="http://json-schema.org/draft" />
<option value="http://localhost" />
<option value="http://maven.apache.org/POM/" />
<option value="http://maven.apache.org/xsd/" />
<option value="http://primefaces.org/ui" />
<option value="http://schema.cloudfoundry.org/spring/" />
<option value="http://schemas.xmlsoap.org/" />
<option value="http://tiles.apache.org/" />
<option value="http://www.ibm.com/webservices/xsd" />
<option value="http://www.jboss.com/xml/ns/" />
<option value="http://www.jboss.org/j2ee/schema/" />
<option value="http://www.springframework.org/schema/" />
<option value="http://www.springframework.org/security/tags" />
<option value="http://www.springframework.org/tags" />
<option value="http://www.thymeleaf.org" />
<option value="http://www.w3.org/" />
<option value="http://xmlns.jcp.org/" />
</list>
</option>
</inspection_tool>
<inspection_tool class="JavadocBlankLines" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="false">
<scope name="AllExceptGenerated" level="WARNING" enabled="true">

View File

@@ -1,3 +1,3 @@
<component name="DependencyValidationManager">
<scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&amp;&amp;!src[pkl.pkl-core.main]:com.apple.pkl.core.ast..*&amp;&amp;!src[pkl.pkl-core.main]:com.apple.pkl.core.stdlib..*Nodes" />
<scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&amp;&amp;!src[pkl.pkl-core.main]:org.pkl.core.ast..*&amp;&amp;!src[pkl.pkl-core.main]:org.pkl.core.stdlib..*Nodes" />
</component>

View File

@@ -1,6 +1,6 @@
== Code of Conduct
## Code of Conduct
=== Our Pledge
### Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our
@@ -10,7 +10,7 @@ characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.
=== Our Standards
### Our Standards
Examples of behavior that contributes to creating a positive environment
include:
@@ -33,7 +33,7 @@ electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
=== Our Responsibilities
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of
acceptable behavior and are expected to take appropriate and fair
@@ -45,7 +45,7 @@ contributions that are not aligned to this Code of Conduct, or to ban
temporarily or permanently any contributor for other behaviors that they
deem inappropriate, threatening, offensive, or harmful.
=== Scope
### Scope
This Code of Conduct applies within all project spaces, and it also
applies when an individual is representing the project or its community
@@ -55,7 +55,7 @@ official social media account, or acting as an appointed representative
at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
=== Enforcement
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may
be reported by contacting the open source team at
@@ -70,9 +70,8 @@ Project maintainers who do not follow or enforce the Code of Conduct in
good faith may face temporary or permanent repercussions as determined
by other members of the projects leadership.
=== Attribution
### Attribution
This Code of Conduct is adapted from the
https://www.contributor-covenant.org[Contributor Covenant], version 1.4,
available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[Contributor Covenant](https://www.contributor-covenant.org), version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

View File

@@ -2,12 +2,11 @@
:uri-gng: https://gng.dsun.org
:uri-jenv: https://www.jenv.be
:uri-intellij: https://www.jetbrains.com/idea/download/
:uri-jdk: https://adoptopenjdk.net/releases.html
:uri-jdk: https://adoptopenjdk.net/releases.html?variant=openjdk17
== Setup
. (mandatory) Install {uri-jdk}[OpenJDK 11 HotSpot] (as long as we support JDK11)
. (mandatory) Setup Gradle on your system
. (mandatory) Install {uri-jdk}[OpenJDK 17] or higher
. (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.
If the project is opened but not imported, look for a popup in the lower right corner
@@ -29,14 +28,19 @@ jenv enable-plugin export
[source,shell]
----
gw clean
gw test
gw test # run all tests except native executable tests
gw testNative # run native executable tests
gw spotlessApply # fix code formatting
gw build # build everything except native executables
gw buildNative # build macOS executable on macOS,
# Linux and Alpine executables on Linux
gw pkldoc # generate standard library docs
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists)
pkl-cli/build/executable/jpkl # run Java executable
pkl-cli/build/executable/pkl-macos-amd64 # run Mac executable
pkl-cli/build/executable/jpkl # run Java executable
pkl-cli/build/executable/pkl-macos-amd64 # run Mac 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-windows-amd64.exe # run Windows executable
----
== Update Gradle
@@ -65,7 +69,15 @@ based on version information from https://search.maven.org, https://plugins.grad
* ANTLR code generation is performed by task `:pkl-core:generateGrammarSource`
** Output dir is `generated/antlr/`
== Remote JVM Debugging
To enable remote JVM debugging when running Gradle tasks (e.g. test), add the flag `-Djvmdebug=true`.
This will listen on port 5005.
Example: `./gradlew test -Djvmdebug=true`
== Resources
For automated build setup examples see our https://github.com/apple/pkl/blob/main/.circleci/[CircleCI] jobs like our https://github.com/apple/pkl/blob/main/.circleci/jobs/BuildNativeJob.pkl[BuildNativeJob.pkl], where we build Pkl automatically.
=== ANTLR

View File

@@ -1,4 +1,4 @@
= Pkl
= image:.idea/icon.svg[Pkl,30] Pkl
:uri-homepage: https://pkl-lang.org
:uri-docs: {uri-homepage}/main/current
@@ -11,6 +11,8 @@
:uri-pkl-examples: https://pkl-lang.org/main/current/examples.html
:uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation
:uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
:uri-ci-pipeline: https://app.circleci.com/pipelines/github/apple/pkl
A configuration as code language with rich validation and tooling.
@@ -34,3 +36,8 @@ We'd love to hear from you!
* Create an {uri-github-issue}[issue]
* Ask a question on {uri-github-discussions}[GitHub Discussions]
== Development image:https://circleci.com/gh/apple/pkl.svg?style=svg["Apple", link="https://app.circleci.com/pipelines/github/apple/pkl"]
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
* 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).

View File

@@ -1,13 +1,13 @@
= Security
# Security
For the protection of our community, the Pkl team does not disclose, discuss, or confirm security issues until our investigation is complete and any necessary updates are generally available.
== Reporting a security vulnerability
## Reporting a security vulnerability
If you have discovered a security vulnerability within the Pkl project, please report it to us.
We welcome reports from everyone, including security researchers, developers, and users.
Security vulnerabilities may be reported on the link:https://security.apple.com/submit[Report a vulnerability] form.
Security vulnerabilities may be reported on the [Report a vulnerability](https://security.apple.com/submit) form.
When submitting a vulnerability, select "Apple Devices and Software" as the affected platform, and "Open Source" as the affected area.
For more information, see https://pkl-lang.org/security.html.

View File

@@ -10,7 +10,7 @@ val graal: Configuration by configurations.creating
@Suppress("UnstableApiUsage")
dependencies {
jmh(project(":pkl-core"))
jmh(projects.pklCore)
// necessary because antlr4-runtime is declared as implementation dependency in pkl-core.gradle
jmh(libs.antlrRuntime)
truffle(libs.truffleApi)
@@ -24,7 +24,7 @@ jmh {
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
// "-Dgraal.TruffleFunctionInlining=false"
jvm.set("${buildInfo.graalVm.baseDir}/bin/java")
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java")
// see: https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
jvmArgs.set(
listOf(
@@ -38,7 +38,7 @@ jmh {
}
tasks.named("jmh") {
dependsOn(":installGraalVm")
dependsOn(":installGraalVmAmd64")
}
// Prevent this error which occurs when building in IntelliJ:

View File

@@ -2,15 +2,15 @@
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
com.tunnelvisionlabs:antlr4-runtime:4.9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apache.commons:commons-math3:3.2=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.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.compiler:compiler:22.3.1=graal
org.graalvm.sdk:graal-sdk:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
org.graalvm.truffle:truffle-api:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.compiler:compiler:23.0.2=graal
org.graalvm.sdk:graal-sdk:23.0.2=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.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -26,17 +26,17 @@ 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: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.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.openjdk.jmh:jmh-core:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-asm:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-bytecode:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-reflection:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
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-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-reflection:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath
org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=jmh,jmhRuntimeClasspath

View File

@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.util.TempFile;
import org.openjdk.jmh.util.TempFileManager;
import org.pkl.core.http.HttpClient;
import org.pkl.core.module.ModuleKeyFactories;
import org.pkl.core.repl.ReplRequest;
import org.pkl.core.repl.ReplResponse;
@@ -39,6 +40,7 @@ public class ListSort {
private static final ReplServer repl =
new ReplServer(
SecurityManagers.defaultManager,
HttpClient.dummyClient(),
Loggers.stdErr(),
List.of(ModuleKeyFactories.standardLibrary),
List.of(ResourceReaders.file()),
@@ -109,10 +111,10 @@ public class ListSort {
// append `.length` to avoid rendering the list
new ReplRequest.Eval("sort", "nums.sortWith(cmp).length", false, false))
.get(0);
if (!(response instanceof ReplResponse.EvalSuccess)) {
if (!(response instanceof ReplResponse.EvalSuccess success)) {
throw new AssertionError(response);
}
return ((ReplResponse.EvalSuccess) response).getResult();
return success.getResult();
}
// note that this is an uneven comparison

View File

@@ -30,30 +30,31 @@ public class ParserBenchmark {
public void run() {
new Parser()
.parseModule(
"a1 {\n"
+ " a2 {\n"
+ " a3 {\n"
+ " a4 {\n"
+ " a5 {\n"
+ " a6 {\n"
+ " a7 {\n"
+ " a8 {\n"
+ " a9 {\n"
+ " a10 {\n"
+ " a11 {\n"
+ " a12 {\n"
+ " a13 = map(map(map((x) -> 1)))\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}");
"""
a1 {
a2 {
a3 {
a4 {
a5 {
a6 {
a7 {
a8 {
a9 {
a10 {
a11 {
a12 {
a13 = map(map(map((x) -> 1)))
}
}
}
}
}
}
}
}
}
}
}
}""");
}
}

View File

@@ -41,7 +41,7 @@ idea {
}
val clean by tasks.registering(Delete::class) {
delete(buildDir)
delete(layout.buildDirectory)
}
val printVersion by tasks.registering {

View File

@@ -1,3 +1,5 @@
import org.jetbrains.kotlin.config.JvmTarget
plugins {
`kotlin-dsl`
}
@@ -9,9 +11,23 @@ dependencies {
exclude(module = "kotlin-android-extensions")
}
implementation(libs.shadowPlugin)
// fix from the Gradle team: makes version catalog symbols available in build scripts
// see here for more: https://github.com/gradle/gradle/issues/15383
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlin {
target {
compilations.configureEach {
kotlinOptions {
jvmTarget = "17"
}
}
}
}

View File

@@ -1,5 +1,7 @@
@file:Suppress("UnstableApiUsage")
rootProject.name = "buildSrc"
pluginManagement {
repositories {
mavenCentral()

View File

@@ -4,15 +4,12 @@ import java.io.File
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.artifacts.VersionConstraint
import org.gradle.kotlin.dsl.getByType
// `buildInfo` in main build scripts
// `project.extensions.getByType<BuildInfo>()` in precompiled script plugins
open class BuildInfo(project: Project) {
val self = this
inner class GraalVm {
inner class GraalVm(val arch: String) {
val homeDir: String by lazy {
System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm"
}
@@ -21,47 +18,27 @@ open class BuildInfo(project: Project) {
libs.findVersion("graalVm").get().toString()
}
val isGraal22: Boolean by lazy {
version.startsWith("22")
}
val arch by lazy {
if (os.isMacOsX && isGraal22) {
"amd64"
} else {
self.arch
}
val graalVmJdkVersion: String by lazy {
libs.findVersion("graalVmJdkVersion").get().toString()
}
val osName: String by lazy {
when {
os.isMacOsX && isGraal22 -> "darwin"
os.isMacOsX -> "macos"
os.isLinux -> "linux"
os.isWindows -> "windows"
else -> throw RuntimeException("${os.familyName} is not supported.")
}
}
val baseName: String by lazy {
if (graalVm.isGraal22) {
"graalvm-ce-java11-${osName}-${arch}-${version}"
} else {
"graalvm-jdk-${graalVM23JdkVersion}_${osName}-${arch}_bin"
}
}
val graalVM23JdkVersion: String by lazy {
libs.findVersion("graalVM23JdkVersion").get().requiredVersion
"graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin"
}
val downloadUrl: String by lazy {
if (isGraal22) {
"https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-" +
"${version}/$baseName.tar.gz"
} else {
val jdkMajor = graalVM23JdkVersion.takeWhile { it != '.' }
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.tar.gz"
}
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' }
val extension = if (os.isWindows) "zip" else "tar.gz"
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension"
}
val installDir: File by lazy {
@@ -85,7 +62,9 @@ open class BuildInfo(project: Project) {
}
}
val graalVm: GraalVm = GraalVm()
val graalVmAarch64: GraalVm = GraalVm("aarch64")
val graalVmAmd64: GraalVm = GraalVm("x64")
val isCiBuild: Boolean by lazy {
System.getenv("CI") != null
@@ -95,6 +74,11 @@ open class BuildInfo(project: Project) {
java.lang.Boolean.getBoolean("releaseBuild")
}
val hasMuslToolchain: Boolean by lazy {
// see "install musl" in .circleci/jobs/BuildNativeJob.pkl
File(System.getProperty("user.home"), "staticdeps/bin/x86_64-linux-musl-gcc").exists()
}
val os: org.gradle.internal.os.OperatingSystem by lazy {
org.gradle.internal.os.OperatingSystem.current()
}
@@ -103,9 +87,14 @@ open class BuildInfo(project: Project) {
val commitId: String by lazy {
// only run command once per build invocation
if (project === project.rootProject) {
Runtime.getRuntime()
.exec("git rev-parse --short HEAD", arrayOf(), project.rootDir)
.inputStream.reader().readText().trim()
val process = ProcessBuilder()
.command("git", "rev-parse", "--short", "HEAD")
.directory(project.rootDir)
.start()
process.waitFor().also { exitCode ->
if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())
}
process.inputStream.reader().readText().trim()
} else {
project.rootProject.extensions.getByType(BuildInfo::class.java).commitId
}

View File

@@ -1,11 +1,11 @@
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.listProperty
/**
* Builds a self-contained Pkl CLI Jar that is directly executable on *nix
@@ -15,27 +15,25 @@ import org.gradle.kotlin.dsl.listProperty
*
* https://skife.org/java/unix/2011/06/20/really_executable_jars.html
*/
open class ExecutableJar : DefaultTask() {
abstract class ExecutableJar : DefaultTask() {
@get:InputFile
val inJar: RegularFileProperty = project.objects.fileProperty()
abstract val inJar: RegularFileProperty
@get:OutputFile
val outJar: RegularFileProperty = project.objects.fileProperty()
abstract val outJar: RegularFileProperty
@get:Input
val jvmArgs: ListProperty<String> = project.objects.listProperty()
abstract val jvmArgs: ListProperty<String>
@TaskAction
fun buildJar() {
val inFile = inJar.get().asFile
val outFile = outJar.get().asFile
val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" }
val startScript = """
#!/bin/sh
exec java $escapedJvmArgs -jar $0 "$@"
""".trim().trimMargin() + "\n\n\n"
""".trimIndent() + "\n\n\n"
outFile.outputStream().use { outStream ->
startScript.byteInputStream().use { it.copyTo(outStream) }
inFile.inputStream().use { it.copyTo(outStream) }

View File

@@ -1,6 +1,6 @@
import java.net.URL
import org.gradle.util.GradleVersion
import groovy.json.JsonSlurper
import java.net.URI
@Suppress("unused")
class GradleVersionInfo(json: Map<String, Any>) {
@@ -50,18 +50,18 @@ class GradleVersionInfo(json: Map<String, Any>) {
private fun fetchSingle(url: String): GradleVersionInfo {
@Suppress("UNCHECKED_CAST")
return GradleVersionInfo(JsonSlurper().parse(URL(url)) as Map<String, Any>)
return GradleVersionInfo(JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>)
}
private fun fetchSingleOrNull(url: String): GradleVersionInfo? {
@Suppress("UNCHECKED_CAST")
val json = JsonSlurper().parse(URL(url)) as Map<String, Any>
val json = JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>
return if (json.isEmpty()) null else GradleVersionInfo(json)
}
private fun fetchMultiple(url: String): List<GradleVersionInfo> {
@Suppress("UNCHECKED_CAST")
return (JsonSlurper().parse(URL(url)) as List<Map<String, Any>>)
return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>)
.map { GradleVersionInfo(it) }
}
}

View File

@@ -24,13 +24,13 @@ configurations {
plugins.withType(JavaPlugin::class).configureEach {
val java = project.extensions.getByType<JavaPluginExtension>()
java.sourceCompatibility = JavaVersion.VERSION_11
java.targetCompatibility = JavaVersion.VERSION_11
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
jvmTarget = "17"
freeCompilerArgs = freeCompilerArgs + listOf("-Xjsr305=strict", "-Xjvm-default=all")
}
}
@@ -93,3 +93,28 @@ val updateDependencyLocks by tasks.registering {
}
val allDependencies by tasks.registering(DependencyReportTask::class)
tasks.withType(Test::class).configureEach {
System.getProperty("testReportsDir")?.let { reportsDir ->
reports.junitXml.outputLocation.set(file(reportsDir).resolve(project.name).resolve(name))
}
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
server = true
}
}
tasks.withType(JavaExec::class).configureEach {
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
server = true
}
}

View File

@@ -23,9 +23,7 @@ val firstPartySourcesJarsConfiguration: Configuration = configurations.create("f
val relocations = mapOf(
// pkl-core dependencies
"org.antlr.v4." to "org.pkl.thirdparty.antlr.v4.",
// https://github.com/oracle/graal/issues/1644 has been fixed,
// but native-image still fails when shading com.oracle.truffle
//"com.oracle.truffle" to "org.pkl.thirdparty.truffle",
"com.oracle.truffle" to "org.pkl.thirdparty.truffle",
"org.graalvm." to "org.pkl.thirdparty.graalvm.",
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
@@ -107,7 +105,7 @@ tasks.check {
}
val validateFatJar by tasks.registering {
val outputFile = file("$buildDir/validateFatJar/result.txt")
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
inputs.files(tasks.shadowJar)
inputs.property("nonRelocations", nonRelocations)
outputs.file(outputFile)
@@ -127,9 +125,9 @@ val validateFatJar by tasks.registering {
}
}
if (unshadowedFiles.isEmpty()) {
outputFile.writeText("SUCCESS")
outputFile.get().asFile.writeText("SUCCESS")
} else {
outputFile.writeText("FAILURE")
outputFile.get().asFile.writeText("FAILURE")
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
}
}
@@ -140,7 +138,7 @@ tasks.check {
val resolveSourcesJars by tasks.registering(ResolveSourcesJars::class) {
configuration.set(configurations.runtimeClasspath)
outputDir.set(project.file("$buildDir/resolveSourcesJars"))
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
}
val fatSourcesJar by tasks.registering(MergeSourcesJars::class) {

View File

@@ -2,6 +2,7 @@ import java.nio.file.*
import java.util.UUID
import de.undercouch.gradle.tasks.download.Download
import de.undercouch.gradle.tasks.download.Verify
import kotlin.io.path.createDirectories
plugins {
id("de.undercouch.download")
@@ -9,70 +10,98 @@ plugins {
val buildInfo = project.extensions.getByType<BuildInfo>()
val homeDir = buildInfo.graalVm.homeDir
val baseName = buildInfo.graalVm.baseName
val installDir = buildInfo.graalVm.installDir
val downloadUrl = buildInfo.graalVm.downloadUrl
val downloadFile = file(homeDir).resolve("$baseName.tar.gz")
val BuildInfo.GraalVm.downloadFile get(): File {
val extension = if (buildInfo.os.isWindows) "zip" else "tar.gz"
return file(homeDir).resolve("${baseName}.$extension")
}
// tries to minimize chance of corruption by download-to-temp-file-and-move
val downloadGraalVm by tasks.registering(Download::class) {
val downloadGraalVmAarch64 by tasks.registering(Download::class) {
configureDownloadGraalVm(buildInfo.graalVmAarch64)
}
val downloadGraalVmAmd64 by tasks.registering(Download::class) {
configureDownloadGraalVm(buildInfo.graalVmAmd64)
}
fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
onlyIf {
!installDir.exists()
!graalvm.installDir.exists()
}
doLast {
println("Downloaded GraalVm to ${graalvm.downloadFile}")
}
src(downloadUrl)
dest(downloadFile)
src(graalvm.downloadUrl)
dest(graalvm.downloadFile)
overwrite(false)
tempAndMove(true)
}
val verifyGraalVm by tasks.registering(Verify::class) {
val verifyGraalVmAarch64 by tasks.registering(Verify::class) {
configureVerifyGraalVm(buildInfo.graalVmAarch64)
dependsOn(downloadGraalVmAarch64)
}
val verifyGraalVmAmd64 by tasks.registering(Verify::class) {
configureVerifyGraalVm(buildInfo.graalVmAmd64)
dependsOn(downloadGraalVmAmd64)
}
fun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {
onlyIf {
!installDir.exists()
!graalvm.installDir.exists()
}
dependsOn(downloadGraalVm)
src(downloadFile)
checksum(buildInfo.libs.findVersion("graalVmSha256-${buildInfo.graalVm.osName}-${buildInfo.graalVm.arch}").get().toString())
src(graalvm.downloadFile)
checksum(buildInfo.libs.findVersion("graalVmSha256-${graalvm.osName}-${graalvm.arch}").get().toString())
algorithm("SHA-256")
}
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
val installGraalVm by tasks.registering {
dependsOn(verifyGraalVm)
val installGraalVmAarch64 by tasks.registering {
dependsOn(verifyGraalVmAarch64)
configureInstallGraalVm(buildInfo.graalVmAarch64)
}
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
val installGraalVmAmd64 by tasks.registering {
dependsOn(verifyGraalVmAmd64)
configureInstallGraalVm(buildInfo.graalVmAmd64)
}
fun Task.configureInstallGraalVm(graalVm: BuildInfo.GraalVm) {
onlyIf {
!installDir.exists()
!graalVm.installDir.exists()
}
doLast {
val distroDir = "$homeDir/${UUID.randomUUID()}"
val distroDir = Paths.get(graalVm.homeDir, UUID.randomUUID().toString())
try {
mkdir(distroDir)
println("Extracting $downloadFile into $distroDir")
distroDir.createDirectories()
println("Extracting ${graalVm.downloadFile} into $distroDir")
// faster and more reliable than Gradle's `copy { from tarTree() }`
exec {
workingDir = file(distroDir)
executable = "tar"
args("--strip-components=1", "-xzf", downloadFile)
args("--strip-components=1", "-xzf", graalVm.downloadFile)
}
val distroBinDir = if (buildInfo.os.isMacOsX) "$distroDir/Contents/Home/bin" else "$distroDir/bin"
val distroBinDir = if (buildInfo.os.isMacOsX) distroDir.resolve("Contents/Home/bin") else distroDir.resolve("bin")
println("Installing native-image into $distroDir")
exec {
executable = "$distroBinDir/gu"
val executableName = if (buildInfo.os.isWindows) "gu.cmd" else "gu"
executable = distroBinDir.resolve(executableName).toString()
args("install", "--no-progress", "native-image")
}
println("Creating symlink $installDir for $distroDir")
val tempLink = Paths.get("$homeDir/${UUID.randomUUID()}")
Files.createSymbolicLink(tempLink, Paths.get(distroDir))
println("Creating symlink ${graalVm.installDir} for $distroDir")
val tempLink = Paths.get(graalVm.homeDir, UUID.randomUUID().toString())
Files.createSymbolicLink(tempLink, distroDir)
try {
Files.move(tempLink, installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
Files.move(tempLink, graalVm.installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
} catch (e: Exception) {
try { delete(tempLink.toFile()) } catch (ignored: Exception) {}
throw e

View File

@@ -33,7 +33,7 @@ dependencies {
}
val validateHtml by tasks.registering(JavaExec::class) {
val resultFile = file("$buildDir/validateHtml/result.txt")
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
inputs.files(htmlValidator.sources)
outputs.file(resultFile)
@@ -50,7 +50,7 @@ val validateHtml by tasks.registering(JavaExec::class) {
// 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 not strictly necessary
doFirst { project.delete(resultFile) }
doLast { resultFile.writeText("Success.") }
doLast { resultFile.get().asFile.writeText("Success.") }
}
tasks.check {

View File

@@ -1,5 +1,7 @@
@file:Suppress("HttpUrlsUsage")
import org.gradle.accessors.dm.LibrariesForLibs
plugins {
`java-library`
id("pklKotlinTest")
@@ -9,6 +11,9 @@ plugins {
// make sources Jar available to other subprojects
val sourcesJarConfiguration = configurations.register("sourcesJar")
// Version Catalog library symbols.
val libs = the<LibrariesForLibs>()
java {
withSourcesJar() // creates `sourcesJar` task
withJavadocJar()
@@ -21,7 +26,7 @@ artifacts {
spotless {
java {
googleJavaFormat("1.15.0")
googleJavaFormat(libs.versions.googleJavaFormat.get())
targetExclude("**/generated/**", "**/build/**")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
}
@@ -50,10 +55,13 @@ val workAroundKotlinGradlePluginBug by tasks.registering {
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type 'JavaCompile').
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
// specified for property 'compileKotlinOutputClasses' does not exist.
file("$buildDir/classes/kotlin/main").mkdirs()
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.mkdirs()
}
}
tasks.compileJava {
dependsOn(workAroundKotlinGradlePluginBug)
// TODO: determine correct limits for Truffle specializations
// (see https://graalvm.slack.com/archives/CNQSB2DHD/p1712380902746829)
options.compilerArgs.add("-Atruffle.dsl.SuppressWarnings=truffle-limit")
}

View File

@@ -1,3 +1,5 @@
import org.gradle.accessors.dm.LibrariesForLibs
plugins {
id("pklJavaLibrary")
@@ -6,6 +8,9 @@ plugins {
val buildInfo = project.extensions.getByType<BuildInfo>()
// Version Catalog library symbols.
val libs = the<LibrariesForLibs>()
dependencies {
// At least some of our kotlin APIs contain Kotlin stdlib types
// that aren't compiled away by kotlinc (e.g., `kotlin.Function`).
@@ -21,7 +26,7 @@ tasks.compileKotlin {
spotless {
kotlin {
ktfmt("0.44").googleStyle()
ktfmt(libs.versions.ktfmt.get()).googleStyle()
targetExclude("**/generated/**", "**/build/**")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
}

View File

@@ -1,6 +1,10 @@
val assembleNative by tasks.registering {}
val checkNative by tasks.registering {}
val testNative by tasks.registering {}
val checkNative by tasks.registering {
dependsOn(testNative)
}
val buildNative by tasks.registering {
dependsOn(assembleNative, checkNative)

View File

@@ -50,15 +50,18 @@ publishing {
}
val validatePom by tasks.registering {
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
return@registering
}
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
val outputFile = file("$buildDir/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)
inputs.file(generatePomFileForLibraryPublication.get().destination)
outputs.file(outputFile)
doLast {
outputFile.delete()
outputFile.get().asFile.delete()
val pomFile = generatePomFileForLibraryPublication.get().destination
assert(pomFile.exists())
@@ -92,7 +95,7 @@ val validatePom by tasks.registering {
}
}
outputFile.writeText("OK")
outputFile.get().asFile.writeText("OK")
}
}
@@ -100,6 +103,14 @@ tasks.publish {
dependsOn(validatePom)
}
// Workaround for maven publish plugin not setting up dependencies correctly.
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
val dependsOnTasks = mutableListOf<String>()
tasks.withType<AbstractPublishToMaven>().configureEach {
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
dependsOn(dependsOnTasks)
}
signing {
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
// in CI.

View File

@@ -1,6 +1,6 @@
name: main
title: Main Project
version: 0.25.0
version: 0.26.2
prerelease: false
nav:
- nav.adoc

View File

@@ -10,20 +10,21 @@ sourceSets {
java {
srcDir(file("modules/pkl-core/examples"))
srcDir(file("modules/pkl-config-java/examples"))
srcDir(file("modules/java-binding/examples"))
}
val kotlin = project.extensions
.getByType<KotlinJvmProjectExtension>()
.sourceSets[name]
.kotlin
kotlin.srcDir(file("modules/pkl-config-kotlin/examples"))
kotlin.srcDir(file("modules/kotlin-binding/examples"))
}
}
dependencies {
testImplementation(project(":pkl-core"))
testImplementation(project(":pkl-config-java"))
testImplementation(project(":pkl-config-kotlin"))
testImplementation(project(":pkl-commons-test"))
testImplementation(projects.pklCore)
testImplementation(projects.pklConfigJava)
testImplementation(projects.pklConfigKotlin)
testImplementation(projects.pklCommonsTest)
testImplementation(libs.junitEngine)
testImplementation(libs.antlrRuntime)
}
@@ -31,5 +32,5 @@ dependencies {
tasks.test {
inputs.files(fileTree("modules").matching {
include("**/pages/*.adoc")
})
}).withPropertyName("asciiDocFiles").withPathSensitivity(PathSensitivity.RELATIVE)
}

View File

@@ -2,13 +2,13 @@
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.14=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.15=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.sdk:graal-sdk:22.3.1=testRuntimeClasspath
org.graalvm.truffle:truffle-api:22.3.1=testRuntimeClasspath
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.sdk:graal-sdk:23.0.2=testRuntimeClasspath
org.graalvm.truffle:truffle-api:23.0.2=testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -24,13 +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:1.7.10=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.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
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

View File

@@ -1,7 +1,10 @@
= User Manual
include::../partials/component-attributes.adoc[]
Quick Links: xref:pkl-cli:index.adoc#installation[Installation] | xref:language-reference:index.adoc[Language Reference]
Quick Links:
xref:pkl-cli:index.adoc#installation[Installation]
| xref:language-reference:index.adoc[Language Reference]
| https://pkl-lang.org/package-docs/pkl/current/index.html[Standard Library]
Pkl -- pronounced _Pickle_ -- is an embeddable configuration language which provides rich support for data templating and validation.
It can be used from the command line, integrated in a build pipeline, or embedded in a program.

View File

@@ -4,3 +4,6 @@
* xref:kotlin-binding:index.adoc[Kotlin]
* xref:swift:ROOT:index.adoc[Swift]
* xref:go:ROOT:index.adoc[Go]
* xref:bindings-specification:index.adoc[Specification]
** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]

View File

@@ -3,7 +3,7 @@
// 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-no-suffix: 0.25.0
:pkl-version-no-suffix: 0.26.2
// tells whether pkl version corresponding to current git commit
// is a release version (:is-release-version: '') or dev version (:!is-release-version:)
:is-release-version: ''
@@ -21,9 +21,14 @@ ifdef::is-release-version[]
:pkl-artifact-version: {pkl-version}
endif::[]
:uri-maven-docsite: https://central.sonatype.com/
:uri-maven-docsite: https://central.sonatype.com
:uri-sonatype: https://s01.oss.sonatype.org/service/local/repositories/snapshots/content/
:uri-sonatype: https://s01.oss.sonatype.org/content/groups/public
:uri-maven-repo: https://s01.oss.sonatype.org/content/groups/public
ifdef::is-release-version[]
:uri-maven-repo: https://repo1.maven.org/maven2
endif::[]
:symbolic-version-name: latest
ifdef::is-release-version[]
@@ -34,10 +39,9 @@ endif::[]
:uri-pkl-stdlib-docs: {uri-pkl-stdlib-docs-base}/{pkl-version}
:uri-pkl-stdlib-docs-index: {uri-pkl-stdlib-docs}/
// TODO(oss): check these links when we have tags
:github-branch: main
ifdef::is-release-version[]
:github-branch: v{pkl-version-no-suffix}
:github-branch: {pkl-version-no-suffix}
endif::[]
:uri-github-tree: https://github.com/apple/pkl/tree/{github-branch}
:uri-pkl-stdlib-sources: {uri-github-tree}/stdlib
@@ -62,3 +66,76 @@ endif::[]
:uri-config-java-example: {uri-pkl-examples-tree}/config-java
:uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin
:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
:uri-stdlib-String: {uri-stdlib-baseModule}/String
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN
:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity
:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween
:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite
:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8
:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16
:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32
:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8
:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16
:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32
:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt
:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri
:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()
:uri-stdlib-Null: {uri-stdlib-baseModule}/Null
:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()
:uri-stdlib-List: {uri-stdlib-baseModule}/List
:uri-stdlib-Set: {uri-stdlib-baseModule}/Set
:uri-stdlib-Map: {uri-stdlib-baseModule}/Map
:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing
:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default
:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct
:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()
:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping
:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default
:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration
:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value
:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit
:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit
:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize
:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value
:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit
:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit
:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic
:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()
:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed
:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex
:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()
:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match
:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch
:uri-stdlib-Pair: {uri-stdlib-baseModule}/Pair
:uri-stdlib-IntSeq: {uri-stdlib-baseModule}/IntSeq
:uri-stdlib-Class: {uri-stdlib-baseModule}/Class
:uri-stdlib-TypeAlias: {uri-stdlib-baseModule}/TypeAlias
:uri-stdlib-Deprecated: {uri-stdlib-baseModule}/Deprecated
:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer
:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters
:uri-stdlib-Function: {uri-stdlib-baseModule}/Function
:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0
:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1
:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()
:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2
:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3
:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4
:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5
:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource
:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files
:uri-messagepack: https://msgpack.org/index.html
:uri-messagepack-spec: https://github.com/msgpack/msgpack/blob/master/spec.md

View File

@@ -0,0 +1,197 @@
= Pkl Binary Encoding
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
Pkl values can be encoded into a binary format.
This format is used for Pkl's non-JVM language bindings, for example, for its Go and Swift bindings.
The binary format is uses link:{uri-messagepack}[MessagePack] encoding.
== Primitives
All Pkl primitives turn into their respective MessagePack primitive.
|===
|Pkl Type|MessagePack format
|link:{uri-stdlib-Int}[Int]
|link:{uri-messagepack-int}[int]
|link:{uri-stdlib-Float}[Float]
|link:{uri-messagepack-float}[float]
|link:{uri-stdlib-String}[String]
|link:{uri-messagepack-str}[string]
|link:{uri-stdlib-Boolean}[Boolean]
|link:{uri-messagepack-bool}[bool]
|link:{uri-stdlib-Null}[Null]
|link:{uri-messagepack-nil}[nil]
|===
NOTE: Pkl integers are encoded into the smallest int type that the number will fit into.
For example, value `8` gets encoded as MessagePack `int8` format.
== Non-primitives
All non-primitive values are encoded as MessagePack arrays.
The first slot of the array designates the value's type. The remaining slots have fixed meanings depending on the type.
The array's length is the number of slots that are filled. For example, xref:{uri-stdlib-List}[List] is encoded as an MessagePack array with two elements.
|===
|Pkl type |Slot 1 2+|Slot 2 2+|Slot 3 2+|Slot 4
||code |type |description |type |description |type |description
|link:{uri-stdlib-Typed}[Typed], link:{uri-stdlib-Dynamic}[Dynamic]
|`0x1`
|link:{uri-messagepack-str}[str]
|Fully qualified class name
|link:{uri-messagepack-str}[str]
|Enclosing module URI
|link:{uri-messagepack-array}[array]
|Array of <<object-members,object members>>
|link:{uri-stdlib-Map}[Map]
|`0x2`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-Mapping}[Mapping]
|`0x3`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-List}[List]
|`0x4`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Listing}[Listing]
|`0x5`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Set}[Set]
|`0x6`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Duration}[Duration]
|`0x7`
|{uri-messagepack-float}[float64]
|Duration value
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DurationUnit}[Duration unit] (`"ns"`, `"ms"`, etc.)
|
|
|link:{uri-stdlib-DataSize}[DataSize]
|`0x8`
|link:{uri-messagepack-float}[float64]
|Value (float64)
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DataSizeUnit}[DataSize unit] (`"b"`, `"kb"`, etc.)
|
|
|link:{uri-stdlib-Pair}[Pair]
|`0x9`
|`<value>`
|First value
|`<value>`
|Second value
|
|
|link:{uri-stdlib-IntSeq}[IntSeq]
|`0xA`
|link:{uri-messagepack-int}[int]
|Start
|link:{uri-messagepack-int}[int]
|End
|link:{uri-messagepack-int}[int]
|Step
|link:{uri-stdlib-Regex}[Regex]
|`0xB`
|link:{uri-messagepack-str}[str]
|Regex string representation
|
|
|
|
|link:{uri-stdlib-Class}[Class]
|`0xC`
|
|
|
|
|
|
|link:{uri-stdlib-TypeAlias}[TypeAlias]
|`0xD`
|
|
|
|
|
|
|===
[[object-members]]
== Object Members
Like non-primitive values, object members are encoded as MessagePack arrays, where the first slot designates the value's type.
|===
|Member type |Slot 1 2+|Slot 2 2+|Slot 3
| |code |type |description |type |description
|Property
|`0x10`
|link:{uri-messagepack-str}[str]
|key
|`<value>`
|property value
|Entry
|`0x11`
|`<value>`
|entry key
|`<value>`
|entry value
|Element
|`0x12`
|link:{uri-messagepack-int}[int]
|index
|`<value>`
|element value
|===

View File

@@ -0,0 +1,173 @@
= Language Binding Specification
:uri-pkl-go-github: https://github.com/apple/pkl-go
:uri-pkl-swift-github: https://github.com/apple/pkl-swift
Pkl can be embedded within any host application.
The host application has access to low level controls.
It is able to manage the lifecycle of evaluators, as well as provide custom modules and resources to Pkl.
Currently, Pkl must be embedded as a child process, by shelling out to the CLI using the xref:pkl-cli:index.adoc#command-server[`pkl server`] command. In the future, a C library will also be provided.
When embedded, communication between a host application and Pkl happens via message passing.
The message passing specification can be found in xref:message-passing-api.adoc[].
For examples of language bindings in practice, review the link:{uri-pkl-go-github}[pkl-go], or the link:{uri-pkl-swift-github}[pkl-swift] codebases.
NOTE: Pkl's Java and Kotlin libraries binds to Pkl directly, and do not use message passing.
== Features of a language binding
A language binding for Pkl should generally have the following components:
. A client that spawns `pkl server`, and talks to it using message passing.
. A deserializer that turns xref:binary-encoding.adoc[pkl binary encoding] into a structure in the host language.
. A code generator that transforms Pkl schemas into schemas written in the host language.
The code generator is mostly written in Pkl, with a lightweight executable that acts as the glue layer.
For examples of code generators, consult link:{uri-pkl-go-github}/tree/main/codegen[pkl-go] and link:{uri-pkl-swift-github}/tree/main/codegen[pkl-swift].
== Sample flow
Here is a sample flow for evaluating a module with the following contents:
.\file:///path/to/myModule.pkl
[source,{pkl}]
----
module MyModule
theModules = import*("customfs:/*.pkl")
----
. Client sends xref:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request], including `customfs` as a custom module reader.
+
[source,json]
----
[
0x20,
{
"requestId": 135,
"allowedModules": ["pkl:", "repl:", "file:", "customfs:"],
"clientModuleReaders": [
{
"scheme": "customfs",
"hasHierarchicalUris": true,
"isGlobbable": true,
"isLocal": true
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#create-evaluator-response[Create Evaluator Response], with an evaluator id.
+
[source,json]
----
[
0x21,
{
"requestId": 135,
"evaluatorId": -135901
}
]
----
. Client sends xref:message-passing-api.adoc#evaluate-request[Evaluate Request], providing the module's URI.
+
[source,json]
----
[
0x23,
{
"requestId": 9805131,
"evaluatorId": -13901,
"moduleUri": "file:///path/to/myModule.pkl"
}
]
----
. During evaluation, server evaluates `import*("customfs:/*.pkl")`, and sends xref:message-passing-api.adoc#list-modules-request[List Modules Request].
+
[source,json]
----
[
0x2c,
{
"requestId": -6478924,
"evaluatorId": -13901,
"uri": "customfs:/"
}
]
----
. Client responds with xref:message-passing-api.adoc#list-modules-response[List Modules Response].
In our pretend scenario, there is only one file; `foo.pkl`.
+
[source,json]
----
[
0x2d,
{
"requestId": -6478924,
"evaluatorId": -13901,
"pathElements": [
{
"name": "foo.pkl",
"isDirectory": false
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#read-module-request[Read Module Request] to read `foo.pkl`.
+
[source,json]
----
[
0x28,
{
"requestId": 36408291,
"evaluatorId": -13901,
"uri": "customfs:/foo.pkl"
}
]
----
. Client responds with the module's contents
+
[source,json]
----
[
0x29,
{
"requestId": 36408291,
"evaluatorId": -13901,
"contents": "foo = 1"
}
]
----
. Server finishes evaluation, and responds with the xref:message-passing-api.adoc#evaluate-response[Evaluate Response].
+
[source,json]
----
[
0x24,
{
"requestId": 9805131,
"evaluatorId": -13901,
"result": <pkl binary value>
}
]
----
. Client sends xref:message-passing-api.adoc#close-evaluator[Close Evaluator].
+
[source,json]
----
[
0x22,
{
"evaluatorId": -13901
}
]
----
== Debug logs
Set the env var `PKL_DEBUG=1` to enable more verbose logging from Pkl.
It is recommended that clients also use this environment variable to enable debug logs of their own.

View File

@@ -0,0 +1,595 @@
= Message Passing API
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
All messages are encoded in link:{uri-messagepack}[MessagePack], as an array with two elements.
The first element of the array is a code that designates the message's type, encoded as an int.
The second element of the array is the message body, encoded as a map.
Messages are passed between the _client_ and the _server_.
The _client_ is the host language (for example, the Swift application when using pkl-swift).
The _server_ is the entity that provides controls for interacting with Pkl.
For example, in JSON representation:
[source,json]
----
[
1, // <1>
{ "someKey": "someValue" } // <2>
]
----
<1> Code indicating message type
<2> Message body
== Message types
[[client-message]]
=== Client Message
A message passed from the client to the server.
[[server-message]]
=== Server Message
A message passed from the server to the client.
[[request-message]]
=== Request Message
A message sent with a `requestId` value.
The `requestId` should be a unique number at the time of message send.
The other side is expected to respond with a <<response-message>> with the same `requestId`.
[[response-message]]
=== Response Message
A message that is the response to a <<request-message>>.
It contains the same `requestId` of the request message.
[[one-way-message]]
=== One Way Message
A fire-and-forget message where no response is expected.
== Messages
All messages have their schema described in Pkl.
A nullable type means that the property should be omitted (as opposed to the property's value being `nil`).
[[create-evaluator-request]]
=== Create Evaluator Request
Code: `0x20` +
Type: <<client-message,Client>> <<request-message,Request>>
Create an evaluator with the provided evaluator settings.
Upon creating the evaluator, the server sends back a <<create-evaluator-response>> message.
Schema:
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// Regex patterns to determine which modules are allowed for import.
///
/// API version of the CLI's `--allowed-modules` flag
allowedModules: Listing<String>?
/// Regex patterns to dettermine which resources are allowed to be read.
///
/// API version of the CLI's `--allowed-resources` flag
allowedResources: Listing<String>?
/// Register client-side module readers.
clientModuleReaders: Listing<ClientModuleReader>?
/// Register client-side resource readers.
clientResourceReaders: Listing<ClientResourceReader>?
/// Directories, ZIP archives, or JAR archives
/// to search when resolving `modulepath:` URIs.
///
/// API version of the CLI's `--module-path` flag.
modulePaths: Listing<String>?
/// Environment variable to set.
///
/// API version of the CLI's `--env-var` flag.
env: Mapping<String, String>?
/// External properties to set.
///
/// API version of the CLI's `--properties` flag.
properties: Mapping<String, String>?
/// Duration, in seconds, after which evaluation of a source module will be timed out.
///
/// API version of the CLI's `--timeout` flag.
timeoutSeconds: Int?
/// Restricts access to file-based modules and resources to those located under the root directory.
rootDir: String?
/// The cache directory for storing packages.
cacheDir: String?
/// The format to generate.
///
/// This sets the `pkl.outputFormat` external property.
outputFormat: String?
/// The project dependency settings.
project: Project?
/// Configuration of outgoing HTTP(s) requests.
///
/// Added in Pkl 0.26.0.
http: Http?
class ClientResourceReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of ths URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
}
class ClientModuleReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of ths URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
/// Tells whether the module is local to the system.
///
/// A local resource that [hasHierarchicalUris] supports triple-dot imports.
isLocal: Boolean
}
class Project {
type: "local"
/// The canonical URI of this project's package
packageUri: String?
/// The URI pointing to the location of the project file.
projectFileUri: String
/// The dependencies of this project.
dependencies: Mapping<String, Project|RemoteDependency>
}
class RemoteDependency {
type: "remote"
/// The canonical URI of this dependency
packageUri: String?
/// The checksums of this remote dependency
checksums: Checksums?
}
class Checksums {
/// The sha-256 checksum of this dependency's metadata.
sha256: String
}
class Http {
/// PEM format certificates to trust when making HTTP requests.
///
/// If [null], Pkl will trust its own built-in certificates.
caCertificates: Binary?
/// Configuration of the HTTP proxy to use.
///
/// If [null], uses the operating system's proxy configuration.
proxy: Proxy?
}
/// Settings that control how Pkl talks to HTTP proxies.
class Proxy {
/// The proxy to use for HTTP(S) connections.
///
/// At the moment, only HTTP proxies are supported.
///
/// Example:
/// ```
/// address = "http://my.proxy.example.com:5080"
/// ```
address: Uri(startsWith("http://"))?
/// Hosts to which all connections should bypass a proxy.
///
/// Values can be either hostnames, or IP addresses.
/// IP addresses can optionally be provided using [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation).
///
/// The only wildcard is `"*"`, which disables all proxying.
///
/// A hostname matches all subdomains.
/// For example, `example.com` matches `foo.example.com`, but not `fooexample.com`.
/// A hostname that is prefixed with a dot matches the hostname itself,
/// so `.example.com` matches `example.com`.
///
/// Optionally, a port can be specified.
/// If a port is omitted, all ports are matched.
///
/// Example:
///
/// ```
/// noProxy {
/// "127.0.0.1"
/// "169.254.0.0/16"
/// "example.com"
/// "localhost:5050"
/// }
/// ```
noProxy: Listing<String>(isDistinct)
}
typealias Binary = Any // <1>
----
<1> link:{uri-messagepack-bin}[bin format] (not expressable in Pkl)
Example:
[source,json5]
----
[
0x20,
{
"requestId": 193501,
"allowedModules": ["pkl:", "repl:"],
"allowedResources": ["file:", "package:", "projectpackage:"]
}
]
----
[[create-evaluator-response]]
=== Create Evaluator Response
Code: `0x21` +
Type: <<server-message,Server>> <<response-message,Response>>
The response for a <<create-evaluator-request>>.
If the evaluator was created successfully, `evaluatorId` is set. Otherwise, `error` is set to the resulting error.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying the created evaluator.
evaluatorId: Int?
/// A message detailing why the evaluator was not created.
error: String?
----
[[close-evaluator]]
=== Close Evaluator
Code: `0x22` +
Type: <<client-message,Client>> <<one-way-message,One Way>>
Tells the Pkl server to close an evaluator, releasing any resources it may be holding.
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
----
[[evaluate-request]]
=== Evaluate Request
Code: `0x23` +
Type: <<client-message,Client>> <<request-message,Request>>
Evaluate a module.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The absolute URI of the module to be evaluated.
moduleUri: String
/// The module's contents.
///
/// If [null], Pkl will load the module at runtime.
moduleText: String?
/// The Pkl expression to be evaluated within the module.
///
/// If [null], evaluates the whole module.
expr: String?
----
[[evaluate-response]]
=== Evaluate Response
Code: `0x24` +
Type: <<server-message,Server>> <<response-message,Response>>
The server's response to <<evaluate-request>>.
If the evaluation is successful, the response is the Pkl value encoded in xref:binary-encoding.adoc[binary encoding].
[source,pkl]
----
/// The requestId of the Evaluate request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The evaluation contents, if successful.
result: Binary? // <1>
/// A message detailing why evaluation failed.
error: String?
typealias Binary = Any // <1>
----
<1> xref:binary-encoding.adoc[Pkl Binary Encoding] in link:{uri-messagepack-bin}[bin format] (not expressable in Pkl)
[[log]]
=== Log
Code: `0x25` +
Type: <<server-message,Server>> <<one-way-message,One Way>>
Tells the client to emit a log message, during the execution of a Pkl program.
A log can occur through a xref:language-reference:index.adoc#debugging[trace()] expression, or through a warning (for example, when encountering a link:{uri-stdlib-Deprecated}[Deprecated] value.)
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
/// A number identifying the log level.
///
/// - 0: trace
/// - 1: warn
level: Int(this == 0 || this == 1)
/// The message to be logged
message: String
/// A string representing the source location within Pkl code producing this log output.
frameUri: String
----
[[read-resource-request]]
=== Read Resource Request
Code: `0x26` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a resource at the given URI.
This message occurs when a read expression (`read`/`read?`/`read*`) is encountered within a program, and its scheme matches a client resource reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the resource.
uri: String
----
[[read-resource-response]]
=== Read Resource Response
Code: `0x27` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-resource-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The contents of the resource.
contents: Binary? // <1>
/// The description of the error that occured when reading this resource.
error: String?
typealias Binary = Any // <1>
----
<1> MessagePack's link:https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family[bin format family] (not expressable in Pkl)
[[read-module-request]]
=== Read Module Request
Code: `0x28` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a module at the given URI.
This message occurs during the evaluation of an import statement or expression (`import`/`import*`), when a scheme matches a client module reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the module.
uri: String
----
[[read-module-response]]
=== Read Module Response
Code: `0x29` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-module-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The string contents of the module.
contents: String?
/// The description of the error that occured when reading this resource.
error: String?
----
[[list-resources-request]]
=== List Resources Request
Code: `0x2a` +
Type: <<server-message,Server>> <<request-message,Request>>
List resources at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-reads[globbed read], when a scheme matches a client resource reader's scheme.
If the resource reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all resource elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list resources.
uri: String
----
[[list-resources-response]]
=== List Resources Response
Code: `0x2b` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-resources-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
If neither are set, `pathElements` default to an empty list.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occured when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----
[[list-modules-request]]
=== List Modules Request
Code: `0x2c` +
Type: <<server-message,Server>> <<request-message,Request>>
List modules at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-imports[globbed import], when a scheme matches a client resource reader's scheme.
If the module reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all module elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list modules.
uri: String
----
[[list-modules-response]]
=== List Modules Response
Code: `0x2d` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-modules-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
If neither are set, `pathElements` default to an empty list.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occured when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----

View File

@@ -0,0 +1,9 @@
:uri-github-binary-encoding-snippet-tests: {uri-github-tree}/pkl-server/src/test/files/SnippetTests
:uri-messagepack-bool: {uri-messagepack-spec}#bool-format-family
:uri-messagepack-int: {uri-messagepack-spec}#int-format-family
:uri-messagepack-float: {uri-messagepack-spec}#float-format-family
:uri-messagepack-str: {uri-messagepack-spec}#str-format-family
:uri-messagepack-bin: {uri-messagepack-spec}#bin-format-family
:uri-messagepack-array: {uri-messagepack-spec}#array-format-family
:uri-messagepack-map: {uri-messagepack-spec}#map-format-family
:uri-messagepack-nil: {uri-messagepack-spec}#nil-format

View File

@@ -13,14 +13,14 @@ Also, Pkl's strong and weak points in comparison to other configuration language
[[static-config-formats]]
== Pkl vs. Static Config Formats
Static configuration formats such as JSON, YAML, and XML work reasonably well for simple configuration needs.
Static configuration formats such as JSON, YAML, TOML, and XML work reasonably well for simple configuration needs.
However, they do have some shortcomings, including:
. They are not very human-friendly to read and write. (JSON, XML)
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML)
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, XML)
. They do not offer standardized or widely available schema validators. (JSON, YAML)
. They offer little or no schema-aware tooling. (JSON, YAML)
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML, TOML)
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, TOML, XML)
. They do not offer standardized or widely available schema validators. (JSON, YAML, TOML)
. They offer little or no schema-aware tooling. (JSON, YAML, TOML)
Pkl addresses these shortcomings as follows:

View File

@@ -22,7 +22,7 @@ At the same time, anyone configuring your application -- whether that's your use
+
At the time of writing, Pkl offers configuration libraries for the JVM runtime, Swift, and also for Golang.
+
We maintian the following libraries:
We maintain the following libraries:
+
* xref:java-binding:pkl-config-java.adoc[pkl-config-java] for Java compatible languages
* xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin] for the {uri-kotlin-homepage}[Kotlin] language.

View File

@@ -1,6 +1,7 @@
import org.pkl.config.java.Config;
import org.pkl.config.java.ConfigEvaluator;
import org.pkl.config.java.JavaType;
import org.pkl.core.ModuleSource;
import org.junit.jupiter.api.Test;
@SuppressWarnings("unused")
@@ -11,8 +12,8 @@ public class JavaConfigExample {
// tag::usage[]
Config config;
try (var evaluator = ConfigEvaluator.preconfigured()) { // <1>
config = evaluator.evaluateText(
"pigeon { age = 5; diet = \"Seeds\" }"); // <2>
config = evaluator.evaluate(
ModuleSource.text("pigeon { age = 5; diet = new Listing { \"Seeds\" } }")); // <2>
}
var pigeon = config.get("pigeon"); // <3>
var age = pigeon.get("age").as(int.class); // <4>

View File

@@ -24,7 +24,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
=== Java Library
The `pkl-codegen-java` library is available {uri-pkl-codgen-java-maven-module}[from Maven Central].
It requires Java 11 or higher.
It requires Java 17 or higher.
ifndef::is-release-version[]
NOTE: Snapshots are published to repository `{uri-sonatype}`.
@@ -36,36 +36,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}"
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
====
@@ -82,7 +88,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-codegen-java</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
@@ -158,13 +164,6 @@ This annotation is required to have `java.lang.annotation.ElementType.TYPE_USE`
or it may generate code that does not compile.
====
.--implement-serializable
[%collapsible]
====
Default: (flag not set) +
Whether to make generated classes implement `java.io.Serializable`.
====
Common code generator options:
include::{partialsdir}/cli-codegen-options.adoc[]

View File

@@ -1,6 +1,6 @@
= pkl-config-java Library
include::ROOT:partial$component-attributes.adoc[]
:uri-pkl-core-EvalException: {uri-pkl-core-main-sources}/EvalException.java
:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java
:uri-pkl-config-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-java-all
:uri-pkl-config-java-main-sources: {uri-github-tree}/pkl-config-java/src/main/java/org/pkl/config/java
@@ -15,8 +15,7 @@ include::ROOT:partial$component-attributes.adoc[]
:uri-pkl-config-java-ConverterFactories: {uri-pkl-config-java-main-sources}/mapper/ConverterFactories.java
:uri-pkl-config-java-Converter: {uri-pkl-config-java-main-sources}/mapper/Converter.java
:uri-pkl-config-java-ConverterFactory: {uri-pkl-config-java-main-sources}/mapper/ConverterFactory.java
:uri-pkl-config-java-PObjectToObjectByCtorTestJava: {uri-pkl-config-java-test-sources}/mapper/PObjectToObjectByCtorTest.java
:uri-pkl-config-java-PObjectToObjectByCtorTestPkl: {uri-pkl-config-java-test-resources}/mapper/PObjectToObjectByCtorTest.pkl
:uri-pkl-config-java-PObjectToDataObjectTestJava: {uri-pkl-config-java-test-sources}/mapper/PObjectToDataObjectTest.java
The _pkl-config-java_ library builds upon xref:pkl-core:index.adoc[pkl-core].
It offers a higher-level API specifically designed for consuming application runtime configuration.
@@ -24,7 +23,7 @@ It offers a higher-level API specifically designed for consuming application run
== Installation
The _pkl-config-java_ library is available {uri-pkl-config-java-maven-module}[from Maven Central].
It requires Java 11 or higher.
It requires Java 17 or higher.
=== Gradle
@@ -32,34 +31,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
}
ifdef::is-release-version[]
repositories {
mavenCentral()
}
endif::[]
ifndef::is-release-version[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
@@ -80,7 +87,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-java</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
@@ -100,7 +107,7 @@ Unlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed th
The {uri-pkl-config-java-ConfigEvaluator}[`ConfigEvaluator`] class loads and evaluates Pkl modules.
If evaluation succeeds, a {uri-pkl-config-java-Config}[`Config`] object is returned.
Otherwise, an {uri-pkl-core-EvalException}[`EvalException`] with error details is thrown.
Otherwise, a {uri-pkl-core-PklException}[`PklException`] with error details is thrown.
The returned `Config` object represents the root of the Pkl configuration tree.
Intermediate and leaf nodes are also represented as `Config` objects.
@@ -124,7 +131,7 @@ In this example, this is done with a try-with-resources statement.
Note that objects returned by the evaluator remain valid after calling `close()`.
<2> Evaluate the given text.
Other `evaluate` methods read from files, URLs, and other sources.
If evaluation fails, an {uri-pkl-core-EvalException}[`EvalException`] is thrown.
If evaluation fails, an {uri-pkl-core-PklException}[`PklException`] is thrown.
<3> Navigate from the config root to its `"pigeon"` child.
<4> Navigate from `"pigeon"` to `"age"` and get the latter's value as an `int`.
If conversion to the requested type fails, a `ConversionException` is thrown.
@@ -136,7 +143,7 @@ A `ConfigEvaluator` caches module sources and evaluation results.
To clear the cache, for example to evaluate the same module again, close the evaluator and create a new one.
For a ready-to-go example with full source code,
see link:{uri-config-java-example}[config-java] in the _pkl/pkl-examples_ repository.
see link:{uri-config-java-example}[config-java] in the _pkl-jvm-examples_ repository.
[[object-mapping]]
=== Object Mapping
@@ -182,7 +189,7 @@ They need to be provided in one of the following ways:
For a complete object mapping example, see:
* {uri-pkl-config-java-PObjectToObjectByCtorTestJava}[`PObjectToObjectByCtorTest.java`]
* {uri-pkl-config-java-PObjectToDataObjectTestJava}[`PObjectToDataObjectTest.java`]
TIP: Together with xref:java-binding:codegen.adoc[code generation], object mapping provides a complete solution for consuming Pkl configuration as statically typed Java objects.
Java code never drifts from the configuration structure defined in Pkl, and the entire configuration tree can be code-completed in Java IDEs.

View File

@@ -21,3 +21,57 @@ Relative paths are resolved against the working directory.
Default: (not set) +
Flag that indicates to generate config classes for use with Spring Boot.
====
.--implement-serializable
[%collapsible]
====
Default: (not set) +
Whether to make generated classes implement `java.io.Serializable`.
====
.--rename
[%collapsible]
====
Default: (none) +
Example: `foo.=com.example.foo.` +
Allows to change default class and package names (derived from Pkl module names) in the generated code.
When you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.
When you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.
The prefixes are replaced literally, which means that dots at the end are important.
If you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:
----
// Assuming the following arguments:
--rename com.foo.=x // Dot on the left only
--rename org.bar=y. // Dot on the right only
--rename net.baz=z // No dots
// The following renames will be made:
"com.foo.bar" -> "xbar" // Target prefix merged into the suffix
"org.bar.baz" -> "y..baz" // Double dot, invalid name
"net.baz.qux" -> "z.qux" // Looks okay, but...
"net.bazqux" -> "zqux" // ...may cut the name in the middle.
----
When computing the appropriate target name, the longest matching prefix is used:
----
// Assuming the following arguments:
--rename com.foo.Main=w.Main
--rename com.foo.=x.
--rename com.=y.
--rename =z.
// The following renames will be made:
com.foo.Main -> w.Main
com.foo.bar -> x.bar
com.baz.qux -> y.baz.qux
org.foo.bar -> z.org.foo.bar
----
Repeat this option to define multiple mappings.
Keys can be arbitrary strings, including an empty string.
Values must be valid dot-separated fully qualified class name prefixes, possibly terminated by a dot.
====

View File

@@ -3,6 +3,7 @@
import org.pkl.config.java.ConfigEvaluator
import org.pkl.config.kotlin.forKotlin
import org.pkl.config.kotlin.to
import org.pkl.core.ModuleSource
import org.junit.jupiter.api.Test
// the pkl/pkl-examples repo has a similar example
@@ -12,7 +13,7 @@ class KotlinConfigExample {
// tag::usage[]
val evaluator = ConfigEvaluator.preconfigured().forKotlin() // <1>
val config = evaluator.use { // <2>
it.evaluateText("""pigeon { age = 5; diet = "Seeds" }""")
it.evaluate(ModuleSource.text("""pigeon { age = 5; diet = new Listing { "Seeds" } }"""))
}
val pigeon = config["pigeon"] // <3>
val age = pigeon["age"].to<Int>() // <4>
@@ -25,7 +26,7 @@ class KotlinConfigExample {
// tag::nullable[]
val evaluator = ConfigEvaluator.preconfigured().forKotlin()
val config = evaluator.use {
it.evaluateText("name = null") // <1>
it.evaluate(ModuleSource.text("name = null")) // <1>
}
val name = config["name"].to<String?>() // <2>
// end::nullable[]

View File

@@ -19,7 +19,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
=== Java Library
The `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central].
It requires Java 8 or higher and Kotlin 1.3 or higher.
It requires Java 17 or higher and Kotlin 1.3 or higher.
==== Gradle
@@ -27,36 +27,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}"
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
====
@@ -103,7 +109,7 @@ To run the CLI, execute the library Jar or its `org.pkl.codegen.kotlin.Main` mai
*Synopsis:* `java -cp <classpath> -jar pkl-codegen-kotlin.jar [<options>] <modules>`
`<modules>`::
The absolute or relative URIs of the modules to generate classe for.
The absolute or relative URIs of the modules to generate classes for.
Relative URIs are resolved against the working directory.
==== Options

View File

@@ -1,8 +1,8 @@
= pkl-config-kotlin Library
include::ROOT:partial$component-attributes.adoc[]
:uri-pkl-config-kotlin-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-kotlin
:uri-pkl-config-kotlin-main-sources: {uri-github-tree}/pkl-config-kotlin/src/main/kotlin/org/pkl/kotlin
:uri-pkl-config-kotlin-test-sources: {uri-github-tree}/pkl-config-kotlin/src/test/kotlin/org/pkl/kotlin
:uri-pkl-config-kotlin-main-sources: {uri-github-tree}/pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin
:uri-pkl-config-kotlin-test-sources: {uri-github-tree}/pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin
:uri-pkl-config-kotlin-ConverterFactories: {uri-pkl-config-kotlin-main-sources}/ConverterFactories.kt
:uri-pkl-config-kotlin-ConfigExtensions: {uri-pkl-config-kotlin-main-sources}/ConfigExtensions.kt
@@ -12,7 +12,7 @@ We recommend that Kotlin projects depend on this library instead of _pkl-config-
== Installation
The _pkl-config-kotlin_ library is available {uri-pkl-config-kotlin-maven-module}[from Maven Central].
It requires Java 11 or higher and Kotlin 1.5 or higher.
It requires Java 17 or higher and Kotlin 1.5 or higher.
=== Gradle
@@ -20,36 +20,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
====
@@ -66,7 +72,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-kotlin</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>

View File

@@ -9,70 +9,6 @@ include::ROOT:partial$component-attributes.adoc[]
:uri-javadoc-Pattern: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
:uri-github-PklLexer: {uri-github-tree}/pkl-core/src/main/antlr/PklLexer.g4
:uri-github-PklParser: {uri-github-tree}/pkl-core/src/main/antlr/PklParser.g4
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
:uri-stdlib-String: {uri-stdlib-baseModule}/String
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN
:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity
:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween
:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite
:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8
:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16
:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32
:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8
:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16
:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32
:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt
:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri
:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()
:uri-stdlib-Null: {uri-stdlib-baseModule}/Null
:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()
:uri-stdlib-List: {uri-stdlib-baseModule}/List
:uri-stdlib-Set: {uri-stdlib-baseModule}/Set
:uri-stdlib-Map: {uri-stdlib-baseModule}/Map
:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing
:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default
:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct
:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()
:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping
:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default
:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration
:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value
:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit
:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit
:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize
:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value
:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit
:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit
:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic
:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()
:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed
:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex
:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()
:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match
:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch
:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer
:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters
:uri-stdlib-Function: {uri-stdlib-baseModule}/Function
:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0
:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1
:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()
:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2
:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3
:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4
:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5
:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource
:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files
:uri-pkl-core-ModuleSchema: {uri-pkl-core-main-sources}/ModuleSchema.java
:uri-pkl-core-SecurityManager: {uri-pkl-core-main-sources}/SecurityManager.java
:uri-pkl-core-ResourceReader: {uri-pkl-core-main-sources}/resource/ResourceReader.java
@@ -126,7 +62,7 @@ A code comment that starts with a double-slash (`//`) and runs until the end of
----
Block comment::
A nestable multiline comment which is typically used to comment out code.
A nestable multiline comment, which is typically used to comment out code.
Starts with `+/*+` and ends with `+*/+`.
+
[source%parsed,{pkl}]
@@ -240,7 +176,7 @@ A value of type link:{uri-stdlib-Float}[Float] is a 64-bit link:{uri-double-prec
Float literals use decimal notation.
They consist of an integer part, decimal point, fractional part, and exponent part.
The integer and exponent part are optional.
The integer and exponent parts are optional.
[source%tested,{pkl}]
----
@@ -266,12 +202,12 @@ negativeInfinity = -Infinity
The link:{uri-stdlib-NaN}[NaN] and link:{uri-stdlib-Infinity}[Infinity] properties are defined in the standard library.
Floats support the same comparison and arithmetic operators as integers.
Float literals with zero fractional part can be safely replaced with integer literals.
Float literals with a fractional part of zero can be safely replaced with integer literals.
For example, it is safe to write `1.3 * 42` instead of `1.3 * 42.0`.
Floats can also include the same underscore separater as integers. For example, `1_000.4_400` is a float whose value is equivalent to `1000.4400`.
Floats can also include the same underscore separator as integers. For example, `1_000.4_400` is a float whose value is equivalent to `1000.4400`.
TIP: As integers are more convenient to use than floats with zero fractional part, we recommend to require `x: Number` instead of `x: Float` in type annotations.
TIP: As integers are more convenient to use than floats with a fractional part of zero, we recommend requiring `x: Number` instead of `x: Float` in type annotations.
To restrict a float to a finite value, use the link:{uri-stdlib-isFinite}[isFinite] <<type-constraints,type constraint>>:
@@ -381,7 +317,7 @@ String content and closing delimiter must each start on a new line.
The content of a multiline string starts on the first line after the opening quotes and ends on the last line before the closing quotes.
Line breaks are included in the string and normalized to `\n`.
The previous multiline string is equivalent to this single line string.
The previous multiline string is equivalent to this single-line string.
Notice that there is no leading or trailing whitespace.
[source%tested,{pkl-expr}]
@@ -389,7 +325,7 @@ Notice that there is no leading or trailing whitespace.
"Although the Dodo is extinct,\nthe species will be remembered."
----
String interpolation, character escape sequences, and Unicode escape sequences work the same as for single line strings:
String interpolation, character escape sequences, and Unicode escape sequences work the same as for single-line strings:
[source%tested,{pkl}]
----
@@ -401,7 +337,7 @@ the species will be remembered.
----
Each content line must begin with the same whitespace characters as the line containing the closing delimiter,
which are not included in the string. Any further leading whitespace characters are preserved.
which is not included in the string. Any further leading whitespace characters are preserved.
In other words, line indentation is controlled by indenting lines relative to the closing delimiter.
In the following string, lines have no leading whitespace:
@@ -432,7 +368,7 @@ str = """
=== Custom String Delimiters
Some strings contain many verbatim backslash (`\`) or quote (`"`) characters.
A good example is regular expressions, which make frequent use of backslash characters for their own escaping.
A good example is regular expressions, which make frequent use of backslash characters for escaping.
In such cases, using the escape sequences `\\` and `\"` quickly becomes tedious and hampers readability.
Instead, leading/closing string delimiters can be customized to start/end with a pound sign (`\#`).
@@ -453,7 +389,7 @@ bird = "Dodo"
str = #" \\\\\ \#n \#u{12AF} \#(bird) """"" "#
----
More generally, string delimiters and escape character can be customized to contain _n_ pound signs each, for n >= 1.
More generally, string delimiters and escape characters can be customized to contain _n_ pound signs each, for n >= 1.
In the following string, _n_ is 2. As a result, the string content is interpreted verbatim:
@@ -555,7 +491,7 @@ xySeconds = (x + y).s // <2>
A value of type link:{uri-stdlib-DataSize}[DataSize] has a _value_ component of type `Number` and a _unit_ component of type `String`.
The unit component is constrained to the units defined in link:{uri-stdlib-DataSizeUnit}[DataSizeUnit].
Data sizes with decimal unit (factor 1000) are constructed with the following `Number` properties:
Data sizes with decimal units (factor 1000) are constructed with the following `Number` properties:
[source%tested,{pkl}]
----
@@ -567,7 +503,7 @@ datasize5 = 5.tb // terabytes
datasize6 = 5.pb // petabytes (largest unit)
----
Data sizes with binary unit (factor 1024) are constructed with the following `Number` properties:
Data sizes with binary units (factor 1024) are constructed with the following `Number` properties:
[source%tested,{pkl}]
----
@@ -635,7 +571,7 @@ xyKibibytes = (x + y).kib // <2>
An object is an ordered collection of _values_ indexed by _name_.
An object's keyvalue pairs are called its _properties_.
An object's key-value pairs are called its _properties_.
Property values are lazily evaluated on the first read.
Because Pkl's objects differ in important ways from objects in general-purpose programming languages,
@@ -685,12 +621,12 @@ dodo {
As you probably guessed, the nested property `class` can be accessed with `dodo.taxonomy.class`.
Like all values, objects are _immutable_, which is just a fancy (and short!) way to say that their properties never change.
So what happens when Pigeon moves to a different street? Do we have to construct a new object from scratch?
So what happens when Dodo moves to a different street? Do we have to construct a new object from scratch?
[[amending-objects]]
=== Amending Objects
Fortunately we don't have to.
Fortunately, we don't have to.
An object can be _amended_ to form a new object that only differs in selected properties.
Here is how this looks:
@@ -713,13 +649,13 @@ As you can see, it is easy to construct a new object that overrides selected pro
even if, as in our example, the overridden property is nested inside another object.
NOTE: If this way of constructing new objects from existing objects reminds you of prototypical inheritance, you are spot-on:
Pkl objects use protoypical inheritance as known from languages such as JavaScript.
But unlike in JavaScript, their prototype chain cannot be directly accessed or even be modified.
Pkl objects use prototypical inheritance as known from languages such as JavaScript.
But unlike in JavaScript, their prototype chain cannot be directly accessed or even modified.
Another difference is that in Pkl, object properties are late-bound. Read on to see what this means.
[[amends-declaration]]
[NOTE]
.Amends expressions vs. amends declarations
.Amends declaration vs. amends expression
====
The <<defining-objects,defining objects>> and <<amending-objects,amending objects>> sections cover two notations that are both a form of amending; called an _amends declaration_ and an _amends expression_, respectively.
@@ -735,16 +671,16 @@ parrot = (pigeon) { // <2>
name = "Parrot"
}
----
<1> Amends expression.
<2> Amends declaration.
<1> Amends declaration.
<2> Amends expression.
An amends declaration amends the property of the same name in a module's parent module, if the parent property exists.
An amends declaration amends a property of the same name if the property exists within a parent module.
Otherwise, an amends declaration implicitly amends {uri-stdlib-Dynamic}[Dynamic].
Another way to think about an amends declaration is that it is shorthand for assignment.
In practical terms, `pigeon {}` is the same as `pigeon = super.pigeon {}`.
In practical terms, `pigeon {}` is the same as `pigeon = (super.pigeon) {}`.
Amending object bodies can be chained for both an amends expression and an amends declaration.
Amending object bodies can be chained for both an amends declaration and an amends expression.
[source%tested,{pkl}]
----
@@ -760,8 +696,8 @@ dodo = (pigeon) {
extinct = true
} // <2>
----
<1> Chained amends expression (`pigeon { ... } { ... }` is the amends expression).
<2> Chained amends declaration.
<1> Chained amends declaration.
<2> Chained amends expression (`(pigeon) { ... } { ... }` is the amends expression).
====
[[late-binding]]
@@ -801,13 +737,13 @@ This is what we mean when we say that object properties are _late-bound_.
====
A good analogy is that object properties behave like spreadsheet cells.
When they are linked, changes to "downstream" properties automatically propagate to "upstream" properties.
The main difference is, editing a spreadsheet cell changes the state of the spreadsheet,
The main difference is that editing a spreadsheet cell changes the state of the spreadsheet,
whereas "editing" a property results in a new object, leaving the original object untouched.
It is as if you made a copy of the entire spreadsheet whenever you edited a cell!
====
Late binding of properties is an incredibly useful feature for a configuration language.
It is used extensively in Pkl code (especially in templates), and is the key to understanding how Pkl works.
It is used extensively in Pkl code (especially in templates) and is the key to understanding how Pkl works.
=== Transforming Objects
@@ -844,7 +780,7 @@ The resulting dynamic object is equivalent to `dodo`, except that it no longer h
[IMPORTANT]
.Lazy vs. Eager Data Types
====
Converting an object to a map is a transitition from a _lazy_ to an _eager_ data type.
Converting an object to a map is a transition from a _lazy_ to an _eager_ data type.
All of the object's properties are evaluated and all references between them are resolved.
If the map is later converted back to an object, subsequent changes to the object's properties no longer propagate to (previously) dependent properties.
@@ -919,7 +855,7 @@ faultyPigeon = new Bird {
}
----
Evaluating this, gives:
Evaluating this gives:
[source,shell,subs="quotes"]
----
@@ -978,7 +914,7 @@ pigeon = new Dynamic { // <1>
==== Hidden Properties
A property with modifier `hidden` is omitted from rendered output and from object conversions.
A property with the modifier `hidden` is omitted from the rendered output and object conversions.
[source,{pkl}]
----
@@ -991,6 +927,7 @@ class Bird {
pigeon = new Bird { // <3>
name = "Pigeon"
lifespan = 8
}
pigeonInIndex = pigeon.nameAndLifespanInIndex // <4>
@@ -1012,7 +949,7 @@ pigeon {
lifespan = 8
nameSignWidth = 9
}
pigeonInIndex = "Pigeon, 5"
pigeonInIndex = "Pigeon, 8"
pigeonDynamic {
name = "Pigeon"
lifespan = 8
@@ -1021,7 +958,7 @@ pigeonDynamic {
----
==== Local properties
A property with modifier `local` can only be referenced in the lexical scope of its definition.
A property with the modifier `local` can only be referenced in the lexical scope of its definition.
[source,{pkl}]
----
@@ -1052,8 +989,8 @@ Because a `local` property is added to the lexical scope, but not (observably) t
====
An _import clause_ defines a local property in the containing module.
This means `import "someModule.pkl"` is equivalent to `local someModule = import("someModule.pkl")`.
Also, `import "someModule.pkl" as otherName` is equivalent to `local otherName = import("someModule.pkl")`.
This means `import "someModule.pkl"` is effectively `const local someModule = import("someModule.pkl")`.
Also, `import "someModule.pkl" as otherName` is effectively `const local otherName = import("someModule.pkl")`.
====
[[fixed-properties]]
@@ -1090,7 +1027,7 @@ birds { // <2>
<1> Error: cannot assign to fixed property `laysEggs`
<2> Error: cannot amend fixed property `birds`
When extending a class and overriding an existing property definition, the fixed-ness of the overridden property must be preserved.
When extending a class and overriding an existing property definition, the fixedness of the overridden property must be preserved.
If the property in the parent class is declared `fixed`, the child property must also be declared `fixed`.
If the property in the parent class is not declared `fixed`, the child property may not add the `fixed` modifier.
@@ -1110,7 +1047,7 @@ class Penguin extends Bird {
<2> Error: modifier `fixed` cannot be applied to property `name`.
The `fixed` modifier is useful for defining properties that are meant to be derived from other properties.
In the following snippet, property `result` is not meant to be assigned to, because it is derived
In the following snippet, the property `result` is not meant to be assigned to, because it is derived
from other properties.
[source%parsed,{pkl}]
@@ -1201,7 +1138,7 @@ const bird: Bird = new {
----
<1> `lifespan` is declared within property `bird`. `speciesName` resolves to `this.speciesName`, where `this` is a value within property `bird`.
NOTE: Because `const` members can only reference its own values, or other `const` members, they are not <<late-binding,late bound>>.
NOTE: Because `const` members can only reference themselves and other `const` members, they are not <<late-binding,late bound>>.
The `const` modifier implies that it is also <<fixed-properties,fixed>>.
Therefore, the same rules that apply to `fixed` also apply to `const`:
@@ -1210,9 +1147,13 @@ Therefore, the same rules that apply to `fixed` also apply to `const`:
* The const-ness of a property or method must be preserved when it is overridden by a child class.
[[class-and-annotation-const]]
*Class and Annotation Scoping*
*Class, Annotation, and Typealias Scoping*
Within a class or annotation body, any reference to a property or method of its enclosing module requires that the referenced member is `const`.
In these following scenarios, any reference to a property or method of its enclosing module requires that the referenced member is `const`:
* Class body
* Annotation body
* Typealiased constrained type
.invalid2.pkl
[source%parsed,{pkl}]
@@ -1225,15 +1166,18 @@ class Bird {
@Deprecated { message = "Replace with \(pigeonName)" } // <2>
oldPigeonName: String
typealias IsPigeonName = String(pigeonName) // <3>
----
<1> Error: cannot reference non-const property `pigeonName` from a class.
<2> Error: cannot reference non-const property `pigeonName` from an annotation.
<3> Error: cannot reference non-const property `pigeonname` from a typealias.
This rule exists because classes and annotations are not <<late-binding,late bound>>;
it is not possible to change the definition of a class nor annotation by amending the module
This rule exists because classes, annotations, and typealiases are not <<late-binding,late bound>>;
it is not possible to change the definition of these members by amending the module
where it is defined.
Generally, there are two strategies for referencing a property from a class or annotation:
Generally, there are two strategies for referencing such properties:
*Add the `const` modifier to the referenced property*
@@ -1250,7 +1194,7 @@ One solution is to add the `const` modifier to the property being referenced.
}
----
This solution makes sense if `pigeonName` does get assigned/amended when amending module `Birds.pkl` (modules are regular objects that can be amended).
This solution makes sense if `pigeonName` does not get assigned/amended when amending module `Birds.pkl` (modules are regular objects that can be amended).
*Self-import the module*
@@ -1359,7 +1303,7 @@ listing = new Listing {
"A " + pigeon + " is a bird" // <3>
}
----
<1> Defines a local property with value `"Pigeon"`.
<1> Defines a local property with the value `"Pigeon"`.
Local properties can have a type annotation, as in `pigeon: String = "Pigeon"`.
<2> Defines a listing element that references the local property.
<3> Defines another listing element that references the local property.
@@ -1438,7 +1382,7 @@ newBirds = (birds) { // <1>
secondBirdDiet = newBirds[1].diet // <2>
----
<1> Amends listing `birds` and overrides property `diet` of element 0 (whose name is "Pigeon"`) to have value `"Worms"`.
<1> Amends listing `birds` and overrides property `diet` of element 0 (whose name is "Pigeon"`) to have the value `"Worms"`.
<2> Because element 1 is defined in terms of element 0, its `diet` property also changes to `"Worms"`.
=== Transforming Listings
@@ -1485,7 +1429,7 @@ reversedbirds = birds
[IMPORTANT]
.Lazy vs. Eager Data Types
====
Converting a listing to a list is a transitition from a _lazy_ to an _eager_ data type.
Converting a listing to a list is a transition from a _lazy_ to an _eager_ data type.
All of the listing's elements are evaluated and all references between them are resolved.
If the list is later converted back to a listing, subsequent changes to the listing's elements no longer propagate to (previously) dependent elements.
@@ -1573,7 +1517,7 @@ This declaration has the following effects:
* If `ElementType` has a <<default-values,default value>>, that value becomes the listing's default element.
* The first time `x` is read,
** its value is checked to have type `Listing`.
** the listing's elements are checked to have type `ElementType`.
** the listing's elements are checked to have the type `ElementType`.
Here is an example:
@@ -1640,12 +1584,12 @@ A value of type link:{uri-stdlib-Mapping}[Mapping] is an ordered collection of _
NOTE: Most of what has been said about <<listings,listings>> also applies to mappings.
Nevertheless, this section is written to stand on its own.
A mapping's keyvalue pairs are called its _entries_.
A mapping's key-value pairs are called its _entries_.
Keys are eagerly evaluated; values are lazily evaluated on the first read.
Mappings combine qualities of maps and objects:
* Like maps, mappings can contain arbitrary keyvalue pairs.
* Like maps, mappings can contain arbitrary key-value pairs.
* Like objects, mappings excel at defining and amending nested literal data structures.
* Like objects, mappings can only be directly manipulated through amendment,
but converting them to a map (and, if necessary, back to a mapping) opens the door to arbitrary transformations.
@@ -1654,8 +1598,8 @@ Mappings combine qualities of maps and objects:
[TIP]
.When to use Mapping vs. <<maps,Map>>
====
* When keyvalue style data needs to be specified literally, use a mapping.
* When keyvalue style data needs to be transformed in a way that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.
* When key-value style data needs to be specified literally, use a mapping.
* When key-value style data needs to be transformed in a way that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.
* If in doubt, use a mapping.
Templates and schemas should almost always use mappings instead of maps.
@@ -1683,8 +1627,8 @@ birds = new Mapping { // <1>
<1> Defines a module property named `birds` with a value of type `Mapping`.
A type only needs to be stated when the property does not have or inherit a <<mapping-type-annotations,type annotation>>.
Otherwise, amend syntax (`birds { ... }`) or shorthand instantiation syntax (`birds = new { ... }`) should be used.
<2> Defines a mapping entry with key `"Pigeon"` and a value of type `Dynamic`.
<3> Defines a mapping entry with key `"Parrot"` and a value of type `Dynamic`.
<2> Defines a mapping entry with the key `"Pigeon"` and a value of type `Dynamic`.
<3> Defines a mapping entry with the key `"Parrot"` and a value of type `Dynamic`.
To access a value by key, use the `[]` (subscript) operator:
@@ -1740,7 +1684,7 @@ mapping = new Mapping {
}
}
----
<1> Defines a local property name `parrot` with value `"Parrot"`.
<1> Defines a local property name `parrot` with the value `"Parrot"`.
Local properties can have a type annotation, as in `parrot: String = "Parrot"`.
<2> Defines a mapping entry whose value references `parrot`.
The local property is visible to values but not keys.
@@ -1783,7 +1727,7 @@ birds2 = (birds) { // <1>
}
----
<1> Defines a module property named `birds2`. Its value is a mapping that amends `birds`.
<2> Defines a mapping entry with key `"Barn owl"` and a value of type `Dynamic`.
<2> Defines a mapping entry with the key `"Barn owl"` and a value of type `Dynamic`.
<3> Amends mapping entry `"Pigeon"` and overrides property `diet`.
<4> Overrides mapping entry `"Parrot"` with an entirely new value of type `Dynamic`.
@@ -1804,8 +1748,8 @@ birds = new Mapping {
}
}
----
<1> Defines a mapping entry with key `"Pigeon"` and a value of type `Dynamic`.
<2> Defines a mapping entry with key `"Parrot"` and a value that amends `"Pigeon"`.
<1> Defines a mapping entry with the key `"Pigeon"` and a value of type `Dynamic`.
<2> Defines a mapping entry with the key `"Parrot"` and a value that amends `"Pigeon"`.
Mapping values are late-bound:
@@ -1865,7 +1809,7 @@ result = birds
[IMPORTANT]
.Lazy vs. Eager Data Types
====
Converting a mapping to a map is a transitition from a _lazy_ to an _eager_ data type.
Converting a mapping to a map is a transition from a _lazy_ to an _eager_ data type.
All of the mapping's values are evaluated and all references between them are resolved.
(Mapping keys are eagerly evaluated.)
@@ -1892,9 +1836,9 @@ birds = new Mapping {
}
----
<1> Amends the `default` value and sets property `lifespan`.
<2> Defines a mapping entry with key `"Pigeon"` that implicitly amends the default value.
<2> Defines a mapping entry with the key `"Pigeon"` that implicitly amends the default value.
<3> Defines a new property called `diet`. Property `lifespan` is inherited from the default value.
<4> Defines a mapping entry with key `"Parrot"` that implicitly amends the default value.
<4> Defines a mapping entry with the key `"Parrot"` that implicitly amends the default value.
<5> Overrides the default for property `lifespan`.
`default` is a hidden (that is, not rendered) link:{uri-stdlib-Mapping-default}[property] defined in class `Mapping`.
@@ -2027,7 +1971,7 @@ parrot = new Bird {
=== Class Inheritance
Pkl supports single inheritance with a Java(Script) like syntax.
Pkl supports single inheritance with a Java(Script)-like syntax.
[source%tested,{pkl}]
----
@@ -2168,7 +2112,7 @@ A package is a shareable archive of modules and resources that are published to
To import `package://example.com/mypackage@1.0.0#/my_module.pkl`, Pkl follows these steps:
1. Make an HTTPS GET request to `https://example.com/mypackage@1.0.0` to retrieve the package's metadata.
1. Make an HTTPS GET request to `\https://example.com/mypackage@1.0.0` to retrieve the package's metadata.
2. From the package metadata, download the referenced zip archive, and validate its checksum.
3. Resolve path `/my_module.pkl` within the package's zip archive.
@@ -2203,9 +2147,18 @@ For example, a module with URI `modulepath:/animals/birds/pigeon.pkl`
can import `modulepath:/animals/birds/parrot.pkl`
with `import "parrot.pkl"` or `import "/animals/birds/parrot.pkl"`.
NOTE: When importing a relative folder or file that starts with `@`, the import string must be prefixed with `./`.
Otherwise, this syntax will be interpreted as dependency notation.
[NOTE]
.Paths on Windows
====
Relative paths use the `/` character as the directory separator on all platforms, including Windows.
Paths that contain drive letters (e.g. `C:`) must be declared as an absolute file URI, for example: `import "file:///C:/path/to/my/module.pkl"`. Otherwise, they are interpreted as a URI scheme.
====
NOTE: When importing a relative directory or file that starts with `@`, the import string must be prefixed with `./`.
Otherwise, this syntax will be interpreted as xref:dependency-notation[dependency notation].
[#dependency-notation]
==== Dependency notation URIs
Example: `+@birds/bird.pkl+`
@@ -2213,7 +2166,7 @@ Example: `+@birds/bird.pkl+`
Dependency notation URIs represent a path within a <<project-dependencies,project or package dependency>>.
For example, import `@birds/bird.pkl` represents path `/bird.pkl` in a dependency named "birds".
A dependency is either a remote package, or a local project dependency.
A dependency is either a remote package or a local project dependency.
==== Extension points
@@ -2392,7 +2345,7 @@ extinct = false
function say() = "Pkl is great!"
----
At most, one extends clause is permitted.
At most one extends clause is permitted.
A module cannot have both an amends clause and an extends clause.
Extending a module implicitly defines a new module class that extends the original module's class.
@@ -2494,7 +2447,7 @@ When creating a new module, especially one intended for import into other module
Less than six characters, not counting the `.pkl` file extension, is a good rule of thumb.
* valid identifier
+
Stick to alphanumeric characters. Use underscore (`_`) instead of hyphen (`-`) as name separator.
Stick to alphanumeric characters. Use an underscore (`_`) instead of a hyphen (`-`) as a name separator.
* descriptive
+
An import name should make sense on its own and when used in qualified member names.
@@ -2503,7 +2456,7 @@ An import name should make sense on its own and when used in qualified member na
[[import-expression]]
==== Import Expressions (`import()`)
An import expression consists of the keyword `import`, following by a <<Module URIs,module URI>> wrapped in parentheses:
An import expression consists of the keyword `import`, followed by a <<Module URIs,module URI>> wrapped in parentheses:
[source,{pkl}]
----
@@ -2523,7 +2476,7 @@ Multiple modules may be imported at once with `import*`.
When importing multiple modules, a glob pattern is used to match against existing resources.
A globbed import evaluates to a `Mapping`, where keys are the expanded form of the glob and values are import expressions on each individual module.
Globbed imports can be expressed as either a clause, or as an expression.
Globbed imports can be expressed as either a clause or as an expression.
When expressed as a clause, they follow the same naming rules as a normal <<import-clause,import clause>>: they introduce a local property equal to the last path segment without the `.pkl` extension.
A globbed import clause cannot be used as a type.
@@ -2535,7 +2488,7 @@ import* "reptiles/*.pkl" <2>
birds = import*("birds/*.pkl") // <3>
----
<1> Globbed import clause
<2> Globbed import clause without explicit name (will import the name `*`)
<2> Globbed import clause without an explicit name (will import the name `*`)
<3> Globbed import expression
Assuming that a file system contains these files:
@@ -2584,7 +2537,7 @@ This behavior is similar to the behavior of Bash with `shopt -s dotglob` enabled
=== Security Checks
When attempting to directly evaluate a module, as in `pkl myModule.pkl`,
When attempting to directly evaluate a module, as in `pkl eval myModule.pkl`,
the following security checks are performed:
* The module URI is checked against the module allowlist (`--allowed-modules`).
@@ -2611,7 +2564,7 @@ By default, there are five trust levels, listed from highest to lowest:
For example, this means that `file:` modules can import `https:` modules, but not the other way around.
If a module URI is resolved in multiple steps, all URIs are subject to the above security checks.
An example for this is an HTTPS URL that results in a redirect.
An example of this is an HTTPS URL that results in a redirect.
Pkl embedders can further customize security checks.
@@ -2637,7 +2590,7 @@ b {
}
----
`pkl config.pkl`, which is shorthand for `pkl --format pcf config.pkl`, renders the module as Pcf:
`pkl eval config.pkl`, which is shorthand for `pkl eval --format pcf config.pkl`, renders the module as Pcf:
[source,{pkl}]
----
@@ -2647,7 +2600,7 @@ b {
}
----
`pkl --format yaml config.pkl` renders the module as YAML:
`pkl eval --format yaml config.pkl` renders the module as YAML:
[source,yaml]
----
@@ -2656,7 +2609,7 @@ b:
c: 20
----
Likewise, `pkl --format json config.pkl` renders the module as JSON.
Likewise, `pkl eval --format json config.pkl` renders the module as JSON.
[[in-language]]
==== In-language
@@ -2710,7 +2663,7 @@ The standard library provides these renderers:
* link:{uri-stdlib-xmlModule}/Renderer[xml.Renderer]
* link:{uri-stdlib-baseModule}/YamlRenderer[YamlRenderer]
To render a format that is not yet supported, implement your own renderer by extending class link:{uri-stdlib-baseModule}/ValueRenderer[ValueRenderer].
To render a format that is not yet supported, you can implement your own renderer by extending the class link:{uri-stdlib-baseModule}/ValueRenderer[ValueRenderer].
The standard library renderers can be configured with _value converters_, which influence how particular values are rendered.
@@ -2756,7 +2709,7 @@ output {
}
----
For more on path based converters, see {uri-stdlib-PcfRenderer-converters}[PcfRenderer.converters].
For more on path-based converters, see {uri-stdlib-PcfRenderer-converters}[PcfRenderer.converters].
Sometimes it is useful to directly compute the final module output, bypassing `output.value` and `output.converters`.
To do so, set the link:{uri-stdlib-baseModule}/ModuleOutput#text[output.text] property to a String value:
@@ -2779,7 +2732,7 @@ THIS IS THE FINAL OUTPUT
[[multiple-file-output]]
==== Multiple File Output
Sometimes, it is desirable for a single module to produce multiple output files.
It is sometimes desirable for a single module to produce multiple output files.
This is possible by configuring a module's link:{uri-stdlib-outputFiles}[`output.files`] property
// suppress inspection "AsciiDocLinkResolve"
and specifying the xref:pkl-cli:index.adoc#multiple-file-output-path[`--multiple-file-output-path`]
@@ -2812,7 +2765,7 @@ output {
}
----
Running `pkl -m output/ pigeon.pkl` produces the following output files:
Running `pkl eval -m output/ birds.pkl` produces the following output files:
.output/birds/pigeon.json
[source,json]
@@ -2946,7 +2899,7 @@ name2OrParrot = name2 ?? "Parrot" // <2>
[NOTE]
.Default non-null behavior
====
There are many languages that allow `null` for (almost) every type, but Pkl does not.
Many languages allow `null` for (almost) every type, but Pkl does not.
Any type can be extended to include `null` by appending `?` to the type.
For example, `parrot: Bird` will always be non-null, but `pigeon: Bird?` could be `null` - and _is_ by default,
@@ -3175,7 +3128,7 @@ myValue = throw("You won't be able to recover from this one!") // <1>
----
<1> `myValue` never receives a value because the program exits.
The error message is printed to the console, and the program exits.
The error message is printed to the console and the program exits.
In embedded mode, a link:{uri-pkl-core-PklException}[PklException] is thrown.
[[debugging]]
@@ -3363,7 +3316,7 @@ list3 = List(1, "x", 5.min, List(1, 2, 3)) // <3>
----
<1> result: empty list
<2> result: list of length 3
<3> result: heterogenous list whose last element is another list
<3> result: heterogeneous list whose last element is another list
To concatenate lists, use the `+` operator:
@@ -3420,7 +3373,7 @@ res4 = Set(1, "x", 5.min, List(1, 2, 3)) // <4>
<1> result: empty set
<2> result: set of length 3
<3> result: same set of length 3
<4> result: heterogenous set that contains a list as its last element
<4> result: heterogeneous set that contains a list as its last element
To compute the union of sets, use the `+` operator:
@@ -3451,14 +3404,14 @@ res4 = set.intersect(Set(3, 9, 2)) // <4>
A value of type link:{uri-stdlib-Map}[Map] is an ordered collection of _values_ indexed by _key_.
A map's keyvalue pairs are called its _entries_.
A map's key-value pairs are called its _entries_.
Keys and values are eagerly evaluated.
[TIP]
.When to use Map vs. <<mappings,Mapping>>
====
* When keyvalue style data needs to be specified literally, use a mapping.
* When keyvalue style data needs to be transformed in ways that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.
* When key-value style data needs to be specified literally, use a mapping.
* When key-value style data needs to be transformed in ways that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.
* If in doubt, use a mapping.
Templates and schemas should almost always use mappings instead of maps.
@@ -3477,7 +3430,7 @@ map3 = Map(1, "x", 2, 5.min, 3, Map(1, 2)) // <3>
<2> result: set of length 3
<3> result: heterogeneous map whose last value is another map
Any Pkl value can be used as map key:
Any Pkl value can be used as a map key:
[source%tested,{pkl-expr}]
----
@@ -3533,7 +3486,7 @@ emailRegex = Regex(#"([\w\.]+)@([\w\.]+)"#)
// note: first \ on next line is asciidoc escape
Notice the use of custom string delimiters `\#"` and `"#`, which change the string's escape character from `\` to `\#`.
As a consequence, the regular expression's own backslash escape character no longer needs to be escaped.
As a consequence, the regular expression's backslash escape character no longer requires escaping.
To test if a string fully matches a regular expression, use link:{uri-stdlib-matches}[String.matches()]:
@@ -3665,7 +3618,7 @@ Property and method definitions may optionally contain type annotations.
Type annotations serve the following purposes:
* Documentation
+ Type annotations help documenting data models. They are included in generated documentation.
+ Type annotations help to document data models. They are included in any generated documentation.
* Validation
+ Type annotations are validated at runtime.
@@ -3776,10 +3729,18 @@ The following class types are _generic types_:
* `Pair`
* `Collection`
* `Listing`
* `List`
* `Mapping`
* `Set`
* `Map`
* `Container`
* `Function0`
* `Function1`
* `Function2`
* `Function3`
* `Function4`
* `Function5`
* `Class`
A generic type has constituent types written in angle brackets (`<>`):
@@ -3790,15 +3751,15 @@ coll: Collection<Bird> // <2>
list: List<Bird> // <3>
set: Set<Bird> // <4>
map: Map<String, Bird> // <5>
cont: Mapping<String, Bird> // <6>
mapping: Mapping<String, Bird> // <6>
----
<1> a pair with first element of type `String` and second element of type `Bird`
<1> a pair `String` and `Bird` as types for the first and second element, respectively
<2> a collection of `Bird` elements
<3> a list of `Bird` elements
<4> a set of `Bird` elements
<5> a map with `String` keys and `Bird` values
<6> a container of `Bird` elements
<6> a mapping of `String` keys and `Bird` values
Omitting the constituent types is equivalent to declaring them as `unknown`:
@@ -3809,7 +3770,7 @@ coll: Collection // equivalent to `Collection<unknown>`
list: List // equivalent to `List<unknown>`
set: Set // equivalent to `Set<unknown>`
map: Map // equivalent to `Map<unknown, unknown>`
cont: Mapping // equivalent to `Mapping<unknown, unknown>`
mapping: Mapping // equivalent to `Mapping<unknown, unknown>`
----
The `unknown` type is both a top and a bottom type.
@@ -3836,7 +3797,7 @@ More complex union types can be formed:
foo: List<Boolean|Number|String>|Bird
----
Union types have no implicit default values, but an explicit type can be choosen using a `*` marker:
Union types have no implicit default values, but an explicit type can be chosen using a `*` marker:
[source%parsed,{pkl}]
----
foo: "a"|"b" // undefined. Will throw an error if not amended
@@ -3906,7 +3867,7 @@ it backs off and trusts the code's author to know what they are doing -- for exa
==== Progressive Disclosure
In the spirit of link:{uri-progressive-disclosure}[progressive disclosure], type annotations are optional in Pkl.
Omitting a type annotation is equivalent to specifying type `unknown`:
Omitting a type annotation is equivalent to specifying the type `unknown`:
[source%parsed,{pkl}]
----
@@ -3945,7 +3906,7 @@ nullish: Null // = null <11>
<2> Properties of type `List` default to the empty list.
<3> Properties of type `Set` default to the empty set.
<4> Properties of type `Map` default to the empty map.
<5> Properties of type `Listing<X>` default to an empty listing whose default element is the default for `Y`.
<5> Properties of type `Listing<X>` default to an empty listing whose default element is the default for `X`.
<6> Properties of type `Mapping<X, Y>` default to an empty mapping whose default value is the default for `Y`.
<7> Properties of non-external class type `X` default to `new X {}`.
<8> Properties of type `X?` default to `Null(x)` where `x` is the default for `X`.
@@ -3997,7 +3958,7 @@ pigeon: Bird = new {
----
<1> Restricts `name` to have at least three characters.
<2> The name of the bird (`this`) should not be the same as the name of the `parent`.
<3> Note how `parent` is different from `name`. If they were the same, we would be thrown a contraint error.
<3> Note how `parent` is different from `name`. If they were the same, we would be thrown a constraint error.
In the following example, we define a `Bird` with a name of only two characters.
@@ -4011,7 +3972,7 @@ pigeon: Bird = new {
Boolean expressions are convenient for ad-hoc type constraints.
Alternatively, type constraints can be given as lambda expressions accepting a single argument, namely the value to be validated.
This allows to abstract over and reuse type constraints.
This allows for the abstraction and reuse of type constraints.
[source%tested,{pkl}]
----
@@ -4281,7 +4242,7 @@ Function amending can also be used to refine <<mixins,mixins>>.
[[amend-null]]
=== Amending Null Values
It's time to lift a secret: The predefined `null` value is just one of potentially many values of type `Null`.
It's time to lift a secret: The predefined `null` value is just one of the potentially many values of type `Null`.
First, here are the technical facts:
@@ -4514,7 +4475,7 @@ entry value +
property value
|===
Indices are zero based.
Indices are zero-based.
Note that `for` generators can generate elements and entries but not properties.footnote:[More precisely, they cannot generate properties with a non-constant name.]
[[spread-syntax]]
@@ -4587,7 +4548,7 @@ In some ways, spread syntax can be thought of as a shorthand for a xref:for-gene
[NOTE]
====
Look out for duplicate key conflicts when using spreads.
When spreading entries or properties, it is possible that a spread causes conflict due to an existing definition of a key.
Spreading entries or properties may cause conflicts due to matched existing key definitions.
In the following code snippet, `"Pigeon"` is declared twice in the `newPets` object, and thus is an error.
@@ -4715,7 +4676,7 @@ If the `-` character exists at the beginning or the end of a character class, it
Within a character class, the characters `{`, `}`, `\`, `*`, and `?` do not have any special meaning.
A character class is not allowed to be empty.
Thus, if the first character within the character class is `]`, it treated literally and not as the closing delimiter of the character class.
Thus, if the first character within the character class is `]`, it is treated literally and not as the closing delimiter of the character class.
For example, the glob pattern `[]abc]` matches a single character that is either `]`, `a`, `b`, or `c`.
[[glob-sub-patterns]]
@@ -4892,14 +4853,14 @@ To customize the link text, insert the desired text, enclosed in square brackets
[source,{pkl}]
----
/// A [common Bird] found in large cities.
/// A [common Bird][Bird] found in large cities.
----
Custom link text can use markup:
[source,{pkl}]
----
/// A [*common* Bird] found in large cities.
/// A [*common* Bird][Bird] found in large cities.
----
The short link `[Bird]` is equivalent to `[{backtick}Bird{backtick}][Bird]`.
@@ -5024,12 +4985,12 @@ To answer this question, Pkl follows these steps:
If a match is found, this is the answer.
. Search the `pkl.base` module for a top-level definition of method `x`.
If a match is found, this is the answer.
. Seach the class inheritance chain of `this`, starting with the class of `this`
. Search the class inheritance chain of `this`, starting with the class of `this`
and continuing upwards until and including class `Any`, for a method named `x.`
If a match is found, this is the answer.
. Throw a "method `x` not found" error.
NOTE: Pkl does not support arity or type based method overloading.
NOTE: Pkl does not support arity or type-based method overloading.
Hence, the argument list of a method call is irrelevant for method resolution.
[[prototype-chain]]
@@ -5119,11 +5080,9 @@ They cannot be used as a regular identifier, and currently do not have any meani
* `override`
* `record`
* `delete`
* `match`
* `case`
* `switch`
* `vararg`
* `const`
To use these names in an identifier, <<quoted-identifiers, surround them with backticks>>.
@@ -5131,7 +5090,7 @@ To use these names in an identifier, <<quoted-identifiers, surround them with ba
=== Blank Identifiers
Blank identifiers can be used in many places to ignore parameters and variables. +
`_` is not a valid identifier. In order to use it as a parameter or variable name
`_` is not a valid identifier. To use it as a parameter or variable name,
it needs to be enclosed in backticks: +`_`+.
==== Functions and methods
@@ -5180,8 +5139,8 @@ birds = new Dynamic {
[[projects]]
=== Projects
A _project_ is a directory of Pkl modules, and other resources.
It is defined by the presence of a `PklProject` file, that amends standard library module
A _project_ is a directory of Pkl modules and other resources.
It is defined by the presence of a `PklProject` file that amends the standard library module
`pkl:Project`.
Defining a project serves the following purposes:
@@ -5234,7 +5193,7 @@ When the project gets published as a _package_, these names and URIs are preserv
==== Resolving Dependencies
Dependencies that are declared in a `PklProject` file must be _resolved_ via CLI command xref:pkl-cli:index.adoc#command-project-resolve[`pkl project resolve`].
This builds a single dependency list, resolving all transitive dependencies and determines appropriate version for each package.
This builds a single dependency list, resolving all transitive dependencies, and determines the appropriate version for each package.
It creates or updates a file called `PklProject.deps.json` in the project's root directory with the list of resolved dependencies.
When resolving version conflicts, the CLI will pick the latest link:{uri-semver}[semver] minor version of each package.
@@ -5267,11 +5226,11 @@ package {
}
----
<1> The display name of the package. For display purposes only.
<2> The package URI, without the version part
<3> The version of the package
<4> The URL that the package's ZIP file will available for download at.
<2> The package URI, without the version part.
<3> The version of the package.
<4> The URL to download the package's ZIP file.
The package itself is created by 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.
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>+`.
@@ -5300,7 +5259,7 @@ package {
name = "birds"
baseUri = "package://example.com/birds"
version = "1.8.3"
packageZipUrl = "https://example.com/birds@\(version).zip
packageZipUrl = "https://example.com/birds@\(version).zip"
}
----
<1> Specify relative project `../fruit` as a dependency.
@@ -5314,7 +5273,7 @@ package {
name = "fruit"
baseUri = "package://example.com/fruit"
version = "1.5.0"
packageZipUrl = "https://example.com/fruit@\(version).zip
packageZipUrl = "https://example.com/fruit@\(version).zip"
}
----

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -33,13 +33,13 @@ parrot = (bird) {
----
Parrot and Pigeon have nearly identical properties.
They only differ in their name and taxonomy, so if you have already written out `bird`, you can say that `parrot` is just like `pigeon` except `name` is `"Parrot"`, diet is `"Berries"` the `taxonomy.order` is `"Psittaciformes"`.
They only differ in their name and taxonomy, so if you have already written out `bird`, you can say that `parrot` is just like `bird` except `name` is `"Parrot"`, diet is `"Berries"` the `taxonomy.order` is `"Psittaciformes"`.
When you run this, Pkl expands everything fully.
[source,{pkl}]
----
bird {
name = "Common wood pigeon"
name = "Pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
@@ -58,9 +58,12 @@ parrot {
}
----
[IMPORTANT]
[NOTE]
====
_Amending_ does not allow us to _add_ properties to the (typed) object we are amending.
So far, you have only worked with link:{uri-stdlib-Dynamic}[Dynamic] objects.
Pkl also offers link:{uri-stdlib-Typed}[Typed] objects.
_Amending_ allows you to override, amend, and add new properties to a dynamic object.
Typed objects will only let you amend or override existing properties, not add entirely new ones.
The xref:03_writing_a_template.adoc[next part of the tutorial] discusses types in more detail.
There, you see that amending _never changes the type_ of the object.
====
@@ -72,22 +75,25 @@ Consider the following example.
[source,{pkl}]
.nestedAmends.pkl
----
woodPigeon {
name = "Common wood pigeon"
stockPigeon {
name = "Stock pigeon"
diet = "Seeds"
taxonomy {
species = "Columba palumbus"
}
}
stockPigeon = (woodPigeon) {
name = "Stock pigeon"
taxonomy { // <1>
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba oenas"
}
}
dodo = (stockPigeon) { // <2>
woodPigeon = (stockPigeon) {
name = "Common wood pigeon"
taxonomy { // <1>
species = "Columba palumbus"
}
}
dodo = (woodPigeon) { // <2>
name = "Dodo"
extinct = true // <3>
taxonomy {
@@ -100,7 +106,7 @@ dodo = (stockPigeon) { // <2>
<3> New fields can be added to objects when amending.
Notice how you only have to change `taxonomy.species`.
In this example, `bird.taxonomy` has `kingdom`, `clade`, `order` and `species`.
In this example, `stockPigeon.taxonomy` has `kingdom`, `clade`, `order` and `species`.
You are amending `stockPigeon`, to define `woodPigeon`.
They have the same `taxonomy`, except for `species`.
This notation says that everything in `taxonomy` should be what it is in the object you are amending (`stockPigeon`), except for `species`, which should be `"Columba palumbus"` .
@@ -108,27 +114,36 @@ This notation says that everything in `taxonomy` should be what it is in the obj
For the input above, Pkl produces the following output.
[source,{pkl}]
----
woodPigeon {
name = "Common wood pigeon"
diet = "Seeds"
taxonomy {
species = "Columba palumbus"
}
}
stockPigeon {
name = "Stock pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba oenas"
}
}
woodPigeon {
name = "Common wood pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba palumbus"
}
}
dodo {
name = "Dodo"
diet = "Seeds"
extinct = true
taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Raphus cucullatus"
}
extinct = true
}
----
@@ -206,6 +221,8 @@ Going back to the example above, you can write `parrot` as a separate module.
name = "Common wood pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Columba palumbus"
}
----
@@ -220,12 +237,12 @@ import "pigeon.pkl" // <1>
parrot = (pigeon) {
name = "Great green macaw"
diet = "Berries"
species {
taxonomy {
species = "Ara ambiguus"
}
}
----
<1> Importing `foo.pkl` creates the object `foo`, so you can refer to `pigeon` in this code, like you did before.
<1> Importing `pigeon.pkl` creates the object `pigeon`, so you can refer to `pigeon` in this code, like you did before.
If you run Pkl on both, you will see that it works.
Looking at the result, however, you see a (possibly) unexpected difference.
@@ -233,9 +250,11 @@ Looking at the result, however, you see a (possibly) unexpected difference.
[source,{pkl}]
----
$ pkl eval /Users/me/tutorial/pigeon.pkl
name = "Common wood pigeon""
name = "Common wood pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Columba palumbus"
}
@@ -244,6 +263,8 @@ parrot {
name = "Great green macaw"
diet = "Berries"
taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Ara ambiguus"
}
}
@@ -275,9 +296,9 @@ This terminology describes the _intended use_ of the module and doesn't imply an
In other words: just by looking at Pkl code, you can't tell whether it is a template or a "normal" module.
[source,{pkl}]
.acmecicd.pkl
.AcmeCICD.pkl
----
module acmecicd
module AcmeCICD
class Pipeline {
name: String(nameRequiresBranchName)?
@@ -307,7 +328,7 @@ Next, add a time-out of one minute for your job.
[source,{pkl}]
.cicd.pkl
----
amends "acmecicd.pkl"
amends "AcmeCICD.pkl"
timeout = 1
----
@@ -320,7 +341,7 @@ Value: 1 // <3>
225 | timeout: Int(this >= 3)? // <4>
^^^^^^^^^
at acmecicd#timeout (file:///Users/me/tutorial/acmecicd.pkl, line 8)
at AcmeCICD#timeout (file:///Users/me/tutorial/AcmeCICD.pkl, line 8)
3 | timeout = 1 // <5>
^
@@ -360,7 +381,7 @@ Start off by specifying the name of the pipeline and nothing else.
[source,{pkl}]
.cicd.pkl
----
amends "acmecicd.pkl"
amends "AcmeCICD.pkl"
timeout = 3
pipelines {
@@ -372,7 +393,7 @@ pipelines {
<1> There is no pipeline object to amend. The `new` keyword gives you an object to amend.
So far, you've defined objects the same way you amended them.
When the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the object specified on the `...`.
If the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the contents in place of the `...` (given that `...` is not valid Pkl, but an abbreviation for illustration purposes).
If `foo` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property.
Since `pipelines` is a listing, you can _add_ elements by writing expressions in an amend expression.
@@ -394,7 +415,7 @@ Pipelines that set a 'name' must also set a 'branchName'.
8 | throw("Pipelines that set a 'name' must also set a 'branchName'.")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at acmecicd#Pipeline.nameRequiresBranchName.<function#1> (file:///Users/me/tutorial/acmecicd.pkl, line 8)
at AcmeCICD#Pipeline.nameRequiresBranchName.<function#1> (file:///Users/me/tutorial/AcmeCICD.pkl, line 8)
6 | name = "prb"
^^^^^
@@ -415,7 +436,7 @@ The message is quite instructive, so you can fix the error by adding a `branchNa
[source,{pkl}]
.cicd.pkl
----
amends "acmecicd.pkl"
amends "AcmeCICD.pkl"
timeout = 3
pipelines {

View File

@@ -3,7 +3,7 @@ include::ROOT:partial$component-attributes.adoc[]
In parts xref:01_basic_config.adoc[one] and xref:02_filling_out_a_template.adoc[two], you saw that Pkl provides _validation_ of our configurations.
It checks syntax, types and constraints.
As you saw in the `acmecicd` example xref:02_filling_out_a_template.adoc#amending-templates[here], the template can provide informative error messages when an amending module violates a type constraint.
As you saw in the `AcmeCICD` example xref:02_filling_out_a_template.adoc#amending-templates[here], the template can provide informative error messages when an amending module violates a type constraint.
In this final part, you will see some of Pkl's techniques that are particularly relevant for writing a template.
@@ -30,7 +30,7 @@ amountLearned: Float = 13.37
duration: Duration = 30.min
bandwidthRequirementPerSecond: DataSize = 50.mb
bandwidthRequirementPerSecond: DataSize = 52.4288.mb
----
In the above, you've explicitly annotated the code with type signatures.
@@ -45,7 +45,7 @@ part = 3
hasExercises = true
amountLearned = 13.37
duration = 30.min
bandwidthRequirementPerSecond = 50.mb
bandwidthRequirementPerSecond = 52.4288.mb
----
Note how `Duration` and `DataSize` help you prevent https://en.wikipedia.org/wiki/Mars_Climate_Orbiter[unit errors] in these common (for configuration) domains.
@@ -146,7 +146,7 @@ pklTutorialPart1 {
hasExercises = true
amountLearned = 13.37
duration = 30.min
bandwidthRequirementPerSecond = 50.mb
bandwidthRequirementPerSecond = 52.4288.mb
}
pklTutorialPart2 {
name = "Filling out a Template"
@@ -154,7 +154,7 @@ pklTutorialPart2 {
hasExercises = true
amountLearned = 13.37
duration = 30.min
bandwidthRequirementPerSecond = 50.mb
bandwidthRequirementPerSecond = 52.4288.mb
}
pklTutorialPart3 {
name = "Writing a Template"
@@ -162,12 +162,12 @@ pklTutorialPart3 {
hasExercises = true
amountLearned = 13.37
duration = 30.min
bandwidthRequirementPerSecond = 50.mb
bandwidthRequirementPerSecond = 52.4288.mb
}
----
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorial.pkl`.
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorialPart3.pkl`.
It creates a separate `class TutorialPart` and instantiates three properties with it (`pklTutorialPart1`, `pklTutorialPart2` and `pklTutorialPart3`).
In doing so, it implicitly moves everything "down" one level (`pklTutorialPart3` is now a property in the module `pklTutorialParts`, whereas above, in `pklTutorialPart3.pkl` it was its own module).
This is not very DRY.
@@ -199,7 +199,7 @@ amountLearned: Float = 13.37 // <2>
duration: Duration = 30.min // <2>
bandwidthRequirementPerSecond: DataSize = 50.mb // <2>
bandwidthRequirementPerSecond: DataSize = 52.4288.mb // <2>
----
<1> No default value given.
<2> Default value given.
@@ -239,7 +239,7 @@ part = 3
hasExercises = true
amountLearned = 13.37
duration = 30.min
bandwidthRequirementPerSecond = 50.mb
bandwidthRequirementPerSecond = 52.4288.mb
----
@@ -256,13 +256,13 @@ By "precisely" we mean, that amending an object also can't "turn it into" an ins
== A new template
Now that you know about types, you can start writing your first template.
So far, you've written configurations with Pkl, either without a template, or using a template on Pkl Hub.
So far, you've written configurations with Pkl, either without a template, or using the `AcmeCICD` template from xref:02_filling_out_a_template.adoc#amending-templates[Amending templates].
It is often easiest to first write a (typical) configuration for which you want to create a template.
Suppose you want to define what a live workshop for this tutorial looks like.
Consider this example:
[source,{pkl}]
.workshop2023.pkl
.workshop2024.pkl
----
title = "Pkl: Configure your Systems in New Ways"
interactive = true
@@ -278,7 +278,7 @@ duration = 1.5.h
event {
name = "Migrating Birds between hemispheres"
year = 2023
year = 2024
}
instructors {
@@ -288,11 +288,11 @@ instructors {
sessions {
new {
date = "8/14/2023"
date = "2/1/2024"
time = 30.min
}
new {
date = "8/15/2023"
date = "2/1/2024"
time = 30.min
}
}
@@ -304,17 +304,17 @@ assistants {
agenda {
["beginners"] {
title = "Basic Configuration"
name = "Basic Configuration"
part = 1
duration = 45.min
}
["intermediates"] {
title = "Filling out a Template"
name = "Filling out a Template"
part = 2
duration = 45.min
}
["experts"] {
title = "Writing a Template"
name = "Writing a Template"
part = 3
duration = 45.min
}

View File

@@ -1,15 +1,31 @@
= CLI
include::ROOT:partial$component-attributes.adoc[]
:uri-homebrew: https://brew.sh
:uri-pkl-macos-download: {github-releases}/pkl-cli-macos-{pkl-artifact-version}.bin
:uri-pkl-linux-amd64-download: {github-releases}/pkl-cli-linux-amd64-{pkl-artifact-version}.bin
:uri-pkl-linux-aarch64-download: {github-releases}/pkl-cli-linux-aarch64-{pkl-artifact-version}.bin
:uri-pkl-alpine-download: {github-releases}/pkl-cli-alpine-amd64-{pkl-artifact-version}.bin
:uri-pkl-java-download: {github-releases}/pkl-cli-java-{pkl-artifact-version}.jar
:uri-sonatype-snapshot-download: https://s01.oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.pkl-lang&v={pkl-artifact-version}
:uri-pkl-macos-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-amd64&e=bin
:uri-pkl-macos-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-aarch64&e=bin
:uri-pkl-linux-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-amd64&e=bin
:uri-pkl-linux-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-aarch64&e=bin
:uri-pkl-alpine-download: {uri-sonatype-snapshot-download}&a=pkl-cli-alpine-linux-amd64&e=bin
:uri-pkl-windows-download: {uri-sonatype-snapshot-download}&a=pkl-cli-windows-amd64&e=exe
:uri-pkl-java-download: {uri-sonatype-snapshot-download}&a=pkl-cli-java&e=jar
ifdef::is-release-version[]
:uri-pkl-macos-amd64-download: {github-releases}/pkl-macos-amd64
:uri-pkl-macos-aarch64-download: {github-releases}/pkl-macos-aarch64
:uri-pkl-linux-amd64-download: {github-releases}/pkl-linux-amd64
:uri-pkl-linux-aarch64-download: {github-releases}/pkl-linux-aarch64
:uri-pkl-alpine-download: {github-releases}/pkl-alpine-linux-amd64
:uri-pkl-windows-download: {github-releases}/pkl-windows-amd64.exe
:uri-pkl-java-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-java/{pkl-artifact-version}/pkl-cli-java-{pkl-artifact-version}.jar
endif::[]
:uri-pkl-stdlib-docs-settings: {uri-pkl-stdlib-docs}/settings/
:uri-pkl-cli-main-sources: {uri-github-tree}/pkl-cli/src/main/kotlin/org/pkl/cli
:uri-pkl-cli-CliEvaluatorOptions: {uri-pkl-cli-main-sources}/CliEvaluatorOptions.kt
:uri-certificates: {uri-github-tree}/pkl-commons-cli/src/main/resources/org/pkl/commons/cli/commands
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
The `pkl` command-line interface (CLI) evaluates Pkl modules and writes their output to the console or a file.
For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
@@ -20,12 +36,13 @@ For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
The CLI comes in multiple flavors:
* Native macOS executable for amd64 (tested on macOS 10.15)
* Native Linux executable for amd64 (tested on Oracle Linux 8)
* Native Linux executable for aarch64 (tested on Oracle Linux 8)
* Native Linux executable for amd64
* Native Linux executable for aarch64
* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)
* Java executable (tested with Java 8/11/14 on macOS and Oracle Linux)
* Native Windows executable for amd64 (tested on Windows Server 2022)
* Java executable (tested with Java 17/21 on macOS and Oracle Linux)
On macOS and Linux, we recommend using the native executables.
On macOS, Linux, and Windows, we recommend using the native executables.
They are self-contained, start up instantly, and run complex Pkl code much faster than the Java executable.
.What is the Difference Between the Linux and Alpine Linux Executables?
@@ -36,38 +53,37 @@ whereas, the Alpine Linux executable is statically linked against _musl libc_ an
====
The Java executable works on multiple platforms and has a smaller binary size than the native executables.
However, it requires a Java 8 (or higher) runtime on the system path, has a noticeable startup delay,
However, it requires a Java 17 (or higher) runtime on the system path, has a noticeable startup delay,
and runs complex Pkl code slower than the native executables.
All flavors are built from the same codebase and undergo the same automated testing.
Except where noted otherwise, the rest of this page discusses the native executables.
//TODO uncomment this after brew formula is merged and available
// [[homebrew]]
// === Homebrew
//
// Release versions can be installed with {uri-homebrew}[Homebrew].
//
// ifdef::is-release-version[]
// To install Pkl, run:
//
// [source,shell]
// ----
// brew install pkl
// ----
//
// To update Pkl, run:
//
// [source,shell]
// ----
// brew update
// brew upgrade pkl # or just `brew upgrade`
// ----
// endif::[]
//
// ifndef::is-release-version[]
// For instructions, switch to a release version of this page.
// endif::[]
[[homebrew]]
=== Homebrew
On macOS and Linux, release versions can be installed with {uri-homebrew}[Homebrew].
ifdef::is-release-version[]
To install Pkl, run:
[source,shell]
----
brew install pkl
----
To update Pkl, run:
[source,shell]
----
brew update
brew upgrade pkl # or just `brew upgrade`
----
endif::[]
ifndef::is-release-version[]
For instructions, switch to a release version of this page.
endif::[]
[[download]]
=== Download
@@ -76,17 +92,29 @@ Development and release versions can be downloaded and installed manually.
=== macOS Executable
On aarch64:
[source,shell]
[subs="+attributes"]
----
curl -o pkl {uri-pkl-macos-download}
curl -L -o pkl '{uri-pkl-macos-aarch64-download}'
chmod +x pkl
./pkl --version
----
On amd64:
[source,shell]
[subs="+attributes"]
----
curl -L -o pkl '{uri-pkl-macos-amd64-download}'
chmod +x pkl
./pkl --version
----
This should print something similar to:
[source,shell]
[source]
[subs="+attributes"]
----
Pkl {pkl-version} (macOS, native)
@@ -98,30 +126,29 @@ Pkl {pkl-version} (macOS, native)
The Linux executable is dynamically linked against _glibc_ and _libstdc{plus}{plus}_ for the amd64 and aarch64 architectures.
For a statically linked executable, see <<Alpine Linux Executable>>.
On amd64:
[source,shell]
[subs="+attributes"]
----
# on amd64
curl -o pkl {uri-pkl-linux-amd64-download}
chmod +x pkl
./pkl --version
----
On aarch64:
[source,shell]
[subs="+attributes"]
----
curl -o pkl {uri-pkl-linux-aarch64-download}
curl -L -o pkl '{uri-pkl-linux-aarch64-download}'
chmod +x pkl
./pkl --version
----
On amd64:
[source,shell]
[subs="+attributes"]
----
curl -L -o pkl '{uri-pkl-linux-amd64-download}'
chmod +x pkl
./pkl --version
----
This should print something similar to:
[source,shell]
[source]
[subs="+attributes"]
----
Pkl {pkl-version} (Linux, native)
@@ -136,14 +163,14 @@ For a dynamically linked executable, see <<Linux Executable>>.
[source,shell]
[subs="+attributes"]
----
curl -o pkl {uri-pkl-alpine-download}
curl -L -o pkl '{uri-pkl-alpine-download}'
chmod +x pkl
./pkl --version
----
This should print something similar to:
[source,shell]
[source]
[subs="+attributes"]
----
Pkl {pkl-version} (Linux, native)
@@ -151,12 +178,33 @@ Pkl {pkl-version} (Linux, native)
NOTE: We currently do not support the aarch64 architecture for Alpine Linux.
[[windows-executable]]
=== Windows Executable
[source,PowerShell]
[subs="+attributes"]
----
Invoke-WebRequest '{uri-pkl-windows-download}' -OutFile pkl.exe
.\pkl --version
----
This should print something similar to:
[source]
[subs="+attributes"]
----
Pkl {pkl-version} (Windows 10.0, native)
----
NOTE: We currently do not support the aarch64 architecture for Windows.
[[java-executable]]
=== Java Executable
[source,shell]
[subs="+attributes"]
----
curl -o jpkl {uri-pkl-java-download}
curl -L -o jpkl '{uri-pkl-java-download}'
chmod +x jpkl
./jpkl --version
----
@@ -166,9 +214,12 @@ This should print something similar to:
[source,shell]
[subs="+attributes"]
----
Pkl {pkl-version} (macOS 10.16, Java 11.0.9)
Pkl {pkl-version} (macOS 14.2, Java 17.0.10)
----
NOTE: The Java executable does not work as an executable file on Windows.
However, it will work as a jar, for example, with `java -jar jpkl`.
[[usage]]
== Usage
@@ -319,7 +370,7 @@ The following command prints `Pigeon` to the console:
[source,shell]
----
pkl -x metadata.name pigeon.pkl
pkl eval -x metadata.species pigeon.pkl
# => Pigeon
----
@@ -333,7 +384,7 @@ metadata {
}
output {
text = metadata.name.toString()
text = metadata.species.toString()
}
----
====
@@ -343,7 +394,7 @@ This command also takes <<common-options, common options>>.
[[command-server]]
=== `pkl server`
*Synopsys:* `pkl server`
*Synopsis:* `pkl server`
Run as a server that communicates over standard input/output.
@@ -352,7 +403,7 @@ This option is used for embedding Pkl in an external client, such as xref:swift:
[[command-test]]
=== `pkl test`
*Synopsys:* `pkl test [<options>] [<modules>]`
*Synopsis:* `pkl test [<options>] [<modules>]`
Evaluate the given `<modules>` as _tests_, producing a test report and appropriate exit code.
@@ -387,7 +438,7 @@ This command also takes <<common-options, common options>>.
[[command-repl]]
=== `pkl repl`
*Synopsys:* `pkl repl [<options>]`
*Synopsis:* `pkl repl [<options>]`
Start a REPL session.
@@ -627,11 +678,11 @@ To load <<config.pkl,`config.pkl`>> into the REPL, run:
pkl> :load config.pkl
----
To evaluate the `bird.name` property, run:
To evaluate the `bird.species` property, run:
[source,shell]
----
pkl> bird.name
pkl> bird.species
"Pigeon"
----
@@ -693,7 +744,7 @@ pkl> hello
pkl> function double(n) = 2 * n
pkl> double(5)
10
pkl> class Bird { name: String }
pkl> class Bird { species: String }
pkl> new Bird { species = "Pigeon" }
{
name = ?
@@ -715,9 +766,9 @@ pkl> species
pkl> species = "Barn"
pkl> species
"Barn"
pkl> species += " Owl"
pkl> species + " Owl"
pkl> species
"Barn owl"
"Barn Owl"
----
Due to Pkl's late binding semantics, redefining a member affects dependent members:
@@ -725,9 +776,9 @@ Due to Pkl's late binding semantics, redefining a member affects dependent membe
[source,shell]
----
pkl> name = "Barn"
pkl> species = "$name Owl"
pkl> species = "\(name) Owl"
pkl> species
"Barn owl"
"Barn Owl"
pkl> name = "Elf"
pkl> species
"Elf Owl"
@@ -780,3 +831,48 @@ These certificates can be overridden via either of the two options:
Both these options will *replace* the default CA certificates bundled with Pkl. +
The CLI option takes precedence over the certificates in `~/.pkl/cacerts/`. +
Certificates need to be X.509 certificates in PEM format.
[[http-proxy]]
== HTTP Proxying
When making HTTP(s) requests, Pkl can possibly make use of an HTTP proxy.
There are two values that determine proxy settings; the proxy address and list of noproxy rules.
When determining proxy settings, Pkl will look at the following locations, in order of precedence (lowest to highest):
1. OS settings (on macOS, Windows, and GNOME environments)
2. <<settings-file,Settings file>>
3. xref:language-reference:index.adoc#projects[PklProject file]
4. `--http-proxy` and `--http-no-proxy` CLI flags
[NOTE]
====
The proxy and noproxy values are individually set.
For example, using the `--http-no-proxy` flag but not the `--http-proxy` flag will cause Pkl to look at the PklProject file, then the settings file, then system settings for the proxy address.
One exception to this rule is that setting a proxy address will cause Pkl to ignore any noproxy values set at the OS level.
====
Pkl only supports HTTP proxies, so neither HTTPS nor SOCKS proxies are supported.
Pkl does not support authentication with a proxy.
When specifying a proxy address, it must have scheme `http`, and may not contain anything other than a host and port.
=== Proxy exclusions
Pkl can be configured to bypass the proxy for specific requests via a proxy exclusion rule (i.e. the `--http-no-proxy` flag).
It may be provided either as a hostname, an IP address, or an IP range via https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
When determining whether a proxy should be excluded, hostnames do not get resolved to their IP address.
For example, a request to `localhost` will not match `--http-no-proxy=127.0.0.1`.
For individual hosts (not CIDRs), ports can be specified.
When no port is specified for a given host, connections to all ports bypass the proxy.
A hostname will match all of its subdomains.
For example, `example.com` will match `foo.example.com`, and `bar.foo.example.com`, but not `fooexample.com`.
The value `*` is a special wildcard that matches all hosts.
A port can optionally be specified. If omitted, it matches all ports.
NOTE: Pkl follows the rules described in https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/#standardizing-no_proxy[Standardizing `no_proxy`], except it does not look at environment variables.

View File

@@ -32,7 +32,7 @@ The cache directory for storing packages.
.--no-cache
[%collapsible]
====
Disable cacheing of packages.
Disable caching of packages.
====
.-e, --env-var
@@ -122,3 +122,21 @@ Certificates need to be X.509 certificates in PEM format.
For other methods of configuring certificates, see xref:pkl-cli:index.adoc#ca-certs[CA Certificates].
====
.--http-proxy
[%collapsible]
====
Default: (none) +
Example: `\http://proxy.example.com:1234` +
Configures HTTP connections to connect to the provided proxy address.
The URI must have scheme `http`, and may not contain anything other than a host and port.
====
.--http-no-proxy
[%collapsible]
====
Default: (none) +
Example: `example.com,169.254.0.0/16` +
Comma separated list of hosts to which all connections should bypass the proxy.
Hosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
====

View File

@@ -2,7 +2,7 @@
include::ROOT:partial$component-attributes.adoc[]
:uri-pkl-core-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-core
:uri-pkl-core-main-sources: {uri-github-tree}/pkl-core/src/main/java/org/pkl/core
:uri-pkl-core-test-sources: {uri-github-tree}/pkl-core/src/test/java/org/pkl/core
:uri-pkl-core-test-sources: {uri-github-tree}/pkl-core/src/test/kotlin/org/pkl/core
:uri-pkl-core-Evaluator: {uri-pkl-core-main-sources}/Evaluator.java
:uri-pkl-core-PModule: {uri-pkl-core-main-sources}/PModule.java
:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java
@@ -22,7 +22,7 @@ The library can also be used to embed Pkl in Java libraries and applications.
== Installation
The _pkl-core_ library is available {uri-pkl-core-maven-module}[from Maven Central].
It requires Java 11 or higher.
It requires Java 17 or higher.
=== Gradle
@@ -30,36 +30,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-core:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-core:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-core:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-core:{pkl-artifact-version}"
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
====
@@ -76,7 +82,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-core</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>

View File

@@ -74,7 +74,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the _Gradle Plugin_
=== Java Library
The `pkl-doc` library is available {uri-pkl-doc-maven}[from Maven Central].
It requires Java 11 or higher.
It requires Java 17 or higher.
ifndef::is-release-version[]
NOTE: Snapshots are published to repository `{uri-sonatype}`.
@@ -86,36 +86,42 @@ To use the library in a Gradle project, declare the following dependency:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
compile "org.pkl-lang:pkl-doc:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
implementation("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
dependencies {
implementation "org.pkl-lang:pkl-doc:{pkl-artifact-version}"
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
====
@@ -132,7 +138,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-doc</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>

View File

@@ -21,7 +21,7 @@ That is, plugin version `x.y.z` uses Pkl version `x.y.z`.
== Installation
The Gradle plugin is available {uri-pkl-gradle-maven-module}[from Maven Central].
It requires Java 11 or higher and Gradle 6.8 or higher.
It requires Java 17 or higher and Gradle 8.1 or higher.
Earlier Gradle versions are not supported.
ifndef::is-release-version[]
@@ -32,31 +32,6 @@ The plugin is applied as follows:
[tabs]
====
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
plugins {
id "org.pkl-lang" version "{pkl-artifact-version}"
}
----
+
.settings.gradle
[source,groovy,subs="+attributes"]
----
pluginManagement {
repositories {
ifdef::is-release-build[]
mavenCentral()
endif::[]
ifndef::is-release-build[]
maven { url "{uri-sonatype}" }
endif::[]
}
}
----
Kotlin::
+
.build.gradle.kts
@@ -72,11 +47,36 @@ plugins {
----
pluginManagement {
repositories {
ifdef::is-release-build[]
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-build[]
maven { url = uri("{uri-sonatype}") }
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
}
----
Groovy::
+
.build.gradle
[source,groovy,subs="+attributes"]
----
plugins {
id "org.pkl-lang" version "{pkl-artifact-version}"
}
----
+
.settings.gradle
[source,groovy,subs="+attributes"]
----
pluginManagement {
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
}
@@ -626,7 +626,7 @@ Default: `false` +
Whether to ignore expected example files and generate them again.
====
Common propeties:
Common properties:
include::../partials/gradle-common-properties.adoc[]
@@ -688,6 +688,6 @@ Example: `projectDirectories.from(file("pkl-config/""))` +
The project directories to create packages for.
====
Common propeties:
Common properties:
include::../partials/gradle-common-properties.adoc[]

View File

@@ -36,4 +36,54 @@ Example: `generateSpringBootConfig = true` +
Whether to generate config classes for use with Spring Boot.
====
.renames: MapProperty<String, String>
[%collapsible]
====
Default: `[:]` +
Example: `renames = ["foo.": "com.example.foo.", "bar.Config": "com.example.bar.Config"]` +
Allows to change default class and package names (derived from Pkl module names) in the generated code.
When you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.
When you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.
The prefixes are replaced literally, which means that dots at the end are important.
If you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:
----
// Assuming the following mapping configuration:
renames = [
"com.foo.": "x", // Dot on the left only
"org.bar": "y.", // Dot on the right only
"net.baz": "z" // No dots
]
// The following renames will be made:
"com.foo.bar" -> "xbar" // Target prefix merged into the suffix
"org.bar.baz" -> "y..baz" // Double dot, invalid name
"net.baz.qux" -> "z.qux" // Looks okay, but...
"net.bazqux" -> "zqux" // ...may cut the name in the middle.
----
When computing the appropriate target name, the longest matching prefix is used:
----
// Assuming the following mapping configuration:
renames = [
"com.foo.Main": "w.Main",
"com.foo.": "x.",
"com.": "y.",
"": "z."
]
// The following renames will be made:
com.foo.Main -> w.Main
com.foo.bar -> x.bar
com.baz.qux -> y.baz.qux
org.foo.bar -> z.org.foo.bar
----
Keys in this mapping can be arbitrary strings, including an empty string.
Values must be valid dot-separated fully qualifed class name prefixes, possibly terminated by a dot.
====
// TODO: fixme (implementSerializable)

View File

@@ -72,7 +72,7 @@ If `null`, defaults to `~/.pkl/cache`.
[%collapsible]
====
Default: `false` +
Disable cacheing of packages.
Disable caching of packages.
====
.modulePath: ConfigurableFileCollection
@@ -83,3 +83,21 @@ Example: `modulePath.from files("dir1", "zip1.zip", "jar1.jar")` +
The directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.
Relative paths are resolved against the project directory.
====
.proxy: Property<URI>
[%collapsible]
====
Default: `null` +
Example: `proxy = uri("http://proxy.example.com:1234")` +
Configures HTTP connections to connect to the provided proxy address.
The URI must have scheme `http`, and may not contain anything other than a host and port.
====
.noProxy: ListProperty<String>
[%collapsible]
====
Default: `null` +
Example: `noProxy = ["example.com", "169.254.0.0/16"]` +
Hosts to which all connections should bypass the proxy.
Hosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
====

View File

@@ -1,8 +1,11 @@
= Pkl 0.25 Release Notes
:version: 0.25
:version-minor: 0.25.0
:version-minor: 0.25.1
:release-date: February 1st, 2024
This is the first release of Pkl!
Pkl {version} was released on {release-date}. +
[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#
To learn more, refer to our xref:blog:introducing-pkl.adoc[blog post].
This is the initial release of Pkl, a programming language for creating configuration.
To learn more about Pkl, refer to our xref:blog:ROOT:introducing-pkl.adoc[blog post].

View File

@@ -0,0 +1,523 @@
= Pkl 0.26 Release Notes
:version: 0.26
:version-minor: 0.26.2
:release-date: June 17th, 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 Windows support, improvements to controlling how Pkl talks over HTTP, and also fixes a scoping bug around typealiases.
The next release (0.27) is scheduled for October 10th, 2024.
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.
[[windows-support]]
=== Windows Support
Pkl is now available on Windows! (https://github.com/apple/pkl/pull/492[#492])
In addition to macOS and Linux, Pkl is now available for download on Windows operating systems.
For installation instructions, consult xref:pkl-cli:index.adoc#windows-executable[Windows Executable] in the CLI reference.
==== Writing cross-platform Pkl programs
On Windows, the in-language filepath separator is still `/`.
This means that most existing Pkl code should still continue working as-is.
A small portion of programs will need to be updated to handle Windows support correctly.
One example is the various conversion scripts that read input files as CLI flags.
For example, here is a snippet from module https://github.com/apple/pkl-pantry/blob/d9571cdce407bb7f1687f81b945a4bfd24ce017d/packages/k8s.contrib/convert.pkl#L100C1-L103C74[k8s.contrib.convert]:
.convert.pkl#L100-L103
[source,pkl]
----
local inputUri =
if (input.startsWith(Regex(#"\w+:"#))) input // absolute URI
else if (input.startsWith("/")) "file://\(input)" // absolute file path
else "file://\(read("env:PWD"))/\(input)" // relative file path
----
On Windows, the env var `PWD` is a Windows-style path, like `C:\Foo\Bar\Baz`.
With the above logic, `inputUri` can expand to a value like `"\file://C:\Foo\Bar\Baz/input.yaml"`.
This would an invalid URI; the correct URI should be `"\file:///C:/Foo/Bar/Baz/input.yaml"`.
Here is a possible fix for this code:
[source,pkl]
----
import "pkl:platform"
local inputUri =
if (input.startsWith(Regex(#"\w+:/"#))) input
else if (input.startsWith("/")) "file://\(input)"
else
let (pwd = read("env:PWD"))
let (
path =
if (platform.current.operatingSystem.name == "Windows")
"/\(pwd)/\(input)".replaceAll("\\", "/")
else "\(pwd)/\(input)"
)
"file://\(path)"
----
To learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0006-import-paths-on-windows.adoc[SPICE-0006].
[[http-proxying]]
=== HTTP proxying
Pkl now supports proxying HTTP(S) requests (https://github.com/apple/pkl/pull/506[#506]).
For users of the CLI, Pkl will by default look for proxy settings configured within the OS when on macOS, Windows, and GNOME environments.
This can be changed by adding settings in the following locations:
1. xref:pkl-cli:index.adoc#settings-file[Settings file]
2. xref:language-reference:index.adoc#projects[PklProject file]
3. `--http-proxy` and `--http-no-proxy` CLI flags
As part of this, some changes have been made to the standard library. For details, see <<standard-library-changes,Standard Library changes>>.
Users of the Java/Kotlin bindings can specify proxy settings when building an <<http-java-client,HTTP client>>.
HTTP proxy settings are also added as new fields in the message-passing-api.
Authors of external Pkl clients are encouraged to support these new fields to provide proxy support in their libraries.
For details, see <<message-passing-api-changes,Message passing API changes>>.
To read more about the design of HTTP proxying, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0004-HTTP-Proxy-Support.adoc[SPICE-0004], and also the xref:pkl-cli:index.adoc#http-proxy[documentation].
[[scheme-agnostic-project-dependencies]]
=== Scheme-agnostic project dependencies
Improvements have been made to project dependencies (https://github.com/apple/pkl/pull/486[#486]).
A project dependency is a way to manage `package`-based modules.
It provides two uses:
1. A package can be imported through xref:language-reference:index.adoc#dependency-notation[dependency notation].
2. Conflicting versions in the transitive dependency graph are resolved.
Currently, dependencies can only be used with file-based modules.
This can be limiting in some circumstances:
1. JVM library users typically interact with Pkl by bundling Pkl files a classpath resources, and load them using `modulepath:` URIs.
2. Go library users often embed Pkl code using the https://pkg.go.dev/embed#hdr-Directives[`go:embed` directive], and load them using https://pkg.go.dev/github.com/apple/pkl-go/pkl#WithFs[`WithFs`].
This means that these users miss out on the benefits of project dependencies.
Pkl 0.26 adds support for using dependencies in any hierarchical module scheme.
This means that `modulepath:` users in Java can now declare projects and dependencies.
This also means that other custom methods of embedding modules can also use dependency notation.
[NOTE]
====
A _hierarchical_ URI is a URI whose path part starts with `/`, and in which `/` delimits path segments.
The URI `myscheme:/foo.pkl` is hierarchical, whereas the URI `myscheme:foo.pkl` is not.
====
To read more about this design, consult https://github.com/apple/pkl-evolution/tree/main/spices/SPICE-0005-scheme-agnostic-projects.adoc[SPICE-0005].
[[typealias-scoping-fix-and-change]]
=== Typealias scoping fix and change
Improvements have been made to `typealias`es (https://github.com/apple/pkl/pull/144[#144], https://github.com/apple/pkl/pull/373[#373], https://github.com/apple/pkl/pull/516[#516]).
Currently, a typealias that references a value on its enclosing module will break if used in another module.
.myModule.pkl
[source,pkl]
----
typealias StartsWithFoo = String(startsWith(foo))
foo = "foo"
----
[source,pkl]
----
import "myModule.pkl"
myStr: StartsWithFoo = "fooey"
----
This results in error:
[source]
----
Pkl Error
Cannot find property `foo`.
1 | typealias StartsWithFoo = String(startsWith(foo))
----
This is a language bug that has been fixed.
In the process of fixing this bug, we realized that the rules around variable resolution within typealiases were problematic.
Typealiases are meant to be statically defined, and shouldn't be able to see properties that can be late-bound.
Thus, a new rule is introduced: a typealias can only reference properties/methods that are `const`.
This is a breaking change. To read more about this breakage and remediation steps, reference <<typealiases-are-treated-as-const>>.
== Noteworthy [small]#🎶#
Ready when you need them.
[[pkldoc-improvements]]
=== Pkldoc improvements
The following improvements have been made to xref:pkl-doc:index.adoc[Pkldoc]:
1. The documentation for the standard library no longer shows dependent packages, because every package implicitly depends on the standard library (https://github.com/apple/pkl/pull/503[#503]).
2. If the standard library exists in the package list, it is shown first (https://github.com/apple/pkl/pull/165[#165]).
3. Fewer characters are percent-encoded. For example, the `(` and `)` characters are no longer percent-encoded (https://github.com/apple/pkl/pull/489[#489]).
[[standard-library-changes]]
=== Standard library changes
To support <<http-proxying,http proxying>>, several changes have been made to the standard library (https://github.com/apple/pkl/pull/506[#506]).
* Module `pkl.settings` has new property `http`.
* class `EvaluatorSettings` originally in `pkl.Project` has been moved to its own module.
For backwards compatibility, `pkl.Project` now has a `typealias EvaluatorSettings` pointing to the new module, but it is marked `@Deprecated`.
=== Java API Changes
[[http-java-client]]
==== HTTP Java Client
A new Java API is introduced, named `org.pkl.core.http.HttpClient` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/295[#295], https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).
This interface provides the ability to manage how Pkl makes HTTP(S) calls, including how it deals with CA certificates, as well as proxies.
This client can be passed to Pkl's evaluator using `EvaluatorBuilder` for users of pkl-core, and `ConfigEvaluatorBuilder` for users of pkl-config-java or pkl-config-kotlin.
[[http-module-key-factory]]
==== New HTTP ModuleKeyFactory
A new module key factory for HTTP(S) modules has been added (https://github.com/apple/pkl/pull/495[#495]), and can be built with `org.pkl.core.ModuleKeyFactories#http`.
The preconfigured evaluator (`org.pkl.core.EvaluatorBuilder#preconfigured`) includes this module key.
Users that build their own evaluator from scratch should add this module key factory if HTTP(S) modules are needed.
Example:
[source,diff]
----
import org.pkl.core.EvaluatorBuilder;
import org.pkl.core.module.ModuleKeyFactories;
var evaluator = EvaluatorBuilder.unconfigured()
+ .addModuleKeyFactory(ModuleKeyFactories.http) // <1>
.build();
----
<1> Add `ModuleKeyFactories.http` to the set of module key factories used by this evaluator.
If this module key factory is not added, Pkl may still make HTTP(S) requests if `ModuleKeyFactories.genericUrl` is included.
However, this bypasses proxy and CA certificate settings.
[[pkl-executor-changes]]
==== `pkl-executor` changes
A new set of parameters are now available to `org.pkl.executor.Executor` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/518[#518]).
These new parameters are exposed by `org.pkl.executor.spi.v1.ExecutorSpiOptions2`.
The new parameters are:
* `certificateFiles`: A set of CA certificate files to trust when making HTTPS requests.
* `certificateBytes`: A set of PEM-encoded CA certificate bytes to trust when making HTTPS requests.
* `testPort`: An option that is used for internal testing only.
These options are ignored when using a Pkl distribution whose version is lower than 0.26.0.
[[message-passing-api-changes]]
=== Message passing API changes
A new property, `http`, is added to xref:bindings-specification:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request] (https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).
This allows for the configuration of Pkl's HTTP proxy, as well as CA certificates.
[[rename-codegen-classes]]
=== Ability to rename classes produced by Java/Kotlin code generators
The Java and Kotlin code generators have a new option that allows users to change the name of Java/Kotlin classes that get produced during code generation (https://github.com/apple/pkl/pull/499[#499]).
The CLIs have a new flag, `--rename`, and the Gradle plugin receives a similarly named property called `renames`.
This option accepts a map from an old prefix to a new prefix, where longer prefixes have higher precedence than shorter prefixes.
For example, when generating `module foo.Bar`, specifying `--rename foo.=com.foo.` will cause the Java/Kotlin code generators to emit package `com.foo`, and class `Bar`.
== Breaking Changes [small]#💔#
Things to watch out for when upgrading.
[[typealiases-are-treated-as-const]]
=== Typealiases are treated as `const`
A breaking change has been made to typealiases (https://github.com/apple/pkl/pull/516[#516]).
Typealiases are types that can stand in for another type declaration.
The aliased type can have constraints, where these constraints can reference values defined on the enclosing module.
.baseModule.pkl
[source,pkl]
----
typealias MyValue = Any(isValid) // <1>
isValid = true
----
<1> `isValid` is defined on the enclosing module.
One problem with this is that typealiases are meant to be statically defined.
Like classes, typealiases should not be changed by amending its enclosing module.
[source,pkl]
----
amends "baseModule.pkl"
isValid = false // <1>
----
<1> Despite this amended value, `typealias MyValue` should still stand for `Any(true)`.
To have clearer semantics, a new rule is introduced: referenced members on the enclosing module must be `const`.
Effectively, a typealias is treated as if it is also a `const` member.
To fix the above typealias, the `const` modifier should be added to `isValid`.
[source,diff]
----
typealias MyValue = Any(isValid)
-isValid = true
+const isValid = true
----
It might not always be valid to add the `const` modifier.
For example, this property may be overwritten in a downstream module, so adding the `const` modifier this would break that module.
In these cases, another fix is to self-import the enclosing module.
This works because import declarations introduce values that are implicitly marked `const`.
.baseModule.pkl
[source,diff]
----
+import "baseModule.pkl" // <1>
+
-typealias MyValue = Any(isValid)
+typealias MyValue = Any(baseModule.isValid)
isValid = true
----
<1> Self import
This change aligns with the behavior of class and annotation bodies.
To read more about the rationale behind this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0007-const-checks-in-typealiases.adoc[SPICE-0007].
[[expanded-dependency-notation-uris]]
=== Expanded dependency notation URIs
The parsing of relative path imports has changed (https://github.com/apple/pkl/pull/486[#486]).
Currently, the declaration `import "@foo/bar.pkl"` is treated as the import of a dependency named `foo`, but _only_ when declared within file-based and package-based modules.
In an HTTP-based module, for example, the above import is treated as "bar.pkl inside directory @foo".
To <<scheme-agnostic-project-dependencies,improve project dependencies>>, such declarations are treated as dependency notation in all modules, and will fail with error "Cannot find dependency".
Any import/reads that are intentionally relative-path imports will need to be updated to be prefixed with `./`.
Example:
[source,diff]
----
-import "@bar/foo.pkl"
+import "./@bar/foo.pkl"
----
[[minimum-java-version-bump]]
=== Minimum Java version bumped to Java 17
The minimum Java version for Pkl has been bumped to Java 17 (https://github.com/apple/pkl/pull/439[#439]).
This means that when running the xref:pkl-cli:index.adoc#java-executable[jpkl] CLI, the installed `java` is expected to be Java 17 or higher.
This also means that users of the JVM libraries need to be on at least Java 17 or higher.
[[minimum-gradle-version-bump]]
=== Gradle plugin minimum version bump
The minimum Gradle version for the xref:main:pkl-gradle:index.adoc[Gradle plugin] is now 8.1 (https://github.com/apple/pkl/pull/454[#454]).
[[path-encoding-changes]]
=== Path encoding changes
In order to support Windows, the output of some Pkl tools have unsafe characters encoded in a special format (https://github.com/apple/pkl/pull/489[#489]).
On Windows, the characters `<`, `>`, `:`, `"`, `\`, `|`, `?`, and `*` are reserved and cannot exist in a filename.
Additionally, the ASCII control character code points `0x0` through `0x1f` are also illegal.
These characters are encoded by wrapping their hexadecimal code point value in parentheses.
For example, the character `:` is encoded as `(3a)`.
In some scenarios, files that get written to disk will be encoded.
These are:
* Files generated by Pkldoc.
* `*.kt` files produced by the Kotlin code generator.
* Packages written to the cache directory.
To learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0003-windows-safe-paths.adoc[SPICE-0003].
==== Pkldoc links changes
The links generated by Pkldoc have changed.
For example, a module called `module `foo<bar`` creates file `foo(3c)bar.html`, instead of `foo<bar.html`.
As part of this change, some Pkldoc links have also changed.
==== Cache directory prefix changes
The cache directory has been changed from `<moduleCacheDir>/package-1` to `<moduleCacheDir>/package-2`.
If Pkl's dependencies are vendored within a repository, these dependencies will need to be re-vendored.
=== Java API Breaking Changes
The following Java APIs have breaking changes:
|===
|Class/method | Breaking change
|`org.pkl.cli.commands.CliDownloadPackageCommand`
|Renamed to `org.pkl.cli.commands.CliPackageDownloader`
|`org.pkl.cli.commands.CliAbstractProjectCommand`
|Renamed to `org.pkl.cli.commands.CliProjectCommand`
|`org.pkl.config.java.InvalidMappingException`
|Fields `pklName` and `javaName` are now `private`.
|`org.pkl.core.packages.PackageResolver#getInstance`
|New parameter `httpClient` added
|`org.pkl.core.repl.ReplServer.ReplServer`
|New parameter `httpClient` added
|`org.pkl.commons.cli.CliBaseOptions`
|New parameters `testPort`, `httpProxy`, `httpNoProxy` added
|===
[[standard-library-breaking-changes]]
=== Standard library breaking changes
Class `pkl.Project.EvaluatorSettings` has been removed.
A new (deprecated) typealias is added that points to new module `pkl.EvaluatorSettings`.
For both of these, see https://github.com/apple/pkl/pull/506[#506].
[[type-checked-settings-file]]
=== Type-checked settings file
The loading of the xref:pkl-cli:index.adoc#settings-file[settings file] has changed (https://github.com/apple/pkl/pull/477[#477]).
The settings file is a way to control the behavior of the Pkl CLI.
This module is expected to `amends "pkl:settings"`, but this behavior was not checked.
In 0.26, it is an error if the settings module neither amends `"pkl:settings"`, nor set its `output.value` to an instance of the settings module.
[[empty-directories-excluded-from-packaging]]
=== Empty directories excluded from packaging
Currently, the `pkl project package` command will bundle empty directories into the resulting ZIP file.
In version 0.26, this has been changed to exclude these directories (https://github.com/apple/pkl/pull/330[#330]).
This means that the packages can produce a _different_ checksum if there are any empty directories.
This does not break the usage of existing packages, and does not affect compatibility of new packages used with older Pkl 0.25.
However, this can break certain workflows.
The `pkl project package` command runs a publish check, to determine if a package has already been published but with a different checksum.
When upgrading, users might encounter an error message like the following:
[source]
----
-- Pkl Error --
Package `package://example.com/foo@1.0.0` was already published with different contents.
----
To mitigate, the package's version needs to be bumped, even if package contents have not changed.
== Miscellaneous [small]#🐸#
The following changes have been made that are not new features, nor breaking changes.
* Pkl's user-agent header for HTTP requests has been tweaked to add a semicolon (https://github.com/apple/pkl/pull/221[#221]). Here is an example difference:
+
Before: `Pkl/0.26 (macOS native)` +
After: `Pkl/0.26 (macOS; native)`
* Documentation improvements (https://github.com/apple/pkl/pull/120[#120], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/142[#142], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/337[#337], https://github.com/apple/pkl/pull/341[#341], https://github.com/apple/pkl/pull/372[#372], https://github.com/apple/pkl/pull/386[#386], https://github.com/apple/pkl/pull/391[#391], https://github.com/apple/pkl/pull/397[#397], https://github.com/apple/pkl/pull/422[#422], https://github.com/apple/pkl/pull/436[#436], https://github.com/apple/pkl/pull/469[#469], https://github.com/apple/pkl/pull/484[#484], https://github.com/apple/pkl/pull/485[#485], https://github.com/apple/pkl/pull/[#491]).
* Optimization: `const` access is checked when variables are resolved, instead of every time the variable is accessed (https://github.com/apple/pkl/pull/438[#438]).
* Optimization: use logical AND instead of bitwise AND when comparing numbers (https://github.com/apple/pkl/pull/102[#102]).
* Mark Java classes `final` (https://github.com/apple/pkl/pull/458[#458]).
* Migrate code to newer JDK17 features, and clean up existing Java code (https://github.com/apple/pkl/pull/451[#451], https://github.com/apple/pkl/pull/458[#458], https://github.com/apple/pkl/pull/512[#512]).
* Improve rendering of string values within generated `<file>.pkl-expected.pcf` files when running `pkl test` (https://github.com/apple/pkl/pull/416[#416]).
* Improve performance of loading Pkl's built-in CA certificates (https://github.com/apple/pkl/pull/518[#518]).
== Bug Fixes [small]#🐜#
The following bugs have been fixed.
* `Collection#sortWith` produces un-sorted output (https://github.com/apple/pkl/pull/394[#394]).
* Property `typedType` in module `pkl.reflect` reflects upon `Type`, instead of `Typed` (https://github.com/apple/pkl/pull/426[#426]).
* `const` members can be assigned to when via an object spread (https://github.com/apple/pkl/pull/428[#428]).
* Relative globbed reads resolve to the same value in different modules (https://github.com/apple/pkl/pull/449[#449]).
* Performance bug: globbed imports and globbed reads expand to an unbounded number of root nodes (https://github.com/apple/pkl/pull/449[#449]).
* Relative globbed imports within a package match no modules (https://github.com/apple/pkl/pull/496[#496]).
* Constraints within typealiases resolve to the wrong values (https://github.com/apple/pkl/pull/144[#144]).
* Members of `pkl.reflect` cannot be rendered (https://github.com/apple/pkl/pull/170[#170], https://github.com/apple/pkl/pull/470[#470]).
* Throws `NullPointerException` if "List Resources Response" or "List Modules Response" messages contain both null `pathElements` and `error` (https://github.com/apple/pkl/pull/480[#480]).
* Classes of `com.oracle.truffle` are not shaded in pkl-config-java-all and pkl-tools (https://github.com/apple/pkl/pull/238[#238]).
* Throws `PklBugException` when running publish check on an invalid URL (https://github.com/apple/pkl/pull/441[#441]).
== Contributors [small]#🙏#
We would like to thank the contributors to this release (in alphabetical order):
* https://github.com/flyinprogrammer[@flyinprogrammer]
* https://github.com/fumiya-kume[@fumiya-kume]
* https://github.com/garysassano[@garysassano]
* https://github.com/HT154[@HT154]
* https://github.com/hoxell[@hoxell]
* https://github.com/jw-y[@jw-y]
* https://github.com/KushalP[@KushalP]
* https://github.com/lilyball[@lilyball]
* https://github.com/luuvish[@luuvish]
* https://github.com/Malix-off[@Malix-off]
* https://github.com/manuelsblanco[@manuelsblanco]
* https://github.com/MarkSRobinson[@MarkSRobinson]
* https://github.com/mitchcapper[@mitchcapper]
* https://github.com/mrs1669[@mrs1669]
* https://github.com/netvl[@netvl]
* https://github.com/nirinchev[@nirinchev]
* https://github.com/raj-j-shah[@raj-j-shah]
* https://github.com/sgammon[@sgammon]
* https://github.com/StefMa[@StefMa]
* https://github.com/stefanobaghino[@stefanobaghino]
* https://github.com/TimeTravelPenguin[@TimeTravelPenguin]
* https://github.com/TheFruxz[@TheFruxz]
* https://github.com/translatenix[@translatenix]
* https://github.com/zihluwang[@zihluwang]
A special thank-you goes out to https://github.com/translatenix[@translatenix]!
They submitted multiple bug fixes, improved the quality of the codebase, and provided HTTP improvements.

View File

@@ -1,8 +1,115 @@
= Changelog
include::ROOT:partial$component-attributes.adoc[]
[[release-0.26.2]]
== 0.26.2 (2024-07-18)
=== Fixes
* Fixes a possible race condition where multiple concurrent Pkl evaluations results in a thrown exception when downloading packages (https://github.com/apple/pkl/pull/584[#584]).
[[release-0.26.1]]
== 0.26.1 (2024-06-28)
=== Fixes
* Fixes a regression where native executables fail to run on some environments that don't support newer CPU features (https://github.com/apple/pkl/pull/551[#551]).
* Fixes a `PklBugException` when passing `.` as a project directory to `pkl project resolve` and `pkl project package` (https://github.com/apple/pkl/pull/544[#544]).
=== Changes
* Disable revocation checking of TLS certificates (https://github.com/apple/pkl/pull/553[#553]).
+
As part of HTTP improvements in 0.26, we unwittingly fixed a bug where Pkl does not actually perform cert revocation checks when making HTTPS requests.
This fix, unfortunately, caused a regression in some cases.
For example, this happens when connecting to a server that bears a public trust certificate, while in an environment with no internet access.
This is because the HTTP client needs to check the revocation status of all certificates in the chain.
+
Revocation checks are a nuanced topic with some benefits, and also with its own problem areas.
For this reason, revocation checking is disabled for Pkl's native CLIs.
Users of Pkl's Java APIs will respect the revocation settings set in the JVM.
[[release-0.26.0]]
== 0.26.0 (2024-06-17)
xref:0.26.adoc[Release notes]
[[release-0.25.3]]
== 0.25.3 (2024-03-26)
=== Fixes
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/357[#357], link:https://github.com/apple/pkl/pull/362[#362])
* Fixes a bug where amending a module that defines an abstract class might cause a Java `AssertionError` (link:https://github.com/apple/pkl/pull/319[#319])
* Fixes a bug where a for/when generator within a lambda declared with `new {}` syntax might not resolve variables correctly (link:https://github.com/apple/pkl/pull/297[#297])
* Fixes a bug where `const` and `local` modifiers are not exported when obtaining a class's mirror in `pkl:reflect` (link:https://github.com/apple/pkl/pull/265[#265]).
=== Miscellaneous
* Documentation improvements (link:https://github.com/apple/pkl/pull/93[#93], link:https://github.com/apple/pkl/pull/106[#106], link:https://github.com/apple/pkl/pull/143[#143], link:https://github.com/apple/pkl/pull/205[#205], link:https://github.com/apple/pkl/pull/214[#214], link:https://github.com/apple/pkl/pull/224[#224], link:https://github.com/apple/pkl/pull/257[#257], link:https://github.com/apple/pkl/pull/270[#270], link:https://github.com/apple/pkl/pull/282[#282], link:https://github.com/apple/pkl/pull/283[#283], link:https://github.com/apple/pkl/pull/299[#299], link:https://github.com/apple/pkl/pull/337[#337], link:https://github.com/apple/pkl/pull/340[#340])
* Build script improvements (link:https://github.com/apple/pkl/pull/253[#253], link:https://github.com/apple/pkl/pull/314[#314], link:https://github.com/apple/pkl/pull/333[#333], link:https://github.com/apple/pkl/pull/338[#338])
=== Changes
* Add `jpkl` to the set of artifacts released to GitHub (link:https://github.com/apple/pkl/pull/314[#314])
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/r1ft1[@r1ft1]
* link:https://github.com/WardsParadox[@WardsParadox]
* link:https://github.com/grantabbott[@grantabbott]
* link:https://github.com/mshakhmaykin[@mshakhmaykin]
* link:https://github.com/d4wae89d498[@d4wae89d498]
* link:https://github.com/KushalP[@KushalP]
* link:https://github.com/zihluwang[@zihluwang]
* link:https://github.com/Malix-off[@Malix-off]
[[release-0.25.2]]
== 0.25.2 (2024-02-08)
=== Fixes
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/70[#70],
link:https://github.com/apple/pkl/pull/81[#81], link:https://github.com/apple/pkl/pull/96[#96])
* Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73])
=== Miscellaneous
* Documentation fixes (link:https://github.com/apple/pkl/pull/21[#21], link:https://github.com/apple/pkl/pull/29[#29], link:https://github.com/apple/pkl/pull/41[#41], link:https://github.com/apple/pkl/pull/44[#44], link:https://github.com/apple/pkl/pull/51[#51], link:https://github.com/apple/pkl/pull/57[#57], link:https://github.com/apple/pkl/pull/60[#60], link:https://github.com/apple/pkl/pull/64[#64], link:https://github.com/apple/pkl/pull/68[#68], link:https://github.com/apple/pkl/pull/74[#74], link:https://github.com/apple/pkl/pull/77[#77], link:https://github.com/apple/pkl/pull/78[#78], link:https://github.com/apple/pkl/pull/82[#82], link:https://github.com/apple/pkl/pull/84[#84], link:https://github.com/apple/pkl/pull/86[#86], link:https://github.com/apple/pkl/pull/89[#89], link:https://github.com/apple/pkl/pull/91[#91], link:https://github.com/apple/pkl/pull/104[#104])
* Build script improvements (https://github.com/apple/pkl/pull/53[#53], link:https://github.com/apple/pkl/pull/83[#83])
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/uhooi[@uhooi]
* link:https://github.com/mnin[@mnin]
* link:https://github.com/TinkoLiu[@TinkoLiu]
* link:https://github.com/shufanhao[@shufanhao]
* link:https://github.com/pfeilbr[@pfeilbr]
* link:https://github.com/KadoBOT[@KadoBOT]
* link:https://github.com/KushalP[@KushalP]
* link:https://github.com/translatenix[@translatenix]
* link:https://github.com/Edward-Knight[@Edward-Knight]
* link:https://github.com/jamesward[@jamesward]
* link:https://github.com/shubhgng[@shubhgng]
* link:https://github.com/hayashikun[@hayashikun]
* link:https://github.com/lanzafame[@lanzafame]
* link:https://github.com/igmrrf[@igmrrf]
* link:https://github.com/kelvinelove[@kelvinelove]
* link:https://github.com/lilyball[@lilyball]
* link:https://github.com/maiph[@maiph]
[[release-0.25.1]]
== 0.25.1 (2024-02-01)
=== Fixes
* Fixes an issue where pkl-tools fat jar is empty.
[[release-0.25.0]]
== 0.25.0 (2024-02-01)
xref:0.25.adoc[Release notes]

View File

@@ -1,4 +1,5 @@
= Release Notes
* xref:0.26.adoc[0.26 Release Notes]
* xref:0.25.adoc[0.25 Release Notes]
* xref:changelog.adoc[Changelog]

View File

@@ -254,7 +254,7 @@ myFoo1: Foo = new Foo { foo = "bar" } // <1>
myFoo2 = new Foo { foo = "bar" } // <2>
----
<1> Unnecessary `new Foo { ... }`
<2> Unless amending/extendinge a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.
<2> Unless amending/extending a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.
== Comments
@@ -270,7 +270,7 @@ Add a single space after `///`.
[source%parsed,{pkl}]
----
/// The time alotted for eating lunch.
/// The time allotted for eating lunch.
///
/// Note:
/// * Hamburgers typically take longer to eat than salad.
@@ -300,7 +300,7 @@ A line comment may also be placed at the end of a line, as long as the line does
[source%tested,{pkl}]
----
/// Designates whether it is zebra party time.
partyTime: Booleean // TODO: Add constraints here?
partyTime: Boolean // TODO: Add constraints here?
----
=== Block comments

View File

@@ -1,19 +1,31 @@
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:language-reference:index.adoc[Language Reference]
* xref:introduction:index.adoc[Introduction]
** xref:introduction:use-cases.adoc[Use Cases]
** xref:introduction:concepts.adoc[Concepts]
** xref:introduction:comparison.adoc[Comparison]
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:ROOT:language.adoc[Language]
** xref:language-tutorial:index.adoc[Tutorial]
** xref:language-reference:index.adoc[Language Reference]
** xref:ROOT:standard-library.adoc[Standard Library]
** xref:ROOT:language-bindings.adoc[Language Bindings]
*** xref:java-binding:index.adoc[Java]
**** xref:java-binding:codegen.adoc[Code Generator]
**** xref:pkl-core:index.adoc[pkl-core Library]
**** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
*** xref:kotlin-binding:index.adoc[Kotlin]
**** xref:kotlin-binding:codegen.adoc[Code Generator]
**** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
*** xref:swift:ROOT:index.adoc[Swift]
*** xref:go:ROOT:index.adoc[Go]
*** xref:bindings-specification:index.adoc[Specification]
**** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
**** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]
* xref:ROOT:tools.adoc[Tools]
** xref:pkl-cli:index.adoc[CLI]
@@ -24,21 +36,10 @@
*** xref:vscode:ROOT:index.adoc[VSCode]
*** xref:neovim:ROOT:index.adoc[Neovim]
* xref:ROOT:language-bindings.adoc[Language Bindings]
** xref:java-binding:index.adoc[Java]
*** xref:java-binding:codegen.adoc[Code Generator]
*** xref:pkl-core:index.adoc[pkl-core Library]
*** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
** xref:kotlin-binding:index.adoc[Kotlin]
*** xref:kotlin-binding:codegen.adoc[Code Generator]
*** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
** xref:swift:ROOT:index.adoc[Swift]
** xref:go:ROOT:index.adoc[Go]
* xref:ROOT:examples.adoc[Examples]
* xref:release-notes:index.adoc[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:changelog.adoc[Changelog]

View File

@@ -25,6 +25,7 @@ import org.pkl.core.repl.ReplServer
import org.pkl.core.resource.ResourceReaders
import org.pkl.core.util.IoUtils
import org.antlr.v4.runtime.ParserRuleContext
import org.pkl.core.http.HttpClient
import java.nio.file.Files
import kotlin.io.path.isDirectory
import kotlin.io.path.isRegularFile
@@ -78,6 +79,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
override fun createExecutionContext(request: ExecutionRequest): ExecutionContext {
val replServer = ReplServer(
SecurityManagers.defaultManager,
HttpClient.dummyClient(),
Loggers.stdErr(),
listOf(
ModuleKeyFactories.standardLibrary,

View File

@@ -1,7 +1,7 @@
# suppress inspection "UnusedProperty" for whole file
group=org.pkl-lang
version=0.25.0
version=0.26.2
# google-java-format requires jdk.compiler exports
org.gradle.jvmargs= \
@@ -13,5 +13,6 @@ org.gradle.jvmargs= \
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
org.gradle.parallel=true
org.gradle.caching=true
kotlin.stdlib.default.dependency=false
#org.gradle.workers.max=1

View File

@@ -1,47 +1,53 @@
# NOTE: keep in sync with buildSrc/src/main/kotlin/Versions.kt until the latter can be removed
[versions] # ordered alphabetically
antlr = "4.+"
assertj = "3.+"
checksumPlugin = "1.2.0"
clikt = "3.5.1"
commonMark = "0.+"
downloadTaskPlugin = "4.1.2"
downloadTaskPlugin = "5.6.0"
geantyref = "1.+"
googleJavaFormat = "1.21.0"
# must not use `+` because used in download URL
graalVm = "22.3.1"
# intentionally empty; replaced by patch file when building pkl-cli macos/aarch64
graalVM23JdkVersion = "replace-me"
graalVm = "23.0.2"
graalVmJdkVersion = "17.0.10"
# slightly hacky but convenient place so we remember to update the checksum
graalVmSha256-darwin-amd64 = "325afad5f1c4a07a458c95e7c444cff63514a6afa6f2655c12b4f494dccf2228"
graalVmSha256-linux-amd64 = "55547725a8be3ceb0a1da29a84cd3e958ba398ce4470ac89a8ba1bdb6d9bddb8"
graalVmSha256-linux-aarch64 = "b46a3f9c82ac70990a62282b1fbe4474e784d9ba453839a428f88e94d21f8abc"
graalVmSha256-macos-x64 = "14f4bd6417809905f86e786c779d0fc2feb840d7dac35ae3503eb25af0530da0"
graalVmSha256-macos-aarch64 = "e944c5ce5da56e683fc8f1a57191b46d9cb702930b1688bda064fcf467d876b8"
graalVmSha256-linux-x64 = "112dc9b92d81a946f1b5b334646151b790785c813e76fcf13527a319003d7e2c"
graalVmSha256-linux-aarch64 = "c95ac550d070f06666cf8c1023a098380dd565be00866473caf6ff1b7cdf680c"
graalVmSha256-windows-x64 = "1ab2291e71f54d73e3e57b7fccbf184cabcba37e16ca9d1cf42d08474a7c02f0"
ideaExtPlugin = "1.1"
javaPoet = "1.+"
javaxInject = "1"
jansi = "2.+"
jimfs = "1.+"
jansi = "2.+"
jline = "3.+"
# 3.25.1 doesn't work with native image
jline = "3.23.0"
jmh = "1.+"
jmhPlugin = "0.6.6"
jsr305 = "3.+"
junit = "5.+"
kotlin = "1.7.10"
# 1.7+ generates much more verbose code
kotlinPoet = "1.6.+"
kotlinxHtml = "0.+"
kotlinxSerialization = "1.+"
kotlinPoet = "1.6.+"
# freeze until updating Kotlin version
kotlinxHtml = "0.8.1"
# freeze until updating Kotlin version
kotlinxSerialization = "1.5.1"
ktfmt = "0.44"
# replaces nuValidator's log4j dependency
# something related to log4j-1.2-api is apparently broken in 2.17.2
log4j = "2.17.1"
msgpack = "0.9.0"
nexusPublishPlugin = "1.3.0"
nuValidator = "20.+"
paguro = "3.+"
shadowPlugin = "7.1.0"
shadowPlugin = "8.1.1"
slf4j = "1.+"
# Breaking change in snakeYaml 2.6 (removing DumpSettingsBuilder::setScalarResolver), so pin to 2.5
snakeYaml = "2.5"
spotlessPlugin = "6.11.0"
msgpack = "0.9.0"
nexusPublishPlugin = "1.3.0"
wiremock = "3.+"
[libraries] # ordered alphabetically
antlr = { group = "com.tunnelvisionlabs", name = "antlr4", version.ref = "antlr" }
@@ -57,8 +63,8 @@ graalSdk = { group = "org.graalvm.sdk", name = "graal-sdk", version.ref = "graal
graalJs = { group = "org.graalvm.js", name = "js", version.ref = "graalVm" }
javaPoet = { group = "com.squareup", name = "javapoet", version.ref = "javaPoet" }
javaxInject = { group = "javax.inject", name = "javax.inject", version.ref = "javaxInject" }
jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" }
jansi = { group = "org.fusesource.jansi", name = "jansi", version.ref = "jansi" }
jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" }
jlineReader = { group = "org.jline", name = "jline-reader", version.ref = "jline" }
jlineTerminal = { group = "org.jline", name = "jline-terminal", version.ref = "jline" }
jlineTerminalJansi = { group = "org.jline", name = "jline-terminal-jansi", version.ref = "jline" }
@@ -67,19 +73,21 @@ junitApi = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.re
junitEngine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" }
junitParams = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" }
kotlinCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-compiler-embeddable", version.ref = "kotlin" }
kotlinScriptingCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-compiler-embeddable", version.ref = "kotlin" }
kotlinScriptUtil = { group = "org.jetbrains.kotlin", name = "kotlin-script-util", version.ref = "kotlin" }
kotlinPlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
kotlinPoet = { group = "com.squareup", name = "kotlinpoet", version.ref = "kotlinPoet" }
kotlinReflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" }
kotlinScriptingCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-compiler-embeddable", version.ref = "kotlin" }
kotlinScriptUtil = { group = "org.jetbrains.kotlin", name = "kotlin-script-util", version.ref = "kotlin" }
kotlinStdLib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlinxHtml = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-jvm", version.ref = "kotlinxHtml" }
kotlinxSerializationJson = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
log4j12Api = { group = "org.apache.logging.log4j", name = "log4j-1.2-api", version.ref = "log4j" }
msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
nuValidator = { group = "nu.validator", name = "validator", version.ref = "nuValidator" }
# to be replaced with https://github.com/usethesource/capsule or https://github.com/lacuna/bifurcan
paguro = { group = "org.organicdesign", name = "Paguro", version.ref = "paguro" }
shadowPlugin = { group = "gradle.plugin.com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
pklConfigJavaAll025 = { group = "org.pkl-lang", name = "pkl-config-java-all", version = "0.25.0" }
shadowPlugin = { group = "com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" }
slf4jSimple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
snakeYaml = { group = "org.snakeyaml", name = "snakeyaml-engine", version.ref = "snakeYaml" }
@@ -87,12 +95,12 @@ spotlessPlugin = { group = "com.diffplug.spotless", name = "spotless-plugin-grad
svm = { group = "org.graalvm.nativeimage", name = "svm", version.ref = "graalVm" }
truffleApi = { group = "org.graalvm.truffle", name = "truffle-api", version.ref = "graalVm" }
truffleDslProcessor = { group = "org.graalvm.truffle", name = "truffle-dsl-processor", version.ref = "graalVm" }
msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
wiremock = { group = "org.wiremock", name = "wiremock", version.ref = "wiremock" }
[plugins] # ordered alphabetically
checksum = { id = "org.gradle.crypto.checksum", version.ref = "checksumPlugin" }
ideaExt = { id = "org.jetbrains.gradle.plugin.idea-ext", version.ref = "ideaExtPlugin" }
jmh = { id = "me.champeau.jmh", version.ref = "jmhPlugin" }
kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" }
nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublishPlugin" }
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" }

Binary file not shown.

View File

@@ -1,5 +1,8 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

41
gradlew vendored
View File

@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/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.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,13 +80,11 @@ do
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -133,22 +131,29 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
@@ -205,6 +214,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.

181
gradlew.bat vendored
View File

@@ -1,89 +1,92 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -1,529 +0,0 @@
diff --git a/bench/gradle.lockfile b/bench/gradle.lockfile
index 0673df5..3a9d913 100644
--- a/bench/gradle.lockfile
+++ b/bench/gradle.lockfile
@@ -8,9 +8,9 @@ net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDe
org.apache.commons:commons-math3:3.2=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.compiler:compiler:22.3.1=graal
-org.graalvm.sdk:graal-sdk:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
-org.graalvm.truffle:truffle-api:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
+org.graalvm.compiler:compiler:23.0.2=graal
+org.graalvm.sdk:graal-sdk:23.0.2=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.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 73eb367..6e526b6 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -12,6 +12,6 @@ dependencies {
}
java {
- sourceCompatibility = JavaVersion.VERSION_11
- targetCompatibility = JavaVersion.VERSION_11
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
}
diff --git a/buildSrc/src/main/kotlin/pklAllProjects.gradle.kts b/buildSrc/src/main/kotlin/pklAllProjects.gradle.kts
index 4daf287..6ef0256 100644
--- a/buildSrc/src/main/kotlin/pklAllProjects.gradle.kts
+++ b/buildSrc/src/main/kotlin/pklAllProjects.gradle.kts
@@ -24,13 +24,13 @@ configurations {
plugins.withType(JavaPlugin::class).configureEach {
val java = project.extensions.getByType<JavaPluginExtension>()
- java.sourceCompatibility = JavaVersion.VERSION_11
- java.targetCompatibility = JavaVersion.VERSION_11
+ java.sourceCompatibility = JavaVersion.VERSION_17
+ java.targetCompatibility = JavaVersion.VERSION_17
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
- jvmTarget = "11"
+ jvmTarget = "17"
freeCompilerArgs = freeCompilerArgs + listOf("-Xjsr305=strict", "-Xjvm-default=all")
}
}
diff --git a/docs/gradle.lockfile b/docs/gradle.lockfile
index 196e592..e33eb75 100644
--- a/docs/gradle.lockfile
+++ b/docs/gradle.lockfile
@@ -7,8 +7,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5171a9a..6761c58 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -8,11 +8,11 @@ commonMark = "0.+"
downloadTaskPlugin = "4.1.2"
geantyref = "1.+"
# must not use `+` because used in download URL
-graalVm = "22.3.1"
-# intentionally empty; replaced by patch file when building pkl-cli macos/aarch64
-graalVM23JdkVersion = "replace-me"
+graalVm = "23.0.2"
+graalVM23JdkVersion = "17.0.9"
# slightly hacky but convenient place so we remember to update the checksum
graalVmSha256-darwin-amd64 = "325afad5f1c4a07a458c95e7c444cff63514a6afa6f2655c12b4f494dccf2228"
+graalVmSha256-macos-aarch64 = "2214b6ecb32faacc84dffcbfae930450abe77c31730c4b6310e22d8f743959a5"
graalVmSha256-linux-amd64 = "55547725a8be3ceb0a1da29a84cd3e958ba398ce4470ac89a8ba1bdb6d9bddb8"
graalVmSha256-linux-aarch64 = "b46a3f9c82ac70990a62282b1fbe4474e784d9ba453839a428f88e94d21f8abc"
ideaExtPlugin = "1.1"
diff --git a/pkl-cli/gradle.lockfile b/pkl-cli/gradle.lockfile
index 1360caa..0892665 100644
--- a/pkl-cli/gradle.lockfile
+++ b/pkl-cli/gradle.lockfile
@@ -9,13 +9,13 @@ net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.fusesource.jansi:jansi:2.4.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.compiler:compiler:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
-org.graalvm.nativeimage:native-image-base:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
-org.graalvm.nativeimage:objectfile:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
-org.graalvm.nativeimage:pointsto:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
-org.graalvm.nativeimage:svm:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
-org.graalvm.sdk:graal-sdk:22.3.1=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.compiler:compiler:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
+org.graalvm.nativeimage:native-image-base:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
+org.graalvm.nativeimage:objectfile:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
+org.graalvm.nativeimage:pointsto:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
+org.graalvm.nativeimage:svm:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
+org.graalvm.sdk:graal-sdk:23.0.2=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -26,10 +26,14 @@ 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-impl-embeddable: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,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,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,default,implementationDependenciesMetadata,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.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,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,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jline:jline-reader:3.23.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
@@ -45,4 +49,4 @@ org.msgpack:msgpack-core:0.9.0=default,runtimeClasspath,testRuntimeClasspath
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compile,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,shadow,sourcesJar,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
diff --git a/pkl-codegen-java/gradle.lockfile b/pkl-codegen-java/gradle.lockfile
index 9bf6cba..901c8d8 100644
--- a/pkl-codegen-java/gradle.lockfile
+++ b/pkl-codegen-java/gradle.lockfile
@@ -10,8 +10,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,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.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -22,10 +22,14 @@ 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-impl-embeddable: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,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,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,default,implementationDependenciesMetadata,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.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,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.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -36,4 +40,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-codegen-kotlin/gradle.lockfile b/pkl-codegen-kotlin/gradle.lockfile
index 42331c2..7974715 100644
--- a/pkl-codegen-kotlin/gradle.lockfile
+++ b/pkl-codegen-kotlin/gradle.lockfile
@@ -10,8 +10,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=default,runtimeClasspath,testRuntimeClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.7.10=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -24,10 +24,14 @@ org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspat
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
-org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
-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,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -39,4 +43,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-commons-cli/gradle.lockfile b/pkl-commons-cli/gradle.lockfile
index 6cac9f4..f603276 100644
--- a/pkl-commons-cli/gradle.lockfile
+++ b/pkl-commons-cli/gradle.lockfile
@@ -8,8 +8,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,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.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -20,10 +20,14 @@ 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-impl-embeddable: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,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,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,default,implementationDependenciesMetadata,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.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,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.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -34,4 +38,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-commons/gradle.lockfile b/pkl-commons/gradle.lockfile
index 4170e1a..0a23c04 100644
--- a/pkl-commons/gradle.lockfile
+++ b/pkl-commons/gradle.lockfile
@@ -27,4 +27,4 @@ org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImpleme
org.junit.platform:junit-platform-engine:1.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
-empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-config-java/gradle.lockfile b/pkl-config-java/gradle.lockfile
index 271ca49..3648401 100644
--- a/pkl-config-java/gradle.lockfile
+++ b/pkl-config-java/gradle.lockfile
@@ -11,8 +11,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -23,10 +23,14 @@ 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-impl-embeddable: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=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=pklCodegenJava
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=pklCodegenJava
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=pklCodegenJava
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=pklCodegenJava
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -37,4 +41,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,pklCodegenJava,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileOnly,compileOnlyDependenciesMetadata,fatJar,firstPartySourcesJars,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklCoreSourcesJar,runtime,runtimeOnlyDependenciesMetadata,shadow,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileOnly,compileOnlyDependenciesMetadata,fatJar,firstPartySourcesJars,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklCoreSourcesJar,runtime,runtimeOnlyDependenciesMetadata,shadow,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-config-kotlin/gradle.lockfile b/pkl-config-kotlin/gradle.lockfile
index 681ecdb..5c8f48b 100644
--- a/pkl-config-kotlin/gradle.lockfile
+++ b/pkl-config-kotlin/gradle.lockfile
@@ -10,8 +10,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -22,10 +22,14 @@ 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-impl-embeddable: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,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenKotlin,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-common:1.7.21=pklCodegenKotlin
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=pklCodegenKotlin
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=pklCodegenKotlin
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=pklCodegenKotlin
org.jetbrains:annotations:13.0=apiDependenciesMetadata,compileClasspath,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
@@ -36,4 +40,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklConfigJavaAll,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklConfigJavaAll,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-core/gradle.lockfile b/pkl-core/gradle.lockfile
index a4ad3ca..cf5be68 100644
--- a/pkl-core/gradle.lockfile
+++ b/pkl-core/gradle.lockfile
@@ -13,9 +13,9 @@ org.antlr:ST4:4.3=antlr
org.antlr:antlr-runtime:3.5.2=antlr
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=compileClasspath,default,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=compileClasspath,default,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.truffle:truffle-dsl-processor:22.3.1=annotationProcessor
+org.graalvm.sdk:graal-sdk:23.0.2=compileClasspath,default,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=compileClasspath,default,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.truffle:truffle-dsl-processor:23.0.2=annotationProcessor
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -41,4 +41,4 @@ org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenc
org.organicdesign:Paguro:3.10.3=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.slf4j:slf4j-api:1.7.32=compileOnly
org.snakeyaml:snakeyaml-engine:2.5=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-empty=apiDependenciesMetadata,archives,compile,generatorAnnotationProcessor,generatorApiDependenciesMetadata,generatorCompileOnly,generatorCompileOnlyDependenciesMetadata,generatorIntransitiveDependenciesMetadata,generatorKotlinScriptDef,generatorKotlinScriptDefExtensions,generatorRuntimeOnlyDependenciesMetadata,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=apiDependenciesMetadata,archives,compile,generatorAnnotationProcessor,generatorApiDependenciesMetadata,generatorCompileOnly,generatorCompileOnlyDependenciesMetadata,generatorIntransitiveDependenciesMetadata,generatorKotlinScriptDef,generatorKotlinScriptDefExtensions,generatorRuntimeOnlyDependenciesMetadata,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-doc/gradle.lockfile b/pkl-doc/gradle.lockfile
index 9a78e5a..629fd77 100644
--- a/pkl-doc/gradle.lockfile
+++ b/pkl-doc/gradle.lockfile
@@ -11,7 +11,7 @@ com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=test
com.google.j2objc:j2objc-annotations:1.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.google.jimfs:jimfs:1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.ibm.icu:icu4j:58.2=validator
-com.ibm.icu:icu4j:71.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+com.ibm.icu:icu4j:72.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.shapesecurity:salvation:2.7.2=validator
com.tunnelvisionlabs:antlr4-runtime:4.9.0=default,runtimeClasspath,testRuntimeClasspath
commons-codec:commons-codec:1.10=validator
@@ -38,10 +38,10 @@ org.commonmark:commonmark-ext-gfm-tables:0.21.0=compileClasspath,default,impleme
org.commonmark:commonmark:0.21.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-util-ajax:9.4.18.v20190429=validator
org.eclipse.jetty:jetty-util:9.4.18.v20190429=validator
-org.graalvm.js:js:22.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.regex:regex:22.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.js:js:23.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.regex:regex:23.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=default,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -56,10 +56,14 @@ org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerP
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-serialization:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
-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,default,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,default,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=apiDependenciesMetadata,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testImplementationDependenciesMetadata
+org.jetbrains.kotlin:kotlin-stdlib:1.8.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-tooling-core:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-util-io:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.1=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
@@ -78,4 +82,4 @@ org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMet
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
-empty=annotationProcessor,archives,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
+empty=annotationProcessor,archives,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
diff --git a/pkl-executor/gradle.lockfile b/pkl-executor/gradle.lockfile
index c5fa512..0d31a41 100644
--- a/pkl-executor/gradle.lockfile
+++ b/pkl-executor/gradle.lockfile
@@ -6,8 +6,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -34,4 +34,4 @@ org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
org.slf4j:slf4j-api:1.7.36=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.slf4j:slf4j-simple:1.7.36=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
-empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklDistribution,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
+empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,pklDistribution,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
diff --git a/pkl-gradle/gradle.lockfile b/pkl-gradle/gradle.lockfile
index 4db8f8d..d8eaca1 100644
--- a/pkl-gradle/gradle.lockfile
+++ b/pkl-gradle/gradle.lockfile
@@ -17,10 +17,14 @@ 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-impl-embeddable: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=compileClasspath,compileOnlyDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=compileClasspath,compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=compileClasspath,compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=compileClasspath,compileOnlyDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=compileOnlyDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.10=compileOnlyDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath
org.jetbrains:annotations:13.0=compileClasspath,compileOnlyDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
diff --git a/pkl-server/gradle.lockfile b/pkl-server/gradle.lockfile
index 22b6965..813fd46 100644
--- a/pkl-server/gradle.lockfile
+++ b/pkl-server/gradle.lockfile
@@ -6,8 +6,8 @@ net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependen
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
diff --git a/pkl-tools/gradle.lockfile b/pkl-tools/gradle.lockfile
index a04dc3b..c1a960c 100644
--- a/pkl-tools/gradle.lockfile
+++ b/pkl-tools/gradle.lockfile
@@ -10,13 +10,15 @@ io.leangen.geantyref:geantyref:1.3.14=default,runtimeClasspath,testRuntimeClassp
org.commonmark:commonmark-ext-gfm-tables:0.21.0=default,runtimeClasspath,testRuntimeClasspath
org.commonmark:commonmark:0.21.0=default,runtimeClasspath,testRuntimeClasspath
org.fusesource.jansi:jansi:2.4.0=default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testRuntimeClasspath
-org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.sdk:graal-sdk:23.0.2=default,runtimeClasspath,testRuntimeClasspath
+org.graalvm.truffle:truffle-api:23.0.2=default,runtimeClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.7.10=default,runtimeClasspath,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.7.21=compileClasspath,testCompileClasspath
+org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=default,runtimeClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=compileClasspath,default,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.7.21=compileClasspath,testCompileClasspath
+org.jetbrains.kotlin:kotlin-stdlib:1.8.21=default,runtimeClasspath,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.1=default,runtimeClasspath,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1=default,runtimeClasspath,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1=default,runtimeClasspath,testRuntimeClasspath
diff --git a/stdlib/gradle.lockfile b/stdlib/gradle.lockfile
index 00a8691..7e06c36 100644
--- a/stdlib/gradle.lockfile
+++ b/stdlib/gradle.lockfile
@@ -6,12 +6,12 @@ com.github.ajalt.clikt:clikt:3.5.1=pkldoc
com.tunnelvisionlabs:antlr4-runtime:4.9.0=pkldoc
org.commonmark:commonmark-ext-gfm-tables:0.21.0=pkldoc
org.commonmark:commonmark:0.21.0=pkldoc
-org.graalvm.sdk:graal-sdk:22.3.1=pkldoc
-org.graalvm.truffle:truffle-api:22.3.1=pkldoc
-org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=pkldoc
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=pkldoc
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=pkldoc
-org.jetbrains.kotlin:kotlin-stdlib:1.7.10=pkldoc
+org.graalvm.sdk:graal-sdk:23.0.2=pkldoc
+org.graalvm.truffle:truffle-api:23.0.2=pkldoc
+org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=pkldoc
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21=pkldoc
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21=pkldoc
+org.jetbrains.kotlin:kotlin-stdlib:1.8.21=pkldoc
org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.1=pkldoc
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1=pkldoc
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1=pkldoc

30
pkl-certs/gradle.lockfile Normal file
View File

@@ -0,0 +1,30 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common: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-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7: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:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.10.2=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions

View File

@@ -1,21 +1,70 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
com.ethlo.time:itu:1.8.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.fasterxml.jackson.core:jackson-annotations:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.fasterxml.jackson.core:jackson-core:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.fasterxml.jackson.core:jackson-databind:2.17.1=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.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.fasterxml.jackson:jackson-bom:2.17.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.github.ajalt.clikt:clikt-jvm:3.5.1=compileClasspath,default,runtimeClasspath,testCompileClasspath,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:4.3.1=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: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.j2objc:j2objc-annotations:3.0.0=testCompileClasspath,testImplementationDependenciesMetadata
com.jayway.jsonpath:json-path:2.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.networknt:json-schema-validator:1.4.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
com.tunnelvisionlabs:antlr4-runtime:4.9.0=default,runtimeClasspath,testRuntimeClasspath
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
commons-io:commons-io:2.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
net.javacrumbs.json-unit:json-unit-core:2.38.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.minidev:accessors-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
org.apache.httpcomponents.client5:httpclient5:5.3.1=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.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.fusesource.jansi:jansi:2.4.0=compileClasspath,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.compiler:compiler:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:native-image-base:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:objectfile:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:pointsto:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:svm:22.3.1=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.sdk:graal-sdk:22.3.1=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
org.graalvm.truffle:truffle-api:22.3.1=compileClasspath,compileOnlyDependenciesMetadata,default,runtimeClasspath,testRuntimeClasspath
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.checkerframework:checker-qual:3.42.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty.http2:http2-common:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty.http2:http2-hpack:11.0.20=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:jetty-alpn-client:11.0.20=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.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-alpn-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-bom:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-client:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-http:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-io:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-proxy:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-security:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-server:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-servlet:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-servlets:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-util:11.0.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.eclipse.jetty:jetty-webapp:11.0.20=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.graalvm.compiler:compiler:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:native-image-base:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:objectfile:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:pointsto:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.nativeimage:svm:23.0.2=compileClasspath,compileOnlyDependenciesMetadata
org.graalvm.sdk:graal-sdk:23.0.2=compileClasspath,compileOnlyDependenciesMetadata,default,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:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
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-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -35,14 +84,21 @@ org.jline:jline-native:3.23.0=compileClasspath,default,implementationDependencie
org.jline:jline-reader:3.23.0=compileClasspath,default,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,default,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.9.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.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.msgpack:msgpack-core:0.9.0=default,runtimeClasspath,testRuntimeClasspath
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.slf4j:slf4j-api:2.0.11=testRuntimeClasspath
org.slf4j:slf4j-api:2.0.9=testCompileClasspath,testImplementationDependenciesMetadata
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
empty=annotationProcessor,archives,compile,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,shadow,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
org.wiremock:wiremock:3.6.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-placeholders:2.10.0=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,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime

View File

@@ -33,34 +33,39 @@ val stagedMacAarch64Executable: Configuration by configurations.creating
val stagedLinuxAmd64Executable: Configuration by configurations.creating
val stagedLinuxAarch64Executable: Configuration by configurations.creating
val stagedAlpineLinuxAmd64Executable: Configuration by configurations.creating
val stagedWindowsAmd64Executable: Configuration by configurations.creating
dependencies {
compileOnly(libs.svm)
// CliEvaluator exposes PClass
api(project(":pkl-core"))
api(projects.pklCore)
// CliEvaluatorOptions exposes CliBaseOptions
api(project(":pkl-commons-cli"))
api(projects.pklCommonsCli)
implementation(project(":pkl-commons"))
implementation(projects.pklCommons)
implementation(libs.jansi)
implementation(libs.jlineReader)
implementation(libs.jlineTerminal)
implementation(libs.jlineTerminalJansi)
implementation(project(":pkl-server"))
implementation(projects.pklServer)
implementation(libs.clikt) {
// force clikt to use our version of the kotlin stdlib
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-common")
}
testImplementation(project(":pkl-commons-test"))
testImplementation(projects.pklCommonsTest)
testImplementation(libs.wiremock)
stagedMacAmd64Executable(files("$buildDir/executable/pkl-macos-amd64"))
stagedMacAarch64Executable(files("$buildDir/executable/pkl-macos-aarch64"))
stagedLinuxAmd64Executable(files("$buildDir/executable/pkl-linux-amd64"))
stagedLinuxAarch64Executable(files("$buildDir/executable/pkl-linux-aarch64"))
stagedAlpineLinuxAmd64Executable(files("$buildDir/executable/pkl-alpine-linux-amd64"))
fun executableDir(name: String) = files(layout.buildDirectory.dir("executable/$name"))
stagedMacAmd64Executable(executableDir("pkl-macos-amd64"))
stagedMacAmd64Executable(executableDir("pkl-macos-amd64"))
stagedMacAarch64Executable(executableDir("pkl-macos-aarch64"))
stagedLinuxAmd64Executable(executableDir("pkl-linux-amd64"))
stagedLinuxAarch64Executable(executableDir("pkl-linux-aarch64"))
stagedAlpineLinuxAmd64Executable(executableDir("pkl-alpine-linux-amd64"))
stagedWindowsAmd64Executable(executableDir("pkl-windows-amd64.exe"))
}
tasks.jar {
@@ -90,7 +95,7 @@ tasks.shadowJar {
val javaExecutable by tasks.registering(ExecutableJar::class) {
inJar.set(tasks.shadowJar.flatMap { it.archiveFile })
outJar.set(file("$buildDir/executable/jpkl"))
outJar.set(layout.buildDirectory.file("executable/jpkl"))
// uncomment for debugging
//jvmArgs.addAll("-ea", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
@@ -99,8 +104,8 @@ val javaExecutable by tasks.registering(ExecutableJar::class) {
val testJavaExecutable by tasks.registering(Test::class) {
testClassesDirs = tasks.test.get().testClassesDirs
classpath =
// compiled test classes
sourceSets.test.get().output +
// compiled test classes
sourceSets.test.get().output +
// java executable
javaExecutable.get().outputs.files +
// test-only dependencies
@@ -117,91 +122,92 @@ tasks.check {
// To catch this and similar problems, test that Java executable starts successfully.
val testStartJavaExecutable by tasks.registering(Exec::class) {
dependsOn(javaExecutable)
val outputFile = file("$buildDir/testStartJavaExecutable") // dummy output to satisfy up-to-date check
val outputFile =
layout.buildDirectory.file("testStartJavaExecutable") // dummy output to satisfy up-to-date check
outputs.file(outputFile)
executable = javaExecutable.get().outputs.files.singleFile.toString()
args("--version")
doFirst { outputFile.delete() }
doLast { outputFile.writeText("OK") }
if (buildInfo.os.isWindows) {
executable = "java"
args("-jar", javaExecutable.get().outputs.files.singleFile.toString(), "--version")
} else {
executable = javaExecutable.get().outputs.files.singleFile.toString()
args("--version")
}
doFirst { outputFile.get().asFile.delete() }
doLast { outputFile.get().asFile.writeText("OK") }
}
tasks.check {
dependsOn(testStartJavaExecutable)
}
fun Exec.configureExecutable(isEnabled: Boolean, outputFile: File, extraArgs: List<String> = listOf()) {
enabled = isEnabled
dependsOn(":installGraalVm")
fun Exec.configureExecutable(
graalVm: BuildInfo.GraalVm,
outputFile: Provider<RegularFile>,
extraArgs: List<String> = listOf()
) {
inputs.files(sourceSets.main.map { it.output })
.withPropertyName("mainSourceSets")
.withPathSensitivity(PathSensitivity.RELATIVE)
inputs.files(configurations.runtimeClasspath)
.withPropertyName("runtimeClasspath")
.withNormalizer(ClasspathNormalizer::class)
val nativeImageCommandName = if (buildInfo.os.isWindows) "native-image.cmd" else "native-image"
inputs.files(
file(graalVm.baseDir)
.resolve("bin/$nativeImageCommandName")
)
.withPropertyName("graalVmNativeImage")
.withPathSensitivity(PathSensitivity.ABSOLUTE)
outputs.file(outputFile)
outputs.cacheIf { true }
workingDir = outputFile.parentFile
executable = "${buildInfo.graalVm.baseDir}/bin/native-image"
workingDir(outputFile.map { it.asFile.parentFile })
executable = "${graalVm.baseDir}/bin/$nativeImageCommandName"
// JARs to exclude from the class path for the native-image build.
val exclusions =
if (buildInfo.graalVm.isGraal22) emptyList()
else 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/
argumentProviders.add(CommandLineArgumentProvider {
listOf(
// currently gives a deprecation warning, but we've been told
// that the "initialize everything at build time" *CLI* option is likely here to stay
"--initialize-at-build-time="
,"--no-fallback"
,"-H:IncludeResources=org/pkl/core/stdlib/.*\\.pkl"
,"-H:IncludeResources=org/jline/utils/.*"
,"-H:IncludeResources=org/pkl/commons/cli/commands/IncludedCARoots.pem"
//,"-H:IncludeResources=org/pkl/core/Release.properties"
,"-H:IncludeResourceBundles=org.pkl.core.errorMessages"
,"--macro:truffle"
,"-H:Class=org.pkl.cli.Main"
,"-H:Name=${outputFile.name}"
//,"--native-image-info"
//,"-Dpolyglot.image-build-time.PreinitializeContexts=pkl"
// the actual limit (currently) used by native-image is this number + 1400 (idea is to compensate for Truffle's own nodes)
,"-H:MaxRuntimeCompileMethods=1800"
,"-H:+EnforceMaxRuntimeCompileMethods"
,"--enable-url-protocols=http,https"
//,"--install-exit-handlers"
,"-H:+ReportExceptionStackTraces"
,"-H:-ParseRuntimeOptions" // disable automatic support for JVM CLI options (puts our main class in full control of argument parsing)
//,"-H:+PrintAnalysisCallTree"
//,"-H:PrintAnalysisCallTreeType=CSV"
//,"-H:+PrintImageObjectTree"
//,"--features=org.pkl.cli.svm.InitFeature"
//,"-H:Dump=:2"
//,"-H:MethodFilter=ModuleCache.getOrLoad*,VmLanguage.loadModule"
//,"-g"
//,"-verbose"
//,"--debug-attach"
//,"-H:+AllowVMInspection"
//,"-H:+PrintHeapHistogram"
//,"-H:+ReportDeletedElementsAtRuntime"
//,"-H:+PrintMethodHistogram"
//,"-H:+PrintRuntimeCompileMethods"
//,"-H:NumberOfThreads=1"
//,"-J-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime"
//,"-J-Dcom.oracle.truffle.aot=true"
//,"-J:-ea"
//,"-J:-esa"
// for use with https://www.graalvm.org/docs/tools/dashboard/
//,"-H:DashboardDump=dashboard.dump", "-H:+DashboardAll"
// native-image rejects non-existing class path entries -> filter
,"--class-path"
,((sourceSets.main.get().output + configurations.runtimeClasspath.get())
.filter { it.exists() && !exclusions.any { exclude -> it.name.contains(exclude) }})
.asPath
// make sure dev machine stays responsive (15% slowdown on my laptop)
,"-J-XX:ActiveProcessorCount=${
Runtime.getRuntime().availableProcessors() / (if (buildInfo.os.isMacOsX && !buildInfo.isCiBuild) 4 else 1)
}"
) + extraArgs
buildList {
// currently gives a deprecation warning, but we've been told
// that the "initialize everything at build time" *CLI* option is likely here to stay
add("--initialize-at-build-time=")
// needed for messagepack-java (see https://github.com/msgpack/msgpack-java/issues/600)
add("--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess")
add("--no-fallback")
add("-H:IncludeResources=org/pkl/core/stdlib/.*\\.pkl")
add("-H:IncludeResources=org/jline/utils/.*")
add("-H:IncludeResourceBundles=org.pkl.core.errorMessages")
add("-H:IncludeResources=org/pkl/commons/cli/PklCARoots.pem")
add("--macro:truffle")
add("-H:Class=org.pkl.cli.Main")
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)
add("-H:MaxRuntimeCompileMethods=1800")
add("-H:+EnforceMaxRuntimeCompileMethods")
add("--enable-url-protocols=http,https")
add("-H:+ReportExceptionStackTraces")
// disable automatic support for JVM CLI options (puts our main class in full control of argument parsing)
add("-H:-ParseRuntimeOptions")
// 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}")
addAll(extraArgs)
}
})
}
@@ -209,21 +215,22 @@ fun Exec.configureExecutable(isEnabled: Boolean, outputFile: File, extraArgs: Li
* Builds the pkl CLI for macOS/amd64.
*/
val macExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
configureExecutable(buildInfo.os.isMacOsX && buildInfo.graalVm.isGraal22, file("$buildDir/executable/pkl-macos-amd64"))
dependsOn(":installGraalVmAmd64")
configureExecutable(
buildInfo.graalVmAmd64,
layout.buildDirectory.file("executable/pkl-macos-amd64")
)
}
/**
* Builds the pkl CLI for macOS/aarch64.
*
* This requires that GraalVM be set to version 23.0 or greater, because 22.x does not support this
* os/arch pair.
*/
val macExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class) {
dependsOn(":installGraalVmAarch64")
configureExecutable(
buildInfo.os.isMacOsX && !buildInfo.graalVm.isGraal22,
file("$buildDir/executable/pkl-macos-aarch64"),
buildInfo.graalVmAarch64,
layout.buildDirectory.file("executable/pkl-macos-aarch64"),
listOf(
"--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess",
"-H:+AllowDeprecatedBuilderClassesOnImageClasspath"
)
)
@@ -233,7 +240,11 @@ val macExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class) {
* Builds the pkl CLI for linux/amd64.
*/
val linuxExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "amd64", file("$buildDir/executable/pkl-linux-amd64"))
dependsOn(":installGraalVmAmd64")
configureExecutable(
buildInfo.graalVmAmd64,
layout.buildDirectory.file("executable/pkl-linux-amd64")
)
}
/**
@@ -243,7 +254,11 @@ val linuxExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
* ARM instances.
*/
val linuxExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class) {
configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "aarch64", file("$buildDir/executable/pkl-linux-aarch64"))
dependsOn(":installGraalVmAarch64")
configureExecutable(
buildInfo.graalVmAarch64,
layout.buildDirectory.file("executable/pkl-linux-aarch64")
)
}
/**
@@ -253,20 +268,47 @@ val linuxExecutableAarch64: TaskProvider<Exec> by tasks.registering(Exec::class)
* Details: https://www.graalvm.org/22.0/reference-manual/native-image/ARM64/
*/
val alpineExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
dependsOn(":installGraalVmAmd64")
configureExecutable(
buildInfo.os.isLinux && buildInfo.arch == "amd64",
file("$buildDir/executable/pkl-alpine-linux-amd64"),
listOf(
"--static",
"--libc=musl",
"-H:CCompilerOption=-Wl,-z,stack-size=10485760",
"-Dorg.pkl.compat=alpine"
)
buildInfo.graalVmAmd64,
layout.buildDirectory.file("executable/pkl-alpine-linux-amd64"),
listOf("--static", "--libc=musl")
)
}
val windowsExecutableAmd64: TaskProvider<Exec> by tasks.registering(Exec::class) {
dependsOn(":installGraalVmAmd64")
configureExecutable(
buildInfo.graalVmAmd64,
layout.buildDirectory.file("executable/pkl-windows-amd64"),
listOf("-Dfile.encoding=UTF-8")
)
}
tasks.assembleNative {
dependsOn(macExecutableAmd64, macExecutableAarch64, linuxExecutableAmd64, linuxExecutableAarch64, alpineExecutableAmd64)
when {
buildInfo.os.isMacOsX -> {
dependsOn(macExecutableAmd64)
if (buildInfo.arch == "aarch64") {
dependsOn(macExecutableAarch64)
}
}
buildInfo.os.isWindows -> {
dependsOn(windowsExecutableAmd64)
}
buildInfo.os.isLinux && buildInfo.arch == "aarch64" -> {
dependsOn(linuxExecutableAarch64)
}
buildInfo.os.isLinux && buildInfo.arch == "amd64" -> {
dependsOn(linuxExecutableAmd64)
if (buildInfo.hasMuslToolchain) {
dependsOn(alpineExecutableAmd64)
}
}
}
}
// make Java executable available to other subprojects
@@ -294,11 +336,13 @@ publishing {
pom {
url.set("https://github.com/apple/pkl/tree/main/pkl-cli")
description.set("""
description.set(
"""
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.
Requires Java 11 or higher.
""".trimIndent())
Requires Java 17 or higher.
""".trimIndent()
)
}
}
create<MavenPublication>("macExecutableAmd64") {
@@ -366,6 +410,20 @@ publishing {
description.set("Native Pkl CLI executable for linux/amd64 and statically linked to musl.")
}
}
create<MavenPublication>("windowsExecutableAmd64") {
artifactId = "pkl-cli-windows-amd64"
artifact(stagedWindowsAmd64Executable.singleFile) {
classifier = null
extension = "exe"
builtBy(stagedWindowsAmd64Executable)
}
pom {
name.set("pkl-cli-windows-amd64")
url.set("https://github.com/apple/pkl/tree/main/pkl-cli")
description.set("Native Pkl CLI executable for windows/amd64.")
}
}
}
}
@@ -376,5 +434,6 @@ signing {
sign(publishing.publications["macExecutableAarch64"])
sign(publishing.publications["macExecutableAmd64"])
sign(publishing.publications["alpineLinuxExecutableAmd64"])
sign(publishing.publications["windowsExecutableAmd64"])
}
//endregion

View File

@@ -111,7 +111,9 @@ constructor(
return moduleUris.associateWith { uri ->
val moduleDir: String? =
IoUtils.toPath(uri)?.let { workingDir.relativize(it.parent).toString().ifEmpty { "." } }
IoUtils.toPath(uri)?.let {
IoUtils.relativize(it.parent, workingDir).toString().ifEmpty { "." }
}
val moduleKey =
try {
moduleResolver.resolve(uri)
@@ -158,7 +160,7 @@ constructor(
} else {
if (output.isNotEmpty()) {
outputFile.writeString(
options.moduleOutputSeparator + IoUtils.getLineSeparator(),
options.moduleOutputSeparator + '\n',
Charsets.UTF_8,
StandardOpenOption.WRITE,
StandardOpenOption.APPEND
@@ -192,6 +194,14 @@ constructor(
if (uri == VmUtils.REPL_TEXT_URI) ModuleSource.create(uri, reader.readText())
else ModuleSource.uri(uri)
private fun checkPathSpec(pathSpec: String) {
val illegal = pathSpec.indexOfFirst { IoUtils.isReservedFilenameChar(it) && it != '/' }
if (illegal == -1) {
return
}
throw CliException("Path spec `$pathSpec` contains illegal character `${pathSpec[illegal]}`.")
}
/**
* Renders each module's `output.files`, writing each entry as a file into the specified output
* directory.
@@ -207,6 +217,7 @@ constructor(
val moduleSource = toModuleSource(moduleUri, consoleReader)
val output = evaluator.evaluateOutputFiles(moduleSource)
for ((pathSpec, fileOutput) in output) {
checkPathSpec(pathSpec)
val resolvedPath = outputDir.resolve(pathSpec).normalize()
val realPath = if (resolvedPath.exists()) resolvedPath.toRealPath() else resolvedPath
if (!realPath.startsWith(outputDir)) {
@@ -228,7 +239,10 @@ constructor(
writtenFiles[realPath] = OutputFile(pathSpec, moduleUri)
realPath.createParentDirectories()
realPath.writeString(fileOutput.text)
consoleWriter.write(currentWorkingDir.relativize(resolvedPath).toString() + "\n")
consoleWriter.write(
IoUtils.relativize(resolvedPath, currentWorkingDir).toString() +
IoUtils.getLineSeparator()
)
consoleWriter.flush()
}
}

View File

@@ -21,28 +21,32 @@ import org.pkl.commons.cli.CliException
import org.pkl.core.packages.PackageResolver
import org.pkl.core.packages.PackageUri
class CliDownloadPackageCommand(
class CliPackageDownloader(
baseOptions: CliBaseOptions,
private val packageUris: List<PackageUri>,
private val noTranstive: Boolean
private val noTransitive: Boolean
) : CliCommand(baseOptions) {
override fun doRun() {
if (moduleCacheDir == null) {
throw CliException("Cannot download packages because no cache directory is specified.")
}
val packageResolver = PackageResolver.getInstance(securityManager, moduleCacheDir)
val packageResolver = PackageResolver.getInstance(securityManager, httpClient, moduleCacheDir)
val errors = mutableMapOf<PackageUri, Throwable>()
for (pkg in packageUris) {
try {
packageResolver.downloadPackage(pkg, pkg.checksums, noTranstive)
packageResolver.downloadPackage(pkg, pkg.checksums, noTransitive)
} catch (e: Throwable) {
errors[pkg] = e
}
}
when (errors.size) {
0 -> return
1 -> throw CliException(errors.values.single().message!!)
1 ->
throw CliException(
errors.values.single().message
?: ("An unexpected error occurred: " + errors.values.single())
)
else ->
throw CliException(
buildString {

View File

@@ -23,10 +23,8 @@ import org.pkl.commons.cli.CliCommand
import org.pkl.commons.cli.CliException
import org.pkl.core.module.ProjectDependenciesManager.PKL_PROJECT_FILENAME
abstract class CliAbstractProjectCommand(
cliOptions: CliBaseOptions,
private val projectDirs: List<Path>
) : CliCommand(cliOptions) {
abstract class CliProjectCommand(cliOptions: CliBaseOptions, private val projectDirs: List<Path>) :
CliCommand(cliOptions) {
protected val normalizedProjectFiles: List<Path> by lazy {
if (projectDirs.isEmpty()) {
@@ -37,7 +35,7 @@ abstract class CliAbstractProjectCommand(
)
return@lazy listOf(projectFile.normalize())
}
projectDirs.map { dir ->
projectDirs.map(cliOptions.normalizedWorkingDir::resolve).map { dir ->
val projectFile = dir.resolve(PKL_PROJECT_FILENAME)
if (!Files.exists(projectFile)) {
throw CliException("Directory $dir does not contain a PklProject file.")

View File

@@ -33,7 +33,7 @@ class CliProjectPackager(
private val skipPublishCheck: Boolean,
private val consoleWriter: Writer = System.out.writer(),
private val errWriter: Writer = System.err.writer()
) : CliAbstractProjectCommand(baseOptions, projectDirs) {
) : CliProjectCommand(baseOptions, projectDirs) {
private fun runApiTests(project: Project) {
val apiTests = project.`package`!!.apiTests
@@ -82,6 +82,7 @@ class CliProjectPackager(
outputPath,
stackFrameTransformer,
securityManager,
httpClient,
skipPublishCheck,
consoleWriter
)

View File

@@ -28,7 +28,7 @@ class CliProjectResolver(
projectDirs: List<Path>,
private val consoleWriter: Writer = System.out.writer(),
private val errWriter: Writer = System.err.writer()
) : CliAbstractProjectCommand(baseOptions, projectDirs) {
) : CliProjectCommand(baseOptions, projectDirs) {
override fun doRun() {
for (projectFile in normalizedProjectFiles) {
val project = loadProject(projectFile)
@@ -40,6 +40,7 @@ class CliProjectResolver(
SecurityManagers.defaultTrustLevels,
rootDir
),
httpClient,
moduleCacheDir
)
val dependencies = ProjectDependenciesResolver(project, packageResolver, errWriter).resolve()

View File

@@ -36,6 +36,7 @@ internal class CliRepl(private val options: CliEvaluatorOptions) : CliCommand(op
SecurityManagers.defaultTrustLevels,
rootDir
),
httpClient,
Loggers.stdErr(),
listOf(
ModuleKeyFactories.standardLibrary,
@@ -44,6 +45,7 @@ internal class CliRepl(private val options: CliEvaluatorOptions) : CliCommand(op
ModuleKeyFactories.fromServiceProviders() +
listOf(
ModuleKeyFactories.file,
ModuleKeyFactories.http,
ModuleKeyFactories.pkg,
ModuleKeyFactories.projectpackage,
ModuleKeyFactories.genericUrl

View File

@@ -19,37 +19,23 @@ package org.pkl.cli
import com.github.ajalt.clikt.core.subcommands
import org.pkl.cli.commands.*
import org.pkl.commons.cli.CliMain
import org.pkl.commons.cli.cliMain
import org.pkl.core.Release
/** Main method of the Pkl CLI (command-line evaluator and REPL). */
internal fun main(args: Array<String>) {
val version = Release.current().versionInfo()
val helpLink = "${Release.current().documentation().homepage()}pkl-cli/index.html#usage"
val commands =
arrayOf(
EvalCommand(helpLink),
ReplCommand(helpLink),
ServerCommand(helpLink),
TestCommand(helpLink),
ProjectCommand(helpLink),
DownloadPackageCommand(helpLink)
)
val cmd = RootCommand("pkl", version, helpLink).subcommands(*commands)
cliMain {
if (CliMain.compat == "alpine") {
// Alpine's main thread has a prohibitively small stack size by default;
// https://github.com/oracle/graal/issues/3398
var throwable: Throwable? = null
Thread(null, { cmd.main(args) }, "alpineMain", 10000000).apply {
setUncaughtExceptionHandler { _, t -> throwable = t }
start()
join()
}
throwable?.let { throw it }
} else {
cmd.main(args)
}
val version = Release.current().versionInfo()
val helpLink = "${Release.current().documentation().homepage()}pkl-cli/index.html#usage"
RootCommand("pkl", version, helpLink)
.subcommands(
EvalCommand(helpLink),
ReplCommand(helpLink),
ServerCommand(helpLink),
TestCommand(helpLink),
ProjectCommand(helpLink),
DownloadPackageCommand(helpLink)
)
.main(args)
}
}

View File

@@ -21,7 +21,7 @@ import com.github.ajalt.clikt.parameters.arguments.multiple
import com.github.ajalt.clikt.parameters.groups.provideDelegate
import com.github.ajalt.clikt.parameters.options.flag
import com.github.ajalt.clikt.parameters.options.option
import org.pkl.cli.CliDownloadPackageCommand
import org.pkl.cli.CliPackageDownloader
import org.pkl.commons.cli.commands.BaseCommand
import org.pkl.commons.cli.commands.ProjectOptions
import org.pkl.commons.cli.commands.single
@@ -62,7 +62,7 @@ class DownloadPackageCommand(helpLink: String) :
.flag()
override fun run() {
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions.baseOptions(emptyList(), projectOptions),
packageUris,
noTransitive

View File

@@ -85,7 +85,7 @@ class ProjectCommand(helpLink: String) :
This command runs a project's api tests, as defined by `apiTests` in `PklProject`.
Additionally, it verifies that all imports resolve to paths that are local to the project.
Finally, this command writes the folowing artifacts into the output directory specified by the output path.
Finally, this command writes the following artifacts into the output directory specified by the output path.
- `name@version` - dependency metadata$NEWLINE
- `name@version.sha256` - dependency metadata's SHA-256 checksum$NEWLINE

View File

@@ -22,6 +22,7 @@ import com.github.ajalt.clikt.parameters.groups.provideDelegate
import java.net.URI
import org.pkl.cli.CliTestRunner
import org.pkl.commons.cli.commands.BaseCommand
import org.pkl.commons.cli.commands.BaseOptions
import org.pkl.commons.cli.commands.ProjectOptions
import org.pkl.commons.cli.commands.TestOptions
@@ -29,7 +30,7 @@ class TestCommand(helpLink: String) :
BaseCommand(name = "test", help = "Run tests within the given module(s)", helpLink = helpLink) {
val modules: List<URI> by
argument(name = "<modules>", help = "Module paths or URIs to evaluate.")
.convert { parseModuleName(it) }
.convert { BaseOptions.parseModuleName(it) }
.multiple()
private val projectOptions by ProjectOptions()

View File

@@ -2,6 +2,6 @@ amends "pkl:Project"
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
}

View File

@@ -15,38 +15,59 @@
*/
package org.pkl.cli
import com.github.tomakehurst.wiremock.client.WireMock.*
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo
import com.github.tomakehurst.wiremock.junit5.WireMockTest
import java.io.StringReader
import java.io.StringWriter
import java.net.ServerSocket
import java.net.URI
import java.nio.file.Files
import java.nio.file.Path
import java.time.Duration
import kotlin.io.path.createDirectories
import kotlin.io.path.listDirectoryEntries
import java.util.regex.Pattern
import kotlin.io.path.*
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatCode
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.EnabledOnOs
import org.junit.jupiter.api.condition.OS
import org.junit.jupiter.api.io.TempDir
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource
import org.pkl.commons.*
import org.pkl.commons.cli.CliBaseOptions
import org.pkl.commons.cli.CliException
import org.pkl.commons.cli.commands.BaseOptions
import org.pkl.commons.test.FileTestUtils
import org.pkl.commons.test.PackageServer
import org.pkl.core.OutputFormat
import org.pkl.core.SecurityManagers
import org.pkl.core.util.IoUtils
@WireMockTest(httpsEnabled = true, proxyMode = true)
class CliEvaluatorTest {
companion object {
const val defaultContents = """
person {
name = "pigeon"
age = 20 + 10
}
private val defaultContents =
"""
person {
name = "pigeon"
age = 20 + 10
}
"""
.trimIndent()
private val packageServer = PackageServer()
@AfterAll
@JvmStatic
fun afterAll() {
packageServer.close()
}
}
// use manually constructed temp dir instead of @TempDir to work around
@@ -414,7 +435,10 @@ result = someLib.x
checkOutputFile(outputFiles[0], "result.pcf", contents)
}
// Can't reliably create symlinks on Windows.
// Might get errors like "A required privilege is not held by the client".
@Test
@DisabledOnOs(OS.WINDOWS)
fun `moduleDir is relative to workingDir even through symlinks`() {
val contents = "foo = 42"
val realWorkingDir = tempDir.resolve("workingDir").createDirectories()
@@ -968,6 +992,56 @@ result = someLib.x
.hasMessageContaining("resolve to the same file path")
}
@Test
@EnabledOnOs(OS.WINDOWS)
fun `multiple-file output throws when using invalid Windows characters`() {
val moduleUri =
writePklFile(
"test.pkl",
"""
output {
files {
["foo:bar"] { text = "bar" }
}
}
"""
.trimIndent()
)
val options =
CliEvaluatorOptions(
CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),
multipleFileOutputPath = ".output"
)
assertThatCode { evalToConsole(options) }
.hasMessageContaining("Path spec `foo:bar` contains illegal character `:`.")
}
@Test
@EnabledOnOs(OS.WINDOWS)
fun `multiple-file output - cannot use backslash as dir separator on Windows`() {
val moduleUri =
writePklFile(
"test.pkl",
"""
output {
files {
["foo\\bar"] { text = "bar" }
}
}
"""
.trimIndent()
)
val options =
CliEvaluatorOptions(
CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),
multipleFileOutputPath = ".output"
)
assertThatCode { evalToConsole(options) }
.hasMessageContaining("Path spec `foo\\bar` contains illegal character `\\`.")
}
@Test
fun `evaluate output expression`() {
val moduleUri =
@@ -1118,12 +1192,11 @@ result = someLib.x
@Test
fun `setting noCache will skip writing to the cache dir`() {
PackageServer.ensureStarted()
val moduleUri =
writePklFile(
"test.pkl",
"""
import "package://localhost:12110/birds@0.5.0#/catalog/Swallow.pkl"
import "package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl"
res = Swallow
"""
@@ -1137,7 +1210,8 @@ result = someLib.x
workingDir = tempDir,
moduleCacheDir = tempDir,
noCache = true,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port
),
)
CliEvaluator(options, consoleWriter = buffer).run()
@@ -1154,36 +1228,257 @@ result = someLib.x
"""
.trimIndent()
)
assertThat(tempDir.resolve("package-1")).doesNotExist()
assertThat(tempDir.resolve("package-2")).doesNotExist()
}
@Test
fun `not including the self signed certificate will result in a error`() {
PackageServer.ensureStarted()
fun `gives decent error message if certificate file contains random text`() {
val certsFile = tempDir.writeFile("random.pem", "RANDOM")
val err = assertThrows<CliException> { evalModuleThatImportsPackage(certsFile) }
assertThat(err)
.hasMessageContaining("Error parsing CA certificate file `${certsFile.pathString}`:")
.hasMessageContaining("No certificate data found")
.hasMessageNotContainingAny("java.", "sun.") // class names have been filtered out
}
@Test
fun `gives decent error message if certificate file is emtpy`(@TempDir tempDir: Path) {
val emptyCerts = tempDir.writeEmptyFile("empty.pem")
val err = assertThrows<CliException> { evalModuleThatImportsPackage(emptyCerts) }
assertThat(err).hasMessageContaining("CA certificate file `${emptyCerts.pathString}` is empty.")
}
@Test
fun `gives decent error message if certificate cannot be parsed`(@TempDir tempDir: Path) {
val invalidCerts = FileTestUtils.writeCertificateWithMissingLines(tempDir)
val err = assertThrows<CliException> { evalModuleThatImportsPackage(invalidCerts) }
assertThat(err)
// no assert for detail message because it differs between JDK implementations
.hasMessageContaining("Error parsing CA certificate file `${invalidCerts.pathString}`:")
.hasMessageNotContainingAny("java.", "sun.") // class names have been filtered out
}
@Test
fun `gives decent error message if CLI doesn't have the required CA certificate`() {
val err = assertThrows<CliException> { evalModuleThatImportsPackage(null, packageServer.port) }
assertThat(err)
.hasMessageContaining("Error during SSL handshake with host `localhost`:")
.hasMessageContaining("unable to find valid certification path to requested target")
.hasMessageNotContainingAny("java.", "sun.") // class names have been filtered out
}
@Test
fun `eval http module from proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {
stubFor(
get(urlEqualTo("/bar.pkl")).withHost(equalTo("not.a.valid.host")).willReturn(ok("foo = 1"))
)
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(URI("http://not.a.valid.host/bar.pkl")),
httpProxy = URI("http://localhost:${wwRuntimeInfo.httpPort}"),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:"),
),
)
val output = evalToConsole(options)
assertThat(output).isEqualTo("foo = 1\n")
}
@Test
fun `eval https -- no proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {
// pick an address on the local machine so we can be sure this test is not making any outbound
// connections.
val openPort = ServerSocket(0).use { it.localPort }
val targetAddress = "https://127.0.0.1:$openPort"
val options =
CliEvaluatorOptions(
CliBaseOptions(
// use loopback address to prevent test from making outbound http connection.
sourceModules = listOf(URI("$targetAddress/foo.pkl")),
httpProxy = URI(wwRuntimeInfo.httpBaseUrl),
httpNoProxy = listOf("*"),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:"),
)
)
assertThatCode { evalToConsole(options) }
.hasMessageContaining("I/O error loading module `$targetAddress/foo.pkl`")
}
@Test
@Disabled // TODO: figure out why this is failing.
fun `eval package from proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {
stubFor(
any(anyUrl()).willReturn(aResponse().proxiedFrom("https://localhost:${packageServer.port}"))
)
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(URI("package://localhost:1/birds@0.5.0#/catalog/Ostritch.pkl")),
noCache = true,
httpProxy = URI(wwRuntimeInfo.httpBaseUrl),
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:")
)
)
val output = evalToConsole(options)
assertThat(output)
.isEqualTo(
"""
name = "Ostritch"
favoriteFruit {
name = "Orange"
}
"""
.trimIndent()
)
verify(getRequestedFor(urlEqualTo("birds@0.5.0")))
verify(getRequestedFor(urlEqualTo("fruit@1.0.5")))
}
@Test
fun `eval http module from proxy -- configured in settings`(
@TempDir tempDir: Path,
wwRuntimeInfo: WireMockRuntimeInfo
) {
val settingsModule =
tempDir.writeFile(
"settings.pkl",
"""
amends "pkl:settings"
http {
proxy {
address = "${wwRuntimeInfo.httpBaseUrl}"
}
}
"""
.trimIndent()
)
stubFor(
get(urlEqualTo("/bar.pkl")).withHost(equalTo("not.a.valid.host")).willReturn(ok("foo = 1"))
)
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(URI("http://not.a.valid.host/bar.pkl")),
settings = settingsModule.toUri(),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:"),
),
)
val output = evalToConsole(options)
assertThat(output).isEqualTo("foo = 1\n")
}
@Test
fun `eval http module from proxy -- configured in PklProject`(
@TempDir tempDir: Path,
wwRuntimeInfo: WireMockRuntimeInfo
) {
tempDir.writeFile(
"PklProject",
"""
amends "pkl:Project"
evaluatorSettings {
http {
proxy {
address = "${wwRuntimeInfo.httpBaseUrl}"
}
}
}
"""
.trimIndent()
)
stubFor(
get(urlEqualTo("/bar.pkl")).withHost(equalTo("not.a.valid.host")).willReturn(ok("foo = 1"))
)
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(URI("http://not.a.valid.host/bar.pkl")),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:"),
projectDir = tempDir
),
)
val output = evalToConsole(options)
assertThat(output).isEqualTo("foo = 1\n")
}
@Test
fun `eval http module from proxy -- PklProject beats user settings`(
@TempDir tempDir: Path,
wwRuntimeInfo: WireMockRuntimeInfo
) {
val projectDir = tempDir.resolve("my-project")
projectDir.writeFile(
"PklProject",
"""
amends "pkl:Project"
evaluatorSettings {
http {
proxy {
address = "${wwRuntimeInfo.httpBaseUrl}"
}
}
}
"""
.trimIndent()
)
val homeDir = tempDir.resolve("my-home")
homeDir.writeFile(
"settings.pkl",
"""
amends "pkl:settings"
http {
proxy {
address = "http://invalid.proxy.address"
}
}
"""
.trimIndent()
)
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(URI("http://not.a.valid.host/bar.pkl")),
allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile("http:"),
projectDir = projectDir,
settings = homeDir.resolve("settings.pkl").toUri()
),
)
stubFor(get(anyUrl()).willReturn(ok("result = 1")))
val output = evalToConsole(options)
assertThat(output).isEqualTo("result = 1\n")
}
private fun evalModuleThatImportsPackage(certsFile: Path?, testPort: Int = -1) {
val moduleUri =
writePklFile(
"test.pkl",
"""
import "package://localhost:12110/birds@0.5.0#/catalog/Swallow.pkl"
import "package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl"
res = Swallow
"""
.trimIndent()
)
val buffer = StringWriter()
val options =
CliEvaluatorOptions(
CliBaseOptions(
sourceModules = listOf(moduleUri),
caCertificates = buildList { if (certsFile != null) add(certsFile) },
workingDir = tempDir,
moduleCacheDir = tempDir,
noCache = true,
// ensure we override any previously set root cert to the default buundle.
caCertificates = listOf(BaseOptions.Companion.includedCARootCerts())
testPort = testPort
),
)
val err = assertThrows<CliException> { CliEvaluator(options, consoleWriter = buffer).run() }
assertThat(err.message).contains("unable to find valid certification path to requested target")
CliEvaluator(options).run()
}
private fun writePklFile(fileName: String, contents: String = defaultContents): URI {

View File

@@ -24,6 +24,8 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.AssertionsForClassTypes.assertThatCode
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.OS
import org.junit.jupiter.api.io.TempDir
import org.pkl.cli.commands.EvalCommand
import org.pkl.cli.commands.RootCommand
@@ -35,7 +37,7 @@ class CliMainTest {
private val cmd = RootCommand("pkl", "pkl version 1", "").subcommands(evalCmd)
@Test
fun `duplicate CLI option produces meaningful errror message`(@TempDir tempDir: Path) {
fun `duplicate CLI option produces meaningful error message`(@TempDir tempDir: Path) {
val inputFile = tempDir.resolve("test.pkl").writeString("").toString()
assertThatCode {
@@ -54,7 +56,10 @@ class CliMainTest {
assertThatCode { cmd.parse(arrayOf("eval")) }.hasMessage("""Missing argument "<modules>"""")
}
// Can't reliably create symlinks on Windows.
// Might get errors like "A required privilege is not held by the client".
@Test
@DisabledOnOs(OS.WINDOWS)
fun `output to symlinked directory works`(@TempDir tempDir: Path) {
val code =
"""

View File

@@ -18,7 +18,7 @@ package org.pkl.cli
import java.nio.file.Path
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatCode
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import org.pkl.commons.cli.CliBaseOptions
@@ -26,39 +26,42 @@ import org.pkl.commons.test.FileTestUtils
import org.pkl.commons.test.PackageServer
import org.pkl.core.packages.PackageUri
class CliDownloadPackageCommandTest {
class CliPackageDownloaderTest {
companion object {
@BeforeAll
val server = PackageServer()
@AfterAll
@JvmStatic
fun beforeAll() {
PackageServer.ensureStarted()
fun afterAll() {
server.close()
}
}
@Test
fun `download packages`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris =
listOf(
PackageUri("package://localhost:12110/birds@0.5.0"),
PackageUri("package://localhost:12110/fruit@1.0.5"),
PackageUri("package://localhost:12110/fruit@1.1.0")
PackageUri("package://localhost:0/birds@0.5.0"),
PackageUri("package://localhost:0/fruit@1.0.5"),
PackageUri("package://localhost:0/fruit@1.1.0")
),
noTranstive = true
noTransitive = true
)
cmd.run()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.json")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.0.5/fruit@1.0.5.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.0.5/fruit@1.0.5.json")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.1.0/fruit@1.1.0.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.1.0/fruit@1.1.0.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.1.0/fruit@1.1.0.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.1.0/fruit@1.1.0.json")).exists()
}
@Test
@@ -76,79 +79,80 @@ class CliDownloadPackageCommandTest {
)
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
workingDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris = listOf(PackageUri("package://localhost:12110/birds@0.5.0")),
noTranstive = true
packageUris = listOf(PackageUri("package://localhost:0/birds@0.5.0")),
noTransitive = true
)
cmd.run()
assertThat(tempDir.resolve(".my-cache/package-1/localhost:12110/birds@0.5.0/birds@0.5.0.zip"))
assertThat(tempDir.resolve(".my-cache/package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip"))
.exists()
assertThat(tempDir.resolve(".my-cache/package-1/localhost:12110/birds@0.5.0/birds@0.5.0.json"))
assertThat(tempDir.resolve(".my-cache/package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json"))
.exists()
}
@Test
fun `download package while specifying checksum`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris =
listOf(
PackageUri(
"package://localhost:12110/birds@0.5.0::sha256:3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
),
PackageUri("package://localhost:0/birds@0.5.0::sha256:${PackageServer.BIRDS_SHA}"),
),
noTranstive = true
noTransitive = true
)
cmd.run()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json")).exists()
}
@Test
fun `download package with invalid checksum`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris =
listOf(
PackageUri("package://localhost:12110/birds@0.5.0::sha256:intentionallyBogusChecksum"),
PackageUri("package://localhost:0/birds@0.5.0::sha256:intentionallyBogusChecksum"),
),
noTranstive = true
noTransitive = true
)
assertThatCode { cmd.run() }
.hasMessage(
"""
Cannot download package `package://localhost:12110/birds@0.5.0` because the computed checksum for package metadata does not match the expected checksum.
Cannot download package `package://localhost:0/birds@0.5.0` because the computed checksum for package metadata does not match the expected checksum.
Computed checksum: "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
Computed checksum: "${PackageServer.BIRDS_SHA}"
Expected checksum: "intentionallyBogusChecksum"
Asset URL: "https://localhost:12110/birds@0.5.0"
Asset URL: "https://localhost:0/birds@0.5.0"
"""
.trimIndent()
)
}
@Test
fun `disabling cacheing is an error`(@TempDir tempDir: Path) {
fun `disabling caching is an error`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions = CliBaseOptions(workingDir = tempDir, noCache = true),
packageUris = listOf(PackageUri("package://localhost:12110/birds@0.5.0")),
noTranstive = true
packageUris = listOf(PackageUri("package://localhost:0/birds@0.5.0")),
noTransitive = true
)
assertThatCode { cmd.run() }
.hasMessage("Cannot download packages because no cache directory is specified.")
@@ -157,52 +161,54 @@ class CliDownloadPackageCommandTest {
@Test
fun `download packages with bad checksum`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris = listOf(PackageUri("package://localhost:12110/badChecksum@1.0.0")),
noTranstive = true
packageUris = listOf(PackageUri("package://localhost:0/badChecksum@1.0.0")),
noTransitive = true
)
assertThatCode { cmd.run() }
.hasMessageStartingWith(
"Cannot download package `package://localhost:12110/badChecksum@1.0.0` because the computed checksum does not match the expected checksum."
"Cannot download package `package://localhost:0/badChecksum@1.0.0` because the computed checksum does not match the expected checksum."
)
}
@Test
fun `download multiple failing packages`(@TempDir tempDir: Path) {
val cmd =
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris =
listOf(
PackageUri("package://localhost:12110/badChecksum@1.0.0"),
PackageUri("package://localhost:0/badChecksum@1.0.0"),
PackageUri("package://bogus.domain/notAPackage@1.0.0")
),
noTranstive = true
noTransitive = true
)
assertThatCode { cmd.run() }
.hasMessage(
"""
Failed to download some packages.
Failed to download package://localhost:12110/badChecksum@1.0.0 because:
Cannot download package `package://localhost:12110/badChecksum@1.0.0` because the computed checksum does not match the expected checksum.
Failed to download package://localhost:0/badChecksum@1.0.0 because:
Cannot download package `package://localhost:0/badChecksum@1.0.0` because the computed checksum does not match the expected checksum.
Computed checksum: "0ec8a501e974802d0b71b8d58141e1e6eaa10bc2033e18200be3a978823d98aa"
Computed checksum: "a6bf858cdd1c09da475c2abe50525902580910ee5cc1ff624999170591bf8f69"
Expected checksum: "intentionally bogus checksum"
Asset URL: "https://localhost:12110/badChecksum@1.0.0/badChecksum@1.0.0.zip"
Asset URL: "https://localhost:0/badChecksum@1.0.0/badChecksum@1.0.0.zip"
Failed to download package://bogus.domain/notAPackage@1.0.0 because:
Exception when making request `GET https://bogus.domain/notAPackage@1.0.0`:
bogus.domain
Error connecting to host `bogus.domain`.
"""
.trimIndent()
@@ -211,19 +217,20 @@ class CliDownloadPackageCommandTest {
@Test
fun `download package, including transitive dependencies`(@TempDir tempDir: Path) {
CliDownloadPackageCommand(
CliPackageDownloader(
baseOptions =
CliBaseOptions(
moduleCacheDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = server.port
),
packageUris = listOf(PackageUri("package://localhost:12110/birds@0.5.0")),
noTranstive = false
packageUris = listOf(PackageUri("package://localhost:0/birds@0.5.0")),
noTransitive = false
)
.run()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/birds@0.5.0/birds@0.5.0.json")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.0.5/fruit@1.0.5.zip")).exists()
assertThat(tempDir.resolve("package-1/localhost:12110/fruit@1.0.5/fruit@1.0.5.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.zip")).exists()
assertThat(tempDir.resolve("package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.json")).exists()
}
}

View File

@@ -15,6 +15,7 @@
*/
package org.pkl.cli
import java.io.File
import java.io.StringWriter
import java.net.URI
import java.nio.file.FileSystems
@@ -24,8 +25,11 @@ import java.util.stream.Collectors
import kotlin.io.path.createDirectories
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatCode
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.OS
import org.junit.jupiter.api.io.TempDir
import org.pkl.commons.cli.CliBaseOptions
import org.pkl.commons.cli.CliException
@@ -34,9 +38,19 @@ import org.pkl.commons.readString
import org.pkl.commons.test.FileTestUtils
import org.pkl.commons.test.PackageServer
import org.pkl.commons.writeString
import org.pkl.core.runtime.CertificateUtils
import org.pkl.core.util.IoUtils
class CliProjectPackagerTest {
companion object {
private val packageServer = PackageServer()
@AfterAll
@JvmStatic
fun afterAll() {
packageServer.close()
}
}
@Test
fun `missing PklProject when inferring a project dir`(@TempDir tempDir: Path) {
val packager =
@@ -52,7 +66,7 @@ class CliProjectPackagerTest {
}
@Test
fun `missing PklProject when explict dir is provided`(@TempDir tempDir: Path) {
fun `missing PklProject when explicit dir is provided`(@TempDir tempDir: Path) {
val packager =
CliProjectPackager(
CliBaseOptions(workingDir = tempDir),
@@ -214,7 +228,7 @@ class CliProjectPackagerTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
}
"""
@@ -227,18 +241,18 @@ class CliProjectPackagerTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "04eec465b217fb9779489525d26e9b587e5e47ff4d584c7673a450109715bc31"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.0.5",
"uri": "projectpackage://localhost:0/fruit@1.0.5",
"checksums": {
"sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5"
"sha256": "${PackageServer.FRUIT_SHA}"
}
}
}
@@ -322,7 +336,7 @@ class CliProjectPackagerTest {
"version": "1.0.0",
"packageZipUrl": "https://foo.com",
"packageZipChecksums": {
"sha256": "7f515fbc4b229ba171fac78c7c3f2c2e68e2afebae8cfba042b12733943a2813"
"sha256": "e83b67722ea17ba41717ce6e99ae8ee02d66df6294bd319ce403075b1071c3e0"
},
"dependencies": {},
"authors": []
@@ -334,9 +348,9 @@ class CliProjectPackagerTest {
assertThat(expectedArchive.zipFilePaths())
.hasSameElementsAs(listOf("/", "/c", "/c/d", "/c/d/foo.txt", "/a", "/a/b", "/a/b/foo.pkl"))
assertThat(expectedMetadataChecksum)
.hasContent("203ef387f217a3caee7f19819ef2b50926929269241cb7b3a29d95237b2c7f4b")
.hasContent("72ab32b27393bde5f316b00f184faae919378e4d7643872c605f681b14b647bf")
assertThat(expectedArchiveChecksum)
.hasContent("7f515fbc4b229ba171fac78c7c3f2c2e68e2afebae8cfba042b12733943a2813")
.hasContent("e83b67722ea17ba41717ce6e99ae8ee02d66df6294bd319ce403075b1071c3e0")
FileSystems.newFileSystem(URI("jar:" + expectedArchive.toUri()), mutableMapOf<String, String>())
.use { fs ->
assertThat(fs.getPath("a/b/foo.pkl")).hasSameTextualContentAs(fooPkl)
@@ -354,6 +368,10 @@ class CliProjectPackagerTest {
writeEmptyFile("main.test.pkl")
writeEmptyFile("child/main.pkl")
writeEmptyFile("child/main.test.pkl")
writeEmptyFile("examples/Workflow.pkl")
writeEmptyFile("examples/Ex1.pkl")
writeEmptyFile("tests/Test1.pkl")
writeEmptyFile("tests/integration/TestIng1.pkl")
}
tempDir.writeFile(
@@ -370,6 +388,8 @@ class CliProjectPackagerTest {
"*.bin"
"child/main.pkl"
"*.test.pkl"
"examples/Ex1.pkl"
"tests/**"
}
}
"""
@@ -389,14 +409,12 @@ class CliProjectPackagerTest {
.hasSameElementsAs(
listOf(
"/",
"/a",
"/a/b",
"/a/b/c",
"/child",
"/examples",
"/examples/Workflow.pkl",
"/input",
"/input/foo",
"/input/foo/bar.txt",
"/main.pkl",
"/main.pkl"
)
)
}
@@ -419,7 +437,7 @@ class CliProjectPackagerTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
["project2"] = import("../project2/PklProject")
}
@@ -432,16 +450,16 @@ class CliProjectPackagerTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/project2@5": {
"package://localhost:0/project2@5": {
"type": "local",
"uri": "projectpackage://localhost:12110/project2@5.0.0",
"uri": "projectpackage://localhost:0/project2@5.0.0",
"path": "../project2"
}
}
@@ -457,7 +475,7 @@ class CliProjectPackagerTest {
package {
name = "project2"
baseUri = "package://localhost:12110/project2"
baseUri = "package://localhost:0/project2"
version = "5.0.0"
packageZipUrl = "https://foo.com/project2.zip"
}
@@ -495,19 +513,19 @@ class CliProjectPackagerTest {
"version": "1.0.0",
"packageZipUrl": "https://foo.com",
"packageZipChecksums": {
"sha256": "7d08a65078e0bfc382c16fe1bb94546ab9a11e6f551087f362a4515ca98102fc"
"sha256": "8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85"
},
"dependencies": {
"birds": {
"uri": "package://localhost:12110/birds@0.5.0",
"uri": "package://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"project2": {
"uri": "package://localhost:12110/project2@5.0.0",
"uri": "package://localhost:0/project2@5.0.0",
"checksums": {
"sha256": "ddebb806e5b218ebb1a2baa14ad206b46e7a0c1585fa9863a486c75592bc8b16"
"sha256": "981787869571330b2f609a94a5912466990ce00e3fa94e7f290c2f99a6d5e5ed"
}
}
},
@@ -523,11 +541,11 @@ class CliProjectPackagerTest {
"""
{
"name": "project2",
"packageUri": "package://localhost:12110/project2@5.0.0",
"packageUri": "package://localhost:0/project2@5.0.0",
"version": "5.0.0",
"packageZipUrl": "https://foo.com/project2.zip",
"packageZipChecksums": {
"sha256": "7d08a65078e0bfc382c16fe1bb94546ab9a11e6f551087f362a4515ca98102fc"
"sha256": "8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85"
},
"dependencies": {},
"authors": []
@@ -557,7 +575,7 @@ class CliProjectPackagerTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
["project2"] = import("../project2/PklProject")
}
@@ -570,16 +588,16 @@ class CliProjectPackagerTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453"
}
},
"package://localhost:12110/project2@5": {
"package://localhost:0/project2@5": {
"type": "local",
"uri": "projectpackage://localhost:12110/project2@5.0.0",
"uri": "projectpackage://localhost:0/project2@5.0.0",
"path": "../project2"
}
}
@@ -595,7 +613,7 @@ class CliProjectPackagerTest {
package {
name = "project2"
baseUri = "package://localhost:12110/project2"
baseUri = "package://localhost:0/project2"
version = "5.0.0"
packageZipUrl = "https://foo.com/project2.zip"
}
@@ -676,7 +694,11 @@ class CliProjectPackagerTest {
)
}
// Absolute path imports on Windows must use an absolute URI (e.g. file:///C:/Foo/Bar), because
// they must contain drive letters, which conflict with schemes.
// We skip validation for absolute URIs, so effectively we skip this check on Windows.
@Test
@DisabledOnOs(OS.WINDOWS)
fun `import path verification -- absolute import from root dir`(@TempDir tempDir: Path) {
tempDir.writeFile(
"main.pkl",
@@ -724,6 +746,7 @@ class CliProjectPackagerTest {
}
@Test
@DisabledOnOs(OS.WINDOWS)
fun `import path verification -- absolute read from root dir`(@TempDir tempDir: Path) {
tempDir.writeFile(
"main.pkl",
@@ -844,17 +867,18 @@ class CliProjectPackagerTest {
consoleWriter = out
)
.run()
val sep = File.separatorChar
assertThat(out.toString())
.isEqualTo(
.isEqualToNormalizingNewlines(
"""
.out/project1@1.0.0/project1@1.0.0.zip
.out/project1@1.0.0/project1@1.0.0.zip.sha256
.out/project1@1.0.0/project1@1.0.0
.out/project1@1.0.0/project1@1.0.0.sha256
.out/project2@2.0.0/project2@2.0.0.zip
.out/project2@2.0.0/project2@2.0.0.zip.sha256
.out/project2@2.0.0/project2@2.0.0
.out/project2@2.0.0/project2@2.0.0.sha256
.out${sep}project1@1.0.0${sep}project1@1.0.0.zip
.out${sep}project1@1.0.0${sep}project1@1.0.0.zip.sha256
.out${sep}project1@1.0.0${sep}project1@1.0.0
.out${sep}project1@1.0.0${sep}project1@1.0.0.sha256
.out${sep}project2@2.0.0${sep}project2@2.0.0.zip
.out${sep}project2@2.0.0${sep}project2@2.0.0.zip.sha256
.out${sep}project2@2.0.0${sep}project2@2.0.0
.out${sep}project2@2.0.0${sep}project2@2.0.0.sha256
"""
.trimIndent()
@@ -867,19 +891,17 @@ class CliProjectPackagerTest {
@Test
fun `publish checks`(@TempDir tempDir: Path) {
PackageServer.ensureStarted()
CertificateUtils.setupAllX509CertificatesGlobally(listOf(FileTestUtils.selfSignedCertificate))
tempDir.writeFile("project/main.pkl", "res = 1")
tempDir.writeFile(
"project/PklProject",
// intentionally conflict with localhost:12110/birds@0.5.0 from our test fixtures
// intentionally conflict with localhost:0/birds@0.5.0 from our test fixtures
"""
amends "pkl:Project"
package {
name = "birds"
version = "0.5.0"
baseUri = "package://localhost:12110/birds"
baseUri = "package://localhost:0/birds"
packageZipUrl = "https://foo.com"
}
"""
@@ -888,7 +910,11 @@ class CliProjectPackagerTest {
val e =
assertThrows<CliException> {
CliProjectPackager(
CliBaseOptions(workingDir = tempDir),
CliBaseOptions(
workingDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port
),
listOf(tempDir.resolve("project")),
CliTestOptions(),
".out/%{name}@%{version}",
@@ -900,10 +926,10 @@ class CliProjectPackagerTest {
assertThat(e)
.hasMessageStartingWith(
"""
Package `package://localhost:12110/birds@0.5.0` was already published with different contents.
Package `package://localhost:0/birds@0.5.0` was already published with different contents.
Computed checksum: 7324e17214b6dcda63ebfb57d5a29b077af785c13bed0dc22b5138628a3f8d8f
Published checksum: 3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118
Computed checksum: aa8c883841db22e92794f4708b01dc905b5da77645b7dfb5b22a73da8c347db1
Published checksum: ${PackageServer.BIRDS_SHA}
"""
.trimIndent()
)
@@ -911,8 +937,6 @@ class CliProjectPackagerTest {
@Test
fun `publish check when package is not yet published`(@TempDir tempDir: Path) {
PackageServer.ensureStarted()
CertificateUtils.setupAllX509CertificatesGlobally(listOf(FileTestUtils.selfSignedCertificate))
tempDir.writeFile("project/main.pkl", "res = 1")
tempDir.writeFile(
"project/PklProject",
@@ -922,7 +946,7 @@ class CliProjectPackagerTest {
package {
name = "mangos"
version = "1.0.0"
baseUri = "package://localhost:12110/mangos"
baseUri = "package://localhost:0/mangos"
packageZipUrl = "https://foo.com"
}
"""
@@ -930,7 +954,11 @@ class CliProjectPackagerTest {
)
val out = StringWriter()
CliProjectPackager(
CliBaseOptions(workingDir = tempDir),
CliBaseOptions(
workingDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port
),
listOf(tempDir.resolve("project")),
CliTestOptions(),
".out/%{name}@%{version}",
@@ -938,13 +966,14 @@ class CliProjectPackagerTest {
consoleWriter = out
)
.run()
val sep = File.separatorChar
assertThat(out.toString())
.isEqualTo(
.isEqualToNormalizingNewlines(
"""
.out/mangos@1.0.0/mangos@1.0.0.zip
.out/mangos@1.0.0/mangos@1.0.0.zip.sha256
.out/mangos@1.0.0/mangos@1.0.0
.out/mangos@1.0.0/mangos@1.0.0.sha256
.out${sep}mangos@1.0.0${sep}mangos@1.0.0.zip
.out${sep}mangos@1.0.0${sep}mangos@1.0.0.zip.sha256
.out${sep}mangos@1.0.0${sep}mangos@1.0.0
.out${sep}mangos@1.0.0${sep}mangos@1.0.0.sha256
"""
.trimIndent()
@@ -953,7 +982,7 @@ class CliProjectPackagerTest {
private fun Path.zipFilePaths(): List<String> {
return FileSystems.newFileSystem(URI("jar:${toUri()}"), emptyMap<String, String>()).use { fs ->
Files.walk(fs.getPath("/")).map { it.toString() }.collect(Collectors.toList())
Files.walk(fs.getPath("/")).map(IoUtils::toNormalizedPathString).collect(Collectors.toList())
}
}
}

View File

@@ -15,10 +15,11 @@
*/
package org.pkl.cli
import java.io.File
import java.io.StringWriter
import java.nio.file.Path
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.io.TempDir
@@ -26,13 +27,16 @@ import org.pkl.commons.cli.CliBaseOptions
import org.pkl.commons.cli.CliException
import org.pkl.commons.test.FileTestUtils
import org.pkl.commons.test.PackageServer
import org.pkl.core.util.IoUtils
class CliProjectResolverTest {
companion object {
@BeforeAll
private val packageServer = PackageServer()
@AfterAll
@JvmStatic
fun beforeAll() {
PackageServer.ensureStarted()
fun afterAll() {
packageServer.close()
}
}
@@ -40,7 +44,7 @@ class CliProjectResolverTest {
fun `missing PklProject when inferring a project dir`(@TempDir tempDir: Path) {
val packager =
CliProjectResolver(
CliBaseOptions(workingDir = tempDir),
CliBaseOptions(workingDir = tempDir, noCache = true),
emptyList(),
consoleWriter = StringWriter(),
errWriter = StringWriter()
@@ -50,10 +54,10 @@ class CliProjectResolverTest {
}
@Test
fun `missing PklProject when explict dir is provided`(@TempDir tempDir: Path) {
fun `missing PklProject when explicit dir is provided`(@TempDir tempDir: Path) {
val packager =
CliProjectResolver(
CliBaseOptions(),
CliBaseOptions(noCache = true),
listOf(tempDir),
consoleWriter = StringWriter(),
errWriter = StringWriter()
@@ -71,7 +75,7 @@ class CliProjectResolverTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
}
"""
@@ -80,7 +84,9 @@ class CliProjectResolverTest {
CliProjectResolver(
CliBaseOptions(
workingDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port,
noCache = true
),
listOf(tempDir),
consoleWriter = StringWriter(),
@@ -94,18 +100,18 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.0.5",
"uri": "projectpackage://localhost:0/fruit@1.0.5",
"checksums": {
"sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5"
"sha256": "${PackageServer.FRUIT_SHA}"
}
}
}
@@ -124,7 +130,7 @@ class CliProjectResolverTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
}
"""
@@ -133,7 +139,9 @@ class CliProjectResolverTest {
CliProjectResolver(
CliBaseOptions(
workingDir = tempDir,
caCertificates = listOf(FileTestUtils.selfSignedCertificate)
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port,
noCache = true
),
emptyList(),
consoleWriter = StringWriter(),
@@ -147,18 +155,18 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.0.5",
"uri": "projectpackage://localhost:0/fruit@1.0.5",
"checksums": {
"sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5"
"sha256": "${PackageServer.FRUIT_SHA}"
}
}
}
@@ -178,7 +186,7 @@ class CliProjectResolverTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
["project2"] = import("../project2/PklProject")
}
@@ -192,14 +200,14 @@ class CliProjectResolverTest {
package {
name = "project2"
baseUri = "package://localhost:12110/package2"
baseUri = "package://localhost:0/package2"
version = "5.0.0"
packageZipUrl = "https://foo.com/package2.zip"
}
dependencies {
["fruit"] {
uri = "package://localhost:12110/fruit@1.0.5"
uri = "package://localhost:0/fruit@1.0.5"
}
["project3"] = import("../project3/PklProject")
}
@@ -214,21 +222,25 @@ class CliProjectResolverTest {
package {
name = "project3"
baseUri = "package://localhost:12110/package3"
baseUri = "package://localhost:0/package3"
version = "5.0.0"
packageZipUrl = "https://foo.com/package3.zip"
}
dependencies {
["fruit"] {
uri = "package://localhost:12110/fruit@1.1.0"
uri = "package://localhost:0/fruit@1.1.0"
}
}
"""
.trimIndent()
)
CliProjectResolver(
CliBaseOptions(caCertificates = listOf(FileTestUtils.selfSignedCertificate)),
CliBaseOptions(
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port,
noCache = true
),
listOf(projectDir),
consoleWriter = StringWriter(),
errWriter = StringWriter()
@@ -241,28 +253,28 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.1.0",
"uri": "projectpackage://localhost:0/fruit@1.1.0",
"checksums": {
"sha256": "98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01"
"sha256": "${PackageServer.FRUIT_1_1_SHA}"
}
},
"package://localhost:12110/package2@5": {
"package://localhost:0/package2@5": {
"type": "local",
"uri": "projectpackage://localhost:12110/package2@5.0.0",
"uri": "projectpackage://localhost:0/package2@5.0.0",
"path": "../project2"
},
"package://localhost:12110/package3@5": {
"package://localhost:0/package3@5": {
"type": "local",
"uri": "projectpackage://localhost:12110/package3@5.0.0",
"uri": "projectpackage://localhost:0/package3@5.0.0",
"path": "../project3"
}
}
@@ -282,7 +294,7 @@ class CliProjectResolverTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
["fruit"] = import("../fruit/PklProject")
}
@@ -296,7 +308,7 @@ class CliProjectResolverTest {
package {
name = "fruit"
baseUri = "package://localhost:12110/fruit"
baseUri = "package://localhost:0/fruit"
version = "1.0.0"
packageZipUrl = "https://foo.com/fruit.zip"
}
@@ -306,7 +318,11 @@ class CliProjectResolverTest {
val consoleOut = StringWriter()
val errOut = StringWriter()
CliProjectResolver(
CliBaseOptions(caCertificates = listOf(FileTestUtils.selfSignedCertificate)),
CliBaseOptions(
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port,
noCache = true
),
listOf(projectDir),
consoleWriter = consoleOut,
errWriter = errOut
@@ -319,18 +335,18 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.0.5",
"uri": "projectpackage://localhost:0/fruit@1.0.5",
"checksums": {
"sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5"
"sha256": "${PackageServer.FRUIT_SHA}"
}
}
}
@@ -340,7 +356,7 @@ class CliProjectResolverTest {
)
assertThat(errOut.toString())
.isEqualTo(
"WARN: local dependency `package://localhost:12110/fruit@1.0.0` was overridden to remote dependency `package://localhost:12110/fruit@1.0.5`.\n"
"WARN: local dependency `package://localhost:0/fruit@1.0.0` was overridden to remote dependency `package://localhost:0/fruit@1.0.5`.${IoUtils.getLineSeparator()}"
)
}
@@ -353,7 +369,7 @@ class CliProjectResolverTest {
dependencies {
["birds"] {
uri = "package://localhost:12110/birds@0.5.0"
uri = "package://localhost:0/birds@0.5.0"
}
}
"""
@@ -367,7 +383,7 @@ class CliProjectResolverTest {
dependencies {
["fruit"] {
uri = "package://localhost:12110/fruit@1.1.0"
uri = "package://localhost:0/fruit@1.1.0"
}
}
"""
@@ -377,17 +393,22 @@ class CliProjectResolverTest {
val consoleOut = StringWriter()
val errOut = StringWriter()
CliProjectResolver(
CliBaseOptions(caCertificates = listOf(FileTestUtils.selfSignedCertificate)),
CliBaseOptions(
caCertificates = listOf(FileTestUtils.selfSignedCertificate),
testPort = packageServer.port,
noCache = true
),
listOf(tempDir.resolve("project1"), tempDir.resolve("project2")),
consoleWriter = consoleOut,
errWriter = errOut
)
.run()
val sep = File.separatorChar
assertThat(consoleOut.toString())
.isEqualTo(
.isEqualToNormalizingNewlines(
"""
$tempDir/project1/PklProject.deps.json
$tempDir/project2/PklProject.deps.json
$tempDir${sep}project1${sep}PklProject.deps.json
$tempDir${sep}project2${sep}PklProject.deps.json
"""
.trimIndent()
@@ -398,18 +419,18 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/birds@0": {
"package://localhost:0/birds@0": {
"type": "remote",
"uri": "projectpackage://localhost:12110/birds@0.5.0",
"uri": "projectpackage://localhost:0/birds@0.5.0",
"checksums": {
"sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118"
"sha256": "${PackageServer.BIRDS_SHA}"
}
},
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.0.5",
"uri": "projectpackage://localhost:0/fruit@1.0.5",
"checksums": {
"sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5"
"sha256": "${PackageServer.FRUIT_SHA}"
}
}
}
@@ -423,11 +444,11 @@ class CliProjectResolverTest {
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://localhost:12110/fruit@1": {
"package://localhost:0/fruit@1": {
"type": "remote",
"uri": "projectpackage://localhost:12110/fruit@1.1.0",
"uri": "projectpackage://localhost:0/fruit@1.1.0",
"checksums": {
"sha256": "98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01"
"sha256": "${PackageServer.FRUIT_1_1_SHA}"
}
}
}

View File

@@ -21,6 +21,7 @@ import org.pkl.commons.toPath
import org.pkl.core.Loggers
import org.pkl.core.SecurityManagers
import org.pkl.core.StackFrameTransformers
import org.pkl.core.http.HttpClient
import org.pkl.core.module.ModuleKeyFactories
import org.pkl.core.repl.ReplRequest
import org.pkl.core.repl.ReplResponse
@@ -30,6 +31,7 @@ class ReplMessagesTest {
private val server =
ReplServer(
SecurityManagers.defaultManager,
HttpClient.dummyClient(),
Loggers.stdErr(),
listOf(ModuleKeyFactories.standardLibrary),
listOf(),

View File

@@ -5,13 +5,13 @@ com.github.ajalt.clikt:clikt-jvm:3.5.1=compileClasspath,default,runtimeClasspath
com.github.ajalt.clikt:clikt:3.5.1=apiDependenciesMetadata,compileClasspath,default,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=default,runtimeClasspath,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.14=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.15=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.14.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.sdk:graal-sdk:22.3.1=default,runtimeClasspath,testRuntimeClasspath
org.graalvm.truffle:truffle-api:22.3.1=default,runtimeClasspath,testRuntimeClasspath
org.assertj:assertj-core:3.26.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.sdk:graal-sdk:23.0.2=default,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.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
@@ -27,13 +27,13 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=apiDependenciesMetadata,compileCl
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,default,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.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=default,runtimeClasspath,testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.5=default,runtimeClasspath,testRuntimeClasspath
empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
empty=annotationProcessor,archives,compile,compileOnly,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeOnlyDependenciesMetadata,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime

View File

@@ -6,14 +6,14 @@ plugins {
dependencies {
// CliJavaCodeGeneratorOptions exposes CliBaseOptions
api(project(":pkl-commons-cli"))
api(projects.pklCommonsCli)
implementation(project(":pkl-commons"))
implementation(project(":pkl-core"))
implementation(projects.pklCommons)
implementation(projects.pklCore)
implementation(libs.javaPoet)
testImplementation(project(":pkl-config-java"))
testImplementation(project(":pkl-commons-test"))
testImplementation(projects.pklConfigJava)
testImplementation(projects.pklCommonsTest)
}
// with `org.gradle.parallel=true` and without the line below, `test` strangely runs into:

Some files were not shown because too many files have changed in this diff Show More