Skip to content

Commit

Permalink
test(hydra): export virtual tree (#224)
Browse files Browse the repository at this point in the history
  • Loading branch information
plastikfan committed Oct 26, 2024
1 parent fe77ab0 commit 1493cea
Show file tree
Hide file tree
Showing 19 changed files with 141 additions and 135 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"nicksnyder",
"nolint",
"nolintlint",
"Nuxx",
"onsi",
"outdir",
"Persistable",
Expand Down
4 changes: 2 additions & 2 deletions director-prime_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
"github.com/snivilised/traverse/core"
"github.com/snivilised/traverse/cycle"
"github.com/snivilised/traverse/enums"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/hydra"
"github.com/snivilised/traverse/internal/opts"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/locale"
Expand All @@ -33,7 +33,7 @@ var _ = Describe("Director(Prime)", Ordered, func() {
},
)).To(Succeed())

tree = lab.Repo("test")
tree = hydra.Repo("test")
})

BeforeEach(func() {
Expand Down
128 changes: 89 additions & 39 deletions ...rnal/laboratory/directory-tree-builder.go → hydra/virtual-tree.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package lab
package hydra

import (
"bytes"
"encoding/xml"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"testing/fstest"
Expand All @@ -14,47 +15,67 @@ import (
"github.com/snivilised/traverse/internal/third/lo"
)

const (
offset = 2
tabSize = 2
doWrite = true
)

func Musico(verbose bool, portions ...string) (fS *luna.MemFS, root string) {
// Nuxx is a luna.MemFS factory hardcoded to Musico
func Nuxx(verbose bool, portions ...string) (fS *luna.MemFS) {
fS = luna.NewMemFS()

root = Provision(
NewMemWriteProvider(fS, os.ReadFile, portions...),
musico(
newMemWriteProvider(fS, os.ReadFile, verbose, portions...),
verbose,
portions...,
)

return fS, root
return fS
}

func Provision(provider *IOProvider, verbose bool, portions ...string) (root string) {
repo := Repo("")
root = filepath.Join(repo, "test", "data", "MUSICO")
index := Join(repo, "test/data/musico-index.xml")
// CustomTree is a luna.MemFS factory, equivalent to Nuxx that is populated by an
// alternative xml file. index is the full path the xml index file and
// tree is the name of the root element in the file (for Nuxx, this would be
// "MUSICO"). The tree can be filtered by specifying 'portions'.
func CustomTree(index, element string, verbose bool,
portions ...string,
) (fS *luna.MemFS, err error) {
fS = luna.NewMemFS()

if err := ensure(index, provider, verbose); err != nil {
fmt.Printf("provision failed %v\n", err.Error())
return ""
err = custom(
index,
element,
newMemWriteProvider(fS, os.ReadFile, verbose, portions...),
verbose,
)

return fS, err
}

func custom(index, tree string, provider *IOProvider, verbose bool) error {
if _, err := os.Stat(index); err != nil {
return err
}

if verbose {
fmt.Printf("\n🤖 re-generated tree at '%v' (filters: '%v')\n\n",
root, strings.Join(portions, ", "),
)
if err := ensure(index, tree, provider, verbose); err != nil {
return err
}

return root
return nil
}

const (
offset = 2
tabSize = 2
doWrite = true
)

func musico(provider *IOProvider, verbose bool) {
repo := Repo("")
index := Combine(repo, "test/data/musico-index.xml")

if err := ensure(index, "MUSICO", provider, verbose); err != nil {
fmt.Printf("provision failed %v\n", err.Error())
}
}

// ensure
func ensure(index string, provider *IOProvider, verbose bool) error {
builder := directoryTreeBuilder{
tree: "MUSICO",
func ensure(index, tree string, provider *IOProvider, verbose bool) error {
builder := virtualTree{
tree: tree,
stack: collections.NewStack[string](),
index: index,
doWrite: doWrite,
Expand All @@ -74,8 +95,9 @@ func ensure(index string, provider *IOProvider, verbose bool) error {
return builder.walk()
}

func NewMemWriteProvider(fS *luna.MemFS,
func newMemWriteProvider(fS *luna.MemFS,
indexReader readFile,
verbose bool,
portions ...string,
) *IOProvider {
filter := lo.Ternary(len(portions) > 0,
Expand All @@ -93,6 +115,12 @@ func NewMemWriteProvider(fS *luna.MemFS,
}),
)

if verbose {
fmt.Printf("\n🤖 re-generating tree (filters: '%v')\n\n",
strings.Join(portions, ", "),
)
}

// PS: to check the existence of a path in an fs in production
// code, use fs.Stat(fsys, path) instead of os.Stat/os.Lstat

Expand Down Expand Up @@ -230,8 +258,8 @@ func (fn matcher) match(portion string) bool {
return fn(portion)
}

// directoryTreeBuilder
type directoryTreeBuilder struct {
// virtualTree
type virtualTree struct {
tree string
full string
stack *collections.Stack[string]
Expand All @@ -244,7 +272,7 @@ type directoryTreeBuilder struct {
show display
}

func (r *directoryTreeBuilder) read() (*Directory, error) {
func (r *virtualTree) read() (*Directory, error) {
data, err := r.provider.file.in.read(r.index)

if err != nil {
Expand All @@ -260,32 +288,32 @@ func (r *directoryTreeBuilder) read() (*Directory, error) {
return &tree.Root, nil
}

func (r *directoryTreeBuilder) pad() string {
func (r *virtualTree) pad() string {
return string(bytes.Repeat([]byte{' '}, (r.depth+offset)*tabSize))
}

func (r *directoryTreeBuilder) refill() string {
func (r *virtualTree) refill() string {
segments := r.stack.Content()
return filepath.Join(segments...)
}

func (r *directoryTreeBuilder) inc(name string) {
func (r *virtualTree) inc(name string) {
r.stack.Push(name)
r.full = r.refill()

r.depth++
r.padding = r.pad()
}

func (r *directoryTreeBuilder) dec() {
func (r *virtualTree) dec() {
_, _ = r.stack.Pop()
r.full = r.refill()

r.depth--
r.padding = r.pad()
}

func (r *directoryTreeBuilder) walk() error {
func (r *virtualTree) walk() error {
top, err := r.read()

if err != nil {
Expand All @@ -297,7 +325,7 @@ func (r *directoryTreeBuilder) walk() error {
return r.dir(*top, true)
}

func (r *directoryTreeBuilder) dir(dir Directory, isRoot bool) error { //nolint:gocritic // performance is not a concern
func (r *virtualTree) dir(dir Directory, isRoot bool) error { //nolint:gocritic // performance is not a concern
if !isRoot {
// We dont to add the root because only the descendents of the root
// should be added
Expand All @@ -322,7 +350,7 @@ func (r *directoryTreeBuilder) dir(dir Directory, isRoot bool) error { //nolint:
}

for _, file := range dir.Files {
full := Join(r.full, file.Name)
full := Combine(r.full, file.Name)

if r.doWrite {
if err := r.provider.file.out.write(
Expand All @@ -340,3 +368,25 @@ func (r *directoryTreeBuilder) dir(dir Directory, isRoot bool) error { //nolint:

return nil
}

// Combine creates a path from the parent combined with the relative path. The relative
// path is a file system path so should only contain forward slashes, not the standard
// file path separator as denoted by filepath.Separator, typically used when interacting
// with the local file system. Do not use trailing "/".
func Combine(parent, relative string) string {
if relative == "" {
return parent
}

return parent + "/" + relative
}

// Repo gets the path of the repo with relative joined on
func Repo(relative string) string {
cmd := exec.Command("git", "rev-parse", "--show-toplevel")
output, _ := cmd.Output()

repo := strings.TrimSpace(string(output))

return Combine(repo, relative)
}
15 changes: 10 additions & 5 deletions internal/feat/hiber/hibernate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,31 @@ import (
tv "github.com/snivilised/traverse"
"github.com/snivilised/traverse/core"
"github.com/snivilised/traverse/enums"
"github.com/snivilised/traverse/hydra"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/internal/third/lo"
)

var _ = Describe("feature", Ordered, func() {
var (
fS *luna.MemFS
root string
fS *luna.MemFS
)

BeforeAll(func() {
const (
verbose = false
)

fS, root = lab.Musico(verbose,
lab.Static.RetroWave, "edm",
var (
err error
)
Expect(root).NotTo(BeEmpty())

repo := hydra.Repo("")
index := hydra.Combine(repo, "test/data/musico-index.xml")
fS, err = hydra.CustomTree(index, "MUSICO", verbose, lab.Static.RetroWave, "edm")

Expect(err).To(Succeed(), "Failed to initialise custom tree with MUSICO data")
Expect(li18ngo.Use()).To(Succeed())
})

Expand Down
9 changes: 3 additions & 6 deletions internal/feat/hiber/with-filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,23 @@ import (

"github.com/snivilised/traverse/core"
"github.com/snivilised/traverse/enums"
"github.com/snivilised/traverse/hydra"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/pref"
)

var _ = Describe("feature", Ordered, func() {
var (
fS *luna.MemFS
root string
fS *luna.MemFS
)

BeforeAll(func() {
const (
verbose = false
)

fS, root = lab.Musico(verbose,
lab.Static.RetroWave, "edm",
)
Expect(root).NotTo(BeEmpty())
fS = hydra.Nuxx(verbose, lab.Static.RetroWave, "edm")
Expect(li18ngo.Use()).To(Succeed())
})

Expand Down
9 changes: 3 additions & 6 deletions internal/feat/sampling/navigator-sample_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
tv "github.com/snivilised/traverse"
"github.com/snivilised/traverse/core"
"github.com/snivilised/traverse/enums"
"github.com/snivilised/traverse/hydra"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/internal/third/lo"
Expand All @@ -19,19 +20,15 @@ import (

var _ = Describe("feature", Ordered, func() {
var (
fS *luna.MemFS
root string
fS *luna.MemFS
)

BeforeAll(func() {
const (
verbose = false
)

fS, root = lab.Musico(verbose,
lab.Static.RetroWave, "edm",
)
Expect(root).NotTo(BeEmpty())
fS = hydra.Nuxx(verbose, lab.Static.RetroWave, "edm")
Expect(li18ngo.Use()).To(Succeed())
})

Expand Down
9 changes: 3 additions & 6 deletions internal/filtering/filter-custom_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/snivilised/nefilim/luna"
tv "github.com/snivilised/traverse"
"github.com/snivilised/traverse/enums"
"github.com/snivilised/traverse/hydra"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/internal/third/lo"
Expand All @@ -17,19 +18,15 @@ import (

var _ = Describe("NavigatorFilterCustom", Ordered, func() {
var (
fS *luna.MemFS
root string
fS *luna.MemFS
)

BeforeAll(func() {
const (
verbose = false
)

fS, root = lab.Musico(verbose,
lab.Static.RetroWave,
)
Expect(root).NotTo(BeEmpty())
fS = hydra.Nuxx(verbose, lab.Static.RetroWave)
Expect(li18ngo.Use()).To(Succeed())
})

Expand Down
Loading

0 comments on commit 1493cea

Please sign in to comment.