Skip to content
Merged
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Added `AsMap() (map[string]any, error)`; on type mismatch the error wraps
a per-engine `evaluator.ErrAsMapTypeMismatch` sentinel.
([#141](https://github.com/robbyt/go-polyscript/pull/141))
- **BREAKING**: `data.Setter.AddDataToContext` no longer takes a variadic.
Signature is now `AddDataToContext(ctx, data map[string]any) (context.Context, error)`.
Callers with multiple sources must merge them first.

### Deprecated
- The twelve legacy top-level constructors (`FromRisorFile`,
Expand Down
4 changes: 2 additions & 2 deletions engines/extism/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ func (be *Evaluator) Eval(ctx context.Context) (platform.EvaluatorResponse, erro
// which can be eventually passed to the Eval method.
func (be *Evaluator) AddDataToContext(
ctx context.Context,
d ...map[string]any,
d map[string]any,
) (context.Context, error) {
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d...)
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d)
}
18 changes: 9 additions & 9 deletions engines/extism/evaluator/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (m *mockErrProvider) GetData(ctx context.Context) (map[string]any, error) {

func (m *mockErrProvider) AddDataToContext(
ctx context.Context,
data ...map[string]any,
data map[string]any,
) (context.Context, error) {
return ctx, m.err
}
Expand All @@ -80,7 +80,7 @@ func (m *mockMapProvider) GetData(ctx context.Context) (map[string]any, error) {

func (m *mockMapProvider) AddDataToContext(
ctx context.Context,
data ...map[string]any,
data map[string]any,
) (context.Context, error) {
return ctx, nil
}
Expand Down Expand Up @@ -750,7 +750,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
tests := []struct {
name string
setupExe func(t *testing.T) *script.ExecutableUnit
inputs []map[string]any
input map[string]any
wantError bool
expectedErr string
}{
Expand All @@ -765,7 +765,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "test-nil-provider", content, nil)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
expectedErr: "no data provider available",
},
Expand All @@ -780,7 +780,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "test-valid-data", content, data.NewContextProvider(constants.EvalData))
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: false,
},
{
Expand All @@ -794,7 +794,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "test-empty-input", content, data.NewContextProvider(constants.EvalData))
},
inputs: []map[string]any{{}},
input: map[string]any{},
wantError: false,
},
{
Expand All @@ -803,7 +803,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
t.Helper()
return nil
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
expectedErr: "no data provider available",
},
Expand All @@ -821,7 +821,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
}
return newExe(t, "test-err-provider", content, mockProvider)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
expectedErr: "provider error",
},
Expand All @@ -834,7 +834,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
evaluator := New(handler, exe)

ctx := t.Context()
enrichedCtx, err := evaluator.AddDataToContext(ctx, tt.inputs...)
enrichedCtx, err := evaluator.AddDataToContext(ctx, tt.input)

