Answer architecture round 10: the paired ruling at fb2c809 is better; a mounted module names its manifest from its files' root, and the mount wrapper returns nothing beside an error

This commit is contained in:
2026-10-11 15:10:23 +02:00
committed by Lillem4n
parent f89540e973
commit d157e4526a
4 changed files with 39 additions and 4 deletions
+23
View File
@@ -449,3 +449,26 @@ Inherited architect, decided by:
- Navigation: `data/svse/fs.go:1` `svse`: the step from a dot path to a folder goes through the lowered-namespace rule, stated only in the README and each package doc - Navigation: `data/svse/fs.go:1` `svse`: the step from a dot path to a folder goes through the lowered-namespace rule, stated only in the README and each package doc
- Navigation: `internal/datafiles/datafiles.go:57` `labelled`: errors name sv_SE (address.json), not a path that opens as written - Navigation: `internal/datafiles/datafiles.go:57` `labelled`: errors name sv_SE (address.json), not a path that opens as written
- Locality: `fejkdata.go:99` `New`: New loads exactly its options, cancelled by `data/svse/fs.go:1`'s dependency on geose that nothing in Go expresses - Locality: `fejkdata.go:99` `New`: New loads exactly its options, cancelled by `data/svse/fs.go:1`'s dependency on geose that nothing in Go expresses
## 2026-10-11T13:08:34Z, PR #203 at fb2c809, against bf1becb
Ruling: better
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|---|---|---|---|---|---|
| Mid A | same | better | same | same | better |
| Inherited architect | better | better | same | better | better |
Mid A, decided by:
- Locality, Overall: `fejkdata.go:66` `WithDataFS`: the caller names every module and New refuses no data naming the fix, where the base prepended a package-level shippedSource behind config{shipped: true}
- Locality: `data/sv_SE/fs.go:19` `Modules`: sv_SE reading geo.SE is a Go import with a doc line, not only a template reference inside address.json
- Shape: `internal/datafiles/mount.go:13` `mounted`: a hand-built virtual fs.FS replaces a base string, balanced by Source losing a field and Walk, Load and Manifest turning path-agnostic
Inherited architect, decided by:
- Locality, Navigation, Overall: `data/sv_SE/fs.go:19` `Modules`: a locale reading its country's places is a Go import, one hop in code where the base needed the README or a trace through JSON references
- Locality, Self-sufficiency: `fejkdata.go:66` `WithDataFS`: every source is named at the call site, and leaving them all out gives an error that spells the fix
- Navigation: `data/modules.go:17` `Modules`: shipped data has a Go home inside data/, each module's manifest beside its files
- Shape: `internal/datafiles/mount.go:13` `mounted`: seven small types fake the folders above the mount, balanced by Source keeping one form and truthful per-module packages
- Self-sufficiency: `data/sv_SE/fs.go:1` `svse`: each module says in code which namespace it supplies and what it reads
+1 -1
View File
@@ -38,7 +38,7 @@ func TestPackageImports(t *testing.T) {
"data/misc": nil, "data/misc": nil,
"data/sv_SE": {"data/geo/SE"}, "data/sv_SE": {"data/geo/SE"},
"internal/builtinfunc": {"internal/datatype", "internal/drawstate", "internal/grammar", "internal/invariant", "internal/proven"}, "internal/builtinfunc": {"internal/datatype", "internal/drawstate", "internal/grammar", "internal/invariant", "internal/proven"},
"internal/datafiles": {"internal/grammar", "internal/invariant", "internal/jsonvalue"}, "internal/datafiles": {"internal/grammar", "internal/jsonvalue"},
"internal/datatype": nil, "internal/datatype": nil,
"internal/drawstate": nil, "internal/drawstate": nil,
"internal/grammar": nil, "internal/grammar": nil,
+7 -1
View File
@@ -4,6 +4,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/fs" "io/fs"
"path"
"sort" "sort"
"strings" "strings"
@@ -49,7 +50,12 @@ func (s Source) Manifest() (Manifest, error) {
} }
// ManifestPath is the manifest's path as errors name it. // ManifestPath is the manifest's path as errors name it.
func (s Source) ManifestPath() string { return s.labelled(ManifestFile) } func (s Source) ManifestPath() string {
if m, isMounted := s.fsys.(mounted); isMounted {
return s.labelled(path.Join(m.at, ManifestFile))
}
return s.labelled(ManifestFile)
}
// decodeManifest decodes a manifest, refusing any key or shape it does not define, and // decodeManifest decodes a manifest, refusing any key or shape it does not define, and
// reports every mistake: first each entry's own, in path order, then each parent naming // reports every mistake: first each entry's own, in path order, then each parent naming
+8 -2
View File
@@ -22,7 +22,10 @@ func (m mounted) Open(name string) (fs.File, error) {
} }
if ok { if ok {
f, err := m.fsys.Open(".") f, err := m.fsys.Open(".")
return mountRoot{File: f, name: path.Base(name)}, err if err != nil {
return nil, err
}
return mountRoot{File: f, name: path.Base(name)}, nil
} }
if next, ok := m.towards(name); ok { if next, ok := m.towards(name); ok {
return &mountDir{name: path.Base(name), next: next}, nil return &mountDir{name: path.Base(name), next: next}, nil
@@ -70,7 +73,10 @@ type mountRoot struct {
func (r mountRoot) Stat() (fs.FileInfo, error) { func (r mountRoot) Stat() (fs.FileInfo, error) {
info, err := r.File.Stat() info, err := r.File.Stat()
return renamed{FileInfo: info, name: r.name}, err if err != nil {
return nil, err
}
return renamed{FileInfo: info, name: r.name}, nil
} }
func (r mountRoot) ReadDir(n int) ([]fs.DirEntry, error) { func (r mountRoot) ReadDir(n int) ([]fs.DirEntry, error) {