mirror of
https://github.com/go-task/task.git
synced 2025-06-23 00:38:19 +02:00
fix: requires allowed values works with dynamic var (#2033)
This commit is contained in:
35
requires.go
35
requires.go
@ -13,20 +13,10 @@ func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var missingVars []string
|
var missingVars []string
|
||||||
var notAllowedValuesVars []errors.NotAllowedVar
|
|
||||||
for _, requiredVar := range t.Requires.Vars {
|
for _, requiredVar := range t.Requires.Vars {
|
||||||
value, ok := t.Vars.Get(requiredVar.Name)
|
_, ok := t.Vars.Get(requiredVar.Name)
|
||||||
if !ok {
|
if !ok {
|
||||||
missingVars = append(missingVars, requiredVar.Name)
|
missingVars = append(missingVars, requiredVar.Name)
|
||||||
} else {
|
|
||||||
value, isString := value.Value.(string)
|
|
||||||
if isString && requiredVar.Enum != nil && !slices.Contains(requiredVar.Enum, value) {
|
|
||||||
notAllowedValuesVars = append(notAllowedValuesVars, errors.NotAllowedVar{
|
|
||||||
Value: value,
|
|
||||||
Enum: requiredVar.Enum,
|
|
||||||
Name: requiredVar.Name,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +27,29 @@ func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Executor) areTaskRequiredVarsAllowedValuesSet(t *ast.Task) error {
|
||||||
|
if t.Requires == nil || len(t.Requires.Vars) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var notAllowedValuesVars []errors.NotAllowedVar
|
||||||
|
for _, requiredVar := range t.Requires.Vars {
|
||||||
|
varValue, _ := t.Vars.Get(requiredVar.Name)
|
||||||
|
|
||||||
|
value, isString := varValue.Value.(string)
|
||||||
|
if isString && requiredVar.Enum != nil && !slices.Contains(requiredVar.Enum, value) {
|
||||||
|
notAllowedValuesVars = append(notAllowedValuesVars, errors.NotAllowedVar{
|
||||||
|
Value: value,
|
||||||
|
Enum: requiredVar.Enum,
|
||||||
|
Name: requiredVar.Name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if len(notAllowedValuesVars) > 0 {
|
if len(notAllowedValuesVars) > 0 {
|
||||||
return &errors.TaskNotAllowedVars{
|
return &errors.TaskNotAllowedVars{
|
||||||
TaskName: t.Name(),
|
TaskName: t.Name(),
|
||||||
|
5
task.go
5
task.go
@ -185,6 +185,11 @@ func (e *Executor) RunTask(ctx context.Context, call *ast.Call) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := e.areTaskRequiredVarsAllowedValuesSet(t); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if !e.Watch && atomic.AddInt32(e.taskCallCount[t.Task], 1) >= MaximumTaskCall {
|
if !e.Watch && atomic.AddInt32(e.taskCallCount[t.Task], 1) >= MaximumTaskCall {
|
||||||
return &errors.TaskCalledTooManyTimesError{
|
return &errors.TaskCalledTooManyTimesError{
|
||||||
TaskName: t.Task,
|
TaskName: t.Task,
|
||||||
|
12
task_test.go
12
task_test.go
@ -180,12 +180,12 @@ func TestRequires(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require.NoError(t, e.Setup())
|
require.NoError(t, e.Setup())
|
||||||
require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "missing-var"}), "task: Task \"missing-var\" cancelled because it is missing required variables: foo")
|
require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "missing-var"}), "task: Task \"missing-var\" cancelled because it is missing required variables: FOO")
|
||||||
buff.Reset()
|
buff.Reset()
|
||||||
require.NoError(t, e.Setup())
|
require.NoError(t, e.Setup())
|
||||||
|
|
||||||
vars := ast.NewVars()
|
vars := ast.NewVars()
|
||||||
vars.Set("foo", ast.Var{Value: "bar"})
|
vars.Set("FOO", ast.Var{Value: "bar"})
|
||||||
require.NoError(t, e.Run(context.Background(), &ast.Call{
|
require.NoError(t, e.Run(context.Background(), &ast.Call{
|
||||||
Task: "missing-var",
|
Task: "missing-var",
|
||||||
Vars: vars,
|
Vars: vars,
|
||||||
@ -193,11 +193,15 @@ func TestRequires(t *testing.T) {
|
|||||||
buff.Reset()
|
buff.Reset()
|
||||||
|
|
||||||
require.NoError(t, e.Setup())
|
require.NoError(t, e.Setup())
|
||||||
require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}), "task: Task \"validation-var\" cancelled because it is missing required variables:\n - foo has an invalid value : 'bar' (allowed values : [one two])")
|
require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}), "task: Task \"validation-var\" cancelled because it is missing required variables:\n - FOO has an invalid value : 'bar' (allowed values : [one two])")
|
||||||
buff.Reset()
|
buff.Reset()
|
||||||
|
|
||||||
require.NoError(t, e.Setup())
|
require.NoError(t, e.Setup())
|
||||||
vars.Set("foo", ast.Var{Value: "one"})
|
require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var-dynamic", Vars: vars}))
|
||||||
|
buff.Reset()
|
||||||
|
|
||||||
|
require.NoError(t, e.Setup())
|
||||||
|
vars.Set("FOO", ast.Var{Value: "one"})
|
||||||
require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}))
|
require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}))
|
||||||
buff.Reset()
|
buff.Reset()
|
||||||
|
|
||||||
|
15
testdata/requires/Taskfile.yml
vendored
15
testdata/requires/Taskfile.yml
vendored
@ -7,7 +7,7 @@ tasks:
|
|||||||
missing-var:
|
missing-var:
|
||||||
requires:
|
requires:
|
||||||
vars:
|
vars:
|
||||||
- foo
|
- FOO
|
||||||
cmd: echo "{{.foo}}"
|
cmd: echo "{{.foo}}"
|
||||||
|
|
||||||
var-defined-in-task:
|
var-defined-in-task:
|
||||||
@ -19,10 +19,21 @@ tasks:
|
|||||||
cmd: echo "{{.FOO}}"
|
cmd: echo "{{.FOO}}"
|
||||||
|
|
||||||
|
|
||||||
|
validation-var-dynamic:
|
||||||
|
vars:
|
||||||
|
FOO:
|
||||||
|
sh: echo "one"
|
||||||
|
|
||||||
|
requires:
|
||||||
|
vars:
|
||||||
|
- name: FOO
|
||||||
|
enum: ['one', 'two']
|
||||||
|
|
||||||
|
|
||||||
validation-var:
|
validation-var:
|
||||||
requires:
|
requires:
|
||||||
vars:
|
vars:
|
||||||
- name: foo
|
- name: FOO
|
||||||
enum: ['one', 'two']
|
enum: ['one', 'two']
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user