// Check error expectations
if tt.wantError {
Expand Down
10 changes: 5 additions & 5 deletions engines/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1036,11 +1036,11 @@ let config_data = ctx["config"]

// Use explicit keys as recommended in the documentation
ctx := t.Context()
enrichedCtx, err := evaluator.AddDataToContext(ctx,
map[string]any{"request": createTestRequest()},
map[string]any{"user": map[string]any{"name": "TestUser", "id": 123}},
map[string]any{"config": map[string]any{"debug": true}},
)
enrichedCtx, err := evaluator.AddDataToContext(ctx, map[string]any{
"request": createTestRequest(),
"user": map[string]any{"name": "TestUser", "id": 123},
"config": map[string]any{"debug": true},
})
require.NoError(t, err)

// Execute
Expand Down
4 changes: 2 additions & 2 deletions engines/risor/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ func (be *Evaluator) Eval(ctx context.Context) (platform.EvaluatorResponse, erro
// which can be eventually passed to the Eval method.
func (be *Evaluator) AddDataToContext(
ctx context.Context,
d ...map[string]any,
d map[string]any,
) (context.Context, error) {
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d...)
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d)
}
14 changes: 7 additions & 7 deletions engines/risor/evaluator/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (m *MockProvider) GetData(ctx context.Context) (map[string]any, error) {

func (m *MockProvider) AddDataToContext(
ctx context.Context,
data ...map[string]any,
data map[string]any,
) (context.Context, error) {
args := m.Called(ctx, data)
if ctx, ok := args.Get(0).(context.Context); ok {
Expand Down Expand Up @@ -422,7 +422,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
tests := []struct {
name string
setupExe func(t *testing.T) *script.ExecutableUnit
inputs []map[string]any
input map[string]any
wantError bool
errorMessage string
}{
Expand All @@ -442,7 +442,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "with-provider", nil, mockProvider)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: false,
},
{
Expand All @@ -457,7 +457,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "with-provider-error", nil, mockProvider)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "provider error",
},
Expand All @@ -467,7 +467,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
t.Helper()
return newExe(t, "nil-provider", nil, nil)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "no data provider available",
},
Expand All @@ -477,7 +477,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
t.Helper()
return nil
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "no data provider available",
},
Expand All @@ -497,7 +497,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
}

ctx := t.Context()
result, err := evaluator.AddDataToContext(ctx, tt.inputs...)
result, err := evaluator.AddDataToContext(ctx, tt.input)

