Skip to content

Commit 22442be

Browse files
fix: accept .yml extension for user filter files
The loader only accepted .yaml files, silently ignoring .yml files in custom filter directories. Both extensions are now supported. Closes #32
1 parent bf96e21 commit 22442be

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

internal/filter/loader.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import (
88
"strings"
99
)
1010

11+
// isYAMLFile returns true if the filename ends with .yaml or .yml.
12+
func isYAMLFile(name string) bool {
13+
return strings.HasSuffix(name, ".yaml") || strings.HasSuffix(name, ".yml")
14+
}
15+
1116
// EmbeddedFS is set by the main package to provide embedded filter files.
1217
// This avoids go:embed constraints on internal packages.
1318
var EmbeddedFS *embed.FS
@@ -31,7 +36,7 @@ func LoadEmbedded() ([]Filter, error) {
3136

3237
var filters []Filter
3338
for _, entry := range entries {
34-
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".yaml") {
39+
if entry.IsDir() || !isYAMLFile(entry.Name()) {
3540
continue
3641
}
3742
path := entry.Name()
@@ -63,7 +68,7 @@ func LoadUserFilters(dir string) ([]Filter, error) {
6368

6469
var filters []Filter
6570
for _, entry := range entries {
66-
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".yaml") {
71+
if entry.IsDir() || !isYAMLFile(entry.Name()) {
6772
continue
6873
}
6974
data, err := os.ReadFile(filepath.Join(dir, entry.Name()))

internal/filter/loader_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,74 @@ on_error: "passthrough"
3535
}
3636
}
3737

38+
func TestLoadUserFiltersYMLExtension(t *testing.T) {
39+
dir := t.TempDir()
40+
41+
validYAML := `
42+
name: "yml-filter"
43+
version: 1
44+
match:
45+
command: "echo"
46+
pipeline:
47+
- action: "keep_lines"
48+
pattern: "\\S"
49+
on_error: "passthrough"
50+
`
51+
if err := os.WriteFile(filepath.Join(dir, "echo.yml"), []byte(validYAML), 0644); err != nil {
52+
t.Fatal(err)
53+
}
54+
55+
filters, err := LoadUserFilters(dir)
56+
if err != nil {
57+
t.Fatalf("unexpected error: %v", err)
58+
}
59+
if len(filters) != 1 {
60+
t.Fatalf("got %d filters, want 1", len(filters))
61+
}
62+
if filters[0].Name != "yml-filter" {
63+
t.Errorf("name = %q, want %q", filters[0].Name, "yml-filter")
64+
}
65+
}
66+
67+
func TestLoadUserFiltersBothExtensions(t *testing.T) {
68+
dir := t.TempDir()
69+
70+
yamlContent := `
71+
name: "yaml-filter"
72+
version: 1
73+
match:
74+
command: "cmd1"
75+
pipeline:
76+
- action: "head"
77+
n: 5
78+
on_error: "passthrough"
79+
`
80+
ymlContent := `
81+
name: "yml-filter"
82+
version: 1
83+
match:
84+
command: "cmd2"
85+
pipeline:
86+
- action: "tail"
87+
n: 3
88+
on_error: "passthrough"
89+
`
90+
if err := os.WriteFile(filepath.Join(dir, "a.yaml"), []byte(yamlContent), 0644); err != nil {
91+
t.Fatal(err)
92+
}
93+
if err := os.WriteFile(filepath.Join(dir, "b.yml"), []byte(ymlContent), 0644); err != nil {
94+
t.Fatal(err)
95+
}
96+
97+
filters, err := LoadUserFilters(dir)
98+
if err != nil {
99+
t.Fatalf("unexpected error: %v", err)
100+
}
101+
if len(filters) != 2 {
102+
t.Fatalf("got %d filters, want 2", len(filters))
103+
}
104+
}
105+
38106
func TestLoadUserFiltersMissingDir(t *testing.T) {
39107
filters, err := LoadUserFilters("/tmp/nonexistent-snip-filters-test")
40108
if err != nil {

0 commit comments

Comments
 (0)