mirror of
https://github.com/mikefarah/yq.git
synced 2026-06-28 16:07:46 +00:00
When using --front-matter, yq creates a temporary file for the extracted YAML content but replaces the original filename in args with the temp file path. This caused the 'filename' operator to return the temp file path instead of the original filename. Added a filename alias mechanism: when front matter processing replaces the file path, it registers the original filename as an alias. The readDocuments and stream evaluator functions resolve aliases before setting candidateNode.filename. Fixes #2538 Co-authored-by: cobyfrombrooklyn-bot <cobyfrombrooklyn@gmail.com>
193 lines
3.6 KiB
Go
193 lines
3.6 KiB
Go
package yqlib
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/mikefarah/yq/v4/test"
|
|
)
|
|
|
|
func createTestFile(content string) string {
|
|
tempFile, err := createTempFile()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
_, err = tempFile.Write([]byte(content))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
safelyCloseFile(tempFile)
|
|
|
|
return tempFile.Name()
|
|
}
|
|
|
|
func readFile(filename string) string {
|
|
bytes, err := os.ReadFile(filename)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return string(bytes)
|
|
}
|
|
|
|
func TestFrontMatterSplitWithLeadingSep(t *testing.T) {
|
|
file := createTestFile(`---
|
|
a: apple
|
|
b: banana
|
|
---
|
|
not a
|
|
yaml: doc
|
|
`)
|
|
|
|
expectedYamlFm := `---
|
|
a: apple
|
|
b: banana
|
|
`
|
|
|
|
expectedContent := `---
|
|
not a
|
|
yaml: doc
|
|
`
|
|
|
|
fmHandler := NewFrontMatterHandler(file)
|
|
err := fmHandler.Split()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())
|
|
|
|
test.AssertResult(t, expectedYamlFm, yamlFm)
|
|
|
|
contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
test.AssertResult(t, expectedContent, string(contentBytes))
|
|
|
|
tryRemoveTempFile(file)
|
|
fmHandler.CleanUp()
|
|
}
|
|
|
|
func TestFrontMatterSplitWithNoLeadingSep(t *testing.T) {
|
|
file := createTestFile(`a: apple
|
|
b: banana
|
|
---
|
|
not a
|
|
yaml: doc
|
|
`)
|
|
|
|
expectedYamlFm := `a: apple
|
|
b: banana
|
|
`
|
|
|
|
expectedContent := `---
|
|
not a
|
|
yaml: doc
|
|
`
|
|
|
|
fmHandler := NewFrontMatterHandler(file)
|
|
err := fmHandler.Split()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())
|
|
|
|
test.AssertResult(t, expectedYamlFm, yamlFm)
|
|
|
|
contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
test.AssertResult(t, expectedContent, string(contentBytes))
|
|
|
|
tryRemoveTempFile(file)
|
|
fmHandler.CleanUp()
|
|
}
|
|
|
|
func TestFrontMatterFilenamePreserved(t *testing.T) {
|
|
// Regression test for https://github.com/mikefarah/yq/issues/2538
|
|
// When using --front-matter, the filename operator should return
|
|
// the original filename, not the path to the temporary file.
|
|
file := createTestFile(`---
|
|
name: john
|
|
---
|
|
Some content
|
|
`)
|
|
originalFilename := "/path/to/original/file.md"
|
|
|
|
fmHandler := NewFrontMatterHandler(file)
|
|
err := fmHandler.Split()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
tempFilename := fmHandler.GetYamlFrontMatterFilename()
|
|
|
|
// Register the alias (as the command code does)
|
|
SetFilenameAlias(tempFilename, originalFilename)
|
|
defer ClearFilenameAliases()
|
|
|
|
// Verify resolveFilename returns the original name
|
|
resolved := resolveFilename(tempFilename)
|
|
test.AssertResult(t, originalFilename, resolved)
|
|
|
|
// Read documents using the temp file, verify they get the original filename
|
|
reader, err := readStream(tempFilename)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
decoder := NewYamlDecoder(ConfiguredYamlPreferences)
|
|
docs, err := readDocuments(reader, tempFilename, 0, decoder)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if docs.Len() == 0 {
|
|
t.Fatal("expected at least one document")
|
|
}
|
|
|
|
firstDoc := docs.Front().Value.(*CandidateNode)
|
|
test.AssertResult(t, originalFilename, firstDoc.filename)
|
|
|
|
tryRemoveTempFile(file)
|
|
fmHandler.CleanUp()
|
|
}
|
|
|
|
func TestFrontMatterSplitWithArray(t *testing.T) {
|
|
file := createTestFile(`[1,2,3]
|
|
---
|
|
not a
|
|
yaml: doc
|
|
`)
|
|
|
|
expectedYamlFm := "[1,2,3]\n"
|
|
|
|
expectedContent := `---
|
|
not a
|
|
yaml: doc
|
|
`
|
|
|
|
fmHandler := NewFrontMatterHandler(file)
|
|
err := fmHandler.Split()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())
|
|
|
|
test.AssertResult(t, expectedYamlFm, yamlFm)
|
|
|
|
contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
test.AssertResult(t, expectedContent, string(contentBytes))
|
|
|
|
tryRemoveTempFile(file)
|
|
fmHandler.CleanUp()
|
|
}
|