Skip to content

Commit

Permalink
correct load path for non-top-level templates
Browse files Browse the repository at this point in the history
  • Loading branch information
cppforlife committed Mar 28, 2019
1 parent 2446608 commit 4f0cb6e
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 29 deletions.
42 changes: 21 additions & 21 deletions pkg/cmd/template/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,28 +92,28 @@ func (o *TemplateOptions) RunWithFiles(in TemplateInput, ui cmdcore.PlainUI) Tem

loader := workspace.NewTemplateLoader(values, ui)

for _, file := range forOutputFiles {
for _, fileInLib := range forOutputFiles {
// TODO find more generic way
switch file.Type() {
switch fileInLib.File.Type() {
case files.TypeYAML:
_, resultVal, err := loader.EvalYAML(rootLibrary, file)
_, resultVal, err := loader.EvalYAML(fileInLib.Library, fileInLib.File)
if err != nil {
return TemplateOutput{Err: err}
}

resultDocSet := resultVal.(*yamlmeta.DocumentSet)
outputDocSets[file.RelativePath()] = resultDocSet
outputDocSets[fileInLib.File.RelativePath()] = resultDocSet

case files.TypeText:
_, resultVal, err := loader.EvalText(rootLibrary, file)
_, resultVal, err := loader.EvalText(fileInLib.Library, fileInLib.File)
if err != nil {
return TemplateOutput{Err: err}
}

resultStr := resultVal.(*texttemplate.NodeRoot).AsString()

ui.Debugf("### %s result\n%s", file.RelativePath(), resultStr)
outputFiles = append(outputFiles, files.NewOutputFile(file.RelativePath(), []byte(resultStr)))
ui.Debugf("### %s result\n%s", fileInLib.File.RelativePath(), resultStr)
outputFiles = append(outputFiles, files.NewOutputFile(fileInLib.File.RelativePath(), []byte(resultStr)))

default:
return TemplateOutput{Err: fmt.Errorf("Unknown file type")}
Expand Down Expand Up @@ -142,36 +142,36 @@ func (o *TemplateOptions) RunWithFiles(in TemplateInput, ui cmdcore.PlainUI) Tem
return TemplateOutput{Files: outputFiles, DocSet: combinedDocSet}
}

func (o *TemplateOptions) categorizeFiles(allFiles []*files.File) ([]*files.File, interface{}, error) {
func (o *TemplateOptions) categorizeFiles(allFiles []workspace.FileInLibrary) ([]workspace.FileInLibrary, interface{}, error) {
allFiles, values, err := o.extractValues(allFiles)
if err != nil {
return nil, nil, err
}

forOutputFiles := []*files.File{}
forOutputFiles := []workspace.FileInLibrary{}

for _, file := range allFiles {
if file.IsForOutput() {
forOutputFiles = append(forOutputFiles, file)
for _, fileInLib := range allFiles {
if fileInLib.File.IsForOutput() {
forOutputFiles = append(forOutputFiles, fileInLib)
}
}

return forOutputFiles, values, nil
}

func (o *TemplateOptions) extractValues(fs []*files.File) ([]*files.File, interface{}, error) {
func (o *TemplateOptions) extractValues(fs []workspace.FileInLibrary) ([]workspace.FileInLibrary, interface{}, error) {
var foundValues interface{}
var valuesFile *files.File
var newFs []*files.File
var newFs []workspace.FileInLibrary

for _, file := range fs {
if file.Type() == files.TypeYAML && file.IsTemplate() {
fileBs, err := file.Bytes()
for _, fileInLib := range fs {
if fileInLib.File.Type() == files.TypeYAML && fileInLib.File.IsTemplate() {
fileBs, err := fileInLib.File.Bytes()
if err != nil {
return nil, nil, err
}

docSet, err := yamlmeta.NewDocumentSetFromBytes(fileBs, file.RelativePath())
docSet, err := yamlmeta.NewDocumentSetFromBytes(fileBs, fileInLib.File.RelativePath())
if err != nil {
return nil, nil, fmt.Errorf("Unmarshaling YAML template: %s", err)
}
Expand All @@ -186,15 +186,15 @@ func (o *TemplateOptions) extractValues(fs []*files.File) ([]*files.File, interf
// TODO until overlays are here
return nil, nil, fmt.Errorf(
"Template values could only be specified once, but found multiple (%s, %s)",
valuesFile.RelativePath(), file.RelativePath())
valuesFile.RelativePath(), fileInLib.File.RelativePath())
}
valuesFile = file
valuesFile = fileInLib.File
foundValues = values
continue
}
}

newFs = append(newFs, file)
newFs = append(newFs, fileInLib)
}

return newFs, foundValues, nil
Expand Down
56 changes: 53 additions & 3 deletions pkg/cmd/template/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ end`)
}

if len(out.Files) != 1 {
t.Fatalf("Expected number of output files to be 1, but was %#v", out.Files)
t.Fatalf("Expected number of output files to be 1, but was %d", len(out.Files))
}

file := out.Files[0]
Expand Down Expand Up @@ -127,7 +127,7 @@ yamlfunc: yamlfunc`)
}

if len(out.Files) != 1 {
t.Fatalf("Expected number of output files to be 1, but was %#v", out.Files)
t.Fatalf("Expected number of output files to be 1, but was %d", len(out.Files))
}

file := out.Files[0]
Expand Down Expand Up @@ -240,7 +240,13 @@ localstarfunc:
yamlfunc: #@ textfunc()`)

starlarkFuncsData := []byte(`
load("@funcs:funcs.star", "libstarfunc")
def starfunc():
return libstarfunc()
end`)

starlarkFuncsLibData := []byte(`
def libstarfunc():
return [1,2]
end`)

Expand All @@ -257,6 +263,7 @@ end`)
files.MustNewFileFromSource(files.NewBytesSource("_ytt_lib/library1/funcs.lib.yml", yamlFuncsData)),
files.MustNewFileFromSource(files.NewBytesSource("_ytt_lib/library1/sub-dir/funcs.lib.txt", txtFuncsData)),
files.MustNewFileFromSource(files.NewBytesSource("_ytt_lib/library2/funcs.star", starlarkFuncsData)),
files.MustNewFileFromSource(files.NewBytesSource("_ytt_lib/library2/_ytt_lib/funcs/funcs.star", starlarkFuncsLibData)),
}

ui := cmdcore.NewPlainUI(false)
Expand All @@ -268,7 +275,7 @@ end`)
}

if len(out.Files) != 1 {
t.Fatalf("Expected number of output files to be 1, but was %#v", out.Files)
t.Fatalf("Expected number of output files to be 1, but was %d", len(out.Files))
}

file := out.Files[0]
Expand All @@ -281,3 +288,46 @@ end`)
t.Fatalf("Expected output file to have specific data, but was: >>>%s<<<", file.Bytes())
}
}

func TestRelativeLoadInLibrariesForNonRootTemplates(t *testing.T) {
expectedYAMLTplData := `libstarfunc:
- 1
- 2
`

nonTopLevelYmlTplData := []byte(`
#@ load("@funcs:funcs.star", "libstarfunc")
libstarfunc: #@ libstarfunc()`)

nonTopLevelStarlarkFuncsLibData := []byte(`
def libstarfunc():
return [1,2]
end`)

filesToProcess := []*files.File{
files.MustNewFileFromSource(files.NewBytesSource("non-top-level/tpl.yml", nonTopLevelYmlTplData)),
files.MustNewFileFromSource(files.NewBytesSource("non-top-level/_ytt_lib/funcs/funcs.star", nonTopLevelStarlarkFuncsLibData)),
}

ui := cmdcore.NewPlainUI(false)
opts := cmdtpl.NewOptions()

out := opts.RunWithFiles(cmdtpl.TemplateInput{Files: filesToProcess}, ui)
if out.Err != nil {
t.Fatalf("Expected RunWithFiles to succeed, but was error: %s", out.Err)
}

if len(out.Files) != 1 {
t.Fatalf("Expected number of output files to be 1, but was %d", len(out.Files))
}

file := out.Files[0]

if file.RelativePath() != "non-top-level/tpl.yml" {
t.Fatalf("Expected output file to be non-top-level/tpl.yml, but was %#v", file.RelativePath())
}

if string(file.Bytes()) != expectedYAMLTplData {
t.Fatalf("Expected output file to have specific data, but was: >>>%s<<<", file.Bytes())
}
}
13 changes: 10 additions & 3 deletions pkg/workspace/library.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,16 @@ func (l *Library) FindFile(path string) (*files.File, error) {
return nil, fmt.Errorf("Expected to find file %s", path)
}

func (l *Library) ListAccessibleFiles() []*files.File {
var result []*files.File
result = append(result, l.files...)
type FileInLibrary struct {
File *files.File
Library *Library
}

func (l *Library) ListAccessibleFiles() []FileInLibrary {
var result []FileInLibrary
for _, file := range l.files {
result = append(result, FileInLibrary{File: file, Library: l})
}
for _, lib := range l.children {
if !lib.private {
result = append(result, lib.ListAccessibleFiles()...)
Expand Down
4 changes: 2 additions & 2 deletions pkg/workspace/template_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ func (l *TemplateLoader) ListData(thread *starlark.Thread, f *starlark.Builtin,
}

result := []starlark.Value{}
for _, file := range l.getLibrary(thread).ListAccessibleFiles() {
result = append(result, starlark.String(file.RelativePath()))
for _, fileInLib := range l.getLibrary(thread).ListAccessibleFiles() {
result = append(result, starlark.String(fileInLib.File.RelativePath()))
}
return starlark.NewList(result), nil
}
Expand Down

0 comments on commit 4f0cb6e

Please sign in to comment.