Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkl-core/src/main/java/org/pkl/core/OutputFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public enum OutputFormat {
PCF("pcf"),
PROPERTIES("properties"),
PLIST("plist"),
STARLARK("starlark"),
TEXTPROTO("textproto"),
XML("xml"),
YAML("yaml");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import "pkl:test"
import "pkl:starlark"

class Person {
name: String
age: Int
}

typealias Email = String

local renderer = new starlark.Renderer {}

res1 = renderer.renderValue(123)
res2 = renderer.renderValue(1.23)
res3 = renderer.renderValue(false)
res4 = renderer.renderValue("pigeon")
res6 = renderer.renderValue(List("pigeon", "parrot"))
res7 = renderer.renderValue(Set("pigeon", "parrot"))
res8 = renderer.renderValue(Map("name", "pigeon", "age", 42))
res9 = renderer.renderValue(new Listing { "pigeon"; "parrot" })
res10 = renderer.renderValue(new Mapping { ["name"] = "pigeon"; ["age"] = 42 })
res11 = renderer.renderValue(new Dynamic { name = "pigeon"; age = 42 })
res12 = renderer.renderValue(new Person { name = "pigeon"; age = 42 })
res13 = renderer.renderValue(null)
res15 = renderer.renderValue(Pair(1, 2))
res16 = renderer.renderValue(Pair("pigeon", List(1, 2, 3)))

res14 = test.catch(() -> renderer.renderValue(1.min))
res17 = test.catch(() -> renderer.renderValue(1.mb))
res18 = test.catch(() -> renderer.renderValue(Person))
res19 = test.catch(() -> renderer.renderValue(Email))
res20 = test.catch(() -> renderer.renderValue((x) -> x))
res21 = test.catch(() -> new starlark.Renderer { converters { [Int] = (_) -> throw("ouch") } }.renderValue(42))
res22 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
res1 = "123"
res2 = "1.23"
res3 = "False"
res4 = "\"pigeon\""
res6 = """
[
"pigeon",
"parrot",
]
"""
res7 = """
set([
"pigeon",
"parrot",
])
"""
res8 = """
{
"name": "pigeon",
"age": 42,
}
"""
res9 = """
[
"pigeon",
"parrot",
]
"""
res10 = """
{
"name": "pigeon",
"age": 42,
}
"""
res11 = """
struct(
age = 42,
name = "pigeon",
)
"""
res12 = """
Person(
name = "pigeon",
age = 42,
)
"""
res13 = "None"
res15 = "(1, 2)"
res16 = """
("pigeon", [
1,
2,
3,
])
"""
res14 = "Cannot render value of type `Duration` as Starlark. Value: 1.min"
res17 = "Cannot render value of type `DataSize` as Starlark. Value: 1.mb"
res18 = "Cannot render value of type `Class` as Starlark. Value: starlarkRenderer1#Person"
res19 = "Cannot render value of type `TypeAlias` as Starlark. Value: starlarkRenderer1#Email"
res20 = "Cannot render value of type `Function1` as Starlark. Value: new Function1 {}"
res21 = "ouch"
res22 = "Cannot render value of type `IntSeq` as Starlark. Value: IntSeq(1, 4)"
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ pkl:release
pkl:semver
pkl:settings
pkl:shell
pkl:starlark
pkl:test
pkl:xml
pkl:yaml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ class EvaluateOutputTextTest {
checkRenderedOutput(OutputFormat.PLIST)
}

@Test
fun `render Starlark`() {
checkRenderedOutput(OutputFormat.STARLARK)
}

private fun checkRenderedOutput(format: OutputFormat) {
val evaluator = EvaluatorBuilder.preconfigured().setOutputFormat(format).build()

Expand Down
112 changes: 112 additions & 0 deletions pkl-core/src/test/resources/org/pkl/core/rendererTest.starlark
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
int = 123

float = 1.23

bool = True

string = "Pigeon"

unicodeString = "abc😀abc😎abc"

multiLineString = "have a\ngreat\nday"

list = [
123,
1.23,
True,
"Pigeon",
"abc😀abc😎abc",
"have a\ngreat\nday",
[
1,
2,
3,
],
set([
1,
2,
3,
]),
{
"one": 1,
},
struct(
name = "Pigeon",
),
]

set = set([
123,
1.23,
True,
"Pigeon",
"abc😀abc😎abc",
"have a\ngreat\nday",
[
1,
2,
3,
],
set([
1,
2,
3,
]),
{
"one": 1,
},
struct(
name = "Pigeon",
),
])

map = {
"one": 123,
"two": 1.23,
"three": True,
"four": "Pigeon",
"five": "abc😀abc😎abc",
"six": "have a\ngreat\nday",
"seven": [
1,
2,
3,
],
"eight": set([
1,
2,
3,
]),
"nine": {
"one": 1,
},
"ten": struct(
name = "Pigeon",
),
}

Person(
name = "typedObject",
address = Address(
street = "Folsom St.",
),
age = 30,
hobbies = [
"swimming",
"gardening",
"reading",
],
)

container = struct(
address = struct(
hobbies = [
"swimming",
"gardening",
"reading",
],
street = "Folsom St.",
),
age = 30,
name = "Pigeon",
)
5 changes: 4 additions & 1 deletion stdlib/base.pkl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import "pkl:jsonnet"
import "pkl:math"
import "pkl:pklbinary"
import "pkl:protobuf"
import "pkl:starlark"
import "pkl:xml"
import "pkl:yaml"

Expand Down Expand Up @@ -119,13 +120,15 @@ abstract external class Module {
new protobuf.Renderer {}
else if (format == "xml")
new xml.Renderer {}
else if (format == "starlark")
new starlark.Renderer {}
else if (format == "yaml")
new YamlRenderer {}
else if (format == "pkl-binary")
new pklbinary.Renderer {}
else
throw(
"Unknown output format: `\(format)`. Supported formats are `json`, `jsonnet`, `pcf`, `plist`, `properties`, `textproto`, `xml`, `yaml`, `pkl-binary`."
"Unknown output format: `\(format)`. Supported formats are `json`, `jsonnet`, `pcf`, `plist`, `properties`, `starlark`, `textproto`, `xml`, `yaml`, `pkl-binary`."
)
text =
if (renderer is ValueRenderer)
Expand Down
Loading