mirror of
https://github.com/apple/pkl.git
synced 2026-04-23 00:38:37 +02:00
Allow command options to have nullable types and default values (#1444)
This commit is contained in:
@@ -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]#🙏#
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}`.
|
||||||
|
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
Reference in New Issue
Block a user