mirror of
https://github.com/idanoo/autobrr
synced 2025-07-22 16:29:12 +00:00
feat(macros): implement template cache (#2049)
* feat(macros): implement template cache * fix: typo in error * fix(macros): set DefaultTTL * fix: accidentally removed SetTimerResolution * revert: set NoTTL in MustParse
This commit is contained in:
parent
bfda849ef5
commit
c7efcf1b75
2 changed files with 52 additions and 12 deletions
|
@ -10,11 +10,18 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/autobrr/autobrr/pkg/errors"
|
"github.com/autobrr/autobrr/pkg/errors"
|
||||||
|
"github.com/autobrr/autobrr/pkg/ttlcache"
|
||||||
|
|
||||||
"github.com/Masterminds/sprig/v3"
|
"github.com/Masterminds/sprig/v3"
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var templateCache = ttlcache.New(
|
||||||
|
ttlcache.Options[string, *template.Template]{}.
|
||||||
|
SetTimerResolution(5 * time.Minute).
|
||||||
|
SetDefaultTTL(15 * time.Minute),
|
||||||
|
)
|
||||||
|
|
||||||
type Macro struct {
|
type Macro struct {
|
||||||
Artists string
|
Artists string
|
||||||
Audio []string
|
Audio []string
|
||||||
|
@ -175,16 +182,19 @@ func (m Macro) Parse(text string) (string, error) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO implement template cache
|
// get template from cache or create new
|
||||||
|
tmpl, ok := templateCache.Get(text)
|
||||||
// setup template
|
if !ok {
|
||||||
tmpl, err := template.New("macro").Funcs(sprig.TxtFuncMap()).Parse(text)
|
var err error
|
||||||
if err != nil {
|
tmpl, err = template.New("macro").Funcs(sprig.TxtFuncMap()).Parse(text)
|
||||||
return "", errors.Wrap(err, "could parse macro template")
|
if err != nil {
|
||||||
|
return "", errors.Wrap(err, "could not parse macro template")
|
||||||
|
}
|
||||||
|
templateCache.Set(text, tmpl, ttlcache.DefaultTTL)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tpl bytes.Buffer
|
var tpl bytes.Buffer
|
||||||
err = tmpl.Execute(&tpl, m)
|
err := tmpl.Execute(&tpl, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "could not parse macro")
|
return "", errors.Wrap(err, "could not parse macro")
|
||||||
}
|
}
|
||||||
|
@ -198,14 +208,19 @@ func (m Macro) MustParse(text string) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup template
|
// get template from cache or create new
|
||||||
tmpl, err := template.New("macro").Funcs(sprig.TxtFuncMap()).Parse(text)
|
tmpl, ok := templateCache.Get(text)
|
||||||
if err != nil {
|
if !ok {
|
||||||
return ""
|
var err error
|
||||||
|
tmpl, err = template.New("macro").Funcs(sprig.TxtFuncMap()).Parse(text)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
templateCache.Set(text, tmpl, ttlcache.NoTTL)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tpl bytes.Buffer
|
var tpl bytes.Buffer
|
||||||
err = tmpl.Execute(&tpl, m)
|
err := tmpl.Execute(&tpl, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,3 +290,28 @@ func TestMacros_Parse(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMacros_TemplateCache(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
release := Release{
|
||||||
|
TorrentName: "Test Movie 2024",
|
||||||
|
Year: 2024,
|
||||||
|
}
|
||||||
|
|
||||||
|
m := NewMacro(release)
|
||||||
|
template := "{{.TorrentName}} ({{.Year}})"
|
||||||
|
|
||||||
|
// parse and cache
|
||||||
|
got1, err := m.Parse(template)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "Test Movie 2024 (2024)", got1)
|
||||||
|
|
||||||
|
// use cached template
|
||||||
|
got2, err := m.Parse(template)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "Test Movie 2024 (2024)", got2)
|
||||||
|
|
||||||
|
_, ok := templateCache.Get(template)
|
||||||
|
assert.True(t, ok, "template should be in cache")
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue