Skip to content

Commit bdb558b

Browse files
committed
Updates Class and TypeAlias representation according to SPICE-0021
1 parent ca31def commit bdb558b

17 files changed

+210
-80
lines changed

pkl/decode_struct.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,37 @@ func (d *decoder) decodeStructField(fields map[string]structField, out *reflect.
270270
return d.skip(length - 3)
271271
}
272272

273-
func (d *decoder) decodeClass() (*reflect.Value, error) {
274-
ret := reflect.ValueOf(Class{})
273+
func (d *decoder) decodeClass(length int) (*reflect.Value, error) {
274+
var (
275+
class Class
276+
err error
277+
)
278+
if length > 1 { // pkl 0.30+ includes the qualified name and module uri
279+
if class.ModuleUri, err = d.dec.DecodeString(); err != nil {
280+
return nil, err
281+
}
282+
if class.QualifiedName, err = d.dec.DecodeString(); err != nil {
283+
return nil, err
284+
}
285+
}
286+
ret := reflect.ValueOf(class)
275287
return &ret, nil
276288
}
277289

278-
func (d *decoder) decodeTypeAlias() (*reflect.Value, error) {
279-
ret := reflect.ValueOf(TypeAlias{})
290+
func (d *decoder) decodeTypeAlias(length int) (*reflect.Value, error) {
291+
var (
292+
typeAlias TypeAlias
293+
err error
294+
)
295+
if length > 1 { // pkl 0.30+ includes the qualified name and module uri
296+
if typeAlias.ModuleUri, err = d.dec.DecodeString(); err != nil {
297+
return nil, err
298+
}
299+
if typeAlias.QualifiedName, err = d.dec.DecodeString(); err != nil {
300+
return nil, err
301+
}
302+
}
303+
ret := reflect.ValueOf(typeAlias)
280304
return &ret, nil
281305
}
282306

pkl/decoder.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ var durationType = reflect.TypeOf(time.Duration(0))
6666

6767
// Decode decodes the next value according to the expected type.
6868
func (d *decoder) Decode(typ reflect.Type) (res *reflect.Value, err error) {
69-
res, isUnmarshaled, err := d.maybeUnmarshal(typ)
70-
if isUnmarshaled {
69+
res, isUnmarshalled, err := d.maybeUnmarshal(typ)
70+
if isUnmarshalled {
7171
return res, err
7272
}
7373
switch typ.Kind() {
@@ -145,7 +145,7 @@ func (d *decoder) decodePointer(inType reflect.Type) (*reflect.Value, error) {
145145
}
146146

147147
// maybeUnmarshal determines if typ implements encoding.BinaryUnmarshaler, and if it does,
148-
// performs the unmarshaling.
148+
// performs the unmarshalling.
149149
func (d *decoder) maybeUnmarshal(typ reflect.Type) (*reflect.Value, bool, error) {
150150
ptr := reflect.New(typ)
151151
unmarshaler, isUnmarshaler := ptr.Interface().(encoding.BinaryUnmarshaler)
@@ -231,9 +231,9 @@ func (d *decoder) decodePklObject(typ reflect.Type, requireStruct bool) (res *re
231231
case code == codeRegex:
232232
res, err = d.decodeRegex()
233233
case code == codeClass:
234-
res, err = d.decodeClass()
234+
res, err = d.decodeClass(length)
235235
case code == codeTypeAlias:
236-
res, err = d.decodeTypeAlias()
236+
res, err = d.decodeTypeAlias(length)
237237
default:
238238
if requireStruct {
239239
return nil, fmt.Errorf("code %#02x cannot be decoded into a struct", code)
@@ -246,7 +246,7 @@ func (d *decoder) decodePklObject(typ reflect.Type, requireStruct bool) (res *re
246246
if err != nil {
247247
return nil, err
248248
}
249-
return res, d.skip(length - getDecodedLength(code) - 1) // -1 is from the code field
249+
return res, d.skip(length - getDecodedLength(code, length) - 1) // -1 is from the code field
250250
}
251251

252252
// decodeObjectPreamble decodes the preamble for Pkl objects.
@@ -266,7 +266,7 @@ func (d *decoder) decodeObjectPreamble() (int, int, error) {
266266
}
267267

268268
// getDecodedLength returns the number of array fields a specific type code is expected to yield
269-
func getDecodedLength(code int) int {
269+
func getDecodedLength(code, length int) int {
270270
switch code {
271271
case codeObject:
272272
return 3 // name, moduleUri, member array
@@ -277,6 +277,11 @@ func getDecodedLength(code int) int {
277277
case codeIntSeq:
278278
return 3 // start, end, step
279279
case codeClass, codeTypeAlias:
280+
if length > 1 {
281+
// pkl 0.30+ includes the qualified name and module uri
282+
return 2
283+
}
284+
// before pkl 0.30 only the type code is present
280285
return 0
281286
default:
282287
return 1

pkl/evaluator_manager.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"net/url"
2424
"sync"
2525

26+
"github.com/apple/pkl-go/pkl/internal"
2627
"github.com/apple/pkl-go/pkl/internal/msgapi"
2728
)
2829

@@ -78,7 +79,7 @@ type evaluatorManagerImpl interface {
7879
inChan() chan msgapi.IncomingMessage
7980
outChan() chan msgapi.OutgoingMessage
8081
closedChan() chan error
81-
getVersion() (*semver, error)
82+
getVersion() (*internal.Semver, error)
8283
}
8384

8485
var _ EvaluatorManager = (*evaluatorManager)(nil)
@@ -159,7 +160,7 @@ func (m *evaluatorManager) NewProjectEvaluator(ctx context.Context, projectBaseU
159160
return NewEvaluator(ctx, newOpts...)
160161
}
161162

162-
func (m *evaluatorManager) getVersion() (*semver, error) {
163+
func (m *evaluatorManager) getVersion() (*internal.Semver, error) {
163164
return m.impl.getVersion()
164165
}
165166

pkl/evaluator_manager_exec.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type execEvaluator struct {
6969
closed chan error
7070
// exited is a flag that indicates evaluator was closed explicitly
7171
exited atomicBool
72-
version *semver
72+
version *internal.Semver
7373
pklCommand []string
7474
processDone chan struct{}
7575
}
@@ -86,9 +86,9 @@ func (e *execEvaluator) closedChan() chan error {
8686
return e.closed
8787
}
8888

89-
var pklVersionRegex = regexp.MustCompile(fmt.Sprintf("Pkl (%s).*", semverPattern.String()))
89+
var pklVersionRegex = regexp.MustCompile(fmt.Sprintf("Pkl (%s).*", internal.SemverPattern.String()))
9090

91-
func (e *execEvaluator) getVersion() (*semver, error) {
91+
func (e *execEvaluator) getVersion() (*internal.Semver, error) {
9292
if e.version != nil {
9393
return e.version, nil
9494
}
@@ -102,7 +102,7 @@ func (e *execEvaluator) getVersion() (*semver, error) {
102102
if len(matches) < 2 {
103103
return nil, fmt.Errorf("failed to get version information from Pkl. Ran `%s`, and got stdout \"%s\"", strings.Join(command.Args, " "), versionCmdOut)
104104
}
105-
version, err := parseSemver(matches[1])
105+
version, err := internal.ParseSemver(matches[1])
106106
if err != nil {
107107
return nil, err
108108
}

pkl/evaluator_manager_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"sync"
2323
"testing"
2424

25+
"github.com/apple/pkl-go/pkl/internal"
2526
"github.com/apple/pkl-go/pkl/internal/msgapi"
2627
"github.com/stretchr/testify/assert"
2728
)
@@ -33,11 +34,11 @@ type fakeEvaluatorImpl struct {
3334
closed chan error
3435
}
3536

36-
func (f *fakeEvaluatorImpl) getVersion() (*semver, error) {
37+
func (f *fakeEvaluatorImpl) getVersion() (*internal.Semver, error) {
3738
if f.version == "" {
38-
return pklVersion0_25, nil
39+
return internal.PklVersion0_25, nil
3940
}
40-
return parseSemver(f.version)
41+
return internal.ParseSemver(f.version)
4142
}
4243

4344
func (f *fakeEvaluatorImpl) init() error {
@@ -62,7 +63,7 @@ func (f *fakeEvaluatorImpl) closedChan() chan error {
6263

6364
var _ evaluatorManagerImpl = (*fakeEvaluatorImpl)(nil)
6465

65-
func newFakeEvalautorManager() *evaluatorManager {
66+
func newFakeEvaluatorManager() *evaluatorManager {
6667
return &evaluatorManager{
6768
impl: &fakeEvaluatorImpl{
6869
in: make(chan msgapi.IncomingMessage),
@@ -76,7 +77,7 @@ func newFakeEvalautorManager() *evaluatorManager {
7677
}
7778

7879
func TestEvaluatorManager_interrupt_NewEvaluator(t *testing.T) {
79-
m := newFakeEvalautorManager()
80+
m := newFakeEvaluatorManager()
8081
defer assert.NoError(t, m.Close())
8182
go m.listen()
8283
go func() {
@@ -88,7 +89,7 @@ func TestEvaluatorManager_interrupt_NewEvaluator(t *testing.T) {
8889
}
8990

9091
func TestEvaluatorManager_interrupt_Close(t *testing.T) {
91-
m := newFakeEvalautorManager()
92+
m := newFakeEvaluatorManager()
9293
go m.listen()
9394
go func() {
9495
_ = m.Close()

pkl/evaluator_options.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"path/filepath"
2424
"strings"
2525

26+
"github.com/apple/pkl-go/pkl/internal"
2627
"github.com/apple/pkl-go/pkl/internal/msgapi"
2728
)
2829

@@ -55,6 +56,7 @@ type EvaluatorOptions struct {
5556
// - `"textproto"`
5657
// - `"xml"`
5758
// - `"yaml"`
59+
// - `"pkl-binary"`
5860
OutputFormat string
5961

6062
// AllowedModules defines URI patterns that determine which modules are permitted to be loaded and evaluated.
@@ -77,7 +79,7 @@ type EvaluatorOptions struct {
7779

7880
// CacheDir is the directory where `package:` modules are cached.
7981
//
80-
// If empty, no cacheing is performed.
82+
// If empty, no caching is performed.
8183
CacheDir string
8284

8385
// RootDir is the root directory for file-based reads within a Pkl program.
@@ -106,7 +108,7 @@ type EvaluatorOptions struct {
106108
// or EvaluatorManager.NewProjectEvaluator.
107109
ProjectBaseURI string
108110

109-
// DeclaredProjectDepenedencies is set of dependencies available to modules within ProjectBaseURI.
111+
// DeclaredProjectDependencies is set of dependencies available to modules within ProjectBaseURI.
110112
//
111113
// When importing dependencies, a PklProject.deps.json file must exist within ProjectBaseURI
112114
// that contains the project's resolved dependencies.
@@ -337,17 +339,17 @@ var WithOsEnv = func(opts *EvaluatorOptions) {
337339
}
338340
}
339341

340-
func buildEvaluatorOptions(version *semver, fns ...func(*EvaluatorOptions)) (*EvaluatorOptions, error) {
342+
func buildEvaluatorOptions(version *internal.Semver, fns ...func(*EvaluatorOptions)) (*EvaluatorOptions, error) {
341343
o := &EvaluatorOptions{}
342344
for _, f := range fns {
343345
f(o)
344346
}
345347
// repl:text is the URI of the module used to hold expressions. It should always be allowed.
346348
o.AllowedModules = append(o.AllowedModules, "repl:text")
347-
if o.Http != nil && pklVersion0_26.isGreaterThan(version) {
349+
if o.Http != nil && internal.PklVersion0_26.IsGreaterThan(version) {
348350
return nil, fmt.Errorf("http options are not supported on Pkl versions lower than 0.26")
349351
}
350-
if (len(o.ExternalModuleReaders) > 0 || len(o.ExternalResourceReaders) > 0) && pklVersion0_27.isGreaterThan(version) {
352+
if (len(o.ExternalModuleReaders) > 0 || len(o.ExternalResourceReaders) > 0) && internal.PklVersion0_27.IsGreaterThan(version) {
351353
return nil, fmt.Errorf("external reader options are not supported on Pkl versions lower than 0.27")
352354
}
353355
return o, nil

pkl/evaluator_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"strings"
3030
"testing"
3131

32+
"github.com/apple/pkl-go/pkl/internal"
3233
"github.com/stretchr/testify/assert"
3334
)
3435

@@ -120,7 +121,7 @@ func TestEvaluator(t *testing.T) {
120121
if err != nil {
121122
t.Fatal(err)
122123
}
123-
if version.isLessThan(pklVersion0_29) {
124+
if version.IsLessThan(internal.PklVersion0_29) {
124125
t.SkipNow()
125126
}
126127
ev, err := manager.NewEvaluator(context.Background(), PreconfiguredOptions)
@@ -155,7 +156,7 @@ func TestEvaluator(t *testing.T) {
155156
if err != nil {
156157
t.Fatal(err)
157158
}
158-
if version.isLessThan(pklVersion0_29) {
159+
if version.IsLessThan(internal.PklVersion0_29) {
159160
t.SkipNow()
160161
}
161162
ev, err := manager.NewEvaluator(context.Background(), PreconfiguredOptions)
@@ -584,7 +585,7 @@ class Bar {
584585
if err != nil {
585586
t.Fatal(err)
586587
}
587-
if pklVersion0_26.isGreaterThan(version) {
588+
if internal.PklVersion0_26.IsGreaterThan(version) {
588589
t.SkipNow()
589590
}
590591
ev, err := manager.NewEvaluator(context.Background(), PreconfiguredOptions, func(options *EvaluatorOptions) {
@@ -606,7 +607,7 @@ class Bar {
606607
if err != nil {
607608
t.Fatal(err)
608609
}
609-
if version.isGreaterThan(pklVersion0_25) {
610+
if version.IsGreaterThan(internal.PklVersion0_25) {
610611
t.SkipNow()
611612
}
612613
_, err = manager.NewEvaluator(context.Background(), PreconfiguredOptions, func(options *EvaluatorOptions) {

pkl/external_reader_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"runtime"
2323
"testing"
2424

25+
"github.com/apple/pkl-go/pkl/internal"
2526
"github.com/stretchr/testify/assert"
2627
)
2728

@@ -44,7 +45,7 @@ func TestExternalReaderE2E(t *testing.T) {
4445
if err != nil {
4546
t.Fatal(err)
4647
}
47-
if pklVersion0_27.isGreaterThan(version) {
48+
if internal.PklVersion0_27.IsGreaterThan(version) {
4849
t.SkipNow()
4950
}
5051

0 commit comments

Comments
 (0)