Add Abs method to Document

This commit is contained in:
Sasha Koshka 2024-12-08 02:18:14 -05:00
parent efb1f455c9
commit 17b6253211
2 changed files with 54 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package step
import "io"
import "time"
import "strings"
import "path/filepath"
import "html/template"
// Document represents a STEP file.
@ -54,6 +55,26 @@ func (this *Document) Environment () *Environment {
return this.environment
}
// Abs returns an absolute representation of the given path. If the path is an
// absolute path already, it is returned as-is. If the path is a relative path,
// it is treated as relative to the current working directory. If the path is an
// absolute path beginning with "." or "..", it is treated as relative to this
// document. The result is cleaned.
func (this *Document) Abs (name string) (string, error) {
if filepath.IsAbs(name) {
return filepath.Clean(name), nil
}
if strings.HasPrefix(name, ".") {
directory := this.name
ext := filepath.Ext(directory)
if ext != "" {
directory = filepath.Dir(directory)
}
return filepath.Abs(filepath.Join(directory, name))
}
return filepath.Abs(name)
}
// ExecutionData is data made available to documents as they are being exeucted.
type ExecutionData struct {
Data any // Custom data

33
document_test.go Normal file
View File

@ -0,0 +1,33 @@
package step
import "os"
import "testing"
import "path/filepath"
func TestDocumentAbs (test *testing.T) {
document := Document {
name: "foo/bar.step",
}
cwd, err := os.Getwd()
if err != nil { test.Fatal(err) }
path1, err := document.Abs("thing.step")
if err != nil { test.Fatal(err) }
path2, err := document.Abs("thing/other.step")
if err != nil { test.Fatal(err) }
path3, err := document.Abs("./thing/other.step")
if err != nil { test.Fatal(err) }
path4, err := document.Abs("../thing/other.step")
if err != nil { test.Fatal(err) }
path5, err := document.Abs("/something/thing")
if err != nil { test.Fatal(err) }
test.Log(path1)
if path1 != filepath.Join(cwd, "thing.step") { test.Fatal("incorrect path") }
test.Log(path2)
if path2 != filepath.Join(cwd, "thing/other.step") { test.Fatal("incorrect path") }
test.Log(path3)
if path3 != filepath.Join(cwd, "foo/thing/other.step") { test.Fatal("incorrect path") }
test.Log(path4)
if path4 != filepath.Join(cwd, "thing/other.step") { test.Fatal("incorrect path") }
test.Log(path5)
if path5 != "/something/thing" { test.Fatal("incorrect path") }
}