Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/noqcks/gucci
Templating on the command line with sprig.
https://github.com/noqcks/gucci
binary cli-templating golang golang-binaries sprig
Last synced: 4 days ago
JSON representation
Templating on the command line with sprig.
- Host: GitHub
- URL: https://github.com/noqcks/gucci
- Owner: noqcks
- License: mit
- Created: 2016-09-28T02:44:59.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-12-12T00:00:05.000Z (about 1 month ago)
- Last Synced: 2025-01-08T14:24:26.790Z (11 days ago)
- Topics: binary, cli-templating, golang, golang-binaries, sprig
- Language: Go
- Homepage:
- Size: 7.16 MB
- Stars: 88
- Watchers: 10
- Forks: 20
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-repositories - noqcks/gucci - Templating on the command line with sprig. (Go)
README
# Gucci
A simple CLI templating tool written in golang.
[![GitHub version](https://badge.fury.io/gh/noqcks%2Fgucci.svg)](https://badge.fury.io/gh/noqcks%2Fgucci)
## Installation
If you have `go` installed:
```
$ go get github.com/noqcks/gucci
```Or you can just download the binary and move it into your `PATH`:
```
VERSION=1.6.13
wget -q "https://github.com/noqcks/gucci/releases/download/v${VERSION}/gucci-v${VERSION}-darwin-amd64"
chmod +x gucci-v${VERSION}-darwin-amd64
mv gucci-v${VERSION}-darwin-amd64 /usr/local/bin/gucci
```## Use
### Locating Templates
`gucci` can locate a template in multiple ways.
#### File
Pass the template file path as the first argument:
```
$ gucci template.tpl > template.out
```#### Stdin
Supply the template through standard input:
```bash
$ gucci
Start typing stuff {{ print "here" }}
^d
Start typing stuff here
```Via piping:
```bash
$ echo '{{ html "" }}' | gucci
```### Supplying Variable Inputs
`gucci` can receive variables for use in templates in the following ways (in order of lowest to highest precedence):
- A JSON or YAML file
- Environment variables
- Variable command options#### Variables File
Given an example variables file:
```yaml
# vars.yaml
hosts:
- name: bastion
- name: app
```Pass it into `gucci` with `-f` or `--vars-file`:
```bash
$ gucci -f vars.yaml template.tpl
```#### Environment Variables
Here, `MY_HOST` is available to the template:
```bash
$ export MY_HOST=localhost
$ gucci template.tpl
```#### Variable Options
Pass variable options into `gucci` with `-s` or `--set-var`, which can be repeated:
```bash
$ gucci -s foo.bar=baz template.tpl
```Variable option keys are split on the `.` character, and nested such that
the above example would equate to the following yaml variable input:```yaml
foo:
bar: baz
```## Templating
### Options
Existing [golang templating options](https://golang.org/pkg/text/template/#Template.Option) can be used for templating.
If no option is specified, the `missingkey=error` option will be used (execution stops immediately with an error if a
key used in the template is not present in the supplied values).One might want a different value for `missingkey` when using conditionals and having keys that won't be
used at all.For instance, given the following template, containing two docker-compose services `service1` and `service2`:
```tpl
# template.tpl
version: "3.8"services:
{{- if .service1 }}
service1:
image: {{ .service1.image }}
restart: "always"
ports: {{ toYaml .service1.ports | nindent 6}}
{{- end }}
{{- if .service2 }}
service2:
image: {{ .service2.image }}
restart: "unless-stopped"
ports: {{ toYaml .service2.ports | nindent 6}}
{{- end }}
```And imagine a scenario where whe only need `service2`. By using the following values file:
```yaml
# values.yaml
service2:
image: "myservice:latest"
ports:
- "80"
- "443"
```And using a different `missingkey=error`, we can actually get the desired result without having to define the values
for `service1`:```shell
$ gucci -o missingkey=zero -f values.yaml template.tpl
version: "3.8"services:
service2:
image: myservice:latest
restart: "unless-stopped"
ports:
- "80"
- "443"
```### GoLang Functions
All of the existing [golang templating functions](https://golang.org/pkg/text/template/#hdr-Functions) are available for use.
### Sprig Functions
gucci ships with the [sprig templating functions library](http://masterminds.github.io/sprig/) offering a wide variety of template helpers.
### Built In Functions
Furthermore, this tool also includes custom functions:
- `shell`: For arbitrary shell commands
```
{{ shell "echo hello world" }}
```and
```
# guest: world
{{ shell "echo hello " .guest }}
```Both produce:
```
hello world
```- `toYaml`: Print items in YAML format
```
{{ $myList := list "a" "b" "c" }}
{{ toYaml $myList }}
```Produces:
```
- a
- b
- c
```### Example
**NOTE**: gucci reads and makes available all environment variables.
For example a var $LOCALHOST = 127.0.0.1
gucci template.tpl > template.conf
```
# template.tpl
{{ .LOCALHOST }}
````gucci template.tpl > template.conf` -->
```
# template.conf
127.0.0.1
```simple enough!
For an iteration example, you have $BACKENDS=server1.com,server2.com
```
# template.tpl
{{ range split .BACKENDS "," }}
server {{ . }}
{{ end }}
````gucci template.tpl > template.conf` -->
```
# template.conf
server server1.com
server server2.com
```## Testing
Setup:
```bash
go get github.com/noqcks/gucci
go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega
```Run tests:
```bash
ginkgo ./...
```