Allow command options to have nullable types and default values (#1444)

This commit is contained in:
Jen Basch
2026-02-26 08:34:46 -08:00
committed by GitHub
parent 3ef065b6b6
commit 4cf2a1b42c
4 changed files with 2 additions and 32 deletions

View File

@@ -99,7 +99,7 @@ To learn more about this feature, consult https://github.com/apple/pkl-evolution
[[cli-framework]] [[cli-framework]]
=== CLI Framework === CLI Framework
Pkl 0.31 introduces a new framework for implementing CLI tools in Pkl (pr:https://github.com/apple/pkl/pull/1367[], pr:https://github.com/apple/pkl/pull/1431[], pr:https://github.com/apple/pkl/pull/1432[], pr:https://github.com/apple/pkl/pull/1436[], pr:https://github.com/apple/pkl/pull/1440[]). Pkl 0.31 introduces a new framework for implementing CLI tools in Pkl (pr:https://github.com/apple/pkl/pull/1367[], pr:https://github.com/apple/pkl/pull/1431[], pr:https://github.com/apple/pkl/pull/1432[], pr:https://github.com/apple/pkl/pull/1436[], pr:https://github.com/apple/pkl/pull/1440[], pr:https://github.com/apple/pkl/pull/1444[]).
The framework provides a way to build command line tools with user experience idioms that will be immediately familiar to users. The framework provides a way to build command line tools with user experience idioms that will be immediately familiar to users.
CLI tools implemented in Pkl have largely the same capabilities as normal Pkl evaluation (i.e. writing to standard output and files), but this may be extended using xref:language-reference:index.adoc#external-readers[external readers]. CLI tools implemented in Pkl have largely the same capabilities as normal Pkl evaluation (i.e. writing to standard output and files), but this may be extended using xref:language-reference:index.adoc#external-readers[external readers].
@@ -339,6 +339,7 @@ The following bugs have been fixed.
* A possible race condition involving symlinks could bypass `--root-dir` during module and resource reading (pr:https://github.com/apple/pkl/pull/1426[]). * A possible race condition involving symlinks could bypass `--root-dir` during module and resource reading (pr:https://github.com/apple/pkl/pull/1426[]).
* `pkl format` produces internal stack traces when lexing fails (pr:https://github.com/apple/pkl/pull/1430[]). * `pkl format` produces internal stack traces when lexing fails (pr:https://github.com/apple/pkl/pull/1430[]).
* `super` access expressions are parsed incorrectly inside the spread operator (pr:https://github.com/apple/pkl/pull/1364[]). * `super` access expressions are parsed incorrectly inside the spread operator (pr:https://github.com/apple/pkl/pull/1364[]).
* Modules and resources with `jar:file:` URIs were not properly sandboxed by `--root-dir` (pr:https://github.com/apple/pkl/pull/1442[]).
== Contributors [small]#🙏# == Contributors [small]#🙏#

View File

@@ -513,12 +513,6 @@ public final class CommandSpecParser {
var typeNode = resolved.getFirst(); var typeNode = resolved.getFirst();
isNullable = resolved.getSecond(); isNullable = resolved.getSecond();
defaultValue = CommandSpecParser.this.getDefaultValue(prop, requireExplicitDefault); defaultValue = CommandSpecParser.this.getDefaultValue(prop, requireExplicitDefault);
if (isNullable && defaultValue != null) {
throw exceptionBuilder()
.evalError("commandOptionTypeNullableWithDefaultValue", prop.getName())
.withSourceSection(prop.getHeaderSection())
.build();
}
resolve(prop, typeNode); resolve(prop, typeNode);
return this; return this;

View File

@@ -1098,11 +1098,6 @@ Found both `@Flag` and `@Argument` annotations for options property `{0}`.\n\
\n\ \n\
Only one option type may be specified. Only one option type may be specified.
commandOptionTypeNullableWithDefaultValue=\
Unexpected option property `{0}` with nullable type and default value.\n\
\n\
Options with default values must not be nullable.
commandOptionUnsupportedType=\ commandOptionUnsupportedType=\
Command option property `{0}` has unsupported {1}type `{2}`. Command option property `{0}` has unsupported {1}type `{2}`.

View File

@@ -292,26 +292,6 @@ class CommandSpecParserTest {
assertThat(exc.message).contains("No type annotation found for `foo` property.") assertThat(exc.message).contains("No type annotation found for `foo` property.")
} }
@Test
fun `nullable option with default not allowed`() {
val moduleUri =
writePklFile(
"cmd.pkl",
renderOptions +
"""
class Options {
foo: String? = "bar"
}
"""
.trimIndent(),
)
val exc = assertThrows<PklException> { parse(moduleUri) }
assertThat(exc.message).contains("foo: String? = \"bar\"")
assertThat(exc.message)
.contains("Unexpected option property `foo` with nullable type and default value")
}
@Test @Test
fun `option with union type containing non-string-literals`() { fun `option with union type containing non-string-literals`() {
val moduleUri = val moduleUri =