Skip to content

Commit d742ce3

Browse files
committed
Add starlark output format
1 parent be21c34 commit d742ce3

8 files changed

Lines changed: 522 additions & 1 deletion

File tree

pkl-core/src/main/java/org/pkl/core/OutputFormat.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public enum OutputFormat {
2222
PCF("pcf"),
2323
PROPERTIES("properties"),
2424
PLIST("plist"),
25+
STARLARK("starlark"),
2526
TEXTPROTO("textproto"),
2627
XML("xml"),
2728
YAML("yaml");
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import "pkl:test"
2+
import "pkl:starlark"
3+
4+
class Person {
5+
name: String
6+
age: Int
7+
}
8+
9+
typealias Email = String
10+
11+
local renderer = new starlark.Renderer {}
12+
13+
res1 = renderer.renderValue(123)
14+
res2 = renderer.renderValue(1.23)
15+
res3 = renderer.renderValue(false)
16+
res4 = renderer.renderValue("pigeon")
17+
res6 = renderer.renderValue(List("pigeon", "parrot"))
18+
res7 = renderer.renderValue(Set("pigeon", "parrot"))
19+
res8 = renderer.renderValue(Map("name", "pigeon", "age", 42))
20+
res9 = renderer.renderValue(new Listing { "pigeon"; "parrot" })
21+
res10 = renderer.renderValue(new Mapping { ["name"] = "pigeon"; ["age"] = 42 })
22+
res11 = renderer.renderValue(new Dynamic { name = "pigeon"; age = 42 })
23+
res12 = renderer.renderValue(new Person { name = "pigeon"; age = 42 })
24+
res13 = renderer.renderValue(null)
25+
res15 = renderer.renderValue(Pair(1, 2))
26+
res16 = renderer.renderValue(Pair("pigeon", List(1, 2, 3)))
27+
28+
res14 = test.catch(() -> renderer.renderValue(1.min))
29+
res17 = test.catch(() -> renderer.renderValue(1.mb))
30+
res18 = test.catch(() -> renderer.renderValue(Person))
31+
res19 = test.catch(() -> renderer.renderValue(Email))
32+
res20 = test.catch(() -> renderer.renderValue((x) -> x))
33+
res21 = test.catch(() -> new starlark.Renderer { converters { [Int] = (_) -> throw("ouch") } }.renderValue(42))
34+
res22 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
res1 = "123"
2+
res2 = "1.23"
3+
res3 = "False"
4+
res4 = "\"pigeon\""
5+
res6 = """
6+
[
7+
"pigeon",
8+
"parrot",
9+
]
10+
"""
11+
res7 = """
12+
set([
13+
"pigeon",
14+
"parrot",
15+
])
16+
"""
17+
res8 = """
18+
{
19+
"name": "pigeon",
20+
"age": 42,
21+
}
22+
"""
23+
res9 = """
24+
[
25+
"pigeon",
26+
"parrot",
27+
]
28+
"""
29+
res10 = """
30+
{
31+
"name": "pigeon",
32+
"age": 42,
33+
}
34+
"""
35+
res11 = """
36+
struct(
37+
age = 42,
38+
name = "pigeon",
39+
)
40+
"""
41+
res12 = """
42+
Person(
43+
name = "pigeon",
44+
age = 42,
45+
)
46+
"""
47+
res13 = "None"
48+
res15 = "(1, 2)"
49+
res16 = """
50+
("pigeon", [
51+
1,
52+
2,
53+
3,
54+
])
55+
"""
56+
res14 = "Cannot render value of type `Duration` as Starlark. Value: 1.min"
57+
res17 = "Cannot render value of type `DataSize` as Starlark. Value: 1.mb"
58+
res18 = "Cannot render value of type `Class` as Starlark. Value: starlarkRenderer1#Person"
59+
res19 = "Cannot render value of type `TypeAlias` as Starlark. Value: starlarkRenderer1#Email"
60+
res20 = "Cannot render value of type `Function1` as Starlark. Value: new Function1 {}"
61+
res21 = "ouch"
62+
res22 = "Cannot render value of type `IntSeq` as Starlark. Value: IntSeq(1, 4)"

pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotFindStdLibModule.err

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pkl:release
2525
pkl:semver
2626
pkl:settings
2727
pkl:shell
28+
pkl:starlark
2829
pkl:test
2930
pkl:xml
3031
pkl:yaml

pkl-core/src/test/kotlin/org/pkl/core/EvaluateOutputTextTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class EvaluateOutputTextTest {
4242
checkRenderedOutput(OutputFormat.PLIST)
4343
}
4444

45+
@Test
46+
fun `render Starlark`() {
47+
checkRenderedOutput(OutputFormat.STARLARK)
48+
}
49+
4550
private fun checkRenderedOutput(format: OutputFormat) {
4651
val evaluator = EvaluatorBuilder.preconfigured().setOutputFormat(format).build()
4752

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
int = 123
2+
3+
float = 1.23
4+
5+
bool = True
6+
7+
string = "Pigeon"
8+
9+
unicodeString = "abc😀abc😎abc"
10+
11+
multiLineString = "have a\ngreat\nday"
12+
13+
list = [
14+
123,
15+
1.23,
16+
True,
17+
"Pigeon",
18+
"abc😀abc😎abc",
19+
"have a\ngreat\nday",
20+
[
21+
1,
22+
2,
23+
3,
24+
],
25+
set([
26+
1,
27+
2,
28+
3,
29+
]),
30+
{
31+
"one": 1,
32+
},
33+
struct(
34+
name = "Pigeon",
35+
),
36+
]
37+
38+
set = set([
39+
123,
40+
1.23,
41+
True,
42+
"Pigeon",
43+
"abc😀abc😎abc",
44+
"have a\ngreat\nday",
45+
[
46+
1,
47+
2,
48+
3,
49+
],
50+
set([
51+
1,
52+
2,
53+
3,
54+
]),
55+
{
56+
"one": 1,
57+
},
58+
struct(
59+
name = "Pigeon",
60+
),
61+
])
62+
63+
map = {
64+
"one": 123,
65+
"two": 1.23,
66+
"three": True,
67+
"four": "Pigeon",
68+
"five": "abc😀abc😎abc",
69+
"six": "have a\ngreat\nday",
70+
"seven": [
71+
1,
72+
2,
73+
3,
74+
],
75+
"eight": set([
76+
1,
77+
2,
78+
3,
79+
]),
80+
"nine": {
81+
"one": 1,
82+
},
83+
"ten": struct(
84+
name = "Pigeon",
85+
),
86+
}
87+
88+
Person(
89+
name = "typedObject",
90+
address = Address(
91+
street = "Folsom St.",
92+
),
93+
age = 30,
94+
hobbies = [
95+
"swimming",
96+
"gardening",
97+
"reading",
98+
],
99+
)
100+
101+
container = struct(
102+
address = struct(
103+
hobbies = [
104+
"swimming",
105+
"gardening",
106+
"reading",
107+
],
108+
street = "Folsom St.",
109+
),
110+
age = 30,
111+
name = "Pigeon",
112+
)

stdlib/base.pkl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import "pkl:jsonnet"
2626
import "pkl:math"
2727
import "pkl:pklbinary"
2828
import "pkl:protobuf"
29+
import "pkl:starlark"
2930
import "pkl:xml"
3031
import "pkl:yaml"
3132

@@ -119,13 +120,15 @@ abstract external class Module {
119120
new protobuf.Renderer {}
120121
else if (format == "xml")
121122
new xml.Renderer {}
123+
else if (format == "starlark")
124+
new starlark.Renderer {}
122125
else if (format == "yaml")
123126
new YamlRenderer {}
124127
else if (format == "pkl-binary")
125128
new pklbinary.Renderer {}
126129
else
127130
throw(
128-
"Unknown output format: `\(format)`. Supported formats are `json`, `jsonnet`, `pcf`, `plist`, `properties`, `textproto`, `xml`, `yaml`, `pkl-binary`."
131+
"Unknown output format: `\(format)`. Supported formats are `json`, `jsonnet`, `pcf`, `plist`, `properties`, `starlark`, `textproto`, `xml`, `yaml`, `pkl-binary`."
129132
)
130133
text =
131134
if (renderer is ValueRenderer)

0 commit comments

Comments
 (0)