mirror of
				https://github.com/go-task/task.git
				synced 2025-10-30 23:58:01 +02:00 
			
		
		
		
	feat: display allowed values when vars are not provided (#2052)
This commit is contained in:
		| @@ -141,21 +141,37 @@ func (err *TaskCancelledNoTerminalError) Code() int { | ||||
| 	return CodeTaskCancelled | ||||
| } | ||||
|  | ||||
| // TaskMissingRequiredVars is returned when a task is missing required variables. | ||||
| type TaskMissingRequiredVars struct { | ||||
| // TaskMissingRequiredVarsError is returned when a task is missing required variables. | ||||
|  | ||||
| type MissingVar struct { | ||||
| 	Name          string | ||||
| 	AllowedValues []string | ||||
| } | ||||
| type TaskMissingRequiredVarsError struct { | ||||
| 	TaskName    string | ||||
| 	MissingVars []string | ||||
| 	MissingVars []MissingVar | ||||
| } | ||||
|  | ||||
| func (err *TaskMissingRequiredVars) Error() string { | ||||
| func (v MissingVar) String() string { | ||||
| 	if len(v.AllowedValues) == 0 { | ||||
| 		return v.Name | ||||
| 	} | ||||
| 	return fmt.Sprintf("%s (allowed values: %v)", v.Name, v.AllowedValues) | ||||
| } | ||||
|  | ||||
| func (err *TaskMissingRequiredVarsError) Error() string { | ||||
| 	var vars []string | ||||
| 	for _, v := range err.MissingVars { | ||||
| 		vars = append(vars, v.String()) | ||||
| 	} | ||||
|  | ||||
| 	return fmt.Sprintf( | ||||
| 		`task: Task %q cancelled because it is missing required variables: %s`, | ||||
| 		err.TaskName, | ||||
| 		strings.Join(err.MissingVars, ", "), | ||||
| 	) | ||||
| 		strings.Join(vars, ", ")) | ||||
| } | ||||
|  | ||||
| func (err *TaskMissingRequiredVars) Code() int { | ||||
| func (err *TaskMissingRequiredVarsError) Code() int { | ||||
| 	return CodeTaskMissingRequiredVars | ||||
| } | ||||
|  | ||||
| @@ -165,12 +181,12 @@ type NotAllowedVar struct { | ||||
| 	Name  string | ||||
| } | ||||
|  | ||||
| type TaskNotAllowedVars struct { | ||||
| type TaskNotAllowedVarsError struct { | ||||
| 	TaskName       string | ||||
| 	NotAllowedVars []NotAllowedVar | ||||
| } | ||||
|  | ||||
| func (err *TaskNotAllowedVars) Error() string { | ||||
| func (err *TaskNotAllowedVarsError) Error() string { | ||||
| 	var builder strings.Builder | ||||
|  | ||||
| 	builder.WriteString(fmt.Sprintf("task: Task %q cancelled because it is missing required variables:\n", err.TaskName)) | ||||
| @@ -181,6 +197,6 @@ func (err *TaskNotAllowedVars) Error() string { | ||||
| 	return builder.String() | ||||
| } | ||||
|  | ||||
| func (err *TaskNotAllowedVars) Code() int { | ||||
| func (err *TaskNotAllowedVarsError) Code() int { | ||||
| 	return CodeTaskNotAllowedVars | ||||
| } | ||||
|   | ||||
							
								
								
									
										11
									
								
								requires.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								requires.go
									
									
									
									
									
								
							| @@ -12,16 +12,19 @@ func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	var missingVars []string | ||||
| 	var missingVars []errors.MissingVar | ||||
| 	for _, requiredVar := range t.Requires.Vars { | ||||
| 		_, ok := t.Vars.Get(requiredVar.Name) | ||||
| 		if !ok { | ||||
| 			missingVars = append(missingVars, requiredVar.Name) | ||||
| 			missingVars = append(missingVars, errors.MissingVar{ | ||||
| 				Name:          requiredVar.Name, | ||||
| 				AllowedValues: requiredVar.Enum, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(missingVars) > 0 { | ||||
| 		return &errors.TaskMissingRequiredVars{ | ||||
| 		return &errors.TaskMissingRequiredVarsError{ | ||||
| 			TaskName:    t.Name(), | ||||
| 			MissingVars: missingVars, | ||||
| 		} | ||||
| @@ -51,7 +54,7 @@ func (e *Executor) areTaskRequiredVarsAllowedValuesSet(t *ast.Task) error { | ||||
| 	} | ||||
|  | ||||
| 	if len(notAllowedValuesVars) > 0 { | ||||
| 		return &errors.TaskNotAllowedVars{ | ||||
| 		return &errors.TaskNotAllowedVarsError{ | ||||
| 			TaskName:       t.Name(), | ||||
| 			NotAllowedVars: notAllowedValuesVars, | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										13
									
								
								task_test.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								task_test.go
									
									
									
									
									
								
							| @@ -186,23 +186,30 @@ func TestRequires(t *testing.T) { | ||||
|  | ||||
| 	vars := ast.NewVars() | ||||
| 	vars.Set("FOO", ast.Var{Value: "bar"}) | ||||
|  | ||||
| 	require.NoError(t, e.Run(context.Background(), &ast.Call{ | ||||
| 		Task: "missing-var", | ||||
| 		Vars: vars, | ||||
| 	})) | ||||
| 	buff.Reset() | ||||
|  | ||||
| 	vars.Set("ENV", ast.Var{Value: "dev"}) | ||||
| 	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])") | ||||
| 	buff.Reset() | ||||
|  | ||||
| 	require.NoError(t, e.Setup()) | ||||
| 	require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var-dynamic", Vars: vars})) | ||||
| 	vars.Set("FOO", ast.Var{Value: "one"}) | ||||
| 	require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars})) | ||||
| 	buff.Reset() | ||||
|  | ||||
| 	vars = ast.NewVars() | ||||
| 	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: ENV, FOO (allowed values: [one two])") | ||||
| 	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-dynamic", Vars: vars})) | ||||
| 	buff.Reset() | ||||
|  | ||||
| 	require.NoError(t, e.Setup()) | ||||
|   | ||||
							
								
								
									
										2
									
								
								testdata/requires/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								testdata/requires/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							| @@ -33,10 +33,10 @@ tasks: | ||||
|   validation-var: | ||||
|     requires: | ||||
|       vars: | ||||
|         - ENV | ||||
|         - name: FOO | ||||
|           enum: ['one', 'two'] | ||||
|  | ||||
|  | ||||
|   require-before-compile: | ||||
|     requires: | ||||
|       vars: [ MY_VAR ] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user