extractCode extracts code between two code block markers.
(response, codeBlockDelim string)
| 34 | |
| 35 | // extractCode extracts code between two code block markers. |
| 36 | func extractCode(response, codeBlockDelim string) (string, error) { |
| 37 | if !strings.Contains(response, codeBlockDelim) { |
| 38 | return "", fmt.Errorf("no marker string %q", codeBlockDelim) |
| 39 | } |
| 40 | var codeLines []string |
| 41 | isCodeBlock := false |
| 42 | for _, line := range strings.Split(response, "\n") { |
| 43 | if strings.HasPrefix(line, codeBlockDelim) { |
| 44 | isCodeBlock = !isCodeBlock |
| 45 | } else if isCodeBlock { |
| 46 | codeLines = append(codeLines, line) |
| 47 | } |
| 48 | } |
| 49 | if isCodeBlock { |
| 50 | return "", errors.New("non-terminated code block") |
| 51 | } |
| 52 | if len(codeLines) == 0 { |
| 53 | return "", errors.New("no or empty code block") |
| 54 | } |
| 55 | return strings.Join(codeLines, "\n") + "\n", nil |
| 56 | } |
| 57 | |
| 58 | // runSandboxedPython runs the given Python code in a sandboxed container. |
| 59 | func runSandboxedPython(ctx context.Context, logger testutil.Logger, code string) (string, error) { |