pkg/handlers/variableextractors/defaults/python.go (44 lines of code) (raw):
package defaults
import (
"fmt"
"path/filepath"
"regexp"
"github.com/Azure/draft/pkg/reporeader"
)
type PythonExtractor struct {
}
// ReadDefaults reads the default values for the language from the repo files
func (p PythonExtractor) ReadDefaults(r reporeader.RepoReader) (map[string]string, error) {
extractedValues := make(map[string]string)
// Find files with .py extension in the root of the repository or upto depth 0
files, err := r.FindFiles(".", []string{"*.py"}, 0)
if err != nil {
return nil, fmt.Errorf("error finding python files: %v", err)
}
// Regex for python entrypoint pattern `if __name__ == '__main__'`
entryPointPattern := `if\s*__name__\s*==\s*["']__main__["']`
compiledPattern, err := regexp.Compile(entryPointPattern)
if err != nil {
return nil, fmt.Errorf("error compiling regex pattern: %v", err)
}
for _, filePath := range files {
fileContent, err := r.ReadFile(filePath)
baseFile := filepath.Base(filePath)
if err != nil {
return nil, fmt.Errorf(("error reading python files"))
}
fileContentInString := string(fileContent)
// Check if file contains python entrypoint pattern or name of the file is 'main.py' or 'app.py'
if compiledPattern.MatchString(fileContentInString) || baseFile == "main.py" || baseFile == "app.py" {
extractedValues["ENTRYPOINT"] = baseFile
break
}
}
// Set entrypoint to the first .py file if other conditions do not match
if _, ok := extractedValues["ENTRYPOINT"]; !ok {
if len(files) > 0 {
extractedValues["ENTRYPOINT"] = files[0]
}
}
return extractedValues, nil
}
func (p PythonExtractor) MatchesLanguage(lowerlang string) bool {
return lowerlang == "python"
}
func (p PythonExtractor) GetName() string { return "python" }
var _ reporeader.VariableExtractor = &PythonExtractor{}