Skip to content

Commit

Permalink
feat: Add read_properties, write_properties and get_dir to the builti…
Browse files Browse the repository at this point in the history
…n starlark modules (#975)

Signed-off-by: Akash Nayak <[email protected]>
  • Loading branch information
Akash-Nayak authored Mar 6, 2023
1 parent 0298b0d commit 7b836fb
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions transformer/external/starlarktransformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/konveyor/move2kube/types"
qatypes "github.com/konveyor/move2kube/types/qaengine"
transformertypes "github.com/konveyor/move2kube/types/transformer"
"github.com/magiconair/properties"
"github.com/qri-io/starlib"
starutil "github.com/qri-io/starlib/util"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -61,10 +62,13 @@ const (
fsReadFnName = "read"
fsReadDirFnName = "read_dir"
fsIsDirFnName = "is_dir"
fsGetDirFnName = "get_dir"
fsGetYamIsWithTypeMetaFnName = "get_yamls_with_type_meta"
fsFindXmlPathFnName = "find_xml_path"
fsGetFilesWithPatternFnName = "get_files_with_pattern"
fsPathJoinFnName = "path_join"
fsReadPropertiesFnName = "read_properties"
fsWritePropertiesFnName = "write_properties"
fsWriteFnName = "write"
fsPathBaseFnName = "path_base"
fsPathRelFnName = "path_rel"
Expand Down Expand Up @@ -352,9 +356,12 @@ func (t *Starlark) addFSModules() {
fsIsDirFnName: t.getStarlarkFSIsDir(),
fsGetFilesWithPatternFnName: t.getStarlarkFSGetFilesWithPattern(),
fsPathJoinFnName: t.getStarlarkFSPathJoin(),
fsReadPropertiesFnName: t.getStarlarkFSReadProperties(),
fsWritePropertiesFnName: t.getStarlarkFSWriteProperties(),
fsWriteFnName: t.getStarlarkFSWrite(),
fsGetYamIsWithTypeMetaFnName: t.getStarlarkFSGetYamlsWithTypeMeta(),
fsPathBaseFnName: t.getStarlarkFSPathBase(),
fsGetDirFnName: t.getStarlarkFSGetDir(),
fsPathRelFnName: t.getStarlarkFSPathRel(),
fsFindXmlPathFnName: t.getStarlarkFindXmlPath(),
},
Expand Down Expand Up @@ -671,6 +678,19 @@ func (t *Starlark) getStarlarkFSPathBase() *starlark.Builtin {
})
}

func (t *Starlark) getStarlarkFSGetDir() *starlark.Builtin {
return starlark.NewBuiltin(fsGetDirFnName, func(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
var filePath string
if err := starlark.UnpackPositionalArgs(fsGetDirFnName, args, kwargs, 1, &filePath); err != nil {
return nil, err
}
if !t.Env.IsPathValid(filePath) {
return starlark.None, fmt.Errorf("the path '%s' is invalid", filePath)
}
return starlark.String(filepath.Dir(filePath)), nil
})
}

func (t *Starlark) getStarlarkFSPathRel() *starlark.Builtin {
return starlark.NewBuiltin(fsPathRelFnName, func(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
var basePath, targetPath string
Expand Down Expand Up @@ -738,3 +758,60 @@ func (t *Starlark) getStarlarkArchTarStr() *starlark.Builtin {
return starlark.String(common.CreateTarArchiveNoCompressionStringWrapper(srcDir)), nil
})
}

func (t *Starlark) getStarlarkFSReadProperties() *starlark.Builtin {
return starlark.NewBuiltin(fsReadPropertiesFnName, func(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
var propertiesFilePath string
if err := starlark.UnpackPositionalArgs(fsReadPropertiesFnName, args, kwargs, 1, &propertiesFilePath); err != nil {
return nil, err
}
props, err := properties.LoadFile(propertiesFilePath, properties.UTF8)
if err != nil {
logrus.Errorf("failed to parse the properties at path %s . Error: %q", propertiesFilePath, err)
}
propsMap := props.Map()
propertiesMap := make(map[string]interface{}, len(propsMap))
for k, v := range propsMap {
propertiesMap[k] = v
}
return starutil.Marshal(propertiesMap)
})
}

func (t *Starlark) getStarlarkFSWriteProperties() *starlark.Builtin {
return starlark.NewBuiltin(fsWritePropertiesFnName, func(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
var propertiesFilePath string
var permissions = common.DefaultFilePermission
propertiesDict := &starlark.Dict{}
if err := starlark.UnpackPositionalArgs(fsWritePropertiesFnName, args, kwargs, 2, &propertiesFilePath, &propertiesDict); err != nil {
return starlark.None, err
}
propsDict, err := starutil.Unmarshal(propertiesDict)
if err != nil {
return starlark.None, fmt.Errorf("unable to unmarshal starlark function result : %s", err)
}
propertiesString := getPropertiesString(propsDict.(map[string]interface{}))
if !t.Env.IsPathValid(propertiesFilePath) {
return starlark.None, fmt.Errorf("the path '%s' is invalid", propertiesFilePath)
}
numBytesWritten := len(propertiesString)
err = os.WriteFile(propertiesFilePath, []byte(propertiesString), fs.FileMode(permissions))
if err != nil {
return starlark.None, fmt.Errorf("could not write to file %s", propertiesFilePath)
}
retValue, err := starutil.Marshal(numBytesWritten)
if err != nil {
return starlark.None, fmt.Errorf("failed to marshal the answer %+v of type %T into a starlark value. Error: %w", numBytesWritten, numBytesWritten, err)
}
return retValue, err
})
}

// getPropertiesString returns a string of all expanded 'key=value' pairs.
func getPropertiesString(props map[string]interface{}) string {
var s string
for key, value := range props {
s = fmt.Sprintf("%s%s=%s\n", s, key, value.(string))
}
return s
}

0 comments on commit 7b836fb

Please sign in to comment.