From ae62e0d9556381bdc835f803fa55476c381975f1 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 19 Jul 2025 15:37:05 +0200 Subject: [PATCH] Docs docs docs --- client/options.go | 6 + cmd/publish.go | 5 + cmd/serve.go | 8 +- cmd/user.go | 3 +- docs/publish.md | 196 +++- docs/{ => publish}/template-functions.md | 1041 ++++++----------- docs/sprig.md | 24 - docs/sprig/conversion.md | 36 - docs/sprig/crypto.md | 41 - docs/sprig/date.md | 126 -- docs/sprig/defaults.md | 169 --- docs/sprig/dicts.md | 172 --- docs/sprig/encoding.md | 6 - docs/sprig/flow_control.md | 11 - docs/sprig/integer_slice.md | 41 - docs/sprig/lists.md | 188 --- docs/sprig/math.md | 78 -- docs/sprig/paths.md | 114 -- docs/sprig/reflection.md | 50 - docs/sprig/string_slice.md | 72 -- docs/sprig/strings.md | 309 ----- docs/sprig/url.md | 33 - docs/sprig/uuid.md | 9 - .../android-screenshot-template-custom.png | Bin 0 -> 45032 bytes ...android-screenshot-template-predefined.png | Bin 0 -> 86828 bytes .../img/screenshot-github-webhook-config.png | Bin 0 -> 98734 bytes mkdocs.yml | 1 - server/config.go | 6 +- server/server.yml | 20 + server/server_test.go | 75 +- server/templates/alertmanager.yml | 29 + server/templates/github.yml | 3 +- server/templates/grafana.yml | 16 +- .../testdata/webhook_alertmanager_firing.json | 33 + server/testdata/webhook_grafana_resolved.json | 51 + 35 files changed, 764 insertions(+), 2208 deletions(-) rename docs/{ => publish}/template-functions.md (59%) delete mode 100644 docs/sprig.md delete mode 100644 docs/sprig/conversion.md delete mode 100644 docs/sprig/crypto.md delete mode 100644 docs/sprig/date.md delete mode 100644 docs/sprig/defaults.md delete mode 100644 docs/sprig/dicts.md delete mode 100644 docs/sprig/encoding.md delete mode 100644 docs/sprig/flow_control.md delete mode 100644 docs/sprig/integer_slice.md delete mode 100644 docs/sprig/lists.md delete mode 100644 docs/sprig/math.md delete mode 100644 docs/sprig/paths.md delete mode 100644 docs/sprig/reflection.md delete mode 100644 docs/sprig/string_slice.md delete mode 100644 docs/sprig/strings.md delete mode 100644 docs/sprig/url.md delete mode 100644 docs/sprig/uuid.md create mode 100644 docs/static/img/android-screenshot-template-custom.png create mode 100644 docs/static/img/android-screenshot-template-predefined.png create mode 100644 docs/static/img/screenshot-github-webhook-config.png create mode 100644 server/templates/alertmanager.yml create mode 100644 server/testdata/webhook_alertmanager_firing.json create mode 100644 server/testdata/webhook_grafana_resolved.json diff --git a/client/options.go b/client/options.go index 027b7fb5..f4711834 100644 --- a/client/options.go +++ b/client/options.go @@ -77,6 +77,12 @@ func WithMarkdown() PublishOption { return WithHeader("X-Markdown", "yes") } +// WithTemplate instructs the server to use a specific template for the message. If templateName is is "yes" or "1", +// the server will interpret the message and title as a template. +func WithTemplate(templateName string) PublishOption { + return WithHeader("X-Template", templateName) +} + // WithFilename sets a filename for the attachment, and/or forces the HTTP body to interpreted as an attachment func WithFilename(filename string) PublishOption { return WithHeader("X-Filename", filename) diff --git a/cmd/publish.go b/cmd/publish.go index c15761ab..f3139a63 100644 --- a/cmd/publish.go +++ b/cmd/publish.go @@ -32,6 +32,7 @@ var flagsPublish = append( &cli.StringFlag{Name: "actions", Aliases: []string{"A"}, EnvVars: []string{"NTFY_ACTIONS"}, Usage: "actions JSON array or simple definition"}, &cli.StringFlag{Name: "attach", Aliases: []string{"a"}, EnvVars: []string{"NTFY_ATTACH"}, Usage: "URL to send as an external attachment"}, &cli.BoolFlag{Name: "markdown", Aliases: []string{"md"}, EnvVars: []string{"NTFY_MARKDOWN"}, Usage: "Message is formatted as Markdown"}, + &cli.StringFlag{Name: "template", Aliases: []string{"tpl"}, EnvVars: []string{"NTFY_TEMPLATE"}, Usage: "use templates to transform JSON message body"}, &cli.StringFlag{Name: "filename", Aliases: []string{"name", "n"}, EnvVars: []string{"NTFY_FILENAME"}, Usage: "filename for the attachment"}, &cli.StringFlag{Name: "file", Aliases: []string{"f"}, EnvVars: []string{"NTFY_FILE"}, Usage: "file to upload as an attachment"}, &cli.StringFlag{Name: "email", Aliases: []string{"mail", "e"}, EnvVars: []string{"NTFY_EMAIL"}, Usage: "also send to e-mail address"}, @@ -98,6 +99,7 @@ func execPublish(c *cli.Context) error { actions := c.String("actions") attach := c.String("attach") markdown := c.Bool("markdown") + template := c.String("template") filename := c.String("filename") file := c.String("file") email := c.String("email") @@ -146,6 +148,9 @@ func execPublish(c *cli.Context) error { if markdown { options = append(options, client.WithMarkdown()) } + if template != "" { + options = append(options, client.WithTemplate(template)) + } if filename != "" { options = append(options, client.WithFilename(filename)) } diff --git a/cmd/serve.go b/cmd/serve.go index 0cbade0f..f894fe65 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -29,13 +29,9 @@ func init() { commands = append(commands, cmdServe) } -const ( - defaultServerConfigFile = "/etc/ntfy/server.yml" -) - var flagsServe = append( append([]cli.Flag{}, flagsDefault...), - &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: defaultServerConfigFile, Usage: "config file"}, + &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: server.DefaultConfigFile, Usage: "config file"}, altsrc.NewStringFlag(&cli.StringFlag{Name: "base-url", Aliases: []string{"base_url", "B"}, EnvVars: []string{"NTFY_BASE_URL"}, Usage: "externally visible base URL for this host (e.g. https://ntfy.sh)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-http", Aliases: []string{"listen_http", "l"}, EnvVars: []string{"NTFY_LISTEN_HTTP"}, Value: server.DefaultListenHTTP, Usage: "ip:port used as HTTP listen address"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-https", Aliases: []string{"listen_https", "L"}, EnvVars: []string{"NTFY_LISTEN_HTTPS"}, Usage: "ip:port used as HTTPS listen address"}), @@ -56,7 +52,7 @@ var flagsServe = append( altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-total-size-limit", Aliases: []string{"attachment_total_size_limit", "A"}, EnvVars: []string{"NTFY_ATTACHMENT_TOTAL_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultAttachmentTotalSizeLimit), Usage: "limit of the on-disk attachment cache"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-file-size-limit", Aliases: []string{"attachment_file_size_limit", "Y"}, EnvVars: []string{"NTFY_ATTACHMENT_FILE_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultAttachmentFileSizeLimit), Usage: "per-file attachment size limit (e.g. 300k, 2M, 100M)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-expiry-duration", Aliases: []string{"attachment_expiry_duration", "X"}, EnvVars: []string{"NTFY_ATTACHMENT_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultAttachmentExpiryDuration), Usage: "duration after which uploaded attachments will be deleted (e.g. 3h, 20h)"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "template-dir", Aliases: []string{"template_dir"}, EnvVars: []string{"NTFY_TEMPLATE_DIR"}, Usage: "directory to load named message templates from"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "template-dir", Aliases: []string{"template_dir"}, EnvVars: []string{"NTFY_TEMPLATE_DIR"}, Value: server.DefaultTemplateDir, Usage: "directory to load named message templates from"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "keepalive-interval", Aliases: []string{"keepalive_interval", "k"}, EnvVars: []string{"NTFY_KEEPALIVE_INTERVAL"}, Value: util.FormatDuration(server.DefaultKeepaliveInterval), Usage: "interval of keepalive messages"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "manager-interval", Aliases: []string{"manager_interval", "m"}, EnvVars: []string{"NTFY_MANAGER_INTERVAL"}, Value: util.FormatDuration(server.DefaultManagerInterval), Usage: "interval of for message pruning and stats printing"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "disallowed-topics", Aliases: []string{"disallowed_topics"}, EnvVars: []string{"NTFY_DISALLOWED_TOPICS"}, Usage: "topics that are not allowed to be used"}), diff --git a/cmd/user.go b/cmd/user.go index e6867b11..0ee45bc3 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -6,6 +6,7 @@ import ( "crypto/subtle" "errors" "fmt" + "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/user" "os" "strings" @@ -25,7 +26,7 @@ func init() { var flagsUser = append( append([]cli.Flag{}, flagsDefault...), - &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: defaultServerConfigFile, DefaultText: defaultServerConfigFile, Usage: "config file"}, + &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: server.DefaultConfigFile, DefaultText: server.DefaultConfigFile, Usage: "config file"}, altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-file", Aliases: []string{"auth_file", "H"}, EnvVars: []string{"NTFY_AUTH_FILE"}, Usage: "auth database file used for access control"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-default-access", Aliases: []string{"auth_default_access", "p"}, EnvVars: []string{"NTFY_AUTH_DEFAULT_ACCESS"}, Value: "read-write", Usage: "default permissions if no matching entries in the auth database are found"}), ) diff --git a/docs/publish.md b/docs/publish.md index 24aa443a..6410bece 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -944,27 +944,165 @@ Templating lets you **format a JSON message body into human-friendly message and [Go templates](https://pkg.go.dev/text/template) (see tutorials [here](https://blog.gopheracademy.com/advent-2017/using-go-templates/), [here](https://www.digitalocean.com/community/tutorials/how-to-use-templates-in-go), and [here](https://developer.hashicorp.com/nomad/tutorials/templates/go-template-syntax)). This is specifically useful when -**combined with webhooks** from services such as GitHub, Grafana, or other services that emit JSON webhooks. +**combined with webhooks** from services such as [GitHub](https://docs.github.com/en/webhooks/about-webhooks), +[Grafana](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier/), +[Alertmanager](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config), or other services that emit JSON webhooks. Instead of using a separate bridge program to parse the webhook body into the format ntfy expects, you can include a templated message and/or a templated title which will be populated based on the fields of the webhook body (so long as the webhook body is valid JSON). -You can enable templating by setting the `X-Template` header (or its aliases `Template` or `tpl`): +You can enable templating by setting the `X-Template` header (or its aliases `Template` or `tpl`, or the query parameter `?template=...`): +* **Pre-defined template files**: Setting the `X-Template` header or query parameter to a template name (e.g. `?template=github`) + to a pre-defined template name (e.g. `github`, `grafana`, or `alertmanager`) will use the template with that name. + See [pre-defined templates](#pre-defined-templates) for more details. +* **Custom template files**: Setting the `X-Template` header or query parameter to a custom template name (e.g. `?template=myapp`) + will use a custom template file from the template directory (defaults to `/etc/ntfy/templates`, can be overridden with `template-dir`). + See [custom templates](#custom-templates) for more details. * **Inline templating**: Setting the `X-Template` header or query parameter to `yes` or `1` (e.g. `?template=yes`) - will enable inline templating, which means that the `message` and/or `title` **will be parsed as a Go template**. - See [Inline templating](#inline-templating) and [Template syntax](#template-syntax) for details on how to use Go - templates in your messages and titles. -* **Pre-defined template files**: You can also set `X-Template` header or query parameter to a template name (e.g. `?template=github`). - ntfy will then read the template from either the built-in pre-defined template files, or from the template files defined in - the `template-dir`. See [Template files](#pre-defined-templates) for more details. + will enable inline templating, which means that the `message` and/or `title` will be parsed as a Go template. + See [inline templating](#inline-templating) for more details. + +To learn the basics of Go's templating language, please see [template syntax](#template-syntax). + +### Pre-defined templates + +When `X-Template: ` (aliases: `Template: `, `Tpl: `) or `?template=` is set, ntfy will transform the +message and/or title based on one of the built-in pre-defined templates + +The following **pre-defined templates** are available: + +* `github`: Formats a subset of [GitHub webhook](https://docs.github.com/en/webhooks/about-webhooks) payloads (PRs, issues, new star, new watcher, new comment) +* `grafana`: Formats [Grafana webhook](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier/) payloads (firing/resolved alerts) +* `alertmanager`: Formats [Alertmanager webhook](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config) payloads (firing/resolved alerts) + +Here's an example of how to use the pre-defined `github` template: First, configure the webhook in GitHub to send a webhook to your ntfy topic, e.g. `https://ntfy.sh/mytopic?template=github`. +
+ ![GitHub webhook config](static/img/screenshot-github-webhook-config.png){ width=600 } +
GitHub webhook configuration
+
+ +After that, when GitHub publishes a JSON webhook to the topic, ntfy will transform it according to the template rules +and you'll receive notifications in the ntfy app. Here's an example for when somebody stars your repository: + +
+ ![pre-defined template](static/img/android-screenshot-template-predefined.png){ width=500 } +
Receiving a webhook, formatted using the pre-defined "github" template
+
+ +### Custom templates + +To define **your own custom templates**, place a template file in the template directory (defaults to `/etc/ntfy/templates`, can be overridden with `template-dir`) +and set the `X-Template` header or query parameter to the name of the template file (without the `.yml` extension). + +For example, if you have a template file `/etc/ntfy/templates/myapp.yml`, you can set the header `X-Template: myapp` or +the query parameter `?template=myapp` to use it. + +Template files must have the `.yml` (not: `.yaml`!) extension and must be formatted as YAML. They may contain `title` and `message` keys, +which are interpreted as Go templates. + +Here's an **example custom template**: + +=== "Custom template (/etc/ntfy/templates/myapp.yml)" + ```yaml + title: | + {{- if eq .status "firing" }} + {{- if gt .percent 90.0 }}🚨 Critical alert + {{- else }}⚠️ Alert{{- end }} + {{- else if eq .status "resolved" }} + ✅ Alert resolved + {{- end }} + message: | + Status: {{ .status }} + Type: {{ .type | upper }} ({{ .percent }}%) + Server: {{ .server }} + ``` + +Once you have the template file in place, you can send the payload to your topic using the `X-Template` +header or query parameter: + +=== "Command line (curl)" + ``` + echo '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' | \ + curl -sT- "https://ntfy.example.com/mytopic?template=myapp" + ``` + +=== "ntfy CLI" + ``` + echo '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' | \ + ntfy publish --template=myapp https://ntfy.example.com/mytopic + ``` + +=== "HTTP" + ``` http + POST /mytopic?template=myapp HTTP/1.1 + Host: ntfy.example.com + + { + "status": "firing", + "type": "cpu", + "server": "ntfy.sh", + "percent": 99 + } + ``` + +=== "JavaScript" + ``` javascript + fetch('https://ntfy.example.com/mytopic?template=myapp', { + method: 'POST', + body: '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' + }) + ``` + +=== "Go" + ``` go + payload := `{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}` + req, _ := http.NewRequest("POST", "https://ntfy.example.com/mytopic?template=myapp", strings.NewReader(payload)) + http.DefaultClient.Do(req) + ``` + +=== "PowerShell" + ``` powershell + $Request = @{ + Method = "POST" + Uri = "https://ntfy.example.com/mytopic?template=myapp" + Body = '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' + } + Invoke-RestMethod @Request + ``` + +=== "Python" + ``` python + requests.post("https://ntfy.example.com/mytopic?template=myapp", + json={"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}) + ``` + +=== "PHP" + ``` php-inline + file_get_contents('https://ntfy.example.com/mytopic?template=myapp', false, stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => "Content-Type: application/json", + 'content' => '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' + ] + ])); + ``` + +Which will result in a notification that looks like this: + +
+ ![notification from custom JSON webhook template](static/img/android-screenshot-template-custom.png){ width=500 } +
JSON webhook, transformed using a custom template
+
### Inline templating -When `X-Template: yes` or `?template=yes` is set, you can use Go templates in the `message` and `title` fields of your -webhook payload. This is most useful if no [pre-defined template](#pre-defined-templates) exists, for templated one-off messages, -of if you do not control the ntfy server (e.g., if you're using ntfy.sh). Please consider using [template files](#pre-defined-templates) +When `X-Template: yes` (aliases: `Template: yes`, `Tpl: yes`) or `?template=yes` is set, you can use Go templates in the `message` and `title` fields of your +webhook payload. + +Inline templates are most useful for templated one-off messages, of if you do not control the ntfy server (e.g., if you're using ntfy.sh). +Consider using [pre-defined templates](#pre-defined-templates) or [custom templates](#custom-templates) instead, if you control the ntfy server, as templates are much easier to maintain. Here's an **example for a Grafana alert**: @@ -1078,10 +1216,6 @@ This example uses the `message`/`m` and `title`/`t` query parameters, but obviou `Message`/`Title` headers. It will send a notification with a title `phil-pc: A severe error has occurred` and a message `Error message: Disk has run out of space`. -### Pre-defined templates - -XXXXXXXXXXXXxx - ### Template syntax ntfy uses [Go templates](https://pkg.go.dev/text/template) for its templates, which is arguably one of the most powerful, yet also one of the worst templating languages out there. @@ -1101,23 +1235,23 @@ message templating and for transforming the data provided through the JSON paylo Below are the functions that are available to use inside your message/title templates. -* [String Functions](./sprig/strings.md): `trim`, `trunc`, `substr`, `plural`, etc. - * [String List Functions](./sprig/string_slice.md): `splitList`, `sortAlpha`, etc. -* [Integer Math Functions](./sprig/math.md): `add`, `max`, `mul`, etc. - * [Integer List Functions](./sprig/integer_slice.md): `until`, `untilStep` -* [Date Functions](./sprig/date.md): `now`, `date`, etc. -* [Defaults Functions](./sprig/defaults.md): `default`, `empty`, `coalesce`, `fromJSON`, `toJSON`, `toPrettyJSON`, `toRawJSON`, `ternary` -* [Encoding Functions](./sprig/encoding.md): `b64enc`, `b64dec`, etc. -* [Lists and List Functions](./sprig/lists.md): `list`, `first`, `uniq`, etc. -* [Dictionaries and Dict Functions](./sprig/dicts.md): `get`, `set`, `dict`, `hasKey`, `pluck`, `dig`, etc. -* [Type Conversion Functions](./sprig/conversion.md): `atoi`, `int64`, `toString`, etc. -* [Path and Filepath Functions](./sprig/paths.md): `base`, `dir`, `ext`, `clean`, `isAbs`, `osBase`, `osDir`, `osExt`, `osClean`, `osIsAbs` -* [Flow Control Functions]( ./sprig/flow_control.md): `fail` +* [String Functions](publish/template-functions.md#string-functions): `trim`, `trunc`, `substr`, `plural`, etc. +* [String List Functions](publish/template-functions.md#string-list-functions): `splitList`, `sortAlpha`, etc. +* [Integer Math Functions](publish/template-functions.md#integer-math-functions): `add`, `max`, `mul`, etc. +* [Integer List Functions](publish/template-functions.md#integer-list-functions): `until`, `untilStep` +* [Date Functions](publish/template-functions.md#date-functions): `now`, `date`, etc. +* [Defaults Functions](publish/template-functions.md#default-functions): `default`, `empty`, `coalesce`, `fromJSON`, `toJSON`, `toPrettyJSON`, `toRawJSON`, `ternary` +* [Encoding Functions](publish/template-functions.md#encoding-functions): `b64enc`, `b64dec`, etc. +* [Lists and List Functions](publish/template-functions.md#lists-and-list-functions): `list`, `first`, `uniq`, etc. +* [Dictionaries and Dict Functions](publish/template-functions.md#dictionaries-and-dict-functions): `get`, `set`, `dict`, `hasKey`, `pluck`, `dig`, etc. +* [Type Conversion Functions](publish/template-functions.md#type-conversion-functions): `atoi`, `int64`, `toString`, etc. +* [Path and Filepath Functions](publish/template-functions.md#path-and-filepath-functions): `base`, `dir`, `ext`, `clean`, `isAbs`, `osBase`, `osDir`, `osExt`, `osClean`, `osIsAbs` +* [Flow Control Functions](publish/template-functions.md#flow-control-functions): `fail` * Advanced Functions - * [UUID Functions](./sprig/uuid.md): `uuidv4` - * [Reflection](./sprig/reflection.md): `typeOf`, `kindIs`, `typeIsLike`, etc. - * [Cryptographic and Security Functions](./sprig/crypto.md): `sha256sum`, etc. - * [URL](./sprig/url.md): `urlParse`, `urlJoin` + * [UUID Functions](publish/template-functions.md#uuid-functions): `uuidv4` + * [Reflection](publish/template-functions.md#reflection-functions): `typeOf`, `kindIs`, `typeIsLike`, etc. + * [Cryptographic and Security Functions](publish/template-functions.md#cryptographic-and-security-functions): `sha256sum`, etc. + * [URL](publish/template-functions.md#url-functions): `urlParse`, `urlJoin` ## Publish as JSON diff --git a/docs/template-functions.md b/docs/publish/template-functions.md similarity index 59% rename from docs/template-functions.md rename to docs/publish/template-functions.md index 7c9593e6..238bddd9 100644 --- a/docs/template-functions.md +++ b/docs/publish/template-functions.md @@ -1,4 +1,8 @@ -# Template functions +# Template Functions + +These template functions may be used in the [message template](../publish.md#message-templating) feature of ntfy. Please refer to the examples in the documentation for how to use them. + +The original set of template functions is based on the [Sprig library](https://masterminds.github.io/sprig/). This documentation page is a (slightly modified) copy of their docs. **Thank you to the Sprig developers for their work!** 🙏 ## Table of Contents @@ -23,106 +27,89 @@ Sprig has a number of string manipulation functions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
trimThe `trim` function removes space from either side of a string: +### trim + +The `trim` function removes space from either side of a string: ``` trim " hello " ``` The above produces `hello` -
trimAllRemove given characters from the front or back of a string: +### trimAll + +Remove given characters from the front or back of a string: ``` trimAll "$" "$5.00" ``` The above returns `5.00` (as a string). -
trimSuffixTrim just the suffix from a string: +### trimSuffix + +Trim just the suffix from a string: ``` trimSuffix "-" "hello-" ``` The above returns `hello` -
trimPrefixTrim just the prefix from a string: +### trimPrefix + +Trim just the prefix from a string: ``` trimPrefix "-" "-hello" ``` The above returns `hello` -
upperConvert the entire string to uppercase: +### upper + +Convert the entire string to uppercase: ``` upper "hello" ``` The above returns `HELLO` -
lowerConvert the entire string to lowercase: +### lower + +Convert the entire string to lowercase: ``` lower "HELLO" ``` The above returns `hello` -
titleConvert to title case: +### title + +Convert to title case: ``` title "hello world" ``` The above returns `Hello World` -
repeatRepeat a string multiple times: +### repeat + +Repeat a string multiple times: ``` repeat 3 "hello" ``` The above returns `hellohellohello` -
substrGet a substring from a string. It takes three parameters: +### substr + +Get a substring from a string. It takes three parameters: - start (int) - end (int) @@ -133,12 +120,10 @@ substr 0 5 "hello world" ``` The above returns `hello` -
truncTruncate a string (and add no suffix) +### trunc + +Truncate a string (and add no suffix) ``` trunc 5 "hello world" @@ -151,24 +136,20 @@ trunc -5 "hello world" ``` The above produces `world`. -
containsTest to see if one string is contained inside of another: +### contains + +Test to see if one string is contained inside of another: ``` contains "cat" "catch" ``` The above returns `true` because `catch` contains `cat`. -
hasPrefix and hasSuffixThe `hasPrefix` and `hasSuffix` functions test whether a string has a given +### hasPrefix and hasSuffix + +The `hasPrefix` and `hasSuffix` functions test whether a string has a given prefix or suffix: ``` @@ -176,19 +157,15 @@ hasPrefix "cat" "catch" ``` The above returns `true` because `catch` has the prefix `cat`. -
quote and squoteThese functions wrap a string in double quotes (`quote`) or single quotes +### quote and squote + +These functions wrap a string in double quotes (`quote`) or single quotes (`squote`). -
catThe `cat` function concatenates multiple strings together into one, separating +### cat + +The `cat` function concatenates multiple strings together into one, separating them with spaces: ``` @@ -196,12 +173,10 @@ cat "hello" "beautiful" "world" ``` The above produces `hello beautiful world` -
indentThe `indent` function indents every line in a given string to the specified +### indent + +The `indent` function indents every line in a given string to the specified indent width. This is useful when aligning multi-line strings: ``` @@ -209,12 +184,10 @@ indent 4 $lots_of_text ``` The above will indent every line of text by 4 space characters. -
nindentThe `nindent` function is the same as the indent function, but prepends a new +### nindent + +The `nindent` function is the same as the indent function, but prepends a new line to the beginning of the string. ``` @@ -223,12 +196,10 @@ nindent 4 $lots_of_text The above will indent every line of text by 4 space characters and add a new line to the beginning. -
replacePerform simple string replacement. +### replace + +Perform simple string replacement. It takes three arguments: @@ -241,12 +212,10 @@ It takes three arguments: ``` The above will produce `I-Am-Henry-VIII` -
pluralPluralize a string. +### plural + +Pluralize a string. ``` len $fish | plural "one anchovy" "many anchovies" @@ -266,12 +235,10 @@ NOTE: Sprig does not currently support languages with more complex pluralization rules. And `0` is considered a plural because the English language treats it as such (`zero anchovies`). The Sprig developers are working on a solution for better internationalization. -
regexMatch, mustRegexMatchReturns true if the input string contains any match of the regular expression. +### regexMatch, mustRegexMatch + +Returns true if the input string contains any match of the regular expression. ``` regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "test@acme.com" @@ -281,12 +248,10 @@ The above produces `true` `regexMatch` panics if there is a problem and `mustRegexMatch` returns an error to the template engine if there is a problem. -
regexFindAll, mustRegexFindAllReturns a slice of all matches of the regular expression in the input string. +### regexFindAll, mustRegexFindAll + +Returns a slice of all matches of the regular expression in the input string. The last parameter n determines the number of substrings to return, where -1 means return all matches ``` @@ -297,12 +262,10 @@ The above produces `[2 4 6 8]` `regexFindAll` panics if there is a problem and `mustRegexFindAll` returns an error to the template engine if there is a problem. -
regexFind, mustRegexFindReturn the first (left most) match of the regular expression in the input string +### regexFind, mustRegexFind + +Return the first (left most) match of the regular expression in the input string ``` regexFind "[a-zA-Z][1-9]" "abcd1234" @@ -312,12 +275,10 @@ The above produces `d1` `regexFind` panics if there is a problem and `mustRegexFind` returns an error to the template engine if there is a problem. -
regexReplaceAll, mustRegexReplaceAllReturns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. +### regexReplaceAll, mustRegexReplaceAll + +Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. Inside string replacement, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first submatch ``` @@ -328,12 +289,10 @@ The above produces `-W-xxW-` `regexReplaceAll` panics if there is a problem and `mustRegexReplaceAll` returns an error to the template engine if there is a problem. -
regexReplaceAllLiteral, mustRegexReplaceAllLiteralReturns a copy of the input string, replacing matches of the Regexp with the replacement string replacement +### regexReplaceAllLiteral, mustRegexReplaceAllLiteral + +Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement The replacement string is substituted directly, without using Expand ``` @@ -344,12 +303,10 @@ The above produces `-${1}-${1}-` `regexReplaceAllLiteral` panics if there is a problem and `mustRegexReplaceAllLiteral` returns an error to the template engine if there is a problem. -
regexSplit, mustRegexSplitSlices the input string into substrings separated by the expression and returns a slice of the substrings between those expression matches. The last parameter `n` determines the number of substrings to return, where `-1` means return all matches +### regexSplit, mustRegexSplit + +Slices the input string into substrings separated by the expression and returns a slice of the substrings between those expression matches. The last parameter `n` determines the number of substrings to return, where `-1` means return all matches ``` regexSplit "z+" "pizza" -1 @@ -359,12 +316,10 @@ The above produces `[pi a]` `regexSplit` panics if there is a problem and `mustRegexSplit` returns an error to the template engine if there is a problem. -
regexQuoteMetaReturns a string that escapes all regular expression metacharacters inside the argument text; +### regexQuoteMeta + +Returns a string that escapes all regular expression metacharacters inside the argument text; the returned string is a regular expression matching the literal text. ``` @@ -372,22 +327,20 @@ regexQuoteMeta "1.2.3" ``` The above produces `1\.2\.3` -
-The [Conversion Functions](conversion.md) contain functions for converting strings. The [String List Functions](string_slice.md) contains +### See Also... + +The [Conversion Functions](#type-conversion-functions) contain functions for converting strings. The [String List Functions](#string-list-functions) contains functions for working with an array of strings. ## String List Functions -These function operate on or generate slices of strings. In Go, a slice is a +These functions operate on or generate slices of strings. In Go, a slice is a growable array. In Sprig, it's a special case of a `list`. - - - - - - - - - - - - - - - - - -
joinJoin a list of strings into a single string, with the given separator. +### join + +Join a list of strings into a single string, with the given separator. ``` list "hello" "world" | join "_" @@ -402,12 +355,10 @@ list 1 2 3 | join "+" ``` The above will produce `1+2+3` -
splitList and splitSplit a string into a list of strings: +### splitList and split + +Split a string into a list of strings: ``` splitList "$" "foo$bar$baz" @@ -429,12 +380,10 @@ $a._0 ``` The above produces `foo` -
splitn`splitn` function splits a string into a `dict` with `n` keys. It is designed to make +### splitn + +`splitn` function splits a string into a `dict` with `n` keys. It is designed to make it easy to use template dot notation for accessing members: ``` @@ -448,132 +397,99 @@ $a._0 ``` The above produces `foo` -
sortAlphaThe `sortAlpha` function sorts a list of strings into alphabetical (lexicographical) +### sortAlpha + +The `sortAlpha` function sorts a list of strings into alphabetical (lexicographical) order. It does _not_ sort in place, but returns a sorted copy of the list, in keeping with the immutability of lists. -
## Integer Math Functions The following math functions operate on `int64` values. - - - - - - - - - +### add1 - - - - +To increment by 1, use `add1` - - - - +### sub - - - - +To subtract, use `sub` - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
addSum numbers with `add`. Accepts two or more inputs. +### add + +Sum numbers with `add`. Accepts two or more inputs. ``` add 1 2 3 ``` -
add1To increment by 1, use `add1` -
subTo subtract, use `sub` -
divPerform integer division with `div` -
modModulo with `mod` -
mulMultiply with `mul`. Accepts two or more inputs. +### div + +Perform integer division with `div` + +### mod + +Modulo with `mod` + +### mul + +Multiply with `mul`. Accepts two or more inputs. ``` mul 1 2 3 ``` -
maxReturn the largest of a series of integers: +### max + +Return the largest of a series of integers: This will return `3`: ``` max 1 2 3 ``` -
minReturn the smallest of a series of integers. +### min + +Return the smallest of a series of integers. `min 1 2 3` will return `1` -
floorReturns the greatest float value less than or equal to input value +### floor + +Returns the greatest float value less than or equal to input value `floor 123.9999` will return `123.0` -
ceilReturns the greatest float value greater than or equal to input value +### ceil + +Returns the greatest float value greater than or equal to input value `ceil 123.001` will return `124.0` -
roundReturns a float value with the remainder rounded to the given number to digits after the decimal point. +### round + +Returns a float value with the remainder rounded to the given number to digits after the decimal point. `round 123.555555 3` will return `123.556` -
randIntReturns a random integer value from min (inclusive) to max (exclusive). +### randInt +Returns a random integer value from min (inclusive) to max (exclusive). ``` randInt 12 30 ``` The above will produce a random number in the range [12,30]. -
## Integer List Functions - - - - - - - - - - - - - -
untilThe `until` function builds a range of integers. +### until + +The `until` function builds a range of integers. ``` until 5 @@ -582,12 +498,10 @@ until 5 The above generates the list `[0, 1, 2, 3, 4]`. This is useful for looping with `range $i, $e := until 5`. -
untilStepLike `until`, `untilStep` generates a list of counting integers. But it allows +### untilStep + +Like `until`, `untilStep` generates a list of counting integers. But it allows you to define a start, stop, and step: ``` @@ -596,12 +510,10 @@ untilStep 3 6 2 The above will produce `[3 5]` by starting with 3, and adding 2 until it is equal or greater than 6. This is similar to Python's `range` function. -
seqWorks like the bash `seq` command. +### seq + +Works like the bash `seq` command. * 1 parameter (end) - will generate all counting integers between 1 and `end` inclusive. * 2 parameters (start, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by 1. * 3 parameters (start, step, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by `step`. @@ -614,22 +526,16 @@ seq 2 -2 => 2 1 0 -1 -2 seq 0 2 10 => 0 2 4 6 8 10 seq 0 -2 -5 => 0 -2 -4 ``` -
## Date Functions - - - - - +### now - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nowThe current date/time. Use this in conjunction with other date functions. -
agoThe `ago` function returns duration from time.Now in seconds resolution. +The current date/time. Use this in conjunction with other date functions. + +### ago + +The `ago` function returns duration from time.Now in seconds resolution. ``` ago .CreatedAt @@ -640,12 +546,10 @@ returns in `time.Duration` String() format ``` 2h34m7s ``` -
dateThe `date` function formats a date. +### date + +The `date` function formats a date. Format the date to YEAR-MONTH-DAY: @@ -663,34 +567,28 @@ Mon Jan 2 15:04:05 MST 2006 Write it in the format you want. Above, `2006-01-02` is the same date, but in the format we want. -
dateInZoneSame as `date`, but with a timezone. +### dateInZone + +Same as `date`, but with a timezone. ``` dateInZone "2006-01-02" (now) "UTC" ``` -
durationFormats a given amount of seconds as a `time.Duration`. +### duration + +Formats a given amount of seconds as a `time.Duration`. This returns 1m35s ``` duration "95" ``` -
durationRoundRounds a given duration to the most significant unit. Strings and `time.Duration` +### durationRound + +Rounds a given duration to the most significant unit. Strings and `time.Duration` gets parsed as a duration, while a `time.Time` is calculated as the duration since. This return 2h @@ -704,22 +602,18 @@ This returns 3mo ``` durationRound "2400h10m5s" ``` -
unixEpochReturns the seconds since the unix epoch for a `time.Time`. +### unixEpoch + +Returns the seconds since the unix epoch for a `time.Time`. ``` now | unixEpoch ``` -
dateModify, mustDateModifyThe `dateModify` takes a modification and a date and returns the timestamp. +### dateModify, mustDateModify + +The `dateModify` takes a modification and a date and returns the timestamp. Subtract an hour and thirty minutes from the current time: @@ -728,33 +622,27 @@ now | date_modify "-1.5h" ``` If the modification format is wrong `dateModify` will return the date unmodified. `mustDateModify` will return an error otherwise. -
htmlDateThe `htmlDate` function formats a date for inserting into an HTML date picker +### htmlDate + +The `htmlDate` function formats a date for inserting into an HTML date picker input field. ``` now | htmlDate ``` -
htmlDateInZoneSame as htmlDate, but with a timezone. +### htmlDateInZone + +Same as htmlDate, but with a timezone. ``` htmlDateInZone (now) "UTC" ``` -
toDate, mustToDate`toDate` converts a string to a date. The first argument is the date layout and +### toDate, mustToDate + +`toDate` converts a string to a date. The first argument is the date layout and the second the date string. If the string can't be convert it returns the zero value. `mustToDate` will return an error in case the string cannot be converted. @@ -765,18 +653,14 @@ This is useful when you want to convert a string date to another format ``` toDate "2006-01-02" "2017-12-31" | date "02/01/2006" ``` -
## Default Functions Sprig provides tools for setting default values for templates. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
defaultTo set a simple default value, use `default`: +### default + +To set a simple default value, use `default`: ``` default "foo" .Bar @@ -796,12 +680,10 @@ The definition of "empty" depends on type: For structs, there is no definition of empty, so a struct will never return the default. -
emptyThe `empty` function returns `true` if the given value is considered empty, and +### empty + +The `empty` function returns `true` if the given value is considered empty, and `false` otherwise. The empty values are listed in the `default` section. ``` @@ -810,12 +692,10 @@ empty .Foo Note that in Go template conditionals, emptiness is calculated for you. Thus, you rarely need `if empty .Foo`. Instead, just use `if .Foo`. -
coalesceThe `coalesce` function takes a list of values and returns the first non-empty +### coalesce + +The `coalesce` function takes a list of values and returns the first non-empty one. ``` @@ -833,12 +713,10 @@ coalesce .name .parent.name "Matt" The above will first check to see if `.name` is empty. If it is not, it will return that value. If it _is_ empty, `coalesce` will evaluate `.parent.name` for emptiness. Finally, if both `.name` and `.parent.name` are empty, it will return `Matt`. -
allThe `all` function takes a list of values and returns true if all values are non-empty. +### all + +The `all` function takes a list of values and returns true if all values are non-empty. ``` all 0 1 2 @@ -853,12 +731,10 @@ all (eq .Request.TLS.Version 0x0304) (.Request.ProtoAtLeast 2 0) (eq .Request.Me ``` The above will check http.Request is POST with tls 1.3 and http/2. -
anyThe `any` function takes a list of values and returns true if any value is non-empty. +### any + +The `any` function takes a list of values and returns true if any value is non-empty. ``` any 0 1 2 @@ -873,23 +749,19 @@ any (eq .Request.Method "GET") (eq .Request.Method "POST") (eq .Request.Method " ``` The above will check http.Request method is one of GET/POST/OPTIONS. -
fromJSON, mustFromJSON`fromJSON` decodes a JSON document into a structure. If the input cannot be decoded as JSON the function will return an empty string. +### fromJSON, mustFromJSON + +`fromJSON` decodes a JSON document into a structure. If the input cannot be decoded as JSON the function will return an empty string. `mustFromJSON` will return an error in case the JSON is invalid. ``` fromJSON "{\"foo\": 55}" ``` -
toJSON, mustToJSONThe `toJSON` function encodes an item into a JSON string. If the item cannot be converted to JSON the function will return an empty string. +### toJSON, mustToJSON + +The `toJSON` function encodes an item into a JSON string. If the item cannot be converted to JSON the function will return an empty string. `mustToJSON` will return an error in case the item cannot be encoded in JSON. ``` @@ -897,40 +769,34 @@ toJSON .Item ``` The above returns JSON string representation of `.Item`. -
toPrettyJSON, mustToPrettyJSONThe `toPrettyJSON` function encodes an item into a pretty (indented) JSON string. +### toPrettyJSON, mustToPrettyJSON + +The `toPrettyJSON` function encodes an item into a pretty (indented) JSON string. ``` toPrettyJSON .Item ``` The above returns indented JSON string representation of `.Item`. -
toRawJSON, mustToRawJSONThe `toRawJSON` function encodes an item into JSON string with HTML characters unescaped. +### toRawJSON, mustToRawJSON + +The `toRawJSON` function encodes an item into JSON string with HTML characters unescaped. ``` toRawJSON .Item ``` The above returns unescaped JSON string representation of `.Item`. -
ternaryThe `ternary` function takes two values, and a test value. If the test value is +### ternary + +The `ternary` function takes two values, and a test value. If the test value is true, the first value will be returned. If the test value is empty, the second value will be returned. This is similar to the c ternary operator. -### true test value +#### true test value ``` ternary "foo" "bar" true @@ -944,7 +810,7 @@ true | ternary "foo" "bar" The above returns `"foo"`. -### false test value +#### false test value ``` ternary "foo" "bar" false @@ -957,27 +823,13 @@ false | ternary "foo" "bar" ``` The above returns `"bar"`. -
## Encoding Functions Sprig has the following encoding and decoding functions: - - - - - - - - - - -
b64enc/b64decEncode or decode with Base64 -
b32enc/b32decEncode or decode with Base32 -
+- `b64enc`/`b64dec`: Encode or decode with Base64 +- `b32enc`/`b32dec`: Encode or decode with Base32 ## Lists and List Functions @@ -993,54 +845,45 @@ $myList := list 1 2 3 4 5 The above creates a list of `[1 2 3 4 5]`. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
first, mustFirstTo get the head item on a list, use `first`. +### first, mustFirst + +To get the head item on a list, use `first`. `first $myList` returns `1` `first` panics if there is a problem while `mustFirst` returns an error to the template engine if there is a problem. -
rest, mustRestTo get the tail of the list (everything but the first item), use `rest`. +### rest, mustRest + +To get the tail of the list (everything but the first item), use `rest`. `rest $myList` returns `[2 3 4 5]` `rest` panics if there is a problem while `mustRest` returns an error to the template engine if there is a problem. -
last, mustLastTo get the last item on a list, use `last`: +### last, mustLast + +To get the last item on a list, use `last`: `last $myList` returns `5`. This is roughly analogous to reversing a list and then calling `first`. `last` panics if there is a problem while `mustLast` returns an error to the template engine if there is a problem. -
initial, mustInitialThis compliments `last` by returning all _but_ the last element. +### initial, mustInitial + +This compliments `last` by returning all _but_ the last element. `initial $myList` returns `[1 2 3 4]`. `initial` panics if there is a problem while `mustInitial` returns an error to the template engine if there is a problem. -
append, mustAppendAppend a new item to an existing list, creating a new list. +### append, mustAppend + +Append a new item to an existing list, creating a new list. ``` $new = append $myList 6 @@ -1050,12 +893,10 @@ The above would set `$new` to `[1 2 3 4 5 6]`. `$myList` would remain unaltered. `append` panics if there is a problem while `mustAppend` returns an error to the template engine if there is a problem. -
prepend, mustPrependPush an element onto the front of a list, creating a new list. +### prepend, mustPrepend + +Push an element onto the front of a list, creating a new list. ``` prepend $myList 0 @@ -1065,24 +906,20 @@ The above would produce `[0 1 2 3 4 5]`. `$myList` would remain unaltered. `prepend` panics if there is a problem while `mustPrepend` returns an error to the template engine if there is a problem. -
concatConcatenate arbitrary number of lists into one. +### concat + +Concatenate arbitrary number of lists into one. ``` concat $myList ( list 6 7 ) ( list 8 ) ``` The above would produce `[1 2 3 4 5 6 7 8]`. `$myList` would remain unaltered. -
reverse, mustReverseProduce a new list with the reversed elements of the given list. +### reverse, mustReverse + +Produce a new list with the reversed elements of the given list. ``` reverse $myList @@ -1092,12 +929,10 @@ The above would generate the list `[5 4 3 2 1]`. `reverse` panics if there is a problem while `mustReverse` returns an error to the template engine if there is a problem. -
uniq, mustUniqGenerate a list with all of the duplicates removed. +### uniq, mustUniq + +Generate a list with all of the duplicates removed. ``` list 1 1 1 2 | uniq @@ -1107,12 +942,10 @@ The above would produce `[1 2]` `uniq` panics if there is a problem while `mustUniq` returns an error to the template engine if there is a problem. -
without, mustWithoutThe `without` function filters items out of a list. +### without, mustWithout + +The `without` function filters items out of a list. ``` without $myList 3 @@ -1130,12 +963,10 @@ That would produce `[2 4]` `without` panics if there is a problem while `mustWithout` returns an error to the template engine if there is a problem. -
has, mustHasTest to see if a list has a particular element. +### has, mustHas + +Test to see if a list has a particular element. ``` has 4 $myList @@ -1145,12 +976,10 @@ The above would return `true`, while `has "hello" $myList` would return false. `has` panics if there is a problem while `mustHas` returns an error to the template engine if there is a problem. -
compact, mustCompactAccepts a list and removes entries with empty values. +### compact, mustCompact + +Accepts a list and removes entries with empty values. ``` $list := list 1 "a" "foo" "" @@ -1161,12 +990,10 @@ $copy := compact $list `compact` panics if there is a problem and `mustCompact` returns an error to the template engine if there is a problem. -
slice, mustSliceTo get partial elements of a list, use `slice list [n] [m]`. It is +### slice, mustSlice + +To get partial elements of a list, use `slice list [n] [m]`. It is equivalent of `list[n:m]`. - `slice $myList` returns `[1 2 3 4 5]`. It is same as `myList[:]`. @@ -1176,26 +1003,21 @@ equivalent of `list[n:m]`. `slice` panics if there is a problem while `mustSlice` returns an error to the template engine if there is a problem. -
chunkTo split a list into chunks of given size, use `chunk size list`. This is useful for pagination. +### chunk + +To split a list into chunks of given size, use `chunk size list`. This is useful for pagination. ``` chunk 3 (list 1 2 3 4 5 6 7 8) ``` This produces list of lists `[ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 ] ]`. -
### A Note on List Internals -A list is implemented in Go as a `[]interface{}`. For Go developers embedding -Sprig, you may pass `[]interface{}` items into your template context and be +A list is implemented in Go as a `[]any`. For Go developers embedding +Sprig, you may pass `[]any` items into your template context and be able to use all of the `list` functions on those items. ## Dictionaries and Dict Functions @@ -1209,10 +1031,9 @@ type, even another `dict` or `list`. Unlike `list`s, `dict`s are not immutable. The `set` and `unset` functions will modify the contents of a dictionary. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dictCreating dictionaries is done by calling the `dict` function and passing it a +### dict + +Creating dictionaries is done by calling the `dict` function and passing it a list of pairs. The following creates a dictionary with three items: @@ -1220,12 +1041,10 @@ The following creates a dictionary with three items: ``` $myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3" ``` -
getGiven a map and a key, get the value from the map. +### get + +Given a map and a key, get the value from the map. ``` get $myDict "name1" @@ -1235,12 +1054,10 @@ The above returns `"value1"` Note that if the key is not found, this operation will simply return `""`. No error will be generated. -
setUse `set` to add a new key/value pair to a dictionary. +### set + +Use `set` to add a new key/value pair to a dictionary. ``` $_ := set $myDict "name4" "value4" @@ -1248,12 +1065,10 @@ $_ := set $myDict "name4" "value4" Note that `set` _returns the dictionary_ (a requirement of Go template functions), so you may need to trap the value as done above with the `$_` assignment. -
unsetGiven a map and a key, delete the key from the map. +### unset + +Given a map and a key, delete the key from the map. ``` $_ := unset $myDict "name4" @@ -1263,24 +1078,20 @@ As with `set`, this returns the dictionary. Note that if the key is not found, this operation will simply return. No error will be generated. -
hasKeyThe `hasKey` function returns `true` if the given dict contains the given key. +### hasKey + +The `hasKey` function returns `true` if the given dict contains the given key. ``` hasKey $myDict "name1" ``` If the key is not found, this returns `false`. -
pluckThe `pluck` function makes it possible to give one key and multiple maps, and +### pluck + +The `pluck` function makes it possible to give one key and multiple maps, and get a list of all of the matches: ``` @@ -1298,12 +1109,10 @@ inserted. A common idiom in Sprig templates is to uses `pluck... | first` to get the first matching key out of a collection of dictionaries. -
digThe `dig` function traverses a nested set of dicts, selecting keys from a list +### dig + +The `dig` function traverses a nested set of dicts, selecting keys from a list of values. It returns a default value if any of the keys are not found at the associated dict. @@ -1331,12 +1140,10 @@ especially since Go's template package's `and` doesn't shortcut. For instance `a.maybeNil.iNeedThis`, and panic if `a` lacks a `maybeNil` field.) `dig` accepts its dict argument last in order to support pipelining. -
keysThe `keys` function will return a `list` of all of the keys in one or more `dict` +### keys + +The `keys` function will return a `list` of all of the keys in one or more `dict` types. Since a dictionary is _unordered_, the keys will not be in a predictable order. They can be sorted with `sortAlpha`. @@ -1350,12 +1157,10 @@ function along with `sortAlpha` to get a unqiue, sorted list of keys. ``` keys $myDict $myOtherDict | uniq | sortAlpha ``` -
pickThe `pick` function selects just the given keys out of a dictionary, creating a +### pick + +The `pick` function selects just the given keys out of a dictionary, creating a new `dict`. ``` @@ -1363,12 +1168,10 @@ $new := pick $myDict "name1" "name2" ``` The above returns `{name1: value1, name2: value2}` -
omitThe `omit` function is similar to `pick`, except it returns a new `dict` with all +### omit + +The `omit` function is similar to `pick`, except it returns a new `dict` with all the keys that _do not_ match the given keys. ``` @@ -1376,12 +1179,10 @@ $new := omit $myDict "name1" "name3" ``` The above returns `{name2: value2}` -
valuesThe `values` function is similar to `keys`, except it returns a new `list` with +### values + +The `values` function is similar to `keys`, except it returns a new `list` with all the values of the source `dict` (only one dictionary is supported). ``` @@ -1391,62 +1192,44 @@ $vals := values $myDict The above returns `list["value1", "value2", "value 3"]`. Note that the `values` function gives no guarantees about the result ordering- if you care about this, then use `sortAlpha`. -
## Type Conversion Functions The following type conversion functions are provided by Sprig: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
atoiConvert a string to an integer. -
float64Convert to a `float64`. -
intConvert to an `int` at the system's width. -
int64Convert to an `int64`. -
toDecimalConvert a unix octal to a `int64`. -
toStringConvert to a string. -
toStringsConvert a list, slice, or array to a list of strings. -
+- `atoi`: Convert a string to an integer. +- `float64`: Convert to a `float64`. +- `int`: Convert to an `int` at the system's width. +- `int64`: Convert to an `int64`. +- `toDecimal`: Convert a unix octal to a `int64`. +- `toString`: Convert to a string. +- `toStrings`: Convert a list, slice, or array to a list of strings. Only `atoi` requires that the input be a specific type. The others will attempt to convert from any type to the destination type. For example, `int64` can convert floats to ints, and it can also convert strings to ints. +### toStrings + +Given a list-like collection, produce a slice of strings. + +``` +list 1 2 3 | toStrings +``` + +The above converts `1` to `"1"`, `2` to `"2"`, and so on, and then returns +them as a list. + +### toDecimal + +Given a unix octal permission, produce a decimal. + +``` +"0777" | toDecimal +``` + +The above converts `0777` to `511` and returns the value as an int64. + ## Path and Filepath Functions While Sprig does not grant access to the filesystem, it does provide functions @@ -1466,56 +1249,44 @@ Examples: [URIs](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier): `https://example.com/some/content/`, `ftp://example.com/file/`. - - - - - - - - - - - - - - - - - - - - - -
baseReturn the last element of a path. +#### base + +Return the last element of a path. ``` base "foo/bar/baz" ``` The above prints "baz". -
dirReturn the directory, stripping the last part of the path. So `dir "foo/bar/baz"` +#### dir + +Return the directory, stripping the last part of the path. So `dir "foo/bar/baz"` returns `foo/bar`. -
cleanClean up a path. +#### clean + +Clean up a path. ``` clean "foo/bar/../baz" ``` The above resolves the `..` and returns `foo/baz`. -
extReturn the file extension. +#### ext + +Return the file extension. ``` ext "foo.bar" ``` The above returns `.bar`. -
isAbsTo check whether a path is absolute, use `isAbs`. -
+#### isAbs + +To check whether a path is absolute, use `isAbs`. ### Filepaths @@ -1531,10 +1302,9 @@ Examples: the filesystem path is separated by the backslash character (`\`): `C:\Users\Username\`, `C:\Program Files\Application\`; - - - - - - - - - - - - - - - - - - - - - -
osBaseReturn the last element of a filepath. +#### osBase + +Return the last element of a filepath. ``` osBase "/foo/bar/baz" @@ -1542,20 +1312,16 @@ osBase "C:\\foo\\bar\\baz" ``` The above prints "baz" on Linux and Windows, respectively. -
osDirReturn the directory, stripping the last part of the path. So `osDir "/foo/bar/baz"` +#### osDir + +Return the directory, stripping the last part of the path. So `osDir "/foo/bar/baz"` returns `/foo/bar` on Linux, and `osDir "C:\\foo\\bar\\baz"` returns `C:\\foo\\bar` on Windows. -
osCleanClean up a path. +#### osClean + +Clean up a path. ``` osClean "/foo/bar/../baz" @@ -1563,12 +1329,10 @@ osClean "C:\\foo\\bar\\..\\baz" ``` The above resolves the `..` and returns `foo/baz` on Linux and `C:\\foo\\baz` on Windows. -
osExtReturn the file extension. +#### osExt + +Return the file extension. ``` osExt "/foo.bar" @@ -1576,48 +1340,32 @@ osExt "C:\\foo.bar" ``` The above returns `.bar` on Linux and Windows, respectively. -
osIsAbsTo check whether a file path is absolute, use `osIsAbs`. -
+#### osIsAbs + +To check whether a file path is absolute, use `osIsAbs`. ## Flow Control Functions - - - - - -
failUnconditionally returns an empty `string` and an `error` with the specified +### fail + +Unconditionally returns an empty `string` and an `error` with the specified text. This is useful in scenarios where other conditionals have determined that template rendering should fail. ``` fail "Please accept the end user license agreement" ``` -
## UUID Functions Sprig can generate UUID v4 universally unique IDs. - - - - - -
uuidv4 ``` uuidv4 ``` The above returns a new UUID of the v4 (randomly generated) type. -
## Reflection Functions @@ -1632,63 +1380,35 @@ Sprig provides a set of functions for each. ### Kind Functions - - - - - - - - - - -
kindOfReturns the kind of an object. +There are two Kind functions: `kindOf` returns the kind of an object. ``` kindOf "hello" ``` -The above would return `string`. -
kindIsFor simple tests (like in `if` blocks), the `kindIs` function will let you verify that a value is a particular kind: +The above would return `string`. For simple tests (like in `if` blocks), the +`kindIs` function will let you verify that a value is a particular kind: ``` kindIs "int" 123 ``` The above will return `true` -
### Type Functions Types are slightly harder to work with, so there are three different functions: - - - - - - - - - - - - - - - -
typeOfReturns the underlying type of a value: `typeOf $foo` -
typeIsLike `kindIs`, but for types: `typeIs "*io.Buffer" $myVal` -
typeIsLikeWorks as `typeIs`, except that it also dereferences pointers. -
+- `typeOf` returns the underlying type of a value: `typeOf $foo` +- `typeIs` is like `kindIs`, but for types: `typeIs "*io.Buffer" $myVal` +- `typeIsLike` works as `typeIs`, except that it also dereferences pointers. **Note:** None of these can test whether or not something implements a given interface, since doing so would require compiling the interface in ahead of time. - - - - - -
deepEqualReturns true if two values are ["deeply equal"](https://golang.org/pkg/reflect/#DeepEqual) +### deepEqual + +`deepEqual` returns true if two values are ["deeply equal"](https://golang.org/pkg/reflect/#DeepEqual) Works for non-primitive types as well (compared to the built-in `eq`). @@ -1697,28 +1417,22 @@ deepEqual (list 1 2 3) (list 1 2 3) ``` The above will return `true` -
## Cryptographic and Security Functions Sprig provides a couple of advanced cryptographic functions. - - - - - - - - - - - - - - - - - -
sha1sumThe `sha1sum` function receives a string, and computes it's SHA1 digest. +### sha1sum + +The `sha1sum` function receives a string, and computes it's SHA1 digest. ``` sha1sum "Hello world!" ``` -
sha256sumThe `sha256sum` function receives a string, and computes it's SHA256 digest. +### sha256sum + +The `sha256sum` function receives a string, and computes it's SHA256 digest. ``` sha256sum "Hello world!" @@ -1726,12 +1440,10 @@ sha256sum "Hello world!" The above will compute the SHA 256 sum in an "ASCII armored" format that is safe to print. -
sha512sumThe `sha512sum` function receives a string, and computes it's SHA512 digest. +### sha512sum + +The `sha512sum` function receives a string, and computes it's SHA512 digest. ``` sha512sum "Hello world!" @@ -1739,26 +1451,19 @@ sha512sum "Hello world!" The above will compute the SHA 512 sum in an "ASCII armored" format that is safe to print. -
adler32sumThe `adler32sum` function receives a string, and computes its Adler-32 checksum. +### adler32sum + +The `adler32sum` function receives a string, and computes its Adler-32 checksum. ``` adler32sum "Hello world!" ``` -
## URL Functions - - - - - - - - - -
urlParseParses string for URL and produces dict with URL parts +### urlParse +Parses string for URL and produces dict with URL parts ``` urlParse "http://admin:secret@server.com:8080/api?list=false#anchor" @@ -1776,12 +1481,9 @@ userinfo: 'admin:secret' ``` For more info, check https://golang.org/pkg/net/url/#URL -
urlJoinJoins map (produced by `urlParse`) to produce URL string +### urlJoin +Joins map (produced by `urlParse`) to produce URL string ``` urlJoin (dict "fragment" "fragment" "host" "host:80" "path" "/path" "query" "query" "scheme" "http") @@ -1791,6 +1493,3 @@ The above returns the following string: ``` proto://host:80/path?query#fragment ``` -
diff --git a/docs/sprig.md b/docs/sprig.md deleted file mode 100644 index be4e6c9c..00000000 --- a/docs/sprig.md +++ /dev/null @@ -1,24 +0,0 @@ -# Template Functions - -ntfy includes a (reduced) version of [Sprig](https://github.com/Masterminds/sprig) to add functions that can be used -when you are using the [message template](publish.md#message-templating) feature. - -Below are the functions that are available to use inside your message/title templates. - -* [String Functions](./sprig/strings.md): `trim`, `trunc`, `substr`, `plural`, etc. - * [String List Functions](./sprig/string_slice.md): `splitList`, `sortAlpha`, etc. -* [Integer Math Functions](./sprig/math.md): `add`, `max`, `mul`, etc. - * [Integer List Functions](./sprig/integer_slice.md): `until`, `untilStep` -* [Date Functions](./sprig/date.md): `now`, `date`, etc. -* [Defaults Functions](./sprig/defaults.md): `default`, `empty`, `coalesce`, `fromJSON`, `toJSON`, `toPrettyJSON`, `toRawJSON`, `ternary` -* [Encoding Functions](./sprig/encoding.md): `b64enc`, `b64dec`, etc. -* [Lists and List Functions](./sprig/lists.md): `list`, `first`, `uniq`, etc. -* [Dictionaries and Dict Functions](./sprig/dicts.md): `get`, `set`, `dict`, `hasKey`, `pluck`, `dig`, etc. -* [Type Conversion Functions](./sprig/conversion.md): `atoi`, `int64`, `toString`, etc. -* [Path and Filepath Functions](./sprig/paths.md): `base`, `dir`, `ext`, `clean`, `isAbs`, `osBase`, `osDir`, `osExt`, `osClean`, `osIsAbs` -* [Flow Control Functions](./sprig/flow_control.md): `fail` -* Advanced Functions - * [UUID Functions](./sprig/uuid.md): `uuidv4` - * [Reflection](./sprig/reflection.md): `typeOf`, `kindIs`, `typeIsLike`, etc. - * [Cryptographic and Security Functions](./sprig/crypto.md): `sha256sum`, etc. - * [URL](./sprig/url.md): `urlParse`, `urlJoin` diff --git a/docs/sprig/conversion.md b/docs/sprig/conversion.md deleted file mode 100644 index af952682..00000000 --- a/docs/sprig/conversion.md +++ /dev/null @@ -1,36 +0,0 @@ -# Type Conversion Functions - -The following type conversion functions are provided by Sprig: - -- `atoi`: Convert a string to an integer. -- `float64`: Convert to a `float64`. -- `int`: Convert to an `int` at the system's width. -- `int64`: Convert to an `int64`. -- `toDecimal`: Convert a unix octal to a `int64`. -- `toString`: Convert to a string. -- `toStrings`: Convert a list, slice, or array to a list of strings. - -Only `atoi` requires that the input be a specific type. The others will attempt -to convert from any type to the destination type. For example, `int64` can convert -floats to ints, and it can also convert strings to ints. - -## toStrings - -Given a list-like collection, produce a slice of strings. - -``` -list 1 2 3 | toStrings -``` - -The above converts `1` to `"1"`, `2` to `"2"`, and so on, and then returns -them as a list. - -## toDecimal - -Given a unix octal permission, produce a decimal. - -``` -"0777" | toDecimal -``` - -The above converts `0777` to `511` and returns the value as an int64. diff --git a/docs/sprig/crypto.md b/docs/sprig/crypto.md deleted file mode 100644 index c66a269d..00000000 --- a/docs/sprig/crypto.md +++ /dev/null @@ -1,41 +0,0 @@ -# Cryptographic and Security Functions - -Sprig provides a couple of advanced cryptographic functions. - -## sha1sum - -The `sha1sum` function receives a string, and computes it's SHA1 digest. - -``` -sha1sum "Hello world!" -``` - -## sha256sum - -The `sha256sum` function receives a string, and computes it's SHA256 digest. - -``` -sha256sum "Hello world!" -``` - -The above will compute the SHA 256 sum in an "ASCII armored" format that is -safe to print. - -## sha512sum - -The `sha512sum` function receives a string, and computes it's SHA512 digest. - -``` -sha512sum "Hello world!" -``` - -The above will compute the SHA 512 sum in an "ASCII armored" format that is -safe to print. - -## adler32sum - -The `adler32sum` function receives a string, and computes its Adler-32 checksum. - -``` -adler32sum "Hello world!" -``` diff --git a/docs/sprig/date.md b/docs/sprig/date.md deleted file mode 100644 index 7410c08d..00000000 --- a/docs/sprig/date.md +++ /dev/null @@ -1,126 +0,0 @@ -# Date Functions - -## now - -The current date/time. Use this in conjunction with other date functions. - -## ago - -The `ago` function returns duration from time.Now in seconds resolution. - -``` -ago .CreatedAt -``` - -returns in `time.Duration` String() format - -``` -2h34m7s -``` - -## date - -The `date` function formats a date. - -Format the date to YEAR-MONTH-DAY: - -``` -now | date "2006-01-02" -``` - -Date formatting in Go is a [little bit different](https://pauladamsmith.com/blog/2011/05/go_time.html). - -In short, take this as the base date: - -``` -Mon Jan 2 15:04:05 MST 2006 -``` - -Write it in the format you want. Above, `2006-01-02` is the same date, but -in the format we want. - -## dateInZone - -Same as `date`, but with a timezone. - -``` -dateInZone "2006-01-02" (now) "UTC" -``` - -## duration - -Formats a given amount of seconds as a `time.Duration`. - -This returns 1m35s - -``` -duration "95" -``` - -## durationRound - -Rounds a given duration to the most significant unit. Strings and `time.Duration` -gets parsed as a duration, while a `time.Time` is calculated as the duration since. - -This return 2h - -``` -durationRound "2h10m5s" -``` - -This returns 3mo - -``` -durationRound "2400h10m5s" -``` - -## unixEpoch - -Returns the seconds since the unix epoch for a `time.Time`. - -``` -now | unixEpoch -``` - -## dateModify, mustDateModify - -The `dateModify` takes a modification and a date and returns the timestamp. - -Subtract an hour and thirty minutes from the current time: - -``` -now | date_modify "-1.5h" -``` - -If the modification format is wrong `dateModify` will return the date unmodified. `mustDateModify` will return an error otherwise. - -## htmlDate - -The `htmlDate` function formats a date for inserting into an HTML date picker -input field. - -``` -now | htmlDate -``` - -## htmlDateInZone - -Same as htmlDate, but with a timezone. - -``` -htmlDateInZone (now) "UTC" -``` - -## toDate, mustToDate - -`toDate` converts a string to a date. The first argument is the date layout and -the second the date string. If the string can't be convert it returns the zero -value. -`mustToDate` will return an error in case the string cannot be converted. - -This is useful when you want to convert a string date to another format -(using pipe). The example below converts "2017-12-31" to "31/12/2017". - -``` -toDate "2006-01-02" "2017-12-31" | date "02/01/2006" -``` diff --git a/docs/sprig/defaults.md b/docs/sprig/defaults.md deleted file mode 100644 index b8af1455..00000000 --- a/docs/sprig/defaults.md +++ /dev/null @@ -1,169 +0,0 @@ -# Default Functions - -Sprig provides tools for setting default values for templates. - -## default - -To set a simple default value, use `default`: - -``` -default "foo" .Bar -``` - -In the above, if `.Bar` evaluates to a non-empty value, it will be used. But if -it is empty, `foo` will be returned instead. - -The definition of "empty" depends on type: - -- Numeric: 0 -- String: "" -- Lists: `[]` -- Dicts: `{}` -- Boolean: `false` -- And always `nil` (aka null) - -For structs, there is no definition of empty, so a struct will never return the -default. - -## empty - -The `empty` function returns `true` if the given value is considered empty, and -`false` otherwise. The empty values are listed in the `default` section. - -``` -empty .Foo -``` - -Note that in Go template conditionals, emptiness is calculated for you. Thus, -you rarely need `if empty .Foo`. Instead, just use `if .Foo`. - -## coalesce - -The `coalesce` function takes a list of values and returns the first non-empty -one. - -``` -coalesce 0 1 2 -``` - -The above returns `1`. - -This function is useful for scanning through multiple variables or values: - -``` -coalesce .name .parent.name "Matt" -``` - -The above will first check to see if `.name` is empty. If it is not, it will return -that value. If it _is_ empty, `coalesce` will evaluate `.parent.name` for emptiness. -Finally, if both `.name` and `.parent.name` are empty, it will return `Matt`. - -## all - -The `all` function takes a list of values and returns true if all values are non-empty. - -``` -all 0 1 2 -``` - -The above returns `false`. - -This function is useful for evaluating multiple conditions of variables or values: - -``` -all (eq .Request.TLS.Version 0x0304) (.Request.ProtoAtLeast 2 0) (eq .Request.Method "POST") -``` - -The above will check http.Request is POST with tls 1.3 and http/2. - -## any - -The `any` function takes a list of values and returns true if any value is non-empty. - -``` -any 0 1 2 -``` - -The above returns `true`. - -This function is useful for evaluating multiple conditions of variables or values: - -``` -any (eq .Request.Method "GET") (eq .Request.Method "POST") (eq .Request.Method "OPTIONS") -``` - -The above will check http.Request method is one of GET/POST/OPTIONS. - -## fromJSON, mustFromJSON - -`fromJSON` decodes a JSON document into a structure. If the input cannot be decoded as JSON the function will return an empty string. -`mustFromJSON` will return an error in case the JSON is invalid. - -``` -fromJSON "{\"foo\": 55}" -``` - -## toJSON, mustToJSON - -The `toJSON` function encodes an item into a JSON string. If the item cannot be converted to JSON the function will return an empty string. -`mustToJSON` will return an error in case the item cannot be encoded in JSON. - -``` -toJSON .Item -``` - -The above returns JSON string representation of `.Item`. - -## toPrettyJSON, mustToPrettyJSON - -The `toPrettyJSON` function encodes an item into a pretty (indented) JSON string. - -``` -toPrettyJSON .Item -``` - -The above returns indented JSON string representation of `.Item`. - -## toRawJSON, mustToRawJSON - -The `toRawJSON` function encodes an item into JSON string with HTML characters unescaped. - -``` -toRawJSON .Item -``` - -The above returns unescaped JSON string representation of `.Item`. - -## ternary - -The `ternary` function takes two values, and a test value. If the test value is -true, the first value will be returned. If the test value is empty, the second -value will be returned. This is similar to the c ternary operator. - -### true test value - -``` -ternary "foo" "bar" true -``` - -or - -``` -true | ternary "foo" "bar" -``` - -The above returns `"foo"`. - -### false test value - -``` -ternary "foo" "bar" false -``` - -or - -``` -false | ternary "foo" "bar" -``` - -The above returns `"bar"`. diff --git a/docs/sprig/dicts.md b/docs/sprig/dicts.md deleted file mode 100644 index 5a4490d5..00000000 --- a/docs/sprig/dicts.md +++ /dev/null @@ -1,172 +0,0 @@ -# Dictionaries and Dict Functions - -Sprig provides a key/value storage type called a `dict` (short for "dictionary", -as in Python). A `dict` is an _unorder_ type. - -The key to a dictionary **must be a string**. However, the value can be any -type, even another `dict` or `list`. - -Unlike `list`s, `dict`s are not immutable. The `set` and `unset` functions will -modify the contents of a dictionary. - -## dict - -Creating dictionaries is done by calling the `dict` function and passing it a -list of pairs. - -The following creates a dictionary with three items: - -``` -$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3" -``` - -## get - -Given a map and a key, get the value from the map. - -``` -get $myDict "name1" -``` - -The above returns `"value1"` - -Note that if the key is not found, this operation will simply return `""`. No error -will be generated. - -## set - -Use `set` to add a new key/value pair to a dictionary. - -``` -$_ := set $myDict "name4" "value4" -``` - -Note that `set` _returns the dictionary_ (a requirement of Go template functions), -so you may need to trap the value as done above with the `$_` assignment. - -## unset - -Given a map and a key, delete the key from the map. - -``` -$_ := unset $myDict "name4" -``` - -As with `set`, this returns the dictionary. - -Note that if the key is not found, this operation will simply return. No error -will be generated. - -## hasKey - -The `hasKey` function returns `true` if the given dict contains the given key. - -``` -hasKey $myDict "name1" -``` - -If the key is not found, this returns `false`. - -## pluck - -The `pluck` function makes it possible to give one key and multiple maps, and -get a list of all of the matches: - -``` -pluck "name1" $myDict $myOtherDict -``` - -The above will return a `list` containing every found value (`[value1 otherValue1]`). - -If the give key is _not found_ in a map, that map will not have an item in the -list (and the length of the returned list will be less than the number of dicts -in the call to `pluck`. - -If the key is _found_ but the value is an empty value, that value will be -inserted. - -A common idiom in Sprig templates is to uses `pluck... | first` to get the first -matching key out of a collection of dictionaries. - -## dig - -The `dig` function traverses a nested set of dicts, selecting keys from a list -of values. It returns a default value if any of the keys are not found at the -associated dict. - -``` -dig "user" "role" "humanName" "guest" $dict -``` - -Given a dict structured like -``` -{ - user: { - role: { - humanName: "curator" - } - } -} -``` - -the above would return `"curator"`. If the dict lacked even a `user` field, -the result would be `"guest"`. - -Dig can be very useful in cases where you'd like to avoid guard clauses, -especially since Go's template package's `and` doesn't shortcut. For instance -`and a.maybeNil a.maybeNil.iNeedThis` will always evaluate -`a.maybeNil.iNeedThis`, and panic if `a` lacks a `maybeNil` field.) - -`dig` accepts its dict argument last in order to support pipelining. - -## keys - -The `keys` function will return a `list` of all of the keys in one or more `dict` -types. Since a dictionary is _unordered_, the keys will not be in a predictable order. -They can be sorted with `sortAlpha`. - -``` -keys $myDict | sortAlpha -``` - -When supplying multiple dictionaries, the keys will be concatenated. Use the `uniq` -function along with `sortAlpha` to get a unqiue, sorted list of keys. - -``` -keys $myDict $myOtherDict | uniq | sortAlpha -``` - -## pick - -The `pick` function selects just the given keys out of a dictionary, creating a -new `dict`. - -``` -$new := pick $myDict "name1" "name2" -``` - -The above returns `{name1: value1, name2: value2}` - -## omit - -The `omit` function is similar to `pick`, except it returns a new `dict` with all -the keys that _do not_ match the given keys. - -``` -$new := omit $myDict "name1" "name3" -``` - -The above returns `{name2: value2}` - -## values - -The `values` function is similar to `keys`, except it returns a new `list` with -all the values of the source `dict` (only one dictionary is supported). - -``` -$vals := values $myDict -``` - -The above returns `list["value1", "value2", "value 3"]`. Note that the `values` -function gives no guarantees about the result ordering- if you care about this, -then use `sortAlpha`. diff --git a/docs/sprig/encoding.md b/docs/sprig/encoding.md deleted file mode 100644 index 1c7a36f8..00000000 --- a/docs/sprig/encoding.md +++ /dev/null @@ -1,6 +0,0 @@ -# Encoding Functions - -Sprig has the following encoding and decoding functions: - -- `b64enc`/`b64dec`: Encode or decode with Base64 -- `b32enc`/`b32dec`: Encode or decode with Base32 diff --git a/docs/sprig/flow_control.md b/docs/sprig/flow_control.md deleted file mode 100644 index 6414640a..00000000 --- a/docs/sprig/flow_control.md +++ /dev/null @@ -1,11 +0,0 @@ -# Flow Control Functions - -## fail - -Unconditionally returns an empty `string` and an `error` with the specified -text. This is useful in scenarios where other conditionals have determined that -template rendering should fail. - -``` -fail "Please accept the end user license agreement" -``` diff --git a/docs/sprig/integer_slice.md b/docs/sprig/integer_slice.md deleted file mode 100644 index ab4bef6d..00000000 --- a/docs/sprig/integer_slice.md +++ /dev/null @@ -1,41 +0,0 @@ -# Integer List Functions - -## until - -The `until` function builds a range of integers. - -``` -until 5 -``` - -The above generates the list `[0, 1, 2, 3, 4]`. - -This is useful for looping with `range $i, $e := until 5`. - -## untilStep - -Like `until`, `untilStep` generates a list of counting integers. But it allows -you to define a start, stop, and step: - -``` -untilStep 3 6 2 -``` - -The above will produce `[3 5]` by starting with 3, and adding 2 until it is equal -or greater than 6. This is similar to Python's `range` function. - -## seq - -Works like the bash `seq` command. -* 1 parameter (end) - will generate all counting integers between 1 and `end` inclusive. -* 2 parameters (start, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by 1. -* 3 parameters (start, step, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by `step`. - -``` -seq 5 => 1 2 3 4 5 -seq -3 => 1 0 -1 -2 -3 -seq 0 2 => 0 1 2 -seq 2 -2 => 2 1 0 -1 -2 -seq 0 2 10 => 0 2 4 6 8 10 -seq 0 -2 -5 => 0 -2 -4 -``` diff --git a/docs/sprig/lists.md b/docs/sprig/lists.md deleted file mode 100644 index ed8c52b3..00000000 --- a/docs/sprig/lists.md +++ /dev/null @@ -1,188 +0,0 @@ -# Lists and List Functions - -Sprig provides a simple `list` type that can contain arbitrary sequential lists -of data. This is similar to arrays or slices, but lists are designed to be used -as immutable data types. - -Create a list of integers: - -``` -$myList := list 1 2 3 4 5 -``` - -The above creates a list of `[1 2 3 4 5]`. - -## first, mustFirst - -To get the head item on a list, use `first`. - -`first $myList` returns `1` - -`first` panics if there is a problem while `mustFirst` returns an error to the -template engine if there is a problem. - -## rest, mustRest - -To get the tail of the list (everything but the first item), use `rest`. - -`rest $myList` returns `[2 3 4 5]` - -`rest` panics if there is a problem while `mustRest` returns an error to the -template engine if there is a problem. - -## last, mustLast - -To get the last item on a list, use `last`: - -`last $myList` returns `5`. This is roughly analogous to reversing a list and -then calling `first`. - -`last` panics if there is a problem while `mustLast` returns an error to the -template engine if there is a problem. - -## initial, mustInitial - -This compliments `last` by returning all _but_ the last element. -`initial $myList` returns `[1 2 3 4]`. - -`initial` panics if there is a problem while `mustInitial` returns an error to the -template engine if there is a problem. - -## append, mustAppend - -Append a new item to an existing list, creating a new list. - -``` -$new = append $myList 6 -``` - -The above would set `$new` to `[1 2 3 4 5 6]`. `$myList` would remain unaltered. - -`append` panics if there is a problem while `mustAppend` returns an error to the -template engine if there is a problem. - -## prepend, mustPrepend - -Push an element onto the front of a list, creating a new list. - -``` -prepend $myList 0 -``` - -The above would produce `[0 1 2 3 4 5]`. `$myList` would remain unaltered. - -`prepend` panics if there is a problem while `mustPrepend` returns an error to the -template engine if there is a problem. - -## concat - -Concatenate arbitrary number of lists into one. - -``` -concat $myList ( list 6 7 ) ( list 8 ) -``` - -The above would produce `[1 2 3 4 5 6 7 8]`. `$myList` would remain unaltered. - -## reverse, mustReverse - -Produce a new list with the reversed elements of the given list. - -``` -reverse $myList -``` - -The above would generate the list `[5 4 3 2 1]`. - -`reverse` panics if there is a problem while `mustReverse` returns an error to the -template engine if there is a problem. - -## uniq, mustUniq - -Generate a list with all of the duplicates removed. - -``` -list 1 1 1 2 | uniq -``` - -The above would produce `[1 2]` - -`uniq` panics if there is a problem while `mustUniq` returns an error to the -template engine if there is a problem. - -## without, mustWithout - -The `without` function filters items out of a list. - -``` -without $myList 3 -``` - -The above would produce `[1 2 4 5]` - -Without can take more than one filter: - -``` -without $myList 1 3 5 -``` - -That would produce `[2 4]` - -`without` panics if there is a problem while `mustWithout` returns an error to the -template engine if there is a problem. - -## has, mustHas - -Test to see if a list has a particular element. - -``` -has 4 $myList -``` - -The above would return `true`, while `has "hello" $myList` would return false. - -`has` panics if there is a problem while `mustHas` returns an error to the -template engine if there is a problem. - -## compact, mustCompact - -Accepts a list and removes entries with empty values. - -``` -$list := list 1 "a" "foo" "" -$copy := compact $list -``` - -`compact` will return a new list with the empty (i.e., "") item removed. - -`compact` panics if there is a problem and `mustCompact` returns an error to the -template engine if there is a problem. - -## slice, mustSlice - -To get partial elements of a list, use `slice list [n] [m]`. It is -equivalent of `list[n:m]`. - -- `slice $myList` returns `[1 2 3 4 5]`. It is same as `myList[:]`. -- `slice $myList 3` returns `[4 5]`. It is same as `myList[3:]`. -- `slice $myList 1 3` returns `[2 3]`. It is same as `myList[1:3]`. -- `slice $myList 0 3` returns `[1 2 3]`. It is same as `myList[:3]`. - -`slice` panics if there is a problem while `mustSlice` returns an error to the -template engine if there is a problem. - -## chunk - -To split a list into chunks of given size, use `chunk size list`. This is useful for pagination. - -``` -chunk 3 (list 1 2 3 4 5 6 7 8) -``` - -This produces list of lists `[ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 ] ]`. - -## A Note on List Internals - -A list is implemented in Go as a `[]interface{}`. For Go developers embedding -Sprig, you may pass `[]interface{}` items into your template context and be -able to use all of the `list` functions on those items. diff --git a/docs/sprig/math.md b/docs/sprig/math.md deleted file mode 100644 index b08d0a2f..00000000 --- a/docs/sprig/math.md +++ /dev/null @@ -1,78 +0,0 @@ -# Integer Math Functions - -The following math functions operate on `int64` values. - -## add - -Sum numbers with `add`. Accepts two or more inputs. - -``` -add 1 2 3 -``` - -## add1 - -To increment by 1, use `add1` - -## sub - -To subtract, use `sub` - -## div - -Perform integer division with `div` - -## mod - -Modulo with `mod` - -## mul - -Multiply with `mul`. Accepts two or more inputs. - -``` -mul 1 2 3 -``` - -## max - -Return the largest of a series of integers: - -This will return `3`: - -``` -max 1 2 3 -``` - -## min - -Return the smallest of a series of integers. - -`min 1 2 3` will return `1` - -## floor - -Returns the greatest float value less than or equal to input value - -`floor 123.9999` will return `123.0` - -## ceil - -Returns the greatest float value greater than or equal to input value - -`ceil 123.001` will return `124.0` - -## round - -Returns a float value with the remainder rounded to the given number to digits after the decimal point. - -`round 123.555555 3` will return `123.556` - -## randInt -Returns a random integer value from min (inclusive) to max (exclusive). - -``` -randInt 12 30 -``` - -The above will produce a random number in the range [12,30]. diff --git a/docs/sprig/paths.md b/docs/sprig/paths.md deleted file mode 100644 index f847e357..00000000 --- a/docs/sprig/paths.md +++ /dev/null @@ -1,114 +0,0 @@ -# Path and Filepath Functions - -While Sprig does not grant access to the filesystem, it does provide functions -for working with strings that follow file path conventions. - -## Paths - -Paths separated by the slash character (`/`), processed by the `path` package. - -Examples: - -* The [Linux](https://en.wikipedia.org/wiki/Linux) and - [MacOS](https://en.wikipedia.org/wiki/MacOS) - [filesystems](https://en.wikipedia.org/wiki/File_system): - `/home/user/file`, `/etc/config`; -* The path component of - [URIs](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier): - `https://example.com/some/content/`, `ftp://example.com/file/`. - -### base - -Return the last element of a path. - -``` -base "foo/bar/baz" -``` - -The above prints "baz". - -### dir - -Return the directory, stripping the last part of the path. So `dir "foo/bar/baz"` -returns `foo/bar`. - -### clean - -Clean up a path. - -``` -clean "foo/bar/../baz" -``` - -The above resolves the `..` and returns `foo/baz`. - -### ext - -Return the file extension. - -``` -ext "foo.bar" -``` - -The above returns `.bar`. - -### isAbs - -To check whether a path is absolute, use `isAbs`. - -## Filepaths - -Paths separated by the `os.PathSeparator` variable, processed by the `path/filepath` package. - -These are the recommended functions to use when parsing paths of local filesystems, usually when dealing with local files, directories, etc. - -Examples: - -* Running on Linux or MacOS the filesystem path is separated by the slash character (`/`): - `/home/user/file`, `/etc/config`; -* Running on [Windows](https://en.wikipedia.org/wiki/Microsoft_Windows) - the filesystem path is separated by the backslash character (`\`): - `C:\Users\Username\`, `C:\Program Files\Application\`; - -### osBase - -Return the last element of a filepath. - -``` -osBase "/foo/bar/baz" -osBase "C:\\foo\\bar\\baz" -``` - -The above prints "baz" on Linux and Windows, respectively. - -### osDir - -Return the directory, stripping the last part of the path. So `osDir "/foo/bar/baz"` -returns `/foo/bar` on Linux, and `osDir "C:\\foo\\bar\\baz"` -returns `C:\\foo\\bar` on Windows. - -### osClean - -Clean up a path. - -``` -osClean "/foo/bar/../baz" -osClean "C:\\foo\\bar\\..\\baz" -``` - -The above resolves the `..` and returns `foo/baz` on Linux and `C:\\foo\\baz` on Windows. - -### osExt - -Return the file extension. - -``` -osExt "/foo.bar" -osExt "C:\\foo.bar" -``` - -The above returns `.bar` on Linux and Windows, respectively. - -### osIsAbs - -To check whether a file path is absolute, use `osIsAbs`. diff --git a/docs/sprig/reflection.md b/docs/sprig/reflection.md deleted file mode 100644 index 51e167aa..00000000 --- a/docs/sprig/reflection.md +++ /dev/null @@ -1,50 +0,0 @@ -# Reflection Functions - -Sprig provides rudimentary reflection tools. These help advanced template -developers understand the underlying Go type information for a particular value. - -Go has several primitive _kinds_, like `string`, `slice`, `int64`, and `bool`. - -Go has an open _type_ system that allows developers to create their own types. - -Sprig provides a set of functions for each. - -## Kind Functions - -There are two Kind functions: `kindOf` returns the kind of an object. - -``` -kindOf "hello" -``` - -The above would return `string`. For simple tests (like in `if` blocks), the -`kindIs` function will let you verify that a value is a particular kind: - -``` -kindIs "int" 123 -``` - -The above will return `true` - -## Type Functions - -Types are slightly harder to work with, so there are three different functions: - -- `typeOf` returns the underlying type of a value: `typeOf $foo` -- `typeIs` is like `kindIs`, but for types: `typeIs "*io.Buffer" $myVal` -- `typeIsLike` works as `typeIs`, except that it also dereferences pointers. - -**Note:** None of these can test whether or not something implements a given -interface, since doing so would require compiling the interface in ahead of time. - -## deepEqual - -`deepEqual` returns true if two values are ["deeply equal"](https://golang.org/pkg/reflect/#DeepEqual) - -Works for non-primitive types as well (compared to the built-in `eq`). - -``` -deepEqual (list 1 2 3) (list 1 2 3) -``` - -The above will return `true` diff --git a/docs/sprig/string_slice.md b/docs/sprig/string_slice.md deleted file mode 100644 index 96c0c83b..00000000 --- a/docs/sprig/string_slice.md +++ /dev/null @@ -1,72 +0,0 @@ -# String List Functions - -These function operate on or generate slices of strings. In Go, a slice is a -growable array. In Sprig, it's a special case of a `list`. - -## join - -Join a list of strings into a single string, with the given separator. - -``` -list "hello" "world" | join "_" -``` - -The above will produce `hello_world` - -`join` will try to convert non-strings to a string value: - -``` -list 1 2 3 | join "+" -``` - -The above will produce `1+2+3` - -## splitList and split - -Split a string into a list of strings: - -``` -splitList "$" "foo$bar$baz" -``` - -The above will return `[foo bar baz]` - -The older `split` function splits a string into a `dict`. It is designed to make -it easy to use template dot notation for accessing members: - -``` -$a := split "$" "foo$bar$baz" -``` - -The above produces a map with index keys. `{_0: foo, _1: bar, _2: baz}` - -``` -$a._0 -``` - -The above produces `foo` - -## splitn - -`splitn` function splits a string into a `dict` with `n` keys. It is designed to make -it easy to use template dot notation for accessing members: - -``` -$a := splitn "$" 2 "foo$bar$baz" -``` - -The above produces a map with index keys. `{_0: foo, _1: bar$baz}` - -``` -$a._0 -``` - -The above produces `foo` - -## sortAlpha - -The `sortAlpha` function sorts a list of strings into alphabetical (lexicographical) -order. - -It does _not_ sort in place, but returns a sorted copy of the list, in keeping -with the immutability of lists. diff --git a/docs/sprig/strings.md b/docs/sprig/strings.md deleted file mode 100644 index 784392f1..00000000 --- a/docs/sprig/strings.md +++ /dev/null @@ -1,309 +0,0 @@ -# String Functions - -Sprig has a number of string manipulation functions. - -## trim - -The `trim` function removes space from either side of a string: - -``` -trim " hello " -``` - -The above produces `hello` - -## trimAll - -Remove given characters from the front or back of a string: - -``` -trimAll "$" "$5.00" -``` - -The above returns `5.00` (as a string). - -## trimSuffix - -Trim just the suffix from a string: - -``` -trimSuffix "-" "hello-" -``` - -The above returns `hello` - -## trimPrefix - -Trim just the prefix from a string: - -``` -trimPrefix "-" "-hello" -``` - -The above returns `hello` - -## upper - -Convert the entire string to uppercase: - -``` -upper "hello" -``` - -The above returns `HELLO` - -## lower - -Convert the entire string to lowercase: - -``` -lower "HELLO" -``` - -The above returns `hello` - -## title - -Convert to title case: - -``` -title "hello world" -``` - -The above returns `Hello World` - -## repeat - -Repeat a string multiple times: - -``` -repeat 3 "hello" -``` - -The above returns `hellohellohello` - -## substr - -Get a substring from a string. It takes three parameters: - -- start (int) -- end (int) -- string (string) - -``` -substr 0 5 "hello world" -``` - -The above returns `hello` - -## trunc - -Truncate a string (and add no suffix) - -``` -trunc 5 "hello world" -``` - -The above produces `hello`. - -``` -trunc -5 "hello world" -``` - -The above produces `world`. - -## contains - -Test to see if one string is contained inside of another: - -``` -contains "cat" "catch" -``` - -The above returns `true` because `catch` contains `cat`. - -## hasPrefix and hasSuffix - -The `hasPrefix` and `hasSuffix` functions test whether a string has a given -prefix or suffix: - -``` -hasPrefix "cat" "catch" -``` - -The above returns `true` because `catch` has the prefix `cat`. - -## quote and squote - -These functions wrap a string in double quotes (`quote`) or single quotes -(`squote`). - -## cat - -The `cat` function concatenates multiple strings together into one, separating -them with spaces: - -``` -cat "hello" "beautiful" "world" -``` - -The above produces `hello beautiful world` - -## indent - -The `indent` function indents every line in a given string to the specified -indent width. This is useful when aligning multi-line strings: - -``` -indent 4 $lots_of_text -``` - -The above will indent every line of text by 4 space characters. - -## nindent - -The `nindent` function is the same as the indent function, but prepends a new -line to the beginning of the string. - -``` -nindent 4 $lots_of_text -``` - -The above will indent every line of text by 4 space characters and add a new -line to the beginning. - -## replace - -Perform simple string replacement. - -It takes three arguments: - -- string to replace -- string to replace with -- source string - -``` -"I Am Henry VIII" | replace " " "-" -``` - -The above will produce `I-Am-Henry-VIII` - -## plural - -Pluralize a string. - -``` -len $fish | plural "one anchovy" "many anchovies" -``` - -In the above, if the length of the string is 1, the first argument will be -printed (`one anchovy`). Otherwise, the second argument will be printed -(`many anchovies`). - -The arguments are: - -- singular string -- plural string -- length integer - -NOTE: Sprig does not currently support languages with more complex pluralization -rules. And `0` is considered a plural because the English language treats it -as such (`zero anchovies`). The Sprig developers are working on a solution for -better internationalization. - -## regexMatch, mustRegexMatch - -Returns true if the input string contains any match of the regular expression. - -``` -regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "test@acme.com" -``` - -The above produces `true` - -`regexMatch` panics if there is a problem and `mustRegexMatch` returns an error to the -template engine if there is a problem. - -## regexFindAll, mustRegexFindAll - -Returns a slice of all matches of the regular expression in the input string. -The last parameter n determines the number of substrings to return, where -1 means return all matches - -``` -regexFindAll "[2,4,6,8]" "123456789" -1 -``` - -The above produces `[2 4 6 8]` - -`regexFindAll` panics if there is a problem and `mustRegexFindAll` returns an error to the -template engine if there is a problem. - -## regexFind, mustRegexFind - -Return the first (left most) match of the regular expression in the input string - -``` -regexFind "[a-zA-Z][1-9]" "abcd1234" -``` - -The above produces `d1` - -`regexFind` panics if there is a problem and `mustRegexFind` returns an error to the -template engine if there is a problem. - -## regexReplaceAll, mustRegexReplaceAll - -Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. -Inside string replacement, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first submatch - -``` -regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W" -``` - -The above produces `-W-xxW-` - -`regexReplaceAll` panics if there is a problem and `mustRegexReplaceAll` returns an error to the -template engine if there is a problem. - -## regexReplaceAllLiteral, mustRegexReplaceAllLiteral - -Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement -The replacement string is substituted directly, without using Expand - -``` -regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}" -``` - -The above produces `-${1}-${1}-` - -`regexReplaceAllLiteral` panics if there is a problem and `mustRegexReplaceAllLiteral` returns an error to the -template engine if there is a problem. - -## regexSplit, mustRegexSplit - -Slices the input string into substrings separated by the expression and returns a slice of the substrings between those expression matches. The last parameter `n` determines the number of substrings to return, where `-1` means return all matches - -``` -regexSplit "z+" "pizza" -1 -``` - -The above produces `[pi a]` - -`regexSplit` panics if there is a problem and `mustRegexSplit` returns an error to the -template engine if there is a problem. - -## regexQuoteMeta - -Returns a string that escapes all regular expression metacharacters inside the argument text; -the returned string is a regular expression matching the literal text. - -``` -regexQuoteMeta "1.2.3" -``` - -The above produces `1\.2\.3` - -## See Also... - -The [Conversion Functions](conversion.md) contain functions for converting strings. The [String List Functions](string_slice.md) contains -functions for working with an array of strings. diff --git a/docs/sprig/url.md b/docs/sprig/url.md deleted file mode 100644 index 21d54a29..00000000 --- a/docs/sprig/url.md +++ /dev/null @@ -1,33 +0,0 @@ -# URL Functions - -## urlParse -Parses string for URL and produces dict with URL parts - -``` -urlParse "http://admin:secret@server.com:8080/api?list=false#anchor" -``` - -The above returns a dict, containing URL object: -```yaml -scheme: 'http' -host: 'server.com:8080' -path: '/api' -query: 'list=false' -opaque: nil -fragment: 'anchor' -userinfo: 'admin:secret' -``` - -For more info, check https://golang.org/pkg/net/url/#URL - -## urlJoin -Joins map (produced by `urlParse`) to produce URL string - -``` -urlJoin (dict "fragment" "fragment" "host" "host:80" "path" "/path" "query" "query" "scheme" "http") -``` - -The above returns the following string: -``` -proto://host:80/path?query#fragment -``` diff --git a/docs/sprig/uuid.md b/docs/sprig/uuid.md deleted file mode 100644 index 1b57a330..00000000 --- a/docs/sprig/uuid.md +++ /dev/null @@ -1,9 +0,0 @@ -# UUID Functions - -Sprig can generate UUID v4 universally unique IDs. - -``` -uuidv4 -``` - -The above returns a new UUID of the v4 (randomly generated) type. diff --git a/docs/static/img/android-screenshot-template-custom.png b/docs/static/img/android-screenshot-template-custom.png new file mode 100644 index 0000000000000000000000000000000000000000..8325e9a4a580ee877dc620fcec04ac9bbb47dfc5 GIT binary patch literal 45032 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/android-screenshot-template-predefined.png b/docs/static/img/android-screenshot-template-predefined.png new file mode 100644 index 0000000000000000000000000000000000000000..ba77c31d3ec0f59a790e094192174140b7b34b66 GIT binary patch literal 86828 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 Qhd@cz)78&qol`;+09SQgDF6Tf literal 0 HcmV?d00001 diff --git a/docs/static/img/screenshot-github-webhook-config.png b/docs/static/img/screenshot-github-webhook-config.png new file mode 100644 index 0000000000000000000000000000000000000000..46b784b3dee587b776b67a3be8be45ff2d8c6d89 GIT binary patch literal 98734 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

I{*Wzx$vp2<6+N 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 U37iC>J%P8^(n?a55+?8e53_P`4gdfE literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 8006eac4..ef746518 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -94,7 +94,6 @@ nav: - "Integrations + projects": integrations.md - "Release notes": releases.md - "Emojis 🥳 🎉": emojis.md - - "Template Functions": sprig.md - "Troubleshooting": troubleshooting.md - "Known issues": known-issues.md - "Deprecation notices": deprecations.md diff --git a/server/config.go b/server/config.go index c5560010..9c1c4e10 100644 --- a/server/config.go +++ b/server/config.go @@ -11,6 +11,8 @@ import ( // Defines default config settings (excluding limits, see below) const ( DefaultListenHTTP = ":80" + DefaultConfigFile = "/etc/ntfy/server.yml" + DefaultTemplateDir = "/etc/ntfy/templates" DefaultCacheDuration = 12 * time.Hour DefaultCacheBatchTimeout = time.Duration(0) DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!) @@ -173,7 +175,7 @@ type Config struct { // NewConfig instantiates a default new server config func NewConfig() *Config { return &Config{ - File: "", // Only used for testing + File: DefaultConfigFile, // Only used for testing BaseURL: "", ListenHTTP: DefaultListenHTTP, ListenHTTPS: "", @@ -196,6 +198,7 @@ func NewConfig() *Config { AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit, AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit, AttachmentExpiryDuration: DefaultAttachmentExpiryDuration, + TemplateDir: DefaultTemplateDir, KeepaliveInterval: DefaultKeepaliveInterval, ManagerInterval: DefaultManagerInterval, DisallowedTopics: DefaultDisallowedTopics, @@ -258,6 +261,5 @@ func NewConfig() *Config { WebPushEmailAddress: "", WebPushExpiryDuration: DefaultWebPushExpiryDuration, WebPushExpiryWarningDuration: DefaultWebPushExpiryWarningDuration, - TemplateDir: "", } } diff --git a/server/server.yml b/server/server.yml index e1a58232..db968498 100644 --- a/server/server.yml +++ b/server/server.yml @@ -126,6 +126,26 @@ # attachment-file-size-limit: "15M" # attachment-expiry-duration: "3h" +# Template directory for message templates. +# +# When "X-Template: " (aliases: "Template: ", "Tpl: ") or "?template=" is set, transform the message +# based on one of the built-in pre-defined templates, or on a template defined in the "template-dir" directory. +# +# Template files must have the ".yml" extension and must be formatted as YAML. They may contain "title" and "message" keys, +# which are interpreted as Go templates. +# +# Example template file (e.g. /etc/ntfy/templates/grafana.yml): +# title: | +# {{- if eq .status "firing" }} +# {{ .title | default "Alert firing" }} +# {{- else if eq .status "resolved" }} +# {{ .title | default "Alert resolved" }} +# {{- end }} +# message: | +# {{ .message | trunc 2000 }} +# +# template-dir: "/etc/ntfy/templates" + # If enabled, allow outgoing e-mail notifications via the 'X-Email' header. If this header is set, # messages will additionally be sent out as e-mail using an external SMTP server. # diff --git a/server/server_test.go b/server/server_test.go index a783dbd2..c904cbb7 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -2918,7 +2918,7 @@ func TestServer_MessageTemplate_Range(t *testing.T) { require.Equal(t, 200, response.Code) m := toMessage(t, response.Body.String()) - require.Equal(t, "Severe URLs:\n- https://severe1.com\n- https://severe2.com\n", m.Message) + require.Equal(t, "Severe URLs:\n- https://severe1.com\n- https://severe2.com", m.Message) } func TestServer_MessageTemplate_ExceedMessageSize_TemplatedMessageOK(t *testing.T) { @@ -2971,8 +2971,7 @@ Labels: Annotations: - summary = 15m load average too high Source: localhost:3000/alerting/grafana/NW9oDw-4z/view -Silence: localhost:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DLoad+avg+15m+too+high&matcher=grafana_folder%3DNode+alerts&matcher=instance%3D10.108.0.2%3A9100&matcher=job%3Dnode-exporter -`, m.Message) +Silence: localhost:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DLoad+avg+15m+too+high&matcher=grafana_folder%3DNode+alerts&matcher=instance%3D10.108.0.2%3A9100&matcher=job%3Dnode-exporter`, m.Message) } func TestServer_MessageTemplate_GitHub(t *testing.T) { @@ -3073,18 +3072,75 @@ func TestServer_MessageTemplate_UnsafeSprigFunctions(t *testing.T) { var ( //go:embed testdata/webhook_github_comment_created.json githubCommentCreatedJSON string + + //go:embed testdata/webhook_github_issue_opened.json + githubIssueOpenedJSON string ) -func TestServer_MessageTemplate_FromNamedTemplate(t *testing.T) { +func TestServer_MessageTemplate_FromNamedTemplate_GitHubCommentCreated(t *testing.T) { t.Parallel() s := newTestServer(t, newTestConfig(t)) - response := request(t, s, "POST", "/mytopic", githubCommentCreatedJSON, map[string]string{ - "Template": "github", - }) + response := request(t, s, "POST", "/mytopic?template=github", githubCommentCreatedJSON, nil) require.Equal(t, 200, response.Code) m := toMessage(t, response.Body.String()) - require.Equal(t, "💬 New comment on issue #1389 — instant alerts without Pull to refresh", m.Title) - require.Equal(t, "💬 New comment on issue #1389 — instant alerts without Pull to refresh", m.Message) + require.Equal(t, "💬 [ntfy] New comment on issue #1389 instant alerts without Pull to refresh", m.Title) + require.Equal(t, `Commenter: https://github.com/wunter8 +Repository: https://github.com/binwiederhier/ntfy +Comment link: https://github.com/binwiederhier/ntfy/issues/1389#issuecomment-3078214289 + +Comment: +These are the things you need to do to get iOS push notifications to work: +1. open a browser to the web app of your ntfy instance and copy the URL (including "http://" or "https://", your domain or IP address, and any ports, and excluding any trailing slashes) +2. put the URL you copied in the ntfy `+"`"+`base-url`+"`"+` config in server.yml or NTFY_BASE_URL in env variables +3. put the URL you copied in the default server URL setting in the iOS ntfy app +4. set `+"`"+`upstream-base-url`+"`"+` in server.yml or NTFY_UPSTREAM_BASE_URL in env variables to "https://ntfy.sh" (without a trailing slash)`, m.Message) +} + +func TestServer_MessageTemplate_FromNamedTemplate_GitHubIssueOpened(t *testing.T) { + t.Parallel() + s := newTestServer(t, newTestConfig(t)) + response := request(t, s, "POST", "/mytopic?template=github", githubIssueOpenedJSON, nil) + require.Equal(t, 200, response.Code) + m := toMessage(t, response.Body.String()) + require.Equal(t, "🐛 [ntfy] Issue opened: #1391 http 500 error (ntfy error 50001)", m.Title) + require.Equal(t, `Opened by: https://github.com/TheUser-dev +Repository: https://github.com/binwiederhier/ntfy +Issue link: https://github.com/binwiederhier/ntfy/issues/1391 +Labels: 🪲 bug + +Description: +:lady_beetle: **Describe the bug** +When sending a notification (especially when it happens with multiple requests) this error occurs + +:computer: **Components impacted** +ntfy server 2.13.0 in docker, debian 12 arm64 + +:bulb: **Screenshots and/or logs** +`+"```"+` +closed with HTTP 500 (ntfy error 50001) (error=database table is locked, http_method=POST, http_path=/_matrix/push/v1/notify, tag=http, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=30, visitor_id=ip:, visitor_ip=, visitor_messages=448, visitor_messages_limit=17280, visitor_messages_remaining=16832, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=57.049697891799994, visitor_seen=2025-07-16T15:06:35.429Z) +`+"```"+` + +:crystal_ball: **Additional context** +Looks like this has already been fixed by #498, regression?`, m.Message) +} + +func TestServer_MessageTemplate_FromNamedTemplate_GitHubIssueOpened_OverrideConfigTemplate(t *testing.T) { + t.Parallel() + c := newTestConfig(t) + c.TemplateDir = t.TempDir() + require.NoError(t, os.WriteFile(filepath.Join(c.TemplateDir, "github.yml"), []byte(` +title: | + Custom title: action={{ .action }} trunctitle={{ .issue.title | trunc 10 }} +message: | + Custom message {{ .issue.number }} +`), 0644)) + s := newTestServer(t, c) + response := request(t, s, "POST", "/mytopic?template=github", githubIssueOpenedJSON, nil) + fmt.Println(response.Body.String()) + require.Equal(t, 200, response.Code) + m := toMessage(t, response.Body.String()) + require.Equal(t, "Custom title: action=opened trunctitle=http 500 e", m.Title) + require.Equal(t, "Custom message 1391", m.Message) } func newTestConfig(t *testing.T) *Config { @@ -3093,6 +3149,7 @@ func newTestConfig(t *testing.T) *Config { conf.CacheFile = filepath.Join(t.TempDir(), "cache.db") conf.CacheStartupQueries = "pragma journal_mode = WAL; pragma synchronous = normal; pragma temp_store = memory;" conf.AttachmentCacheDir = t.TempDir() + conf.TemplateDir = t.TempDir() return conf } diff --git a/server/templates/alertmanager.yml b/server/templates/alertmanager.yml new file mode 100644 index 00000000..803bbfcb --- /dev/null +++ b/server/templates/alertmanager.yml @@ -0,0 +1,29 @@ +title: | + {{- if eq .status "firing" }} + 🚨 Alert: {{ (first .alerts).labels.alertname }} + {{- else if eq .status "resolved" }} + ✅ Resolved: {{ (first .alerts).labels.alertname }} + {{- else }} + {{ fail "Unsupported Alertmanager status." }} + {{- end }} +message: | + Status: {{ .status | title }} + Receiver: {{ .receiver }} + + {{- range .alerts }} + Alert: {{ .labels.alertname }} + Instance: {{ .labels.instance }} + Severity: {{ .labels.severity }} + Starts at: {{ .startsAt }} + {{- if .endsAt }}Ends at: {{ .endsAt }}{{ end }} + {{- if .annotations.summary }} + Summary: {{ .annotations.summary }} + {{- end }} + {{- if .annotations.description }} + Description: {{ .annotations.description }} + {{- end }} + Source: {{ .generatorURL }} + + {{ end }} + + diff --git a/server/templates/github.yml b/server/templates/github.yml index 5d1b0b46..2c2922a2 100644 --- a/server/templates/github.yml +++ b/server/templates/github.yml @@ -6,7 +6,7 @@ title: | 👀 {{ .sender.login }} started watching {{ .repository.name }} {{- else if and .comment (eq .action "created") }} - 💬 New comment on #{{ .issue.number }}: {{ .issue.title }} + 💬 New comment on issue #{{ .issue.number }} {{ .issue.title }} {{- else if .pull_request }} 🔀 Pull request {{ .action }}: #{{ .pull_request.number }} {{ .pull_request.title }} @@ -47,6 +47,7 @@ message: | {{ .action | title }} by: {{ .issue.user.html_url }} Repository: {{ .repository.html_url }} Issue link: {{ .issue.html_url }} + {{ if .issue.labels }}Labels: {{ range .issue.labels }}{{ .name }} {{ end }}{{ end }} {{ if .issue.body }} Description: {{ .issue.body | trunc 2000 }}{{ end }} diff --git a/server/templates/grafana.yml b/server/templates/grafana.yml index 42a16deb..658aa550 100644 --- a/server/templates/grafana.yml +++ b/server/templates/grafana.yml @@ -1,9 +1,11 @@ -message: | - {{if .alerts}} - {{.alerts | len}} alert(s) triggered - {{else}} - No alerts triggered. - {{end}} title: | - ⚠️ Grafana alert: {{.title}} + {{- if eq .status "firing" }} + 🚨 {{ .title | default "Alert firing" }} + {{- else if eq .status "resolved" }} + ✅ {{ .title | default "Alert resolved" }} + {{- else }} + ⚠️ Unknown alert: {{ .title | default "Alert" }} + {{- end }} +message: | + {{ .message | trunc 2000 }} diff --git a/server/testdata/webhook_alertmanager_firing.json b/server/testdata/webhook_alertmanager_firing.json new file mode 100644 index 00000000..9155bd9e --- /dev/null +++ b/server/testdata/webhook_alertmanager_firing.json @@ -0,0 +1,33 @@ +{ + "version": "4", + "groupKey": "...", + "status": "firing", + "receiver": "webhook-receiver", + "groupLabels": { + "alertname": "HighCPUUsage" + }, + "commonLabels": { + "alertname": "HighCPUUsage", + "instance": "server01", + "severity": "critical" + }, + "commonAnnotations": { + "summary": "High CPU usage detected" + }, + "alerts": [ + { + "status": "firing", + "labels": { + "alertname": "HighCPUUsage", + "instance": "server01", + "severity": "critical" + }, + "annotations": { + "summary": "High CPU usage detected" + }, + "startsAt": "2025-07-17T07:00:00Z", + "endsAt": "0001-01-01T00:00:00Z", + "generatorURL": "http://prometheus.local/graph?g0.expr=..." + } + ] +} diff --git a/server/testdata/webhook_grafana_resolved.json b/server/testdata/webhook_grafana_resolved.json new file mode 100644 index 00000000..41494578 --- /dev/null +++ b/server/testdata/webhook_grafana_resolved.json @@ -0,0 +1,51 @@ +{ + "receiver": "ntfy\\.example\\.com/alerts", + "status": "resolved", + "alerts": [ + { + "status": "resolved", + "labels": { + "alertname": "Load avg 15m too high", + "grafana_folder": "Node alerts", + "instance": "10.108.0.2:9100", + "job": "node-exporter" + }, + "annotations": { + "summary": "15m load average too high" + }, + "startsAt": "2024-03-15T02:28:00Z", + "endsAt": "2024-03-15T02:42:00Z", + "generatorURL": "localhost:3000/alerting/grafana/NW9oDw-4z/view", + "fingerprint": "becbfb94bd81ef48", + "silenceURL": "localhost:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DLoad+avg+15m+too+high&matcher=grafana_folder%3DNode+alerts&matcher=instance%3D10.108.0.2%3A9100&matcher=job%3Dnode-exporter", + "dashboardURL": "", + "panelURL": "", + "values": { + "B": 18.98211314475876, + "C": 0 + }, + "valueString": "[ var='B' labels={__name__=node_load15, instance=10.108.0.2:9100, job=node-exporter} value=18.98211314475876 ], [ var='C' labels={__name__=node_load15, instance=10.108.0.2:9100, job=node-exporter} value=0 ]" + } + ], + "groupLabels": { + "alertname": "Load avg 15m too high", + "grafana_folder": "Node alerts" + }, + "commonLabels": { + "alertname": "Load avg 15m too high", + "grafana_folder": "Node alerts", + "instance": "10.108.0.2:9100", + "job": "node-exporter" + }, + "commonAnnotations": { + "summary": "15m load average too high" + }, + "externalURL": "localhost:3000/", + "version": "1", + "groupKey": "{}:{alertname=\"Load avg 15m too high\", grafana_folder=\"Node alerts\"}", + "truncatedAlerts": 0, + "orgId": 1, + "title": "[RESOLVED] Load avg 15m too high Node alerts (10.108.0.2:9100 node-exporter)", + "state": "ok", + "message": "**Resolved**\n\nValue: B=18.98211314475876, C=0\nLabels:\n - alertname = Load avg 15m too high\n - grafana_folder = Node alerts\n - instance = 10.108.0.2:9100\n - job = node-exporter\n" +}