if tt.wantError {
require.Error(t, err)
Expand Down
4 changes: 2 additions & 2 deletions engines/starlark/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ func (be *Evaluator) Eval(ctx context.Context) (platform.EvaluatorResponse, erro
// which can be eventually passed to the Eval method.
func (be *Evaluator) AddDataToContext(
ctx context.Context,
d ...map[string]any,
d map[string]any,
) (context.Context, error) {
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d...)
return data.AddDataToContextFromProvider(ctx, be.logger.WithGroup("AddDataToContext"), be.getDataProvider(), d)
}
14 changes: 7 additions & 7 deletions engines/starlark/evaluator/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func (m *MockProvider) GetData(ctx context.Context) (map[string]any, error) {

func (m *MockProvider) AddDataToContext(
ctx context.Context,
data ...map[string]any,
data map[string]any,
) (context.Context, error) {
args := m.Called(ctx, data)
if ctx, ok := args.Get(0).(context.Context); ok {
Expand Down Expand Up @@ -247,7 +247,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
tests := []struct {
name string
setupExe func(t *testing.T) *script.ExecutableUnit
inputs []map[string]any
input map[string]any
wantError bool
errorMessage string
}{
Expand All @@ -267,7 +267,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "with provider", nil, mockProvider)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: false,
},
{
Expand All @@ -282,7 +282,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {

return newExe(t, "with provider error", nil, mockProvider)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "provider error",
},
Expand All @@ -292,7 +292,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
t.Helper()
return newExe(t, "nil provider", nil, nil)
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "no data provider available",
},
Expand All @@ -302,7 +302,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
t.Helper()
return nil
},
inputs: []map[string]any{{"test": "data"}},
input: map[string]any{"test": "data"},
wantError: true,
errorMessage: "no data provider available",
},
Expand All @@ -317,7 +317,7 @@ func TestEvaluator_AddDataToContext(t *testing.T) {
evaluator := New(handler, exe)

ctx := t.Context()
result, err := evaluator.AddDataToContext(ctx, tt.inputs...)
result, err := evaluator.AddDataToContext(ctx, tt.input)

if tt.wantError {
require.Error(t, err)
Expand Down
13 changes: 8 additions & 5 deletions examples/data-prep/starlark/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
_ "embed"
"fmt"
"log/slog"
"maps"
"net/http"
"net/url"
"os"
Expand Down Expand Up @@ -74,12 +75,14 @@ func prepareRuntimeData(
"user_data": userData,
}

// Merge request and metadata into a single map before handing it to the
// evaluator. AddDataToContext takes one map; callers with multiple
// sources should compose them first.
runtimeData := maps.Clone(requestMeta)
runtimeData["request"] = httpReq

// Add the request metadata to the context using the data.Provider
enrichedCtx, err := evaluator.AddDataToContext(
ctx,
map[string]any{"request": httpReq},
requestMeta,
)
enrichedCtx, err := evaluator.AddDataToContext(ctx, runtimeData)
if err != nil {
return nil, fmt.Errorf("failed to prepare context: %w", err)
}
Expand Down
10 changes: 5 additions & 5 deletions platform/data/addDataToContext.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
// - ctx: The base context to enrich
// - logger: A logger instance for recording operations
// - provider: The data provider to use for storing data
// - d: Variable list of data items to add to the context
// - d: The data map to add to the context
//
// Returns:
// - enrichedCtx: The context with added data
Expand All @@ -23,7 +23,7 @@ func AddDataToContextHelper(
ctx context.Context,
logger *slog.Logger,
provider Provider,
d ...map[string]any,
d map[string]any,
) (context.Context, error) {
if logger == nil {
logger = slog.Default()
Expand All @@ -35,7 +35,7 @@ func AddDataToContextHelper(
}

// Use the data provider plugin to store the raw data
enrichedCtx, err := provider.AddDataToContext(ctx, d...)
enrichedCtx, err := provider.AddDataToContext(ctx, d)
if err != nil {
return ctx, fmt.Errorf("failed to prepare context: %w", err)
}
Expand All @@ -50,10 +50,10 @@ func AddDataToContextFromProvider(
ctx context.Context,
logger *slog.Logger,
provider Provider,
d ...map[string]any,
d map[string]any,
) (context.Context, error) {
if provider == nil {
return ctx, fmt.Errorf("no data provider available")
}
return AddDataToContextHelper(ctx, logger, provider, d...)
return AddDataToContextHelper(ctx, logger, provider, d)
}
5 changes: 2 additions & 3 deletions platform/data/addDataToContext_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func TestAddDataToContextHelper(t *testing.T) {
req := createTestRequestHelper()

enrichedCtx, err := AddDataToContextHelper(baseCtx, logger, provider,
map[string]any{"key": "value"}, map[string]any{"request": req})
map[string]any{"key": "value", "request": req})

require.NoError(t, err)
assert.NotEqual(t, baseCtx, enrichedCtx, "Context should be modified")
Expand Down Expand Up @@ -218,8 +218,7 @@ func TestAddDataToContextWithErrorHandling(t *testing.T) {

// Add a mix of valid and invalid data to trigger an error
enrichedCtx, err := AddDataToContextHelper(baseCtx, logger, provider,
map[string]any{"valid": "data"},
map[string]any{"": "empty-key"}, // Empty key will trigger an error
map[string]any{"valid": "data", "": "empty-key"}, // Empty key triggers an error
)

// Should return an error
Expand Down
6 changes: 3 additions & 3 deletions platform/data/compositeProvider.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ func deepMerge(src, dst map[string]any) map[string]any {
// staticProvider := NewStaticProvider(map[string]any{"config": configData})
// contextProvider := NewContextProvider(constants.EvalData)
// composite := NewCompositeProvider(staticProvider, contextProvider)
// ctx, err := composite.AddDataToContext(ctx, req, userData)
// ctx, err := composite.AddDataToContext(ctx, userData)
func (p *CompositeProvider) AddDataToContext(
ctx context.Context,
data ...map[string]any,
data map[string]any,
) (context.Context, error) {
// Start with the original context
finalCtx := ctx
Expand Down Expand Up @@ -116,7 +116,7 @@ func (p *CompositeProvider) AddDataToContext(
staticCount++
}

nextCtx, err := provider.AddDataToContext(finalCtx, data...)
nextCtx, err := provider.AddDataToContext(finalCtx, data)
if err != nil {
// Handle StaticProvider errors separately
if isStaticProvider && errors.Is(err, ErrStaticProviderNoRuntimeUpdates) {
Expand Down
Loading